1/* DO NOT EDIT!
2** This file is automatically generated by the script in the canonical
3** SQLite source tree at tool/mkshellc.tcl.  That script combines source
4** code from various constituent source files of SQLite into this single
5** "shell.c" file used to implement the SQLite command-line shell.
6**
7** Most of the code found below comes from the "src/shell.c.in" file in
8** the canonical SQLite source tree.  That main file contains "INCLUDE"
9** lines that specify other files in the canonical source tree that are
10** inserted to getnerate this complete program source file.
11**
12** The code from multiple files is combined into this single "shell.c"
13** source file to help make the command-line program easier to compile.
14**
15** To modify this program, get a copy of the canonical SQLite source tree,
16** edit the src/shell.c.in" and/or some of the other files that are included
17** by "src/shell.c.in", then rerun the tool/mkshellc.tcl script.
18*/
19/*
20** 2001 September 15
21**
22** The author disclaims copyright to this source code.  In place of
23** a legal notice, here is a blessing:
24**
25**    May you do good and not evil.
26**    May you find forgiveness for yourself and forgive others.
27**    May you share freely, never taking more than you give.
28**
29*************************************************************************
30** This file contains code to implement the "sqlite" command line
31** utility for accessing SQLite databases.
32*/
33#if (defined(_WIN32) || defined(WIN32)) && !defined(_CRT_SECURE_NO_WARNINGS)
34/* This needs to come before any includes for MSVC compiler */
35#define _CRT_SECURE_NO_WARNINGS
36#endif
37
38/*
39** Determine if we are dealing with WinRT, which provides only a subset of
40** the full Win32 API.
41*/
42#if !defined(SQLITE_OS_WINRT)
43# define SQLITE_OS_WINRT 0
44#endif
45
46/*
47** Warning pragmas copied from msvc.h in the core.
48*/
49#if defined(_MSC_VER)
50#pragma warning(disable : 4054)
51#pragma warning(disable : 4055)
52#pragma warning(disable : 4100)
53#pragma warning(disable : 4127)
54#pragma warning(disable : 4130)
55#pragma warning(disable : 4152)
56#pragma warning(disable : 4189)
57#pragma warning(disable : 4206)
58#pragma warning(disable : 4210)
59#pragma warning(disable : 4232)
60#pragma warning(disable : 4244)
61#pragma warning(disable : 4305)
62#pragma warning(disable : 4306)
63#pragma warning(disable : 4702)
64#pragma warning(disable : 4706)
65#endif /* defined(_MSC_VER) */
66
67/*
68** No support for loadable extensions in VxWorks.
69*/
70#if (defined(__RTP__) || defined(_WRS_KERNEL)) && !SQLITE_OMIT_LOAD_EXTENSION
71# define SQLITE_OMIT_LOAD_EXTENSION 1
72#endif
73
74/*
75** Enable large-file support for fopen() and friends on unix.
76*/
77#ifndef SQLITE_DISABLE_LFS
78# define _LARGE_FILE       1
79# ifndef _FILE_OFFSET_BITS
80#   define _FILE_OFFSET_BITS 64
81# endif
82# define _LARGEFILE_SOURCE 1
83#endif
84
85#include <stdlib.h>
86#include <string.h>
87#include <stdio.h>
88#include <assert.h>
89#include "sqlite3.h"
90typedef sqlite3_int64 i64;
91typedef sqlite3_uint64 u64;
92typedef unsigned char u8;
93#if SQLITE_USER_AUTHENTICATION
94# include "sqlite3userauth.h"
95#endif
96#include <ctype.h>
97#include <stdarg.h>
98
99#if !defined(_WIN32) && !defined(WIN32)
100# include <signal.h>
101# if !defined(__RTP__) && !defined(_WRS_KERNEL)
102#  include <pwd.h>
103# endif
104#endif
105#if (!defined(_WIN32) && !defined(WIN32)) || defined(__MINGW32__)
106# include <unistd.h>
107# include <dirent.h>
108# define GETPID getpid
109# if defined(__MINGW32__)
110#  define DIRENT dirent
111#  ifndef S_ISLNK
112#   define S_ISLNK(mode) (0)
113#  endif
114# endif
115#else
116# define GETPID (int)GetCurrentProcessId
117#endif
118#include <sys/types.h>
119#include <sys/stat.h>
120
121#if HAVE_READLINE
122# include <readline/readline.h>
123# include <readline/history.h>
124#endif
125
126#if HAVE_EDITLINE
127# include <editline/readline.h>
128#endif
129
130#if HAVE_EDITLINE || HAVE_READLINE
131
132# define shell_add_history(X) add_history(X)
133# define shell_read_history(X) read_history(X)
134# define shell_write_history(X) write_history(X)
135# define shell_stifle_history(X) stifle_history(X)
136# define shell_readline(X) readline(X)
137
138#elif HAVE_LINENOISE
139
140# include "linenoise.h"
141# define shell_add_history(X) linenoiseHistoryAdd(X)
142# define shell_read_history(X) linenoiseHistoryLoad(X)
143# define shell_write_history(X) linenoiseHistorySave(X)
144# define shell_stifle_history(X) linenoiseHistorySetMaxLen(X)
145# define shell_readline(X) linenoise(X)
146
147#else
148
149# define shell_read_history(X)
150# define shell_write_history(X)
151# define shell_stifle_history(X)
152
153# define SHELL_USE_LOCAL_GETLINE 1
154#endif
155
156
157#if defined(_WIN32) || defined(WIN32)
158# if SQLITE_OS_WINRT
159#  define SQLITE_OMIT_POPEN 1
160# else
161#  include <io.h>
162#  include <fcntl.h>
163#  define isatty(h) _isatty(h)
164#  ifndef access
165#   define access(f,m) _access((f),(m))
166#  endif
167#  ifndef unlink
168#   define unlink _unlink
169#  endif
170#  ifndef strdup
171#   define strdup _strdup
172#  endif
173#  undef popen
174#  define popen _popen
175#  undef pclose
176#  define pclose _pclose
177# endif
178#else
179 /* Make sure isatty() has a prototype. */
180 extern int isatty(int);
181
182# if !defined(__RTP__) && !defined(_WRS_KERNEL)
183  /* popen and pclose are not C89 functions and so are
184  ** sometimes omitted from the <stdio.h> header */
185   extern FILE *popen(const char*,const char*);
186   extern int pclose(FILE*);
187# else
188#  define SQLITE_OMIT_POPEN 1
189# endif
190#endif
191
192#if defined(_WIN32_WCE)
193/* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
194 * thus we always assume that we have a console. That can be
195 * overridden with the -batch command line option.
196 */
197#define isatty(x) 1
198#endif
199
200/* ctype macros that work with signed characters */
201#define IsSpace(X)  isspace((unsigned char)X)
202#define IsDigit(X)  isdigit((unsigned char)X)
203#define ToLower(X)  (char)tolower((unsigned char)X)
204
205#if defined(_WIN32) || defined(WIN32)
206#if SQLITE_OS_WINRT
207#include <intrin.h>
208#endif
209#include <windows.h>
210
211/* string conversion routines only needed on Win32 */
212extern char *sqlite3_win32_unicode_to_utf8(LPCWSTR);
213extern char *sqlite3_win32_mbcs_to_utf8_v2(const char *, int);
214extern char *sqlite3_win32_utf8_to_mbcs_v2(const char *, int);
215extern LPWSTR sqlite3_win32_utf8_to_unicode(const char *zText);
216#endif
217
218/* On Windows, we normally run with output mode of TEXT so that \n characters
219** are automatically translated into \r\n.  However, this behavior needs
220** to be disabled in some cases (ex: when generating CSV output and when
221** rendering quoted strings that contain \n characters).  The following
222** routines take care of that.
223*/
224#if (defined(_WIN32) || defined(WIN32)) && !SQLITE_OS_WINRT
225static void setBinaryMode(FILE *file, int isOutput){
226  if( isOutput ) fflush(file);
227  _setmode(_fileno(file), _O_BINARY);
228}
229static void setTextMode(FILE *file, int isOutput){
230  if( isOutput ) fflush(file);
231  _setmode(_fileno(file), _O_TEXT);
232}
233#else
234# define setBinaryMode(X,Y)
235# define setTextMode(X,Y)
236#endif
237
238
239/* True if the timer is enabled */
240static int enableTimer = 0;
241
242/* Return the current wall-clock time */
243static sqlite3_int64 timeOfDay(void){
244  static sqlite3_vfs *clockVfs = 0;
245  sqlite3_int64 t;
246  if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0);
247  if( clockVfs->iVersion>=2 && clockVfs->xCurrentTimeInt64!=0 ){
248    clockVfs->xCurrentTimeInt64(clockVfs, &t);
249  }else{
250    double r;
251    clockVfs->xCurrentTime(clockVfs, &r);
252    t = (sqlite3_int64)(r*86400000.0);
253  }
254  return t;
255}
256
257#if !defined(_WIN32) && !defined(WIN32) && !defined(__minux)
258#include <sys/time.h>
259#include <sys/resource.h>
260
261/* VxWorks does not support getrusage() as far as we can determine */
262#if defined(_WRS_KERNEL) || defined(__RTP__)
263struct rusage {
264  struct timeval ru_utime; /* user CPU time used */
265  struct timeval ru_stime; /* system CPU time used */
266};
267#define getrusage(A,B) memset(B,0,sizeof(*B))
268#endif
269
270/* Saved resource information for the beginning of an operation */
271static struct rusage sBegin;  /* CPU time at start */
272static sqlite3_int64 iBegin;  /* Wall-clock time at start */
273
274/*
275** Begin timing an operation
276*/
277static void beginTimer(void){
278  if( enableTimer ){
279    getrusage(RUSAGE_SELF, &sBegin);
280    iBegin = timeOfDay();
281  }
282}
283
284/* Return the difference of two time_structs in seconds */
285static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
286  return (pEnd->tv_usec - pStart->tv_usec)*0.000001 +
287         (double)(pEnd->tv_sec - pStart->tv_sec);
288}
289
290/*
291** Print the timing results.
292*/
293static void endTimer(void){
294  if( enableTimer ){
295    sqlite3_int64 iEnd = timeOfDay();
296    struct rusage sEnd;
297    getrusage(RUSAGE_SELF, &sEnd);
298    printf("Run Time: real %.3f user %f sys %f\n",
299       (iEnd - iBegin)*0.001,
300       timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
301       timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
302  }
303}
304
305#define BEGIN_TIMER beginTimer()
306#define END_TIMER endTimer()
307#define HAS_TIMER 1
308
309#elif (defined(_WIN32) || defined(WIN32))
310
311/* Saved resource information for the beginning of an operation */
312static HANDLE hProcess;
313static FILETIME ftKernelBegin;
314static FILETIME ftUserBegin;
315static sqlite3_int64 ftWallBegin;
316typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME,
317                                    LPFILETIME, LPFILETIME);
318static GETPROCTIMES getProcessTimesAddr = NULL;
319
320/*
321** Check to see if we have timer support.  Return 1 if necessary
322** support found (or found previously).
323*/
324static int hasTimer(void){
325  if( getProcessTimesAddr ){
326    return 1;
327  } else {
328#if !SQLITE_OS_WINRT
329    /* GetProcessTimes() isn't supported in WIN95 and some other Windows
330    ** versions. See if the version we are running on has it, and if it
331    ** does, save off a pointer to it and the current process handle.
332    */
333    hProcess = GetCurrentProcess();
334    if( hProcess ){
335      HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll"));
336      if( NULL != hinstLib ){
337        getProcessTimesAddr =
338            (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes");
339        if( NULL != getProcessTimesAddr ){
340          return 1;
341        }
342        FreeLibrary(hinstLib);
343      }
344    }
345#endif
346  }
347  return 0;
348}
349
350/*
351** Begin timing an operation
352*/
353static void beginTimer(void){
354  if( enableTimer && getProcessTimesAddr ){
355    FILETIME ftCreation, ftExit;
356    getProcessTimesAddr(hProcess,&ftCreation,&ftExit,
357                        &ftKernelBegin,&ftUserBegin);
358    ftWallBegin = timeOfDay();
359  }
360}
361
362/* Return the difference of two FILETIME structs in seconds */
363static double timeDiff(FILETIME *pStart, FILETIME *pEnd){
364  sqlite_int64 i64Start = *((sqlite_int64 *) pStart);
365  sqlite_int64 i64End = *((sqlite_int64 *) pEnd);
366  return (double) ((i64End - i64Start) / 10000000.0);
367}
368
369/*
370** Print the timing results.
371*/
372static void endTimer(void){
373  if( enableTimer && getProcessTimesAddr){
374    FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
375    sqlite3_int64 ftWallEnd = timeOfDay();
376    getProcessTimesAddr(hProcess,&ftCreation,&ftExit,&ftKernelEnd,&ftUserEnd);
377    printf("Run Time: real %.3f user %f sys %f\n",
378       (ftWallEnd - ftWallBegin)*0.001,
379       timeDiff(&ftUserBegin, &ftUserEnd),
380       timeDiff(&ftKernelBegin, &ftKernelEnd));
381  }
382}
383
384#define BEGIN_TIMER beginTimer()
385#define END_TIMER endTimer()
386#define HAS_TIMER hasTimer()
387
388#else
389#define BEGIN_TIMER
390#define END_TIMER
391#define HAS_TIMER 0
392#endif
393
394/*
395** Used to prevent warnings about unused parameters
396*/
397#define UNUSED_PARAMETER(x) (void)(x)
398
399/*
400** Number of elements in an array
401*/
402#define ArraySize(X)  (int)(sizeof(X)/sizeof(X[0]))
403
404/*
405** If the following flag is set, then command execution stops
406** at an error if we are not interactive.
407*/
408static int bail_on_error = 0;
409
410/*
411** Threat stdin as an interactive input if the following variable
412** is true.  Otherwise, assume stdin is connected to a file or pipe.
413*/
414static int stdin_is_interactive = 1;
415
416/*
417** On Windows systems we have to know if standard output is a console
418** in order to translate UTF-8 into MBCS.  The following variable is
419** true if translation is required.
420*/
421static int stdout_is_console = 1;
422
423/*
424** The following is the open SQLite database.  We make a pointer
425** to this database a static variable so that it can be accessed
426** by the SIGINT handler to interrupt database processing.
427*/
428static sqlite3 *globalDb = 0;
429
430/*
431** True if an interrupt (Control-C) has been received.
432*/
433static volatile int seenInterrupt = 0;
434
435#ifdef SQLITE_DEBUG
436/*
437** Out-of-memory simulator variables
438*/
439static unsigned int oomCounter = 0;    /* Simulate OOM when equals 1 */
440static unsigned int oomRepeat = 0;     /* Number of OOMs in a row */
441static void*(*defaultMalloc)(int) = 0; /* The low-level malloc routine */
442#endif /* SQLITE_DEBUG */
443
444/*
445** This is the name of our program. It is set in main(), used
446** in a number of other places, mostly for error messages.
447*/
448static char *Argv0;
449
450/*
451** Prompt strings. Initialized in main. Settable with
452**   .prompt main continue
453*/
454static char mainPrompt[20];     /* First line prompt. default: "sqlite> "*/
455static char continuePrompt[20]; /* Continuation prompt. default: "   ...> " */
456
457/*
458** Render output like fprintf().  Except, if the output is going to the
459** console and if this is running on a Windows machine, translate the
460** output from UTF-8 into MBCS.
461*/
462#if defined(_WIN32) || defined(WIN32)
463void utf8_printf(FILE *out, const char *zFormat, ...){
464  va_list ap;
465  va_start(ap, zFormat);
466  if( stdout_is_console && (out==stdout || out==stderr) ){
467    char *z1 = sqlite3_vmprintf(zFormat, ap);
468    char *z2 = sqlite3_win32_utf8_to_mbcs_v2(z1, 0);
469    sqlite3_free(z1);
470    fputs(z2, out);
471    sqlite3_free(z2);
472  }else{
473    vfprintf(out, zFormat, ap);
474  }
475  va_end(ap);
476}
477#elif !defined(utf8_printf)
478# define utf8_printf fprintf
479#endif
480
481/*
482** Render output like fprintf().  This should not be used on anything that
483** includes string formatting (e.g. "%s").
484*/
485#if !defined(raw_printf)
486# define raw_printf fprintf
487#endif
488
489/* Indicate out-of-memory and exit. */
490static void shell_out_of_memory(void){
491  raw_printf(stderr,"Error: out of memory\n");
492  exit(1);
493}
494
495#ifdef SQLITE_DEBUG
496/* This routine is called when a simulated OOM occurs.  It is broken
497** out as a separate routine to make it easy to set a breakpoint on
498** the OOM
499*/
500void shellOomFault(void){
501  if( oomRepeat>0 ){
502    oomRepeat--;
503  }else{
504    oomCounter--;
505  }
506}
507#endif /* SQLITE_DEBUG */
508
509#ifdef SQLITE_DEBUG
510/* This routine is a replacement malloc() that is used to simulate
511** Out-Of-Memory (OOM) errors for testing purposes.
512*/
513static void *oomMalloc(int nByte){
514  if( oomCounter ){
515    if( oomCounter==1 ){
516      shellOomFault();
517      return 0;
518    }else{
519      oomCounter--;
520    }
521  }
522  return defaultMalloc(nByte);
523}
524#endif /* SQLITE_DEBUG */
525
526#ifdef SQLITE_DEBUG
527/* Register the OOM simulator.  This must occur before any memory
528** allocations */
529static void registerOomSimulator(void){
530  sqlite3_mem_methods mem;
531  sqlite3_config(SQLITE_CONFIG_GETMALLOC, &mem);
532  defaultMalloc = mem.xMalloc;
533  mem.xMalloc = oomMalloc;
534  sqlite3_config(SQLITE_CONFIG_MALLOC, &mem);
535}
536#endif
537
538/*
539** Write I/O traces to the following stream.
540*/
541#ifdef SQLITE_ENABLE_IOTRACE
542static FILE *iotrace = 0;
543#endif
544
545/*
546** This routine works like printf in that its first argument is a
547** format string and subsequent arguments are values to be substituted
548** in place of % fields.  The result of formatting this string
549** is written to iotrace.
550*/
551#ifdef SQLITE_ENABLE_IOTRACE
552static void SQLITE_CDECL iotracePrintf(const char *zFormat, ...){
553  va_list ap;
554  char *z;
555  if( iotrace==0 ) return;
556  va_start(ap, zFormat);
557  z = sqlite3_vmprintf(zFormat, ap);
558  va_end(ap);
559  utf8_printf(iotrace, "%s", z);
560  sqlite3_free(z);
561}
562#endif
563
564/*
565** Output string zUtf to stream pOut as w characters.  If w is negative,
566** then right-justify the text.  W is the width in UTF-8 characters, not
567** in bytes.  This is different from the %*.*s specification in printf
568** since with %*.*s the width is measured in bytes, not characters.
569*/
570static void utf8_width_print(FILE *pOut, int w, const char *zUtf){
571  int i;
572  int n;
573  int aw = w<0 ? -w : w;
574  for(i=n=0; zUtf[i]; i++){
575    if( (zUtf[i]&0xc0)!=0x80 ){
576      n++;
577      if( n==aw ){
578        do{ i++; }while( (zUtf[i]&0xc0)==0x80 );
579        break;
580      }
581    }
582  }
583  if( n>=aw ){
584    utf8_printf(pOut, "%.*s", i, zUtf);
585  }else if( w<0 ){
586    utf8_printf(pOut, "%*s%s", aw-n, "", zUtf);
587  }else{
588    utf8_printf(pOut, "%s%*s", zUtf, aw-n, "");
589  }
590}
591
592
593/*
594** Determines if a string is a number of not.
595*/
596static int isNumber(const char *z, int *realnum){
597  if( *z=='-' || *z=='+' ) z++;
598  if( !IsDigit(*z) ){
599    return 0;
600  }
601  z++;
602  if( realnum ) *realnum = 0;
603  while( IsDigit(*z) ){ z++; }
604  if( *z=='.' ){
605    z++;
606    if( !IsDigit(*z) ) return 0;
607    while( IsDigit(*z) ){ z++; }
608    if( realnum ) *realnum = 1;
609  }
610  if( *z=='e' || *z=='E' ){
611    z++;
612    if( *z=='+' || *z=='-' ) z++;
613    if( !IsDigit(*z) ) return 0;
614    while( IsDigit(*z) ){ z++; }
615    if( realnum ) *realnum = 1;
616  }
617  return *z==0;
618}
619
620/*
621** Compute a string length that is limited to what can be stored in
622** lower 30 bits of a 32-bit signed integer.
623*/
624static int strlen30(const char *z){
625  const char *z2 = z;
626  while( *z2 ){ z2++; }
627  return 0x3fffffff & (int)(z2 - z);
628}
629
630/*
631** Return the length of a string in characters.  Multibyte UTF8 characters
632** count as a single character.
633*/
634static int strlenChar(const char *z){
635  int n = 0;
636  while( *z ){
637    if( (0xc0&*(z++))!=0x80 ) n++;
638  }
639  return n;
640}
641
642/*
643** Return true if zFile does not exist or if it is not an ordinary file.
644*/
645#ifdef _WIN32
646# define notNormalFile(X) 0
647#else
648static int notNormalFile(const char *zFile){
649  struct stat x;
650  int rc;
651  memset(&x, 0, sizeof(x));
652  rc = stat(zFile, &x);
653  return rc || !S_ISREG(x.st_mode);
654}
655#endif
656
657/*
658** This routine reads a line of text from FILE in, stores
659** the text in memory obtained from malloc() and returns a pointer
660** to the text.  NULL is returned at end of file, or if malloc()
661** fails.
662**
663** If zLine is not NULL then it is a malloced buffer returned from
664** a previous call to this routine that may be reused.
665*/
666static char *local_getline(char *zLine, FILE *in){
667  int nLine = zLine==0 ? 0 : 100;
668  int n = 0;
669
670  while( 1 ){
671    if( n+100>nLine ){
672      nLine = nLine*2 + 100;
673      zLine = realloc(zLine, nLine);
674      if( zLine==0 ) shell_out_of_memory();
675    }
676    if( fgets(&zLine[n], nLine - n, in)==0 ){
677      if( n==0 ){
678        free(zLine);
679        return 0;
680      }
681      zLine[n] = 0;
682      break;
683    }
684    while( zLine[n] ) n++;
685    if( n>0 && zLine[n-1]=='\n' ){
686      n--;
687      if( n>0 && zLine[n-1]=='\r' ) n--;
688      zLine[n] = 0;
689      break;
690    }
691  }
692#if defined(_WIN32) || defined(WIN32)
693  /* For interactive input on Windows systems, translate the
694  ** multi-byte characterset characters into UTF-8. */
695  if( stdin_is_interactive && in==stdin ){
696    char *zTrans = sqlite3_win32_mbcs_to_utf8_v2(zLine, 0);
697    if( zTrans ){
698      int nTrans = strlen30(zTrans)+1;
699      if( nTrans>nLine ){
700        zLine = realloc(zLine, nTrans);
701        if( zLine==0 ) shell_out_of_memory();
702      }
703      memcpy(zLine, zTrans, nTrans);
704      sqlite3_free(zTrans);
705    }
706  }
707#endif /* defined(_WIN32) || defined(WIN32) */
708  return zLine;
709}
710
711/*
712** Retrieve a single line of input text.
713**
714** If in==0 then read from standard input and prompt before each line.
715** If isContinuation is true, then a continuation prompt is appropriate.
716** If isContinuation is zero, then the main prompt should be used.
717**
718** If zPrior is not NULL then it is a buffer from a prior call to this
719** routine that can be reused.
720**
721** The result is stored in space obtained from malloc() and must either
722** be freed by the caller or else passed back into this routine via the
723** zPrior argument for reuse.
724*/
725static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
726  char *zPrompt;
727  char *zResult;
728  if( in!=0 ){
729    zResult = local_getline(zPrior, in);
730  }else{
731    zPrompt = isContinuation ? continuePrompt : mainPrompt;
732#if SHELL_USE_LOCAL_GETLINE
733    printf("%s", zPrompt);
734    fflush(stdout);
735    zResult = local_getline(zPrior, stdin);
736#else
737    free(zPrior);
738    zResult = shell_readline(zPrompt);
739    if( zResult && *zResult ) shell_add_history(zResult);
740#endif
741  }
742  return zResult;
743}
744
745
746/*
747** Return the value of a hexadecimal digit.  Return -1 if the input
748** is not a hex digit.
749*/
750static int hexDigitValue(char c){
751  if( c>='0' && c<='9' ) return c - '0';
752  if( c>='a' && c<='f' ) return c - 'a' + 10;
753  if( c>='A' && c<='F' ) return c - 'A' + 10;
754  return -1;
755}
756
757/*
758** Interpret zArg as an integer value, possibly with suffixes.
759*/
760static sqlite3_int64 integerValue(const char *zArg){
761  sqlite3_int64 v = 0;
762  static const struct { char *zSuffix; int iMult; } aMult[] = {
763    { "KiB", 1024 },
764    { "MiB", 1024*1024 },
765    { "GiB", 1024*1024*1024 },
766    { "KB",  1000 },
767    { "MB",  1000000 },
768    { "GB",  1000000000 },
769    { "K",   1000 },
770    { "M",   1000000 },
771    { "G",   1000000000 },
772  };
773  int i;
774  int isNeg = 0;
775  if( zArg[0]=='-' ){
776    isNeg = 1;
777    zArg++;
778  }else if( zArg[0]=='+' ){
779    zArg++;
780  }
781  if( zArg[0]=='0' && zArg[1]=='x' ){
782    int x;
783    zArg += 2;
784    while( (x = hexDigitValue(zArg[0]))>=0 ){
785      v = (v<<4) + x;
786      zArg++;
787    }
788  }else{
789    while( IsDigit(zArg[0]) ){
790      v = v*10 + zArg[0] - '0';
791      zArg++;
792    }
793  }
794  for(i=0; i<ArraySize(aMult); i++){
795    if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
796      v *= aMult[i].iMult;
797      break;
798    }
799  }
800  return isNeg? -v : v;
801}
802
803/*
804** A variable length string to which one can append text.
805*/
806typedef struct ShellText ShellText;
807struct ShellText {
808  char *z;
809  int n;
810  int nAlloc;
811};
812
813/*
814** Initialize and destroy a ShellText object
815*/
816static void initText(ShellText *p){
817  memset(p, 0, sizeof(*p));
818}
819static void freeText(ShellText *p){
820  free(p->z);
821  initText(p);
822}
823
824/* zIn is either a pointer to a NULL-terminated string in memory obtained
825** from malloc(), or a NULL pointer. The string pointed to by zAppend is
826** added to zIn, and the result returned in memory obtained from malloc().
827** zIn, if it was not NULL, is freed.
828**
829** If the third argument, quote, is not '\0', then it is used as a
830** quote character for zAppend.
831*/
832static void appendText(ShellText *p, char const *zAppend, char quote){
833  int len;
834  int i;
835  int nAppend = strlen30(zAppend);
836
837  len = nAppend+p->n+1;
838  if( quote ){
839    len += 2;
840    for(i=0; i<nAppend; i++){
841      if( zAppend[i]==quote ) len++;
842    }
843  }
844
845  if( p->n+len>=p->nAlloc ){
846    p->nAlloc = p->nAlloc*2 + len + 20;
847    p->z = realloc(p->z, p->nAlloc);
848    if( p->z==0 ) shell_out_of_memory();
849  }
850
851  if( quote ){
852    char *zCsr = p->z+p->n;
853    *zCsr++ = quote;
854    for(i=0; i<nAppend; i++){
855      *zCsr++ = zAppend[i];
856      if( zAppend[i]==quote ) *zCsr++ = quote;
857    }
858    *zCsr++ = quote;
859    p->n = (int)(zCsr - p->z);
860    *zCsr = '\0';
861  }else{
862    memcpy(p->z+p->n, zAppend, nAppend);
863    p->n += nAppend;
864    p->z[p->n] = '\0';
865  }
866}
867
868/*
869** Attempt to determine if identifier zName needs to be quoted, either
870** because it contains non-alphanumeric characters, or because it is an
871** SQLite keyword.  Be conservative in this estimate:  When in doubt assume
872** that quoting is required.
873**
874** Return '"' if quoting is required.  Return 0 if no quoting is required.
875*/
876static char quoteChar(const char *zName){
877  int i;
878  if( !isalpha((unsigned char)zName[0]) && zName[0]!='_' ) return '"';
879  for(i=0; zName[i]; i++){
880    if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ) return '"';
881  }
882  return sqlite3_keyword_check(zName, i) ? '"' : 0;
883}
884
885/*
886** Construct a fake object name and column list to describe the structure
887** of the view, virtual table, or table valued function zSchema.zName.
888*/
889static char *shellFakeSchema(
890  sqlite3 *db,            /* The database connection containing the vtab */
891  const char *zSchema,    /* Schema of the database holding the vtab */
892  const char *zName       /* The name of the virtual table */
893){
894  sqlite3_stmt *pStmt = 0;
895  char *zSql;
896  ShellText s;
897  char cQuote;
898  char *zDiv = "(";
899  int nRow = 0;
900
901  zSql = sqlite3_mprintf("PRAGMA \"%w\".table_info=%Q;",
902                         zSchema ? zSchema : "main", zName);
903  sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
904  sqlite3_free(zSql);
905  initText(&s);
906  if( zSchema ){
907    cQuote = quoteChar(zSchema);
908    if( cQuote && sqlite3_stricmp(zSchema,"temp")==0 ) cQuote = 0;
909    appendText(&s, zSchema, cQuote);
910    appendText(&s, ".", 0);
911  }
912  cQuote = quoteChar(zName);
913  appendText(&s, zName, cQuote);
914  while( sqlite3_step(pStmt)==SQLITE_ROW ){
915    const char *zCol = (const char*)sqlite3_column_text(pStmt, 1);
916    nRow++;
917    appendText(&s, zDiv, 0);
918    zDiv = ",";
919    cQuote = quoteChar(zCol);
920    appendText(&s, zCol, cQuote);
921  }
922  appendText(&s, ")", 0);
923  sqlite3_finalize(pStmt);
924  if( nRow==0 ){
925    freeText(&s);
926    s.z = 0;
927  }
928  return s.z;
929}
930
931/*
932** SQL function:  shell_module_schema(X)
933**
934** Return a fake schema for the table-valued function or eponymous virtual
935** table X.
936*/
937static void shellModuleSchema(
938  sqlite3_context *pCtx,
939  int nVal,
940  sqlite3_value **apVal
941){
942  const char *zName = (const char*)sqlite3_value_text(apVal[0]);
943  char *zFake = shellFakeSchema(sqlite3_context_db_handle(pCtx), 0, zName);
944  UNUSED_PARAMETER(nVal);
945  if( zFake ){
946    sqlite3_result_text(pCtx, sqlite3_mprintf("/* %s */", zFake),
947                        -1, sqlite3_free);
948    free(zFake);
949  }
950}
951
952/*
953** SQL function:  shell_add_schema(S,X)
954**
955** Add the schema name X to the CREATE statement in S and return the result.
956** Examples:
957**
958**    CREATE TABLE t1(x)   ->   CREATE TABLE xyz.t1(x);
959**
960** Also works on
961**
962**    CREATE INDEX
963**    CREATE UNIQUE INDEX
964**    CREATE VIEW
965**    CREATE TRIGGER
966**    CREATE VIRTUAL TABLE
967**
968** This UDF is used by the .schema command to insert the schema name of
969** attached databases into the middle of the sqlite_schema.sql field.
970*/
971static void shellAddSchemaName(
972  sqlite3_context *pCtx,
973  int nVal,
974  sqlite3_value **apVal
975){
976  static const char *aPrefix[] = {
977     "TABLE",
978     "INDEX",
979     "UNIQUE INDEX",
980     "VIEW",
981     "TRIGGER",
982     "VIRTUAL TABLE"
983  };
984  int i = 0;
985  const char *zIn = (const char*)sqlite3_value_text(apVal[0]);
986  const char *zSchema = (const char*)sqlite3_value_text(apVal[1]);
987  const char *zName = (const char*)sqlite3_value_text(apVal[2]);
988  sqlite3 *db = sqlite3_context_db_handle(pCtx);
989  UNUSED_PARAMETER(nVal);
990  if( zIn!=0 && strncmp(zIn, "CREATE ", 7)==0 ){
991    for(i=0; i<(int)(sizeof(aPrefix)/sizeof(aPrefix[0])); i++){
992      int n = strlen30(aPrefix[i]);
993      if( strncmp(zIn+7, aPrefix[i], n)==0 && zIn[n+7]==' ' ){
994        char *z = 0;
995        char *zFake = 0;
996        if( zSchema ){
997          char cQuote = quoteChar(zSchema);
998          if( cQuote && sqlite3_stricmp(zSchema,"temp")!=0 ){
999            z = sqlite3_mprintf("%.*s \"%w\".%s", n+7, zIn, zSchema, zIn+n+8);
1000          }else{
1001            z = sqlite3_mprintf("%.*s %s.%s", n+7, zIn, zSchema, zIn+n+8);
1002          }
1003        }
1004        if( zName
1005         && aPrefix[i][0]=='V'
1006         && (zFake = shellFakeSchema(db, zSchema, zName))!=0
1007        ){
1008          if( z==0 ){
1009            z = sqlite3_mprintf("%s\n/* %s */", zIn, zFake);
1010          }else{
1011            z = sqlite3_mprintf("%z\n/* %s */", z, zFake);
1012          }
1013          free(zFake);
1014        }
1015        if( z ){
1016          sqlite3_result_text(pCtx, z, -1, sqlite3_free);
1017          return;
1018        }
1019      }
1020    }
1021  }
1022  sqlite3_result_value(pCtx, apVal[0]);
1023}
1024
1025/*
1026** The source code for several run-time loadable extensions is inserted
1027** below by the ../tool/mkshellc.tcl script.  Before processing that included
1028** code, we need to override some macros to make the included program code
1029** work here in the middle of this regular program.
1030*/
1031#define SQLITE_EXTENSION_INIT1
1032#define SQLITE_EXTENSION_INIT2(X) (void)(X)
1033
1034#if defined(_WIN32) && defined(_MSC_VER)
1035/************************* Begin test_windirent.h ******************/
1036/*
1037** 2015 November 30
1038**
1039** The author disclaims copyright to this source code.  In place of
1040** a legal notice, here is a blessing:
1041**
1042**    May you do good and not evil.
1043**    May you find forgiveness for yourself and forgive others.
1044**    May you share freely, never taking more than you give.
1045**
1046*************************************************************************
1047** This file contains declarations for most of the opendir() family of
1048** POSIX functions on Win32 using the MSVCRT.
1049*/
1050
1051#if defined(_WIN32) && defined(_MSC_VER) && !defined(SQLITE_WINDIRENT_H)
1052#define SQLITE_WINDIRENT_H
1053
1054/*
1055** We need several data types from the Windows SDK header.
1056*/
1057
1058#ifndef WIN32_LEAN_AND_MEAN
1059#define WIN32_LEAN_AND_MEAN
1060#endif
1061
1062#include "windows.h"
1063
1064/*
1065** We need several support functions from the SQLite core.
1066*/
1067
1068/* #include "sqlite3.h" */
1069
1070/*
1071** We need several things from the ANSI and MSVCRT headers.
1072*/
1073
1074#include <stdio.h>
1075#include <stdlib.h>
1076#include <errno.h>
1077#include <io.h>
1078#include <limits.h>
1079#include <sys/types.h>
1080#include <sys/stat.h>
1081
1082/*
1083** We may need several defines that should have been in "sys/stat.h".
1084*/
1085
1086#ifndef S_ISREG
1087#define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG)
1088#endif
1089
1090#ifndef S_ISDIR
1091#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
1092#endif
1093
1094#ifndef S_ISLNK
1095#define S_ISLNK(mode) (0)
1096#endif
1097
1098/*
1099** We may need to provide the "mode_t" type.
1100*/
1101
1102#ifndef MODE_T_DEFINED
1103  #define MODE_T_DEFINED
1104  typedef unsigned short mode_t;
1105#endif
1106
1107/*
1108** We may need to provide the "ino_t" type.
1109*/
1110
1111#ifndef INO_T_DEFINED
1112  #define INO_T_DEFINED
1113  typedef unsigned short ino_t;
1114#endif
1115
1116/*
1117** We need to define "NAME_MAX" if it was not present in "limits.h".
1118*/
1119
1120#ifndef NAME_MAX
1121#  ifdef FILENAME_MAX
1122#    define NAME_MAX (FILENAME_MAX)
1123#  else
1124#    define NAME_MAX (260)
1125#  endif
1126#endif
1127
1128/*
1129** We need to define "NULL_INTPTR_T" and "BAD_INTPTR_T".
1130*/
1131
1132#ifndef NULL_INTPTR_T
1133#  define NULL_INTPTR_T ((intptr_t)(0))
1134#endif
1135
1136#ifndef BAD_INTPTR_T
1137#  define BAD_INTPTR_T ((intptr_t)(-1))
1138#endif
1139
1140/*
1141** We need to provide the necessary structures and related types.
1142*/
1143
1144#ifndef DIRENT_DEFINED
1145#define DIRENT_DEFINED
1146typedef struct DIRENT DIRENT;
1147typedef DIRENT *LPDIRENT;
1148struct DIRENT {
1149  ino_t d_ino;               /* Sequence number, do not use. */
1150  unsigned d_attributes;     /* Win32 file attributes. */
1151  char d_name[NAME_MAX + 1]; /* Name within the directory. */
1152};
1153#endif
1154
1155#ifndef DIR_DEFINED
1156#define DIR_DEFINED
1157typedef struct DIR DIR;
1158typedef DIR *LPDIR;
1159struct DIR {
1160  intptr_t d_handle; /* Value returned by "_findfirst". */
1161  DIRENT d_first;    /* DIRENT constructed based on "_findfirst". */
1162  DIRENT d_next;     /* DIRENT constructed based on "_findnext". */
1163};
1164#endif
1165
1166/*
1167** Provide a macro, for use by the implementation, to determine if a
1168** particular directory entry should be skipped over when searching for
1169** the next directory entry that should be returned by the readdir() or
1170** readdir_r() functions.
1171*/
1172
1173#ifndef is_filtered
1174#  define is_filtered(a) ((((a).attrib)&_A_HIDDEN) || (((a).attrib)&_A_SYSTEM))
1175#endif
1176
1177/*
1178** Provide the function prototype for the POSIX compatiable getenv()
1179** function.  This function is not thread-safe.
1180*/
1181
1182extern const char *windirent_getenv(const char *name);
1183
1184/*
1185** Finally, we can provide the function prototypes for the opendir(),
1186** readdir(), readdir_r(), and closedir() POSIX functions.
1187*/
1188
1189extern LPDIR opendir(const char *dirname);
1190extern LPDIRENT readdir(LPDIR dirp);
1191extern INT readdir_r(LPDIR dirp, LPDIRENT entry, LPDIRENT *result);
1192extern INT closedir(LPDIR dirp);
1193
1194#endif /* defined(WIN32) && defined(_MSC_VER) */
1195
1196/************************* End test_windirent.h ********************/
1197/************************* Begin test_windirent.c ******************/
1198/*
1199** 2015 November 30
1200**
1201** The author disclaims copyright to this source code.  In place of
1202** a legal notice, here is a blessing:
1203**
1204**    May you do good and not evil.
1205**    May you find forgiveness for yourself and forgive others.
1206**    May you share freely, never taking more than you give.
1207**
1208*************************************************************************
1209** This file contains code to implement most of the opendir() family of
1210** POSIX functions on Win32 using the MSVCRT.
1211*/
1212
1213#if defined(_WIN32) && defined(_MSC_VER)
1214/* #include "test_windirent.h" */
1215
1216/*
1217** Implementation of the POSIX getenv() function using the Win32 API.
1218** This function is not thread-safe.
1219*/
1220const char *windirent_getenv(
1221  const char *name
1222){
1223  static char value[32768]; /* Maximum length, per MSDN */
1224  DWORD dwSize = sizeof(value) / sizeof(char); /* Size in chars */
1225  DWORD dwRet; /* Value returned by GetEnvironmentVariableA() */
1226
1227  memset(value, 0, sizeof(value));
1228  dwRet = GetEnvironmentVariableA(name, value, dwSize);
1229  if( dwRet==0 || dwRet>dwSize ){
1230    /*
1231    ** The function call to GetEnvironmentVariableA() failed -OR-
1232    ** the buffer is not large enough.  Either way, return NULL.
1233    */
1234    return 0;
1235  }else{
1236    /*
1237    ** The function call to GetEnvironmentVariableA() succeeded
1238    ** -AND- the buffer contains the entire value.
1239    */
1240    return value;
1241  }
1242}
1243
1244/*
1245** Implementation of the POSIX opendir() function using the MSVCRT.
1246*/
1247LPDIR opendir(
1248  const char *dirname
1249){
1250  struct _finddata_t data;
1251  LPDIR dirp = (LPDIR)sqlite3_malloc(sizeof(DIR));
1252  SIZE_T namesize = sizeof(data.name) / sizeof(data.name[0]);
1253
1254  if( dirp==NULL ) return NULL;
1255  memset(dirp, 0, sizeof(DIR));
1256
1257  /* TODO: Remove this if Unix-style root paths are not used. */
1258  if( sqlite3_stricmp(dirname, "/")==0 ){
1259    dirname = windirent_getenv("SystemDrive");
1260  }
1261
1262  memset(&data, 0, sizeof(struct _finddata_t));
1263  _snprintf(data.name, namesize, "%s\\*", dirname);
1264  dirp->d_handle = _findfirst(data.name, &data);
1265
1266  if( dirp->d_handle==BAD_INTPTR_T ){
1267    closedir(dirp);
1268    return NULL;
1269  }
1270
1271  /* TODO: Remove this block to allow hidden and/or system files. */
1272  if( is_filtered(data) ){
1273next:
1274
1275    memset(&data, 0, sizeof(struct _finddata_t));
1276    if( _findnext(dirp->d_handle, &data)==-1 ){
1277      closedir(dirp);
1278      return NULL;
1279    }
1280
1281    /* TODO: Remove this block to allow hidden and/or system files. */
1282    if( is_filtered(data) ) goto next;
1283  }
1284
1285  dirp->d_first.d_attributes = data.attrib;
1286  strncpy(dirp->d_first.d_name, data.name, NAME_MAX);
1287  dirp->d_first.d_name[NAME_MAX] = '\0';
1288
1289  return dirp;
1290}
1291
1292/*
1293** Implementation of the POSIX readdir() function using the MSVCRT.
1294*/
1295LPDIRENT readdir(
1296  LPDIR dirp
1297){
1298  struct _finddata_t data;
1299
1300  if( dirp==NULL ) return NULL;
1301
1302  if( dirp->d_first.d_ino==0 ){
1303    dirp->d_first.d_ino++;
1304    dirp->d_next.d_ino++;
1305
1306    return &dirp->d_first;
1307  }
1308
1309next:
1310
1311  memset(&data, 0, sizeof(struct _finddata_t));
1312  if( _findnext(dirp->d_handle, &data)==-1 ) return NULL;
1313
1314  /* TODO: Remove this block to allow hidden and/or system files. */
1315  if( is_filtered(data) ) goto next;
1316
1317  dirp->d_next.d_ino++;
1318  dirp->d_next.d_attributes = data.attrib;
1319  strncpy(dirp->d_next.d_name, data.name, NAME_MAX);
1320  dirp->d_next.d_name[NAME_MAX] = '\0';
1321
1322  return &dirp->d_next;
1323}
1324
1325/*
1326** Implementation of the POSIX readdir_r() function using the MSVCRT.
1327*/
1328INT readdir_r(
1329  LPDIR dirp,
1330  LPDIRENT entry,
1331  LPDIRENT *result
1332){
1333  struct _finddata_t data;
1334
1335  if( dirp==NULL ) return EBADF;
1336
1337  if( dirp->d_first.d_ino==0 ){
1338    dirp->d_first.d_ino++;
1339    dirp->d_next.d_ino++;
1340
1341    entry->d_ino = dirp->d_first.d_ino;
1342    entry->d_attributes = dirp->d_first.d_attributes;
1343    strncpy(entry->d_name, dirp->d_first.d_name, NAME_MAX);
1344    entry->d_name[NAME_MAX] = '\0';
1345
1346    *result = entry;
1347    return 0;
1348  }
1349
1350next:
1351
1352  memset(&data, 0, sizeof(struct _finddata_t));
1353  if( _findnext(dirp->d_handle, &data)==-1 ){
1354    *result = NULL;
1355    return ENOENT;
1356  }
1357
1358  /* TODO: Remove this block to allow hidden and/or system files. */
1359  if( is_filtered(data) ) goto next;
1360
1361  entry->d_ino = (ino_t)-1; /* not available */
1362  entry->d_attributes = data.attrib;
1363  strncpy(entry->d_name, data.name, NAME_MAX);
1364  entry->d_name[NAME_MAX] = '\0';
1365
1366  *result = entry;
1367  return 0;
1368}
1369
1370/*
1371** Implementation of the POSIX closedir() function using the MSVCRT.
1372*/
1373INT closedir(
1374  LPDIR dirp
1375){
1376  INT result = 0;
1377
1378  if( dirp==NULL ) return EINVAL;
1379
1380  if( dirp->d_handle!=NULL_INTPTR_T && dirp->d_handle!=BAD_INTPTR_T ){
1381    result = _findclose(dirp->d_handle);
1382  }
1383
1384  sqlite3_free(dirp);
1385  return result;
1386}
1387
1388#endif /* defined(WIN32) && defined(_MSC_VER) */
1389
1390/************************* End test_windirent.c ********************/
1391#define dirent DIRENT
1392#endif
1393/************************* Begin ../ext/misc/shathree.c ******************/
1394/*
1395** 2017-03-08
1396**
1397** The author disclaims copyright to this source code.  In place of
1398** a legal notice, here is a blessing:
1399**
1400**    May you do good and not evil.
1401**    May you find forgiveness for yourself and forgive others.
1402**    May you share freely, never taking more than you give.
1403**
1404******************************************************************************
1405**
1406** This SQLite extension implements functions that compute SHA3 hashes.
1407** Two SQL functions are implemented:
1408**
1409**     sha3(X,SIZE)
1410**     sha3_query(Y,SIZE)
1411**
1412** The sha3(X) function computes the SHA3 hash of the input X, or NULL if
1413** X is NULL.
1414**
1415** The sha3_query(Y) function evalutes all queries in the SQL statements of Y
1416** and returns a hash of their results.
1417**
1418** The SIZE argument is optional.  If omitted, the SHA3-256 hash algorithm
1419** is used.  If SIZE is included it must be one of the integers 224, 256,
1420** 384, or 512, to determine SHA3 hash variant that is computed.
1421*/
1422/* #include "sqlite3ext.h" */
1423SQLITE_EXTENSION_INIT1
1424#include <assert.h>
1425#include <string.h>
1426#include <stdarg.h>
1427
1428#ifndef SQLITE_AMALGAMATION
1429/* typedef sqlite3_uint64 u64; */
1430#endif /* SQLITE_AMALGAMATION */
1431
1432/******************************************************************************
1433** The Hash Engine
1434*/
1435/*
1436** Macros to determine whether the machine is big or little endian,
1437** and whether or not that determination is run-time or compile-time.
1438**
1439** For best performance, an attempt is made to guess at the byte-order
1440** using C-preprocessor macros.  If that is unsuccessful, or if
1441** -DSHA3_BYTEORDER=0 is set, then byte-order is determined
1442** at run-time.
1443*/
1444#ifndef SHA3_BYTEORDER
1445# if defined(i386)     || defined(__i386__)   || defined(_M_IX86) ||    \
1446     defined(__x86_64) || defined(__x86_64__) || defined(_M_X64)  ||    \
1447     defined(_M_AMD64) || defined(_M_ARM)     || defined(__x86)   ||    \
1448     defined(__arm__)
1449#   define SHA3_BYTEORDER    1234
1450# elif defined(sparc)    || defined(__ppc__)
1451#   define SHA3_BYTEORDER    4321
1452# else
1453#   define SHA3_BYTEORDER 0
1454# endif
1455#endif
1456
1457
1458/*
1459** State structure for a SHA3 hash in progress
1460*/
1461typedef struct SHA3Context SHA3Context;
1462struct SHA3Context {
1463  union {
1464    u64 s[25];                /* Keccak state. 5x5 lines of 64 bits each */
1465    unsigned char x[1600];    /* ... or 1600 bytes */
1466  } u;
1467  unsigned nRate;        /* Bytes of input accepted per Keccak iteration */
1468  unsigned nLoaded;      /* Input bytes loaded into u.x[] so far this cycle */
1469  unsigned ixMask;       /* Insert next input into u.x[nLoaded^ixMask]. */
1470};
1471
1472/*
1473** A single step of the Keccak mixing function for a 1600-bit state
1474*/
1475static void KeccakF1600Step(SHA3Context *p){
1476  int i;
1477  u64 b0, b1, b2, b3, b4;
1478  u64 c0, c1, c2, c3, c4;
1479  u64 d0, d1, d2, d3, d4;
1480  static const u64 RC[] = {
1481    0x0000000000000001ULL,  0x0000000000008082ULL,
1482    0x800000000000808aULL,  0x8000000080008000ULL,
1483    0x000000000000808bULL,  0x0000000080000001ULL,
1484    0x8000000080008081ULL,  0x8000000000008009ULL,
1485    0x000000000000008aULL,  0x0000000000000088ULL,
1486    0x0000000080008009ULL,  0x000000008000000aULL,
1487    0x000000008000808bULL,  0x800000000000008bULL,
1488    0x8000000000008089ULL,  0x8000000000008003ULL,
1489    0x8000000000008002ULL,  0x8000000000000080ULL,
1490    0x000000000000800aULL,  0x800000008000000aULL,
1491    0x8000000080008081ULL,  0x8000000000008080ULL,
1492    0x0000000080000001ULL,  0x8000000080008008ULL
1493  };
1494# define a00 (p->u.s[0])
1495# define a01 (p->u.s[1])
1496# define a02 (p->u.s[2])
1497# define a03 (p->u.s[3])
1498# define a04 (p->u.s[4])
1499# define a10 (p->u.s[5])
1500# define a11 (p->u.s[6])
1501# define a12 (p->u.s[7])
1502# define a13 (p->u.s[8])
1503# define a14 (p->u.s[9])
1504# define a20 (p->u.s[10])
1505# define a21 (p->u.s[11])
1506# define a22 (p->u.s[12])
1507# define a23 (p->u.s[13])
1508# define a24 (p->u.s[14])
1509# define a30 (p->u.s[15])
1510# define a31 (p->u.s[16])
1511# define a32 (p->u.s[17])
1512# define a33 (p->u.s[18])
1513# define a34 (p->u.s[19])
1514# define a40 (p->u.s[20])
1515# define a41 (p->u.s[21])
1516# define a42 (p->u.s[22])
1517# define a43 (p->u.s[23])
1518# define a44 (p->u.s[24])
1519# define ROL64(a,x) ((a<<x)|(a>>(64-x)))
1520
1521  for(i=0; i<24; i+=4){
1522    c0 = a00^a10^a20^a30^a40;
1523    c1 = a01^a11^a21^a31^a41;
1524    c2 = a02^a12^a22^a32^a42;
1525    c3 = a03^a13^a23^a33^a43;
1526    c4 = a04^a14^a24^a34^a44;
1527    d0 = c4^ROL64(c1, 1);
1528    d1 = c0^ROL64(c2, 1);
1529    d2 = c1^ROL64(c3, 1);
1530    d3 = c2^ROL64(c4, 1);
1531    d4 = c3^ROL64(c0, 1);
1532
1533    b0 = (a00^d0);
1534    b1 = ROL64((a11^d1), 44);
1535    b2 = ROL64((a22^d2), 43);
1536    b3 = ROL64((a33^d3), 21);
1537    b4 = ROL64((a44^d4), 14);
1538    a00 =   b0 ^((~b1)&  b2 );
1539    a00 ^= RC[i];
1540    a11 =   b1 ^((~b2)&  b3 );
1541    a22 =   b2 ^((~b3)&  b4 );
1542    a33 =   b3 ^((~b4)&  b0 );
1543    a44 =   b4 ^((~b0)&  b1 );
1544
1545    b2 = ROL64((a20^d0), 3);
1546    b3 = ROL64((a31^d1), 45);
1547    b4 = ROL64((a42^d2), 61);
1548    b0 = ROL64((a03^d3), 28);
1549    b1 = ROL64((a14^d4), 20);
1550    a20 =   b0 ^((~b1)&  b2 );
1551    a31 =   b1 ^((~b2)&  b3 );
1552    a42 =   b2 ^((~b3)&  b4 );
1553    a03 =   b3 ^((~b4)&  b0 );
1554    a14 =   b4 ^((~b0)&  b1 );
1555
1556    b4 = ROL64((a40^d0), 18);
1557    b0 = ROL64((a01^d1), 1);
1558    b1 = ROL64((a12^d2), 6);
1559    b2 = ROL64((a23^d3), 25);
1560    b3 = ROL64((a34^d4), 8);
1561    a40 =   b0 ^((~b1)&  b2 );
1562    a01 =   b1 ^((~b2)&  b3 );
1563    a12 =   b2 ^((~b3)&  b4 );
1564    a23 =   b3 ^((~b4)&  b0 );
1565    a34 =   b4 ^((~b0)&  b1 );
1566
1567    b1 = ROL64((a10^d0), 36);
1568    b2 = ROL64((a21^d1), 10);
1569    b3 = ROL64((a32^d2), 15);
1570    b4 = ROL64((a43^d3), 56);
1571    b0 = ROL64((a04^d4), 27);
1572    a10 =   b0 ^((~b1)&  b2 );
1573    a21 =   b1 ^((~b2)&  b3 );
1574    a32 =   b2 ^((~b3)&  b4 );
1575    a43 =   b3 ^((~b4)&  b0 );
1576    a04 =   b4 ^((~b0)&  b1 );
1577
1578    b3 = ROL64((a30^d0), 41);
1579    b4 = ROL64((a41^d1), 2);
1580    b0 = ROL64((a02^d2), 62);
1581    b1 = ROL64((a13^d3), 55);
1582    b2 = ROL64((a24^d4), 39);
1583    a30 =   b0 ^((~b1)&  b2 );
1584    a41 =   b1 ^((~b2)&  b3 );
1585    a02 =   b2 ^((~b3)&  b4 );
1586    a13 =   b3 ^((~b4)&  b0 );
1587    a24 =   b4 ^((~b0)&  b1 );
1588
1589    c0 = a00^a20^a40^a10^a30;
1590    c1 = a11^a31^a01^a21^a41;
1591    c2 = a22^a42^a12^a32^a02;
1592    c3 = a33^a03^a23^a43^a13;
1593    c4 = a44^a14^a34^a04^a24;
1594    d0 = c4^ROL64(c1, 1);
1595    d1 = c0^ROL64(c2, 1);
1596    d2 = c1^ROL64(c3, 1);
1597    d3 = c2^ROL64(c4, 1);
1598    d4 = c3^ROL64(c0, 1);
1599
1600    b0 = (a00^d0);
1601    b1 = ROL64((a31^d1), 44);
1602    b2 = ROL64((a12^d2), 43);
1603    b3 = ROL64((a43^d3), 21);
1604    b4 = ROL64((a24^d4), 14);
1605    a00 =   b0 ^((~b1)&  b2 );
1606    a00 ^= RC[i+1];
1607    a31 =   b1 ^((~b2)&  b3 );
1608    a12 =   b2 ^((~b3)&  b4 );
1609    a43 =   b3 ^((~b4)&  b0 );
1610    a24 =   b4 ^((~b0)&  b1 );
1611
1612    b2 = ROL64((a40^d0), 3);
1613    b3 = ROL64((a21^d1), 45);
1614    b4 = ROL64((a02^d2), 61);
1615    b0 = ROL64((a33^d3), 28);
1616    b1 = ROL64((a14^d4), 20);
1617    a40 =   b0 ^((~b1)&  b2 );
1618    a21 =   b1 ^((~b2)&  b3 );
1619    a02 =   b2 ^((~b3)&  b4 );
1620    a33 =   b3 ^((~b4)&  b0 );
1621    a14 =   b4 ^((~b0)&  b1 );
1622
1623    b4 = ROL64((a30^d0), 18);
1624    b0 = ROL64((a11^d1), 1);
1625    b1 = ROL64((a42^d2), 6);
1626    b2 = ROL64((a23^d3), 25);
1627    b3 = ROL64((a04^d4), 8);
1628    a30 =   b0 ^((~b1)&  b2 );
1629    a11 =   b1 ^((~b2)&  b3 );
1630    a42 =   b2 ^((~b3)&  b4 );
1631    a23 =   b3 ^((~b4)&  b0 );
1632    a04 =   b4 ^((~b0)&  b1 );
1633
1634    b1 = ROL64((a20^d0), 36);
1635    b2 = ROL64((a01^d1), 10);
1636    b3 = ROL64((a32^d2), 15);
1637    b4 = ROL64((a13^d3), 56);
1638    b0 = ROL64((a44^d4), 27);
1639    a20 =   b0 ^((~b1)&  b2 );
1640    a01 =   b1 ^((~b2)&  b3 );
1641    a32 =   b2 ^((~b3)&  b4 );
1642    a13 =   b3 ^((~b4)&  b0 );
1643    a44 =   b4 ^((~b0)&  b1 );
1644
1645    b3 = ROL64((a10^d0), 41);
1646    b4 = ROL64((a41^d1), 2);
1647    b0 = ROL64((a22^d2), 62);
1648    b1 = ROL64((a03^d3), 55);
1649    b2 = ROL64((a34^d4), 39);
1650    a10 =   b0 ^((~b1)&  b2 );
1651    a41 =   b1 ^((~b2)&  b3 );
1652    a22 =   b2 ^((~b3)&  b4 );
1653    a03 =   b3 ^((~b4)&  b0 );
1654    a34 =   b4 ^((~b0)&  b1 );
1655
1656    c0 = a00^a40^a30^a20^a10;
1657    c1 = a31^a21^a11^a01^a41;
1658    c2 = a12^a02^a42^a32^a22;
1659    c3 = a43^a33^a23^a13^a03;
1660    c4 = a24^a14^a04^a44^a34;
1661    d0 = c4^ROL64(c1, 1);
1662    d1 = c0^ROL64(c2, 1);
1663    d2 = c1^ROL64(c3, 1);
1664    d3 = c2^ROL64(c4, 1);
1665    d4 = c3^ROL64(c0, 1);
1666
1667    b0 = (a00^d0);
1668    b1 = ROL64((a21^d1), 44);
1669    b2 = ROL64((a42^d2), 43);
1670    b3 = ROL64((a13^d3), 21);
1671    b4 = ROL64((a34^d4), 14);
1672    a00 =   b0 ^((~b1)&  b2 );
1673    a00 ^= RC[i+2];
1674    a21 =   b1 ^((~b2)&  b3 );
1675    a42 =   b2 ^((~b3)&  b4 );
1676    a13 =   b3 ^((~b4)&  b0 );
1677    a34 =   b4 ^((~b0)&  b1 );
1678
1679    b2 = ROL64((a30^d0), 3);
1680    b3 = ROL64((a01^d1), 45);
1681    b4 = ROL64((a22^d2), 61);
1682    b0 = ROL64((a43^d3), 28);
1683    b1 = ROL64((a14^d4), 20);
1684    a30 =   b0 ^((~b1)&  b2 );
1685    a01 =   b1 ^((~b2)&  b3 );
1686    a22 =   b2 ^((~b3)&  b4 );
1687    a43 =   b3 ^((~b4)&  b0 );
1688    a14 =   b4 ^((~b0)&  b1 );
1689
1690    b4 = ROL64((a10^d0), 18);
1691    b0 = ROL64((a31^d1), 1);
1692    b1 = ROL64((a02^d2), 6);
1693    b2 = ROL64((a23^d3), 25);
1694    b3 = ROL64((a44^d4), 8);
1695    a10 =   b0 ^((~b1)&  b2 );
1696    a31 =   b1 ^((~b2)&  b3 );
1697    a02 =   b2 ^((~b3)&  b4 );
1698    a23 =   b3 ^((~b4)&  b0 );
1699    a44 =   b4 ^((~b0)&  b1 );
1700
1701    b1 = ROL64((a40^d0), 36);
1702    b2 = ROL64((a11^d1), 10);
1703    b3 = ROL64((a32^d2), 15);
1704    b4 = ROL64((a03^d3), 56);
1705    b0 = ROL64((a24^d4), 27);
1706    a40 =   b0 ^((~b1)&  b2 );
1707    a11 =   b1 ^((~b2)&  b3 );
1708    a32 =   b2 ^((~b3)&  b4 );
1709    a03 =   b3 ^((~b4)&  b0 );
1710    a24 =   b4 ^((~b0)&  b1 );
1711
1712    b3 = ROL64((a20^d0), 41);
1713    b4 = ROL64((a41^d1), 2);
1714    b0 = ROL64((a12^d2), 62);
1715    b1 = ROL64((a33^d3), 55);
1716    b2 = ROL64((a04^d4), 39);
1717    a20 =   b0 ^((~b1)&  b2 );
1718    a41 =   b1 ^((~b2)&  b3 );
1719    a12 =   b2 ^((~b3)&  b4 );
1720    a33 =   b3 ^((~b4)&  b0 );
1721    a04 =   b4 ^((~b0)&  b1 );
1722
1723    c0 = a00^a30^a10^a40^a20;
1724    c1 = a21^a01^a31^a11^a41;
1725    c2 = a42^a22^a02^a32^a12;
1726    c3 = a13^a43^a23^a03^a33;
1727    c4 = a34^a14^a44^a24^a04;
1728    d0 = c4^ROL64(c1, 1);
1729    d1 = c0^ROL64(c2, 1);
1730    d2 = c1^ROL64(c3, 1);
1731    d3 = c2^ROL64(c4, 1);
1732    d4 = c3^ROL64(c0, 1);
1733
1734    b0 = (a00^d0);
1735    b1 = ROL64((a01^d1), 44);
1736    b2 = ROL64((a02^d2), 43);
1737    b3 = ROL64((a03^d3), 21);
1738    b4 = ROL64((a04^d4), 14);
1739    a00 =   b0 ^((~b1)&  b2 );
1740    a00 ^= RC[i+3];
1741    a01 =   b1 ^((~b2)&  b3 );
1742    a02 =   b2 ^((~b3)&  b4 );
1743    a03 =   b3 ^((~b4)&  b0 );
1744    a04 =   b4 ^((~b0)&  b1 );
1745
1746    b2 = ROL64((a10^d0), 3);
1747    b3 = ROL64((a11^d1), 45);
1748    b4 = ROL64((a12^d2), 61);
1749    b0 = ROL64((a13^d3), 28);
1750    b1 = ROL64((a14^d4), 20);
1751    a10 =   b0 ^((~b1)&  b2 );
1752    a11 =   b1 ^((~b2)&  b3 );
1753    a12 =   b2 ^((~b3)&  b4 );
1754    a13 =   b3 ^((~b4)&  b0 );
1755    a14 =   b4 ^((~b0)&  b1 );
1756
1757    b4 = ROL64((a20^d0), 18);
1758    b0 = ROL64((a21^d1), 1);
1759    b1 = ROL64((a22^d2), 6);
1760    b2 = ROL64((a23^d3), 25);
1761    b3 = ROL64((a24^d4), 8);
1762    a20 =   b0 ^((~b1)&  b2 );
1763    a21 =   b1 ^((~b2)&  b3 );
1764    a22 =   b2 ^((~b3)&  b4 );
1765    a23 =   b3 ^((~b4)&  b0 );
1766    a24 =   b4 ^((~b0)&  b1 );
1767
1768    b1 = ROL64((a30^d0), 36);
1769    b2 = ROL64((a31^d1), 10);
1770    b3 = ROL64((a32^d2), 15);
1771    b4 = ROL64((a33^d3), 56);
1772    b0 = ROL64((a34^d4), 27);
1773    a30 =   b0 ^((~b1)&  b2 );
1774    a31 =   b1 ^((~b2)&  b3 );
1775    a32 =   b2 ^((~b3)&  b4 );
1776    a33 =   b3 ^((~b4)&  b0 );
1777    a34 =   b4 ^((~b0)&  b1 );
1778
1779    b3 = ROL64((a40^d0), 41);
1780    b4 = ROL64((a41^d1), 2);
1781    b0 = ROL64((a42^d2), 62);
1782    b1 = ROL64((a43^d3), 55);
1783    b2 = ROL64((a44^d4), 39);
1784    a40 =   b0 ^((~b1)&  b2 );
1785    a41 =   b1 ^((~b2)&  b3 );
1786    a42 =   b2 ^((~b3)&  b4 );
1787    a43 =   b3 ^((~b4)&  b0 );
1788    a44 =   b4 ^((~b0)&  b1 );
1789  }
1790}
1791
1792/*
1793** Initialize a new hash.  iSize determines the size of the hash
1794** in bits and should be one of 224, 256, 384, or 512.  Or iSize
1795** can be zero to use the default hash size of 256 bits.
1796*/
1797static void SHA3Init(SHA3Context *p, int iSize){
1798  memset(p, 0, sizeof(*p));
1799  if( iSize>=128 && iSize<=512 ){
1800    p->nRate = (1600 - ((iSize + 31)&~31)*2)/8;
1801  }else{
1802    p->nRate = (1600 - 2*256)/8;
1803  }
1804#if SHA3_BYTEORDER==1234
1805  /* Known to be little-endian at compile-time. No-op */
1806#elif SHA3_BYTEORDER==4321
1807  p->ixMask = 7;  /* Big-endian */
1808#else
1809  {
1810    static unsigned int one = 1;
1811    if( 1==*(unsigned char*)&one ){
1812      /* Little endian.  No byte swapping. */
1813      p->ixMask = 0;
1814    }else{
1815      /* Big endian.  Byte swap. */
1816      p->ixMask = 7;
1817    }
1818  }
1819#endif
1820}
1821
1822/*
1823** Make consecutive calls to the SHA3Update function to add new content
1824** to the hash
1825*/
1826static void SHA3Update(
1827  SHA3Context *p,
1828  const unsigned char *aData,
1829  unsigned int nData
1830){
1831  unsigned int i = 0;
1832#if SHA3_BYTEORDER==1234
1833  if( (p->nLoaded % 8)==0 && ((aData - (const unsigned char*)0)&7)==0 ){
1834    for(; i+7<nData; i+=8){
1835      p->u.s[p->nLoaded/8] ^= *(u64*)&aData[i];
1836      p->nLoaded += 8;
1837      if( p->nLoaded>=p->nRate ){
1838        KeccakF1600Step(p);
1839        p->nLoaded = 0;
1840      }
1841    }
1842  }
1843#endif
1844  for(; i<nData; i++){
1845#if SHA3_BYTEORDER==1234
1846    p->u.x[p->nLoaded] ^= aData[i];
1847#elif SHA3_BYTEORDER==4321
1848    p->u.x[p->nLoaded^0x07] ^= aData[i];
1849#else
1850    p->u.x[p->nLoaded^p->ixMask] ^= aData[i];
1851#endif
1852    p->nLoaded++;
1853    if( p->nLoaded==p->nRate ){
1854      KeccakF1600Step(p);
1855      p->nLoaded = 0;
1856    }
1857  }
1858}
1859
1860/*
1861** After all content has been added, invoke SHA3Final() to compute
1862** the final hash.  The function returns a pointer to the binary
1863** hash value.
1864*/
1865static unsigned char *SHA3Final(SHA3Context *p){
1866  unsigned int i;
1867  if( p->nLoaded==p->nRate-1 ){
1868    const unsigned char c1 = 0x86;
1869    SHA3Update(p, &c1, 1);
1870  }else{
1871    const unsigned char c2 = 0x06;
1872    const unsigned char c3 = 0x80;
1873    SHA3Update(p, &c2, 1);
1874    p->nLoaded = p->nRate - 1;
1875    SHA3Update(p, &c3, 1);
1876  }
1877  for(i=0; i<p->nRate; i++){
1878    p->u.x[i+p->nRate] = p->u.x[i^p->ixMask];
1879  }
1880  return &p->u.x[p->nRate];
1881}
1882/* End of the hashing logic
1883*****************************************************************************/
1884
1885/*
1886** Implementation of the sha3(X,SIZE) function.
1887**
1888** Return a BLOB which is the SIZE-bit SHA3 hash of X.  The default
1889** size is 256.  If X is a BLOB, it is hashed as is.
1890** For all other non-NULL types of input, X is converted into a UTF-8 string
1891** and the string is hashed without the trailing 0x00 terminator.  The hash
1892** of a NULL value is NULL.
1893*/
1894static void sha3Func(
1895  sqlite3_context *context,
1896  int argc,
1897  sqlite3_value **argv
1898){
1899  SHA3Context cx;
1900  int eType = sqlite3_value_type(argv[0]);
1901  int nByte = sqlite3_value_bytes(argv[0]);
1902  int iSize;
1903  if( argc==1 ){
1904    iSize = 256;
1905  }else{
1906    iSize = sqlite3_value_int(argv[1]);
1907    if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){
1908      sqlite3_result_error(context, "SHA3 size should be one of: 224 256 "
1909                                    "384 512", -1);
1910      return;
1911    }
1912  }
1913  if( eType==SQLITE_NULL ) return;
1914  SHA3Init(&cx, iSize);
1915  if( eType==SQLITE_BLOB ){
1916    SHA3Update(&cx, sqlite3_value_blob(argv[0]), nByte);
1917  }else{
1918    SHA3Update(&cx, sqlite3_value_text(argv[0]), nByte);
1919  }
1920  sqlite3_result_blob(context, SHA3Final(&cx), iSize/8, SQLITE_TRANSIENT);
1921}
1922
1923/* Compute a string using sqlite3_vsnprintf() with a maximum length
1924** of 50 bytes and add it to the hash.
1925*/
1926static void hash_step_vformat(
1927  SHA3Context *p,                 /* Add content to this context */
1928  const char *zFormat,
1929  ...
1930){
1931  va_list ap;
1932  int n;
1933  char zBuf[50];
1934  va_start(ap, zFormat);
1935  sqlite3_vsnprintf(sizeof(zBuf),zBuf,zFormat,ap);
1936  va_end(ap);
1937  n = (int)strlen(zBuf);
1938  SHA3Update(p, (unsigned char*)zBuf, n);
1939}
1940
1941/*
1942** Implementation of the sha3_query(SQL,SIZE) function.
1943**
1944** This function compiles and runs the SQL statement(s) given in the
1945** argument. The results are hashed using a SIZE-bit SHA3.  The default
1946** size is 256.
1947**
1948** The format of the byte stream that is hashed is summarized as follows:
1949**
1950**       S<n>:<sql>
1951**       R
1952**       N
1953**       I<int>
1954**       F<ieee-float>
1955**       B<size>:<bytes>
1956**       T<size>:<text>
1957**
1958** <sql> is the original SQL text for each statement run and <n> is
1959** the size of that text.  The SQL text is UTF-8.  A single R character
1960** occurs before the start of each row.  N means a NULL value.
1961** I mean an 8-byte little-endian integer <int>.  F is a floating point
1962** number with an 8-byte little-endian IEEE floating point value <ieee-float>.
1963** B means blobs of <size> bytes.  T means text rendered as <size>
1964** bytes of UTF-8.  The <n> and <size> values are expressed as an ASCII
1965** text integers.
1966**
1967** For each SQL statement in the X input, there is one S segment.  Each
1968** S segment is followed by zero or more R segments, one for each row in the
1969** result set.  After each R, there are one or more N, I, F, B, or T segments,
1970** one for each column in the result set.  Segments are concatentated directly
1971** with no delimiters of any kind.
1972*/
1973static void sha3QueryFunc(
1974  sqlite3_context *context,
1975  int argc,
1976  sqlite3_value **argv
1977){
1978  sqlite3 *db = sqlite3_context_db_handle(context);
1979  const char *zSql = (const char*)sqlite3_value_text(argv[0]);
1980  sqlite3_stmt *pStmt = 0;
1981  int nCol;                   /* Number of columns in the result set */
1982  int i;                      /* Loop counter */
1983  int rc;
1984  int n;
1985  const char *z;
1986  SHA3Context cx;
1987  int iSize;
1988
1989  if( argc==1 ){
1990    iSize = 256;
1991  }else{
1992    iSize = sqlite3_value_int(argv[1]);
1993    if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){
1994      sqlite3_result_error(context, "SHA3 size should be one of: 224 256 "
1995                                    "384 512", -1);
1996      return;
1997    }
1998  }
1999  if( zSql==0 ) return;
2000  SHA3Init(&cx, iSize);
2001  while( zSql[0] ){
2002    rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zSql);
2003    if( rc ){
2004      char *zMsg = sqlite3_mprintf("error SQL statement [%s]: %s",
2005                                   zSql, sqlite3_errmsg(db));
2006      sqlite3_finalize(pStmt);
2007      sqlite3_result_error(context, zMsg, -1);
2008      sqlite3_free(zMsg);
2009      return;
2010    }
2011    if( !sqlite3_stmt_readonly(pStmt) ){
2012      char *zMsg = sqlite3_mprintf("non-query: [%s]", sqlite3_sql(pStmt));
2013      sqlite3_finalize(pStmt);
2014      sqlite3_result_error(context, zMsg, -1);
2015      sqlite3_free(zMsg);
2016      return;
2017    }
2018    nCol = sqlite3_column_count(pStmt);
2019    z = sqlite3_sql(pStmt);
2020    if( z ){
2021      n = (int)strlen(z);
2022      hash_step_vformat(&cx,"S%d:",n);
2023      SHA3Update(&cx,(unsigned char*)z,n);
2024    }
2025
2026    /* Compute a hash over the result of the query */
2027    while( SQLITE_ROW==sqlite3_step(pStmt) ){
2028      SHA3Update(&cx,(const unsigned char*)"R",1);
2029      for(i=0; i<nCol; i++){
2030        switch( sqlite3_column_type(pStmt,i) ){
2031          case SQLITE_NULL: {
2032            SHA3Update(&cx, (const unsigned char*)"N",1);
2033            break;
2034          }
2035          case SQLITE_INTEGER: {
2036            sqlite3_uint64 u;
2037            int j;
2038            unsigned char x[9];
2039            sqlite3_int64 v = sqlite3_column_int64(pStmt,i);
2040            memcpy(&u, &v, 8);
2041            for(j=8; j>=1; j--){
2042              x[j] = u & 0xff;
2043              u >>= 8;
2044            }
2045            x[0] = 'I';
2046            SHA3Update(&cx, x, 9);
2047            break;
2048          }
2049          case SQLITE_FLOAT: {
2050            sqlite3_uint64 u;
2051            int j;
2052            unsigned char x[9];
2053            double r = sqlite3_column_double(pStmt,i);
2054            memcpy(&u, &r, 8);
2055            for(j=8; j>=1; j--){
2056              x[j] = u & 0xff;
2057              u >>= 8;
2058            }
2059            x[0] = 'F';
2060            SHA3Update(&cx,x,9);
2061            break;
2062          }
2063          case SQLITE_TEXT: {
2064            int n2 = sqlite3_column_bytes(pStmt, i);
2065            const unsigned char *z2 = sqlite3_column_text(pStmt, i);
2066            hash_step_vformat(&cx,"T%d:",n2);
2067            SHA3Update(&cx, z2, n2);
2068            break;
2069          }
2070          case SQLITE_BLOB: {
2071            int n2 = sqlite3_column_bytes(pStmt, i);
2072            const unsigned char *z2 = sqlite3_column_blob(pStmt, i);
2073            hash_step_vformat(&cx,"B%d:",n2);
2074            SHA3Update(&cx, z2, n2);
2075            break;
2076          }
2077        }
2078      }
2079    }
2080    sqlite3_finalize(pStmt);
2081  }
2082  sqlite3_result_blob(context, SHA3Final(&cx), iSize/8, SQLITE_TRANSIENT);
2083}
2084
2085
2086#ifdef _WIN32
2087
2088#endif
2089int sqlite3_shathree_init(
2090  sqlite3 *db,
2091  char **pzErrMsg,
2092  const sqlite3_api_routines *pApi
2093){
2094  int rc = SQLITE_OK;
2095  SQLITE_EXTENSION_INIT2(pApi);
2096  (void)pzErrMsg;  /* Unused parameter */
2097  rc = sqlite3_create_function(db, "sha3", 1,
2098                      SQLITE_UTF8 | SQLITE_INNOCUOUS | SQLITE_DETERMINISTIC,
2099                      0, sha3Func, 0, 0);
2100  if( rc==SQLITE_OK ){
2101    rc = sqlite3_create_function(db, "sha3", 2,
2102                      SQLITE_UTF8 | SQLITE_INNOCUOUS | SQLITE_DETERMINISTIC,
2103                      0, sha3Func, 0, 0);
2104  }
2105  if( rc==SQLITE_OK ){
2106    rc = sqlite3_create_function(db, "sha3_query", 1,
2107                      SQLITE_UTF8 | SQLITE_DIRECTONLY,
2108                      0, sha3QueryFunc, 0, 0);
2109  }
2110  if( rc==SQLITE_OK ){
2111    rc = sqlite3_create_function(db, "sha3_query", 2,
2112                      SQLITE_UTF8 | SQLITE_DIRECTONLY,
2113                      0, sha3QueryFunc, 0, 0);
2114  }
2115  return rc;
2116}
2117
2118/************************* End ../ext/misc/shathree.c ********************/
2119/************************* Begin ../ext/misc/fileio.c ******************/
2120/*
2121** 2014-06-13
2122**
2123** The author disclaims copyright to this source code.  In place of
2124** a legal notice, here is a blessing:
2125**
2126**    May you do good and not evil.
2127**    May you find forgiveness for yourself and forgive others.
2128**    May you share freely, never taking more than you give.
2129**
2130******************************************************************************
2131**
2132** This SQLite extension implements SQL functions readfile() and
2133** writefile(), and eponymous virtual type "fsdir".
2134**
2135** WRITEFILE(FILE, DATA [, MODE [, MTIME]]):
2136**
2137**   If neither of the optional arguments is present, then this UDF
2138**   function writes blob DATA to file FILE. If successful, the number
2139**   of bytes written is returned. If an error occurs, NULL is returned.
2140**
2141**   If the first option argument - MODE - is present, then it must
2142**   be passed an integer value that corresponds to a POSIX mode
2143**   value (file type + permissions, as returned in the stat.st_mode
2144**   field by the stat() system call). Three types of files may
2145**   be written/created:
2146**
2147**     regular files:  (mode & 0170000)==0100000
2148**     symbolic links: (mode & 0170000)==0120000
2149**     directories:    (mode & 0170000)==0040000
2150**
2151**   For a directory, the DATA is ignored. For a symbolic link, it is
2152**   interpreted as text and used as the target of the link. For a
2153**   regular file, it is interpreted as a blob and written into the
2154**   named file. Regardless of the type of file, its permissions are
2155**   set to (mode & 0777) before returning.
2156**
2157**   If the optional MTIME argument is present, then it is interpreted
2158**   as an integer - the number of seconds since the unix epoch. The
2159**   modification-time of the target file is set to this value before
2160**   returning.
2161**
2162**   If three or more arguments are passed to this function and an
2163**   error is encountered, an exception is raised.
2164**
2165** READFILE(FILE):
2166**
2167**   Read and return the contents of file FILE (type blob) from disk.
2168**
2169** FSDIR:
2170**
2171**   Used as follows:
2172**
2173**     SELECT * FROM fsdir($path [, $dir]);
2174**
2175**   Parameter $path is an absolute or relative pathname. If the file that it
2176**   refers to does not exist, it is an error. If the path refers to a regular
2177**   file or symbolic link, it returns a single row. Or, if the path refers
2178**   to a directory, it returns one row for the directory, and one row for each
2179**   file within the hierarchy rooted at $path.
2180**
2181**   Each row has the following columns:
2182**
2183**     name:  Path to file or directory (text value).
2184**     mode:  Value of stat.st_mode for directory entry (an integer).
2185**     mtime: Value of stat.st_mtime for directory entry (an integer).
2186**     data:  For a regular file, a blob containing the file data. For a
2187**            symlink, a text value containing the text of the link. For a
2188**            directory, NULL.
2189**
2190**   If a non-NULL value is specified for the optional $dir parameter and
2191**   $path is a relative path, then $path is interpreted relative to $dir.
2192**   And the paths returned in the "name" column of the table are also
2193**   relative to directory $dir.
2194*/
2195/* #include "sqlite3ext.h" */
2196SQLITE_EXTENSION_INIT1
2197#include <stdio.h>
2198#include <string.h>
2199#include <assert.h>
2200
2201#include <sys/types.h>
2202#include <sys/stat.h>
2203#include <fcntl.h>
2204#if !defined(_WIN32) && !defined(WIN32)
2205#  include <unistd.h>
2206#  include <dirent.h>
2207#  include <utime.h>
2208#  include <sys/time.h>
2209#else
2210#  include "windows.h"
2211#  include <io.h>
2212#  include <direct.h>
2213/* #  include "test_windirent.h" */
2214#  define dirent DIRENT
2215#  ifndef chmod
2216#    define chmod _chmod
2217#  endif
2218#  ifndef stat
2219#    define stat _stat
2220#  endif
2221#  define mkdir(path,mode) _mkdir(path)
2222#  define lstat(path,buf) stat(path,buf)
2223#endif
2224#include <time.h>
2225#include <errno.h>
2226
2227
2228/*
2229** Structure of the fsdir() table-valued function
2230*/
2231                 /*    0    1    2     3    4           5             */
2232#define FSDIR_SCHEMA "(name,mode,mtime,data,path HIDDEN,dir HIDDEN)"
2233#define FSDIR_COLUMN_NAME     0     /* Name of the file */
2234#define FSDIR_COLUMN_MODE     1     /* Access mode */
2235#define FSDIR_COLUMN_MTIME    2     /* Last modification time */
2236#define FSDIR_COLUMN_DATA     3     /* File content */
2237#define FSDIR_COLUMN_PATH     4     /* Path to top of search */
2238#define FSDIR_COLUMN_DIR      5     /* Path is relative to this directory */
2239
2240
2241/*
2242** Set the result stored by context ctx to a blob containing the
2243** contents of file zName.  Or, leave the result unchanged (NULL)
2244** if the file does not exist or is unreadable.
2245**
2246** If the file exceeds the SQLite blob size limit, through an
2247** SQLITE_TOOBIG error.
2248**
2249** Throw an SQLITE_IOERR if there are difficulties pulling the file
2250** off of disk.
2251*/
2252static void readFileContents(sqlite3_context *ctx, const char *zName){
2253  FILE *in;
2254  sqlite3_int64 nIn;
2255  void *pBuf;
2256  sqlite3 *db;
2257  int mxBlob;
2258
2259  in = fopen(zName, "rb");
2260  if( in==0 ){
2261    /* File does not exist or is unreadable. Leave the result set to NULL. */
2262    return;
2263  }
2264  fseek(in, 0, SEEK_END);
2265  nIn = ftell(in);
2266  rewind(in);
2267  db = sqlite3_context_db_handle(ctx);
2268  mxBlob = sqlite3_limit(db, SQLITE_LIMIT_LENGTH, -1);
2269  if( nIn>mxBlob ){
2270    sqlite3_result_error_code(ctx, SQLITE_TOOBIG);
2271    fclose(in);
2272    return;
2273  }
2274  pBuf = sqlite3_malloc64( nIn ? nIn : 1 );
2275  if( pBuf==0 ){
2276    sqlite3_result_error_nomem(ctx);
2277    fclose(in);
2278    return;
2279  }
2280  if( nIn==(sqlite3_int64)fread(pBuf, 1, (size_t)nIn, in) ){
2281    sqlite3_result_blob64(ctx, pBuf, nIn, sqlite3_free);
2282  }else{
2283    sqlite3_result_error_code(ctx, SQLITE_IOERR);
2284    sqlite3_free(pBuf);
2285  }
2286  fclose(in);
2287}
2288
2289/*
2290** Implementation of the "readfile(X)" SQL function.  The entire content
2291** of the file named X is read and returned as a BLOB.  NULL is returned
2292** if the file does not exist or is unreadable.
2293*/
2294static void readfileFunc(
2295  sqlite3_context *context,
2296  int argc,
2297  sqlite3_value **argv
2298){
2299  const char *zName;
2300  (void)(argc);  /* Unused parameter */
2301  zName = (const char*)sqlite3_value_text(argv[0]);
2302  if( zName==0 ) return;
2303  readFileContents(context, zName);
2304}
2305
2306/*
2307** Set the error message contained in context ctx to the results of
2308** vprintf(zFmt, ...).
2309*/
2310static void ctxErrorMsg(sqlite3_context *ctx, const char *zFmt, ...){
2311  char *zMsg = 0;
2312  va_list ap;
2313  va_start(ap, zFmt);
2314  zMsg = sqlite3_vmprintf(zFmt, ap);
2315  sqlite3_result_error(ctx, zMsg, -1);
2316  sqlite3_free(zMsg);
2317  va_end(ap);
2318}
2319
2320#if defined(_WIN32)
2321/*
2322** This function is designed to convert a Win32 FILETIME structure into the
2323** number of seconds since the Unix Epoch (1970-01-01 00:00:00 UTC).
2324*/
2325static sqlite3_uint64 fileTimeToUnixTime(
2326  LPFILETIME pFileTime
2327){
2328  SYSTEMTIME epochSystemTime;
2329  ULARGE_INTEGER epochIntervals;
2330  FILETIME epochFileTime;
2331  ULARGE_INTEGER fileIntervals;
2332
2333  memset(&epochSystemTime, 0, sizeof(SYSTEMTIME));
2334  epochSystemTime.wYear = 1970;
2335  epochSystemTime.wMonth = 1;
2336  epochSystemTime.wDay = 1;
2337  SystemTimeToFileTime(&epochSystemTime, &epochFileTime);
2338  epochIntervals.LowPart = epochFileTime.dwLowDateTime;
2339  epochIntervals.HighPart = epochFileTime.dwHighDateTime;
2340
2341  fileIntervals.LowPart = pFileTime->dwLowDateTime;
2342  fileIntervals.HighPart = pFileTime->dwHighDateTime;
2343
2344  return (fileIntervals.QuadPart - epochIntervals.QuadPart) / 10000000;
2345}
2346
2347/*
2348** This function attempts to normalize the time values found in the stat()
2349** buffer to UTC.  This is necessary on Win32, where the runtime library
2350** appears to return these values as local times.
2351*/
2352static void statTimesToUtc(
2353  const char *zPath,
2354  struct stat *pStatBuf
2355){
2356  HANDLE hFindFile;
2357  WIN32_FIND_DATAW fd;
2358  LPWSTR zUnicodeName;
2359  extern LPWSTR sqlite3_win32_utf8_to_unicode(const char*);
2360  zUnicodeName = sqlite3_win32_utf8_to_unicode(zPath);
2361  if( zUnicodeName ){
2362    memset(&fd, 0, sizeof(WIN32_FIND_DATAW));
2363    hFindFile = FindFirstFileW(zUnicodeName, &fd);
2364    if( hFindFile!=NULL ){
2365      pStatBuf->st_ctime = (time_t)fileTimeToUnixTime(&fd.ftCreationTime);
2366      pStatBuf->st_atime = (time_t)fileTimeToUnixTime(&fd.ftLastAccessTime);
2367      pStatBuf->st_mtime = (time_t)fileTimeToUnixTime(&fd.ftLastWriteTime);
2368      FindClose(hFindFile);
2369    }
2370    sqlite3_free(zUnicodeName);
2371  }
2372}
2373#endif
2374
2375/*
2376** This function is used in place of stat().  On Windows, special handling
2377** is required in order for the included time to be returned as UTC.  On all
2378** other systems, this function simply calls stat().
2379*/
2380static int fileStat(
2381  const char *zPath,
2382  struct stat *pStatBuf
2383){
2384#if defined(_WIN32)
2385  int rc = stat(zPath, pStatBuf);
2386  if( rc==0 ) statTimesToUtc(zPath, pStatBuf);
2387  return rc;
2388#else
2389  return stat(zPath, pStatBuf);
2390#endif
2391}
2392
2393/*
2394** This function is used in place of lstat().  On Windows, special handling
2395** is required in order for the included time to be returned as UTC.  On all
2396** other systems, this function simply calls lstat().
2397*/
2398static int fileLinkStat(
2399  const char *zPath,
2400  struct stat *pStatBuf
2401){
2402#if defined(_WIN32)
2403  int rc = lstat(zPath, pStatBuf);
2404  if( rc==0 ) statTimesToUtc(zPath, pStatBuf);
2405  return rc;
2406#else
2407  return lstat(zPath, pStatBuf);
2408#endif
2409}
2410
2411/*
2412** Argument zFile is the name of a file that will be created and/or written
2413** by SQL function writefile(). This function ensures that the directory
2414** zFile will be written to exists, creating it if required. The permissions
2415** for any path components created by this function are set in accordance
2416** with the current umask.
2417**
2418** If an OOM condition is encountered, SQLITE_NOMEM is returned. Otherwise,
2419** SQLITE_OK is returned if the directory is successfully created, or
2420** SQLITE_ERROR otherwise.
2421*/
2422static int makeDirectory(
2423  const char *zFile
2424){
2425  char *zCopy = sqlite3_mprintf("%s", zFile);
2426  int rc = SQLITE_OK;
2427
2428  if( zCopy==0 ){
2429    rc = SQLITE_NOMEM;
2430  }else{
2431    int nCopy = (int)strlen(zCopy);
2432    int i = 1;
2433
2434    while( rc==SQLITE_OK ){
2435      struct stat sStat;
2436      int rc2;
2437
2438      for(; zCopy[i]!='/' && i<nCopy; i++);
2439      if( i==nCopy ) break;
2440      zCopy[i] = '\0';
2441
2442      rc2 = fileStat(zCopy, &sStat);
2443      if( rc2!=0 ){
2444        if( mkdir(zCopy, 0777) ) rc = SQLITE_ERROR;
2445      }else{
2446        if( !S_ISDIR(sStat.st_mode) ) rc = SQLITE_ERROR;
2447      }
2448      zCopy[i] = '/';
2449      i++;
2450    }
2451
2452    sqlite3_free(zCopy);
2453  }
2454
2455  return rc;
2456}
2457
2458/*
2459** This function does the work for the writefile() UDF. Refer to
2460** header comments at the top of this file for details.
2461*/
2462static int writeFile(
2463  sqlite3_context *pCtx,          /* Context to return bytes written in */
2464  const char *zFile,              /* File to write */
2465  sqlite3_value *pData,           /* Data to write */
2466  mode_t mode,                    /* MODE parameter passed to writefile() */
2467  sqlite3_int64 mtime             /* MTIME parameter (or -1 to not set time) */
2468){
2469#if !defined(_WIN32) && !defined(WIN32)
2470  if( S_ISLNK(mode) ){
2471    const char *zTo = (const char*)sqlite3_value_text(pData);
2472    if( symlink(zTo, zFile)<0 ) return 1;
2473  }else
2474#endif
2475  {
2476    if( S_ISDIR(mode) ){
2477      if( mkdir(zFile, mode) ){
2478        /* The mkdir() call to create the directory failed. This might not
2479        ** be an error though - if there is already a directory at the same
2480        ** path and either the permissions already match or can be changed
2481        ** to do so using chmod(), it is not an error.  */
2482        struct stat sStat;
2483        if( errno!=EEXIST
2484         || 0!=fileStat(zFile, &sStat)
2485         || !S_ISDIR(sStat.st_mode)
2486         || ((sStat.st_mode&0777)!=(mode&0777) && 0!=chmod(zFile, mode&0777))
2487        ){
2488          return 1;
2489        }
2490      }
2491    }else{
2492      sqlite3_int64 nWrite = 0;
2493      const char *z;
2494      int rc = 0;
2495      FILE *out = fopen(zFile, "wb");
2496      if( out==0 ) return 1;
2497      z = (const char*)sqlite3_value_blob(pData);
2498      if( z ){
2499        sqlite3_int64 n = fwrite(z, 1, sqlite3_value_bytes(pData), out);
2500        nWrite = sqlite3_value_bytes(pData);
2501        if( nWrite!=n ){
2502          rc = 1;
2503        }
2504      }
2505      fclose(out);
2506      if( rc==0 && mode && chmod(zFile, mode & 0777) ){
2507        rc = 1;
2508      }
2509      if( rc ) return 2;
2510      sqlite3_result_int64(pCtx, nWrite);
2511    }
2512  }
2513
2514  if( mtime>=0 ){
2515#if defined(_WIN32)
2516#if !SQLITE_OS_WINRT
2517    /* Windows */
2518    FILETIME lastAccess;
2519    FILETIME lastWrite;
2520    SYSTEMTIME currentTime;
2521    LONGLONG intervals;
2522    HANDLE hFile;
2523    LPWSTR zUnicodeName;
2524    extern LPWSTR sqlite3_win32_utf8_to_unicode(const char*);
2525
2526    GetSystemTime(&currentTime);
2527    SystemTimeToFileTime(&currentTime, &lastAccess);
2528    intervals = Int32x32To64(mtime, 10000000) + 116444736000000000;
2529    lastWrite.dwLowDateTime = (DWORD)intervals;
2530    lastWrite.dwHighDateTime = intervals >> 32;
2531    zUnicodeName = sqlite3_win32_utf8_to_unicode(zFile);
2532    if( zUnicodeName==0 ){
2533      return 1;
2534    }
2535    hFile = CreateFileW(
2536      zUnicodeName, FILE_WRITE_ATTRIBUTES, 0, NULL, OPEN_EXISTING,
2537      FILE_FLAG_BACKUP_SEMANTICS, NULL
2538    );
2539    sqlite3_free(zUnicodeName);
2540    if( hFile!=INVALID_HANDLE_VALUE ){
2541      BOOL bResult = SetFileTime(hFile, NULL, &lastAccess, &lastWrite);
2542      CloseHandle(hFile);
2543      return !bResult;
2544    }else{
2545      return 1;
2546    }
2547#endif
2548#elif defined(AT_FDCWD) && 0 /* utimensat() is not universally available */
2549    /* Recent unix */
2550    struct timespec times[2];
2551    times[0].tv_nsec = times[1].tv_nsec = 0;
2552    times[0].tv_sec = time(0);
2553    times[1].tv_sec = mtime;
2554    if( utimensat(AT_FDCWD, zFile, times, AT_SYMLINK_NOFOLLOW) ){
2555      return 1;
2556    }
2557#else
2558    /* Legacy unix */
2559    struct timeval times[2];
2560    times[0].tv_usec = times[1].tv_usec = 0;
2561    times[0].tv_sec = time(0);
2562    times[1].tv_sec = mtime;
2563    if( utimes(zFile, times) ){
2564      return 1;
2565    }
2566#endif
2567  }
2568
2569  return 0;
2570}
2571
2572/*
2573** Implementation of the "writefile(W,X[,Y[,Z]]])" SQL function.
2574** Refer to header comments at the top of this file for details.
2575*/
2576static void writefileFunc(
2577  sqlite3_context *context,
2578  int argc,
2579  sqlite3_value **argv
2580){
2581  const char *zFile;
2582  mode_t mode = 0;
2583  int res;
2584  sqlite3_int64 mtime = -1;
2585
2586  if( argc<2 || argc>4 ){
2587    sqlite3_result_error(context,
2588        "wrong number of arguments to function writefile()", -1
2589    );
2590    return;
2591  }
2592
2593  zFile = (const char*)sqlite3_value_text(argv[0]);
2594  if( zFile==0 ) return;
2595  if( argc>=3 ){
2596    mode = (mode_t)sqlite3_value_int(argv[2]);
2597  }
2598  if( argc==4 ){
2599    mtime = sqlite3_value_int64(argv[3]);
2600  }
2601
2602  res = writeFile(context, zFile, argv[1], mode, mtime);
2603  if( res==1 && errno==ENOENT ){
2604    if( makeDirectory(zFile)==SQLITE_OK ){
2605      res = writeFile(context, zFile, argv[1], mode, mtime);
2606    }
2607  }
2608
2609  if( argc>2 && res!=0 ){
2610    if( S_ISLNK(mode) ){
2611      ctxErrorMsg(context, "failed to create symlink: %s", zFile);
2612    }else if( S_ISDIR(mode) ){
2613      ctxErrorMsg(context, "failed to create directory: %s", zFile);
2614    }else{
2615      ctxErrorMsg(context, "failed to write file: %s", zFile);
2616    }
2617  }
2618}
2619
2620/*
2621** SQL function:   lsmode(MODE)
2622**
2623** Given a numberic st_mode from stat(), convert it into a human-readable
2624** text string in the style of "ls -l".
2625*/
2626static void lsModeFunc(
2627  sqlite3_context *context,
2628  int argc,
2629  sqlite3_value **argv
2630){
2631  int i;
2632  int iMode = sqlite3_value_int(argv[0]);
2633  char z[16];
2634  (void)argc;
2635  if( S_ISLNK(iMode) ){
2636    z[0] = 'l';
2637  }else if( S_ISREG(iMode) ){
2638    z[0] = '-';
2639  }else if( S_ISDIR(iMode) ){
2640    z[0] = 'd';
2641  }else{
2642    z[0] = '?';
2643  }
2644  for(i=0; i<3; i++){
2645    int m = (iMode >> ((2-i)*3));
2646    char *a = &z[1 + i*3];
2647    a[0] = (m & 0x4) ? 'r' : '-';
2648    a[1] = (m & 0x2) ? 'w' : '-';
2649    a[2] = (m & 0x1) ? 'x' : '-';
2650  }
2651  z[10] = '\0';
2652  sqlite3_result_text(context, z, -1, SQLITE_TRANSIENT);
2653}
2654
2655#ifndef SQLITE_OMIT_VIRTUALTABLE
2656
2657/*
2658** Cursor type for recursively iterating through a directory structure.
2659*/
2660typedef struct fsdir_cursor fsdir_cursor;
2661typedef struct FsdirLevel FsdirLevel;
2662
2663struct FsdirLevel {
2664  DIR *pDir;                 /* From opendir() */
2665  char *zDir;                /* Name of directory (nul-terminated) */
2666};
2667
2668struct fsdir_cursor {
2669  sqlite3_vtab_cursor base;  /* Base class - must be first */
2670
2671  int nLvl;                  /* Number of entries in aLvl[] array */
2672  int iLvl;                  /* Index of current entry */
2673  FsdirLevel *aLvl;          /* Hierarchy of directories being traversed */
2674
2675  const char *zBase;
2676  int nBase;
2677
2678  struct stat sStat;         /* Current lstat() results */
2679  char *zPath;               /* Path to current entry */
2680  sqlite3_int64 iRowid;      /* Current rowid */
2681};
2682
2683typedef struct fsdir_tab fsdir_tab;
2684struct fsdir_tab {
2685  sqlite3_vtab base;         /* Base class - must be first */
2686};
2687
2688/*
2689** Construct a new fsdir virtual table object.
2690*/
2691static int fsdirConnect(
2692  sqlite3 *db,
2693  void *pAux,
2694  int argc, const char *const*argv,
2695  sqlite3_vtab **ppVtab,
2696  char **pzErr
2697){
2698  fsdir_tab *pNew = 0;
2699  int rc;
2700  (void)pAux;
2701  (void)argc;
2702  (void)argv;
2703  (void)pzErr;
2704  rc = sqlite3_declare_vtab(db, "CREATE TABLE x" FSDIR_SCHEMA);
2705  if( rc==SQLITE_OK ){
2706    pNew = (fsdir_tab*)sqlite3_malloc( sizeof(*pNew) );
2707    if( pNew==0 ) return SQLITE_NOMEM;
2708    memset(pNew, 0, sizeof(*pNew));
2709    sqlite3_vtab_config(db, SQLITE_VTAB_DIRECTONLY);
2710  }
2711  *ppVtab = (sqlite3_vtab*)pNew;
2712  return rc;
2713}
2714
2715/*
2716** This method is the destructor for fsdir vtab objects.
2717*/
2718static int fsdirDisconnect(sqlite3_vtab *pVtab){
2719  sqlite3_free(pVtab);
2720  return SQLITE_OK;
2721}
2722
2723/*
2724** Constructor for a new fsdir_cursor object.
2725*/
2726static int fsdirOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){
2727  fsdir_cursor *pCur;
2728  (void)p;
2729  pCur = sqlite3_malloc( sizeof(*pCur) );
2730  if( pCur==0 ) return SQLITE_NOMEM;
2731  memset(pCur, 0, sizeof(*pCur));
2732  pCur->iLvl = -1;
2733  *ppCursor = &pCur->base;
2734  return SQLITE_OK;
2735}
2736
2737/*
2738** Reset a cursor back to the state it was in when first returned
2739** by fsdirOpen().
2740*/
2741static void fsdirResetCursor(fsdir_cursor *pCur){
2742  int i;
2743  for(i=0; i<=pCur->iLvl; i++){
2744    FsdirLevel *pLvl = &pCur->aLvl[i];
2745    if( pLvl->pDir ) closedir(pLvl->pDir);
2746    sqlite3_free(pLvl->zDir);
2747  }
2748  sqlite3_free(pCur->zPath);
2749  sqlite3_free(pCur->aLvl);
2750  pCur->aLvl = 0;
2751  pCur->zPath = 0;
2752  pCur->zBase = 0;
2753  pCur->nBase = 0;
2754  pCur->nLvl = 0;
2755  pCur->iLvl = -1;
2756  pCur->iRowid = 1;
2757}
2758
2759/*
2760** Destructor for an fsdir_cursor.
2761*/
2762static int fsdirClose(sqlite3_vtab_cursor *cur){
2763  fsdir_cursor *pCur = (fsdir_cursor*)cur;
2764
2765  fsdirResetCursor(pCur);
2766  sqlite3_free(pCur);
2767  return SQLITE_OK;
2768}
2769
2770/*
2771** Set the error message for the virtual table associated with cursor
2772** pCur to the results of vprintf(zFmt, ...).
2773*/
2774static void fsdirSetErrmsg(fsdir_cursor *pCur, const char *zFmt, ...){
2775  va_list ap;
2776  va_start(ap, zFmt);
2777  pCur->base.pVtab->zErrMsg = sqlite3_vmprintf(zFmt, ap);
2778  va_end(ap);
2779}
2780
2781
2782/*
2783** Advance an fsdir_cursor to its next row of output.
2784*/
2785static int fsdirNext(sqlite3_vtab_cursor *cur){
2786  fsdir_cursor *pCur = (fsdir_cursor*)cur;
2787  mode_t m = pCur->sStat.st_mode;
2788
2789  pCur->iRowid++;
2790  if( S_ISDIR(m) ){
2791    /* Descend into this directory */
2792    int iNew = pCur->iLvl + 1;
2793    FsdirLevel *pLvl;
2794    if( iNew>=pCur->nLvl ){
2795      int nNew = iNew+1;
2796      sqlite3_int64 nByte = nNew*sizeof(FsdirLevel);
2797      FsdirLevel *aNew = (FsdirLevel*)sqlite3_realloc64(pCur->aLvl, nByte);
2798      if( aNew==0 ) return SQLITE_NOMEM;
2799      memset(&aNew[pCur->nLvl], 0, sizeof(FsdirLevel)*(nNew-pCur->nLvl));
2800      pCur->aLvl = aNew;
2801      pCur->nLvl = nNew;
2802    }
2803    pCur->iLvl = iNew;
2804    pLvl = &pCur->aLvl[iNew];
2805
2806    pLvl->zDir = pCur->zPath;
2807    pCur->zPath = 0;
2808    pLvl->pDir = opendir(pLvl->zDir);
2809    if( pLvl->pDir==0 ){
2810      fsdirSetErrmsg(pCur, "cannot read directory: %s", pCur->zPath);
2811      return SQLITE_ERROR;
2812    }
2813  }
2814
2815  while( pCur->iLvl>=0 ){
2816    FsdirLevel *pLvl = &pCur->aLvl[pCur->iLvl];
2817    struct dirent *pEntry = readdir(pLvl->pDir);
2818    if( pEntry ){
2819      if( pEntry->d_name[0]=='.' ){
2820       if( pEntry->d_name[1]=='.' && pEntry->d_name[2]=='\0' ) continue;
2821       if( pEntry->d_name[1]=='\0' ) continue;
2822      }
2823      sqlite3_free(pCur->zPath);
2824      pCur->zPath = sqlite3_mprintf("%s/%s", pLvl->zDir, pEntry->d_name);
2825      if( pCur->zPath==0 ) return SQLITE_NOMEM;
2826      if( fileLinkStat(pCur->zPath, &pCur->sStat) ){
2827        fsdirSetErrmsg(pCur, "cannot stat file: %s", pCur->zPath);
2828        return SQLITE_ERROR;
2829      }
2830      return SQLITE_OK;
2831    }
2832    closedir(pLvl->pDir);
2833    sqlite3_free(pLvl->zDir);
2834    pLvl->pDir = 0;
2835    pLvl->zDir = 0;
2836    pCur->iLvl--;
2837  }
2838
2839  /* EOF */
2840  sqlite3_free(pCur->zPath);
2841  pCur->zPath = 0;
2842  return SQLITE_OK;
2843}
2844
2845/*
2846** Return values of columns for the row at which the series_cursor
2847** is currently pointing.
2848*/
2849static int fsdirColumn(
2850  sqlite3_vtab_cursor *cur,   /* The cursor */
2851  sqlite3_context *ctx,       /* First argument to sqlite3_result_...() */
2852  int i                       /* Which column to return */
2853){
2854  fsdir_cursor *pCur = (fsdir_cursor*)cur;
2855  switch( i ){
2856    case FSDIR_COLUMN_NAME: {
2857      sqlite3_result_text(ctx, &pCur->zPath[pCur->nBase], -1, SQLITE_TRANSIENT);
2858      break;
2859    }
2860
2861    case FSDIR_COLUMN_MODE:
2862      sqlite3_result_int64(ctx, pCur->sStat.st_mode);
2863      break;
2864
2865    case FSDIR_COLUMN_MTIME:
2866      sqlite3_result_int64(ctx, pCur->sStat.st_mtime);
2867      break;
2868
2869    case FSDIR_COLUMN_DATA: {
2870      mode_t m = pCur->sStat.st_mode;
2871      if( S_ISDIR(m) ){
2872        sqlite3_result_null(ctx);
2873#if !defined(_WIN32) && !defined(WIN32)
2874      }else if( S_ISLNK(m) ){
2875        char aStatic[64];
2876        char *aBuf = aStatic;
2877        sqlite3_int64 nBuf = 64;
2878        int n;
2879
2880        while( 1 ){
2881          n = readlink(pCur->zPath, aBuf, nBuf);
2882          if( n<nBuf ) break;
2883          if( aBuf!=aStatic ) sqlite3_free(aBuf);
2884          nBuf = nBuf*2;
2885          aBuf = sqlite3_malloc64(nBuf);
2886          if( aBuf==0 ){
2887            sqlite3_result_error_nomem(ctx);
2888            return SQLITE_NOMEM;
2889          }
2890        }
2891
2892        sqlite3_result_text(ctx, aBuf, n, SQLITE_TRANSIENT);
2893        if( aBuf!=aStatic ) sqlite3_free(aBuf);
2894#endif
2895      }else{
2896        readFileContents(ctx, pCur->zPath);
2897      }
2898    }
2899    case FSDIR_COLUMN_PATH:
2900    default: {
2901      /* The FSDIR_COLUMN_PATH and FSDIR_COLUMN_DIR are input parameters.
2902      ** always return their values as NULL */
2903      break;
2904    }
2905  }
2906  return SQLITE_OK;
2907}
2908
2909/*
2910** Return the rowid for the current row. In this implementation, the
2911** first row returned is assigned rowid value 1, and each subsequent
2912** row a value 1 more than that of the previous.
2913*/
2914static int fsdirRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
2915  fsdir_cursor *pCur = (fsdir_cursor*)cur;
2916  *pRowid = pCur->iRowid;
2917  return SQLITE_OK;
2918}
2919
2920/*
2921** Return TRUE if the cursor has been moved off of the last
2922** row of output.
2923*/
2924static int fsdirEof(sqlite3_vtab_cursor *cur){
2925  fsdir_cursor *pCur = (fsdir_cursor*)cur;
2926  return (pCur->zPath==0);
2927}
2928
2929/*
2930** xFilter callback.
2931**
2932** idxNum==1   PATH parameter only
2933** idxNum==2   Both PATH and DIR supplied
2934*/
2935static int fsdirFilter(
2936  sqlite3_vtab_cursor *cur,
2937  int idxNum, const char *idxStr,
2938  int argc, sqlite3_value **argv
2939){
2940  const char *zDir = 0;
2941  fsdir_cursor *pCur = (fsdir_cursor*)cur;
2942  (void)idxStr;
2943  fsdirResetCursor(pCur);
2944
2945  if( idxNum==0 ){
2946    fsdirSetErrmsg(pCur, "table function fsdir requires an argument");
2947    return SQLITE_ERROR;
2948  }
2949
2950  assert( argc==idxNum && (argc==1 || argc==2) );
2951  zDir = (const char*)sqlite3_value_text(argv[0]);
2952  if( zDir==0 ){
2953    fsdirSetErrmsg(pCur, "table function fsdir requires a non-NULL argument");
2954    return SQLITE_ERROR;
2955  }
2956  if( argc==2 ){
2957    pCur->zBase = (const char*)sqlite3_value_text(argv[1]);
2958  }
2959  if( pCur->zBase ){
2960    pCur->nBase = (int)strlen(pCur->zBase)+1;
2961    pCur->zPath = sqlite3_mprintf("%s/%s", pCur->zBase, zDir);
2962  }else{
2963    pCur->zPath = sqlite3_mprintf("%s", zDir);
2964  }
2965
2966  if( pCur->zPath==0 ){
2967    return SQLITE_NOMEM;
2968  }
2969  if( fileLinkStat(pCur->zPath, &pCur->sStat) ){
2970    fsdirSetErrmsg(pCur, "cannot stat file: %s", pCur->zPath);
2971    return SQLITE_ERROR;
2972  }
2973
2974  return SQLITE_OK;
2975}
2976
2977/*
2978** SQLite will invoke this method one or more times while planning a query
2979** that uses the generate_series virtual table.  This routine needs to create
2980** a query plan for each invocation and compute an estimated cost for that
2981** plan.
2982**
2983** In this implementation idxNum is used to represent the
2984** query plan.  idxStr is unused.
2985**
2986** The query plan is represented by values of idxNum:
2987**
2988**  (1)  The path value is supplied by argv[0]
2989**  (2)  Path is in argv[0] and dir is in argv[1]
2990*/
2991static int fsdirBestIndex(
2992  sqlite3_vtab *tab,
2993  sqlite3_index_info *pIdxInfo
2994){
2995  int i;                 /* Loop over constraints */
2996  int idxPath = -1;      /* Index in pIdxInfo->aConstraint of PATH= */
2997  int idxDir = -1;       /* Index in pIdxInfo->aConstraint of DIR= */
2998  int seenPath = 0;      /* True if an unusable PATH= constraint is seen */
2999  int seenDir = 0;       /* True if an unusable DIR= constraint is seen */
3000  const struct sqlite3_index_constraint *pConstraint;
3001
3002  (void)tab;
3003  pConstraint = pIdxInfo->aConstraint;
3004  for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){
3005    if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue;
3006    switch( pConstraint->iColumn ){
3007      case FSDIR_COLUMN_PATH: {
3008        if( pConstraint->usable ){
3009          idxPath = i;
3010          seenPath = 0;
3011        }else if( idxPath<0 ){
3012          seenPath = 1;
3013        }
3014        break;
3015      }
3016      case FSDIR_COLUMN_DIR: {
3017        if( pConstraint->usable ){
3018          idxDir = i;
3019          seenDir = 0;
3020        }else if( idxDir<0 ){
3021          seenDir = 1;
3022        }
3023        break;
3024      }
3025    }
3026  }
3027  if( seenPath || seenDir ){
3028    /* If input parameters are unusable, disallow this plan */
3029    return SQLITE_CONSTRAINT;
3030  }
3031
3032  if( idxPath<0 ){
3033    pIdxInfo->idxNum = 0;
3034    /* The pIdxInfo->estimatedCost should have been initialized to a huge
3035    ** number.  Leave it unchanged. */
3036    pIdxInfo->estimatedRows = 0x7fffffff;
3037  }else{
3038    pIdxInfo->aConstraintUsage[idxPath].omit = 1;
3039    pIdxInfo->aConstraintUsage[idxPath].argvIndex = 1;
3040    if( idxDir>=0 ){
3041      pIdxInfo->aConstraintUsage[idxDir].omit = 1;
3042      pIdxInfo->aConstraintUsage[idxDir].argvIndex = 2;
3043      pIdxInfo->idxNum = 2;
3044      pIdxInfo->estimatedCost = 10.0;
3045    }else{
3046      pIdxInfo->idxNum = 1;
3047      pIdxInfo->estimatedCost = 100.0;
3048    }
3049  }
3050
3051  return SQLITE_OK;
3052}
3053
3054/*
3055** Register the "fsdir" virtual table.
3056*/
3057static int fsdirRegister(sqlite3 *db){
3058  static sqlite3_module fsdirModule = {
3059    0,                         /* iVersion */
3060    0,                         /* xCreate */
3061    fsdirConnect,              /* xConnect */
3062    fsdirBestIndex,            /* xBestIndex */
3063    fsdirDisconnect,           /* xDisconnect */
3064    0,                         /* xDestroy */
3065    fsdirOpen,                 /* xOpen - open a cursor */
3066    fsdirClose,                /* xClose - close a cursor */
3067    fsdirFilter,               /* xFilter - configure scan constraints */
3068    fsdirNext,                 /* xNext - advance a cursor */
3069    fsdirEof,                  /* xEof - check for end of scan */
3070    fsdirColumn,               /* xColumn - read data */
3071    fsdirRowid,                /* xRowid - read data */
3072    0,                         /* xUpdate */
3073    0,                         /* xBegin */
3074    0,                         /* xSync */
3075    0,                         /* xCommit */
3076    0,                         /* xRollback */
3077    0,                         /* xFindMethod */
3078    0,                         /* xRename */
3079    0,                         /* xSavepoint */
3080    0,                         /* xRelease */
3081    0,                         /* xRollbackTo */
3082    0,                         /* xShadowName */
3083  };
3084
3085  int rc = sqlite3_create_module(db, "fsdir", &fsdirModule, 0);
3086  return rc;
3087}
3088#else         /* SQLITE_OMIT_VIRTUALTABLE */
3089# define fsdirRegister(x) SQLITE_OK
3090#endif
3091
3092#ifdef _WIN32
3093
3094#endif
3095int sqlite3_fileio_init(
3096  sqlite3 *db,
3097  char **pzErrMsg,
3098  const sqlite3_api_routines *pApi
3099){
3100  int rc = SQLITE_OK;
3101  SQLITE_EXTENSION_INIT2(pApi);
3102  (void)pzErrMsg;  /* Unused parameter */
3103  rc = sqlite3_create_function(db, "readfile", 1,
3104                               SQLITE_UTF8|SQLITE_DIRECTONLY, 0,
3105                               readfileFunc, 0, 0);
3106  if( rc==SQLITE_OK ){
3107    rc = sqlite3_create_function(db, "writefile", -1,
3108                                 SQLITE_UTF8|SQLITE_DIRECTONLY, 0,
3109                                 writefileFunc, 0, 0);
3110  }
3111  if( rc==SQLITE_OK ){
3112    rc = sqlite3_create_function(db, "lsmode", 1, SQLITE_UTF8, 0,
3113                                 lsModeFunc, 0, 0);
3114  }
3115  if( rc==SQLITE_OK ){
3116    rc = fsdirRegister(db);
3117  }
3118  return rc;
3119}
3120
3121/************************* End ../ext/misc/fileio.c ********************/
3122/************************* Begin ../ext/misc/completion.c ******************/
3123/*
3124** 2017-07-10
3125**
3126** The author disclaims copyright to this source code.  In place of
3127** a legal notice, here is a blessing:
3128**
3129**    May you do good and not evil.
3130**    May you find forgiveness for yourself and forgive others.
3131**    May you share freely, never taking more than you give.
3132**
3133*************************************************************************
3134**
3135** This file implements an eponymous virtual table that returns suggested
3136** completions for a partial SQL input.
3137**
3138** Suggested usage:
3139**
3140**     SELECT DISTINCT candidate COLLATE nocase
3141**       FROM completion($prefix,$wholeline)
3142**      ORDER BY 1;
3143**
3144** The two query parameters are optional.  $prefix is the text of the
3145** current word being typed and that is to be completed.  $wholeline is
3146** the complete input line, used for context.
3147**
3148** The raw completion() table might return the same candidate multiple
3149** times, for example if the same column name is used to two or more
3150** tables.  And the candidates are returned in an arbitrary order.  Hence,
3151** the DISTINCT and ORDER BY are recommended.
3152**
3153** This virtual table operates at the speed of human typing, and so there
3154** is no attempt to make it fast.  Even a slow implementation will be much
3155** faster than any human can type.
3156**
3157*/
3158/* #include "sqlite3ext.h" */
3159SQLITE_EXTENSION_INIT1
3160#include <assert.h>
3161#include <string.h>
3162#include <ctype.h>
3163
3164#ifndef SQLITE_OMIT_VIRTUALTABLE
3165
3166/* completion_vtab is a subclass of sqlite3_vtab which will
3167** serve as the underlying representation of a completion virtual table
3168*/
3169typedef struct completion_vtab completion_vtab;
3170struct completion_vtab {
3171  sqlite3_vtab base;  /* Base class - must be first */
3172  sqlite3 *db;        /* Database connection for this completion vtab */
3173};
3174
3175/* completion_cursor is a subclass of sqlite3_vtab_cursor which will
3176** serve as the underlying representation of a cursor that scans
3177** over rows of the result
3178*/
3179typedef struct completion_cursor completion_cursor;
3180struct completion_cursor {
3181  sqlite3_vtab_cursor base;  /* Base class - must be first */
3182  sqlite3 *db;               /* Database connection for this cursor */
3183  int nPrefix, nLine;        /* Number of bytes in zPrefix and zLine */
3184  char *zPrefix;             /* The prefix for the word we want to complete */
3185  char *zLine;               /* The whole that we want to complete */
3186  const char *zCurrentRow;   /* Current output row */
3187  int szRow;                 /* Length of the zCurrentRow string */
3188  sqlite3_stmt *pStmt;       /* Current statement */
3189  sqlite3_int64 iRowid;      /* The rowid */
3190  int ePhase;                /* Current phase */
3191  int j;                     /* inter-phase counter */
3192};
3193
3194/* Values for ePhase:
3195*/
3196#define COMPLETION_FIRST_PHASE   1
3197#define COMPLETION_KEYWORDS      1
3198#define COMPLETION_PRAGMAS       2
3199#define COMPLETION_FUNCTIONS     3
3200#define COMPLETION_COLLATIONS    4
3201#define COMPLETION_INDEXES       5
3202#define COMPLETION_TRIGGERS      6
3203#define COMPLETION_DATABASES     7
3204#define COMPLETION_TABLES        8    /* Also VIEWs and TRIGGERs */
3205#define COMPLETION_COLUMNS       9
3206#define COMPLETION_MODULES       10
3207#define COMPLETION_EOF           11
3208
3209/*
3210** The completionConnect() method is invoked to create a new
3211** completion_vtab that describes the completion virtual table.
3212**
3213** Think of this routine as the constructor for completion_vtab objects.
3214**
3215** All this routine needs to do is:
3216**
3217**    (1) Allocate the completion_vtab object and initialize all fields.
3218**
3219**    (2) Tell SQLite (via the sqlite3_declare_vtab() interface) what the
3220**        result set of queries against completion will look like.
3221*/
3222static int completionConnect(
3223  sqlite3 *db,
3224  void *pAux,
3225  int argc, const char *const*argv,
3226  sqlite3_vtab **ppVtab,
3227  char **pzErr
3228){
3229  completion_vtab *pNew;
3230  int rc;
3231
3232  (void)(pAux);    /* Unused parameter */
3233  (void)(argc);    /* Unused parameter */
3234  (void)(argv);    /* Unused parameter */
3235  (void)(pzErr);   /* Unused parameter */
3236
3237/* Column numbers */
3238#define COMPLETION_COLUMN_CANDIDATE 0  /* Suggested completion of the input */
3239#define COMPLETION_COLUMN_PREFIX    1  /* Prefix of the word to be completed */
3240#define COMPLETION_COLUMN_WHOLELINE 2  /* Entire line seen so far */
3241#define COMPLETION_COLUMN_PHASE     3  /* ePhase - used for debugging only */
3242
3243  sqlite3_vtab_config(db, SQLITE_VTAB_INNOCUOUS);
3244  rc = sqlite3_declare_vtab(db,
3245      "CREATE TABLE x("
3246      "  candidate TEXT,"
3247      "  prefix TEXT HIDDEN,"
3248      "  wholeline TEXT HIDDEN,"
3249      "  phase INT HIDDEN"        /* Used for debugging only */
3250      ")");
3251  if( rc==SQLITE_OK ){
3252    pNew = sqlite3_malloc( sizeof(*pNew) );
3253    *ppVtab = (sqlite3_vtab*)pNew;
3254    if( pNew==0 ) return SQLITE_NOMEM;
3255    memset(pNew, 0, sizeof(*pNew));
3256    pNew->db = db;
3257  }
3258  return rc;
3259}
3260
3261/*
3262** This method is the destructor for completion_cursor objects.
3263*/
3264static int completionDisconnect(sqlite3_vtab *pVtab){
3265  sqlite3_free(pVtab);
3266  return SQLITE_OK;
3267}
3268
3269/*
3270** Constructor for a new completion_cursor object.
3271*/
3272static int completionOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){
3273  completion_cursor *pCur;
3274  pCur = sqlite3_malloc( sizeof(*pCur) );
3275  if( pCur==0 ) return SQLITE_NOMEM;
3276  memset(pCur, 0, sizeof(*pCur));
3277  pCur->db = ((completion_vtab*)p)->db;
3278  *ppCursor = &pCur->base;
3279  return SQLITE_OK;
3280}
3281
3282/*
3283** Reset the completion_cursor.
3284*/
3285static void completionCursorReset(completion_cursor *pCur){
3286  sqlite3_free(pCur->zPrefix);   pCur->zPrefix = 0;  pCur->nPrefix = 0;
3287  sqlite3_free(pCur->zLine);     pCur->zLine = 0;    pCur->nLine = 0;
3288  sqlite3_finalize(pCur->pStmt); pCur->pStmt = 0;
3289  pCur->j = 0;
3290}
3291
3292/*
3293** Destructor for a completion_cursor.
3294*/
3295static int completionClose(sqlite3_vtab_cursor *cur){
3296  completionCursorReset((completion_cursor*)cur);
3297  sqlite3_free(cur);
3298  return SQLITE_OK;
3299}
3300
3301/*
3302** Advance a completion_cursor to its next row of output.
3303**
3304** The ->ePhase, ->j, and ->pStmt fields of the completion_cursor object
3305** record the current state of the scan.  This routine sets ->zCurrentRow
3306** to the current row of output and then returns.  If no more rows remain,
3307** then ->ePhase is set to COMPLETION_EOF which will signal the virtual
3308** table that has reached the end of its scan.
3309**
3310** The current implementation just lists potential identifiers and
3311** keywords and filters them by zPrefix.  Future enhancements should
3312** take zLine into account to try to restrict the set of identifiers and
3313** keywords based on what would be legal at the current point of input.
3314*/
3315static int completionNext(sqlite3_vtab_cursor *cur){
3316  completion_cursor *pCur = (completion_cursor*)cur;
3317  int eNextPhase = 0;  /* Next phase to try if current phase reaches end */
3318  int iCol = -1;       /* If >=0, step pCur->pStmt and use the i-th column */
3319  pCur->iRowid++;
3320  while( pCur->ePhase!=COMPLETION_EOF ){
3321    switch( pCur->ePhase ){
3322      case COMPLETION_KEYWORDS: {
3323        if( pCur->j >= sqlite3_keyword_count() ){
3324          pCur->zCurrentRow = 0;
3325          pCur->ePhase = COMPLETION_DATABASES;
3326        }else{
3327          sqlite3_keyword_name(pCur->j++, &pCur->zCurrentRow, &pCur->szRow);
3328        }
3329        iCol = -1;
3330        break;
3331      }
3332      case COMPLETION_DATABASES: {
3333        if( pCur->pStmt==0 ){
3334          sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1,
3335                             &pCur->pStmt, 0);
3336        }
3337        iCol = 1;
3338        eNextPhase = COMPLETION_TABLES;
3339        break;
3340      }
3341      case COMPLETION_TABLES: {
3342        if( pCur->pStmt==0 ){
3343          sqlite3_stmt *pS2;
3344          char *zSql = 0;
3345          const char *zSep = "";
3346          sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1, &pS2, 0);
3347          while( sqlite3_step(pS2)==SQLITE_ROW ){
3348            const char *zDb = (const char*)sqlite3_column_text(pS2, 1);
3349            zSql = sqlite3_mprintf(
3350               "%z%s"
3351               "SELECT name FROM \"%w\".sqlite_schema",
3352               zSql, zSep, zDb
3353            );
3354            if( zSql==0 ) return SQLITE_NOMEM;
3355            zSep = " UNION ";
3356          }
3357          sqlite3_finalize(pS2);
3358          sqlite3_prepare_v2(pCur->db, zSql, -1, &pCur->pStmt, 0);
3359          sqlite3_free(zSql);
3360        }
3361        iCol = 0;
3362        eNextPhase = COMPLETION_COLUMNS;
3363        break;
3364      }
3365      case COMPLETION_COLUMNS: {
3366        if( pCur->pStmt==0 ){
3367          sqlite3_stmt *pS2;
3368          char *zSql = 0;
3369          const char *zSep = "";
3370          sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1, &pS2, 0);
3371          while( sqlite3_step(pS2)==SQLITE_ROW ){
3372            const char *zDb = (const char*)sqlite3_column_text(pS2, 1);
3373            zSql = sqlite3_mprintf(
3374               "%z%s"
3375               "SELECT pti.name FROM \"%w\".sqlite_schema AS sm"
3376                       " JOIN pragma_table_info(sm.name,%Q) AS pti"
3377               " WHERE sm.type='table'",
3378               zSql, zSep, zDb, zDb
3379            );
3380            if( zSql==0 ) return SQLITE_NOMEM;
3381            zSep = " UNION ";
3382          }
3383          sqlite3_finalize(pS2);
3384          sqlite3_prepare_v2(pCur->db, zSql, -1, &pCur->pStmt, 0);
3385          sqlite3_free(zSql);
3386        }
3387        iCol = 0;
3388        eNextPhase = COMPLETION_EOF;
3389        break;
3390      }
3391    }
3392    if( iCol<0 ){
3393      /* This case is when the phase presets zCurrentRow */
3394      if( pCur->zCurrentRow==0 ) continue;
3395    }else{
3396      if( sqlite3_step(pCur->pStmt)==SQLITE_ROW ){
3397        /* Extract the next row of content */
3398        pCur->zCurrentRow = (const char*)sqlite3_column_text(pCur->pStmt, iCol);
3399        pCur->szRow = sqlite3_column_bytes(pCur->pStmt, iCol);
3400      }else{
3401        /* When all rows are finished, advance to the next phase */
3402        sqlite3_finalize(pCur->pStmt);
3403        pCur->pStmt = 0;
3404        pCur->ePhase = eNextPhase;
3405        continue;
3406      }
3407    }
3408    if( pCur->nPrefix==0 ) break;
3409    if( pCur->nPrefix<=pCur->szRow
3410     && sqlite3_strnicmp(pCur->zPrefix, pCur->zCurrentRow, pCur->nPrefix)==0
3411    ){
3412      break;
3413    }
3414  }
3415
3416  return SQLITE_OK;
3417}
3418
3419/*
3420** Return values of columns for the row at which the completion_cursor
3421** is currently pointing.
3422*/
3423static int completionColumn(
3424  sqlite3_vtab_cursor *cur,   /* The cursor */
3425  sqlite3_context *ctx,       /* First argument to sqlite3_result_...() */
3426  int i                       /* Which column to return */
3427){
3428  completion_cursor *pCur = (completion_cursor*)cur;
3429  switch( i ){
3430    case COMPLETION_COLUMN_CANDIDATE: {
3431      sqlite3_result_text(ctx, pCur->zCurrentRow, pCur->szRow,SQLITE_TRANSIENT);
3432      break;
3433    }
3434    case COMPLETION_COLUMN_PREFIX: {
3435      sqlite3_result_text(ctx, pCur->zPrefix, -1, SQLITE_TRANSIENT);
3436      break;
3437    }
3438    case COMPLETION_COLUMN_WHOLELINE: {
3439      sqlite3_result_text(ctx, pCur->zLine, -1, SQLITE_TRANSIENT);
3440      break;
3441    }
3442    case COMPLETION_COLUMN_PHASE: {
3443      sqlite3_result_int(ctx, pCur->ePhase);
3444      break;
3445    }
3446  }
3447  return SQLITE_OK;
3448}
3449
3450/*
3451** Return the rowid for the current row.  In this implementation, the
3452** rowid is the same as the output value.
3453*/
3454static int completionRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
3455  completion_cursor *pCur = (completion_cursor*)cur;
3456  *pRowid = pCur->iRowid;
3457  return SQLITE_OK;
3458}
3459
3460/*
3461** Return TRUE if the cursor has been moved off of the last
3462** row of output.
3463*/
3464static int completionEof(sqlite3_vtab_cursor *cur){
3465  completion_cursor *pCur = (completion_cursor*)cur;
3466  return pCur->ePhase >= COMPLETION_EOF;
3467}
3468
3469/*
3470** This method is called to "rewind" the completion_cursor object back
3471** to the first row of output.  This method is always called at least
3472** once prior to any call to completionColumn() or completionRowid() or
3473** completionEof().
3474*/
3475static int completionFilter(
3476  sqlite3_vtab_cursor *pVtabCursor,
3477  int idxNum, const char *idxStr,
3478  int argc, sqlite3_value **argv
3479){
3480  completion_cursor *pCur = (completion_cursor *)pVtabCursor;
3481  int iArg = 0;
3482  (void)(idxStr);   /* Unused parameter */
3483  (void)(argc);     /* Unused parameter */
3484  completionCursorReset(pCur);
3485  if( idxNum & 1 ){
3486    pCur->nPrefix = sqlite3_value_bytes(argv[iArg]);
3487    if( pCur->nPrefix>0 ){
3488      pCur->zPrefix = sqlite3_mprintf("%s", sqlite3_value_text(argv[iArg]));
3489      if( pCur->zPrefix==0 ) return SQLITE_NOMEM;
3490    }
3491    iArg = 1;
3492  }
3493  if( idxNum & 2 ){
3494    pCur->nLine = sqlite3_value_bytes(argv[iArg]);
3495    if( pCur->nLine>0 ){
3496      pCur->zLine = sqlite3_mprintf("%s", sqlite3_value_text(argv[iArg]));
3497      if( pCur->zLine==0 ) return SQLITE_NOMEM;
3498    }
3499  }
3500  if( pCur->zLine!=0 && pCur->zPrefix==0 ){
3501    int i = pCur->nLine;
3502    while( i>0 && (isalnum(pCur->zLine[i-1]) || pCur->zLine[i-1]=='_') ){
3503      i--;
3504    }
3505    pCur->nPrefix = pCur->nLine - i;
3506    if( pCur->nPrefix>0 ){
3507      pCur->zPrefix = sqlite3_mprintf("%.*s", pCur->nPrefix, pCur->zLine + i);
3508      if( pCur->zPrefix==0 ) return SQLITE_NOMEM;
3509    }
3510  }
3511  pCur->iRowid = 0;
3512  pCur->ePhase = COMPLETION_FIRST_PHASE;
3513  return completionNext(pVtabCursor);
3514}
3515
3516/*
3517** SQLite will invoke this method one or more times while planning a query
3518** that uses the completion virtual table.  This routine needs to create
3519** a query plan for each invocation and compute an estimated cost for that
3520** plan.
3521**
3522** There are two hidden parameters that act as arguments to the table-valued
3523** function:  "prefix" and "wholeline".  Bit 0 of idxNum is set if "prefix"
3524** is available and bit 1 is set if "wholeline" is available.
3525*/
3526static int completionBestIndex(
3527  sqlite3_vtab *tab,
3528  sqlite3_index_info *pIdxInfo
3529){
3530  int i;                 /* Loop over constraints */
3531  int idxNum = 0;        /* The query plan bitmask */
3532  int prefixIdx = -1;    /* Index of the start= constraint, or -1 if none */
3533  int wholelineIdx = -1; /* Index of the stop= constraint, or -1 if none */
3534  int nArg = 0;          /* Number of arguments that completeFilter() expects */
3535  const struct sqlite3_index_constraint *pConstraint;
3536
3537  (void)(tab);    /* Unused parameter */
3538  pConstraint = pIdxInfo->aConstraint;
3539  for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){
3540    if( pConstraint->usable==0 ) continue;
3541    if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue;
3542    switch( pConstraint->iColumn ){
3543      case COMPLETION_COLUMN_PREFIX:
3544        prefixIdx = i;
3545        idxNum |= 1;
3546        break;
3547      case COMPLETION_COLUMN_WHOLELINE:
3548        wholelineIdx = i;
3549        idxNum |= 2;
3550        break;
3551    }
3552  }
3553  if( prefixIdx>=0 ){
3554    pIdxInfo->aConstraintUsage[prefixIdx].argvIndex = ++nArg;
3555    pIdxInfo->aConstraintUsage[prefixIdx].omit = 1;
3556  }
3557  if( wholelineIdx>=0 ){
3558    pIdxInfo->aConstraintUsage[wholelineIdx].argvIndex = ++nArg;
3559    pIdxInfo->aConstraintUsage[wholelineIdx].omit = 1;
3560  }
3561  pIdxInfo->idxNum = idxNum;
3562  pIdxInfo->estimatedCost = (double)5000 - 1000*nArg;
3563  pIdxInfo->estimatedRows = 500 - 100*nArg;
3564  return SQLITE_OK;
3565}
3566
3567/*
3568** This following structure defines all the methods for the
3569** completion virtual table.
3570*/
3571static sqlite3_module completionModule = {
3572  0,                         /* iVersion */
3573  0,                         /* xCreate */
3574  completionConnect,         /* xConnect */
3575  completionBestIndex,       /* xBestIndex */
3576  completionDisconnect,      /* xDisconnect */
3577  0,                         /* xDestroy */
3578  completionOpen,            /* xOpen - open a cursor */
3579  completionClose,           /* xClose - close a cursor */
3580  completionFilter,          /* xFilter - configure scan constraints */
3581  completionNext,            /* xNext - advance a cursor */
3582  completionEof,             /* xEof - check for end of scan */
3583  completionColumn,          /* xColumn - read data */
3584  completionRowid,           /* xRowid - read data */
3585  0,                         /* xUpdate */
3586  0,                         /* xBegin */
3587  0,                         /* xSync */
3588  0,                         /* xCommit */
3589  0,                         /* xRollback */
3590  0,                         /* xFindMethod */
3591  0,                         /* xRename */
3592  0,                         /* xSavepoint */
3593  0,                         /* xRelease */
3594  0,                         /* xRollbackTo */
3595  0                          /* xShadowName */
3596};
3597
3598#endif /* SQLITE_OMIT_VIRTUALTABLE */
3599
3600int sqlite3CompletionVtabInit(sqlite3 *db){
3601  int rc = SQLITE_OK;
3602#ifndef SQLITE_OMIT_VIRTUALTABLE
3603  rc = sqlite3_create_module(db, "completion", &completionModule, 0);
3604#endif
3605  return rc;
3606}
3607
3608#ifdef _WIN32
3609
3610#endif
3611int sqlite3_completion_init(
3612  sqlite3 *db,
3613  char **pzErrMsg,
3614  const sqlite3_api_routines *pApi
3615){
3616  int rc = SQLITE_OK;
3617  SQLITE_EXTENSION_INIT2(pApi);
3618  (void)(pzErrMsg);  /* Unused parameter */
3619#ifndef SQLITE_OMIT_VIRTUALTABLE
3620  rc = sqlite3CompletionVtabInit(db);
3621#endif
3622  return rc;
3623}
3624
3625/************************* End ../ext/misc/completion.c ********************/
3626/************************* Begin ../ext/misc/appendvfs.c ******************/
3627/*
3628** 2017-10-20
3629**
3630** The author disclaims copyright to this source code.  In place of
3631** a legal notice, here is a blessing:
3632**
3633**    May you do good and not evil.
3634**    May you find forgiveness for yourself and forgive others.
3635**    May you share freely, never taking more than you give.
3636**
3637******************************************************************************
3638**
3639** This file implements a VFS shim that allows an SQLite database to be
3640** appended onto the end of some other file, such as an executable.
3641**
3642** A special record must appear at the end of the file that identifies the
3643** file as an appended database and provides the offset to the first page
3644** of the exposed content. (Or, it is the length of the content prefix.)
3645** For best performance page 1 should be located at a disk page boundary,
3646** though that is not required.
3647**
3648** When opening a database using this VFS, the connection might treat
3649** the file as an ordinary SQLite database, or it might treat it as a
3650** database appended onto some other file.  The decision is made by
3651** applying the following rules in order:
3652**
3653**  (1)  An empty file is an ordinary database.
3654**
3655**  (2)  If the file ends with the appendvfs trailer string
3656**       "Start-Of-SQLite3-NNNNNNNN" that file is an appended database.
3657**
3658**  (3)  If the file begins with the standard SQLite prefix string
3659**       "SQLite format 3", that file is an ordinary database.
3660**
3661**  (4)  If none of the above apply and the SQLITE_OPEN_CREATE flag is
3662**       set, then a new database is appended to the already existing file.
3663**
3664**  (5)  Otherwise, SQLITE_CANTOPEN is returned.
3665**
3666** To avoid unnecessary complications with the PENDING_BYTE, the size of
3667** the file containing the database is limited to 1GiB. (1073741824 bytes)
3668** This VFS will not read or write past the 1GiB mark.  This restriction
3669** might be lifted in future versions.  For now, if you need a larger
3670** database, then keep it in a separate file.
3671**
3672** If the file being opened is a plain database (not an appended one), then
3673** this shim is a pass-through into the default underlying VFS. (rule 3)
3674**/
3675/* #include "sqlite3ext.h" */
3676SQLITE_EXTENSION_INIT1
3677#include <string.h>
3678#include <assert.h>
3679
3680/* The append mark at the end of the database is:
3681**
3682**     Start-Of-SQLite3-NNNNNNNN
3683**     123456789 123456789 12345
3684**
3685** The NNNNNNNN represents a 64-bit big-endian unsigned integer which is
3686** the offset to page 1, and also the length of the prefix content.
3687*/
3688#define APND_MARK_PREFIX     "Start-Of-SQLite3-"
3689#define APND_MARK_PREFIX_SZ  17
3690#define APND_MARK_FOS_SZ      8
3691#define APND_MARK_SIZE       (APND_MARK_PREFIX_SZ+APND_MARK_FOS_SZ)
3692
3693/*
3694** Maximum size of the combined prefix + database + append-mark.  This
3695** must be less than 0x40000000 to avoid locking issues on Windows.
3696*/
3697#define APND_MAX_SIZE  (0x40000000)
3698
3699/*
3700** Try to align the database to an even multiple of APND_ROUNDUP bytes.
3701*/
3702#ifndef APND_ROUNDUP
3703#define APND_ROUNDUP 4096
3704#endif
3705#define APND_ALIGN_MASK         ((sqlite3_int64)(APND_ROUNDUP-1))
3706#define APND_START_ROUNDUP(fsz) (((fsz)+APND_ALIGN_MASK) & ~APND_ALIGN_MASK)
3707
3708/*
3709** Forward declaration of objects used by this utility
3710*/
3711typedef struct sqlite3_vfs ApndVfs;
3712typedef struct ApndFile ApndFile;
3713
3714/* Access to a lower-level VFS that (might) implement dynamic loading,
3715** access to randomness, etc.
3716*/
3717#define ORIGVFS(p)  ((sqlite3_vfs*)((p)->pAppData))
3718#define ORIGFILE(p) ((sqlite3_file*)(((ApndFile*)(p))+1))
3719
3720/* An open appendvfs file
3721**
3722** An instance of this structure describes the appended database file.
3723** A separate sqlite3_file object is always appended. The appended
3724** sqlite3_file object (which can be accessed using ORIGFILE()) describes
3725** the entire file, including the prefix, the database, and the
3726** append-mark.
3727**
3728** The structure of an AppendVFS database is like this:
3729**
3730**   +-------------+---------+----------+-------------+
3731**   | prefix-file | padding | database | append-mark |
3732**   +-------------+---------+----------+-------------+
3733**                           ^          ^
3734**                           |          |
3735**                         iPgOne      iMark
3736**
3737**
3738** "prefix file" -  file onto which the database has been appended.
3739** "padding"     -  zero or more bytes inserted so that "database"
3740**                  starts on an APND_ROUNDUP boundary
3741** "database"    -  The SQLite database file
3742** "append-mark" -  The 25-byte "Start-Of-SQLite3-NNNNNNNN" that indicates
3743**                  the offset from the start of prefix-file to the start
3744**                  of "database".
3745**
3746** The size of the database is iMark - iPgOne.
3747**
3748** The NNNNNNNN in the "Start-Of-SQLite3-NNNNNNNN" suffix is the value
3749** of iPgOne stored as a big-ending 64-bit integer.
3750**
3751** iMark will be the size of the underlying file minus 25 (APND_MARKSIZE).
3752** Or, iMark is -1 to indicate that it has not yet been written.
3753*/
3754struct ApndFile {
3755  sqlite3_file base;        /* Subclass.  MUST BE FIRST! */
3756  sqlite3_int64 iPgOne;     /* Offset to the start of the database */
3757  sqlite3_int64 iMark;      /* Offset of the append mark.  -1 if unwritten */
3758  /* Always followed by another sqlite3_file that describes the whole file */
3759};
3760
3761/*
3762** Methods for ApndFile
3763*/
3764static int apndClose(sqlite3_file*);
3765static int apndRead(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst);
3766static int apndWrite(sqlite3_file*,const void*,int iAmt, sqlite3_int64 iOfst);
3767static int apndTruncate(sqlite3_file*, sqlite3_int64 size);
3768static int apndSync(sqlite3_file*, int flags);
3769static int apndFileSize(sqlite3_file*, sqlite3_int64 *pSize);
3770static int apndLock(sqlite3_file*, int);
3771static int apndUnlock(sqlite3_file*, int);
3772static int apndCheckReservedLock(sqlite3_file*, int *pResOut);
3773static int apndFileControl(sqlite3_file*, int op, void *pArg);
3774static int apndSectorSize(sqlite3_file*);
3775static int apndDeviceCharacteristics(sqlite3_file*);
3776static int apndShmMap(sqlite3_file*, int iPg, int pgsz, int, void volatile**);
3777static int apndShmLock(sqlite3_file*, int offset, int n, int flags);
3778static void apndShmBarrier(sqlite3_file*);
3779static int apndShmUnmap(sqlite3_file*, int deleteFlag);
3780static int apndFetch(sqlite3_file*, sqlite3_int64 iOfst, int iAmt, void **pp);
3781static int apndUnfetch(sqlite3_file*, sqlite3_int64 iOfst, void *p);
3782
3783/*
3784** Methods for ApndVfs
3785*/
3786static int apndOpen(sqlite3_vfs*, const char *, sqlite3_file*, int , int *);
3787static int apndDelete(sqlite3_vfs*, const char *zName, int syncDir);
3788static int apndAccess(sqlite3_vfs*, const char *zName, int flags, int *);
3789static int apndFullPathname(sqlite3_vfs*, const char *zName, int, char *zOut);
3790static void *apndDlOpen(sqlite3_vfs*, const char *zFilename);
3791static void apndDlError(sqlite3_vfs*, int nByte, char *zErrMsg);
3792static void (*apndDlSym(sqlite3_vfs *pVfs, void *p, const char*zSym))(void);
3793static void apndDlClose(sqlite3_vfs*, void*);
3794static int apndRandomness(sqlite3_vfs*, int nByte, char *zOut);
3795static int apndSleep(sqlite3_vfs*, int microseconds);
3796static int apndCurrentTime(sqlite3_vfs*, double*);
3797static int apndGetLastError(sqlite3_vfs*, int, char *);
3798static int apndCurrentTimeInt64(sqlite3_vfs*, sqlite3_int64*);
3799static int apndSetSystemCall(sqlite3_vfs*, const char*,sqlite3_syscall_ptr);
3800static sqlite3_syscall_ptr apndGetSystemCall(sqlite3_vfs*, const char *z);
3801static const char *apndNextSystemCall(sqlite3_vfs*, const char *zName);
3802
3803static sqlite3_vfs apnd_vfs = {
3804  3,                            /* iVersion (set when registered) */
3805  0,                            /* szOsFile (set when registered) */
3806  1024,                         /* mxPathname */
3807  0,                            /* pNext */
3808  "apndvfs",                    /* zName */
3809  0,                            /* pAppData (set when registered) */
3810  apndOpen,                     /* xOpen */
3811  apndDelete,                   /* xDelete */
3812  apndAccess,                   /* xAccess */
3813  apndFullPathname,             /* xFullPathname */
3814  apndDlOpen,                   /* xDlOpen */
3815  apndDlError,                  /* xDlError */
3816  apndDlSym,                    /* xDlSym */
3817  apndDlClose,                  /* xDlClose */
3818  apndRandomness,               /* xRandomness */
3819  apndSleep,                    /* xSleep */
3820  apndCurrentTime,              /* xCurrentTime */
3821  apndGetLastError,             /* xGetLastError */
3822  apndCurrentTimeInt64,         /* xCurrentTimeInt64 */
3823  apndSetSystemCall,            /* xSetSystemCall */
3824  apndGetSystemCall,            /* xGetSystemCall */
3825  apndNextSystemCall            /* xNextSystemCall */
3826};
3827
3828static const sqlite3_io_methods apnd_io_methods = {
3829  3,                              /* iVersion */
3830  apndClose,                      /* xClose */
3831  apndRead,                       /* xRead */
3832  apndWrite,                      /* xWrite */
3833  apndTruncate,                   /* xTruncate */
3834  apndSync,                       /* xSync */
3835  apndFileSize,                   /* xFileSize */
3836  apndLock,                       /* xLock */
3837  apndUnlock,                     /* xUnlock */
3838  apndCheckReservedLock,          /* xCheckReservedLock */
3839  apndFileControl,                /* xFileControl */
3840  apndSectorSize,                 /* xSectorSize */
3841  apndDeviceCharacteristics,      /* xDeviceCharacteristics */
3842  apndShmMap,                     /* xShmMap */
3843  apndShmLock,                    /* xShmLock */
3844  apndShmBarrier,                 /* xShmBarrier */
3845  apndShmUnmap,                   /* xShmUnmap */
3846  apndFetch,                      /* xFetch */
3847  apndUnfetch                     /* xUnfetch */
3848};
3849
3850/*
3851** Close an apnd-file.
3852*/
3853static int apndClose(sqlite3_file *pFile){
3854  pFile = ORIGFILE(pFile);
3855  return pFile->pMethods->xClose(pFile);
3856}
3857
3858/*
3859** Read data from an apnd-file.
3860*/
3861static int apndRead(
3862  sqlite3_file *pFile,
3863  void *zBuf,
3864  int iAmt,
3865  sqlite_int64 iOfst
3866){
3867  ApndFile *paf = (ApndFile *)pFile;
3868  pFile = ORIGFILE(pFile);
3869  return pFile->pMethods->xRead(pFile, zBuf, iAmt, paf->iPgOne+iOfst);
3870}
3871
3872/*
3873** Add the append-mark onto what should become the end of the file.
3874*  If and only if this succeeds, internal ApndFile.iMark is updated.
3875*  Parameter iWriteEnd is the appendvfs-relative offset of the new mark.
3876*/
3877static int apndWriteMark(
3878  ApndFile *paf,
3879  sqlite3_file *pFile,
3880  sqlite_int64 iWriteEnd
3881){
3882  sqlite_int64 iPgOne = paf->iPgOne;
3883  unsigned char a[APND_MARK_SIZE];
3884  int i = APND_MARK_FOS_SZ;
3885  int rc;
3886  assert(pFile == ORIGFILE(paf));
3887  memcpy(a, APND_MARK_PREFIX, APND_MARK_PREFIX_SZ);
3888  while( --i >= 0 ){
3889    a[APND_MARK_PREFIX_SZ+i] = (unsigned char)(iPgOne & 0xff);
3890    iPgOne >>= 8;
3891  }
3892  iWriteEnd += paf->iPgOne;
3893  if( SQLITE_OK==(rc = pFile->pMethods->xWrite
3894                  (pFile, a, APND_MARK_SIZE, iWriteEnd)) ){
3895    paf->iMark = iWriteEnd;
3896  }
3897  return rc;
3898}
3899
3900/*
3901** Write data to an apnd-file.
3902*/
3903static int apndWrite(
3904  sqlite3_file *pFile,
3905  const void *zBuf,
3906  int iAmt,
3907  sqlite_int64 iOfst
3908){
3909  ApndFile *paf = (ApndFile *)pFile;
3910  sqlite_int64 iWriteEnd = iOfst + iAmt;
3911  if( iWriteEnd>=APND_MAX_SIZE ) return SQLITE_FULL;
3912  pFile = ORIGFILE(pFile);
3913  /* If append-mark is absent or will be overwritten, write it. */
3914  if( paf->iMark < 0 || paf->iPgOne + iWriteEnd > paf->iMark ){
3915    int rc = apndWriteMark(paf, pFile, iWriteEnd);
3916    if( SQLITE_OK!=rc ) return rc;
3917  }
3918  return pFile->pMethods->xWrite(pFile, zBuf, iAmt, paf->iPgOne+iOfst);
3919}
3920
3921/*
3922** Truncate an apnd-file.
3923*/
3924static int apndTruncate(sqlite3_file *pFile, sqlite_int64 size){
3925  ApndFile *paf = (ApndFile *)pFile;
3926  pFile = ORIGFILE(pFile);
3927  /* The append mark goes out first so truncate failure does not lose it. */
3928  if( SQLITE_OK!=apndWriteMark(paf, pFile, size) ) return SQLITE_IOERR;
3929  /* Truncate underlying file just past append mark */
3930  return pFile->pMethods->xTruncate(pFile, paf->iMark+APND_MARK_SIZE);
3931}
3932
3933/*
3934** Sync an apnd-file.
3935*/
3936static int apndSync(sqlite3_file *pFile, int flags){
3937  pFile = ORIGFILE(pFile);
3938  return pFile->pMethods->xSync(pFile, flags);
3939}
3940
3941/*
3942** Return the current file-size of an apnd-file.
3943** If the append mark is not yet there, the file-size is 0.
3944*/
3945static int apndFileSize(sqlite3_file *pFile, sqlite_int64 *pSize){
3946  ApndFile *paf = (ApndFile *)pFile;
3947  *pSize = ( paf->iMark >= 0 )? (paf->iMark - paf->iPgOne) : 0;
3948  return SQLITE_OK;
3949}
3950
3951/*
3952** Lock an apnd-file.
3953*/
3954static int apndLock(sqlite3_file *pFile, int eLock){
3955  pFile = ORIGFILE(pFile);
3956  return pFile->pMethods->xLock(pFile, eLock);
3957}
3958
3959/*
3960** Unlock an apnd-file.
3961*/
3962static int apndUnlock(sqlite3_file *pFile, int eLock){
3963  pFile = ORIGFILE(pFile);
3964  return pFile->pMethods->xUnlock(pFile, eLock);
3965}
3966
3967/*
3968** Check if another file-handle holds a RESERVED lock on an apnd-file.
3969*/
3970static int apndCheckReservedLock(sqlite3_file *pFile, int *pResOut){
3971  pFile = ORIGFILE(pFile);
3972  return pFile->pMethods->xCheckReservedLock(pFile, pResOut);
3973}
3974
3975/*
3976** File control method. For custom operations on an apnd-file.
3977*/
3978static int apndFileControl(sqlite3_file *pFile, int op, void *pArg){
3979  ApndFile *paf = (ApndFile *)pFile;
3980  int rc;
3981  pFile = ORIGFILE(pFile);
3982  if( op==SQLITE_FCNTL_SIZE_HINT ) *(sqlite3_int64*)pArg += paf->iPgOne;
3983  rc = pFile->pMethods->xFileControl(pFile, op, pArg);
3984  if( rc==SQLITE_OK && op==SQLITE_FCNTL_VFSNAME ){
3985    *(char**)pArg = sqlite3_mprintf("apnd(%lld)/%z", paf->iPgOne,*(char**)pArg);
3986  }
3987  return rc;
3988}
3989
3990/*
3991** Return the sector-size in bytes for an apnd-file.
3992*/
3993static int apndSectorSize(sqlite3_file *pFile){
3994  pFile = ORIGFILE(pFile);
3995  return pFile->pMethods->xSectorSize(pFile);
3996}
3997
3998/*
3999** Return the device characteristic flags supported by an apnd-file.
4000*/
4001static int apndDeviceCharacteristics(sqlite3_file *pFile){
4002  pFile = ORIGFILE(pFile);
4003  return pFile->pMethods->xDeviceCharacteristics(pFile);
4004}
4005
4006/* Create a shared memory file mapping */
4007static int apndShmMap(
4008  sqlite3_file *pFile,
4009  int iPg,
4010  int pgsz,
4011  int bExtend,
4012  void volatile **pp
4013){
4014  pFile = ORIGFILE(pFile);
4015  return pFile->pMethods->xShmMap(pFile,iPg,pgsz,bExtend,pp);
4016}
4017
4018/* Perform locking on a shared-memory segment */
4019static int apndShmLock(sqlite3_file *pFile, int offset, int n, int flags){
4020  pFile = ORIGFILE(pFile);
4021  return pFile->pMethods->xShmLock(pFile,offset,n,flags);
4022}
4023
4024/* Memory barrier operation on shared memory */
4025static void apndShmBarrier(sqlite3_file *pFile){
4026  pFile = ORIGFILE(pFile);
4027  pFile->pMethods->xShmBarrier(pFile);
4028}
4029
4030/* Unmap a shared memory segment */
4031static int apndShmUnmap(sqlite3_file *pFile, int deleteFlag){
4032  pFile = ORIGFILE(pFile);
4033  return pFile->pMethods->xShmUnmap(pFile,deleteFlag);
4034}
4035
4036/* Fetch a page of a memory-mapped file */
4037static int apndFetch(
4038  sqlite3_file *pFile,
4039  sqlite3_int64 iOfst,
4040  int iAmt,
4041  void **pp
4042){
4043  ApndFile *p = (ApndFile *)pFile;
4044  if( p->iMark < 0 || iOfst+iAmt > p->iMark ){
4045    return SQLITE_IOERR; /* Cannot read what is not yet there. */
4046  }
4047  pFile = ORIGFILE(pFile);
4048  return pFile->pMethods->xFetch(pFile, iOfst+p->iPgOne, iAmt, pp);
4049}
4050
4051/* Release a memory-mapped page */
4052static int apndUnfetch(sqlite3_file *pFile, sqlite3_int64 iOfst, void *pPage){
4053  ApndFile *p = (ApndFile *)pFile;
4054  pFile = ORIGFILE(pFile);
4055  return pFile->pMethods->xUnfetch(pFile, iOfst+p->iPgOne, pPage);
4056}
4057
4058/*
4059** Try to read the append-mark off the end of a file.  Return the
4060** start of the appended database if the append-mark is present.
4061** If there is no valid append-mark, return -1;
4062**
4063** An append-mark is only valid if the NNNNNNNN start-of-database offset
4064** indicates that the appended database contains at least one page.  The
4065** start-of-database value must be a multiple of 512.
4066*/
4067static sqlite3_int64 apndReadMark(sqlite3_int64 sz, sqlite3_file *pFile){
4068  int rc, i;
4069  sqlite3_int64 iMark;
4070  int msbs = 8 * (APND_MARK_FOS_SZ-1);
4071  unsigned char a[APND_MARK_SIZE];
4072
4073  if( APND_MARK_SIZE!=(sz & 0x1ff) ) return -1;
4074  rc = pFile->pMethods->xRead(pFile, a, APND_MARK_SIZE, sz-APND_MARK_SIZE);
4075  if( rc ) return -1;
4076  if( memcmp(a, APND_MARK_PREFIX, APND_MARK_PREFIX_SZ)!=0 ) return -1;
4077  iMark = ((sqlite3_int64)(a[APND_MARK_PREFIX_SZ] & 0x7f)) << msbs;
4078  for(i=1; i<8; i++){
4079    msbs -= 8;
4080    iMark |= (sqlite3_int64)a[APND_MARK_PREFIX_SZ+i]<<msbs;
4081  }
4082  if( iMark > (sz - APND_MARK_SIZE - 512) ) return -1;
4083  if( iMark & 0x1ff ) return -1;
4084  return iMark;
4085}
4086
4087static const char apvfsSqliteHdr[] = "SQLite format 3";
4088/*
4089** Check to see if the file is an appendvfs SQLite database file.
4090** Return true iff it is such. Parameter sz is the file's size.
4091*/
4092static int apndIsAppendvfsDatabase(sqlite3_int64 sz, sqlite3_file *pFile){
4093  int rc;
4094  char zHdr[16];
4095  sqlite3_int64 iMark = apndReadMark(sz, pFile);
4096  if( iMark>=0 ){
4097    /* If file has the correct end-marker, the expected odd size, and the
4098    ** SQLite DB type marker where the end-marker puts it, then it
4099    ** is an appendvfs database.
4100    */
4101    rc = pFile->pMethods->xRead(pFile, zHdr, sizeof(zHdr), iMark);
4102    if( SQLITE_OK==rc
4103     && memcmp(zHdr, apvfsSqliteHdr, sizeof(zHdr))==0
4104     && (sz & 0x1ff) == APND_MARK_SIZE
4105     && sz>=512+APND_MARK_SIZE
4106    ){
4107      return 1; /* It's an appendvfs database */
4108    }
4109  }
4110  return 0;
4111}
4112
4113/*
4114** Check to see if the file is an ordinary SQLite database file.
4115** Return true iff so. Parameter sz is the file's size.
4116*/
4117static int apndIsOrdinaryDatabaseFile(sqlite3_int64 sz, sqlite3_file *pFile){
4118  char zHdr[16];
4119  if( apndIsAppendvfsDatabase(sz, pFile) /* rule 2 */
4120   || (sz & 0x1ff) != 0
4121   || SQLITE_OK!=pFile->pMethods->xRead(pFile, zHdr, sizeof(zHdr), 0)
4122   || memcmp(zHdr, apvfsSqliteHdr, sizeof(zHdr))!=0
4123  ){
4124    return 0;
4125  }else{
4126    return 1;
4127  }
4128}
4129
4130/*
4131** Open an apnd file handle.
4132*/
4133static int apndOpen(
4134  sqlite3_vfs *pApndVfs,
4135  const char *zName,
4136  sqlite3_file *pFile,
4137  int flags,
4138  int *pOutFlags
4139){
4140  ApndFile *pApndFile = (ApndFile*)pFile;
4141  sqlite3_file *pBaseFile = ORIGFILE(pFile);
4142  sqlite3_vfs *pBaseVfs = ORIGVFS(pApndVfs);
4143  int rc;
4144  sqlite3_int64 sz = 0;
4145  if( (flags & SQLITE_OPEN_MAIN_DB)==0 ){
4146    /* The appendvfs is not to be used for transient or temporary databases.
4147    ** Just use the base VFS open to initialize the given file object and
4148    ** open the underlying file. (Appendvfs is then unused for this file.)
4149    */
4150    return pBaseVfs->xOpen(pBaseVfs, zName, pFile, flags, pOutFlags);
4151  }
4152  memset(pApndFile, 0, sizeof(ApndFile));
4153  pFile->pMethods = &apnd_io_methods;
4154  pApndFile->iMark = -1;    /* Append mark not yet written */
4155
4156  rc = pBaseVfs->xOpen(pBaseVfs, zName, pBaseFile, flags, pOutFlags);
4157  if( rc==SQLITE_OK ){
4158    rc = pBaseFile->pMethods->xFileSize(pBaseFile, &sz);
4159  }
4160  if( rc ){
4161    pBaseFile->pMethods->xClose(pBaseFile);
4162    pFile->pMethods = 0;
4163    return rc;
4164  }
4165  if( apndIsOrdinaryDatabaseFile(sz, pBaseFile) ){
4166    /* The file being opened appears to be just an ordinary DB. Copy
4167    ** the base dispatch-table so this instance mimics the base VFS.
4168    */
4169    memmove(pApndFile, pBaseFile, pBaseVfs->szOsFile);
4170    return SQLITE_OK;
4171  }
4172  pApndFile->iPgOne = apndReadMark(sz, pFile);
4173  if( pApndFile->iPgOne>=0 ){
4174    pApndFile->iMark = sz - APND_MARK_SIZE; /* Append mark found */
4175    return SQLITE_OK;
4176  }
4177  if( (flags & SQLITE_OPEN_CREATE)==0 ){
4178    pBaseFile->pMethods->xClose(pBaseFile);
4179    rc = SQLITE_CANTOPEN;
4180    pFile->pMethods = 0;
4181  }else{
4182    /* Round newly added appendvfs location to #define'd page boundary.
4183    ** Note that nothing has yet been written to the underlying file.
4184    ** The append mark will be written along with first content write.
4185    ** Until then, paf->iMark value indicates it is not yet written.
4186    */
4187    pApndFile->iPgOne = APND_START_ROUNDUP(sz);
4188  }
4189  return rc;
4190}
4191
4192/*
4193** Delete an apnd file.
4194** For an appendvfs, this could mean delete the appendvfs portion,
4195** leaving the appendee as it was before it gained an appendvfs.
4196** For now, this code deletes the underlying file too.
4197*/
4198static int apndDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){
4199  return ORIGVFS(pVfs)->xDelete(ORIGVFS(pVfs), zPath, dirSync);
4200}
4201
4202/*
4203** All other VFS methods are pass-thrus.
4204*/
4205static int apndAccess(
4206  sqlite3_vfs *pVfs,
4207  const char *zPath,
4208  int flags,
4209  int *pResOut
4210){
4211  return ORIGVFS(pVfs)->xAccess(ORIGVFS(pVfs), zPath, flags, pResOut);
4212}
4213static int apndFullPathname(
4214  sqlite3_vfs *pVfs,
4215  const char *zPath,
4216  int nOut,
4217  char *zOut
4218){
4219  return ORIGVFS(pVfs)->xFullPathname(ORIGVFS(pVfs),zPath,nOut,zOut);
4220}
4221static void *apndDlOpen(sqlite3_vfs *pVfs, const char *zPath){
4222  return ORIGVFS(pVfs)->xDlOpen(ORIGVFS(pVfs), zPath);
4223}
4224static void apndDlError(sqlite3_vfs *pVfs, int nByte, char *zErrMsg){
4225  ORIGVFS(pVfs)->xDlError(ORIGVFS(pVfs), nByte, zErrMsg);
4226}
4227static void (*apndDlSym(sqlite3_vfs *pVfs, void *p, const char *zSym))(void){
4228  return ORIGVFS(pVfs)->xDlSym(ORIGVFS(pVfs), p, zSym);
4229}
4230static void apndDlClose(sqlite3_vfs *pVfs, void *pHandle){
4231  ORIGVFS(pVfs)->xDlClose(ORIGVFS(pVfs), pHandle);
4232}
4233static int apndRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){
4234  return ORIGVFS(pVfs)->xRandomness(ORIGVFS(pVfs), nByte, zBufOut);
4235}
4236static int apndSleep(sqlite3_vfs *pVfs, int nMicro){
4237  return ORIGVFS(pVfs)->xSleep(ORIGVFS(pVfs), nMicro);
4238}
4239static int apndCurrentTime(sqlite3_vfs *pVfs, double *pTimeOut){
4240  return ORIGVFS(pVfs)->xCurrentTime(ORIGVFS(pVfs), pTimeOut);
4241}
4242static int apndGetLastError(sqlite3_vfs *pVfs, int a, char *b){
4243  return ORIGVFS(pVfs)->xGetLastError(ORIGVFS(pVfs), a, b);
4244}
4245static int apndCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *p){
4246  return ORIGVFS(pVfs)->xCurrentTimeInt64(ORIGVFS(pVfs), p);
4247}
4248static int apndSetSystemCall(
4249  sqlite3_vfs *pVfs,
4250  const char *zName,
4251  sqlite3_syscall_ptr pCall
4252){
4253  return ORIGVFS(pVfs)->xSetSystemCall(ORIGVFS(pVfs),zName,pCall);
4254}
4255static sqlite3_syscall_ptr apndGetSystemCall(
4256  sqlite3_vfs *pVfs,
4257  const char *zName
4258){
4259  return ORIGVFS(pVfs)->xGetSystemCall(ORIGVFS(pVfs),zName);
4260}
4261static const char *apndNextSystemCall(sqlite3_vfs *pVfs, const char *zName){
4262  return ORIGVFS(pVfs)->xNextSystemCall(ORIGVFS(pVfs), zName);
4263}
4264
4265
4266#ifdef _WIN32
4267
4268#endif
4269/*
4270** This routine is called when the extension is loaded.
4271** Register the new VFS.
4272*/
4273int sqlite3_appendvfs_init(
4274  sqlite3 *db,
4275  char **pzErrMsg,
4276  const sqlite3_api_routines *pApi
4277){
4278  int rc = SQLITE_OK;
4279  sqlite3_vfs *pOrig;
4280  SQLITE_EXTENSION_INIT2(pApi);
4281  (void)pzErrMsg;
4282  (void)db;
4283  pOrig = sqlite3_vfs_find(0);
4284  apnd_vfs.iVersion = pOrig->iVersion;
4285  apnd_vfs.pAppData = pOrig;
4286  apnd_vfs.szOsFile = pOrig->szOsFile + sizeof(ApndFile);
4287  rc = sqlite3_vfs_register(&apnd_vfs, 0);
4288#ifdef APPENDVFS_TEST
4289  if( rc==SQLITE_OK ){
4290    rc = sqlite3_auto_extension((void(*)(void))apndvfsRegister);
4291  }
4292#endif
4293  if( rc==SQLITE_OK ) rc = SQLITE_OK_LOAD_PERMANENTLY;
4294  return rc;
4295}
4296
4297/************************* End ../ext/misc/appendvfs.c ********************/
4298/************************* Begin ../ext/misc/memtrace.c ******************/
4299/*
4300** 2019-01-21
4301**
4302** The author disclaims copyright to this source code.  In place of
4303** a legal notice, here is a blessing:
4304**
4305**    May you do good and not evil.
4306**    May you find forgiveness for yourself and forgive others.
4307**    May you share freely, never taking more than you give.
4308**
4309*************************************************************************
4310**
4311** This file implements an extension that uses the SQLITE_CONFIG_MALLOC
4312** mechanism to add a tracing layer on top of SQLite.  If this extension
4313** is registered prior to sqlite3_initialize(), it will cause all memory
4314** allocation activities to be logged on standard output, or to some other
4315** FILE specified by the initializer.
4316**
4317** This file needs to be compiled into the application that uses it.
4318**
4319** This extension is used to implement the --memtrace option of the
4320** command-line shell.
4321*/
4322#include <assert.h>
4323#include <string.h>
4324#include <stdio.h>
4325
4326/* The original memory allocation routines */
4327static sqlite3_mem_methods memtraceBase;
4328static FILE *memtraceOut;
4329
4330/* Methods that trace memory allocations */
4331static void *memtraceMalloc(int n){
4332  if( memtraceOut ){
4333    fprintf(memtraceOut, "MEMTRACE: allocate %d bytes\n",
4334            memtraceBase.xRoundup(n));
4335  }
4336  return memtraceBase.xMalloc(n);
4337}
4338static void memtraceFree(void *p){
4339  if( p==0 ) return;
4340  if( memtraceOut ){
4341    fprintf(memtraceOut, "MEMTRACE: free %d bytes\n", memtraceBase.xSize(p));
4342  }
4343  memtraceBase.xFree(p);
4344}
4345static void *memtraceRealloc(void *p, int n){
4346  if( p==0 ) return memtraceMalloc(n);
4347  if( n==0 ){
4348    memtraceFree(p);
4349    return 0;
4350  }
4351  if( memtraceOut ){
4352    fprintf(memtraceOut, "MEMTRACE: resize %d -> %d bytes\n",
4353            memtraceBase.xSize(p), memtraceBase.xRoundup(n));
4354  }
4355  return memtraceBase.xRealloc(p, n);
4356}
4357static int memtraceSize(void *p){
4358  return memtraceBase.xSize(p);
4359}
4360static int memtraceRoundup(int n){
4361  return memtraceBase.xRoundup(n);
4362}
4363static int memtraceInit(void *p){
4364  return memtraceBase.xInit(p);
4365}
4366static void memtraceShutdown(void *p){
4367  memtraceBase.xShutdown(p);
4368}
4369
4370/* The substitute memory allocator */
4371static sqlite3_mem_methods ersaztMethods = {
4372  memtraceMalloc,
4373  memtraceFree,
4374  memtraceRealloc,
4375  memtraceSize,
4376  memtraceRoundup,
4377  memtraceInit,
4378  memtraceShutdown,
4379  0
4380};
4381
4382/* Begin tracing memory allocations to out. */
4383int sqlite3MemTraceActivate(FILE *out){
4384  int rc = SQLITE_OK;
4385  if( memtraceBase.xMalloc==0 ){
4386    rc = sqlite3_config(SQLITE_CONFIG_GETMALLOC, &memtraceBase);
4387    if( rc==SQLITE_OK ){
4388      rc = sqlite3_config(SQLITE_CONFIG_MALLOC, &ersaztMethods);
4389    }
4390  }
4391  memtraceOut = out;
4392  return rc;
4393}
4394
4395/* Deactivate memory tracing */
4396int sqlite3MemTraceDeactivate(void){
4397  int rc = SQLITE_OK;
4398  if( memtraceBase.xMalloc!=0 ){
4399    rc = sqlite3_config(SQLITE_CONFIG_MALLOC, &memtraceBase);
4400    if( rc==SQLITE_OK ){
4401      memset(&memtraceBase, 0, sizeof(memtraceBase));
4402    }
4403  }
4404  memtraceOut = 0;
4405  return rc;
4406}
4407
4408/************************* End ../ext/misc/memtrace.c ********************/
4409/************************* Begin ../ext/misc/uint.c ******************/
4410/*
4411** 2020-04-14
4412**
4413** The author disclaims copyright to this source code.  In place of
4414** a legal notice, here is a blessing:
4415**
4416**    May you do good and not evil.
4417**    May you find forgiveness for yourself and forgive others.
4418**    May you share freely, never taking more than you give.
4419**
4420******************************************************************************
4421**
4422** This SQLite extension implements the UINT collating sequence.
4423**
4424** UINT works like BINARY for text, except that embedded strings
4425** of digits compare in numeric order.
4426**
4427**     *   Leading zeros are handled properly, in the sense that
4428**         they do not mess of the maginitude comparison of embedded
4429**         strings of digits.  "x00123y" is equal to "x123y".
4430**
4431**     *   Only unsigned integers are recognized.  Plus and minus
4432**         signs are ignored.  Decimal points and exponential notation
4433**         are ignored.
4434**
4435**     *   Embedded integers can be of arbitrary length.  Comparison
4436**         is *not* limited integers that can be expressed as a
4437**         64-bit machine integer.
4438*/
4439/* #include "sqlite3ext.h" */
4440SQLITE_EXTENSION_INIT1
4441#include <assert.h>
4442#include <string.h>
4443#include <ctype.h>
4444
4445/*
4446** Compare text in lexicographic order, except strings of digits
4447** compare in numeric order.
4448*/
4449static int uintCollFunc(
4450  void *notUsed,
4451  int nKey1, const void *pKey1,
4452  int nKey2, const void *pKey2
4453){
4454  const unsigned char *zA = (const unsigned char*)pKey1;
4455  const unsigned char *zB = (const unsigned char*)pKey2;
4456  int i=0, j=0, x;
4457  (void)notUsed;
4458  while( i<nKey1 && j<nKey2 ){
4459    x = zA[i] - zB[j];
4460    if( isdigit(zA[i]) ){
4461      int k;
4462      if( !isdigit(zB[j]) ) return x;
4463      while( i<nKey1 && zA[i]=='0' ){ i++; }
4464      while( j<nKey2 && zB[j]=='0' ){ j++; }
4465      k = 0;
4466      while( i+k<nKey1 && isdigit(zA[i+k])
4467             && j+k<nKey2 && isdigit(zB[j+k]) ){
4468        k++;
4469      }
4470      if( i+k<nKey1 && isdigit(zA[i+k]) ){
4471        return +1;
4472      }else if( j+k<nKey2 && isdigit(zB[j+k]) ){
4473        return -1;
4474      }else{
4475        x = memcmp(zA+i, zB+j, k);
4476        if( x ) return x;
4477        i += k;
4478        j += k;
4479      }
4480    }else if( x ){
4481      return x;
4482    }else{
4483      i++;
4484      j++;
4485    }
4486  }
4487  return (nKey1 - i) - (nKey2 - j);
4488}
4489
4490#ifdef _WIN32
4491
4492#endif
4493int sqlite3_uint_init(
4494  sqlite3 *db,
4495  char **pzErrMsg,
4496  const sqlite3_api_routines *pApi
4497){
4498  SQLITE_EXTENSION_INIT2(pApi);
4499  (void)pzErrMsg;  /* Unused parameter */
4500  return sqlite3_create_collation(db, "uint", SQLITE_UTF8, 0, uintCollFunc);
4501}
4502
4503/************************* End ../ext/misc/uint.c ********************/
4504/************************* Begin ../ext/misc/decimal.c ******************/
4505/*
4506** 2020-06-22
4507**
4508** The author disclaims copyright to this source code.  In place of
4509** a legal notice, here is a blessing:
4510**
4511**    May you do good and not evil.
4512**    May you find forgiveness for yourself and forgive others.
4513**    May you share freely, never taking more than you give.
4514**
4515******************************************************************************
4516**
4517** Routines to implement arbitrary-precision decimal math.
4518**
4519** The focus here is on simplicity and correctness, not performance.
4520*/
4521/* #include "sqlite3ext.h" */
4522SQLITE_EXTENSION_INIT1
4523#include <assert.h>
4524#include <string.h>
4525#include <ctype.h>
4526#include <stdlib.h>
4527
4528/* Mark a function parameter as unused, to suppress nuisance compiler
4529** warnings. */
4530#ifndef UNUSED_PARAMETER
4531# define UNUSED_PARAMETER(X)  (void)(X)
4532#endif
4533
4534
4535/* A decimal object */
4536typedef struct Decimal Decimal;
4537struct Decimal {
4538  char sign;        /* 0 for positive, 1 for negative */
4539  char oom;         /* True if an OOM is encountered */
4540  char isNull;      /* True if holds a NULL rather than a number */
4541  char isInit;      /* True upon initialization */
4542  int nDigit;       /* Total number of digits */
4543  int nFrac;        /* Number of digits to the right of the decimal point */
4544  signed char *a;   /* Array of digits.  Most significant first. */
4545};
4546
4547/*
4548** Release memory held by a Decimal, but do not free the object itself.
4549*/
4550static void decimal_clear(Decimal *p){
4551  sqlite3_free(p->a);
4552}
4553
4554/*
4555** Destroy a Decimal object
4556*/
4557static void decimal_free(Decimal *p){
4558  if( p ){
4559    decimal_clear(p);
4560    sqlite3_free(p);
4561  }
4562}
4563
4564/*
4565** Allocate a new Decimal object.  Initialize it to the number given
4566** by the input string.
4567*/
4568static Decimal *decimal_new(
4569  sqlite3_context *pCtx,
4570  sqlite3_value *pIn,
4571  int nAlt,
4572  const unsigned char *zAlt
4573){
4574  Decimal *p;
4575  int n, i;
4576  const unsigned char *zIn;
4577  int iExp = 0;
4578  p = sqlite3_malloc( sizeof(*p) );
4579  if( p==0 ) goto new_no_mem;
4580  p->sign = 0;
4581  p->oom = 0;
4582  p->isInit = 1;
4583  p->isNull = 0;
4584  p->nDigit = 0;
4585  p->nFrac = 0;
4586  if( zAlt ){
4587    n = nAlt,
4588    zIn = zAlt;
4589  }else{
4590    if( sqlite3_value_type(pIn)==SQLITE_NULL ){
4591      p->a = 0;
4592      p->isNull = 1;
4593      return p;
4594    }
4595    n = sqlite3_value_bytes(pIn);
4596    zIn = sqlite3_value_text(pIn);
4597  }
4598  p->a = sqlite3_malloc64( n+1 );
4599  if( p->a==0 ) goto new_no_mem;
4600  for(i=0; isspace(zIn[i]); i++){}
4601  if( zIn[i]=='-' ){
4602    p->sign = 1;
4603    i++;
4604  }else if( zIn[i]=='+' ){
4605    i++;
4606  }
4607  while( i<n && zIn[i]=='0' ) i++;
4608  while( i<n ){
4609    char c = zIn[i];
4610    if( c>='0' && c<='9' ){
4611      p->a[p->nDigit++] = c - '0';
4612    }else if( c=='.' ){
4613      p->nFrac = p->nDigit + 1;
4614    }else if( c=='e' || c=='E' ){
4615      int j = i+1;
4616      int neg = 0;
4617      if( j>=n ) break;
4618      if( zIn[j]=='-' ){
4619        neg = 1;
4620        j++;
4621      }else if( zIn[j]=='+' ){
4622        j++;
4623      }
4624      while( j<n && iExp<1000000 ){
4625        if( zIn[j]>='0' && zIn[j]<='9' ){
4626          iExp = iExp*10 + zIn[j] - '0';
4627        }
4628        j++;
4629      }
4630      if( neg ) iExp = -iExp;
4631      break;
4632    }
4633    i++;
4634  }
4635  if( p->nFrac ){
4636    p->nFrac = p->nDigit - (p->nFrac - 1);
4637  }
4638  if( iExp>0 ){
4639    if( p->nFrac>0 ){
4640      if( iExp<=p->nFrac ){
4641        p->nFrac -= iExp;
4642        iExp = 0;
4643      }else{
4644        iExp -= p->nFrac;
4645        p->nFrac = 0;
4646      }
4647    }
4648    if( iExp>0 ){
4649      p->a = sqlite3_realloc64(p->a, p->nDigit + iExp + 1 );
4650      if( p->a==0 ) goto new_no_mem;
4651      memset(p->a+p->nDigit, 0, iExp);
4652      p->nDigit += iExp;
4653    }
4654  }else if( iExp<0 ){
4655    int nExtra;
4656    iExp = -iExp;
4657    nExtra = p->nDigit - p->nFrac - 1;
4658    if( nExtra ){
4659      if( nExtra>=iExp ){
4660        p->nFrac += iExp;
4661        iExp  = 0;
4662      }else{
4663        iExp -= nExtra;
4664        p->nFrac = p->nDigit - 1;
4665      }
4666    }
4667    if( iExp>0 ){
4668      p->a = sqlite3_realloc64(p->a, p->nDigit + iExp + 1 );
4669      if( p->a==0 ) goto new_no_mem;
4670      memmove(p->a+iExp, p->a, p->nDigit);
4671      memset(p->a, 0, iExp);
4672      p->nDigit += iExp;
4673      p->nFrac += iExp;
4674    }
4675  }
4676  return p;
4677
4678new_no_mem:
4679  if( pCtx ) sqlite3_result_error_nomem(pCtx);
4680  sqlite3_free(p);
4681  return 0;
4682}
4683
4684/*
4685** Make the given Decimal the result.
4686*/
4687static void decimal_result(sqlite3_context *pCtx, Decimal *p){
4688  char *z;
4689  int i, j;
4690  int n;
4691  if( p==0 || p->oom ){
4692    sqlite3_result_error_nomem(pCtx);
4693    return;
4694  }
4695  if( p->isNull ){
4696    sqlite3_result_null(pCtx);
4697    return;
4698  }
4699  z = sqlite3_malloc( p->nDigit+4 );
4700  if( z==0 ){
4701    sqlite3_result_error_nomem(pCtx);
4702    return;
4703  }
4704  i = 0;
4705  if( p->nDigit==0 || (p->nDigit==1 && p->a[0]==0) ){
4706    p->sign = 0;
4707  }
4708  if( p->sign ){
4709    z[0] = '-';
4710    i = 1;
4711  }
4712  n = p->nDigit - p->nFrac;
4713  if( n<=0 ){
4714    z[i++] = '0';
4715  }
4716  j = 0;
4717  while( n>1 && p->a[j]==0 ){
4718    j++;
4719    n--;
4720  }
4721  while( n>0  ){
4722    z[i++] = p->a[j] + '0';
4723    j++;
4724    n--;
4725  }
4726  if( p->nFrac ){
4727    z[i++] = '.';
4728    do{
4729      z[i++] = p->a[j] + '0';
4730      j++;
4731    }while( j<p->nDigit );
4732  }
4733  z[i] = 0;
4734  sqlite3_result_text(pCtx, z, i, sqlite3_free);
4735}
4736
4737/*
4738** SQL Function:   decimal(X)
4739**
4740** Convert input X into decimal and then back into text
4741*/
4742static void decimalFunc(
4743  sqlite3_context *context,
4744  int argc,
4745  sqlite3_value **argv
4746){
4747  Decimal *p = decimal_new(context, argv[0], 0, 0);
4748  UNUSED_PARAMETER(argc);
4749  decimal_result(context, p);
4750  decimal_free(p);
4751}
4752
4753/*
4754** Compare to Decimal objects.  Return negative, 0, or positive if the
4755** first object is less than, equal to, or greater than the second.
4756**
4757** Preconditions for this routine:
4758**
4759**    pA!=0
4760**    pA->isNull==0
4761**    pB!=0
4762**    pB->isNull==0
4763*/
4764static int decimal_cmp(const Decimal *pA, const Decimal *pB){
4765  int nASig, nBSig, rc, n;
4766  if( pA->sign!=pB->sign ){
4767    return pA->sign ? -1 : +1;
4768  }
4769  if( pA->sign ){
4770    const Decimal *pTemp = pA;
4771    pA = pB;
4772    pB = pTemp;
4773  }
4774  nASig = pA->nDigit - pA->nFrac;
4775  nBSig = pB->nDigit - pB->nFrac;
4776  if( nASig!=nBSig ){
4777    return nASig - nBSig;
4778  }
4779  n = pA->nDigit;
4780  if( n>pB->nDigit ) n = pB->nDigit;
4781  rc = memcmp(pA->a, pB->a, n);
4782  if( rc==0 ){
4783    rc = pA->nDigit - pB->nDigit;
4784  }
4785  return rc;
4786}
4787
4788/*
4789** SQL Function:   decimal_cmp(X, Y)
4790**
4791** Return negative, zero, or positive if X is less then, equal to, or
4792** greater than Y.
4793*/
4794static void decimalCmpFunc(
4795  sqlite3_context *context,
4796  int argc,
4797  sqlite3_value **argv
4798){
4799  Decimal *pA = 0, *pB = 0;
4800  int rc;
4801
4802  UNUSED_PARAMETER(argc);
4803  pA = decimal_new(context, argv[0], 0, 0);
4804  if( pA==0 || pA->isNull ) goto cmp_done;
4805  pB = decimal_new(context, argv[1], 0, 0);
4806  if( pB==0 || pB->isNull ) goto cmp_done;
4807  rc = decimal_cmp(pA, pB);
4808  if( rc<0 ) rc = -1;
4809  else if( rc>0 ) rc = +1;
4810  sqlite3_result_int(context, rc);
4811cmp_done:
4812  decimal_free(pA);
4813  decimal_free(pB);
4814}
4815
4816/*
4817** Expand the Decimal so that it has a least nDigit digits and nFrac
4818** digits to the right of the decimal point.
4819*/
4820static void decimal_expand(Decimal *p, int nDigit, int nFrac){
4821  int nAddSig;
4822  int nAddFrac;
4823  if( p==0 ) return;
4824  nAddFrac = nFrac - p->nFrac;
4825  nAddSig = (nDigit - p->nDigit) - nAddFrac;
4826  if( nAddFrac==0 && nAddSig==0 ) return;
4827  p->a = sqlite3_realloc64(p->a, nDigit+1);
4828  if( p->a==0 ){
4829    p->oom = 1;
4830    return;
4831  }
4832  if( nAddSig ){
4833    memmove(p->a+nAddSig, p->a, p->nDigit);
4834    memset(p->a, 0, nAddSig);
4835    p->nDigit += nAddSig;
4836  }
4837  if( nAddFrac ){
4838    memset(p->a+p->nDigit, 0, nAddFrac);
4839    p->nDigit += nAddFrac;
4840    p->nFrac += nAddFrac;
4841  }
4842}
4843
4844/*
4845** Add the value pB into pA.
4846**
4847** Both pA and pB might become denormalized by this routine.
4848*/
4849static void decimal_add(Decimal *pA, Decimal *pB){
4850  int nSig, nFrac, nDigit;
4851  int i, rc;
4852  if( pA==0 ){
4853    return;
4854  }
4855  if( pA->oom || pB==0 || pB->oom ){
4856    pA->oom = 1;
4857    return;
4858  }
4859  if( pA->isNull || pB->isNull ){
4860    pA->isNull = 1;
4861    return;
4862  }
4863  nSig = pA->nDigit - pA->nFrac;
4864  if( nSig && pA->a[0]==0 ) nSig--;
4865  if( nSig<pB->nDigit-pB->nFrac ){
4866    nSig = pB->nDigit - pB->nFrac;
4867  }
4868  nFrac = pA->nFrac;
4869  if( nFrac<pB->nFrac ) nFrac = pB->nFrac;
4870  nDigit = nSig + nFrac + 1;
4871  decimal_expand(pA, nDigit, nFrac);
4872  decimal_expand(pB, nDigit, nFrac);
4873  if( pA->oom || pB->oom ){
4874    pA->oom = 1;
4875  }else{
4876    if( pA->sign==pB->sign ){
4877      int carry = 0;
4878      for(i=nDigit-1; i>=0; i--){
4879        int x = pA->a[i] + pB->a[i] + carry;
4880        if( x>=10 ){
4881          carry = 1;
4882          pA->a[i] = x - 10;
4883        }else{
4884          carry = 0;
4885          pA->a[i] = x;
4886        }
4887      }
4888    }else{
4889      signed char *aA, *aB;
4890      int borrow = 0;
4891      rc = memcmp(pA->a, pB->a, nDigit);
4892      if( rc<0 ){
4893        aA = pB->a;
4894        aB = pA->a;
4895        pA->sign = !pA->sign;
4896      }else{
4897        aA = pA->a;
4898        aB = pB->a;
4899      }
4900      for(i=nDigit-1; i>=0; i--){
4901        int x = aA[i] - aB[i] - borrow;
4902        if( x<0 ){
4903          pA->a[i] = x+10;
4904          borrow = 1;
4905        }else{
4906          pA->a[i] = x;
4907          borrow = 0;
4908        }
4909      }
4910    }
4911  }
4912}
4913
4914/*
4915** Compare text in decimal order.
4916*/
4917static int decimalCollFunc(
4918  void *notUsed,
4919  int nKey1, const void *pKey1,
4920  int nKey2, const void *pKey2
4921){
4922  const unsigned char *zA = (const unsigned char*)pKey1;
4923  const unsigned char *zB = (const unsigned char*)pKey2;
4924  Decimal *pA = decimal_new(0, 0, nKey1, zA);
4925  Decimal *pB = decimal_new(0, 0, nKey2, zB);
4926  int rc;
4927  UNUSED_PARAMETER(notUsed);
4928  if( pA==0 || pB==0 ){
4929    rc = 0;
4930  }else{
4931    rc = decimal_cmp(pA, pB);
4932  }
4933  decimal_free(pA);
4934  decimal_free(pB);
4935  return rc;
4936}
4937
4938
4939/*
4940** SQL Function:   decimal_add(X, Y)
4941**                 decimal_sub(X, Y)
4942**
4943** Return the sum or difference of X and Y.
4944*/
4945static void decimalAddFunc(
4946  sqlite3_context *context,
4947  int argc,
4948  sqlite3_value **argv
4949){
4950  Decimal *pA = decimal_new(context, argv[0], 0, 0);
4951  Decimal *pB = decimal_new(context, argv[1], 0, 0);
4952  UNUSED_PARAMETER(argc);
4953  decimal_add(pA, pB);
4954  decimal_result(context, pA);
4955  decimal_free(pA);
4956  decimal_free(pB);
4957}
4958static void decimalSubFunc(
4959  sqlite3_context *context,
4960  int argc,
4961  sqlite3_value **argv
4962){
4963  Decimal *pA = decimal_new(context, argv[0], 0, 0);
4964  Decimal *pB = decimal_new(context, argv[1], 0, 0);
4965  UNUSED_PARAMETER(argc);
4966  if( pB==0 ) return;
4967  pB->sign = !pB->sign;
4968  decimal_add(pA, pB);
4969  decimal_result(context, pA);
4970  decimal_free(pA);
4971  decimal_free(pB);
4972}
4973
4974/* Aggregate funcion:   decimal_sum(X)
4975**
4976** Works like sum() except that it uses decimal arithmetic for unlimited
4977** precision.
4978*/
4979static void decimalSumStep(
4980  sqlite3_context *context,
4981  int argc,
4982  sqlite3_value **argv
4983){
4984  Decimal *p;
4985  Decimal *pArg;
4986  UNUSED_PARAMETER(argc);
4987  p = sqlite3_aggregate_context(context, sizeof(*p));
4988  if( p==0 ) return;
4989  if( !p->isInit ){
4990    p->isInit = 1;
4991    p->a = sqlite3_malloc(2);
4992    if( p->a==0 ){
4993      p->oom = 1;
4994    }else{
4995      p->a[0] = 0;
4996    }
4997    p->nDigit = 1;
4998    p->nFrac = 0;
4999  }
5000  if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
5001  pArg = decimal_new(context, argv[0], 0, 0);
5002  decimal_add(p, pArg);
5003  decimal_free(pArg);
5004}
5005static void decimalSumInverse(
5006  sqlite3_context *context,
5007  int argc,
5008  sqlite3_value **argv
5009){
5010  Decimal *p;
5011  Decimal *pArg;
5012  UNUSED_PARAMETER(argc);
5013  p = sqlite3_aggregate_context(context, sizeof(*p));
5014  if( p==0 ) return;
5015  if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
5016  pArg = decimal_new(context, argv[0], 0, 0);
5017  if( pArg ) pArg->sign = !pArg->sign;
5018  decimal_add(p, pArg);
5019  decimal_free(pArg);
5020}
5021static void decimalSumValue(sqlite3_context *context){
5022  Decimal *p = sqlite3_aggregate_context(context, 0);
5023  if( p==0 ) return;
5024  decimal_result(context, p);
5025}
5026static void decimalSumFinalize(sqlite3_context *context){
5027  Decimal *p = sqlite3_aggregate_context(context, 0);
5028  if( p==0 ) return;
5029  decimal_result(context, p);
5030  decimal_clear(p);
5031}
5032
5033/*
5034** SQL Function:   decimal_mul(X, Y)
5035**
5036** Return the product of X and Y.
5037**
5038** All significant digits after the decimal point are retained.
5039** Trailing zeros after the decimal point are omitted as long as
5040** the number of digits after the decimal point is no less than
5041** either the number of digits in either input.
5042*/
5043static void decimalMulFunc(
5044  sqlite3_context *context,
5045  int argc,
5046  sqlite3_value **argv
5047){
5048  Decimal *pA = decimal_new(context, argv[0], 0, 0);
5049  Decimal *pB = decimal_new(context, argv[1], 0, 0);
5050  signed char *acc = 0;
5051  int i, j, k;
5052  int minFrac;
5053  UNUSED_PARAMETER(argc);
5054  if( pA==0 || pA->oom || pA->isNull
5055   || pB==0 || pB->oom || pB->isNull
5056  ){
5057    goto mul_end;
5058  }
5059  acc = sqlite3_malloc64( pA->nDigit + pB->nDigit + 2 );
5060  if( acc==0 ){
5061    sqlite3_result_error_nomem(context);
5062    goto mul_end;
5063  }
5064  memset(acc, 0, pA->nDigit + pB->nDigit + 2);
5065  minFrac = pA->nFrac;
5066  if( pB->nFrac<minFrac ) minFrac = pB->nFrac;
5067  for(i=pA->nDigit-1; i>=0; i--){
5068    signed char f = pA->a[i];
5069    int carry = 0, x;
5070    for(j=pB->nDigit-1, k=i+j+3; j>=0; j--, k--){
5071      x = acc[k] + f*pB->a[j] + carry;
5072      acc[k] = x%10;
5073      carry = x/10;
5074    }
5075    x = acc[k] + carry;
5076    acc[k] = x%10;
5077    acc[k-1] += x/10;
5078  }
5079  sqlite3_free(pA->a);
5080  pA->a = acc;
5081  acc = 0;
5082  pA->nDigit += pB->nDigit + 2;
5083  pA->nFrac += pB->nFrac;
5084  pA->sign ^= pB->sign;
5085  while( pA->nFrac>minFrac && pA->a[pA->nDigit-1]==0 ){
5086    pA->nFrac--;
5087    pA->nDigit--;
5088  }
5089  decimal_result(context, pA);
5090
5091mul_end:
5092  sqlite3_free(acc);
5093  decimal_free(pA);
5094  decimal_free(pB);
5095}
5096
5097#ifdef _WIN32
5098
5099#endif
5100int sqlite3_decimal_init(
5101  sqlite3 *db,
5102  char **pzErrMsg,
5103  const sqlite3_api_routines *pApi
5104){
5105  int rc = SQLITE_OK;
5106  static const struct {
5107    const char *zFuncName;
5108    int nArg;
5109    void (*xFunc)(sqlite3_context*,int,sqlite3_value**);
5110  } aFunc[] = {
5111    { "decimal",       1,   decimalFunc        },
5112    { "decimal_cmp",   2,   decimalCmpFunc     },
5113    { "decimal_add",   2,   decimalAddFunc     },
5114    { "decimal_sub",   2,   decimalSubFunc     },
5115    { "decimal_mul",   2,   decimalMulFunc     },
5116  };
5117  unsigned int i;
5118  (void)pzErrMsg;  /* Unused parameter */
5119
5120  SQLITE_EXTENSION_INIT2(pApi);
5121
5122  for(i=0; i<sizeof(aFunc)/sizeof(aFunc[0]) && rc==SQLITE_OK; i++){
5123    rc = sqlite3_create_function(db, aFunc[i].zFuncName, aFunc[i].nArg,
5124                   SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC,
5125                   0, aFunc[i].xFunc, 0, 0);
5126  }
5127  if( rc==SQLITE_OK ){
5128    rc = sqlite3_create_window_function(db, "decimal_sum", 1,
5129                   SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC, 0,
5130                   decimalSumStep, decimalSumFinalize,
5131                   decimalSumValue, decimalSumInverse, 0);
5132  }
5133  if( rc==SQLITE_OK ){
5134    rc = sqlite3_create_collation(db, "decimal", SQLITE_UTF8,
5135                                  0, decimalCollFunc);
5136  }
5137  return rc;
5138}
5139
5140/************************* End ../ext/misc/decimal.c ********************/
5141/************************* Begin ../ext/misc/ieee754.c ******************/
5142/*
5143** 2013-04-17
5144**
5145** The author disclaims copyright to this source code.  In place of
5146** a legal notice, here is a blessing:
5147**
5148**    May you do good and not evil.
5149**    May you find forgiveness for yourself and forgive others.
5150**    May you share freely, never taking more than you give.
5151**
5152******************************************************************************
5153**
5154** This SQLite extension implements functions for the exact display
5155** and input of IEEE754 Binary64 floating-point numbers.
5156**
5157**   ieee754(X)
5158**   ieee754(Y,Z)
5159**
5160** In the first form, the value X should be a floating-point number.
5161** The function will return a string of the form 'ieee754(Y,Z)' where
5162** Y and Z are integers such that X==Y*pow(2,Z).
5163**
5164** In the second form, Y and Z are integers which are the mantissa and
5165** base-2 exponent of a new floating point number.  The function returns
5166** a floating-point value equal to Y*pow(2,Z).
5167**
5168** Examples:
5169**
5170**     ieee754(2.0)             ->     'ieee754(2,0)'
5171**     ieee754(45.25)           ->     'ieee754(181,-2)'
5172**     ieee754(2, 0)            ->     2.0
5173**     ieee754(181, -2)         ->     45.25
5174**
5175** Two additional functions break apart the one-argument ieee754()
5176** result into separate integer values:
5177**
5178**     ieee754_mantissa(45.25)  ->     181
5179**     ieee754_exponent(45.25)  ->     -2
5180**
5181** These functions convert binary64 numbers into blobs and back again.
5182**
5183**     ieee754_from_blob(x'3ff0000000000000')  ->  1.0
5184**     ieee754_to_blob(1.0)                    ->  x'3ff0000000000000'
5185**
5186** In all single-argument functions, if the argument is an 8-byte blob
5187** then that blob is interpreted as a big-endian binary64 value.
5188**
5189**
5190** EXACT DECIMAL REPRESENTATION OF BINARY64 VALUES
5191** -----------------------------------------------
5192**
5193** This extension in combination with the separate 'decimal' extension
5194** can be used to compute the exact decimal representation of binary64
5195** values.  To begin, first compute a table of exponent values:
5196**
5197**    CREATE TABLE pow2(x INTEGER PRIMARY KEY, v TEXT);
5198**    WITH RECURSIVE c(x,v) AS (
5199**      VALUES(0,'1')
5200**      UNION ALL
5201**      SELECT x+1, decimal_mul(v,'2') FROM c WHERE x+1<=971
5202**    ) INSERT INTO pow2(x,v) SELECT x, v FROM c;
5203**    WITH RECURSIVE c(x,v) AS (
5204**      VALUES(-1,'0.5')
5205**      UNION ALL
5206**      SELECT x-1, decimal_mul(v,'0.5') FROM c WHERE x-1>=-1075
5207**    ) INSERT INTO pow2(x,v) SELECT x, v FROM c;
5208**
5209** Then, to compute the exact decimal representation of a floating
5210** point value (the value 47.49 is used in the example) do:
5211**
5212**    WITH c(n) AS (VALUES(47.49))
5213**          ---------------^^^^^---- Replace with whatever you want
5214**    SELECT decimal_mul(ieee754_mantissa(c.n),pow2.v)
5215**      FROM pow2, c WHERE pow2.x=ieee754_exponent(c.n);
5216**
5217** Here is a query to show various boundry values for the binary64
5218** number format:
5219**
5220**    WITH c(name,bin) AS (VALUES
5221**       ('minimum positive value',        x'0000000000000001'),
5222**       ('maximum subnormal value',       x'000fffffffffffff'),
5223**       ('mininum positive nornal value', x'0010000000000000'),
5224**       ('maximum value',                 x'7fefffffffffffff'))
5225**    SELECT c.name, decimal_mul(ieee754_mantissa(c.bin),pow2.v)
5226**      FROM pow2, c WHERE pow2.x=ieee754_exponent(c.bin);
5227**
5228*/
5229/* #include "sqlite3ext.h" */
5230SQLITE_EXTENSION_INIT1
5231#include <assert.h>
5232#include <string.h>
5233
5234/* Mark a function parameter as unused, to suppress nuisance compiler
5235** warnings. */
5236#ifndef UNUSED_PARAMETER
5237# define UNUSED_PARAMETER(X)  (void)(X)
5238#endif
5239
5240/*
5241** Implementation of the ieee754() function
5242*/
5243static void ieee754func(
5244  sqlite3_context *context,
5245  int argc,
5246  sqlite3_value **argv
5247){
5248  if( argc==1 ){
5249    sqlite3_int64 m, a;
5250    double r;
5251    int e;
5252    int isNeg;
5253    char zResult[100];
5254    assert( sizeof(m)==sizeof(r) );
5255    if( sqlite3_value_type(argv[0])==SQLITE_BLOB
5256     && sqlite3_value_bytes(argv[0])==sizeof(r)
5257    ){
5258      const unsigned char *x = sqlite3_value_blob(argv[0]);
5259      unsigned int i;
5260      sqlite3_uint64 v = 0;
5261      for(i=0; i<sizeof(r); i++){
5262        v = (v<<8) | x[i];
5263      }
5264      memcpy(&r, &v, sizeof(r));
5265    }else{
5266      r = sqlite3_value_double(argv[0]);
5267    }
5268    if( r<0.0 ){
5269      isNeg = 1;
5270      r = -r;
5271    }else{
5272      isNeg = 0;
5273    }
5274    memcpy(&a,&r,sizeof(a));
5275    if( a==0 ){
5276      e = 0;
5277      m = 0;
5278    }else{
5279      e = a>>52;
5280      m = a & ((((sqlite3_int64)1)<<52)-1);
5281      if( e==0 ){
5282        m <<= 1;
5283      }else{
5284        m |= ((sqlite3_int64)1)<<52;
5285      }
5286      while( e<1075 && m>0 && (m&1)==0 ){
5287        m >>= 1;
5288        e++;
5289      }
5290      if( isNeg ) m = -m;
5291    }
5292    switch( *(int*)sqlite3_user_data(context) ){
5293      case 0:
5294        sqlite3_snprintf(sizeof(zResult), zResult, "ieee754(%lld,%d)",
5295                         m, e-1075);
5296        sqlite3_result_text(context, zResult, -1, SQLITE_TRANSIENT);
5297        break;
5298      case 1:
5299        sqlite3_result_int64(context, m);
5300        break;
5301      case 2:
5302        sqlite3_result_int(context, e-1075);
5303        break;
5304    }
5305  }else{
5306    sqlite3_int64 m, e, a;
5307    double r;
5308    int isNeg = 0;
5309    m = sqlite3_value_int64(argv[0]);
5310    e = sqlite3_value_int64(argv[1]);
5311
5312    /* Limit the range of e.  Ticket 22dea1cfdb9151e4 2021-03-02 */
5313    if( e>10000 ){
5314      e = 10000;
5315    }else if( e<-10000 ){
5316      e = -10000;
5317    }
5318
5319    if( m<0 ){
5320      isNeg = 1;
5321      m = -m;
5322      if( m<0 ) return;
5323    }else if( m==0 && e>-1000 && e<1000 ){
5324      sqlite3_result_double(context, 0.0);
5325      return;
5326    }
5327    while( (m>>32)&0xffe00000 ){
5328      m >>= 1;
5329      e++;
5330    }
5331    while( m!=0 && ((m>>32)&0xfff00000)==0 ){
5332      m <<= 1;
5333      e--;
5334    }
5335    e += 1075;
5336    if( e<=0 ){
5337      /* Subnormal */
5338      m >>= 1-e;
5339      e = 0;
5340    }else if( e>0x7ff ){
5341      e = 0x7ff;
5342    }
5343    a = m & ((((sqlite3_int64)1)<<52)-1);
5344    a |= e<<52;
5345    if( isNeg ) a |= ((sqlite3_uint64)1)<<63;
5346    memcpy(&r, &a, sizeof(r));
5347    sqlite3_result_double(context, r);
5348  }
5349}
5350
5351/*
5352** Functions to convert between blobs and floats.
5353*/
5354static void ieee754func_from_blob(
5355  sqlite3_context *context,
5356  int argc,
5357  sqlite3_value **argv
5358){
5359  UNUSED_PARAMETER(argc);
5360  if( sqlite3_value_type(argv[0])==SQLITE_BLOB
5361   && sqlite3_value_bytes(argv[0])==sizeof(double)
5362  ){
5363    double r;
5364    const unsigned char *x = sqlite3_value_blob(argv[0]);
5365    unsigned int i;
5366    sqlite3_uint64 v = 0;
5367    for(i=0; i<sizeof(r); i++){
5368      v = (v<<8) | x[i];
5369    }
5370    memcpy(&r, &v, sizeof(r));
5371    sqlite3_result_double(context, r);
5372  }
5373}
5374static void ieee754func_to_blob(
5375  sqlite3_context *context,
5376  int argc,
5377  sqlite3_value **argv
5378){
5379  UNUSED_PARAMETER(argc);
5380  if( sqlite3_value_type(argv[0])==SQLITE_FLOAT
5381   || sqlite3_value_type(argv[0])==SQLITE_INTEGER
5382  ){
5383    double r = sqlite3_value_double(argv[0]);
5384    sqlite3_uint64 v;
5385    unsigned char a[sizeof(r)];
5386    unsigned int i;
5387    memcpy(&v, &r, sizeof(r));
5388    for(i=1; i<=sizeof(r); i++){
5389      a[sizeof(r)-i] = v&0xff;
5390      v >>= 8;
5391    }
5392    sqlite3_result_blob(context, a, sizeof(r), SQLITE_TRANSIENT);
5393  }
5394}
5395
5396
5397#ifdef _WIN32
5398
5399#endif
5400int sqlite3_ieee_init(
5401  sqlite3 *db,
5402  char **pzErrMsg,
5403  const sqlite3_api_routines *pApi
5404){
5405  static const struct {
5406    char *zFName;
5407    int nArg;
5408    int iAux;
5409    void (*xFunc)(sqlite3_context*,int,sqlite3_value**);
5410  } aFunc[] = {
5411    { "ieee754",           1,   0, ieee754func },
5412    { "ieee754",           2,   0, ieee754func },
5413    { "ieee754_mantissa",  1,   1, ieee754func },
5414    { "ieee754_exponent",  1,   2, ieee754func },
5415    { "ieee754_to_blob",   1,   0, ieee754func_to_blob },
5416    { "ieee754_from_blob", 1,   0, ieee754func_from_blob },
5417
5418  };
5419  unsigned int i;
5420  int rc = SQLITE_OK;
5421  SQLITE_EXTENSION_INIT2(pApi);
5422  (void)pzErrMsg;  /* Unused parameter */
5423  for(i=0; i<sizeof(aFunc)/sizeof(aFunc[0]) && rc==SQLITE_OK; i++){
5424    rc = sqlite3_create_function(db, aFunc[i].zFName, aFunc[i].nArg,
5425                               SQLITE_UTF8|SQLITE_INNOCUOUS,
5426                               (void*)&aFunc[i].iAux,
5427                               aFunc[i].xFunc, 0, 0);
5428  }
5429  return rc;
5430}
5431
5432/************************* End ../ext/misc/ieee754.c ********************/
5433/************************* Begin ../ext/misc/series.c ******************/
5434/*
5435** 2015-08-18
5436**
5437** The author disclaims copyright to this source code.  In place of
5438** a legal notice, here is a blessing:
5439**
5440**    May you do good and not evil.
5441**    May you find forgiveness for yourself and forgive others.
5442**    May you share freely, never taking more than you give.
5443**
5444*************************************************************************
5445**
5446** This file demonstrates how to create a table-valued-function using
5447** a virtual table.  This demo implements the generate_series() function
5448** which gives similar results to the eponymous function in PostgreSQL.
5449** Examples:
5450**
5451**      SELECT * FROM generate_series(0,100,5);
5452**
5453** The query above returns integers from 0 through 100 counting by steps
5454** of 5.
5455**
5456**      SELECT * FROM generate_series(0,100);
5457**
5458** Integers from 0 through 100 with a step size of 1.
5459**
5460**      SELECT * FROM generate_series(20) LIMIT 10;
5461**
5462** Integers 20 through 29.
5463**
5464** HOW IT WORKS
5465**
5466** The generate_series "function" is really a virtual table with the
5467** following schema:
5468**
5469**     CREATE TABLE generate_series(
5470**       value,
5471**       start HIDDEN,
5472**       stop HIDDEN,
5473**       step HIDDEN
5474**     );
5475**
5476** Function arguments in queries against this virtual table are translated
5477** into equality constraints against successive hidden columns.  In other
5478** words, the following pairs of queries are equivalent to each other:
5479**
5480**    SELECT * FROM generate_series(0,100,5);
5481**    SELECT * FROM generate_series WHERE start=0 AND stop=100 AND step=5;
5482**
5483**    SELECT * FROM generate_series(0,100);
5484**    SELECT * FROM generate_series WHERE start=0 AND stop=100;
5485**
5486**    SELECT * FROM generate_series(20) LIMIT 10;
5487**    SELECT * FROM generate_series WHERE start=20 LIMIT 10;
5488**
5489** The generate_series virtual table implementation leaves the xCreate method
5490** set to NULL.  This means that it is not possible to do a CREATE VIRTUAL
5491** TABLE command with "generate_series" as the USING argument.  Instead, there
5492** is a single generate_series virtual table that is always available without
5493** having to be created first.
5494**
5495** The xBestIndex method looks for equality constraints against the hidden
5496** start, stop, and step columns, and if present, it uses those constraints
5497** to bound the sequence of generated values.  If the equality constraints
5498** are missing, it uses 0 for start, 4294967295 for stop, and 1 for step.
5499** xBestIndex returns a small cost when both start and stop are available,
5500** and a very large cost if either start or stop are unavailable.  This
5501** encourages the query planner to order joins such that the bounds of the
5502** series are well-defined.
5503*/
5504/* #include "sqlite3ext.h" */
5505SQLITE_EXTENSION_INIT1
5506#include <assert.h>
5507#include <string.h>
5508
5509#ifndef SQLITE_OMIT_VIRTUALTABLE
5510
5511
5512/* series_cursor is a subclass of sqlite3_vtab_cursor which will
5513** serve as the underlying representation of a cursor that scans
5514** over rows of the result
5515*/
5516typedef struct series_cursor series_cursor;
5517struct series_cursor {
5518  sqlite3_vtab_cursor base;  /* Base class - must be first */
5519  int isDesc;                /* True to count down rather than up */
5520  sqlite3_int64 iRowid;      /* The rowid */
5521  sqlite3_int64 iValue;      /* Current value ("value") */
5522  sqlite3_int64 mnValue;     /* Mimimum value ("start") */
5523  sqlite3_int64 mxValue;     /* Maximum value ("stop") */
5524  sqlite3_int64 iStep;       /* Increment ("step") */
5525};
5526
5527/*
5528** The seriesConnect() method is invoked to create a new
5529** series_vtab that describes the generate_series virtual table.
5530**
5531** Think of this routine as the constructor for series_vtab objects.
5532**
5533** All this routine needs to do is:
5534**
5535**    (1) Allocate the series_vtab object and initialize all fields.
5536**
5537**    (2) Tell SQLite (via the sqlite3_declare_vtab() interface) what the
5538**        result set of queries against generate_series will look like.
5539*/
5540static int seriesConnect(
5541  sqlite3 *db,
5542  void *pUnused,
5543  int argcUnused, const char *const*argvUnused,
5544  sqlite3_vtab **ppVtab,
5545  char **pzErrUnused
5546){
5547  sqlite3_vtab *pNew;
5548  int rc;
5549
5550/* Column numbers */
5551#define SERIES_COLUMN_VALUE 0
5552#define SERIES_COLUMN_START 1
5553#define SERIES_COLUMN_STOP  2
5554#define SERIES_COLUMN_STEP  3
5555
5556  (void)pUnused;
5557  (void)argcUnused;
5558  (void)argvUnused;
5559  (void)pzErrUnused;
5560  rc = sqlite3_declare_vtab(db,
5561     "CREATE TABLE x(value,start hidden,stop hidden,step hidden)");
5562  if( rc==SQLITE_OK ){
5563    pNew = *ppVtab = sqlite3_malloc( sizeof(*pNew) );
5564    if( pNew==0 ) return SQLITE_NOMEM;
5565    memset(pNew, 0, sizeof(*pNew));
5566    sqlite3_vtab_config(db, SQLITE_VTAB_INNOCUOUS);
5567  }
5568  return rc;
5569}
5570
5571/*
5572** This method is the destructor for series_cursor objects.
5573*/
5574static int seriesDisconnect(sqlite3_vtab *pVtab){
5575  sqlite3_free(pVtab);
5576  return SQLITE_OK;
5577}
5578
5579/*
5580** Constructor for a new series_cursor object.
5581*/
5582static int seriesOpen(sqlite3_vtab *pUnused, sqlite3_vtab_cursor **ppCursor){
5583  series_cursor *pCur;
5584  (void)pUnused;
5585  pCur = sqlite3_malloc( sizeof(*pCur) );
5586  if( pCur==0 ) return SQLITE_NOMEM;
5587  memset(pCur, 0, sizeof(*pCur));
5588  *ppCursor = &pCur->base;
5589  return SQLITE_OK;
5590}
5591
5592/*
5593** Destructor for a series_cursor.
5594*/
5595static int seriesClose(sqlite3_vtab_cursor *cur){
5596  sqlite3_free(cur);
5597  return SQLITE_OK;
5598}
5599
5600
5601/*
5602** Advance a series_cursor to its next row of output.
5603*/
5604static int seriesNext(sqlite3_vtab_cursor *cur){
5605  series_cursor *pCur = (series_cursor*)cur;
5606  if( pCur->isDesc ){
5607    pCur->iValue -= pCur->iStep;
5608  }else{
5609    pCur->iValue += pCur->iStep;
5610  }
5611  pCur->iRowid++;
5612  return SQLITE_OK;
5613}
5614
5615/*
5616** Return values of columns for the row at which the series_cursor
5617** is currently pointing.
5618*/
5619static int seriesColumn(
5620  sqlite3_vtab_cursor *cur,   /* The cursor */
5621  sqlite3_context *ctx,       /* First argument to sqlite3_result_...() */
5622  int i                       /* Which column to return */
5623){
5624  series_cursor *pCur = (series_cursor*)cur;
5625  sqlite3_int64 x = 0;
5626  switch( i ){
5627    case SERIES_COLUMN_START:  x = pCur->mnValue; break;
5628    case SERIES_COLUMN_STOP:   x = pCur->mxValue; break;
5629    case SERIES_COLUMN_STEP:   x = pCur->iStep;   break;
5630    default:                   x = pCur->iValue;  break;
5631  }
5632  sqlite3_result_int64(ctx, x);
5633  return SQLITE_OK;
5634}
5635
5636/*
5637** Return the rowid for the current row. In this implementation, the
5638** first row returned is assigned rowid value 1, and each subsequent
5639** row a value 1 more than that of the previous.
5640*/
5641static int seriesRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
5642  series_cursor *pCur = (series_cursor*)cur;
5643  *pRowid = pCur->iRowid;
5644  return SQLITE_OK;
5645}
5646
5647/*
5648** Return TRUE if the cursor has been moved off of the last
5649** row of output.
5650*/
5651static int seriesEof(sqlite3_vtab_cursor *cur){
5652  series_cursor *pCur = (series_cursor*)cur;
5653  if( pCur->isDesc ){
5654    return pCur->iValue < pCur->mnValue;
5655  }else{
5656    return pCur->iValue > pCur->mxValue;
5657  }
5658}
5659
5660/* True to cause run-time checking of the start=, stop=, and/or step=
5661** parameters.  The only reason to do this is for testing the
5662** constraint checking logic for virtual tables in the SQLite core.
5663*/
5664#ifndef SQLITE_SERIES_CONSTRAINT_VERIFY
5665# define SQLITE_SERIES_CONSTRAINT_VERIFY 0
5666#endif
5667
5668/*
5669** This method is called to "rewind" the series_cursor object back
5670** to the first row of output.  This method is always called at least
5671** once prior to any call to seriesColumn() or seriesRowid() or
5672** seriesEof().
5673**
5674** The query plan selected by seriesBestIndex is passed in the idxNum
5675** parameter.  (idxStr is not used in this implementation.)  idxNum
5676** is a bitmask showing which constraints are available:
5677**
5678**    1:    start=VALUE
5679**    2:    stop=VALUE
5680**    4:    step=VALUE
5681**
5682** Also, if bit 8 is set, that means that the series should be output
5683** in descending order rather than in ascending order.  If bit 16 is
5684** set, then output must appear in ascending order.
5685**
5686** This routine should initialize the cursor and position it so that it
5687** is pointing at the first row, or pointing off the end of the table
5688** (so that seriesEof() will return true) if the table is empty.
5689*/
5690static int seriesFilter(
5691  sqlite3_vtab_cursor *pVtabCursor,
5692  int idxNum, const char *idxStrUnused,
5693  int argc, sqlite3_value **argv
5694){
5695  series_cursor *pCur = (series_cursor *)pVtabCursor;
5696  int i = 0;
5697  (void)idxStrUnused;
5698  if( idxNum & 1 ){
5699    pCur->mnValue = sqlite3_value_int64(argv[i++]);
5700  }else{
5701    pCur->mnValue = 0;
5702  }
5703  if( idxNum & 2 ){
5704    pCur->mxValue = sqlite3_value_int64(argv[i++]);
5705  }else{
5706    pCur->mxValue = 0xffffffff;
5707  }
5708  if( idxNum & 4 ){
5709    pCur->iStep = sqlite3_value_int64(argv[i++]);
5710    if( pCur->iStep==0 ){
5711      pCur->iStep = 1;
5712    }else if( pCur->iStep<0 ){
5713      pCur->iStep = -pCur->iStep;
5714      if( (idxNum & 16)==0 ) idxNum |= 8;
5715    }
5716  }else{
5717    pCur->iStep = 1;
5718  }
5719  for(i=0; i<argc; i++){
5720    if( sqlite3_value_type(argv[i])==SQLITE_NULL ){
5721      /* If any of the constraints have a NULL value, then return no rows.
5722      ** See ticket https://www.sqlite.org/src/info/fac496b61722daf2 */
5723      pCur->mnValue = 1;
5724      pCur->mxValue = 0;
5725      break;
5726    }
5727  }
5728  if( idxNum & 8 ){
5729    pCur->isDesc = 1;
5730    pCur->iValue = pCur->mxValue;
5731    if( pCur->iStep>0 ){
5732      pCur->iValue -= (pCur->mxValue - pCur->mnValue)%pCur->iStep;
5733    }
5734  }else{
5735    pCur->isDesc = 0;
5736    pCur->iValue = pCur->mnValue;
5737  }
5738  pCur->iRowid = 1;
5739  return SQLITE_OK;
5740}
5741
5742/*
5743** SQLite will invoke this method one or more times while planning a query
5744** that uses the generate_series virtual table.  This routine needs to create
5745** a query plan for each invocation and compute an estimated cost for that
5746** plan.
5747**
5748** In this implementation idxNum is used to represent the
5749** query plan.  idxStr is unused.
5750**
5751** The query plan is represented by bits in idxNum:
5752**
5753**  (1)  start = $value  -- constraint exists
5754**  (2)  stop = $value   -- constraint exists
5755**  (4)  step = $value   -- constraint exists
5756**  (8)  output in descending order
5757*/
5758static int seriesBestIndex(
5759  sqlite3_vtab *tabUnused,
5760  sqlite3_index_info *pIdxInfo
5761){
5762  int i, j;              /* Loop over constraints */
5763  int idxNum = 0;        /* The query plan bitmask */
5764  int unusableMask = 0;  /* Mask of unusable constraints */
5765  int nArg = 0;          /* Number of arguments that seriesFilter() expects */
5766  int aIdx[3];           /* Constraints on start, stop, and step */
5767  const struct sqlite3_index_constraint *pConstraint;
5768
5769  /* This implementation assumes that the start, stop, and step columns
5770  ** are the last three columns in the virtual table. */
5771  assert( SERIES_COLUMN_STOP == SERIES_COLUMN_START+1 );
5772  assert( SERIES_COLUMN_STEP == SERIES_COLUMN_START+2 );
5773  (void)tabUnused;
5774  aIdx[0] = aIdx[1] = aIdx[2] = -1;
5775  pConstraint = pIdxInfo->aConstraint;
5776  for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){
5777    int iCol;    /* 0 for start, 1 for stop, 2 for step */
5778    int iMask;   /* bitmask for those column */
5779    if( pConstraint->iColumn<SERIES_COLUMN_START ) continue;
5780    iCol = pConstraint->iColumn - SERIES_COLUMN_START;
5781    assert( iCol>=0 && iCol<=2 );
5782    iMask = 1 << iCol;
5783    if( pConstraint->usable==0 ){
5784      unusableMask |=  iMask;
5785      continue;
5786    }else if( pConstraint->op==SQLITE_INDEX_CONSTRAINT_EQ ){
5787      idxNum |= iMask;
5788      aIdx[iCol] = i;
5789    }
5790  }
5791  for(i=0; i<3; i++){
5792    if( (j = aIdx[i])>=0 ){
5793      pIdxInfo->aConstraintUsage[j].argvIndex = ++nArg;
5794      pIdxInfo->aConstraintUsage[j].omit = !SQLITE_SERIES_CONSTRAINT_VERIFY;
5795    }
5796  }
5797  if( (unusableMask & ~idxNum)!=0 ){
5798    /* The start, stop, and step columns are inputs.  Therefore if there
5799    ** are unusable constraints on any of start, stop, or step then
5800    ** this plan is unusable */
5801    return SQLITE_CONSTRAINT;
5802  }
5803  if( (idxNum & 3)==3 ){
5804    /* Both start= and stop= boundaries are available.  This is the
5805    ** the preferred case */
5806    pIdxInfo->estimatedCost = (double)(2 - ((idxNum&4)!=0));
5807    pIdxInfo->estimatedRows = 1000;
5808    if( pIdxInfo->nOrderBy==1 ){
5809      if( pIdxInfo->aOrderBy[0].desc ){
5810        idxNum |= 8;
5811      }else{
5812        idxNum |= 16;
5813      }
5814      pIdxInfo->orderByConsumed = 1;
5815    }
5816  }else{
5817    /* If either boundary is missing, we have to generate a huge span
5818    ** of numbers.  Make this case very expensive so that the query
5819    ** planner will work hard to avoid it. */
5820    pIdxInfo->estimatedRows = 2147483647;
5821  }
5822  pIdxInfo->idxNum = idxNum;
5823  return SQLITE_OK;
5824}
5825
5826/*
5827** This following structure defines all the methods for the
5828** generate_series virtual table.
5829*/
5830static sqlite3_module seriesModule = {
5831  0,                         /* iVersion */
5832  0,                         /* xCreate */
5833  seriesConnect,             /* xConnect */
5834  seriesBestIndex,           /* xBestIndex */
5835  seriesDisconnect,          /* xDisconnect */
5836  0,                         /* xDestroy */
5837  seriesOpen,                /* xOpen - open a cursor */
5838  seriesClose,               /* xClose - close a cursor */
5839  seriesFilter,              /* xFilter - configure scan constraints */
5840  seriesNext,                /* xNext - advance a cursor */
5841  seriesEof,                 /* xEof - check for end of scan */
5842  seriesColumn,              /* xColumn - read data */
5843  seriesRowid,               /* xRowid - read data */
5844  0,                         /* xUpdate */
5845  0,                         /* xBegin */
5846  0,                         /* xSync */
5847  0,                         /* xCommit */
5848  0,                         /* xRollback */
5849  0,                         /* xFindMethod */
5850  0,                         /* xRename */
5851  0,                         /* xSavepoint */
5852  0,                         /* xRelease */
5853  0,                         /* xRollbackTo */
5854  0                          /* xShadowName */
5855};
5856
5857#endif /* SQLITE_OMIT_VIRTUALTABLE */
5858
5859#ifdef _WIN32
5860
5861#endif
5862int sqlite3_series_init(
5863  sqlite3 *db,
5864  char **pzErrMsg,
5865  const sqlite3_api_routines *pApi
5866){
5867  int rc = SQLITE_OK;
5868  SQLITE_EXTENSION_INIT2(pApi);
5869#ifndef SQLITE_OMIT_VIRTUALTABLE
5870  if( sqlite3_libversion_number()<3008012 ){
5871    *pzErrMsg = sqlite3_mprintf(
5872        "generate_series() requires SQLite 3.8.12 or later");
5873    return SQLITE_ERROR;
5874  }
5875  rc = sqlite3_create_module(db, "generate_series", &seriesModule, 0);
5876#endif
5877  return rc;
5878}
5879
5880/************************* End ../ext/misc/series.c ********************/
5881#ifdef SQLITE_HAVE_ZLIB
5882/************************* Begin ../ext/misc/zipfile.c ******************/
5883/*
5884** 2017-12-26
5885**
5886** The author disclaims copyright to this source code.  In place of
5887** a legal notice, here is a blessing:
5888**
5889**    May you do good and not evil.
5890**    May you find forgiveness for yourself and forgive others.
5891**    May you share freely, never taking more than you give.
5892**
5893******************************************************************************
5894**
5895** This file implements a virtual table for reading and writing ZIP archive
5896** files.
5897**
5898** Usage example:
5899**
5900**     SELECT name, sz, datetime(mtime,'unixepoch') FROM zipfile($filename);
5901**
5902** Current limitations:
5903**
5904**    *  No support for encryption
5905**    *  No support for ZIP archives spanning multiple files
5906**    *  No support for zip64 extensions
5907**    *  Only the "inflate/deflate" (zlib) compression method is supported
5908*/
5909/* #include "sqlite3ext.h" */
5910SQLITE_EXTENSION_INIT1
5911#include <stdio.h>
5912#include <string.h>
5913#include <assert.h>
5914
5915#include <zlib.h>
5916
5917#ifndef SQLITE_OMIT_VIRTUALTABLE
5918
5919#ifndef SQLITE_AMALGAMATION
5920
5921/* typedef sqlite3_int64 i64; */
5922/* typedef unsigned char u8; */
5923typedef unsigned short u16;
5924typedef unsigned long u32;
5925#define MIN(a,b) ((a)<(b) ? (a) : (b))
5926
5927#if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST)
5928# define ALWAYS(X)      (1)
5929# define NEVER(X)       (0)
5930#elif !defined(NDEBUG)
5931# define ALWAYS(X)      ((X)?1:(assert(0),0))
5932# define NEVER(X)       ((X)?(assert(0),1):0)
5933#else
5934# define ALWAYS(X)      (X)
5935# define NEVER(X)       (X)
5936#endif
5937
5938#endif   /* SQLITE_AMALGAMATION */
5939
5940/*
5941** Definitions for mode bitmasks S_IFDIR, S_IFREG and S_IFLNK.
5942**
5943** In some ways it would be better to obtain these values from system
5944** header files. But, the dependency is undesirable and (a) these
5945** have been stable for decades, (b) the values are part of POSIX and
5946** are also made explicit in [man stat], and (c) are part of the
5947** file format for zip archives.
5948*/
5949#ifndef S_IFDIR
5950# define S_IFDIR 0040000
5951#endif
5952#ifndef S_IFREG
5953# define S_IFREG 0100000
5954#endif
5955#ifndef S_IFLNK
5956# define S_IFLNK 0120000
5957#endif
5958
5959static const char ZIPFILE_SCHEMA[] =
5960  "CREATE TABLE y("
5961    "name PRIMARY KEY,"  /* 0: Name of file in zip archive */
5962    "mode,"              /* 1: POSIX mode for file */
5963    "mtime,"             /* 2: Last modification time (secs since 1970)*/
5964    "sz,"                /* 3: Size of object */
5965    "rawdata,"           /* 4: Raw data */
5966    "data,"              /* 5: Uncompressed data */
5967    "method,"            /* 6: Compression method (integer) */
5968    "z HIDDEN"           /* 7: Name of zip file */
5969  ") WITHOUT ROWID;";
5970
5971#define ZIPFILE_F_COLUMN_IDX 7    /* Index of column "file" in the above */
5972#define ZIPFILE_BUFFER_SIZE (64*1024)
5973
5974
5975/*
5976** Magic numbers used to read and write zip files.
5977**
5978** ZIPFILE_NEWENTRY_MADEBY:
5979**   Use this value for the "version-made-by" field in new zip file
5980**   entries. The upper byte indicates "unix", and the lower byte
5981**   indicates that the zip file matches pkzip specification 3.0.
5982**   This is what info-zip seems to do.
5983**
5984** ZIPFILE_NEWENTRY_REQUIRED:
5985**   Value for "version-required-to-extract" field of new entries.
5986**   Version 2.0 is required to support folders and deflate compression.
5987**
5988** ZIPFILE_NEWENTRY_FLAGS:
5989**   Value for "general-purpose-bit-flags" field of new entries. Bit
5990**   11 means "utf-8 filename and comment".
5991**
5992** ZIPFILE_SIGNATURE_CDS:
5993**   First 4 bytes of a valid CDS record.
5994**
5995** ZIPFILE_SIGNATURE_LFH:
5996**   First 4 bytes of a valid LFH record.
5997**
5998** ZIPFILE_SIGNATURE_EOCD
5999**   First 4 bytes of a valid EOCD record.
6000*/
6001#define ZIPFILE_EXTRA_TIMESTAMP   0x5455
6002#define ZIPFILE_NEWENTRY_MADEBY   ((3<<8) + 30)
6003#define ZIPFILE_NEWENTRY_REQUIRED 20
6004#define ZIPFILE_NEWENTRY_FLAGS    0x800
6005#define ZIPFILE_SIGNATURE_CDS     0x02014b50
6006#define ZIPFILE_SIGNATURE_LFH     0x04034b50
6007#define ZIPFILE_SIGNATURE_EOCD    0x06054b50
6008
6009/*
6010** The sizes of the fixed-size part of each of the three main data
6011** structures in a zip archive.
6012*/
6013#define ZIPFILE_LFH_FIXED_SZ      30
6014#define ZIPFILE_EOCD_FIXED_SZ     22
6015#define ZIPFILE_CDS_FIXED_SZ      46
6016
6017/*
6018*** 4.3.16  End of central directory record:
6019***
6020***   end of central dir signature    4 bytes  (0x06054b50)
6021***   number of this disk             2 bytes
6022***   number of the disk with the
6023***   start of the central directory  2 bytes
6024***   total number of entries in the
6025***   central directory on this disk  2 bytes
6026***   total number of entries in
6027***   the central directory           2 bytes
6028***   size of the central directory   4 bytes
6029***   offset of start of central
6030***   directory with respect to
6031***   the starting disk number        4 bytes
6032***   .ZIP file comment length        2 bytes
6033***   .ZIP file comment       (variable size)
6034*/
6035typedef struct ZipfileEOCD ZipfileEOCD;
6036struct ZipfileEOCD {
6037  u16 iDisk;
6038  u16 iFirstDisk;
6039  u16 nEntry;
6040  u16 nEntryTotal;
6041  u32 nSize;
6042  u32 iOffset;
6043};
6044
6045/*
6046*** 4.3.12  Central directory structure:
6047***
6048*** ...
6049***
6050***   central file header signature   4 bytes  (0x02014b50)
6051***   version made by                 2 bytes
6052***   version needed to extract       2 bytes
6053***   general purpose bit flag        2 bytes
6054***   compression method              2 bytes
6055***   last mod file time              2 bytes
6056***   last mod file date              2 bytes
6057***   crc-32                          4 bytes
6058***   compressed size                 4 bytes
6059***   uncompressed size               4 bytes
6060***   file name length                2 bytes
6061***   extra field length              2 bytes
6062***   file comment length             2 bytes
6063***   disk number start               2 bytes
6064***   internal file attributes        2 bytes
6065***   external file attributes        4 bytes
6066***   relative offset of local header 4 bytes
6067*/
6068typedef struct ZipfileCDS ZipfileCDS;
6069struct ZipfileCDS {
6070  u16 iVersionMadeBy;
6071  u16 iVersionExtract;
6072  u16 flags;
6073  u16 iCompression;
6074  u16 mTime;
6075  u16 mDate;
6076  u32 crc32;
6077  u32 szCompressed;
6078  u32 szUncompressed;
6079  u16 nFile;
6080  u16 nExtra;
6081  u16 nComment;
6082  u16 iDiskStart;
6083  u16 iInternalAttr;
6084  u32 iExternalAttr;
6085  u32 iOffset;
6086  char *zFile;                    /* Filename (sqlite3_malloc()) */
6087};
6088
6089/*
6090*** 4.3.7  Local file header:
6091***
6092***   local file header signature     4 bytes  (0x04034b50)
6093***   version needed to extract       2 bytes
6094***   general purpose bit flag        2 bytes
6095***   compression method              2 bytes
6096***   last mod file time              2 bytes
6097***   last mod file date              2 bytes
6098***   crc-32                          4 bytes
6099***   compressed size                 4 bytes
6100***   uncompressed size               4 bytes
6101***   file name length                2 bytes
6102***   extra field length              2 bytes
6103***
6104*/
6105typedef struct ZipfileLFH ZipfileLFH;
6106struct ZipfileLFH {
6107  u16 iVersionExtract;
6108  u16 flags;
6109  u16 iCompression;
6110  u16 mTime;
6111  u16 mDate;
6112  u32 crc32;
6113  u32 szCompressed;
6114  u32 szUncompressed;
6115  u16 nFile;
6116  u16 nExtra;
6117};
6118
6119typedef struct ZipfileEntry ZipfileEntry;
6120struct ZipfileEntry {
6121  ZipfileCDS cds;            /* Parsed CDS record */
6122  u32 mUnixTime;             /* Modification time, in UNIX format */
6123  u8 *aExtra;                /* cds.nExtra+cds.nComment bytes of extra data */
6124  i64 iDataOff;              /* Offset to data in file (if aData==0) */
6125  u8 *aData;                 /* cds.szCompressed bytes of compressed data */
6126  ZipfileEntry *pNext;       /* Next element in in-memory CDS */
6127};
6128
6129/*
6130** Cursor type for zipfile tables.
6131*/
6132typedef struct ZipfileCsr ZipfileCsr;
6133struct ZipfileCsr {
6134  sqlite3_vtab_cursor base;  /* Base class - must be first */
6135  i64 iId;                   /* Cursor ID */
6136  u8 bEof;                   /* True when at EOF */
6137  u8 bNoop;                  /* If next xNext() call is no-op */
6138
6139  /* Used outside of write transactions */
6140  FILE *pFile;               /* Zip file */
6141  i64 iNextOff;              /* Offset of next record in central directory */
6142  ZipfileEOCD eocd;          /* Parse of central directory record */
6143
6144  ZipfileEntry *pFreeEntry;  /* Free this list when cursor is closed or reset */
6145  ZipfileEntry *pCurrent;    /* Current entry */
6146  ZipfileCsr *pCsrNext;      /* Next cursor on same virtual table */
6147};
6148
6149typedef struct ZipfileTab ZipfileTab;
6150struct ZipfileTab {
6151  sqlite3_vtab base;         /* Base class - must be first */
6152  char *zFile;               /* Zip file this table accesses (may be NULL) */
6153  sqlite3 *db;               /* Host database connection */
6154  u8 *aBuffer;               /* Temporary buffer used for various tasks */
6155
6156  ZipfileCsr *pCsrList;      /* List of cursors */
6157  i64 iNextCsrid;
6158
6159  /* The following are used by write transactions only */
6160  ZipfileEntry *pFirstEntry; /* Linked list of all files (if pWriteFd!=0) */
6161  ZipfileEntry *pLastEntry;  /* Last element in pFirstEntry list */
6162  FILE *pWriteFd;            /* File handle open on zip archive */
6163  i64 szCurrent;             /* Current size of zip archive */
6164  i64 szOrig;                /* Size of archive at start of transaction */
6165};
6166
6167/*
6168** Set the error message contained in context ctx to the results of
6169** vprintf(zFmt, ...).
6170*/
6171static void zipfileCtxErrorMsg(sqlite3_context *ctx, const char *zFmt, ...){
6172  char *zMsg = 0;
6173  va_list ap;
6174  va_start(ap, zFmt);
6175  zMsg = sqlite3_vmprintf(zFmt, ap);
6176  sqlite3_result_error(ctx, zMsg, -1);
6177  sqlite3_free(zMsg);
6178  va_end(ap);
6179}
6180
6181/*
6182** If string zIn is quoted, dequote it in place. Otherwise, if the string
6183** is not quoted, do nothing.
6184*/
6185static void zipfileDequote(char *zIn){
6186  char q = zIn[0];
6187  if( q=='"' || q=='\'' || q=='`' || q=='[' ){
6188    int iIn = 1;
6189    int iOut = 0;
6190    if( q=='[' ) q = ']';
6191    while( ALWAYS(zIn[iIn]) ){
6192      char c = zIn[iIn++];
6193      if( c==q && zIn[iIn++]!=q ) break;
6194      zIn[iOut++] = c;
6195    }
6196    zIn[iOut] = '\0';
6197  }
6198}
6199
6200/*
6201** Construct a new ZipfileTab virtual table object.
6202**
6203**   argv[0]   -> module name  ("zipfile")
6204**   argv[1]   -> database name
6205**   argv[2]   -> table name
6206**   argv[...] -> "column name" and other module argument fields.
6207*/
6208static int zipfileConnect(
6209  sqlite3 *db,
6210  void *pAux,
6211  int argc, const char *const*argv,
6212  sqlite3_vtab **ppVtab,
6213  char **pzErr
6214){
6215  int nByte = sizeof(ZipfileTab) + ZIPFILE_BUFFER_SIZE;
6216  int nFile = 0;
6217  const char *zFile = 0;
6218  ZipfileTab *pNew = 0;
6219  int rc;
6220
6221  /* If the table name is not "zipfile", require that the argument be
6222  ** specified. This stops zipfile tables from being created as:
6223  **
6224  **   CREATE VIRTUAL TABLE zzz USING zipfile();
6225  **
6226  ** It does not prevent:
6227  **
6228  **   CREATE VIRTUAL TABLE zipfile USING zipfile();
6229  */
6230  assert( 0==sqlite3_stricmp(argv[0], "zipfile") );
6231  if( (0!=sqlite3_stricmp(argv[2], "zipfile") && argc<4) || argc>4 ){
6232    *pzErr = sqlite3_mprintf("zipfile constructor requires one argument");
6233    return SQLITE_ERROR;
6234  }
6235
6236  if( argc>3 ){
6237    zFile = argv[3];
6238    nFile = (int)strlen(zFile)+1;
6239  }
6240
6241  rc = sqlite3_declare_vtab(db, ZIPFILE_SCHEMA);
6242  if( rc==SQLITE_OK ){
6243    pNew = (ZipfileTab*)sqlite3_malloc64((sqlite3_int64)nByte+nFile);
6244    if( pNew==0 ) return SQLITE_NOMEM;
6245    memset(pNew, 0, nByte+nFile);
6246    pNew->db = db;
6247    pNew->aBuffer = (u8*)&pNew[1];
6248    if( zFile ){
6249      pNew->zFile = (char*)&pNew->aBuffer[ZIPFILE_BUFFER_SIZE];
6250      memcpy(pNew->zFile, zFile, nFile);
6251      zipfileDequote(pNew->zFile);
6252    }
6253  }
6254  sqlite3_vtab_config(db, SQLITE_VTAB_DIRECTONLY);
6255  *ppVtab = (sqlite3_vtab*)pNew;
6256  return rc;
6257}
6258
6259/*
6260** Free the ZipfileEntry structure indicated by the only argument.
6261*/
6262static void zipfileEntryFree(ZipfileEntry *p){
6263  if( p ){
6264    sqlite3_free(p->cds.zFile);
6265    sqlite3_free(p);
6266  }
6267}
6268
6269/*
6270** Release resources that should be freed at the end of a write
6271** transaction.
6272*/
6273static void zipfileCleanupTransaction(ZipfileTab *pTab){
6274  ZipfileEntry *pEntry;
6275  ZipfileEntry *pNext;
6276
6277  if( pTab->pWriteFd ){
6278    fclose(pTab->pWriteFd);
6279    pTab->pWriteFd = 0;
6280  }
6281  for(pEntry=pTab->pFirstEntry; pEntry; pEntry=pNext){
6282    pNext = pEntry->pNext;
6283    zipfileEntryFree(pEntry);
6284  }
6285  pTab->pFirstEntry = 0;
6286  pTab->pLastEntry = 0;
6287  pTab->szCurrent = 0;
6288  pTab->szOrig = 0;
6289}
6290
6291/*
6292** This method is the destructor for zipfile vtab objects.
6293*/
6294static int zipfileDisconnect(sqlite3_vtab *pVtab){
6295  zipfileCleanupTransaction((ZipfileTab*)pVtab);
6296  sqlite3_free(pVtab);
6297  return SQLITE_OK;
6298}
6299
6300/*
6301** Constructor for a new ZipfileCsr object.
6302*/
6303static int zipfileOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCsr){
6304  ZipfileTab *pTab = (ZipfileTab*)p;
6305  ZipfileCsr *pCsr;
6306  pCsr = sqlite3_malloc(sizeof(*pCsr));
6307  *ppCsr = (sqlite3_vtab_cursor*)pCsr;
6308  if( pCsr==0 ){
6309    return SQLITE_NOMEM;
6310  }
6311  memset(pCsr, 0, sizeof(*pCsr));
6312  pCsr->iId = ++pTab->iNextCsrid;
6313  pCsr->pCsrNext = pTab->pCsrList;
6314  pTab->pCsrList = pCsr;
6315  return SQLITE_OK;
6316}
6317
6318/*
6319** Reset a cursor back to the state it was in when first returned
6320** by zipfileOpen().
6321*/
6322static void zipfileResetCursor(ZipfileCsr *pCsr){
6323  ZipfileEntry *p;
6324  ZipfileEntry *pNext;
6325
6326  pCsr->bEof = 0;
6327  if( pCsr->pFile ){
6328    fclose(pCsr->pFile);
6329    pCsr->pFile = 0;
6330    zipfileEntryFree(pCsr->pCurrent);
6331    pCsr->pCurrent = 0;
6332  }
6333
6334  for(p=pCsr->pFreeEntry; p; p=pNext){
6335    pNext = p->pNext;
6336    zipfileEntryFree(p);
6337  }
6338}
6339
6340/*
6341** Destructor for an ZipfileCsr.
6342*/
6343static int zipfileClose(sqlite3_vtab_cursor *cur){
6344  ZipfileCsr *pCsr = (ZipfileCsr*)cur;
6345  ZipfileTab *pTab = (ZipfileTab*)(pCsr->base.pVtab);
6346  ZipfileCsr **pp;
6347  zipfileResetCursor(pCsr);
6348
6349  /* Remove this cursor from the ZipfileTab.pCsrList list. */
6350  for(pp=&pTab->pCsrList; *pp!=pCsr; pp=&((*pp)->pCsrNext));
6351  *pp = pCsr->pCsrNext;
6352
6353  sqlite3_free(pCsr);
6354  return SQLITE_OK;
6355}
6356
6357/*
6358** Set the error message for the virtual table associated with cursor
6359** pCsr to the results of vprintf(zFmt, ...).
6360*/
6361static void zipfileTableErr(ZipfileTab *pTab, const char *zFmt, ...){
6362  va_list ap;
6363  va_start(ap, zFmt);
6364  sqlite3_free(pTab->base.zErrMsg);
6365  pTab->base.zErrMsg = sqlite3_vmprintf(zFmt, ap);
6366  va_end(ap);
6367}
6368static void zipfileCursorErr(ZipfileCsr *pCsr, const char *zFmt, ...){
6369  va_list ap;
6370  va_start(ap, zFmt);
6371  sqlite3_free(pCsr->base.pVtab->zErrMsg);
6372  pCsr->base.pVtab->zErrMsg = sqlite3_vmprintf(zFmt, ap);
6373  va_end(ap);
6374}
6375
6376/*
6377** Read nRead bytes of data from offset iOff of file pFile into buffer
6378** aRead[]. Return SQLITE_OK if successful, or an SQLite error code
6379** otherwise.
6380**
6381** If an error does occur, output variable (*pzErrmsg) may be set to point
6382** to an English language error message. It is the responsibility of the
6383** caller to eventually free this buffer using
6384** sqlite3_free().
6385*/
6386static int zipfileReadData(
6387  FILE *pFile,                    /* Read from this file */
6388  u8 *aRead,                      /* Read into this buffer */
6389  int nRead,                      /* Number of bytes to read */
6390  i64 iOff,                       /* Offset to read from */
6391  char **pzErrmsg                 /* OUT: Error message (from sqlite3_malloc) */
6392){
6393  size_t n;
6394  fseek(pFile, (long)iOff, SEEK_SET);
6395  n = fread(aRead, 1, nRead, pFile);
6396  if( (int)n!=nRead ){
6397    *pzErrmsg = sqlite3_mprintf("error in fread()");
6398    return SQLITE_ERROR;
6399  }
6400  return SQLITE_OK;
6401}
6402
6403static int zipfileAppendData(
6404  ZipfileTab *pTab,
6405  const u8 *aWrite,
6406  int nWrite
6407){
6408  if( nWrite>0 ){
6409    size_t n = nWrite;
6410    fseek(pTab->pWriteFd, (long)pTab->szCurrent, SEEK_SET);
6411    n = fwrite(aWrite, 1, nWrite, pTab->pWriteFd);
6412    if( (int)n!=nWrite ){
6413      pTab->base.zErrMsg = sqlite3_mprintf("error in fwrite()");
6414      return SQLITE_ERROR;
6415    }
6416    pTab->szCurrent += nWrite;
6417  }
6418  return SQLITE_OK;
6419}
6420
6421/*
6422** Read and return a 16-bit little-endian unsigned integer from buffer aBuf.
6423*/
6424static u16 zipfileGetU16(const u8 *aBuf){
6425  return (aBuf[1] << 8) + aBuf[0];
6426}
6427
6428/*
6429** Read and return a 32-bit little-endian unsigned integer from buffer aBuf.
6430*/
6431static u32 zipfileGetU32(const u8 *aBuf){
6432  return ((u32)(aBuf[3]) << 24)
6433       + ((u32)(aBuf[2]) << 16)
6434       + ((u32)(aBuf[1]) <<  8)
6435       + ((u32)(aBuf[0]) <<  0);
6436}
6437
6438/*
6439** Write a 16-bit little endiate integer into buffer aBuf.
6440*/
6441static void zipfilePutU16(u8 *aBuf, u16 val){
6442  aBuf[0] = val & 0xFF;
6443  aBuf[1] = (val>>8) & 0xFF;
6444}
6445
6446/*
6447** Write a 32-bit little endiate integer into buffer aBuf.
6448*/
6449static void zipfilePutU32(u8 *aBuf, u32 val){
6450  aBuf[0] = val & 0xFF;
6451  aBuf[1] = (val>>8) & 0xFF;
6452  aBuf[2] = (val>>16) & 0xFF;
6453  aBuf[3] = (val>>24) & 0xFF;
6454}
6455
6456#define zipfileRead32(aBuf) ( aBuf+=4, zipfileGetU32(aBuf-4) )
6457#define zipfileRead16(aBuf) ( aBuf+=2, zipfileGetU16(aBuf-2) )
6458
6459#define zipfileWrite32(aBuf,val) { zipfilePutU32(aBuf,val); aBuf+=4; }
6460#define zipfileWrite16(aBuf,val) { zipfilePutU16(aBuf,val); aBuf+=2; }
6461
6462/*
6463** Magic numbers used to read CDS records.
6464*/
6465#define ZIPFILE_CDS_NFILE_OFF        28
6466#define ZIPFILE_CDS_SZCOMPRESSED_OFF 20
6467
6468/*
6469** Decode the CDS record in buffer aBuf into (*pCDS). Return SQLITE_ERROR
6470** if the record is not well-formed, or SQLITE_OK otherwise.
6471*/
6472static int zipfileReadCDS(u8 *aBuf, ZipfileCDS *pCDS){
6473  u8 *aRead = aBuf;
6474  u32 sig = zipfileRead32(aRead);
6475  int rc = SQLITE_OK;
6476  if( sig!=ZIPFILE_SIGNATURE_CDS ){
6477    rc = SQLITE_ERROR;
6478  }else{
6479    pCDS->iVersionMadeBy = zipfileRead16(aRead);
6480    pCDS->iVersionExtract = zipfileRead16(aRead);
6481    pCDS->flags = zipfileRead16(aRead);
6482    pCDS->iCompression = zipfileRead16(aRead);
6483    pCDS->mTime = zipfileRead16(aRead);
6484    pCDS->mDate = zipfileRead16(aRead);
6485    pCDS->crc32 = zipfileRead32(aRead);
6486    pCDS->szCompressed = zipfileRead32(aRead);
6487    pCDS->szUncompressed = zipfileRead32(aRead);
6488    assert( aRead==&aBuf[ZIPFILE_CDS_NFILE_OFF] );
6489    pCDS->nFile = zipfileRead16(aRead);
6490    pCDS->nExtra = zipfileRead16(aRead);
6491    pCDS->nComment = zipfileRead16(aRead);
6492    pCDS->iDiskStart = zipfileRead16(aRead);
6493    pCDS->iInternalAttr = zipfileRead16(aRead);
6494    pCDS->iExternalAttr = zipfileRead32(aRead);
6495    pCDS->iOffset = zipfileRead32(aRead);
6496    assert( aRead==&aBuf[ZIPFILE_CDS_FIXED_SZ] );
6497  }
6498
6499  return rc;
6500}
6501
6502/*
6503** Decode the LFH record in buffer aBuf into (*pLFH). Return SQLITE_ERROR
6504** if the record is not well-formed, or SQLITE_OK otherwise.
6505*/
6506static int zipfileReadLFH(
6507  u8 *aBuffer,
6508  ZipfileLFH *pLFH
6509){
6510  u8 *aRead = aBuffer;
6511  int rc = SQLITE_OK;
6512
6513  u32 sig = zipfileRead32(aRead);
6514  if( sig!=ZIPFILE_SIGNATURE_LFH ){
6515    rc = SQLITE_ERROR;
6516  }else{
6517    pLFH->iVersionExtract = zipfileRead16(aRead);
6518    pLFH->flags = zipfileRead16(aRead);
6519    pLFH->iCompression = zipfileRead16(aRead);
6520    pLFH->mTime = zipfileRead16(aRead);
6521    pLFH->mDate = zipfileRead16(aRead);
6522    pLFH->crc32 = zipfileRead32(aRead);
6523    pLFH->szCompressed = zipfileRead32(aRead);
6524    pLFH->szUncompressed = zipfileRead32(aRead);
6525    pLFH->nFile = zipfileRead16(aRead);
6526    pLFH->nExtra = zipfileRead16(aRead);
6527  }
6528  return rc;
6529}
6530
6531
6532/*
6533** Buffer aExtra (size nExtra bytes) contains zip archive "extra" fields.
6534** Scan through this buffer to find an "extra-timestamp" field. If one
6535** exists, extract the 32-bit modification-timestamp from it and store
6536** the value in output parameter *pmTime.
6537**
6538** Zero is returned if no extra-timestamp record could be found (and so
6539** *pmTime is left unchanged), or non-zero otherwise.
6540**
6541** The general format of an extra field is:
6542**
6543**   Header ID    2 bytes
6544**   Data Size    2 bytes
6545**   Data         N bytes
6546*/
6547static int zipfileScanExtra(u8 *aExtra, int nExtra, u32 *pmTime){
6548  int ret = 0;
6549  u8 *p = aExtra;
6550  u8 *pEnd = &aExtra[nExtra];
6551
6552  while( p<pEnd ){
6553    u16 id = zipfileRead16(p);
6554    u16 nByte = zipfileRead16(p);
6555
6556    switch( id ){
6557      case ZIPFILE_EXTRA_TIMESTAMP: {
6558        u8 b = p[0];
6559        if( b & 0x01 ){     /* 0x01 -> modtime is present */
6560          *pmTime = zipfileGetU32(&p[1]);
6561          ret = 1;
6562        }
6563        break;
6564      }
6565    }
6566
6567    p += nByte;
6568  }
6569  return ret;
6570}
6571
6572/*
6573** Convert the standard MS-DOS timestamp stored in the mTime and mDate
6574** fields of the CDS structure passed as the only argument to a 32-bit
6575** UNIX seconds-since-the-epoch timestamp. Return the result.
6576**
6577** "Standard" MS-DOS time format:
6578**
6579**   File modification time:
6580**     Bits 00-04: seconds divided by 2
6581**     Bits 05-10: minute
6582**     Bits 11-15: hour
6583**   File modification date:
6584**     Bits 00-04: day
6585**     Bits 05-08: month (1-12)
6586**     Bits 09-15: years from 1980
6587**
6588** https://msdn.microsoft.com/en-us/library/9kkf9tah.aspx
6589*/
6590static u32 zipfileMtime(ZipfileCDS *pCDS){
6591  int Y = (1980 + ((pCDS->mDate >> 9) & 0x7F));
6592  int M = ((pCDS->mDate >> 5) & 0x0F);
6593  int D = (pCDS->mDate & 0x1F);
6594  int B = -13;
6595
6596  int sec = (pCDS->mTime & 0x1F)*2;
6597  int min = (pCDS->mTime >> 5) & 0x3F;
6598  int hr = (pCDS->mTime >> 11) & 0x1F;
6599  i64 JD;
6600
6601  /* JD = INT(365.25 * (Y+4716)) + INT(30.6001 * (M+1)) + D + B - 1524.5 */
6602
6603  /* Calculate the JD in seconds for noon on the day in question */
6604  if( M<3 ){
6605    Y = Y-1;
6606    M = M+12;
6607  }
6608  JD = (i64)(24*60*60) * (
6609      (int)(365.25 * (Y + 4716))
6610    + (int)(30.6001 * (M + 1))
6611    + D + B - 1524
6612  );
6613
6614  /* Correct the JD for the time within the day */
6615  JD += (hr-12) * 3600 + min * 60 + sec;
6616
6617  /* Convert JD to unix timestamp (the JD epoch is 2440587.5) */
6618  return (u32)(JD - (i64)(24405875) * 24*60*6);
6619}
6620
6621/*
6622** The opposite of zipfileMtime(). This function populates the mTime and
6623** mDate fields of the CDS structure passed as the first argument according
6624** to the UNIX timestamp value passed as the second.
6625*/
6626static void zipfileMtimeToDos(ZipfileCDS *pCds, u32 mUnixTime){
6627  /* Convert unix timestamp to JD (2440588 is noon on 1/1/1970) */
6628  i64 JD = (i64)2440588 + mUnixTime / (24*60*60);
6629
6630  int A, B, C, D, E;
6631  int yr, mon, day;
6632  int hr, min, sec;
6633
6634  A = (int)((JD - 1867216.25)/36524.25);
6635  A = (int)(JD + 1 + A - (A/4));
6636  B = A + 1524;
6637  C = (int)((B - 122.1)/365.25);
6638  D = (36525*(C&32767))/100;
6639  E = (int)((B-D)/30.6001);
6640
6641  day = B - D - (int)(30.6001*E);
6642  mon = (E<14 ? E-1 : E-13);
6643  yr = mon>2 ? C-4716 : C-4715;
6644
6645  hr = (mUnixTime % (24*60*60)) / (60*60);
6646  min = (mUnixTime % (60*60)) / 60;
6647  sec = (mUnixTime % 60);
6648
6649  if( yr>=1980 ){
6650    pCds->mDate = (u16)(day + (mon << 5) + ((yr-1980) << 9));
6651    pCds->mTime = (u16)(sec/2 + (min<<5) + (hr<<11));
6652  }else{
6653    pCds->mDate = pCds->mTime = 0;
6654  }
6655
6656  assert( mUnixTime<315507600
6657       || mUnixTime==zipfileMtime(pCds)
6658       || ((mUnixTime % 2) && mUnixTime-1==zipfileMtime(pCds))
6659       /* || (mUnixTime % 2) */
6660  );
6661}
6662
6663/*
6664** If aBlob is not NULL, then it is a pointer to a buffer (nBlob bytes in
6665** size) containing an entire zip archive image. Or, if aBlob is NULL,
6666** then pFile is a file-handle open on a zip file. In either case, this
6667** function creates a ZipfileEntry object based on the zip archive entry
6668** for which the CDS record is at offset iOff.
6669**
6670** If successful, SQLITE_OK is returned and (*ppEntry) set to point to
6671** the new object. Otherwise, an SQLite error code is returned and the
6672** final value of (*ppEntry) undefined.
6673*/
6674static int zipfileGetEntry(
6675  ZipfileTab *pTab,               /* Store any error message here */
6676  const u8 *aBlob,                /* Pointer to in-memory file image */
6677  int nBlob,                      /* Size of aBlob[] in bytes */
6678  FILE *pFile,                    /* If aBlob==0, read from this file */
6679  i64 iOff,                       /* Offset of CDS record */
6680  ZipfileEntry **ppEntry          /* OUT: Pointer to new object */
6681){
6682  u8 *aRead;
6683  char **pzErr = &pTab->base.zErrMsg;
6684  int rc = SQLITE_OK;
6685
6686  if( aBlob==0 ){
6687    aRead = pTab->aBuffer;
6688    rc = zipfileReadData(pFile, aRead, ZIPFILE_CDS_FIXED_SZ, iOff, pzErr);
6689  }else{
6690    aRead = (u8*)&aBlob[iOff];
6691  }
6692
6693  if( rc==SQLITE_OK ){
6694    sqlite3_int64 nAlloc;
6695    ZipfileEntry *pNew;
6696
6697    int nFile = zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF]);
6698    int nExtra = zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF+2]);
6699    nExtra += zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF+4]);
6700
6701    nAlloc = sizeof(ZipfileEntry) + nExtra;
6702    if( aBlob ){
6703      nAlloc += zipfileGetU32(&aRead[ZIPFILE_CDS_SZCOMPRESSED_OFF]);
6704    }
6705
6706    pNew = (ZipfileEntry*)sqlite3_malloc64(nAlloc);
6707    if( pNew==0 ){
6708      rc = SQLITE_NOMEM;
6709    }else{
6710      memset(pNew, 0, sizeof(ZipfileEntry));
6711      rc = zipfileReadCDS(aRead, &pNew->cds);
6712      if( rc!=SQLITE_OK ){
6713        *pzErr = sqlite3_mprintf("failed to read CDS at offset %lld", iOff);
6714      }else if( aBlob==0 ){
6715        rc = zipfileReadData(
6716            pFile, aRead, nExtra+nFile, iOff+ZIPFILE_CDS_FIXED_SZ, pzErr
6717        );
6718      }else{
6719        aRead = (u8*)&aBlob[iOff + ZIPFILE_CDS_FIXED_SZ];
6720      }
6721    }
6722
6723    if( rc==SQLITE_OK ){
6724      u32 *pt = &pNew->mUnixTime;
6725      pNew->cds.zFile = sqlite3_mprintf("%.*s", nFile, aRead);
6726      pNew->aExtra = (u8*)&pNew[1];
6727      memcpy(pNew->aExtra, &aRead[nFile], nExtra);
6728      if( pNew->cds.zFile==0 ){
6729        rc = SQLITE_NOMEM;
6730      }else if( 0==zipfileScanExtra(&aRead[nFile], pNew->cds.nExtra, pt) ){
6731        pNew->mUnixTime = zipfileMtime(&pNew->cds);
6732      }
6733    }
6734
6735    if( rc==SQLITE_OK ){
6736      static const int szFix = ZIPFILE_LFH_FIXED_SZ;
6737      ZipfileLFH lfh;
6738      if( pFile ){
6739        rc = zipfileReadData(pFile, aRead, szFix, pNew->cds.iOffset, pzErr);
6740      }else{
6741        aRead = (u8*)&aBlob[pNew->cds.iOffset];
6742      }
6743
6744      rc = zipfileReadLFH(aRead, &lfh);
6745      if( rc==SQLITE_OK ){
6746        pNew->iDataOff =  pNew->cds.iOffset + ZIPFILE_LFH_FIXED_SZ;
6747        pNew->iDataOff += lfh.nFile + lfh.nExtra;
6748        if( aBlob && pNew->cds.szCompressed ){
6749          pNew->aData = &pNew->aExtra[nExtra];
6750          memcpy(pNew->aData, &aBlob[pNew->iDataOff], pNew->cds.szCompressed);
6751        }
6752      }else{
6753        *pzErr = sqlite3_mprintf("failed to read LFH at offset %d",
6754            (int)pNew->cds.iOffset
6755        );
6756      }
6757    }
6758
6759    if( rc!=SQLITE_OK ){
6760      zipfileEntryFree(pNew);
6761    }else{
6762      *ppEntry = pNew;
6763    }
6764  }
6765
6766  return rc;
6767}
6768
6769/*
6770** Advance an ZipfileCsr to its next row of output.
6771*/
6772static int zipfileNext(sqlite3_vtab_cursor *cur){
6773  ZipfileCsr *pCsr = (ZipfileCsr*)cur;
6774  int rc = SQLITE_OK;
6775
6776  if( pCsr->pFile ){
6777    i64 iEof = pCsr->eocd.iOffset + pCsr->eocd.nSize;
6778    zipfileEntryFree(pCsr->pCurrent);
6779    pCsr->pCurrent = 0;
6780    if( pCsr->iNextOff>=iEof ){
6781      pCsr->bEof = 1;
6782    }else{
6783      ZipfileEntry *p = 0;
6784      ZipfileTab *pTab = (ZipfileTab*)(cur->pVtab);
6785      rc = zipfileGetEntry(pTab, 0, 0, pCsr->pFile, pCsr->iNextOff, &p);
6786      if( rc==SQLITE_OK ){
6787        pCsr->iNextOff += ZIPFILE_CDS_FIXED_SZ;
6788        pCsr->iNextOff += (int)p->cds.nExtra + p->cds.nFile + p->cds.nComment;
6789      }
6790      pCsr->pCurrent = p;
6791    }
6792  }else{
6793    if( !pCsr->bNoop ){
6794      pCsr->pCurrent = pCsr->pCurrent->pNext;
6795    }
6796    if( pCsr->pCurrent==0 ){
6797      pCsr->bEof = 1;
6798    }
6799  }
6800
6801  pCsr->bNoop = 0;
6802  return rc;
6803}
6804
6805static void zipfileFree(void *p) {
6806  sqlite3_free(p);
6807}
6808
6809/*
6810** Buffer aIn (size nIn bytes) contains compressed data. Uncompressed, the
6811** size is nOut bytes. This function uncompresses the data and sets the
6812** return value in context pCtx to the result (a blob).
6813**
6814** If an error occurs, an error code is left in pCtx instead.
6815*/
6816static void zipfileInflate(
6817  sqlite3_context *pCtx,          /* Store result here */
6818  const u8 *aIn,                  /* Compressed data */
6819  int nIn,                        /* Size of buffer aIn[] in bytes */
6820  int nOut                        /* Expected output size */
6821){
6822  u8 *aRes = sqlite3_malloc(nOut);
6823  if( aRes==0 ){
6824    sqlite3_result_error_nomem(pCtx);
6825  }else{
6826    int err;
6827    z_stream str;
6828    memset(&str, 0, sizeof(str));
6829
6830    str.next_in = (Byte*)aIn;
6831    str.avail_in = nIn;
6832    str.next_out = (Byte*)aRes;
6833    str.avail_out = nOut;
6834
6835    err = inflateInit2(&str, -15);
6836    if( err!=Z_OK ){
6837      zipfileCtxErrorMsg(pCtx, "inflateInit2() failed (%d)", err);
6838    }else{
6839      err = inflate(&str, Z_NO_FLUSH);
6840      if( err!=Z_STREAM_END ){
6841        zipfileCtxErrorMsg(pCtx, "inflate() failed (%d)", err);
6842      }else{
6843        sqlite3_result_blob(pCtx, aRes, nOut, zipfileFree);
6844        aRes = 0;
6845      }
6846    }
6847    sqlite3_free(aRes);
6848    inflateEnd(&str);
6849  }
6850}
6851
6852/*
6853** Buffer aIn (size nIn bytes) contains uncompressed data. This function
6854** compresses it and sets (*ppOut) to point to a buffer containing the
6855** compressed data. The caller is responsible for eventually calling
6856** sqlite3_free() to release buffer (*ppOut). Before returning, (*pnOut)
6857** is set to the size of buffer (*ppOut) in bytes.
6858**
6859** If no error occurs, SQLITE_OK is returned. Otherwise, an SQLite error
6860** code is returned and an error message left in virtual-table handle
6861** pTab. The values of (*ppOut) and (*pnOut) are left unchanged in this
6862** case.
6863*/
6864static int zipfileDeflate(
6865  const u8 *aIn, int nIn,         /* Input */
6866  u8 **ppOut, int *pnOut,         /* Output */
6867  char **pzErr                    /* OUT: Error message */
6868){
6869  int rc = SQLITE_OK;
6870  sqlite3_int64 nAlloc;
6871  z_stream str;
6872  u8 *aOut;
6873
6874  memset(&str, 0, sizeof(str));
6875  str.next_in = (Bytef*)aIn;
6876  str.avail_in = nIn;
6877  deflateInit2(&str, 9, Z_DEFLATED, -15, 8, Z_DEFAULT_STRATEGY);
6878
6879  nAlloc = deflateBound(&str, nIn);
6880  aOut = (u8*)sqlite3_malloc64(nAlloc);
6881  if( aOut==0 ){
6882    rc = SQLITE_NOMEM;
6883  }else{
6884    int res;
6885    str.next_out = aOut;
6886    str.avail_out = nAlloc;
6887    res = deflate(&str, Z_FINISH);
6888    if( res==Z_STREAM_END ){
6889      *ppOut = aOut;
6890      *pnOut = (int)str.total_out;
6891    }else{
6892      sqlite3_free(aOut);
6893      *pzErr = sqlite3_mprintf("zipfile: deflate() error");
6894      rc = SQLITE_ERROR;
6895    }
6896    deflateEnd(&str);
6897  }
6898
6899  return rc;
6900}
6901
6902
6903/*
6904** Return values of columns for the row at which the series_cursor
6905** is currently pointing.
6906*/
6907static int zipfileColumn(
6908  sqlite3_vtab_cursor *cur,   /* The cursor */
6909  sqlite3_context *ctx,       /* First argument to sqlite3_result_...() */
6910  int i                       /* Which column to return */
6911){
6912  ZipfileCsr *pCsr = (ZipfileCsr*)cur;
6913  ZipfileCDS *pCDS = &pCsr->pCurrent->cds;
6914  int rc = SQLITE_OK;
6915  switch( i ){
6916    case 0:   /* name */
6917      sqlite3_result_text(ctx, pCDS->zFile, -1, SQLITE_TRANSIENT);
6918      break;
6919    case 1:   /* mode */
6920      /* TODO: Whether or not the following is correct surely depends on
6921      ** the platform on which the archive was created.  */
6922      sqlite3_result_int(ctx, pCDS->iExternalAttr >> 16);
6923      break;
6924    case 2: { /* mtime */
6925      sqlite3_result_int64(ctx, pCsr->pCurrent->mUnixTime);
6926      break;
6927    }
6928    case 3: { /* sz */
6929      if( sqlite3_vtab_nochange(ctx)==0 ){
6930        sqlite3_result_int64(ctx, pCDS->szUncompressed);
6931      }
6932      break;
6933    }
6934    case 4:   /* rawdata */
6935      if( sqlite3_vtab_nochange(ctx) ) break;
6936    case 5: { /* data */
6937      if( i==4 || pCDS->iCompression==0 || pCDS->iCompression==8 ){
6938        int sz = pCDS->szCompressed;
6939        int szFinal = pCDS->szUncompressed;
6940        if( szFinal>0 ){
6941          u8 *aBuf;
6942          u8 *aFree = 0;
6943          if( pCsr->pCurrent->aData ){
6944            aBuf = pCsr->pCurrent->aData;
6945          }else{
6946            aBuf = aFree = sqlite3_malloc64(sz);
6947            if( aBuf==0 ){
6948              rc = SQLITE_NOMEM;
6949            }else{
6950              FILE *pFile = pCsr->pFile;
6951              if( pFile==0 ){
6952                pFile = ((ZipfileTab*)(pCsr->base.pVtab))->pWriteFd;
6953              }
6954              rc = zipfileReadData(pFile, aBuf, sz, pCsr->pCurrent->iDataOff,
6955                  &pCsr->base.pVtab->zErrMsg
6956              );
6957            }
6958          }
6959          if( rc==SQLITE_OK ){
6960            if( i==5 && pCDS->iCompression ){
6961              zipfileInflate(ctx, aBuf, sz, szFinal);
6962            }else{
6963              sqlite3_result_blob(ctx, aBuf, sz, SQLITE_TRANSIENT);
6964            }
6965          }
6966          sqlite3_free(aFree);
6967        }else{
6968          /* Figure out if this is a directory or a zero-sized file. Consider
6969          ** it to be a directory either if the mode suggests so, or if
6970          ** the final character in the name is '/'.  */
6971          u32 mode = pCDS->iExternalAttr >> 16;
6972          if( !(mode & S_IFDIR) && pCDS->zFile[pCDS->nFile-1]!='/' ){
6973            sqlite3_result_blob(ctx, "", 0, SQLITE_STATIC);
6974          }
6975        }
6976      }
6977      break;
6978    }
6979    case 6:   /* method */
6980      sqlite3_result_int(ctx, pCDS->iCompression);
6981      break;
6982    default:  /* z */
6983      assert( i==7 );
6984      sqlite3_result_int64(ctx, pCsr->iId);
6985      break;
6986  }
6987
6988  return rc;
6989}
6990
6991/*
6992** Return TRUE if the cursor is at EOF.
6993*/
6994static int zipfileEof(sqlite3_vtab_cursor *cur){
6995  ZipfileCsr *pCsr = (ZipfileCsr*)cur;
6996  return pCsr->bEof;
6997}
6998
6999/*
7000** If aBlob is not NULL, then it points to a buffer nBlob bytes in size
7001** containing an entire zip archive image. Or, if aBlob is NULL, then pFile
7002** is guaranteed to be a file-handle open on a zip file.
7003**
7004** This function attempts to locate the EOCD record within the zip archive
7005** and populate *pEOCD with the results of decoding it. SQLITE_OK is
7006** returned if successful. Otherwise, an SQLite error code is returned and
7007** an English language error message may be left in virtual-table pTab.
7008*/
7009static int zipfileReadEOCD(
7010  ZipfileTab *pTab,               /* Return errors here */
7011  const u8 *aBlob,                /* Pointer to in-memory file image */
7012  int nBlob,                      /* Size of aBlob[] in bytes */
7013  FILE *pFile,                    /* Read from this file if aBlob==0 */
7014  ZipfileEOCD *pEOCD              /* Object to populate */
7015){
7016  u8 *aRead = pTab->aBuffer;      /* Temporary buffer */
7017  int nRead;                      /* Bytes to read from file */
7018  int rc = SQLITE_OK;
7019
7020  if( aBlob==0 ){
7021    i64 iOff;                     /* Offset to read from */
7022    i64 szFile;                   /* Total size of file in bytes */
7023    fseek(pFile, 0, SEEK_END);
7024    szFile = (i64)ftell(pFile);
7025    if( szFile==0 ){
7026      memset(pEOCD, 0, sizeof(ZipfileEOCD));
7027      return SQLITE_OK;
7028    }
7029    nRead = (int)(MIN(szFile, ZIPFILE_BUFFER_SIZE));
7030    iOff = szFile - nRead;
7031    rc = zipfileReadData(pFile, aRead, nRead, iOff, &pTab->base.zErrMsg);
7032  }else{
7033    nRead = (int)(MIN(nBlob, ZIPFILE_BUFFER_SIZE));
7034    aRead = (u8*)&aBlob[nBlob-nRead];
7035  }
7036
7037  if( rc==SQLITE_OK ){
7038    int i;
7039
7040    /* Scan backwards looking for the signature bytes */
7041    for(i=nRead-20; i>=0; i--){
7042      if( aRead[i]==0x50 && aRead[i+1]==0x4b
7043       && aRead[i+2]==0x05 && aRead[i+3]==0x06
7044      ){
7045        break;
7046      }
7047    }
7048    if( i<0 ){
7049      pTab->base.zErrMsg = sqlite3_mprintf(
7050          "cannot find end of central directory record"
7051      );
7052      return SQLITE_ERROR;
7053    }
7054
7055    aRead += i+4;
7056    pEOCD->iDisk = zipfileRead16(aRead);
7057    pEOCD->iFirstDisk = zipfileRead16(aRead);
7058    pEOCD->nEntry = zipfileRead16(aRead);
7059    pEOCD->nEntryTotal = zipfileRead16(aRead);
7060    pEOCD->nSize = zipfileRead32(aRead);
7061    pEOCD->iOffset = zipfileRead32(aRead);
7062  }
7063
7064  return rc;
7065}
7066
7067/*
7068** Add object pNew to the linked list that begins at ZipfileTab.pFirstEntry
7069** and ends with pLastEntry. If argument pBefore is NULL, then pNew is added
7070** to the end of the list. Otherwise, it is added to the list immediately
7071** before pBefore (which is guaranteed to be a part of said list).
7072*/
7073static void zipfileAddEntry(
7074  ZipfileTab *pTab,
7075  ZipfileEntry *pBefore,
7076  ZipfileEntry *pNew
7077){
7078  assert( (pTab->pFirstEntry==0)==(pTab->pLastEntry==0) );
7079  assert( pNew->pNext==0 );
7080  if( pBefore==0 ){
7081    if( pTab->pFirstEntry==0 ){
7082      pTab->pFirstEntry = pTab->pLastEntry = pNew;
7083    }else{
7084      assert( pTab->pLastEntry->pNext==0 );
7085      pTab->pLastEntry->pNext = pNew;
7086      pTab->pLastEntry = pNew;
7087    }
7088  }else{
7089    ZipfileEntry **pp;
7090    for(pp=&pTab->pFirstEntry; *pp!=pBefore; pp=&((*pp)->pNext));
7091    pNew->pNext = pBefore;
7092    *pp = pNew;
7093  }
7094}
7095
7096static int zipfileLoadDirectory(ZipfileTab *pTab, const u8 *aBlob, int nBlob){
7097  ZipfileEOCD eocd;
7098  int rc;
7099  int i;
7100  i64 iOff;
7101
7102  rc = zipfileReadEOCD(pTab, aBlob, nBlob, pTab->pWriteFd, &eocd);
7103  iOff = eocd.iOffset;
7104  for(i=0; rc==SQLITE_OK && i<eocd.nEntry; i++){
7105    ZipfileEntry *pNew = 0;
7106    rc = zipfileGetEntry(pTab, aBlob, nBlob, pTab->pWriteFd, iOff, &pNew);
7107
7108    if( rc==SQLITE_OK ){
7109      zipfileAddEntry(pTab, 0, pNew);
7110      iOff += ZIPFILE_CDS_FIXED_SZ;
7111      iOff += (int)pNew->cds.nExtra + pNew->cds.nFile + pNew->cds.nComment;
7112    }
7113  }
7114  return rc;
7115}
7116
7117/*
7118** xFilter callback.
7119*/
7120static int zipfileFilter(
7121  sqlite3_vtab_cursor *cur,
7122  int idxNum, const char *idxStr,
7123  int argc, sqlite3_value **argv
7124){
7125  ZipfileTab *pTab = (ZipfileTab*)cur->pVtab;
7126  ZipfileCsr *pCsr = (ZipfileCsr*)cur;
7127  const char *zFile = 0;          /* Zip file to scan */
7128  int rc = SQLITE_OK;             /* Return Code */
7129  int bInMemory = 0;              /* True for an in-memory zipfile */
7130
7131  zipfileResetCursor(pCsr);
7132
7133  if( pTab->zFile ){
7134    zFile = pTab->zFile;
7135  }else if( idxNum==0 ){
7136    zipfileCursorErr(pCsr, "zipfile() function requires an argument");
7137    return SQLITE_ERROR;
7138  }else if( sqlite3_value_type(argv[0])==SQLITE_BLOB ){
7139    const u8 *aBlob = (const u8*)sqlite3_value_blob(argv[0]);
7140    int nBlob = sqlite3_value_bytes(argv[0]);
7141    assert( pTab->pFirstEntry==0 );
7142    rc = zipfileLoadDirectory(pTab, aBlob, nBlob);
7143    pCsr->pFreeEntry = pTab->pFirstEntry;
7144    pTab->pFirstEntry = pTab->pLastEntry = 0;
7145    if( rc!=SQLITE_OK ) return rc;
7146    bInMemory = 1;
7147  }else{
7148    zFile = (const char*)sqlite3_value_text(argv[0]);
7149  }
7150
7151  if( 0==pTab->pWriteFd && 0==bInMemory ){
7152    pCsr->pFile = fopen(zFile, "rb");
7153    if( pCsr->pFile==0 ){
7154      zipfileCursorErr(pCsr, "cannot open file: %s", zFile);
7155      rc = SQLITE_ERROR;
7156    }else{
7157      rc = zipfileReadEOCD(pTab, 0, 0, pCsr->pFile, &pCsr->eocd);
7158      if( rc==SQLITE_OK ){
7159        if( pCsr->eocd.nEntry==0 ){
7160          pCsr->bEof = 1;
7161        }else{
7162          pCsr->iNextOff = pCsr->eocd.iOffset;
7163          rc = zipfileNext(cur);
7164        }
7165      }
7166    }
7167  }else{
7168    pCsr->bNoop = 1;
7169    pCsr->pCurrent = pCsr->pFreeEntry ? pCsr->pFreeEntry : pTab->pFirstEntry;
7170    rc = zipfileNext(cur);
7171  }
7172
7173  return rc;
7174}
7175
7176/*
7177** xBestIndex callback.
7178*/
7179static int zipfileBestIndex(
7180  sqlite3_vtab *tab,
7181  sqlite3_index_info *pIdxInfo
7182){
7183  int i;
7184  int idx = -1;
7185  int unusable = 0;
7186
7187  for(i=0; i<pIdxInfo->nConstraint; i++){
7188    const struct sqlite3_index_constraint *pCons = &pIdxInfo->aConstraint[i];
7189    if( pCons->iColumn!=ZIPFILE_F_COLUMN_IDX ) continue;
7190    if( pCons->usable==0 ){
7191      unusable = 1;
7192    }else if( pCons->op==SQLITE_INDEX_CONSTRAINT_EQ ){
7193      idx = i;
7194    }
7195  }
7196  pIdxInfo->estimatedCost = 1000.0;
7197  if( idx>=0 ){
7198    pIdxInfo->aConstraintUsage[idx].argvIndex = 1;
7199    pIdxInfo->aConstraintUsage[idx].omit = 1;
7200    pIdxInfo->idxNum = 1;
7201  }else if( unusable ){
7202    return SQLITE_CONSTRAINT;
7203  }
7204  return SQLITE_OK;
7205}
7206
7207static ZipfileEntry *zipfileNewEntry(const char *zPath){
7208  ZipfileEntry *pNew;
7209  pNew = sqlite3_malloc(sizeof(ZipfileEntry));
7210  if( pNew ){
7211    memset(pNew, 0, sizeof(ZipfileEntry));
7212    pNew->cds.zFile = sqlite3_mprintf("%s", zPath);
7213    if( pNew->cds.zFile==0 ){
7214      sqlite3_free(pNew);
7215      pNew = 0;
7216    }
7217  }
7218  return pNew;
7219}
7220
7221static int zipfileSerializeLFH(ZipfileEntry *pEntry, u8 *aBuf){
7222  ZipfileCDS *pCds = &pEntry->cds;
7223  u8 *a = aBuf;
7224
7225  pCds->nExtra = 9;
7226
7227  /* Write the LFH itself */
7228  zipfileWrite32(a, ZIPFILE_SIGNATURE_LFH);
7229  zipfileWrite16(a, pCds->iVersionExtract);
7230  zipfileWrite16(a, pCds->flags);
7231  zipfileWrite16(a, pCds->iCompression);
7232  zipfileWrite16(a, pCds->mTime);
7233  zipfileWrite16(a, pCds->mDate);
7234  zipfileWrite32(a, pCds->crc32);
7235  zipfileWrite32(a, pCds->szCompressed);
7236  zipfileWrite32(a, pCds->szUncompressed);
7237  zipfileWrite16(a, (u16)pCds->nFile);
7238  zipfileWrite16(a, pCds->nExtra);
7239  assert( a==&aBuf[ZIPFILE_LFH_FIXED_SZ] );
7240
7241  /* Add the file name */
7242  memcpy(a, pCds->zFile, (int)pCds->nFile);
7243  a += (int)pCds->nFile;
7244
7245  /* The "extra" data */
7246  zipfileWrite16(a, ZIPFILE_EXTRA_TIMESTAMP);
7247  zipfileWrite16(a, 5);
7248  *a++ = 0x01;
7249  zipfileWrite32(a, pEntry->mUnixTime);
7250
7251  return a-aBuf;
7252}
7253
7254static int zipfileAppendEntry(
7255  ZipfileTab *pTab,
7256  ZipfileEntry *pEntry,
7257  const u8 *pData,
7258  int nData
7259){
7260  u8 *aBuf = pTab->aBuffer;
7261  int nBuf;
7262  int rc;
7263
7264  nBuf = zipfileSerializeLFH(pEntry, aBuf);
7265  rc = zipfileAppendData(pTab, aBuf, nBuf);
7266  if( rc==SQLITE_OK ){
7267    pEntry->iDataOff = pTab->szCurrent;
7268    rc = zipfileAppendData(pTab, pData, nData);
7269  }
7270
7271  return rc;
7272}
7273
7274static int zipfileGetMode(
7275  sqlite3_value *pVal,
7276  int bIsDir,                     /* If true, default to directory */
7277  u32 *pMode,                     /* OUT: Mode value */
7278  char **pzErr                    /* OUT: Error message */
7279){
7280  const char *z = (const char*)sqlite3_value_text(pVal);
7281  u32 mode = 0;
7282  if( z==0 ){
7283    mode = (bIsDir ? (S_IFDIR + 0755) : (S_IFREG + 0644));
7284  }else if( z[0]>='0' && z[0]<='9' ){
7285    mode = (unsigned int)sqlite3_value_int(pVal);
7286  }else{
7287    const char zTemplate[11] = "-rwxrwxrwx";
7288    int i;
7289    if( strlen(z)!=10 ) goto parse_error;
7290    switch( z[0] ){
7291      case '-': mode |= S_IFREG; break;
7292      case 'd': mode |= S_IFDIR; break;
7293      case 'l': mode |= S_IFLNK; break;
7294      default: goto parse_error;
7295    }
7296    for(i=1; i<10; i++){
7297      if( z[i]==zTemplate[i] ) mode |= 1 << (9-i);
7298      else if( z[i]!='-' ) goto parse_error;
7299    }
7300  }
7301  if( ((mode & S_IFDIR)==0)==bIsDir ){
7302    /* The "mode" attribute is a directory, but data has been specified.
7303    ** Or vice-versa - no data but "mode" is a file or symlink.  */
7304    *pzErr = sqlite3_mprintf("zipfile: mode does not match data");
7305    return SQLITE_CONSTRAINT;
7306  }
7307  *pMode = mode;
7308  return SQLITE_OK;
7309
7310 parse_error:
7311  *pzErr = sqlite3_mprintf("zipfile: parse error in mode: %s", z);
7312  return SQLITE_ERROR;
7313}
7314
7315/*
7316** Both (const char*) arguments point to nul-terminated strings. Argument
7317** nB is the value of strlen(zB). This function returns 0 if the strings are
7318** identical, ignoring any trailing '/' character in either path.  */
7319static int zipfileComparePath(const char *zA, const char *zB, int nB){
7320  int nA = (int)strlen(zA);
7321  if( nA>0 && zA[nA-1]=='/' ) nA--;
7322  if( nB>0 && zB[nB-1]=='/' ) nB--;
7323  if( nA==nB && memcmp(zA, zB, nA)==0 ) return 0;
7324  return 1;
7325}
7326
7327static int zipfileBegin(sqlite3_vtab *pVtab){
7328  ZipfileTab *pTab = (ZipfileTab*)pVtab;
7329  int rc = SQLITE_OK;
7330
7331  assert( pTab->pWriteFd==0 );
7332  if( pTab->zFile==0 || pTab->zFile[0]==0 ){
7333    pTab->base.zErrMsg = sqlite3_mprintf("zipfile: missing filename");
7334    return SQLITE_ERROR;
7335  }
7336
7337  /* Open a write fd on the file. Also load the entire central directory
7338  ** structure into memory. During the transaction any new file data is
7339  ** appended to the archive file, but the central directory is accumulated
7340  ** in main-memory until the transaction is committed.  */
7341  pTab->pWriteFd = fopen(pTab->zFile, "ab+");
7342  if( pTab->pWriteFd==0 ){
7343    pTab->base.zErrMsg = sqlite3_mprintf(
7344        "zipfile: failed to open file %s for writing", pTab->zFile
7345        );
7346    rc = SQLITE_ERROR;
7347  }else{
7348    fseek(pTab->pWriteFd, 0, SEEK_END);
7349    pTab->szCurrent = pTab->szOrig = (i64)ftell(pTab->pWriteFd);
7350    rc = zipfileLoadDirectory(pTab, 0, 0);
7351  }
7352
7353  if( rc!=SQLITE_OK ){
7354    zipfileCleanupTransaction(pTab);
7355  }
7356
7357  return rc;
7358}
7359
7360/*
7361** Return the current time as a 32-bit timestamp in UNIX epoch format (like
7362** time(2)).
7363*/
7364static u32 zipfileTime(void){
7365  sqlite3_vfs *pVfs = sqlite3_vfs_find(0);
7366  u32 ret;
7367  if( pVfs->iVersion>=2 && pVfs->xCurrentTimeInt64 ){
7368    i64 ms;
7369    pVfs->xCurrentTimeInt64(pVfs, &ms);
7370    ret = (u32)((ms/1000) - ((i64)24405875 * 8640));
7371  }else{
7372    double day;
7373    pVfs->xCurrentTime(pVfs, &day);
7374    ret = (u32)((day - 2440587.5) * 86400);
7375  }
7376  return ret;
7377}
7378
7379/*
7380** Return a 32-bit timestamp in UNIX epoch format.
7381**
7382** If the value passed as the only argument is either NULL or an SQL NULL,
7383** return the current time. Otherwise, return the value stored in (*pVal)
7384** cast to a 32-bit unsigned integer.
7385*/
7386static u32 zipfileGetTime(sqlite3_value *pVal){
7387  if( pVal==0 || sqlite3_value_type(pVal)==SQLITE_NULL ){
7388    return zipfileTime();
7389  }
7390  return (u32)sqlite3_value_int64(pVal);
7391}
7392
7393/*
7394** Unless it is NULL, entry pOld is currently part of the pTab->pFirstEntry
7395** linked list.  Remove it from the list and free the object.
7396*/
7397static void zipfileRemoveEntryFromList(ZipfileTab *pTab, ZipfileEntry *pOld){
7398  if( pOld ){
7399    ZipfileEntry **pp;
7400    for(pp=&pTab->pFirstEntry; (*pp)!=pOld; pp=&((*pp)->pNext));
7401    *pp = (*pp)->pNext;
7402    zipfileEntryFree(pOld);
7403  }
7404}
7405
7406/*
7407** xUpdate method.
7408*/
7409static int zipfileUpdate(
7410  sqlite3_vtab *pVtab,
7411  int nVal,
7412  sqlite3_value **apVal,
7413  sqlite_int64 *pRowid
7414){
7415  ZipfileTab *pTab = (ZipfileTab*)pVtab;
7416  int rc = SQLITE_OK;             /* Return Code */
7417  ZipfileEntry *pNew = 0;         /* New in-memory CDS entry */
7418
7419  u32 mode = 0;                   /* Mode for new entry */
7420  u32 mTime = 0;                  /* Modification time for new entry */
7421  i64 sz = 0;                     /* Uncompressed size */
7422  const char *zPath = 0;          /* Path for new entry */
7423  int nPath = 0;                  /* strlen(zPath) */
7424  const u8 *pData = 0;            /* Pointer to buffer containing content */
7425  int nData = 0;                  /* Size of pData buffer in bytes */
7426  int iMethod = 0;                /* Compression method for new entry */
7427  u8 *pFree = 0;                  /* Free this */
7428  char *zFree = 0;                /* Also free this */
7429  ZipfileEntry *pOld = 0;
7430  ZipfileEntry *pOld2 = 0;
7431  int bUpdate = 0;                /* True for an update that modifies "name" */
7432  int bIsDir = 0;
7433  u32 iCrc32 = 0;
7434
7435  if( pTab->pWriteFd==0 ){
7436    rc = zipfileBegin(pVtab);
7437    if( rc!=SQLITE_OK ) return rc;
7438  }
7439
7440  /* If this is a DELETE or UPDATE, find the archive entry to delete. */
7441  if( sqlite3_value_type(apVal[0])!=SQLITE_NULL ){
7442    const char *zDelete = (const char*)sqlite3_value_text(apVal[0]);
7443    int nDelete = (int)strlen(zDelete);
7444    if( nVal>1 ){
7445      const char *zUpdate = (const char*)sqlite3_value_text(apVal[1]);
7446      if( zUpdate && zipfileComparePath(zUpdate, zDelete, nDelete)!=0 ){
7447        bUpdate = 1;
7448      }
7449    }
7450    for(pOld=pTab->pFirstEntry; 1; pOld=pOld->pNext){
7451      if( zipfileComparePath(pOld->cds.zFile, zDelete, nDelete)==0 ){
7452        break;
7453      }
7454      assert( pOld->pNext );
7455    }
7456  }
7457
7458  if( nVal>1 ){
7459    /* Check that "sz" and "rawdata" are both NULL: */
7460    if( sqlite3_value_type(apVal[5])!=SQLITE_NULL ){
7461      zipfileTableErr(pTab, "sz must be NULL");
7462      rc = SQLITE_CONSTRAINT;
7463    }
7464    if( sqlite3_value_type(apVal[6])!=SQLITE_NULL ){
7465      zipfileTableErr(pTab, "rawdata must be NULL");
7466      rc = SQLITE_CONSTRAINT;
7467    }
7468
7469    if( rc==SQLITE_OK ){
7470      if( sqlite3_value_type(apVal[7])==SQLITE_NULL ){
7471        /* data=NULL. A directory */
7472        bIsDir = 1;
7473      }else{
7474        /* Value specified for "data", and possibly "method". This must be
7475        ** a regular file or a symlink. */
7476        const u8 *aIn = sqlite3_value_blob(apVal[7]);
7477        int nIn = sqlite3_value_bytes(apVal[7]);
7478        int bAuto = sqlite3_value_type(apVal[8])==SQLITE_NULL;
7479
7480        iMethod = sqlite3_value_int(apVal[8]);
7481        sz = nIn;
7482        pData = aIn;
7483        nData = nIn;
7484        if( iMethod!=0 && iMethod!=8 ){
7485          zipfileTableErr(pTab, "unknown compression method: %d", iMethod);
7486          rc = SQLITE_CONSTRAINT;
7487        }else{
7488          if( bAuto || iMethod ){
7489            int nCmp;
7490            rc = zipfileDeflate(aIn, nIn, &pFree, &nCmp, &pTab->base.zErrMsg);
7491            if( rc==SQLITE_OK ){
7492              if( iMethod || nCmp<nIn ){
7493                iMethod = 8;
7494                pData = pFree;
7495                nData = nCmp;
7496              }
7497            }
7498          }
7499          iCrc32 = crc32(0, aIn, nIn);
7500        }
7501      }
7502    }
7503
7504    if( rc==SQLITE_OK ){
7505      rc = zipfileGetMode(apVal[3], bIsDir, &mode, &pTab->base.zErrMsg);
7506    }
7507
7508    if( rc==SQLITE_OK ){
7509      zPath = (const char*)sqlite3_value_text(apVal[2]);
7510      if( zPath==0 ) zPath = "";
7511      nPath = (int)strlen(zPath);
7512      mTime = zipfileGetTime(apVal[4]);
7513    }
7514
7515    if( rc==SQLITE_OK && bIsDir ){
7516      /* For a directory, check that the last character in the path is a
7517      ** '/'. This appears to be required for compatibility with info-zip
7518      ** (the unzip command on unix). It does not create directories
7519      ** otherwise.  */
7520      if( nPath<=0 || zPath[nPath-1]!='/' ){
7521        zFree = sqlite3_mprintf("%s/", zPath);
7522        zPath = (const char*)zFree;
7523        if( zFree==0 ){
7524          rc = SQLITE_NOMEM;
7525          nPath = 0;
7526        }else{
7527          nPath = (int)strlen(zPath);
7528        }
7529      }
7530    }
7531
7532    /* Check that we're not inserting a duplicate entry -OR- updating an
7533    ** entry with a path, thereby making it into a duplicate. */
7534    if( (pOld==0 || bUpdate) && rc==SQLITE_OK ){
7535      ZipfileEntry *p;
7536      for(p=pTab->pFirstEntry; p; p=p->pNext){
7537        if( zipfileComparePath(p->cds.zFile, zPath, nPath)==0 ){
7538          switch( sqlite3_vtab_on_conflict(pTab->db) ){
7539            case SQLITE_IGNORE: {
7540              goto zipfile_update_done;
7541            }
7542            case SQLITE_REPLACE: {
7543              pOld2 = p;
7544              break;
7545            }
7546            default: {
7547              zipfileTableErr(pTab, "duplicate name: \"%s\"", zPath);
7548              rc = SQLITE_CONSTRAINT;
7549              break;
7550            }
7551          }
7552          break;
7553        }
7554      }
7555    }
7556
7557    if( rc==SQLITE_OK ){
7558      /* Create the new CDS record. */
7559      pNew = zipfileNewEntry(zPath);
7560      if( pNew==0 ){
7561        rc = SQLITE_NOMEM;
7562      }else{
7563        pNew->cds.iVersionMadeBy = ZIPFILE_NEWENTRY_MADEBY;
7564        pNew->cds.iVersionExtract = ZIPFILE_NEWENTRY_REQUIRED;
7565        pNew->cds.flags = ZIPFILE_NEWENTRY_FLAGS;
7566        pNew->cds.iCompression = (u16)iMethod;
7567        zipfileMtimeToDos(&pNew->cds, mTime);
7568        pNew->cds.crc32 = iCrc32;
7569        pNew->cds.szCompressed = nData;
7570        pNew->cds.szUncompressed = (u32)sz;
7571        pNew->cds.iExternalAttr = (mode<<16);
7572        pNew->cds.iOffset = (u32)pTab->szCurrent;
7573        pNew->cds.nFile = (u16)nPath;
7574        pNew->mUnixTime = (u32)mTime;
7575        rc = zipfileAppendEntry(pTab, pNew, pData, nData);
7576        zipfileAddEntry(pTab, pOld, pNew);
7577      }
7578    }
7579  }
7580
7581  if( rc==SQLITE_OK && (pOld || pOld2) ){
7582    ZipfileCsr *pCsr;
7583    for(pCsr=pTab->pCsrList; pCsr; pCsr=pCsr->pCsrNext){
7584      if( pCsr->pCurrent && (pCsr->pCurrent==pOld || pCsr->pCurrent==pOld2) ){
7585        pCsr->pCurrent = pCsr->pCurrent->pNext;
7586        pCsr->bNoop = 1;
7587      }
7588    }
7589
7590    zipfileRemoveEntryFromList(pTab, pOld);
7591    zipfileRemoveEntryFromList(pTab, pOld2);
7592  }
7593
7594zipfile_update_done:
7595  sqlite3_free(pFree);
7596  sqlite3_free(zFree);
7597  return rc;
7598}
7599
7600static int zipfileSerializeEOCD(ZipfileEOCD *p, u8 *aBuf){
7601  u8 *a = aBuf;
7602  zipfileWrite32(a, ZIPFILE_SIGNATURE_EOCD);
7603  zipfileWrite16(a, p->iDisk);
7604  zipfileWrite16(a, p->iFirstDisk);
7605  zipfileWrite16(a, p->nEntry);
7606  zipfileWrite16(a, p->nEntryTotal);
7607  zipfileWrite32(a, p->nSize);
7608  zipfileWrite32(a, p->iOffset);
7609  zipfileWrite16(a, 0);        /* Size of trailing comment in bytes*/
7610
7611  return a-aBuf;
7612}
7613
7614static int zipfileAppendEOCD(ZipfileTab *pTab, ZipfileEOCD *p){
7615  int nBuf = zipfileSerializeEOCD(p, pTab->aBuffer);
7616  assert( nBuf==ZIPFILE_EOCD_FIXED_SZ );
7617  return zipfileAppendData(pTab, pTab->aBuffer, nBuf);
7618}
7619
7620/*
7621** Serialize the CDS structure into buffer aBuf[]. Return the number
7622** of bytes written.
7623*/
7624static int zipfileSerializeCDS(ZipfileEntry *pEntry, u8 *aBuf){
7625  u8 *a = aBuf;
7626  ZipfileCDS *pCDS = &pEntry->cds;
7627
7628  if( pEntry->aExtra==0 ){
7629    pCDS->nExtra = 9;
7630  }
7631
7632  zipfileWrite32(a, ZIPFILE_SIGNATURE_CDS);
7633  zipfileWrite16(a, pCDS->iVersionMadeBy);
7634  zipfileWrite16(a, pCDS->iVersionExtract);
7635  zipfileWrite16(a, pCDS->flags);
7636  zipfileWrite16(a, pCDS->iCompression);
7637  zipfileWrite16(a, pCDS->mTime);
7638  zipfileWrite16(a, pCDS->mDate);
7639  zipfileWrite32(a, pCDS->crc32);
7640  zipfileWrite32(a, pCDS->szCompressed);
7641  zipfileWrite32(a, pCDS->szUncompressed);
7642  assert( a==&aBuf[ZIPFILE_CDS_NFILE_OFF] );
7643  zipfileWrite16(a, pCDS->nFile);
7644  zipfileWrite16(a, pCDS->nExtra);
7645  zipfileWrite16(a, pCDS->nComment);
7646  zipfileWrite16(a, pCDS->iDiskStart);
7647  zipfileWrite16(a, pCDS->iInternalAttr);
7648  zipfileWrite32(a, pCDS->iExternalAttr);
7649  zipfileWrite32(a, pCDS->iOffset);
7650
7651  memcpy(a, pCDS->zFile, pCDS->nFile);
7652  a += pCDS->nFile;
7653
7654  if( pEntry->aExtra ){
7655    int n = (int)pCDS->nExtra + (int)pCDS->nComment;
7656    memcpy(a, pEntry->aExtra, n);
7657    a += n;
7658  }else{
7659    assert( pCDS->nExtra==9 );
7660    zipfileWrite16(a, ZIPFILE_EXTRA_TIMESTAMP);
7661    zipfileWrite16(a, 5);
7662    *a++ = 0x01;
7663    zipfileWrite32(a, pEntry->mUnixTime);
7664  }
7665
7666  return a-aBuf;
7667}
7668
7669static int zipfileCommit(sqlite3_vtab *pVtab){
7670  ZipfileTab *pTab = (ZipfileTab*)pVtab;
7671  int rc = SQLITE_OK;
7672  if( pTab->pWriteFd ){
7673    i64 iOffset = pTab->szCurrent;
7674    ZipfileEntry *p;
7675    ZipfileEOCD eocd;
7676    int nEntry = 0;
7677
7678    /* Write out all entries */
7679    for(p=pTab->pFirstEntry; rc==SQLITE_OK && p; p=p->pNext){
7680      int n = zipfileSerializeCDS(p, pTab->aBuffer);
7681      rc = zipfileAppendData(pTab, pTab->aBuffer, n);
7682      nEntry++;
7683    }
7684
7685    /* Write out the EOCD record */
7686    eocd.iDisk = 0;
7687    eocd.iFirstDisk = 0;
7688    eocd.nEntry = (u16)nEntry;
7689    eocd.nEntryTotal = (u16)nEntry;
7690    eocd.nSize = (u32)(pTab->szCurrent - iOffset);
7691    eocd.iOffset = (u32)iOffset;
7692    rc = zipfileAppendEOCD(pTab, &eocd);
7693
7694    zipfileCleanupTransaction(pTab);
7695  }
7696  return rc;
7697}
7698
7699static int zipfileRollback(sqlite3_vtab *pVtab){
7700  return zipfileCommit(pVtab);
7701}
7702
7703static ZipfileCsr *zipfileFindCursor(ZipfileTab *pTab, i64 iId){
7704  ZipfileCsr *pCsr;
7705  for(pCsr=pTab->pCsrList; pCsr; pCsr=pCsr->pCsrNext){
7706    if( iId==pCsr->iId ) break;
7707  }
7708  return pCsr;
7709}
7710
7711static void zipfileFunctionCds(
7712  sqlite3_context *context,
7713  int argc,
7714  sqlite3_value **argv
7715){
7716  ZipfileCsr *pCsr;
7717  ZipfileTab *pTab = (ZipfileTab*)sqlite3_user_data(context);
7718  assert( argc>0 );
7719
7720  pCsr = zipfileFindCursor(pTab, sqlite3_value_int64(argv[0]));
7721  if( pCsr ){
7722    ZipfileCDS *p = &pCsr->pCurrent->cds;
7723    char *zRes = sqlite3_mprintf("{"
7724        "\"version-made-by\" : %u, "
7725        "\"version-to-extract\" : %u, "
7726        "\"flags\" : %u, "
7727        "\"compression\" : %u, "
7728        "\"time\" : %u, "
7729        "\"date\" : %u, "
7730        "\"crc32\" : %u, "
7731        "\"compressed-size\" : %u, "
7732        "\"uncompressed-size\" : %u, "
7733        "\"file-name-length\" : %u, "
7734        "\"extra-field-length\" : %u, "
7735        "\"file-comment-length\" : %u, "
7736        "\"disk-number-start\" : %u, "
7737        "\"internal-attr\" : %u, "
7738        "\"external-attr\" : %u, "
7739        "\"offset\" : %u }",
7740        (u32)p->iVersionMadeBy, (u32)p->iVersionExtract,
7741        (u32)p->flags, (u32)p->iCompression,
7742        (u32)p->mTime, (u32)p->mDate,
7743        (u32)p->crc32, (u32)p->szCompressed,
7744        (u32)p->szUncompressed, (u32)p->nFile,
7745        (u32)p->nExtra, (u32)p->nComment,
7746        (u32)p->iDiskStart, (u32)p->iInternalAttr,
7747        (u32)p->iExternalAttr, (u32)p->iOffset
7748    );
7749
7750    if( zRes==0 ){
7751      sqlite3_result_error_nomem(context);
7752    }else{
7753      sqlite3_result_text(context, zRes, -1, SQLITE_TRANSIENT);
7754      sqlite3_free(zRes);
7755    }
7756  }
7757}
7758
7759/*
7760** xFindFunction method.
7761*/
7762static int zipfileFindFunction(
7763  sqlite3_vtab *pVtab,            /* Virtual table handle */
7764  int nArg,                       /* Number of SQL function arguments */
7765  const char *zName,              /* Name of SQL function */
7766  void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), /* OUT: Result */
7767  void **ppArg                    /* OUT: User data for *pxFunc */
7768){
7769  if( sqlite3_stricmp("zipfile_cds", zName)==0 ){
7770    *pxFunc = zipfileFunctionCds;
7771    *ppArg = (void*)pVtab;
7772    return 1;
7773  }
7774  return 0;
7775}
7776
7777typedef struct ZipfileBuffer ZipfileBuffer;
7778struct ZipfileBuffer {
7779  u8 *a;                          /* Pointer to buffer */
7780  int n;                          /* Size of buffer in bytes */
7781  int nAlloc;                     /* Byte allocated at a[] */
7782};
7783
7784typedef struct ZipfileCtx ZipfileCtx;
7785struct ZipfileCtx {
7786  int nEntry;
7787  ZipfileBuffer body;
7788  ZipfileBuffer cds;
7789};
7790
7791static int zipfileBufferGrow(ZipfileBuffer *pBuf, int nByte){
7792  if( pBuf->n+nByte>pBuf->nAlloc ){
7793    u8 *aNew;
7794    sqlite3_int64 nNew = pBuf->n ? pBuf->n*2 : 512;
7795    int nReq = pBuf->n + nByte;
7796
7797    while( nNew<nReq ) nNew = nNew*2;
7798    aNew = sqlite3_realloc64(pBuf->a, nNew);
7799    if( aNew==0 ) return SQLITE_NOMEM;
7800    pBuf->a = aNew;
7801    pBuf->nAlloc = (int)nNew;
7802  }
7803  return SQLITE_OK;
7804}
7805
7806/*
7807** xStep() callback for the zipfile() aggregate. This can be called in
7808** any of the following ways:
7809**
7810**   SELECT zipfile(name,data) ...
7811**   SELECT zipfile(name,mode,mtime,data) ...
7812**   SELECT zipfile(name,mode,mtime,data,method) ...
7813*/
7814void zipfileStep(sqlite3_context *pCtx, int nVal, sqlite3_value **apVal){
7815  ZipfileCtx *p;                  /* Aggregate function context */
7816  ZipfileEntry e;                 /* New entry to add to zip archive */
7817
7818  sqlite3_value *pName = 0;
7819  sqlite3_value *pMode = 0;
7820  sqlite3_value *pMtime = 0;
7821  sqlite3_value *pData = 0;
7822  sqlite3_value *pMethod = 0;
7823
7824  int bIsDir = 0;
7825  u32 mode;
7826  int rc = SQLITE_OK;
7827  char *zErr = 0;
7828
7829  int iMethod = -1;               /* Compression method to use (0 or 8) */
7830
7831  const u8 *aData = 0;            /* Possibly compressed data for new entry */
7832  int nData = 0;                  /* Size of aData[] in bytes */
7833  int szUncompressed = 0;         /* Size of data before compression */
7834  u8 *aFree = 0;                  /* Free this before returning */
7835  u32 iCrc32 = 0;                 /* crc32 of uncompressed data */
7836
7837  char *zName = 0;                /* Path (name) of new entry */
7838  int nName = 0;                  /* Size of zName in bytes */
7839  char *zFree = 0;                /* Free this before returning */
7840  int nByte;
7841
7842  memset(&e, 0, sizeof(e));
7843  p = (ZipfileCtx*)sqlite3_aggregate_context(pCtx, sizeof(ZipfileCtx));
7844  if( p==0 ) return;
7845
7846  /* Martial the arguments into stack variables */
7847  if( nVal!=2 && nVal!=4 && nVal!=5 ){
7848    zErr = sqlite3_mprintf("wrong number of arguments to function zipfile()");
7849    rc = SQLITE_ERROR;
7850    goto zipfile_step_out;
7851  }
7852  pName = apVal[0];
7853  if( nVal==2 ){
7854    pData = apVal[1];
7855  }else{
7856    pMode = apVal[1];
7857    pMtime = apVal[2];
7858    pData = apVal[3];
7859    if( nVal==5 ){
7860      pMethod = apVal[4];
7861    }
7862  }
7863
7864  /* Check that the 'name' parameter looks ok. */
7865  zName = (char*)sqlite3_value_text(pName);
7866  nName = sqlite3_value_bytes(pName);
7867  if( zName==0 ){
7868    zErr = sqlite3_mprintf("first argument to zipfile() must be non-NULL");
7869    rc = SQLITE_ERROR;
7870    goto zipfile_step_out;
7871  }
7872
7873  /* Inspect the 'method' parameter. This must be either 0 (store), 8 (use
7874  ** deflate compression) or NULL (choose automatically).  */
7875  if( pMethod && SQLITE_NULL!=sqlite3_value_type(pMethod) ){
7876    iMethod = (int)sqlite3_value_int64(pMethod);
7877    if( iMethod!=0 && iMethod!=8 ){
7878      zErr = sqlite3_mprintf("illegal method value: %d", iMethod);
7879      rc = SQLITE_ERROR;
7880      goto zipfile_step_out;
7881    }
7882  }
7883
7884  /* Now inspect the data. If this is NULL, then the new entry must be a
7885  ** directory.  Otherwise, figure out whether or not the data should
7886  ** be deflated or simply stored in the zip archive. */
7887  if( sqlite3_value_type(pData)==SQLITE_NULL ){
7888    bIsDir = 1;
7889    iMethod = 0;
7890  }else{
7891    aData = sqlite3_value_blob(pData);
7892    szUncompressed = nData = sqlite3_value_bytes(pData);
7893    iCrc32 = crc32(0, aData, nData);
7894    if( iMethod<0 || iMethod==8 ){
7895      int nOut = 0;
7896      rc = zipfileDeflate(aData, nData, &aFree, &nOut, &zErr);
7897      if( rc!=SQLITE_OK ){
7898        goto zipfile_step_out;
7899      }
7900      if( iMethod==8 || nOut<nData ){
7901        aData = aFree;
7902        nData = nOut;
7903        iMethod = 8;
7904      }else{
7905        iMethod = 0;
7906      }
7907    }
7908  }
7909
7910  /* Decode the "mode" argument. */
7911  rc = zipfileGetMode(pMode, bIsDir, &mode, &zErr);
7912  if( rc ) goto zipfile_step_out;
7913
7914  /* Decode the "mtime" argument. */
7915  e.mUnixTime = zipfileGetTime(pMtime);
7916
7917  /* If this is a directory entry, ensure that there is exactly one '/'
7918  ** at the end of the path. Or, if this is not a directory and the path
7919  ** ends in '/' it is an error. */
7920  if( bIsDir==0 ){
7921    if( nName>0 && zName[nName-1]=='/' ){
7922      zErr = sqlite3_mprintf("non-directory name must not end with /");
7923      rc = SQLITE_ERROR;
7924      goto zipfile_step_out;
7925    }
7926  }else{
7927    if( nName==0 || zName[nName-1]!='/' ){
7928      zName = zFree = sqlite3_mprintf("%s/", zName);
7929      if( zName==0 ){
7930        rc = SQLITE_NOMEM;
7931        goto zipfile_step_out;
7932      }
7933      nName = (int)strlen(zName);
7934    }else{
7935      while( nName>1 && zName[nName-2]=='/' ) nName--;
7936    }
7937  }
7938
7939  /* Assemble the ZipfileEntry object for the new zip archive entry */
7940  e.cds.iVersionMadeBy = ZIPFILE_NEWENTRY_MADEBY;
7941  e.cds.iVersionExtract = ZIPFILE_NEWENTRY_REQUIRED;
7942  e.cds.flags = ZIPFILE_NEWENTRY_FLAGS;
7943  e.cds.iCompression = (u16)iMethod;
7944  zipfileMtimeToDos(&e.cds, (u32)e.mUnixTime);
7945  e.cds.crc32 = iCrc32;
7946  e.cds.szCompressed = nData;
7947  e.cds.szUncompressed = szUncompressed;
7948  e.cds.iExternalAttr = (mode<<16);
7949  e.cds.iOffset = p->body.n;
7950  e.cds.nFile = (u16)nName;
7951  e.cds.zFile = zName;
7952
7953  /* Append the LFH to the body of the new archive */
7954  nByte = ZIPFILE_LFH_FIXED_SZ + e.cds.nFile + 9;
7955  if( (rc = zipfileBufferGrow(&p->body, nByte)) ) goto zipfile_step_out;
7956  p->body.n += zipfileSerializeLFH(&e, &p->body.a[p->body.n]);
7957
7958  /* Append the data to the body of the new archive */
7959  if( nData>0 ){
7960    if( (rc = zipfileBufferGrow(&p->body, nData)) ) goto zipfile_step_out;
7961    memcpy(&p->body.a[p->body.n], aData, nData);
7962    p->body.n += nData;
7963  }
7964
7965  /* Append the CDS record to the directory of the new archive */
7966  nByte = ZIPFILE_CDS_FIXED_SZ + e.cds.nFile + 9;
7967  if( (rc = zipfileBufferGrow(&p->cds, nByte)) ) goto zipfile_step_out;
7968  p->cds.n += zipfileSerializeCDS(&e, &p->cds.a[p->cds.n]);
7969
7970  /* Increment the count of entries in the archive */
7971  p->nEntry++;
7972
7973 zipfile_step_out:
7974  sqlite3_free(aFree);
7975  sqlite3_free(zFree);
7976  if( rc ){
7977    if( zErr ){
7978      sqlite3_result_error(pCtx, zErr, -1);
7979    }else{
7980      sqlite3_result_error_code(pCtx, rc);
7981    }
7982  }
7983  sqlite3_free(zErr);
7984}
7985
7986/*
7987** xFinalize() callback for zipfile aggregate function.
7988*/
7989void zipfileFinal(sqlite3_context *pCtx){
7990  ZipfileCtx *p;
7991  ZipfileEOCD eocd;
7992  sqlite3_int64 nZip;
7993  u8 *aZip;
7994
7995  p = (ZipfileCtx*)sqlite3_aggregate_context(pCtx, sizeof(ZipfileCtx));
7996  if( p==0 ) return;
7997  if( p->nEntry>0 ){
7998    memset(&eocd, 0, sizeof(eocd));
7999    eocd.nEntry = (u16)p->nEntry;
8000    eocd.nEntryTotal = (u16)p->nEntry;
8001    eocd.nSize = p->cds.n;
8002    eocd.iOffset = p->body.n;
8003
8004    nZip = p->body.n + p->cds.n + ZIPFILE_EOCD_FIXED_SZ;
8005    aZip = (u8*)sqlite3_malloc64(nZip);
8006    if( aZip==0 ){
8007      sqlite3_result_error_nomem(pCtx);
8008    }else{
8009      memcpy(aZip, p->body.a, p->body.n);
8010      memcpy(&aZip[p->body.n], p->cds.a, p->cds.n);
8011      zipfileSerializeEOCD(&eocd, &aZip[p->body.n + p->cds.n]);
8012      sqlite3_result_blob(pCtx, aZip, (int)nZip, zipfileFree);
8013    }
8014  }
8015
8016  sqlite3_free(p->body.a);
8017  sqlite3_free(p->cds.a);
8018}
8019
8020
8021/*
8022** Register the "zipfile" virtual table.
8023*/
8024static int zipfileRegister(sqlite3 *db){
8025  static sqlite3_module zipfileModule = {
8026    1,                         /* iVersion */
8027    zipfileConnect,            /* xCreate */
8028    zipfileConnect,            /* xConnect */
8029    zipfileBestIndex,          /* xBestIndex */
8030    zipfileDisconnect,         /* xDisconnect */
8031    zipfileDisconnect,         /* xDestroy */
8032    zipfileOpen,               /* xOpen - open a cursor */
8033    zipfileClose,              /* xClose - close a cursor */
8034    zipfileFilter,             /* xFilter - configure scan constraints */
8035    zipfileNext,               /* xNext - advance a cursor */
8036    zipfileEof,                /* xEof - check for end of scan */
8037    zipfileColumn,             /* xColumn - read data */
8038    0,                         /* xRowid - read data */
8039    zipfileUpdate,             /* xUpdate */
8040    zipfileBegin,              /* xBegin */
8041    0,                         /* xSync */
8042    zipfileCommit,             /* xCommit */
8043    zipfileRollback,           /* xRollback */
8044    zipfileFindFunction,       /* xFindMethod */
8045    0,                         /* xRename */
8046  };
8047
8048  int rc = sqlite3_create_module(db, "zipfile"  , &zipfileModule, 0);
8049  if( rc==SQLITE_OK ) rc = sqlite3_overload_function(db, "zipfile_cds", -1);
8050  if( rc==SQLITE_OK ){
8051    rc = sqlite3_create_function(db, "zipfile", -1, SQLITE_UTF8, 0, 0,
8052        zipfileStep, zipfileFinal
8053    );
8054  }
8055  return rc;
8056}
8057#else         /* SQLITE_OMIT_VIRTUALTABLE */
8058# define zipfileRegister(x) SQLITE_OK
8059#endif
8060
8061#ifdef _WIN32
8062
8063#endif
8064int sqlite3_zipfile_init(
8065  sqlite3 *db,
8066  char **pzErrMsg,
8067  const sqlite3_api_routines *pApi
8068){
8069  SQLITE_EXTENSION_INIT2(pApi);
8070  (void)pzErrMsg;  /* Unused parameter */
8071  return zipfileRegister(db);
8072}
8073
8074/************************* End ../ext/misc/zipfile.c ********************/
8075/************************* Begin ../ext/misc/sqlar.c ******************/
8076/*
8077** 2017-12-17
8078**
8079** The author disclaims copyright to this source code.  In place of
8080** a legal notice, here is a blessing:
8081**
8082**    May you do good and not evil.
8083**    May you find forgiveness for yourself and forgive others.
8084**    May you share freely, never taking more than you give.
8085**
8086******************************************************************************
8087**
8088** Utility functions sqlar_compress() and sqlar_uncompress(). Useful
8089** for working with sqlar archives and used by the shell tool's built-in
8090** sqlar support.
8091*/
8092/* #include "sqlite3ext.h" */
8093SQLITE_EXTENSION_INIT1
8094#include <zlib.h>
8095#include <assert.h>
8096
8097/*
8098** Implementation of the "sqlar_compress(X)" SQL function.
8099**
8100** If the type of X is SQLITE_BLOB, and compressing that blob using
8101** zlib utility function compress() yields a smaller blob, return the
8102** compressed blob. Otherwise, return a copy of X.
8103**
8104** SQLar uses the "zlib format" for compressed content.  The zlib format
8105** contains a two-byte identification header and a four-byte checksum at
8106** the end.  This is different from ZIP which uses the raw deflate format.
8107**
8108** Future enhancements to SQLar might add support for new compression formats.
8109** If so, those new formats will be identified by alternative headers in the
8110** compressed data.
8111*/
8112static void sqlarCompressFunc(
8113  sqlite3_context *context,
8114  int argc,
8115  sqlite3_value **argv
8116){
8117  assert( argc==1 );
8118  if( sqlite3_value_type(argv[0])==SQLITE_BLOB ){
8119    const Bytef *pData = sqlite3_value_blob(argv[0]);
8120    uLong nData = sqlite3_value_bytes(argv[0]);
8121    uLongf nOut = compressBound(nData);
8122    Bytef *pOut;
8123
8124    pOut = (Bytef*)sqlite3_malloc(nOut);
8125    if( pOut==0 ){
8126      sqlite3_result_error_nomem(context);
8127      return;
8128    }else{
8129      if( Z_OK!=compress(pOut, &nOut, pData, nData) ){
8130        sqlite3_result_error(context, "error in compress()", -1);
8131      }else if( nOut<nData ){
8132        sqlite3_result_blob(context, pOut, nOut, SQLITE_TRANSIENT);
8133      }else{
8134        sqlite3_result_value(context, argv[0]);
8135      }
8136      sqlite3_free(pOut);
8137    }
8138  }else{
8139    sqlite3_result_value(context, argv[0]);
8140  }
8141}
8142
8143/*
8144** Implementation of the "sqlar_uncompress(X,SZ)" SQL function
8145**
8146** Parameter SZ is interpreted as an integer. If it is less than or
8147** equal to zero, then this function returns a copy of X. Or, if
8148** SZ is equal to the size of X when interpreted as a blob, also
8149** return a copy of X. Otherwise, decompress blob X using zlib
8150** utility function uncompress() and return the results (another
8151** blob).
8152*/
8153static void sqlarUncompressFunc(
8154  sqlite3_context *context,
8155  int argc,
8156  sqlite3_value **argv
8157){
8158  uLong nData;
8159  uLongf sz;
8160
8161  assert( argc==2 );
8162  sz = sqlite3_value_int(argv[1]);
8163
8164  if( sz<=0 || sz==(nData = sqlite3_value_bytes(argv[0])) ){
8165    sqlite3_result_value(context, argv[0]);
8166  }else{
8167    const Bytef *pData= sqlite3_value_blob(argv[0]);
8168    Bytef *pOut = sqlite3_malloc(sz);
8169    if( Z_OK!=uncompress(pOut, &sz, pData, nData) ){
8170      sqlite3_result_error(context, "error in uncompress()", -1);
8171    }else{
8172      sqlite3_result_blob(context, pOut, sz, SQLITE_TRANSIENT);
8173    }
8174    sqlite3_free(pOut);
8175  }
8176}
8177
8178
8179#ifdef _WIN32
8180
8181#endif
8182int sqlite3_sqlar_init(
8183  sqlite3 *db,
8184  char **pzErrMsg,
8185  const sqlite3_api_routines *pApi
8186){
8187  int rc = SQLITE_OK;
8188  SQLITE_EXTENSION_INIT2(pApi);
8189  (void)pzErrMsg;  /* Unused parameter */
8190  rc = sqlite3_create_function(db, "sqlar_compress", 1,
8191                               SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
8192                               sqlarCompressFunc, 0, 0);
8193  if( rc==SQLITE_OK ){
8194    rc = sqlite3_create_function(db, "sqlar_uncompress", 2,
8195                                 SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
8196                                 sqlarUncompressFunc, 0, 0);
8197  }
8198  return rc;
8199}
8200
8201/************************* End ../ext/misc/sqlar.c ********************/
8202#endif
8203/************************* Begin ../ext/expert/sqlite3expert.h ******************/
8204/*
8205** 2017 April 07
8206**
8207** The author disclaims copyright to this source code.  In place of
8208** a legal notice, here is a blessing:
8209**
8210**    May you do good and not evil.
8211**    May you find forgiveness for yourself and forgive others.
8212**    May you share freely, never taking more than you give.
8213**
8214*************************************************************************
8215*/
8216#if !defined(SQLITEEXPERT_H)
8217#define SQLITEEXPERT_H 1
8218/* #include "sqlite3.h" */
8219
8220typedef struct sqlite3expert sqlite3expert;
8221
8222/*
8223** Create a new sqlite3expert object.
8224**
8225** If successful, a pointer to the new object is returned and (*pzErr) set
8226** to NULL. Or, if an error occurs, NULL is returned and (*pzErr) set to
8227** an English-language error message. In this case it is the responsibility
8228** of the caller to eventually free the error message buffer using
8229** sqlite3_free().
8230*/
8231sqlite3expert *sqlite3_expert_new(sqlite3 *db, char **pzErr);
8232
8233/*
8234** Configure an sqlite3expert object.
8235**
8236** EXPERT_CONFIG_SAMPLE:
8237**   By default, sqlite3_expert_analyze() generates sqlite_stat1 data for
8238**   each candidate index. This involves scanning and sorting the entire
8239**   contents of each user database table once for each candidate index
8240**   associated with the table. For large databases, this can be
8241**   prohibitively slow. This option allows the sqlite3expert object to
8242**   be configured so that sqlite_stat1 data is instead generated based on a
8243**   subset of each table, or so that no sqlite_stat1 data is used at all.
8244**
8245**   A single integer argument is passed to this option. If the value is less
8246**   than or equal to zero, then no sqlite_stat1 data is generated or used by
8247**   the analysis - indexes are recommended based on the database schema only.
8248**   Or, if the value is 100 or greater, complete sqlite_stat1 data is
8249**   generated for each candidate index (this is the default). Finally, if the
8250**   value falls between 0 and 100, then it represents the percentage of user
8251**   table rows that should be considered when generating sqlite_stat1 data.
8252**
8253**   Examples:
8254**
8255**     // Do not generate any sqlite_stat1 data
8256**     sqlite3_expert_config(pExpert, EXPERT_CONFIG_SAMPLE, 0);
8257**
8258**     // Generate sqlite_stat1 data based on 10% of the rows in each table.
8259**     sqlite3_expert_config(pExpert, EXPERT_CONFIG_SAMPLE, 10);
8260*/
8261int sqlite3_expert_config(sqlite3expert *p, int op, ...);
8262
8263#define EXPERT_CONFIG_SAMPLE 1    /* int */
8264
8265/*
8266** Specify zero or more SQL statements to be included in the analysis.
8267**
8268** Buffer zSql must contain zero or more complete SQL statements. This
8269** function parses all statements contained in the buffer and adds them
8270** to the internal list of statements to analyze. If successful, SQLITE_OK
8271** is returned and (*pzErr) set to NULL. Or, if an error occurs - for example
8272** due to a error in the SQL - an SQLite error code is returned and (*pzErr)
8273** may be set to point to an English language error message. In this case
8274** the caller is responsible for eventually freeing the error message buffer
8275** using sqlite3_free().
8276**
8277** If an error does occur while processing one of the statements in the
8278** buffer passed as the second argument, none of the statements in the
8279** buffer are added to the analysis.
8280**
8281** This function must be called before sqlite3_expert_analyze(). If a call
8282** to this function is made on an sqlite3expert object that has already
8283** been passed to sqlite3_expert_analyze() SQLITE_MISUSE is returned
8284** immediately and no statements are added to the analysis.
8285*/
8286int sqlite3_expert_sql(
8287  sqlite3expert *p,               /* From a successful sqlite3_expert_new() */
8288  const char *zSql,               /* SQL statement(s) to add */
8289  char **pzErr                    /* OUT: Error message (if any) */
8290);
8291
8292
8293/*
8294** This function is called after the sqlite3expert object has been configured
8295** with all SQL statements using sqlite3_expert_sql() to actually perform
8296** the analysis. Once this function has been called, it is not possible to
8297** add further SQL statements to the analysis.
8298**
8299** If successful, SQLITE_OK is returned and (*pzErr) is set to NULL. Or, if
8300** an error occurs, an SQLite error code is returned and (*pzErr) set to
8301** point to a buffer containing an English language error message. In this
8302** case it is the responsibility of the caller to eventually free the buffer
8303** using sqlite3_free().
8304**
8305** If an error does occur within this function, the sqlite3expert object
8306** is no longer useful for any purpose. At that point it is no longer
8307** possible to add further SQL statements to the object or to re-attempt
8308** the analysis. The sqlite3expert object must still be freed using a call
8309** sqlite3_expert_destroy().
8310*/
8311int sqlite3_expert_analyze(sqlite3expert *p, char **pzErr);
8312
8313/*
8314** Return the total number of statements loaded using sqlite3_expert_sql().
8315** The total number of SQL statements may be different from the total number
8316** to calls to sqlite3_expert_sql().
8317*/
8318int sqlite3_expert_count(sqlite3expert*);
8319
8320/*
8321** Return a component of the report.
8322**
8323** This function is called after sqlite3_expert_analyze() to extract the
8324** results of the analysis. Each call to this function returns either a
8325** NULL pointer or a pointer to a buffer containing a nul-terminated string.
8326** The value passed as the third argument must be one of the EXPERT_REPORT_*
8327** #define constants defined below.
8328**
8329** For some EXPERT_REPORT_* parameters, the buffer returned contains
8330** information relating to a specific SQL statement. In these cases that
8331** SQL statement is identified by the value passed as the second argument.
8332** SQL statements are numbered from 0 in the order in which they are parsed.
8333** If an out-of-range value (less than zero or equal to or greater than the
8334** value returned by sqlite3_expert_count()) is passed as the second argument
8335** along with such an EXPERT_REPORT_* parameter, NULL is always returned.
8336**
8337** EXPERT_REPORT_SQL:
8338**   Return the text of SQL statement iStmt.
8339**
8340** EXPERT_REPORT_INDEXES:
8341**   Return a buffer containing the CREATE INDEX statements for all recommended
8342**   indexes for statement iStmt. If there are no new recommeded indexes, NULL
8343**   is returned.
8344**
8345** EXPERT_REPORT_PLAN:
8346**   Return a buffer containing the EXPLAIN QUERY PLAN output for SQL query
8347**   iStmt after the proposed indexes have been added to the database schema.
8348**
8349** EXPERT_REPORT_CANDIDATES:
8350**   Return a pointer to a buffer containing the CREATE INDEX statements
8351**   for all indexes that were tested (for all SQL statements). The iStmt
8352**   parameter is ignored for EXPERT_REPORT_CANDIDATES calls.
8353*/
8354const char *sqlite3_expert_report(sqlite3expert*, int iStmt, int eReport);
8355
8356/*
8357** Values for the third argument passed to sqlite3_expert_report().
8358*/
8359#define EXPERT_REPORT_SQL        1
8360#define EXPERT_REPORT_INDEXES    2
8361#define EXPERT_REPORT_PLAN       3
8362#define EXPERT_REPORT_CANDIDATES 4
8363
8364/*
8365** Free an (sqlite3expert*) handle and all associated resources. There
8366** should be one call to this function for each successful call to
8367** sqlite3-expert_new().
8368*/
8369void sqlite3_expert_destroy(sqlite3expert*);
8370
8371#endif  /* !defined(SQLITEEXPERT_H) */
8372
8373/************************* End ../ext/expert/sqlite3expert.h ********************/
8374/************************* Begin ../ext/expert/sqlite3expert.c ******************/
8375/*
8376** 2017 April 09
8377**
8378** The author disclaims copyright to this source code.  In place of
8379** a legal notice, here is a blessing:
8380**
8381**    May you do good and not evil.
8382**    May you find forgiveness for yourself and forgive others.
8383**    May you share freely, never taking more than you give.
8384**
8385*************************************************************************
8386*/
8387/* #include "sqlite3expert.h" */
8388#include <assert.h>
8389#include <string.h>
8390#include <stdio.h>
8391
8392#ifndef SQLITE_OMIT_VIRTUALTABLE
8393
8394/* typedef sqlite3_int64 i64; */
8395/* typedef sqlite3_uint64 u64; */
8396
8397typedef struct IdxColumn IdxColumn;
8398typedef struct IdxConstraint IdxConstraint;
8399typedef struct IdxScan IdxScan;
8400typedef struct IdxStatement IdxStatement;
8401typedef struct IdxTable IdxTable;
8402typedef struct IdxWrite IdxWrite;
8403
8404#define STRLEN  (int)strlen
8405
8406/*
8407** A temp table name that we assume no user database will actually use.
8408** If this assumption proves incorrect triggers on the table with the
8409** conflicting name will be ignored.
8410*/
8411#define UNIQUE_TABLE_NAME "t592690916721053953805701627921227776"
8412
8413/*
8414** A single constraint. Equivalent to either "col = ?" or "col < ?" (or
8415** any other type of single-ended range constraint on a column).
8416**
8417** pLink:
8418**   Used to temporarily link IdxConstraint objects into lists while
8419**   creating candidate indexes.
8420*/
8421struct IdxConstraint {
8422  char *zColl;                    /* Collation sequence */
8423  int bRange;                     /* True for range, false for eq */
8424  int iCol;                       /* Constrained table column */
8425  int bFlag;                      /* Used by idxFindCompatible() */
8426  int bDesc;                      /* True if ORDER BY <expr> DESC */
8427  IdxConstraint *pNext;           /* Next constraint in pEq or pRange list */
8428  IdxConstraint *pLink;           /* See above */
8429};
8430
8431/*
8432** A single scan of a single table.
8433*/
8434struct IdxScan {
8435  IdxTable *pTab;                 /* Associated table object */
8436  int iDb;                        /* Database containing table zTable */
8437  i64 covering;                   /* Mask of columns required for cov. index */
8438  IdxConstraint *pOrder;          /* ORDER BY columns */
8439  IdxConstraint *pEq;             /* List of == constraints */
8440  IdxConstraint *pRange;          /* List of < constraints */
8441  IdxScan *pNextScan;             /* Next IdxScan object for same analysis */
8442};
8443
8444/*
8445** Information regarding a single database table. Extracted from
8446** "PRAGMA table_info" by function idxGetTableInfo().
8447*/
8448struct IdxColumn {
8449  char *zName;
8450  char *zColl;
8451  int iPk;
8452};
8453struct IdxTable {
8454  int nCol;
8455  char *zName;                    /* Table name */
8456  IdxColumn *aCol;
8457  IdxTable *pNext;                /* Next table in linked list of all tables */
8458};
8459
8460/*
8461** An object of the following type is created for each unique table/write-op
8462** seen. The objects are stored in a singly-linked list beginning at
8463** sqlite3expert.pWrite.
8464*/
8465struct IdxWrite {
8466  IdxTable *pTab;
8467  int eOp;                        /* SQLITE_UPDATE, DELETE or INSERT */
8468  IdxWrite *pNext;
8469};
8470
8471/*
8472** Each statement being analyzed is represented by an instance of this
8473** structure.
8474*/
8475struct IdxStatement {
8476  int iId;                        /* Statement number */
8477  char *zSql;                     /* SQL statement */
8478  char *zIdx;                     /* Indexes */
8479  char *zEQP;                     /* Plan */
8480  IdxStatement *pNext;
8481};
8482
8483
8484/*
8485** A hash table for storing strings. With space for a payload string
8486** with each entry. Methods are:
8487**
8488**   idxHashInit()
8489**   idxHashClear()
8490**   idxHashAdd()
8491**   idxHashSearch()
8492*/
8493#define IDX_HASH_SIZE 1023
8494typedef struct IdxHashEntry IdxHashEntry;
8495typedef struct IdxHash IdxHash;
8496struct IdxHashEntry {
8497  char *zKey;                     /* nul-terminated key */
8498  char *zVal;                     /* nul-terminated value string */
8499  char *zVal2;                    /* nul-terminated value string 2 */
8500  IdxHashEntry *pHashNext;        /* Next entry in same hash bucket */
8501  IdxHashEntry *pNext;            /* Next entry in hash */
8502};
8503struct IdxHash {
8504  IdxHashEntry *pFirst;
8505  IdxHashEntry *aHash[IDX_HASH_SIZE];
8506};
8507
8508/*
8509** sqlite3expert object.
8510*/
8511struct sqlite3expert {
8512  int iSample;                    /* Percentage of tables to sample for stat1 */
8513  sqlite3 *db;                    /* User database */
8514  sqlite3 *dbm;                   /* In-memory db for this analysis */
8515  sqlite3 *dbv;                   /* Vtab schema for this analysis */
8516  IdxTable *pTable;               /* List of all IdxTable objects */
8517  IdxScan *pScan;                 /* List of scan objects */
8518  IdxWrite *pWrite;               /* List of write objects */
8519  IdxStatement *pStatement;       /* List of IdxStatement objects */
8520  int bRun;                       /* True once analysis has run */
8521  char **pzErrmsg;
8522  int rc;                         /* Error code from whereinfo hook */
8523  IdxHash hIdx;                   /* Hash containing all candidate indexes */
8524  char *zCandidates;              /* For EXPERT_REPORT_CANDIDATES */
8525};
8526
8527
8528/*
8529** Allocate and return nByte bytes of zeroed memory using sqlite3_malloc().
8530** If the allocation fails, set *pRc to SQLITE_NOMEM and return NULL.
8531*/
8532static void *idxMalloc(int *pRc, int nByte){
8533  void *pRet;
8534  assert( *pRc==SQLITE_OK );
8535  assert( nByte>0 );
8536  pRet = sqlite3_malloc(nByte);
8537  if( pRet ){
8538    memset(pRet, 0, nByte);
8539  }else{
8540    *pRc = SQLITE_NOMEM;
8541  }
8542  return pRet;
8543}
8544
8545/*
8546** Initialize an IdxHash hash table.
8547*/
8548static void idxHashInit(IdxHash *pHash){
8549  memset(pHash, 0, sizeof(IdxHash));
8550}
8551
8552/*
8553** Reset an IdxHash hash table.
8554*/
8555static void idxHashClear(IdxHash *pHash){
8556  int i;
8557  for(i=0; i<IDX_HASH_SIZE; i++){
8558    IdxHashEntry *pEntry;
8559    IdxHashEntry *pNext;
8560    for(pEntry=pHash->aHash[i]; pEntry; pEntry=pNext){
8561      pNext = pEntry->pHashNext;
8562      sqlite3_free(pEntry->zVal2);
8563      sqlite3_free(pEntry);
8564    }
8565  }
8566  memset(pHash, 0, sizeof(IdxHash));
8567}
8568
8569/*
8570** Return the index of the hash bucket that the string specified by the
8571** arguments to this function belongs.
8572*/
8573static int idxHashString(const char *z, int n){
8574  unsigned int ret = 0;
8575  int i;
8576  for(i=0; i<n; i++){
8577    ret += (ret<<3) + (unsigned char)(z[i]);
8578  }
8579  return (int)(ret % IDX_HASH_SIZE);
8580}
8581
8582/*
8583** If zKey is already present in the hash table, return non-zero and do
8584** nothing. Otherwise, add an entry with key zKey and payload string zVal to
8585** the hash table passed as the second argument.
8586*/
8587static int idxHashAdd(
8588  int *pRc,
8589  IdxHash *pHash,
8590  const char *zKey,
8591  const char *zVal
8592){
8593  int nKey = STRLEN(zKey);
8594  int iHash = idxHashString(zKey, nKey);
8595  int nVal = (zVal ? STRLEN(zVal) : 0);
8596  IdxHashEntry *pEntry;
8597  assert( iHash>=0 );
8598  for(pEntry=pHash->aHash[iHash]; pEntry; pEntry=pEntry->pHashNext){
8599    if( STRLEN(pEntry->zKey)==nKey && 0==memcmp(pEntry->zKey, zKey, nKey) ){
8600      return 1;
8601    }
8602  }
8603  pEntry = idxMalloc(pRc, sizeof(IdxHashEntry) + nKey+1 + nVal+1);
8604  if( pEntry ){
8605    pEntry->zKey = (char*)&pEntry[1];
8606    memcpy(pEntry->zKey, zKey, nKey);
8607    if( zVal ){
8608      pEntry->zVal = &pEntry->zKey[nKey+1];
8609      memcpy(pEntry->zVal, zVal, nVal);
8610    }
8611    pEntry->pHashNext = pHash->aHash[iHash];
8612    pHash->aHash[iHash] = pEntry;
8613
8614    pEntry->pNext = pHash->pFirst;
8615    pHash->pFirst = pEntry;
8616  }
8617  return 0;
8618}
8619
8620/*
8621** If zKey/nKey is present in the hash table, return a pointer to the
8622** hash-entry object.
8623*/
8624static IdxHashEntry *idxHashFind(IdxHash *pHash, const char *zKey, int nKey){
8625  int iHash;
8626  IdxHashEntry *pEntry;
8627  if( nKey<0 ) nKey = STRLEN(zKey);
8628  iHash = idxHashString(zKey, nKey);
8629  assert( iHash>=0 );
8630  for(pEntry=pHash->aHash[iHash]; pEntry; pEntry=pEntry->pHashNext){
8631    if( STRLEN(pEntry->zKey)==nKey && 0==memcmp(pEntry->zKey, zKey, nKey) ){
8632      return pEntry;
8633    }
8634  }
8635  return 0;
8636}
8637
8638/*
8639** If the hash table contains an entry with a key equal to the string
8640** passed as the final two arguments to this function, return a pointer
8641** to the payload string. Otherwise, if zKey/nKey is not present in the
8642** hash table, return NULL.
8643*/
8644static const char *idxHashSearch(IdxHash *pHash, const char *zKey, int nKey){
8645  IdxHashEntry *pEntry = idxHashFind(pHash, zKey, nKey);
8646  if( pEntry ) return pEntry->zVal;
8647  return 0;
8648}
8649
8650/*
8651** Allocate and return a new IdxConstraint object. Set the IdxConstraint.zColl
8652** variable to point to a copy of nul-terminated string zColl.
8653*/
8654static IdxConstraint *idxNewConstraint(int *pRc, const char *zColl){
8655  IdxConstraint *pNew;
8656  int nColl = STRLEN(zColl);
8657
8658  assert( *pRc==SQLITE_OK );
8659  pNew = (IdxConstraint*)idxMalloc(pRc, sizeof(IdxConstraint) * nColl + 1);
8660  if( pNew ){
8661    pNew->zColl = (char*)&pNew[1];
8662    memcpy(pNew->zColl, zColl, nColl+1);
8663  }
8664  return pNew;
8665}
8666
8667/*
8668** An error associated with database handle db has just occurred. Pass
8669** the error message to callback function xOut.
8670*/
8671static void idxDatabaseError(
8672  sqlite3 *db,                    /* Database handle */
8673  char **pzErrmsg                 /* Write error here */
8674){
8675  *pzErrmsg = sqlite3_mprintf("%s", sqlite3_errmsg(db));
8676}
8677
8678/*
8679** Prepare an SQL statement.
8680*/
8681static int idxPrepareStmt(
8682  sqlite3 *db,                    /* Database handle to compile against */
8683  sqlite3_stmt **ppStmt,          /* OUT: Compiled SQL statement */
8684  char **pzErrmsg,                /* OUT: sqlite3_malloc()ed error message */
8685  const char *zSql                /* SQL statement to compile */
8686){
8687  int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0);
8688  if( rc!=SQLITE_OK ){
8689    *ppStmt = 0;
8690    idxDatabaseError(db, pzErrmsg);
8691  }
8692  return rc;
8693}
8694
8695/*
8696** Prepare an SQL statement using the results of a printf() formatting.
8697*/
8698static int idxPrintfPrepareStmt(
8699  sqlite3 *db,                    /* Database handle to compile against */
8700  sqlite3_stmt **ppStmt,          /* OUT: Compiled SQL statement */
8701  char **pzErrmsg,                /* OUT: sqlite3_malloc()ed error message */
8702  const char *zFmt,               /* printf() format of SQL statement */
8703  ...                             /* Trailing printf() arguments */
8704){
8705  va_list ap;
8706  int rc;
8707  char *zSql;
8708  va_start(ap, zFmt);
8709  zSql = sqlite3_vmprintf(zFmt, ap);
8710  if( zSql==0 ){
8711    rc = SQLITE_NOMEM;
8712  }else{
8713    rc = idxPrepareStmt(db, ppStmt, pzErrmsg, zSql);
8714    sqlite3_free(zSql);
8715  }
8716  va_end(ap);
8717  return rc;
8718}
8719
8720
8721/*************************************************************************
8722** Beginning of virtual table implementation.
8723*/
8724typedef struct ExpertVtab ExpertVtab;
8725struct ExpertVtab {
8726  sqlite3_vtab base;
8727  IdxTable *pTab;
8728  sqlite3expert *pExpert;
8729};
8730
8731typedef struct ExpertCsr ExpertCsr;
8732struct ExpertCsr {
8733  sqlite3_vtab_cursor base;
8734  sqlite3_stmt *pData;
8735};
8736
8737static char *expertDequote(const char *zIn){
8738  int n = STRLEN(zIn);
8739  char *zRet = sqlite3_malloc(n);
8740
8741  assert( zIn[0]=='\'' );
8742  assert( zIn[n-1]=='\'' );
8743
8744  if( zRet ){
8745    int iOut = 0;
8746    int iIn = 0;
8747    for(iIn=1; iIn<(n-1); iIn++){
8748      if( zIn[iIn]=='\'' ){
8749        assert( zIn[iIn+1]=='\'' );
8750        iIn++;
8751      }
8752      zRet[iOut++] = zIn[iIn];
8753    }
8754    zRet[iOut] = '\0';
8755  }
8756
8757  return zRet;
8758}
8759
8760/*
8761** This function is the implementation of both the xConnect and xCreate
8762** methods of the r-tree virtual table.
8763**
8764**   argv[0]   -> module name
8765**   argv[1]   -> database name
8766**   argv[2]   -> table name
8767**   argv[...] -> column names...
8768*/
8769static int expertConnect(
8770  sqlite3 *db,
8771  void *pAux,
8772  int argc, const char *const*argv,
8773  sqlite3_vtab **ppVtab,
8774  char **pzErr
8775){
8776  sqlite3expert *pExpert = (sqlite3expert*)pAux;
8777  ExpertVtab *p = 0;
8778  int rc;
8779
8780  if( argc!=4 ){
8781    *pzErr = sqlite3_mprintf("internal error!");
8782    rc = SQLITE_ERROR;
8783  }else{
8784    char *zCreateTable = expertDequote(argv[3]);
8785    if( zCreateTable ){
8786      rc = sqlite3_declare_vtab(db, zCreateTable);
8787      if( rc==SQLITE_OK ){
8788        p = idxMalloc(&rc, sizeof(ExpertVtab));
8789      }
8790      if( rc==SQLITE_OK ){
8791        p->pExpert = pExpert;
8792        p->pTab = pExpert->pTable;
8793        assert( sqlite3_stricmp(p->pTab->zName, argv[2])==0 );
8794      }
8795      sqlite3_free(zCreateTable);
8796    }else{
8797      rc = SQLITE_NOMEM;
8798    }
8799  }
8800
8801  *ppVtab = (sqlite3_vtab*)p;
8802  return rc;
8803}
8804
8805static int expertDisconnect(sqlite3_vtab *pVtab){
8806  ExpertVtab *p = (ExpertVtab*)pVtab;
8807  sqlite3_free(p);
8808  return SQLITE_OK;
8809}
8810
8811static int expertBestIndex(sqlite3_vtab *pVtab, sqlite3_index_info *pIdxInfo){
8812  ExpertVtab *p = (ExpertVtab*)pVtab;
8813  int rc = SQLITE_OK;
8814  int n = 0;
8815  IdxScan *pScan;
8816  const int opmask =
8817    SQLITE_INDEX_CONSTRAINT_EQ | SQLITE_INDEX_CONSTRAINT_GT |
8818    SQLITE_INDEX_CONSTRAINT_LT | SQLITE_INDEX_CONSTRAINT_GE |
8819    SQLITE_INDEX_CONSTRAINT_LE;
8820
8821  pScan = idxMalloc(&rc, sizeof(IdxScan));
8822  if( pScan ){
8823    int i;
8824
8825    /* Link the new scan object into the list */
8826    pScan->pTab = p->pTab;
8827    pScan->pNextScan = p->pExpert->pScan;
8828    p->pExpert->pScan = pScan;
8829
8830    /* Add the constraints to the IdxScan object */
8831    for(i=0; i<pIdxInfo->nConstraint; i++){
8832      struct sqlite3_index_constraint *pCons = &pIdxInfo->aConstraint[i];
8833      if( pCons->usable
8834       && pCons->iColumn>=0
8835       && p->pTab->aCol[pCons->iColumn].iPk==0
8836       && (pCons->op & opmask)
8837      ){
8838        IdxConstraint *pNew;
8839        const char *zColl = sqlite3_vtab_collation(pIdxInfo, i);
8840        pNew = idxNewConstraint(&rc, zColl);
8841        if( pNew ){
8842          pNew->iCol = pCons->iColumn;
8843          if( pCons->op==SQLITE_INDEX_CONSTRAINT_EQ ){
8844            pNew->pNext = pScan->pEq;
8845            pScan->pEq = pNew;
8846          }else{
8847            pNew->bRange = 1;
8848            pNew->pNext = pScan->pRange;
8849            pScan->pRange = pNew;
8850          }
8851        }
8852        n++;
8853        pIdxInfo->aConstraintUsage[i].argvIndex = n;
8854      }
8855    }
8856
8857    /* Add the ORDER BY to the IdxScan object */
8858    for(i=pIdxInfo->nOrderBy-1; i>=0; i--){
8859      int iCol = pIdxInfo->aOrderBy[i].iColumn;
8860      if( iCol>=0 ){
8861        IdxConstraint *pNew = idxNewConstraint(&rc, p->pTab->aCol[iCol].zColl);
8862        if( pNew ){
8863          pNew->iCol = iCol;
8864          pNew->bDesc = pIdxInfo->aOrderBy[i].desc;
8865          pNew->pNext = pScan->pOrder;
8866          pNew->pLink = pScan->pOrder;
8867          pScan->pOrder = pNew;
8868          n++;
8869        }
8870      }
8871    }
8872  }
8873
8874  pIdxInfo->estimatedCost = 1000000.0 / (n+1);
8875  return rc;
8876}
8877
8878static int expertUpdate(
8879  sqlite3_vtab *pVtab,
8880  int nData,
8881  sqlite3_value **azData,
8882  sqlite_int64 *pRowid
8883){
8884  (void)pVtab;
8885  (void)nData;
8886  (void)azData;
8887  (void)pRowid;
8888  return SQLITE_OK;
8889}
8890
8891/*
8892** Virtual table module xOpen method.
8893*/
8894static int expertOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){
8895  int rc = SQLITE_OK;
8896  ExpertCsr *pCsr;
8897  (void)pVTab;
8898  pCsr = idxMalloc(&rc, sizeof(ExpertCsr));
8899  *ppCursor = (sqlite3_vtab_cursor*)pCsr;
8900  return rc;
8901}
8902
8903/*
8904** Virtual table module xClose method.
8905*/
8906static int expertClose(sqlite3_vtab_cursor *cur){
8907  ExpertCsr *pCsr = (ExpertCsr*)cur;
8908  sqlite3_finalize(pCsr->pData);
8909  sqlite3_free(pCsr);
8910  return SQLITE_OK;
8911}
8912
8913/*
8914** Virtual table module xEof method.
8915**
8916** Return non-zero if the cursor does not currently point to a valid
8917** record (i.e if the scan has finished), or zero otherwise.
8918*/
8919static int expertEof(sqlite3_vtab_cursor *cur){
8920  ExpertCsr *pCsr = (ExpertCsr*)cur;
8921  return pCsr->pData==0;
8922}
8923
8924/*
8925** Virtual table module xNext method.
8926*/
8927static int expertNext(sqlite3_vtab_cursor *cur){
8928  ExpertCsr *pCsr = (ExpertCsr*)cur;
8929  int rc = SQLITE_OK;
8930
8931  assert( pCsr->pData );
8932  rc = sqlite3_step(pCsr->pData);
8933  if( rc!=SQLITE_ROW ){
8934    rc = sqlite3_finalize(pCsr->pData);
8935    pCsr->pData = 0;
8936  }else{
8937    rc = SQLITE_OK;
8938  }
8939
8940  return rc;
8941}
8942
8943/*
8944** Virtual table module xRowid method.
8945*/
8946static int expertRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
8947  (void)cur;
8948  *pRowid = 0;
8949  return SQLITE_OK;
8950}
8951
8952/*
8953** Virtual table module xColumn method.
8954*/
8955static int expertColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){
8956  ExpertCsr *pCsr = (ExpertCsr*)cur;
8957  sqlite3_value *pVal;
8958  pVal = sqlite3_column_value(pCsr->pData, i);
8959  if( pVal ){
8960    sqlite3_result_value(ctx, pVal);
8961  }
8962  return SQLITE_OK;
8963}
8964
8965/*
8966** Virtual table module xFilter method.
8967*/
8968static int expertFilter(
8969  sqlite3_vtab_cursor *cur,
8970  int idxNum, const char *idxStr,
8971  int argc, sqlite3_value **argv
8972){
8973  ExpertCsr *pCsr = (ExpertCsr*)cur;
8974  ExpertVtab *pVtab = (ExpertVtab*)(cur->pVtab);
8975  sqlite3expert *pExpert = pVtab->pExpert;
8976  int rc;
8977
8978  (void)idxNum;
8979  (void)idxStr;
8980  (void)argc;
8981  (void)argv;
8982  rc = sqlite3_finalize(pCsr->pData);
8983  pCsr->pData = 0;
8984  if( rc==SQLITE_OK ){
8985    rc = idxPrintfPrepareStmt(pExpert->db, &pCsr->pData, &pVtab->base.zErrMsg,
8986        "SELECT * FROM main.%Q WHERE sample()", pVtab->pTab->zName
8987    );
8988  }
8989
8990  if( rc==SQLITE_OK ){
8991    rc = expertNext(cur);
8992  }
8993  return rc;
8994}
8995
8996static int idxRegisterVtab(sqlite3expert *p){
8997  static sqlite3_module expertModule = {
8998    2,                            /* iVersion */
8999    expertConnect,                /* xCreate - create a table */
9000    expertConnect,                /* xConnect - connect to an existing table */
9001    expertBestIndex,              /* xBestIndex - Determine search strategy */
9002    expertDisconnect,             /* xDisconnect - Disconnect from a table */
9003    expertDisconnect,             /* xDestroy - Drop a table */
9004    expertOpen,                   /* xOpen - open a cursor */
9005    expertClose,                  /* xClose - close a cursor */
9006    expertFilter,                 /* xFilter - configure scan constraints */
9007    expertNext,                   /* xNext - advance a cursor */
9008    expertEof,                    /* xEof */
9009    expertColumn,                 /* xColumn - read data */
9010    expertRowid,                  /* xRowid - read data */
9011    expertUpdate,                 /* xUpdate - write data */
9012    0,                            /* xBegin - begin transaction */
9013    0,                            /* xSync - sync transaction */
9014    0,                            /* xCommit - commit transaction */
9015    0,                            /* xRollback - rollback transaction */
9016    0,                            /* xFindFunction - function overloading */
9017    0,                            /* xRename - rename the table */
9018    0,                            /* xSavepoint */
9019    0,                            /* xRelease */
9020    0,                            /* xRollbackTo */
9021    0,                            /* xShadowName */
9022  };
9023
9024  return sqlite3_create_module(p->dbv, "expert", &expertModule, (void*)p);
9025}
9026/*
9027** End of virtual table implementation.
9028*************************************************************************/
9029/*
9030** Finalize SQL statement pStmt. If (*pRc) is SQLITE_OK when this function
9031** is called, set it to the return value of sqlite3_finalize() before
9032** returning. Otherwise, discard the sqlite3_finalize() return value.
9033*/
9034static void idxFinalize(int *pRc, sqlite3_stmt *pStmt){
9035  int rc = sqlite3_finalize(pStmt);
9036  if( *pRc==SQLITE_OK ) *pRc = rc;
9037}
9038
9039/*
9040** Attempt to allocate an IdxTable structure corresponding to table zTab
9041** in the main database of connection db. If successful, set (*ppOut) to
9042** point to the new object and return SQLITE_OK. Otherwise, return an
9043** SQLite error code and set (*ppOut) to NULL. In this case *pzErrmsg may be
9044** set to point to an error string.
9045**
9046** It is the responsibility of the caller to eventually free either the
9047** IdxTable object or error message using sqlite3_free().
9048*/
9049static int idxGetTableInfo(
9050  sqlite3 *db,                    /* Database connection to read details from */
9051  const char *zTab,               /* Table name */
9052  IdxTable **ppOut,               /* OUT: New object (if successful) */
9053  char **pzErrmsg                 /* OUT: Error message (if not) */
9054){
9055  sqlite3_stmt *p1 = 0;
9056  int nCol = 0;
9057  int nTab = STRLEN(zTab);
9058  int nByte = sizeof(IdxTable) + nTab + 1;
9059  IdxTable *pNew = 0;
9060  int rc, rc2;
9061  char *pCsr = 0;
9062  int nPk = 0;
9063
9064  rc = idxPrintfPrepareStmt(db, &p1, pzErrmsg, "PRAGMA table_xinfo=%Q", zTab);
9065  while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(p1) ){
9066    const char *zCol = (const char*)sqlite3_column_text(p1, 1);
9067    nByte += 1 + STRLEN(zCol);
9068    rc = sqlite3_table_column_metadata(
9069        db, "main", zTab, zCol, 0, &zCol, 0, 0, 0
9070    );
9071    nByte += 1 + STRLEN(zCol);
9072    nCol++;
9073    nPk += (sqlite3_column_int(p1, 5)>0);
9074  }
9075  rc2 = sqlite3_reset(p1);
9076  if( rc==SQLITE_OK ) rc = rc2;
9077
9078  nByte += sizeof(IdxColumn) * nCol;
9079  if( rc==SQLITE_OK ){
9080    pNew = idxMalloc(&rc, nByte);
9081  }
9082  if( rc==SQLITE_OK ){
9083    pNew->aCol = (IdxColumn*)&pNew[1];
9084    pNew->nCol = nCol;
9085    pCsr = (char*)&pNew->aCol[nCol];
9086  }
9087
9088  nCol = 0;
9089  while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(p1) ){
9090    const char *zCol = (const char*)sqlite3_column_text(p1, 1);
9091    int nCopy = STRLEN(zCol) + 1;
9092    pNew->aCol[nCol].zName = pCsr;
9093    pNew->aCol[nCol].iPk = (sqlite3_column_int(p1, 5)==1 && nPk==1);
9094    memcpy(pCsr, zCol, nCopy);
9095    pCsr += nCopy;
9096
9097    rc = sqlite3_table_column_metadata(
9098        db, "main", zTab, zCol, 0, &zCol, 0, 0, 0
9099    );
9100    if( rc==SQLITE_OK ){
9101      nCopy = STRLEN(zCol) + 1;
9102      pNew->aCol[nCol].zColl = pCsr;
9103      memcpy(pCsr, zCol, nCopy);
9104      pCsr += nCopy;
9105    }
9106
9107    nCol++;
9108  }
9109  idxFinalize(&rc, p1);
9110
9111  if( rc!=SQLITE_OK ){
9112    sqlite3_free(pNew);
9113    pNew = 0;
9114  }else{
9115    pNew->zName = pCsr;
9116    memcpy(pNew->zName, zTab, nTab+1);
9117  }
9118
9119  *ppOut = pNew;
9120  return rc;
9121}
9122
9123/*
9124** This function is a no-op if *pRc is set to anything other than
9125** SQLITE_OK when it is called.
9126**
9127** If *pRc is initially set to SQLITE_OK, then the text specified by
9128** the printf() style arguments is appended to zIn and the result returned
9129** in a buffer allocated by sqlite3_malloc(). sqlite3_free() is called on
9130** zIn before returning.
9131*/
9132static char *idxAppendText(int *pRc, char *zIn, const char *zFmt, ...){
9133  va_list ap;
9134  char *zAppend = 0;
9135  char *zRet = 0;
9136  int nIn = zIn ? STRLEN(zIn) : 0;
9137  int nAppend = 0;
9138  va_start(ap, zFmt);
9139  if( *pRc==SQLITE_OK ){
9140    zAppend = sqlite3_vmprintf(zFmt, ap);
9141    if( zAppend ){
9142      nAppend = STRLEN(zAppend);
9143      zRet = (char*)sqlite3_malloc(nIn + nAppend + 1);
9144    }
9145    if( zAppend && zRet ){
9146      if( nIn ) memcpy(zRet, zIn, nIn);
9147      memcpy(&zRet[nIn], zAppend, nAppend+1);
9148    }else{
9149      sqlite3_free(zRet);
9150      zRet = 0;
9151      *pRc = SQLITE_NOMEM;
9152    }
9153    sqlite3_free(zAppend);
9154    sqlite3_free(zIn);
9155  }
9156  va_end(ap);
9157  return zRet;
9158}
9159
9160/*
9161** Return true if zId must be quoted in order to use it as an SQL
9162** identifier, or false otherwise.
9163*/
9164static int idxIdentifierRequiresQuotes(const char *zId){
9165  int i;
9166  for(i=0; zId[i]; i++){
9167    if( !(zId[i]=='_')
9168     && !(zId[i]>='0' && zId[i]<='9')
9169     && !(zId[i]>='a' && zId[i]<='z')
9170     && !(zId[i]>='A' && zId[i]<='Z')
9171    ){
9172      return 1;
9173    }
9174  }
9175  return 0;
9176}
9177
9178/*
9179** This function appends an index column definition suitable for constraint
9180** pCons to the string passed as zIn and returns the result.
9181*/
9182static char *idxAppendColDefn(
9183  int *pRc,                       /* IN/OUT: Error code */
9184  char *zIn,                      /* Column defn accumulated so far */
9185  IdxTable *pTab,                 /* Table index will be created on */
9186  IdxConstraint *pCons
9187){
9188  char *zRet = zIn;
9189  IdxColumn *p = &pTab->aCol[pCons->iCol];
9190  if( zRet ) zRet = idxAppendText(pRc, zRet, ", ");
9191
9192  if( idxIdentifierRequiresQuotes(p->zName) ){
9193    zRet = idxAppendText(pRc, zRet, "%Q", p->zName);
9194  }else{
9195    zRet = idxAppendText(pRc, zRet, "%s", p->zName);
9196  }
9197
9198  if( sqlite3_stricmp(p->zColl, pCons->zColl) ){
9199    if( idxIdentifierRequiresQuotes(pCons->zColl) ){
9200      zRet = idxAppendText(pRc, zRet, " COLLATE %Q", pCons->zColl);
9201    }else{
9202      zRet = idxAppendText(pRc, zRet, " COLLATE %s", pCons->zColl);
9203    }
9204  }
9205
9206  if( pCons->bDesc ){
9207    zRet = idxAppendText(pRc, zRet, " DESC");
9208  }
9209  return zRet;
9210}
9211
9212/*
9213** Search database dbm for an index compatible with the one idxCreateFromCons()
9214** would create from arguments pScan, pEq and pTail. If no error occurs and
9215** such an index is found, return non-zero. Or, if no such index is found,
9216** return zero.
9217**
9218** If an error occurs, set *pRc to an SQLite error code and return zero.
9219*/
9220static int idxFindCompatible(
9221  int *pRc,                       /* OUT: Error code */
9222  sqlite3* dbm,                   /* Database to search */
9223  IdxScan *pScan,                 /* Scan for table to search for index on */
9224  IdxConstraint *pEq,             /* List of == constraints */
9225  IdxConstraint *pTail            /* List of range constraints */
9226){
9227  const char *zTbl = pScan->pTab->zName;
9228  sqlite3_stmt *pIdxList = 0;
9229  IdxConstraint *pIter;
9230  int nEq = 0;                    /* Number of elements in pEq */
9231  int rc;
9232
9233  /* Count the elements in list pEq */
9234  for(pIter=pEq; pIter; pIter=pIter->pLink) nEq++;
9235
9236  rc = idxPrintfPrepareStmt(dbm, &pIdxList, 0, "PRAGMA index_list=%Q", zTbl);
9237  while( rc==SQLITE_OK && sqlite3_step(pIdxList)==SQLITE_ROW ){
9238    int bMatch = 1;
9239    IdxConstraint *pT = pTail;
9240    sqlite3_stmt *pInfo = 0;
9241    const char *zIdx = (const char*)sqlite3_column_text(pIdxList, 1);
9242
9243    /* Zero the IdxConstraint.bFlag values in the pEq list */
9244    for(pIter=pEq; pIter; pIter=pIter->pLink) pIter->bFlag = 0;
9245
9246    rc = idxPrintfPrepareStmt(dbm, &pInfo, 0, "PRAGMA index_xInfo=%Q", zIdx);
9247    while( rc==SQLITE_OK && sqlite3_step(pInfo)==SQLITE_ROW ){
9248      int iIdx = sqlite3_column_int(pInfo, 0);
9249      int iCol = sqlite3_column_int(pInfo, 1);
9250      const char *zColl = (const char*)sqlite3_column_text(pInfo, 4);
9251
9252      if( iIdx<nEq ){
9253        for(pIter=pEq; pIter; pIter=pIter->pLink){
9254          if( pIter->bFlag ) continue;
9255          if( pIter->iCol!=iCol ) continue;
9256          if( sqlite3_stricmp(pIter->zColl, zColl) ) continue;
9257          pIter->bFlag = 1;
9258          break;
9259        }
9260        if( pIter==0 ){
9261          bMatch = 0;
9262          break;
9263        }
9264      }else{
9265        if( pT ){
9266          if( pT->iCol!=iCol || sqlite3_stricmp(pT->zColl, zColl) ){
9267            bMatch = 0;
9268            break;
9269          }
9270          pT = pT->pLink;
9271        }
9272      }
9273    }
9274    idxFinalize(&rc, pInfo);
9275
9276    if( rc==SQLITE_OK && bMatch ){
9277      sqlite3_finalize(pIdxList);
9278      return 1;
9279    }
9280  }
9281  idxFinalize(&rc, pIdxList);
9282
9283  *pRc = rc;
9284  return 0;
9285}
9286
9287static int idxCreateFromCons(
9288  sqlite3expert *p,
9289  IdxScan *pScan,
9290  IdxConstraint *pEq,
9291  IdxConstraint *pTail
9292){
9293  sqlite3 *dbm = p->dbm;
9294  int rc = SQLITE_OK;
9295  if( (pEq || pTail) && 0==idxFindCompatible(&rc, dbm, pScan, pEq, pTail) ){
9296    IdxTable *pTab = pScan->pTab;
9297    char *zCols = 0;
9298    char *zIdx = 0;
9299    IdxConstraint *pCons;
9300    unsigned int h = 0;
9301    const char *zFmt;
9302
9303    for(pCons=pEq; pCons; pCons=pCons->pLink){
9304      zCols = idxAppendColDefn(&rc, zCols, pTab, pCons);
9305    }
9306    for(pCons=pTail; pCons; pCons=pCons->pLink){
9307      zCols = idxAppendColDefn(&rc, zCols, pTab, pCons);
9308    }
9309
9310    if( rc==SQLITE_OK ){
9311      /* Hash the list of columns to come up with a name for the index */
9312      const char *zTable = pScan->pTab->zName;
9313      char *zName;                /* Index name */
9314      int i;
9315      for(i=0; zCols[i]; i++){
9316        h += ((h<<3) + zCols[i]);
9317      }
9318      zName = sqlite3_mprintf("%s_idx_%08x", zTable, h);
9319      if( zName==0 ){
9320        rc = SQLITE_NOMEM;
9321      }else{
9322        if( idxIdentifierRequiresQuotes(zTable) ){
9323          zFmt = "CREATE INDEX '%q' ON %Q(%s)";
9324        }else{
9325          zFmt = "CREATE INDEX %s ON %s(%s)";
9326        }
9327        zIdx = sqlite3_mprintf(zFmt, zName, zTable, zCols);
9328        if( !zIdx ){
9329          rc = SQLITE_NOMEM;
9330        }else{
9331          rc = sqlite3_exec(dbm, zIdx, 0, 0, p->pzErrmsg);
9332          idxHashAdd(&rc, &p->hIdx, zName, zIdx);
9333        }
9334        sqlite3_free(zName);
9335        sqlite3_free(zIdx);
9336      }
9337    }
9338
9339    sqlite3_free(zCols);
9340  }
9341  return rc;
9342}
9343
9344/*
9345** Return true if list pList (linked by IdxConstraint.pLink) contains
9346** a constraint compatible with *p. Otherwise return false.
9347*/
9348static int idxFindConstraint(IdxConstraint *pList, IdxConstraint *p){
9349  IdxConstraint *pCmp;
9350  for(pCmp=pList; pCmp; pCmp=pCmp->pLink){
9351    if( p->iCol==pCmp->iCol ) return 1;
9352  }
9353  return 0;
9354}
9355
9356static int idxCreateFromWhere(
9357  sqlite3expert *p,
9358  IdxScan *pScan,                 /* Create indexes for this scan */
9359  IdxConstraint *pTail            /* range/ORDER BY constraints for inclusion */
9360){
9361  IdxConstraint *p1 = 0;
9362  IdxConstraint *pCon;
9363  int rc;
9364
9365  /* Gather up all the == constraints. */
9366  for(pCon=pScan->pEq; pCon; pCon=pCon->pNext){
9367    if( !idxFindConstraint(p1, pCon) && !idxFindConstraint(pTail, pCon) ){
9368      pCon->pLink = p1;
9369      p1 = pCon;
9370    }
9371  }
9372
9373  /* Create an index using the == constraints collected above. And the
9374  ** range constraint/ORDER BY terms passed in by the caller, if any. */
9375  rc = idxCreateFromCons(p, pScan, p1, pTail);
9376
9377  /* If no range/ORDER BY passed by the caller, create a version of the
9378  ** index for each range constraint.  */
9379  if( pTail==0 ){
9380    for(pCon=pScan->pRange; rc==SQLITE_OK && pCon; pCon=pCon->pNext){
9381      assert( pCon->pLink==0 );
9382      if( !idxFindConstraint(p1, pCon) && !idxFindConstraint(pTail, pCon) ){
9383        rc = idxCreateFromCons(p, pScan, p1, pCon);
9384      }
9385    }
9386  }
9387
9388  return rc;
9389}
9390
9391/*
9392** Create candidate indexes in database [dbm] based on the data in
9393** linked-list pScan.
9394*/
9395static int idxCreateCandidates(sqlite3expert *p){
9396  int rc = SQLITE_OK;
9397  IdxScan *pIter;
9398
9399  for(pIter=p->pScan; pIter && rc==SQLITE_OK; pIter=pIter->pNextScan){
9400    rc = idxCreateFromWhere(p, pIter, 0);
9401    if( rc==SQLITE_OK && pIter->pOrder ){
9402      rc = idxCreateFromWhere(p, pIter, pIter->pOrder);
9403    }
9404  }
9405
9406  return rc;
9407}
9408
9409/*
9410** Free all elements of the linked list starting at pConstraint.
9411*/
9412static void idxConstraintFree(IdxConstraint *pConstraint){
9413  IdxConstraint *pNext;
9414  IdxConstraint *p;
9415
9416  for(p=pConstraint; p; p=pNext){
9417    pNext = p->pNext;
9418    sqlite3_free(p);
9419  }
9420}
9421
9422/*
9423** Free all elements of the linked list starting from pScan up until pLast
9424** (pLast is not freed).
9425*/
9426static void idxScanFree(IdxScan *pScan, IdxScan *pLast){
9427  IdxScan *p;
9428  IdxScan *pNext;
9429  for(p=pScan; p!=pLast; p=pNext){
9430    pNext = p->pNextScan;
9431    idxConstraintFree(p->pOrder);
9432    idxConstraintFree(p->pEq);
9433    idxConstraintFree(p->pRange);
9434    sqlite3_free(p);
9435  }
9436}
9437
9438/*
9439** Free all elements of the linked list starting from pStatement up
9440** until pLast (pLast is not freed).
9441*/
9442static void idxStatementFree(IdxStatement *pStatement, IdxStatement *pLast){
9443  IdxStatement *p;
9444  IdxStatement *pNext;
9445  for(p=pStatement; p!=pLast; p=pNext){
9446    pNext = p->pNext;
9447    sqlite3_free(p->zEQP);
9448    sqlite3_free(p->zIdx);
9449    sqlite3_free(p);
9450  }
9451}
9452
9453/*
9454** Free the linked list of IdxTable objects starting at pTab.
9455*/
9456static void idxTableFree(IdxTable *pTab){
9457  IdxTable *pIter;
9458  IdxTable *pNext;
9459  for(pIter=pTab; pIter; pIter=pNext){
9460    pNext = pIter->pNext;
9461    sqlite3_free(pIter);
9462  }
9463}
9464
9465/*
9466** Free the linked list of IdxWrite objects starting at pTab.
9467*/
9468static void idxWriteFree(IdxWrite *pTab){
9469  IdxWrite *pIter;
9470  IdxWrite *pNext;
9471  for(pIter=pTab; pIter; pIter=pNext){
9472    pNext = pIter->pNext;
9473    sqlite3_free(pIter);
9474  }
9475}
9476
9477
9478
9479/*
9480** This function is called after candidate indexes have been created. It
9481** runs all the queries to see which indexes they prefer, and populates
9482** IdxStatement.zIdx and IdxStatement.zEQP with the results.
9483*/
9484int idxFindIndexes(
9485  sqlite3expert *p,
9486  char **pzErr                         /* OUT: Error message (sqlite3_malloc) */
9487){
9488  IdxStatement *pStmt;
9489  sqlite3 *dbm = p->dbm;
9490  int rc = SQLITE_OK;
9491
9492  IdxHash hIdx;
9493  idxHashInit(&hIdx);
9494
9495  for(pStmt=p->pStatement; rc==SQLITE_OK && pStmt; pStmt=pStmt->pNext){
9496    IdxHashEntry *pEntry;
9497    sqlite3_stmt *pExplain = 0;
9498    idxHashClear(&hIdx);
9499    rc = idxPrintfPrepareStmt(dbm, &pExplain, pzErr,
9500        "EXPLAIN QUERY PLAN %s", pStmt->zSql
9501    );
9502    while( rc==SQLITE_OK && sqlite3_step(pExplain)==SQLITE_ROW ){
9503      /* int iId = sqlite3_column_int(pExplain, 0); */
9504      /* int iParent = sqlite3_column_int(pExplain, 1); */
9505      /* int iNotUsed = sqlite3_column_int(pExplain, 2); */
9506      const char *zDetail = (const char*)sqlite3_column_text(pExplain, 3);
9507      int nDetail;
9508      int i;
9509
9510      if( !zDetail ) continue;
9511      nDetail = STRLEN(zDetail);
9512
9513      for(i=0; i<nDetail; i++){
9514        const char *zIdx = 0;
9515        if( i+13<nDetail && memcmp(&zDetail[i], " USING INDEX ", 13)==0 ){
9516          zIdx = &zDetail[i+13];
9517        }else if( i+22<nDetail
9518            && memcmp(&zDetail[i], " USING COVERING INDEX ", 22)==0
9519        ){
9520          zIdx = &zDetail[i+22];
9521        }
9522        if( zIdx ){
9523          const char *zSql;
9524          int nIdx = 0;
9525          while( zIdx[nIdx]!='\0' && (zIdx[nIdx]!=' ' || zIdx[nIdx+1]!='(') ){
9526            nIdx++;
9527          }
9528          zSql = idxHashSearch(&p->hIdx, zIdx, nIdx);
9529          if( zSql ){
9530            idxHashAdd(&rc, &hIdx, zSql, 0);
9531            if( rc ) goto find_indexes_out;
9532          }
9533          break;
9534        }
9535      }
9536
9537      if( zDetail[0]!='-' ){
9538        pStmt->zEQP = idxAppendText(&rc, pStmt->zEQP, "%s\n", zDetail);
9539      }
9540    }
9541
9542    for(pEntry=hIdx.pFirst; pEntry; pEntry=pEntry->pNext){
9543      pStmt->zIdx = idxAppendText(&rc, pStmt->zIdx, "%s;\n", pEntry->zKey);
9544    }
9545
9546    idxFinalize(&rc, pExplain);
9547  }
9548
9549 find_indexes_out:
9550  idxHashClear(&hIdx);
9551  return rc;
9552}
9553
9554static int idxAuthCallback(
9555  void *pCtx,
9556  int eOp,
9557  const char *z3,
9558  const char *z4,
9559  const char *zDb,
9560  const char *zTrigger
9561){
9562  int rc = SQLITE_OK;
9563  (void)z4;
9564  (void)zTrigger;
9565  if( eOp==SQLITE_INSERT || eOp==SQLITE_UPDATE || eOp==SQLITE_DELETE ){
9566    if( sqlite3_stricmp(zDb, "main")==0 ){
9567      sqlite3expert *p = (sqlite3expert*)pCtx;
9568      IdxTable *pTab;
9569      for(pTab=p->pTable; pTab; pTab=pTab->pNext){
9570        if( 0==sqlite3_stricmp(z3, pTab->zName) ) break;
9571      }
9572      if( pTab ){
9573        IdxWrite *pWrite;
9574        for(pWrite=p->pWrite; pWrite; pWrite=pWrite->pNext){
9575          if( pWrite->pTab==pTab && pWrite->eOp==eOp ) break;
9576        }
9577        if( pWrite==0 ){
9578          pWrite = idxMalloc(&rc, sizeof(IdxWrite));
9579          if( rc==SQLITE_OK ){
9580            pWrite->pTab = pTab;
9581            pWrite->eOp = eOp;
9582            pWrite->pNext = p->pWrite;
9583            p->pWrite = pWrite;
9584          }
9585        }
9586      }
9587    }
9588  }
9589  return rc;
9590}
9591
9592static int idxProcessOneTrigger(
9593  sqlite3expert *p,
9594  IdxWrite *pWrite,
9595  char **pzErr
9596){
9597  static const char *zInt = UNIQUE_TABLE_NAME;
9598  static const char *zDrop = "DROP TABLE " UNIQUE_TABLE_NAME;
9599  IdxTable *pTab = pWrite->pTab;
9600  const char *zTab = pTab->zName;
9601  const char *zSql =
9602    "SELECT 'CREATE TEMP' || substr(sql, 7) FROM sqlite_schema "
9603    "WHERE tbl_name = %Q AND type IN ('table', 'trigger') "
9604    "ORDER BY type;";
9605  sqlite3_stmt *pSelect = 0;
9606  int rc = SQLITE_OK;
9607  char *zWrite = 0;
9608
9609  /* Create the table and its triggers in the temp schema */
9610  rc = idxPrintfPrepareStmt(p->db, &pSelect, pzErr, zSql, zTab, zTab);
9611  while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSelect) ){
9612    const char *zCreate = (const char*)sqlite3_column_text(pSelect, 0);
9613    rc = sqlite3_exec(p->dbv, zCreate, 0, 0, pzErr);
9614  }
9615  idxFinalize(&rc, pSelect);
9616
9617  /* Rename the table in the temp schema to zInt */
9618  if( rc==SQLITE_OK ){
9619    char *z = sqlite3_mprintf("ALTER TABLE temp.%Q RENAME TO %Q", zTab, zInt);
9620    if( z==0 ){
9621      rc = SQLITE_NOMEM;
9622    }else{
9623      rc = sqlite3_exec(p->dbv, z, 0, 0, pzErr);
9624      sqlite3_free(z);
9625    }
9626  }
9627
9628  switch( pWrite->eOp ){
9629    case SQLITE_INSERT: {
9630      int i;
9631      zWrite = idxAppendText(&rc, zWrite, "INSERT INTO %Q VALUES(", zInt);
9632      for(i=0; i<pTab->nCol; i++){
9633        zWrite = idxAppendText(&rc, zWrite, "%s?", i==0 ? "" : ", ");
9634      }
9635      zWrite = idxAppendText(&rc, zWrite, ")");
9636      break;
9637    }
9638    case SQLITE_UPDATE: {
9639      int i;
9640      zWrite = idxAppendText(&rc, zWrite, "UPDATE %Q SET ", zInt);
9641      for(i=0; i<pTab->nCol; i++){
9642        zWrite = idxAppendText(&rc, zWrite, "%s%Q=?", i==0 ? "" : ", ",
9643            pTab->aCol[i].zName
9644        );
9645      }
9646      break;
9647    }
9648    default: {
9649      assert( pWrite->eOp==SQLITE_DELETE );
9650      if( rc==SQLITE_OK ){
9651        zWrite = sqlite3_mprintf("DELETE FROM %Q", zInt);
9652        if( zWrite==0 ) rc = SQLITE_NOMEM;
9653      }
9654    }
9655  }
9656
9657  if( rc==SQLITE_OK ){
9658    sqlite3_stmt *pX = 0;
9659    rc = sqlite3_prepare_v2(p->dbv, zWrite, -1, &pX, 0);
9660    idxFinalize(&rc, pX);
9661    if( rc!=SQLITE_OK ){
9662      idxDatabaseError(p->dbv, pzErr);
9663    }
9664  }
9665  sqlite3_free(zWrite);
9666
9667  if( rc==SQLITE_OK ){
9668    rc = sqlite3_exec(p->dbv, zDrop, 0, 0, pzErr);
9669  }
9670
9671  return rc;
9672}
9673
9674static int idxProcessTriggers(sqlite3expert *p, char **pzErr){
9675  int rc = SQLITE_OK;
9676  IdxWrite *pEnd = 0;
9677  IdxWrite *pFirst = p->pWrite;
9678
9679  while( rc==SQLITE_OK && pFirst!=pEnd ){
9680    IdxWrite *pIter;
9681    for(pIter=pFirst; rc==SQLITE_OK && pIter!=pEnd; pIter=pIter->pNext){
9682      rc = idxProcessOneTrigger(p, pIter, pzErr);
9683    }
9684    pEnd = pFirst;
9685    pFirst = p->pWrite;
9686  }
9687
9688  return rc;
9689}
9690
9691
9692static int idxCreateVtabSchema(sqlite3expert *p, char **pzErrmsg){
9693  int rc = idxRegisterVtab(p);
9694  sqlite3_stmt *pSchema = 0;
9695
9696  /* For each table in the main db schema:
9697  **
9698  **   1) Add an entry to the p->pTable list, and
9699  **   2) Create the equivalent virtual table in dbv.
9700  */
9701  rc = idxPrepareStmt(p->db, &pSchema, pzErrmsg,
9702      "SELECT type, name, sql, 1 FROM sqlite_schema "
9703      "WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%%' "
9704      " UNION ALL "
9705      "SELECT type, name, sql, 2 FROM sqlite_schema "
9706      "WHERE type = 'trigger'"
9707      "  AND tbl_name IN(SELECT name FROM sqlite_schema WHERE type = 'view') "
9708      "ORDER BY 4, 1"
9709  );
9710  while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSchema) ){
9711    const char *zType = (const char*)sqlite3_column_text(pSchema, 0);
9712    const char *zName = (const char*)sqlite3_column_text(pSchema, 1);
9713    const char *zSql = (const char*)sqlite3_column_text(pSchema, 2);
9714
9715    if( zType[0]=='v' || zType[1]=='r' ){
9716      rc = sqlite3_exec(p->dbv, zSql, 0, 0, pzErrmsg);
9717    }else{
9718      IdxTable *pTab;
9719      rc = idxGetTableInfo(p->db, zName, &pTab, pzErrmsg);
9720      if( rc==SQLITE_OK ){
9721        int i;
9722        char *zInner = 0;
9723        char *zOuter = 0;
9724        pTab->pNext = p->pTable;
9725        p->pTable = pTab;
9726
9727        /* The statement the vtab will pass to sqlite3_declare_vtab() */
9728        zInner = idxAppendText(&rc, 0, "CREATE TABLE x(");
9729        for(i=0; i<pTab->nCol; i++){
9730          zInner = idxAppendText(&rc, zInner, "%s%Q COLLATE %s",
9731              (i==0 ? "" : ", "), pTab->aCol[i].zName, pTab->aCol[i].zColl
9732          );
9733        }
9734        zInner = idxAppendText(&rc, zInner, ")");
9735
9736        /* The CVT statement to create the vtab */
9737        zOuter = idxAppendText(&rc, 0,
9738            "CREATE VIRTUAL TABLE %Q USING expert(%Q)", zName, zInner
9739        );
9740        if( rc==SQLITE_OK ){
9741          rc = sqlite3_exec(p->dbv, zOuter, 0, 0, pzErrmsg);
9742        }
9743        sqlite3_free(zInner);
9744        sqlite3_free(zOuter);
9745      }
9746    }
9747  }
9748  idxFinalize(&rc, pSchema);
9749  return rc;
9750}
9751
9752struct IdxSampleCtx {
9753  int iTarget;
9754  double target;                  /* Target nRet/nRow value */
9755  double nRow;                    /* Number of rows seen */
9756  double nRet;                    /* Number of rows returned */
9757};
9758
9759static void idxSampleFunc(
9760  sqlite3_context *pCtx,
9761  int argc,
9762  sqlite3_value **argv
9763){
9764  struct IdxSampleCtx *p = (struct IdxSampleCtx*)sqlite3_user_data(pCtx);
9765  int bRet;
9766
9767  (void)argv;
9768  assert( argc==0 );
9769  if( p->nRow==0.0 ){
9770    bRet = 1;
9771  }else{
9772    bRet = (p->nRet / p->nRow) <= p->target;
9773    if( bRet==0 ){
9774      unsigned short rnd;
9775      sqlite3_randomness(2, (void*)&rnd);
9776      bRet = ((int)rnd % 100) <= p->iTarget;
9777    }
9778  }
9779
9780  sqlite3_result_int(pCtx, bRet);
9781  p->nRow += 1.0;
9782  p->nRet += (double)bRet;
9783}
9784
9785struct IdxRemCtx {
9786  int nSlot;
9787  struct IdxRemSlot {
9788    int eType;                    /* SQLITE_NULL, INTEGER, REAL, TEXT, BLOB */
9789    i64 iVal;                     /* SQLITE_INTEGER value */
9790    double rVal;                  /* SQLITE_FLOAT value */
9791    int nByte;                    /* Bytes of space allocated at z */
9792    int n;                        /* Size of buffer z */
9793    char *z;                      /* SQLITE_TEXT/BLOB value */
9794  } aSlot[1];
9795};
9796
9797/*
9798** Implementation of scalar function rem().
9799*/
9800static void idxRemFunc(
9801  sqlite3_context *pCtx,
9802  int argc,
9803  sqlite3_value **argv
9804){
9805  struct IdxRemCtx *p = (struct IdxRemCtx*)sqlite3_user_data(pCtx);
9806  struct IdxRemSlot *pSlot;
9807  int iSlot;
9808  assert( argc==2 );
9809
9810  iSlot = sqlite3_value_int(argv[0]);
9811  assert( iSlot<=p->nSlot );
9812  pSlot = &p->aSlot[iSlot];
9813
9814  switch( pSlot->eType ){
9815    case SQLITE_NULL:
9816      /* no-op */
9817      break;
9818
9819    case SQLITE_INTEGER:
9820      sqlite3_result_int64(pCtx, pSlot->iVal);
9821      break;
9822
9823    case SQLITE_FLOAT:
9824      sqlite3_result_double(pCtx, pSlot->rVal);
9825      break;
9826
9827    case SQLITE_BLOB:
9828      sqlite3_result_blob(pCtx, pSlot->z, pSlot->n, SQLITE_TRANSIENT);
9829      break;
9830
9831    case SQLITE_TEXT:
9832      sqlite3_result_text(pCtx, pSlot->z, pSlot->n, SQLITE_TRANSIENT);
9833      break;
9834  }
9835
9836  pSlot->eType = sqlite3_value_type(argv[1]);
9837  switch( pSlot->eType ){
9838    case SQLITE_NULL:
9839      /* no-op */
9840      break;
9841
9842    case SQLITE_INTEGER:
9843      pSlot->iVal = sqlite3_value_int64(argv[1]);
9844      break;
9845
9846    case SQLITE_FLOAT:
9847      pSlot->rVal = sqlite3_value_double(argv[1]);
9848      break;
9849
9850    case SQLITE_BLOB:
9851    case SQLITE_TEXT: {
9852      int nByte = sqlite3_value_bytes(argv[1]);
9853      if( nByte>pSlot->nByte ){
9854        char *zNew = (char*)sqlite3_realloc(pSlot->z, nByte*2);
9855        if( zNew==0 ){
9856          sqlite3_result_error_nomem(pCtx);
9857          return;
9858        }
9859        pSlot->nByte = nByte*2;
9860        pSlot->z = zNew;
9861      }
9862      pSlot->n = nByte;
9863      if( pSlot->eType==SQLITE_BLOB ){
9864        memcpy(pSlot->z, sqlite3_value_blob(argv[1]), nByte);
9865      }else{
9866        memcpy(pSlot->z, sqlite3_value_text(argv[1]), nByte);
9867      }
9868      break;
9869    }
9870  }
9871}
9872
9873static int idxLargestIndex(sqlite3 *db, int *pnMax, char **pzErr){
9874  int rc = SQLITE_OK;
9875  const char *zMax =
9876    "SELECT max(i.seqno) FROM "
9877    "  sqlite_schema AS s, "
9878    "  pragma_index_list(s.name) AS l, "
9879    "  pragma_index_info(l.name) AS i "
9880    "WHERE s.type = 'table'";
9881  sqlite3_stmt *pMax = 0;
9882
9883  *pnMax = 0;
9884  rc = idxPrepareStmt(db, &pMax, pzErr, zMax);
9885  if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pMax) ){
9886    *pnMax = sqlite3_column_int(pMax, 0) + 1;
9887  }
9888  idxFinalize(&rc, pMax);
9889
9890  return rc;
9891}
9892
9893static int idxPopulateOneStat1(
9894  sqlite3expert *p,
9895  sqlite3_stmt *pIndexXInfo,
9896  sqlite3_stmt *pWriteStat,
9897  const char *zTab,
9898  const char *zIdx,
9899  char **pzErr
9900){
9901  char *zCols = 0;
9902  char *zOrder = 0;
9903  char *zQuery = 0;
9904  int nCol = 0;
9905  int i;
9906  sqlite3_stmt *pQuery = 0;
9907  int *aStat = 0;
9908  int rc = SQLITE_OK;
9909
9910  assert( p->iSample>0 );
9911
9912  /* Formulate the query text */
9913  sqlite3_bind_text(pIndexXInfo, 1, zIdx, -1, SQLITE_STATIC);
9914  while( SQLITE_OK==rc && SQLITE_ROW==sqlite3_step(pIndexXInfo) ){
9915    const char *zComma = zCols==0 ? "" : ", ";
9916    const char *zName = (const char*)sqlite3_column_text(pIndexXInfo, 0);
9917    const char *zColl = (const char*)sqlite3_column_text(pIndexXInfo, 1);
9918    zCols = idxAppendText(&rc, zCols,
9919        "%sx.%Q IS rem(%d, x.%Q) COLLATE %s", zComma, zName, nCol, zName, zColl
9920    );
9921    zOrder = idxAppendText(&rc, zOrder, "%s%d", zComma, ++nCol);
9922  }
9923  sqlite3_reset(pIndexXInfo);
9924  if( rc==SQLITE_OK ){
9925    if( p->iSample==100 ){
9926      zQuery = sqlite3_mprintf(
9927          "SELECT %s FROM %Q x ORDER BY %s", zCols, zTab, zOrder
9928      );
9929    }else{
9930      zQuery = sqlite3_mprintf(
9931          "SELECT %s FROM temp."UNIQUE_TABLE_NAME" x ORDER BY %s", zCols, zOrder
9932      );
9933    }
9934  }
9935  sqlite3_free(zCols);
9936  sqlite3_free(zOrder);
9937
9938  /* Formulate the query text */
9939  if( rc==SQLITE_OK ){
9940    sqlite3 *dbrem = (p->iSample==100 ? p->db : p->dbv);
9941    rc = idxPrepareStmt(dbrem, &pQuery, pzErr, zQuery);
9942  }
9943  sqlite3_free(zQuery);
9944
9945  if( rc==SQLITE_OK ){
9946    aStat = (int*)idxMalloc(&rc, sizeof(int)*(nCol+1));
9947  }
9948  if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pQuery) ){
9949    IdxHashEntry *pEntry;
9950    char *zStat = 0;
9951    for(i=0; i<=nCol; i++) aStat[i] = 1;
9952    while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pQuery) ){
9953      aStat[0]++;
9954      for(i=0; i<nCol; i++){
9955        if( sqlite3_column_int(pQuery, i)==0 ) break;
9956      }
9957      for(/*no-op*/; i<nCol; i++){
9958        aStat[i+1]++;
9959      }
9960    }
9961
9962    if( rc==SQLITE_OK ){
9963      int s0 = aStat[0];
9964      zStat = sqlite3_mprintf("%d", s0);
9965      if( zStat==0 ) rc = SQLITE_NOMEM;
9966      for(i=1; rc==SQLITE_OK && i<=nCol; i++){
9967        zStat = idxAppendText(&rc, zStat, " %d", (s0+aStat[i]/2) / aStat[i]);
9968      }
9969    }
9970
9971    if( rc==SQLITE_OK ){
9972      sqlite3_bind_text(pWriteStat, 1, zTab, -1, SQLITE_STATIC);
9973      sqlite3_bind_text(pWriteStat, 2, zIdx, -1, SQLITE_STATIC);
9974      sqlite3_bind_text(pWriteStat, 3, zStat, -1, SQLITE_STATIC);
9975      sqlite3_step(pWriteStat);
9976      rc = sqlite3_reset(pWriteStat);
9977    }
9978
9979    pEntry = idxHashFind(&p->hIdx, zIdx, STRLEN(zIdx));
9980    if( pEntry ){
9981      assert( pEntry->zVal2==0 );
9982      pEntry->zVal2 = zStat;
9983    }else{
9984      sqlite3_free(zStat);
9985    }
9986  }
9987  sqlite3_free(aStat);
9988  idxFinalize(&rc, pQuery);
9989
9990  return rc;
9991}
9992
9993static int idxBuildSampleTable(sqlite3expert *p, const char *zTab){
9994  int rc;
9995  char *zSql;
9996
9997  rc = sqlite3_exec(p->dbv,"DROP TABLE IF EXISTS temp."UNIQUE_TABLE_NAME,0,0,0);
9998  if( rc!=SQLITE_OK ) return rc;
9999
10000  zSql = sqlite3_mprintf(
10001      "CREATE TABLE temp." UNIQUE_TABLE_NAME " AS SELECT * FROM %Q", zTab
10002  );
10003  if( zSql==0 ) return SQLITE_NOMEM;
10004  rc = sqlite3_exec(p->dbv, zSql, 0, 0, 0);
10005  sqlite3_free(zSql);
10006
10007  return rc;
10008}
10009
10010/*
10011** This function is called as part of sqlite3_expert_analyze(). Candidate
10012** indexes have already been created in database sqlite3expert.dbm, this
10013** function populates sqlite_stat1 table in the same database.
10014**
10015** The stat1 data is generated by querying the
10016*/
10017static int idxPopulateStat1(sqlite3expert *p, char **pzErr){
10018  int rc = SQLITE_OK;
10019  int nMax =0;
10020  struct IdxRemCtx *pCtx = 0;
10021  struct IdxSampleCtx samplectx;
10022  int i;
10023  i64 iPrev = -100000;
10024  sqlite3_stmt *pAllIndex = 0;
10025  sqlite3_stmt *pIndexXInfo = 0;
10026  sqlite3_stmt *pWrite = 0;
10027
10028  const char *zAllIndex =
10029    "SELECT s.rowid, s.name, l.name FROM "
10030    "  sqlite_schema AS s, "
10031    "  pragma_index_list(s.name) AS l "
10032    "WHERE s.type = 'table'";
10033  const char *zIndexXInfo =
10034    "SELECT name, coll FROM pragma_index_xinfo(?) WHERE key";
10035  const char *zWrite = "INSERT INTO sqlite_stat1 VALUES(?, ?, ?)";
10036
10037  /* If iSample==0, no sqlite_stat1 data is required. */
10038  if( p->iSample==0 ) return SQLITE_OK;
10039
10040  rc = idxLargestIndex(p->dbm, &nMax, pzErr);
10041  if( nMax<=0 || rc!=SQLITE_OK ) return rc;
10042
10043  rc = sqlite3_exec(p->dbm, "ANALYZE; PRAGMA writable_schema=1", 0, 0, 0);
10044
10045  if( rc==SQLITE_OK ){
10046    int nByte = sizeof(struct IdxRemCtx) + (sizeof(struct IdxRemSlot) * nMax);
10047    pCtx = (struct IdxRemCtx*)idxMalloc(&rc, nByte);
10048  }
10049
10050  if( rc==SQLITE_OK ){
10051    sqlite3 *dbrem = (p->iSample==100 ? p->db : p->dbv);
10052    rc = sqlite3_create_function(
10053        dbrem, "rem", 2, SQLITE_UTF8, (void*)pCtx, idxRemFunc, 0, 0
10054    );
10055  }
10056  if( rc==SQLITE_OK ){
10057    rc = sqlite3_create_function(
10058        p->db, "sample", 0, SQLITE_UTF8, (void*)&samplectx, idxSampleFunc, 0, 0
10059    );
10060  }
10061
10062  if( rc==SQLITE_OK ){
10063    pCtx->nSlot = nMax+1;
10064    rc = idxPrepareStmt(p->dbm, &pAllIndex, pzErr, zAllIndex);
10065  }
10066  if( rc==SQLITE_OK ){
10067    rc = idxPrepareStmt(p->dbm, &pIndexXInfo, pzErr, zIndexXInfo);
10068  }
10069  if( rc==SQLITE_OK ){
10070    rc = idxPrepareStmt(p->dbm, &pWrite, pzErr, zWrite);
10071  }
10072
10073  while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pAllIndex) ){
10074    i64 iRowid = sqlite3_column_int64(pAllIndex, 0);
10075    const char *zTab = (const char*)sqlite3_column_text(pAllIndex, 1);
10076    const char *zIdx = (const char*)sqlite3_column_text(pAllIndex, 2);
10077    if( p->iSample<100 && iPrev!=iRowid ){
10078      samplectx.target = (double)p->iSample / 100.0;
10079      samplectx.iTarget = p->iSample;
10080      samplectx.nRow = 0.0;
10081      samplectx.nRet = 0.0;
10082      rc = idxBuildSampleTable(p, zTab);
10083      if( rc!=SQLITE_OK ) break;
10084    }
10085    rc = idxPopulateOneStat1(p, pIndexXInfo, pWrite, zTab, zIdx, pzErr);
10086    iPrev = iRowid;
10087  }
10088  if( rc==SQLITE_OK && p->iSample<100 ){
10089    rc = sqlite3_exec(p->dbv,
10090        "DROP TABLE IF EXISTS temp." UNIQUE_TABLE_NAME, 0,0,0
10091    );
10092  }
10093
10094  idxFinalize(&rc, pAllIndex);
10095  idxFinalize(&rc, pIndexXInfo);
10096  idxFinalize(&rc, pWrite);
10097
10098  if( pCtx ){
10099    for(i=0; i<pCtx->nSlot; i++){
10100      sqlite3_free(pCtx->aSlot[i].z);
10101    }
10102    sqlite3_free(pCtx);
10103  }
10104
10105  if( rc==SQLITE_OK ){
10106    rc = sqlite3_exec(p->dbm, "ANALYZE sqlite_schema", 0, 0, 0);
10107  }
10108
10109  sqlite3_exec(p->db, "DROP TABLE IF EXISTS temp."UNIQUE_TABLE_NAME,0,0,0);
10110  return rc;
10111}
10112
10113/*
10114** Allocate a new sqlite3expert object.
10115*/
10116sqlite3expert *sqlite3_expert_new(sqlite3 *db, char **pzErrmsg){
10117  int rc = SQLITE_OK;
10118  sqlite3expert *pNew;
10119
10120  pNew = (sqlite3expert*)idxMalloc(&rc, sizeof(sqlite3expert));
10121
10122  /* Open two in-memory databases to work with. The "vtab database" (dbv)
10123  ** will contain a virtual table corresponding to each real table in
10124  ** the user database schema, and a copy of each view. It is used to
10125  ** collect information regarding the WHERE, ORDER BY and other clauses
10126  ** of the user's query.
10127  */
10128  if( rc==SQLITE_OK ){
10129    pNew->db = db;
10130    pNew->iSample = 100;
10131    rc = sqlite3_open(":memory:", &pNew->dbv);
10132  }
10133  if( rc==SQLITE_OK ){
10134    rc = sqlite3_open(":memory:", &pNew->dbm);
10135    if( rc==SQLITE_OK ){
10136      sqlite3_db_config(pNew->dbm, SQLITE_DBCONFIG_TRIGGER_EQP, 1, (int*)0);
10137    }
10138  }
10139
10140
10141  /* Copy the entire schema of database [db] into [dbm]. */
10142  if( rc==SQLITE_OK ){
10143    sqlite3_stmt *pSql;
10144    rc = idxPrintfPrepareStmt(pNew->db, &pSql, pzErrmsg,
10145        "SELECT sql FROM sqlite_schema WHERE name NOT LIKE 'sqlite_%%'"
10146        " AND sql NOT LIKE 'CREATE VIRTUAL %%'"
10147    );
10148    while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
10149      const char *zSql = (const char*)sqlite3_column_text(pSql, 0);
10150      rc = sqlite3_exec(pNew->dbm, zSql, 0, 0, pzErrmsg);
10151    }
10152    idxFinalize(&rc, pSql);
10153  }
10154
10155  /* Create the vtab schema */
10156  if( rc==SQLITE_OK ){
10157    rc = idxCreateVtabSchema(pNew, pzErrmsg);
10158  }
10159
10160  /* Register the auth callback with dbv */
10161  if( rc==SQLITE_OK ){
10162    sqlite3_set_authorizer(pNew->dbv, idxAuthCallback, (void*)pNew);
10163  }
10164
10165  /* If an error has occurred, free the new object and reutrn NULL. Otherwise,
10166  ** return the new sqlite3expert handle.  */
10167  if( rc!=SQLITE_OK ){
10168    sqlite3_expert_destroy(pNew);
10169    pNew = 0;
10170  }
10171  return pNew;
10172}
10173
10174/*
10175** Configure an sqlite3expert object.
10176*/
10177int sqlite3_expert_config(sqlite3expert *p, int op, ...){
10178  int rc = SQLITE_OK;
10179  va_list ap;
10180  va_start(ap, op);
10181  switch( op ){
10182    case EXPERT_CONFIG_SAMPLE: {
10183      int iVal = va_arg(ap, int);
10184      if( iVal<0 ) iVal = 0;
10185      if( iVal>100 ) iVal = 100;
10186      p->iSample = iVal;
10187      break;
10188    }
10189    default:
10190      rc = SQLITE_NOTFOUND;
10191      break;
10192  }
10193
10194  va_end(ap);
10195  return rc;
10196}
10197
10198/*
10199** Add an SQL statement to the analysis.
10200*/
10201int sqlite3_expert_sql(
10202  sqlite3expert *p,               /* From sqlite3_expert_new() */
10203  const char *zSql,               /* SQL statement to add */
10204  char **pzErr                    /* OUT: Error message (if any) */
10205){
10206  IdxScan *pScanOrig = p->pScan;
10207  IdxStatement *pStmtOrig = p->pStatement;
10208  int rc = SQLITE_OK;
10209  const char *zStmt = zSql;
10210
10211  if( p->bRun ) return SQLITE_MISUSE;
10212
10213  while( rc==SQLITE_OK && zStmt && zStmt[0] ){
10214    sqlite3_stmt *pStmt = 0;
10215    rc = sqlite3_prepare_v2(p->dbv, zStmt, -1, &pStmt, &zStmt);
10216    if( rc==SQLITE_OK ){
10217      if( pStmt ){
10218        IdxStatement *pNew;
10219        const char *z = sqlite3_sql(pStmt);
10220        int n = STRLEN(z);
10221        pNew = (IdxStatement*)idxMalloc(&rc, sizeof(IdxStatement) + n+1);
10222        if( rc==SQLITE_OK ){
10223          pNew->zSql = (char*)&pNew[1];
10224          memcpy(pNew->zSql, z, n+1);
10225          pNew->pNext = p->pStatement;
10226          if( p->pStatement ) pNew->iId = p->pStatement->iId+1;
10227          p->pStatement = pNew;
10228        }
10229        sqlite3_finalize(pStmt);
10230      }
10231    }else{
10232      idxDatabaseError(p->dbv, pzErr);
10233    }
10234  }
10235
10236  if( rc!=SQLITE_OK ){
10237    idxScanFree(p->pScan, pScanOrig);
10238    idxStatementFree(p->pStatement, pStmtOrig);
10239    p->pScan = pScanOrig;
10240    p->pStatement = pStmtOrig;
10241  }
10242
10243  return rc;
10244}
10245
10246int sqlite3_expert_analyze(sqlite3expert *p, char **pzErr){
10247  int rc;
10248  IdxHashEntry *pEntry;
10249
10250  /* Do trigger processing to collect any extra IdxScan structures */
10251  rc = idxProcessTriggers(p, pzErr);
10252
10253  /* Create candidate indexes within the in-memory database file */
10254  if( rc==SQLITE_OK ){
10255    rc = idxCreateCandidates(p);
10256  }
10257
10258  /* Generate the stat1 data */
10259  if( rc==SQLITE_OK ){
10260    rc = idxPopulateStat1(p, pzErr);
10261  }
10262
10263  /* Formulate the EXPERT_REPORT_CANDIDATES text */
10264  for(pEntry=p->hIdx.pFirst; pEntry; pEntry=pEntry->pNext){
10265    p->zCandidates = idxAppendText(&rc, p->zCandidates,
10266        "%s;%s%s\n", pEntry->zVal,
10267        pEntry->zVal2 ? " -- stat1: " : "", pEntry->zVal2
10268    );
10269  }
10270
10271  /* Figure out which of the candidate indexes are preferred by the query
10272  ** planner and report the results to the user.  */
10273  if( rc==SQLITE_OK ){
10274    rc = idxFindIndexes(p, pzErr);
10275  }
10276
10277  if( rc==SQLITE_OK ){
10278    p->bRun = 1;
10279  }
10280  return rc;
10281}
10282
10283/*
10284** Return the total number of statements that have been added to this
10285** sqlite3expert using sqlite3_expert_sql().
10286*/
10287int sqlite3_expert_count(sqlite3expert *p){
10288  int nRet = 0;
10289  if( p->pStatement ) nRet = p->pStatement->iId+1;
10290  return nRet;
10291}
10292
10293/*
10294** Return a component of the report.
10295*/
10296const char *sqlite3_expert_report(sqlite3expert *p, int iStmt, int eReport){
10297  const char *zRet = 0;
10298  IdxStatement *pStmt;
10299
10300  if( p->bRun==0 ) return 0;
10301  for(pStmt=p->pStatement; pStmt && pStmt->iId!=iStmt; pStmt=pStmt->pNext);
10302  switch( eReport ){
10303    case EXPERT_REPORT_SQL:
10304      if( pStmt ) zRet = pStmt->zSql;
10305      break;
10306    case EXPERT_REPORT_INDEXES:
10307      if( pStmt ) zRet = pStmt->zIdx;
10308      break;
10309    case EXPERT_REPORT_PLAN:
10310      if( pStmt ) zRet = pStmt->zEQP;
10311      break;
10312    case EXPERT_REPORT_CANDIDATES:
10313      zRet = p->zCandidates;
10314      break;
10315  }
10316  return zRet;
10317}
10318
10319/*
10320** Free an sqlite3expert object.
10321*/
10322void sqlite3_expert_destroy(sqlite3expert *p){
10323  if( p ){
10324    sqlite3_close(p->dbm);
10325    sqlite3_close(p->dbv);
10326    idxScanFree(p->pScan, 0);
10327    idxStatementFree(p->pStatement, 0);
10328    idxTableFree(p->pTable);
10329    idxWriteFree(p->pWrite);
10330    idxHashClear(&p->hIdx);
10331    sqlite3_free(p->zCandidates);
10332    sqlite3_free(p);
10333  }
10334}
10335
10336#endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
10337
10338/************************* End ../ext/expert/sqlite3expert.c ********************/
10339
10340#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
10341/************************* Begin ../ext/misc/dbdata.c ******************/
10342/*
10343** 2019-04-17
10344**
10345** The author disclaims copyright to this source code.  In place of
10346** a legal notice, here is a blessing:
10347**
10348**    May you do good and not evil.
10349**    May you find forgiveness for yourself and forgive others.
10350**    May you share freely, never taking more than you give.
10351**
10352******************************************************************************
10353**
10354** This file contains an implementation of two eponymous virtual tables,
10355** "sqlite_dbdata" and "sqlite_dbptr". Both modules require that the
10356** "sqlite_dbpage" eponymous virtual table be available.
10357**
10358** SQLITE_DBDATA:
10359**   sqlite_dbdata is used to extract data directly from a database b-tree
10360**   page and its associated overflow pages, bypassing the b-tree layer.
10361**   The table schema is equivalent to:
10362**
10363**     CREATE TABLE sqlite_dbdata(
10364**       pgno INTEGER,
10365**       cell INTEGER,
10366**       field INTEGER,
10367**       value ANY,
10368**       schema TEXT HIDDEN
10369**     );
10370**
10371**   IMPORTANT: THE VIRTUAL TABLE SCHEMA ABOVE IS SUBJECT TO CHANGE. IN THE
10372**   FUTURE NEW NON-HIDDEN COLUMNS MAY BE ADDED BETWEEN "value" AND
10373**   "schema".
10374**
10375**   Each page of the database is inspected. If it cannot be interpreted as
10376**   a b-tree page, or if it is a b-tree page containing 0 entries, the
10377**   sqlite_dbdata table contains no rows for that page.  Otherwise, the
10378**   table contains one row for each field in the record associated with
10379**   each cell on the page. For intkey b-trees, the key value is stored in
10380**   field -1.
10381**
10382**   For example, for the database:
10383**
10384**     CREATE TABLE t1(a, b);     -- root page is page 2
10385**     INSERT INTO t1(rowid, a, b) VALUES(5, 'v', 'five');
10386**     INSERT INTO t1(rowid, a, b) VALUES(10, 'x', 'ten');
10387**
10388**   the sqlite_dbdata table contains, as well as from entries related to
10389**   page 1, content equivalent to:
10390**
10391**     INSERT INTO sqlite_dbdata(pgno, cell, field, value) VALUES
10392**         (2, 0, -1, 5     ),
10393**         (2, 0,  0, 'v'   ),
10394**         (2, 0,  1, 'five'),
10395**         (2, 1, -1, 10    ),
10396**         (2, 1,  0, 'x'   ),
10397**         (2, 1,  1, 'ten' );
10398**
10399**   If database corruption is encountered, this module does not report an
10400**   error. Instead, it attempts to extract as much data as possible and
10401**   ignores the corruption.
10402**
10403** SQLITE_DBPTR:
10404**   The sqlite_dbptr table has the following schema:
10405**
10406**     CREATE TABLE sqlite_dbptr(
10407**       pgno INTEGER,
10408**       child INTEGER,
10409**       schema TEXT HIDDEN
10410**     );
10411**
10412**   It contains one entry for each b-tree pointer between a parent and
10413**   child page in the database.
10414*/
10415#if !defined(SQLITEINT_H)
10416/* #include "sqlite3ext.h" */
10417
10418/* typedef unsigned char u8; */
10419
10420#endif
10421SQLITE_EXTENSION_INIT1
10422#include <string.h>
10423#include <assert.h>
10424
10425#define DBDATA_PADDING_BYTES 100
10426
10427typedef struct DbdataTable DbdataTable;
10428typedef struct DbdataCursor DbdataCursor;
10429
10430/* Cursor object */
10431struct DbdataCursor {
10432  sqlite3_vtab_cursor base;       /* Base class.  Must be first */
10433  sqlite3_stmt *pStmt;            /* For fetching database pages */
10434
10435  int iPgno;                      /* Current page number */
10436  u8 *aPage;                      /* Buffer containing page */
10437  int nPage;                      /* Size of aPage[] in bytes */
10438  int nCell;                      /* Number of cells on aPage[] */
10439  int iCell;                      /* Current cell number */
10440  int bOnePage;                   /* True to stop after one page */
10441  int szDb;
10442  sqlite3_int64 iRowid;
10443
10444  /* Only for the sqlite_dbdata table */
10445  u8 *pRec;                       /* Buffer containing current record */
10446  int nRec;                       /* Size of pRec[] in bytes */
10447  int nHdr;                       /* Size of header in bytes */
10448  int iField;                     /* Current field number */
10449  u8 *pHdrPtr;
10450  u8 *pPtr;
10451
10452  sqlite3_int64 iIntkey;          /* Integer key value */
10453};
10454
10455/* Table object */
10456struct DbdataTable {
10457  sqlite3_vtab base;              /* Base class.  Must be first */
10458  sqlite3 *db;                    /* The database connection */
10459  sqlite3_stmt *pStmt;            /* For fetching database pages */
10460  int bPtr;                       /* True for sqlite3_dbptr table */
10461};
10462
10463/* Column and schema definitions for sqlite_dbdata */
10464#define DBDATA_COLUMN_PGNO        0
10465#define DBDATA_COLUMN_CELL        1
10466#define DBDATA_COLUMN_FIELD       2
10467#define DBDATA_COLUMN_VALUE       3
10468#define DBDATA_COLUMN_SCHEMA      4
10469#define DBDATA_SCHEMA             \
10470      "CREATE TABLE x("           \
10471      "  pgno INTEGER,"           \
10472      "  cell INTEGER,"           \
10473      "  field INTEGER,"          \
10474      "  value ANY,"              \
10475      "  schema TEXT HIDDEN"      \
10476      ")"
10477
10478/* Column and schema definitions for sqlite_dbptr */
10479#define DBPTR_COLUMN_PGNO         0
10480#define DBPTR_COLUMN_CHILD        1
10481#define DBPTR_COLUMN_SCHEMA       2
10482#define DBPTR_SCHEMA              \
10483      "CREATE TABLE x("           \
10484      "  pgno INTEGER,"           \
10485      "  child INTEGER,"          \
10486      "  schema TEXT HIDDEN"      \
10487      ")"
10488
10489/*
10490** Connect to an sqlite_dbdata (pAux==0) or sqlite_dbptr (pAux!=0) virtual
10491** table.
10492*/
10493static int dbdataConnect(
10494  sqlite3 *db,
10495  void *pAux,
10496  int argc, const char *const*argv,
10497  sqlite3_vtab **ppVtab,
10498  char **pzErr
10499){
10500  DbdataTable *pTab = 0;
10501  int rc = sqlite3_declare_vtab(db, pAux ? DBPTR_SCHEMA : DBDATA_SCHEMA);
10502
10503  if( rc==SQLITE_OK ){
10504    pTab = (DbdataTable*)sqlite3_malloc64(sizeof(DbdataTable));
10505    if( pTab==0 ){
10506      rc = SQLITE_NOMEM;
10507    }else{
10508      memset(pTab, 0, sizeof(DbdataTable));
10509      pTab->db = db;
10510      pTab->bPtr = (pAux!=0);
10511    }
10512  }
10513
10514  *ppVtab = (sqlite3_vtab*)pTab;
10515  return rc;
10516}
10517
10518/*
10519** Disconnect from or destroy a sqlite_dbdata or sqlite_dbptr virtual table.
10520*/
10521static int dbdataDisconnect(sqlite3_vtab *pVtab){
10522  DbdataTable *pTab = (DbdataTable*)pVtab;
10523  if( pTab ){
10524    sqlite3_finalize(pTab->pStmt);
10525    sqlite3_free(pVtab);
10526  }
10527  return SQLITE_OK;
10528}
10529
10530/*
10531** This function interprets two types of constraints:
10532**
10533**       schema=?
10534**       pgno=?
10535**
10536** If neither are present, idxNum is set to 0. If schema=? is present,
10537** the 0x01 bit in idxNum is set. If pgno=? is present, the 0x02 bit
10538** in idxNum is set.
10539**
10540** If both parameters are present, schema is in position 0 and pgno in
10541** position 1.
10542*/
10543static int dbdataBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdx){
10544  DbdataTable *pTab = (DbdataTable*)tab;
10545  int i;
10546  int iSchema = -1;
10547  int iPgno = -1;
10548  int colSchema = (pTab->bPtr ? DBPTR_COLUMN_SCHEMA : DBDATA_COLUMN_SCHEMA);
10549
10550  for(i=0; i<pIdx->nConstraint; i++){
10551    struct sqlite3_index_constraint *p = &pIdx->aConstraint[i];
10552    if( p->op==SQLITE_INDEX_CONSTRAINT_EQ ){
10553      if( p->iColumn==colSchema ){
10554        if( p->usable==0 ) return SQLITE_CONSTRAINT;
10555        iSchema = i;
10556      }
10557      if( p->iColumn==DBDATA_COLUMN_PGNO && p->usable ){
10558        iPgno = i;
10559      }
10560    }
10561  }
10562
10563  if( iSchema>=0 ){
10564    pIdx->aConstraintUsage[iSchema].argvIndex = 1;
10565    pIdx->aConstraintUsage[iSchema].omit = 1;
10566  }
10567  if( iPgno>=0 ){
10568    pIdx->aConstraintUsage[iPgno].argvIndex = 1 + (iSchema>=0);
10569    pIdx->aConstraintUsage[iPgno].omit = 1;
10570    pIdx->estimatedCost = 100;
10571    pIdx->estimatedRows =  50;
10572
10573    if( pTab->bPtr==0 && pIdx->nOrderBy && pIdx->aOrderBy[0].desc==0 ){
10574      int iCol = pIdx->aOrderBy[0].iColumn;
10575      if( pIdx->nOrderBy==1 ){
10576        pIdx->orderByConsumed = (iCol==0 || iCol==1);
10577      }else if( pIdx->nOrderBy==2 && pIdx->aOrderBy[1].desc==0 && iCol==0 ){
10578        pIdx->orderByConsumed = (pIdx->aOrderBy[1].iColumn==1);
10579      }
10580    }
10581
10582  }else{
10583    pIdx->estimatedCost = 100000000;
10584    pIdx->estimatedRows = 1000000000;
10585  }
10586  pIdx->idxNum = (iSchema>=0 ? 0x01 : 0x00) | (iPgno>=0 ? 0x02 : 0x00);
10587  return SQLITE_OK;
10588}
10589
10590/*
10591** Open a new sqlite_dbdata or sqlite_dbptr cursor.
10592*/
10593static int dbdataOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){
10594  DbdataCursor *pCsr;
10595
10596  pCsr = (DbdataCursor*)sqlite3_malloc64(sizeof(DbdataCursor));
10597  if( pCsr==0 ){
10598    return SQLITE_NOMEM;
10599  }else{
10600    memset(pCsr, 0, sizeof(DbdataCursor));
10601    pCsr->base.pVtab = pVTab;
10602  }
10603
10604  *ppCursor = (sqlite3_vtab_cursor *)pCsr;
10605  return SQLITE_OK;
10606}
10607
10608/*
10609** Restore a cursor object to the state it was in when first allocated
10610** by dbdataOpen().
10611*/
10612static void dbdataResetCursor(DbdataCursor *pCsr){
10613  DbdataTable *pTab = (DbdataTable*)(pCsr->base.pVtab);
10614  if( pTab->pStmt==0 ){
10615    pTab->pStmt = pCsr->pStmt;
10616  }else{
10617    sqlite3_finalize(pCsr->pStmt);
10618  }
10619  pCsr->pStmt = 0;
10620  pCsr->iPgno = 1;
10621  pCsr->iCell = 0;
10622  pCsr->iField = 0;
10623  pCsr->bOnePage = 0;
10624  sqlite3_free(pCsr->aPage);
10625  sqlite3_free(pCsr->pRec);
10626  pCsr->pRec = 0;
10627  pCsr->aPage = 0;
10628}
10629
10630/*
10631** Close an sqlite_dbdata or sqlite_dbptr cursor.
10632*/
10633static int dbdataClose(sqlite3_vtab_cursor *pCursor){
10634  DbdataCursor *pCsr = (DbdataCursor*)pCursor;
10635  dbdataResetCursor(pCsr);
10636  sqlite3_free(pCsr);
10637  return SQLITE_OK;
10638}
10639
10640/*
10641** Utility methods to decode 16 and 32-bit big-endian unsigned integers.
10642*/
10643static unsigned int get_uint16(unsigned char *a){
10644  return (a[0]<<8)|a[1];
10645}
10646static unsigned int get_uint32(unsigned char *a){
10647  return ((unsigned int)a[0]<<24)
10648       | ((unsigned int)a[1]<<16)
10649       | ((unsigned int)a[2]<<8)
10650       | ((unsigned int)a[3]);
10651}
10652
10653/*
10654** Load page pgno from the database via the sqlite_dbpage virtual table.
10655** If successful, set (*ppPage) to point to a buffer containing the page
10656** data, (*pnPage) to the size of that buffer in bytes and return
10657** SQLITE_OK. In this case it is the responsibility of the caller to
10658** eventually free the buffer using sqlite3_free().
10659**
10660** Or, if an error occurs, set both (*ppPage) and (*pnPage) to 0 and
10661** return an SQLite error code.
10662*/
10663static int dbdataLoadPage(
10664  DbdataCursor *pCsr,             /* Cursor object */
10665  unsigned int pgno,              /* Page number of page to load */
10666  u8 **ppPage,                    /* OUT: pointer to page buffer */
10667  int *pnPage                     /* OUT: Size of (*ppPage) in bytes */
10668){
10669  int rc2;
10670  int rc = SQLITE_OK;
10671  sqlite3_stmt *pStmt = pCsr->pStmt;
10672
10673  *ppPage = 0;
10674  *pnPage = 0;
10675  sqlite3_bind_int64(pStmt, 2, pgno);
10676  if( SQLITE_ROW==sqlite3_step(pStmt) ){
10677    int nCopy = sqlite3_column_bytes(pStmt, 0);
10678    if( nCopy>0 ){
10679      u8 *pPage;
10680      pPage = (u8*)sqlite3_malloc64(nCopy + DBDATA_PADDING_BYTES);
10681      if( pPage==0 ){
10682        rc = SQLITE_NOMEM;
10683      }else{
10684        const u8 *pCopy = sqlite3_column_blob(pStmt, 0);
10685        memcpy(pPage, pCopy, nCopy);
10686        memset(&pPage[nCopy], 0, DBDATA_PADDING_BYTES);
10687      }
10688      *ppPage = pPage;
10689      *pnPage = nCopy;
10690    }
10691  }
10692  rc2 = sqlite3_reset(pStmt);
10693  if( rc==SQLITE_OK ) rc = rc2;
10694
10695  return rc;
10696}
10697
10698/*
10699** Read a varint.  Put the value in *pVal and return the number of bytes.
10700*/
10701static int dbdataGetVarint(const u8 *z, sqlite3_int64 *pVal){
10702  sqlite3_int64 v = 0;
10703  int i;
10704  for(i=0; i<8; i++){
10705    v = (v<<7) + (z[i]&0x7f);
10706    if( (z[i]&0x80)==0 ){ *pVal = v; return i+1; }
10707  }
10708  v = (v<<8) + (z[i]&0xff);
10709  *pVal = v;
10710  return 9;
10711}
10712
10713/*
10714** Return the number of bytes of space used by an SQLite value of type
10715** eType.
10716*/
10717static int dbdataValueBytes(int eType){
10718  switch( eType ){
10719    case 0: case 8: case 9:
10720    case 10: case 11:
10721      return 0;
10722    case 1:
10723      return 1;
10724    case 2:
10725      return 2;
10726    case 3:
10727      return 3;
10728    case 4:
10729      return 4;
10730    case 5:
10731      return 6;
10732    case 6:
10733    case 7:
10734      return 8;
10735    default:
10736      if( eType>0 ){
10737        return ((eType-12) / 2);
10738      }
10739      return 0;
10740  }
10741}
10742
10743/*
10744** Load a value of type eType from buffer pData and use it to set the
10745** result of context object pCtx.
10746*/
10747static void dbdataValue(
10748  sqlite3_context *pCtx,
10749  int eType,
10750  u8 *pData,
10751  int nData
10752){
10753  if( eType>=0 && dbdataValueBytes(eType)<=nData ){
10754    switch( eType ){
10755      case 0:
10756      case 10:
10757      case 11:
10758        sqlite3_result_null(pCtx);
10759        break;
10760
10761      case 8:
10762        sqlite3_result_int(pCtx, 0);
10763        break;
10764      case 9:
10765        sqlite3_result_int(pCtx, 1);
10766        break;
10767
10768      case 1: case 2: case 3: case 4: case 5: case 6: case 7: {
10769        sqlite3_uint64 v = (signed char)pData[0];
10770        pData++;
10771        switch( eType ){
10772          case 7:
10773          case 6:  v = (v<<16) + (pData[0]<<8) + pData[1];  pData += 2;
10774          case 5:  v = (v<<16) + (pData[0]<<8) + pData[1];  pData += 2;
10775          case 4:  v = (v<<8) + pData[0];  pData++;
10776          case 3:  v = (v<<8) + pData[0];  pData++;
10777          case 2:  v = (v<<8) + pData[0];  pData++;
10778        }
10779
10780        if( eType==7 ){
10781          double r;
10782          memcpy(&r, &v, sizeof(r));
10783          sqlite3_result_double(pCtx, r);
10784        }else{
10785          sqlite3_result_int64(pCtx, (sqlite3_int64)v);
10786        }
10787        break;
10788      }
10789
10790      default: {
10791        int n = ((eType-12) / 2);
10792        if( eType % 2 ){
10793          sqlite3_result_text(pCtx, (const char*)pData, n, SQLITE_TRANSIENT);
10794        }else{
10795          sqlite3_result_blob(pCtx, pData, n, SQLITE_TRANSIENT);
10796        }
10797      }
10798    }
10799  }
10800}
10801
10802/*
10803** Move an sqlite_dbdata or sqlite_dbptr cursor to the next entry.
10804*/
10805static int dbdataNext(sqlite3_vtab_cursor *pCursor){
10806  DbdataCursor *pCsr = (DbdataCursor*)pCursor;
10807  DbdataTable *pTab = (DbdataTable*)pCursor->pVtab;
10808
10809  pCsr->iRowid++;
10810  while( 1 ){
10811    int rc;
10812    int iOff = (pCsr->iPgno==1 ? 100 : 0);
10813    int bNextPage = 0;
10814
10815    if( pCsr->aPage==0 ){
10816      while( 1 ){
10817        if( pCsr->bOnePage==0 && pCsr->iPgno>pCsr->szDb ) return SQLITE_OK;
10818        rc = dbdataLoadPage(pCsr, pCsr->iPgno, &pCsr->aPage, &pCsr->nPage);
10819        if( rc!=SQLITE_OK ) return rc;
10820        if( pCsr->aPage ) break;
10821        pCsr->iPgno++;
10822      }
10823      pCsr->iCell = pTab->bPtr ? -2 : 0;
10824      pCsr->nCell = get_uint16(&pCsr->aPage[iOff+3]);
10825    }
10826
10827    if( pTab->bPtr ){
10828      if( pCsr->aPage[iOff]!=0x02 && pCsr->aPage[iOff]!=0x05 ){
10829        pCsr->iCell = pCsr->nCell;
10830      }
10831      pCsr->iCell++;
10832      if( pCsr->iCell>=pCsr->nCell ){
10833        sqlite3_free(pCsr->aPage);
10834        pCsr->aPage = 0;
10835        if( pCsr->bOnePage ) return SQLITE_OK;
10836        pCsr->iPgno++;
10837      }else{
10838        return SQLITE_OK;
10839      }
10840    }else{
10841      /* If there is no record loaded, load it now. */
10842      if( pCsr->pRec==0 ){
10843        int bHasRowid = 0;
10844        int nPointer = 0;
10845        sqlite3_int64 nPayload = 0;
10846        sqlite3_int64 nHdr = 0;
10847        int iHdr;
10848        int U, X;
10849        int nLocal;
10850
10851        switch( pCsr->aPage[iOff] ){
10852          case 0x02:
10853            nPointer = 4;
10854            break;
10855          case 0x0a:
10856            break;
10857          case 0x0d:
10858            bHasRowid = 1;
10859            break;
10860          default:
10861            /* This is not a b-tree page with records on it. Continue. */
10862            pCsr->iCell = pCsr->nCell;
10863            break;
10864        }
10865
10866        if( pCsr->iCell>=pCsr->nCell ){
10867          bNextPage = 1;
10868        }else{
10869
10870          iOff += 8 + nPointer + pCsr->iCell*2;
10871          if( iOff>pCsr->nPage ){
10872            bNextPage = 1;
10873          }else{
10874            iOff = get_uint16(&pCsr->aPage[iOff]);
10875          }
10876
10877          /* For an interior node cell, skip past the child-page number */
10878          iOff += nPointer;
10879
10880          /* Load the "byte of payload including overflow" field */
10881          if( bNextPage || iOff>pCsr->nPage ){
10882            bNextPage = 1;
10883          }else{
10884            iOff += dbdataGetVarint(&pCsr->aPage[iOff], &nPayload);
10885          }
10886
10887          /* If this is a leaf intkey cell, load the rowid */
10888          if( bHasRowid && !bNextPage && iOff<pCsr->nPage ){
10889            iOff += dbdataGetVarint(&pCsr->aPage[iOff], &pCsr->iIntkey);
10890          }
10891
10892          /* Figure out how much data to read from the local page */
10893          U = pCsr->nPage;
10894          if( bHasRowid ){
10895            X = U-35;
10896          }else{
10897            X = ((U-12)*64/255)-23;
10898          }
10899          if( nPayload<=X ){
10900            nLocal = nPayload;
10901          }else{
10902            int M, K;
10903            M = ((U-12)*32/255)-23;
10904            K = M+((nPayload-M)%(U-4));
10905            if( K<=X ){
10906              nLocal = K;
10907            }else{
10908              nLocal = M;
10909            }
10910          }
10911
10912          if( bNextPage || nLocal+iOff>pCsr->nPage ){
10913            bNextPage = 1;
10914          }else{
10915
10916            /* Allocate space for payload. And a bit more to catch small buffer
10917            ** overruns caused by attempting to read a varint or similar from
10918            ** near the end of a corrupt record.  */
10919            pCsr->pRec = (u8*)sqlite3_malloc64(nPayload+DBDATA_PADDING_BYTES);
10920            if( pCsr->pRec==0 ) return SQLITE_NOMEM;
10921            memset(pCsr->pRec, 0, nPayload+DBDATA_PADDING_BYTES);
10922            pCsr->nRec = nPayload;
10923
10924            /* Load the nLocal bytes of payload */
10925            memcpy(pCsr->pRec, &pCsr->aPage[iOff], nLocal);
10926            iOff += nLocal;
10927
10928            /* Load content from overflow pages */
10929            if( nPayload>nLocal ){
10930              sqlite3_int64 nRem = nPayload - nLocal;
10931              unsigned int pgnoOvfl = get_uint32(&pCsr->aPage[iOff]);
10932              while( nRem>0 ){
10933                u8 *aOvfl = 0;
10934                int nOvfl = 0;
10935                int nCopy;
10936                rc = dbdataLoadPage(pCsr, pgnoOvfl, &aOvfl, &nOvfl);
10937                assert( rc!=SQLITE_OK || aOvfl==0 || nOvfl==pCsr->nPage );
10938                if( rc!=SQLITE_OK ) return rc;
10939                if( aOvfl==0 ) break;
10940
10941                nCopy = U-4;
10942                if( nCopy>nRem ) nCopy = nRem;
10943                memcpy(&pCsr->pRec[nPayload-nRem], &aOvfl[4], nCopy);
10944                nRem -= nCopy;
10945
10946                pgnoOvfl = get_uint32(aOvfl);
10947                sqlite3_free(aOvfl);
10948              }
10949            }
10950
10951            iHdr = dbdataGetVarint(pCsr->pRec, &nHdr);
10952            pCsr->nHdr = nHdr;
10953            pCsr->pHdrPtr = &pCsr->pRec[iHdr];
10954            pCsr->pPtr = &pCsr->pRec[pCsr->nHdr];
10955            pCsr->iField = (bHasRowid ? -1 : 0);
10956          }
10957        }
10958      }else{
10959        pCsr->iField++;
10960        if( pCsr->iField>0 ){
10961          sqlite3_int64 iType;
10962          if( pCsr->pHdrPtr>&pCsr->pRec[pCsr->nRec] ){
10963            bNextPage = 1;
10964          }else{
10965            pCsr->pHdrPtr += dbdataGetVarint(pCsr->pHdrPtr, &iType);
10966            pCsr->pPtr += dbdataValueBytes(iType);
10967          }
10968        }
10969      }
10970
10971      if( bNextPage ){
10972        sqlite3_free(pCsr->aPage);
10973        sqlite3_free(pCsr->pRec);
10974        pCsr->aPage = 0;
10975        pCsr->pRec = 0;
10976        if( pCsr->bOnePage ) return SQLITE_OK;
10977        pCsr->iPgno++;
10978      }else{
10979        if( pCsr->iField<0 || pCsr->pHdrPtr<&pCsr->pRec[pCsr->nHdr] ){
10980          return SQLITE_OK;
10981        }
10982
10983        /* Advance to the next cell. The next iteration of the loop will load
10984        ** the record and so on. */
10985        sqlite3_free(pCsr->pRec);
10986        pCsr->pRec = 0;
10987        pCsr->iCell++;
10988      }
10989    }
10990  }
10991
10992  assert( !"can't get here" );
10993  return SQLITE_OK;
10994}
10995
10996/*
10997** Return true if the cursor is at EOF.
10998*/
10999static int dbdataEof(sqlite3_vtab_cursor *pCursor){
11000  DbdataCursor *pCsr = (DbdataCursor*)pCursor;
11001  return pCsr->aPage==0;
11002}
11003
11004/*
11005** Determine the size in pages of database zSchema (where zSchema is
11006** "main", "temp" or the name of an attached database) and set
11007** pCsr->szDb accordingly. If successful, return SQLITE_OK. Otherwise,
11008** an SQLite error code.
11009*/
11010static int dbdataDbsize(DbdataCursor *pCsr, const char *zSchema){
11011  DbdataTable *pTab = (DbdataTable*)pCsr->base.pVtab;
11012  char *zSql = 0;
11013  int rc, rc2;
11014  sqlite3_stmt *pStmt = 0;
11015
11016  zSql = sqlite3_mprintf("PRAGMA %Q.page_count", zSchema);
11017  if( zSql==0 ) return SQLITE_NOMEM;
11018  rc = sqlite3_prepare_v2(pTab->db, zSql, -1, &pStmt, 0);
11019  sqlite3_free(zSql);
11020  if( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
11021    pCsr->szDb = sqlite3_column_int(pStmt, 0);
11022  }
11023  rc2 = sqlite3_finalize(pStmt);
11024  if( rc==SQLITE_OK ) rc = rc2;
11025  return rc;
11026}
11027
11028/*
11029** xFilter method for sqlite_dbdata and sqlite_dbptr.
11030*/
11031static int dbdataFilter(
11032  sqlite3_vtab_cursor *pCursor,
11033  int idxNum, const char *idxStr,
11034  int argc, sqlite3_value **argv
11035){
11036  DbdataCursor *pCsr = (DbdataCursor*)pCursor;
11037  DbdataTable *pTab = (DbdataTable*)pCursor->pVtab;
11038  int rc = SQLITE_OK;
11039  const char *zSchema = "main";
11040
11041  dbdataResetCursor(pCsr);
11042  assert( pCsr->iPgno==1 );
11043  if( idxNum & 0x01 ){
11044    zSchema = (const char*)sqlite3_value_text(argv[0]);
11045  }
11046  if( idxNum & 0x02 ){
11047    pCsr->iPgno = sqlite3_value_int(argv[(idxNum & 0x01)]);
11048    pCsr->bOnePage = 1;
11049  }else{
11050    pCsr->nPage = dbdataDbsize(pCsr, zSchema);
11051    rc = dbdataDbsize(pCsr, zSchema);
11052  }
11053
11054  if( rc==SQLITE_OK ){
11055    if( pTab->pStmt ){
11056      pCsr->pStmt = pTab->pStmt;
11057      pTab->pStmt = 0;
11058    }else{
11059      rc = sqlite3_prepare_v2(pTab->db,
11060          "SELECT data FROM sqlite_dbpage(?) WHERE pgno=?", -1,
11061          &pCsr->pStmt, 0
11062      );
11063    }
11064  }
11065  if( rc==SQLITE_OK ){
11066    rc = sqlite3_bind_text(pCsr->pStmt, 1, zSchema, -1, SQLITE_TRANSIENT);
11067  }else{
11068    pTab->base.zErrMsg = sqlite3_mprintf("%s", sqlite3_errmsg(pTab->db));
11069  }
11070  if( rc==SQLITE_OK ){
11071    rc = dbdataNext(pCursor);
11072  }
11073  return rc;
11074}
11075
11076/*
11077** Return a column for the sqlite_dbdata or sqlite_dbptr table.
11078*/
11079static int dbdataColumn(
11080  sqlite3_vtab_cursor *pCursor,
11081  sqlite3_context *ctx,
11082  int i
11083){
11084  DbdataCursor *pCsr = (DbdataCursor*)pCursor;
11085  DbdataTable *pTab = (DbdataTable*)pCursor->pVtab;
11086  if( pTab->bPtr ){
11087    switch( i ){
11088      case DBPTR_COLUMN_PGNO:
11089        sqlite3_result_int64(ctx, pCsr->iPgno);
11090        break;
11091      case DBPTR_COLUMN_CHILD: {
11092        int iOff = pCsr->iPgno==1 ? 100 : 0;
11093        if( pCsr->iCell<0 ){
11094          iOff += 8;
11095        }else{
11096          iOff += 12 + pCsr->iCell*2;
11097          if( iOff>pCsr->nPage ) return SQLITE_OK;
11098          iOff = get_uint16(&pCsr->aPage[iOff]);
11099        }
11100        if( iOff<=pCsr->nPage ){
11101          sqlite3_result_int64(ctx, get_uint32(&pCsr->aPage[iOff]));
11102        }
11103        break;
11104      }
11105    }
11106  }else{
11107    switch( i ){
11108      case DBDATA_COLUMN_PGNO:
11109        sqlite3_result_int64(ctx, pCsr->iPgno);
11110        break;
11111      case DBDATA_COLUMN_CELL:
11112        sqlite3_result_int(ctx, pCsr->iCell);
11113        break;
11114      case DBDATA_COLUMN_FIELD:
11115        sqlite3_result_int(ctx, pCsr->iField);
11116        break;
11117      case DBDATA_COLUMN_VALUE: {
11118        if( pCsr->iField<0 ){
11119          sqlite3_result_int64(ctx, pCsr->iIntkey);
11120        }else{
11121          sqlite3_int64 iType;
11122          dbdataGetVarint(pCsr->pHdrPtr, &iType);
11123          dbdataValue(
11124              ctx, iType, pCsr->pPtr, &pCsr->pRec[pCsr->nRec] - pCsr->pPtr
11125          );
11126        }
11127        break;
11128      }
11129    }
11130  }
11131  return SQLITE_OK;
11132}
11133
11134/*
11135** Return the rowid for an sqlite_dbdata or sqlite_dptr table.
11136*/
11137static int dbdataRowid(sqlite3_vtab_cursor *pCursor, sqlite_int64 *pRowid){
11138  DbdataCursor *pCsr = (DbdataCursor*)pCursor;
11139  *pRowid = pCsr->iRowid;
11140  return SQLITE_OK;
11141}
11142
11143
11144/*
11145** Invoke this routine to register the "sqlite_dbdata" virtual table module
11146*/
11147static int sqlite3DbdataRegister(sqlite3 *db){
11148  static sqlite3_module dbdata_module = {
11149    0,                            /* iVersion */
11150    0,                            /* xCreate */
11151    dbdataConnect,                /* xConnect */
11152    dbdataBestIndex,              /* xBestIndex */
11153    dbdataDisconnect,             /* xDisconnect */
11154    0,                            /* xDestroy */
11155    dbdataOpen,                   /* xOpen - open a cursor */
11156    dbdataClose,                  /* xClose - close a cursor */
11157    dbdataFilter,                 /* xFilter - configure scan constraints */
11158    dbdataNext,                   /* xNext - advance a cursor */
11159    dbdataEof,                    /* xEof - check for end of scan */
11160    dbdataColumn,                 /* xColumn - read data */
11161    dbdataRowid,                  /* xRowid - read data */
11162    0,                            /* xUpdate */
11163    0,                            /* xBegin */
11164    0,                            /* xSync */
11165    0,                            /* xCommit */
11166    0,                            /* xRollback */
11167    0,                            /* xFindMethod */
11168    0,                            /* xRename */
11169    0,                            /* xSavepoint */
11170    0,                            /* xRelease */
11171    0,                            /* xRollbackTo */
11172    0                             /* xShadowName */
11173  };
11174
11175  int rc = sqlite3_create_module(db, "sqlite_dbdata", &dbdata_module, 0);
11176  if( rc==SQLITE_OK ){
11177    rc = sqlite3_create_module(db, "sqlite_dbptr", &dbdata_module, (void*)1);
11178  }
11179  return rc;
11180}
11181
11182#ifdef _WIN32
11183
11184#endif
11185int sqlite3_dbdata_init(
11186  sqlite3 *db,
11187  char **pzErrMsg,
11188  const sqlite3_api_routines *pApi
11189){
11190  SQLITE_EXTENSION_INIT2(pApi);
11191  return sqlite3DbdataRegister(db);
11192}
11193
11194/************************* End ../ext/misc/dbdata.c ********************/
11195#endif
11196
11197#if defined(SQLITE_ENABLE_SESSION)
11198/*
11199** State information for a single open session
11200*/
11201typedef struct OpenSession OpenSession;
11202struct OpenSession {
11203  char *zName;             /* Symbolic name for this session */
11204  int nFilter;             /* Number of xFilter rejection GLOB patterns */
11205  char **azFilter;         /* Array of xFilter rejection GLOB patterns */
11206  sqlite3_session *p;      /* The open session */
11207};
11208#endif
11209
11210typedef struct ExpertInfo ExpertInfo;
11211struct ExpertInfo {
11212  sqlite3expert *pExpert;
11213  int bVerbose;
11214};
11215
11216/* A single line in the EQP output */
11217typedef struct EQPGraphRow EQPGraphRow;
11218struct EQPGraphRow {
11219  int iEqpId;           /* ID for this row */
11220  int iParentId;        /* ID of the parent row */
11221  EQPGraphRow *pNext;   /* Next row in sequence */
11222  char zText[1];        /* Text to display for this row */
11223};
11224
11225/* All EQP output is collected into an instance of the following */
11226typedef struct EQPGraph EQPGraph;
11227struct EQPGraph {
11228  EQPGraphRow *pRow;    /* Linked list of all rows of the EQP output */
11229  EQPGraphRow *pLast;   /* Last element of the pRow list */
11230  char zPrefix[100];    /* Graph prefix */
11231};
11232
11233/*
11234** State information about the database connection is contained in an
11235** instance of the following structure.
11236*/
11237typedef struct ShellState ShellState;
11238struct ShellState {
11239  sqlite3 *db;           /* The database */
11240  u8 autoExplain;        /* Automatically turn on .explain mode */
11241  u8 autoEQP;            /* Run EXPLAIN QUERY PLAN prior to seach SQL stmt */
11242  u8 autoEQPtest;        /* autoEQP is in test mode */
11243  u8 autoEQPtrace;       /* autoEQP is in trace mode */
11244  u8 scanstatsOn;        /* True to display scan stats before each finalize */
11245  u8 openMode;           /* SHELL_OPEN_NORMAL, _APPENDVFS, or _ZIPFILE */
11246  u8 doXdgOpen;          /* Invoke start/open/xdg-open in output_reset() */
11247  u8 nEqpLevel;          /* Depth of the EQP output graph */
11248  u8 eTraceType;         /* SHELL_TRACE_* value for type of trace */
11249  unsigned statsOn;      /* True to display memory stats before each finalize */
11250  unsigned mEqpLines;    /* Mask of veritical lines in the EQP output graph */
11251  int outCount;          /* Revert to stdout when reaching zero */
11252  int cnt;               /* Number of records displayed so far */
11253  int lineno;            /* Line number of last line read from in */
11254  int openFlags;         /* Additional flags to open.  (SQLITE_OPEN_NOFOLLOW) */
11255  FILE *in;              /* Read commands from this stream */
11256  FILE *out;             /* Write results here */
11257  FILE *traceOut;        /* Output for sqlite3_trace() */
11258  int nErr;              /* Number of errors seen */
11259  int mode;              /* An output mode setting */
11260  int modePrior;         /* Saved mode */
11261  int cMode;             /* temporary output mode for the current query */
11262  int normalMode;        /* Output mode before ".explain on" */
11263  int writableSchema;    /* True if PRAGMA writable_schema=ON */
11264  int showHeader;        /* True to show column names in List or Column mode */
11265  int nCheck;            /* Number of ".check" commands run */
11266  unsigned nProgress;    /* Number of progress callbacks encountered */
11267  unsigned mxProgress;   /* Maximum progress callbacks before failing */
11268  unsigned flgProgress;  /* Flags for the progress callback */
11269  unsigned shellFlgs;    /* Various flags */
11270  unsigned priorShFlgs;  /* Saved copy of flags */
11271  sqlite3_int64 szMax;   /* --maxsize argument to .open */
11272  char *zDestTable;      /* Name of destination table when MODE_Insert */
11273  char *zTempFile;       /* Temporary file that might need deleting */
11274  char zTestcase[30];    /* Name of current test case */
11275  char colSeparator[20]; /* Column separator character for several modes */
11276  char rowSeparator[20]; /* Row separator character for MODE_Ascii */
11277  char colSepPrior[20];  /* Saved column separator */
11278  char rowSepPrior[20];  /* Saved row separator */
11279  int *colWidth;         /* Requested width of each column in columnar modes */
11280  int *actualWidth;      /* Actual width of each column */
11281  int nWidth;            /* Number of slots in colWidth[] and actualWidth[] */
11282  char nullValue[20];    /* The text to print when a NULL comes back from
11283                         ** the database */
11284  char outfile[FILENAME_MAX]; /* Filename for *out */
11285  const char *zDbFilename;    /* name of the database file */
11286  char *zFreeOnClose;         /* Filename to free when closing */
11287  const char *zVfs;           /* Name of VFS to use */
11288  sqlite3_stmt *pStmt;   /* Current statement if any. */
11289  FILE *pLog;            /* Write log output here */
11290  int *aiIndent;         /* Array of indents used in MODE_Explain */
11291  int nIndent;           /* Size of array aiIndent[] */
11292  int iIndent;           /* Index of current op in aiIndent[] */
11293  EQPGraph sGraph;       /* Information for the graphical EXPLAIN QUERY PLAN */
11294#if defined(SQLITE_ENABLE_SESSION)
11295  int nSession;             /* Number of active sessions */
11296  OpenSession aSession[4];  /* Array of sessions.  [0] is in focus. */
11297#endif
11298  ExpertInfo expert;        /* Valid if previous command was ".expert OPT..." */
11299};
11300
11301
11302/* Allowed values for ShellState.autoEQP
11303*/
11304#define AUTOEQP_off      0           /* Automatic EXPLAIN QUERY PLAN is off */
11305#define AUTOEQP_on       1           /* Automatic EQP is on */
11306#define AUTOEQP_trigger  2           /* On and also show plans for triggers */
11307#define AUTOEQP_full     3           /* Show full EXPLAIN */
11308
11309/* Allowed values for ShellState.openMode
11310*/
11311#define SHELL_OPEN_UNSPEC      0      /* No open-mode specified */
11312#define SHELL_OPEN_NORMAL      1      /* Normal database file */
11313#define SHELL_OPEN_APPENDVFS   2      /* Use appendvfs */
11314#define SHELL_OPEN_ZIPFILE     3      /* Use the zipfile virtual table */
11315#define SHELL_OPEN_READONLY    4      /* Open a normal database read-only */
11316#define SHELL_OPEN_DESERIALIZE 5      /* Open using sqlite3_deserialize() */
11317#define SHELL_OPEN_HEXDB       6      /* Use "dbtotxt" output as data source */
11318
11319/* Allowed values for ShellState.eTraceType
11320*/
11321#define SHELL_TRACE_PLAIN      0      /* Show input SQL text */
11322#define SHELL_TRACE_EXPANDED   1      /* Show expanded SQL text */
11323#define SHELL_TRACE_NORMALIZED 2      /* Show normalized SQL text */
11324
11325/* Bits in the ShellState.flgProgress variable */
11326#define SHELL_PROGRESS_QUIET 0x01  /* Omit announcing every progress callback */
11327#define SHELL_PROGRESS_RESET 0x02  /* Reset the count when the progres
11328                                   ** callback limit is reached, and for each
11329                                   ** top-level SQL statement */
11330#define SHELL_PROGRESS_ONCE  0x04  /* Cancel the --limit after firing once */
11331
11332/*
11333** These are the allowed shellFlgs values
11334*/
11335#define SHFLG_Pagecache      0x00000001 /* The --pagecache option is used */
11336#define SHFLG_Lookaside      0x00000002 /* Lookaside memory is used */
11337#define SHFLG_Backslash      0x00000004 /* The --backslash option is used */
11338#define SHFLG_PreserveRowid  0x00000008 /* .dump preserves rowid values */
11339#define SHFLG_Newlines       0x00000010 /* .dump --newline flag */
11340#define SHFLG_CountChanges   0x00000020 /* .changes setting */
11341#define SHFLG_Echo           0x00000040 /* .echo or --echo setting */
11342#define SHFLG_HeaderSet      0x00000080 /* .header has been used */
11343#define SHFLG_DumpDataOnly   0x00000100 /* .dump show data only */
11344#define SHFLG_DumpNoSys      0x00000200 /* .dump omits system tables */
11345
11346/*
11347** Macros for testing and setting shellFlgs
11348*/
11349#define ShellHasFlag(P,X)    (((P)->shellFlgs & (X))!=0)
11350#define ShellSetFlag(P,X)    ((P)->shellFlgs|=(X))
11351#define ShellClearFlag(P,X)  ((P)->shellFlgs&=(~(X)))
11352
11353/*
11354** These are the allowed modes.
11355*/
11356#define MODE_Line     0  /* One column per line.  Blank line between records */
11357#define MODE_Column   1  /* One record per line in neat columns */
11358#define MODE_List     2  /* One record per line with a separator */
11359#define MODE_Semi     3  /* Same as MODE_List but append ";" to each line */
11360#define MODE_Html     4  /* Generate an XHTML table */
11361#define MODE_Insert   5  /* Generate SQL "insert" statements */
11362#define MODE_Quote    6  /* Quote values as for SQL */
11363#define MODE_Tcl      7  /* Generate ANSI-C or TCL quoted elements */
11364#define MODE_Csv      8  /* Quote strings, numbers are plain */
11365#define MODE_Explain  9  /* Like MODE_Column, but do not truncate data */
11366#define MODE_Ascii   10  /* Use ASCII unit and record separators (0x1F/0x1E) */
11367#define MODE_Pretty  11  /* Pretty-print schemas */
11368#define MODE_EQP     12  /* Converts EXPLAIN QUERY PLAN output into a graph */
11369#define MODE_Json    13  /* Output JSON */
11370#define MODE_Markdown 14 /* Markdown formatting */
11371#define MODE_Table   15  /* MySQL-style table formatting */
11372#define MODE_Box     16  /* Unicode box-drawing characters */
11373
11374static const char *modeDescr[] = {
11375  "line",
11376  "column",
11377  "list",
11378  "semi",
11379  "html",
11380  "insert",
11381  "quote",
11382  "tcl",
11383  "csv",
11384  "explain",
11385  "ascii",
11386  "prettyprint",
11387  "eqp",
11388  "json",
11389  "markdown",
11390  "table",
11391  "box"
11392};
11393
11394/*
11395** These are the column/row/line separators used by the various
11396** import/export modes.
11397*/
11398#define SEP_Column    "|"
11399#define SEP_Row       "\n"
11400#define SEP_Tab       "\t"
11401#define SEP_Space     " "
11402#define SEP_Comma     ","
11403#define SEP_CrLf      "\r\n"
11404#define SEP_Unit      "\x1F"
11405#define SEP_Record    "\x1E"
11406
11407/*
11408** A callback for the sqlite3_log() interface.
11409*/
11410static void shellLog(void *pArg, int iErrCode, const char *zMsg){
11411  ShellState *p = (ShellState*)pArg;
11412  if( p->pLog==0 ) return;
11413  utf8_printf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
11414  fflush(p->pLog);
11415}
11416
11417/*
11418** SQL function:  shell_putsnl(X)
11419**
11420** Write the text X to the screen (or whatever output is being directed)
11421** adding a newline at the end, and then return X.
11422*/
11423static void shellPutsFunc(
11424  sqlite3_context *pCtx,
11425  int nVal,
11426  sqlite3_value **apVal
11427){
11428  ShellState *p = (ShellState*)sqlite3_user_data(pCtx);
11429  (void)nVal;
11430  utf8_printf(p->out, "%s\n", sqlite3_value_text(apVal[0]));
11431  sqlite3_result_value(pCtx, apVal[0]);
11432}
11433
11434/*
11435** SQL function:   edit(VALUE)
11436**                 edit(VALUE,EDITOR)
11437**
11438** These steps:
11439**
11440**     (1) Write VALUE into a temporary file.
11441**     (2) Run program EDITOR on that temporary file.
11442**     (3) Read the temporary file back and return its content as the result.
11443**     (4) Delete the temporary file
11444**
11445** If the EDITOR argument is omitted, use the value in the VISUAL
11446** environment variable.  If still there is no EDITOR, through an error.
11447**
11448** Also throw an error if the EDITOR program returns a non-zero exit code.
11449*/
11450#ifndef SQLITE_NOHAVE_SYSTEM
11451static void editFunc(
11452  sqlite3_context *context,
11453  int argc,
11454  sqlite3_value **argv
11455){
11456  const char *zEditor;
11457  char *zTempFile = 0;
11458  sqlite3 *db;
11459  char *zCmd = 0;
11460  int bBin;
11461  int rc;
11462  int hasCRNL = 0;
11463  FILE *f = 0;
11464  sqlite3_int64 sz;
11465  sqlite3_int64 x;
11466  unsigned char *p = 0;
11467
11468  if( argc==2 ){
11469    zEditor = (const char*)sqlite3_value_text(argv[1]);
11470  }else{
11471    zEditor = getenv("VISUAL");
11472  }
11473  if( zEditor==0 ){
11474    sqlite3_result_error(context, "no editor for edit()", -1);
11475    return;
11476  }
11477  if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
11478    sqlite3_result_error(context, "NULL input to edit()", -1);
11479    return;
11480  }
11481  db = sqlite3_context_db_handle(context);
11482  zTempFile = 0;
11483  sqlite3_file_control(db, 0, SQLITE_FCNTL_TEMPFILENAME, &zTempFile);
11484  if( zTempFile==0 ){
11485    sqlite3_uint64 r = 0;
11486    sqlite3_randomness(sizeof(r), &r);
11487    zTempFile = sqlite3_mprintf("temp%llx", r);
11488    if( zTempFile==0 ){
11489      sqlite3_result_error_nomem(context);
11490      return;
11491    }
11492  }
11493  bBin = sqlite3_value_type(argv[0])==SQLITE_BLOB;
11494  /* When writing the file to be edited, do \n to \r\n conversions on systems
11495  ** that want \r\n line endings */
11496  f = fopen(zTempFile, bBin ? "wb" : "w");
11497  if( f==0 ){
11498    sqlite3_result_error(context, "edit() cannot open temp file", -1);
11499    goto edit_func_end;
11500  }
11501  sz = sqlite3_value_bytes(argv[0]);
11502  if( bBin ){
11503    x = fwrite(sqlite3_value_blob(argv[0]), 1, (size_t)sz, f);
11504  }else{
11505    const char *z = (const char*)sqlite3_value_text(argv[0]);
11506    /* Remember whether or not the value originally contained \r\n */
11507    if( z && strstr(z,"\r\n")!=0 ) hasCRNL = 1;
11508    x = fwrite(sqlite3_value_text(argv[0]), 1, (size_t)sz, f);
11509  }
11510  fclose(f);
11511  f = 0;
11512  if( x!=sz ){
11513    sqlite3_result_error(context, "edit() could not write the whole file", -1);
11514    goto edit_func_end;
11515  }
11516  zCmd = sqlite3_mprintf("%s \"%s\"", zEditor, zTempFile);
11517  if( zCmd==0 ){
11518    sqlite3_result_error_nomem(context);
11519    goto edit_func_end;
11520  }
11521  rc = system(zCmd);
11522  sqlite3_free(zCmd);
11523  if( rc ){
11524    sqlite3_result_error(context, "EDITOR returned non-zero", -1);
11525    goto edit_func_end;
11526  }
11527  f = fopen(zTempFile, "rb");
11528  if( f==0 ){
11529    sqlite3_result_error(context,
11530      "edit() cannot reopen temp file after edit", -1);
11531    goto edit_func_end;
11532  }
11533  fseek(f, 0, SEEK_END);
11534  sz = ftell(f);
11535  rewind(f);
11536  p = sqlite3_malloc64( sz+1 );
11537  if( p==0 ){
11538    sqlite3_result_error_nomem(context);
11539    goto edit_func_end;
11540  }
11541  x = fread(p, 1, (size_t)sz, f);
11542  fclose(f);
11543  f = 0;
11544  if( x!=sz ){
11545    sqlite3_result_error(context, "could not read back the whole file", -1);
11546    goto edit_func_end;
11547  }
11548  if( bBin ){
11549    sqlite3_result_blob64(context, p, sz, sqlite3_free);
11550  }else{
11551    sqlite3_int64 i, j;
11552    if( hasCRNL ){
11553      /* If the original contains \r\n then do no conversions back to \n */
11554      j = sz;
11555    }else{
11556      /* If the file did not originally contain \r\n then convert any new
11557      ** \r\n back into \n */
11558      for(i=j=0; i<sz; i++){
11559        if( p[i]=='\r' && p[i+1]=='\n' ) i++;
11560        p[j++] = p[i];
11561      }
11562      sz = j;
11563      p[sz] = 0;
11564    }
11565    sqlite3_result_text64(context, (const char*)p, sz,
11566                          sqlite3_free, SQLITE_UTF8);
11567  }
11568  p = 0;
11569
11570edit_func_end:
11571  if( f ) fclose(f);
11572  unlink(zTempFile);
11573  sqlite3_free(zTempFile);
11574  sqlite3_free(p);
11575}
11576#endif /* SQLITE_NOHAVE_SYSTEM */
11577
11578/*
11579** Save or restore the current output mode
11580*/
11581static void outputModePush(ShellState *p){
11582  p->modePrior = p->mode;
11583  p->priorShFlgs = p->shellFlgs;
11584  memcpy(p->colSepPrior, p->colSeparator, sizeof(p->colSeparator));
11585  memcpy(p->rowSepPrior, p->rowSeparator, sizeof(p->rowSeparator));
11586}
11587static void outputModePop(ShellState *p){
11588  p->mode = p->modePrior;
11589  p->shellFlgs = p->priorShFlgs;
11590  memcpy(p->colSeparator, p->colSepPrior, sizeof(p->colSeparator));
11591  memcpy(p->rowSeparator, p->rowSepPrior, sizeof(p->rowSeparator));
11592}
11593
11594/*
11595** Output the given string as a hex-encoded blob (eg. X'1234' )
11596*/
11597static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
11598  int i;
11599  char *zBlob = (char *)pBlob;
11600  raw_printf(out,"X'");
11601  for(i=0; i<nBlob; i++){ raw_printf(out,"%02x",zBlob[i]&0xff); }
11602  raw_printf(out,"'");
11603}
11604
11605/*
11606** Find a string that is not found anywhere in z[].  Return a pointer
11607** to that string.
11608**
11609** Try to use zA and zB first.  If both of those are already found in z[]
11610** then make up some string and store it in the buffer zBuf.
11611*/
11612static const char *unused_string(
11613  const char *z,                    /* Result must not appear anywhere in z */
11614  const char *zA, const char *zB,   /* Try these first */
11615  char *zBuf                        /* Space to store a generated string */
11616){
11617  unsigned i = 0;
11618  if( strstr(z, zA)==0 ) return zA;
11619  if( strstr(z, zB)==0 ) return zB;
11620  do{
11621    sqlite3_snprintf(20,zBuf,"(%s%u)", zA, i++);
11622  }while( strstr(z,zBuf)!=0 );
11623  return zBuf;
11624}
11625
11626/*
11627** Output the given string as a quoted string using SQL quoting conventions.
11628**
11629** See also: output_quoted_escaped_string()
11630*/
11631static void output_quoted_string(FILE *out, const char *z){
11632  int i;
11633  char c;
11634  setBinaryMode(out, 1);
11635  for(i=0; (c = z[i])!=0 && c!='\''; i++){}
11636  if( c==0 ){
11637    utf8_printf(out,"'%s'",z);
11638  }else{
11639    raw_printf(out, "'");
11640    while( *z ){
11641      for(i=0; (c = z[i])!=0 && c!='\''; i++){}
11642      if( c=='\'' ) i++;
11643      if( i ){
11644        utf8_printf(out, "%.*s", i, z);
11645        z += i;
11646      }
11647      if( c=='\'' ){
11648        raw_printf(out, "'");
11649        continue;
11650      }
11651      if( c==0 ){
11652        break;
11653      }
11654      z++;
11655    }
11656    raw_printf(out, "'");
11657  }
11658  setTextMode(out, 1);
11659}
11660
11661/*
11662** Output the given string as a quoted string using SQL quoting conventions.
11663** Additionallly , escape the "\n" and "\r" characters so that they do not
11664** get corrupted by end-of-line translation facilities in some operating
11665** systems.
11666**
11667** This is like output_quoted_string() but with the addition of the \r\n
11668** escape mechanism.
11669*/
11670static void output_quoted_escaped_string(FILE *out, const char *z){
11671  int i;
11672  char c;
11673  setBinaryMode(out, 1);
11674  for(i=0; (c = z[i])!=0 && c!='\'' && c!='\n' && c!='\r'; i++){}
11675  if( c==0 ){
11676    utf8_printf(out,"'%s'",z);
11677  }else{
11678    const char *zNL = 0;
11679    const char *zCR = 0;
11680    int nNL = 0;
11681    int nCR = 0;
11682    char zBuf1[20], zBuf2[20];
11683    for(i=0; z[i]; i++){
11684      if( z[i]=='\n' ) nNL++;
11685      if( z[i]=='\r' ) nCR++;
11686    }
11687    if( nNL ){
11688      raw_printf(out, "replace(");
11689      zNL = unused_string(z, "\\n", "\\012", zBuf1);
11690    }
11691    if( nCR ){
11692      raw_printf(out, "replace(");
11693      zCR = unused_string(z, "\\r", "\\015", zBuf2);
11694    }
11695    raw_printf(out, "'");
11696    while( *z ){
11697      for(i=0; (c = z[i])!=0 && c!='\n' && c!='\r' && c!='\''; i++){}
11698      if( c=='\'' ) i++;
11699      if( i ){
11700        utf8_printf(out, "%.*s", i, z);
11701        z += i;
11702      }
11703      if( c=='\'' ){
11704        raw_printf(out, "'");
11705        continue;
11706      }
11707      if( c==0 ){
11708        break;
11709      }
11710      z++;
11711      if( c=='\n' ){
11712        raw_printf(out, "%s", zNL);
11713        continue;
11714      }
11715      raw_printf(out, "%s", zCR);
11716    }
11717    raw_printf(out, "'");
11718    if( nCR ){
11719      raw_printf(out, ",'%s',char(13))", zCR);
11720    }
11721    if( nNL ){
11722      raw_printf(out, ",'%s',char(10))", zNL);
11723    }
11724  }
11725  setTextMode(out, 1);
11726}
11727
11728/*
11729** Output the given string as a quoted according to C or TCL quoting rules.
11730*/
11731static void output_c_string(FILE *out, const char *z){
11732  unsigned int c;
11733  fputc('"', out);
11734  while( (c = *(z++))!=0 ){
11735    if( c=='\\' ){
11736      fputc(c, out);
11737      fputc(c, out);
11738    }else if( c=='"' ){
11739      fputc('\\', out);
11740      fputc('"', out);
11741    }else if( c=='\t' ){
11742      fputc('\\', out);
11743      fputc('t', out);
11744    }else if( c=='\n' ){
11745      fputc('\\', out);
11746      fputc('n', out);
11747    }else if( c=='\r' ){
11748      fputc('\\', out);
11749      fputc('r', out);
11750    }else if( !isprint(c&0xff) ){
11751      raw_printf(out, "\\%03o", c&0xff);
11752    }else{
11753      fputc(c, out);
11754    }
11755  }
11756  fputc('"', out);
11757}
11758
11759/*
11760** Output the given string as a quoted according to JSON quoting rules.
11761*/
11762static void output_json_string(FILE *out, const char *z, int n){
11763  unsigned int c;
11764  if( n<0 ) n = (int)strlen(z);
11765  fputc('"', out);
11766  while( n-- ){
11767    c = *(z++);
11768    if( c=='\\' || c=='"' ){
11769      fputc('\\', out);
11770      fputc(c, out);
11771    }else if( c<=0x1f ){
11772      fputc('\\', out);
11773      if( c=='\b' ){
11774        fputc('b', out);
11775      }else if( c=='\f' ){
11776        fputc('f', out);
11777      }else if( c=='\n' ){
11778        fputc('n', out);
11779      }else if( c=='\r' ){
11780        fputc('r', out);
11781      }else if( c=='\t' ){
11782        fputc('t', out);
11783      }else{
11784         raw_printf(out, "u%04x",c);
11785      }
11786    }else{
11787      fputc(c, out);
11788    }
11789  }
11790  fputc('"', out);
11791}
11792
11793/*
11794** Output the given string with characters that are special to
11795** HTML escaped.
11796*/
11797static void output_html_string(FILE *out, const char *z){
11798  int i;
11799  if( z==0 ) z = "";
11800  while( *z ){
11801    for(i=0;   z[i]
11802            && z[i]!='<'
11803            && z[i]!='&'
11804            && z[i]!='>'
11805            && z[i]!='\"'
11806            && z[i]!='\'';
11807        i++){}
11808    if( i>0 ){
11809      utf8_printf(out,"%.*s",i,z);
11810    }
11811    if( z[i]=='<' ){
11812      raw_printf(out,"&lt;");
11813    }else if( z[i]=='&' ){
11814      raw_printf(out,"&amp;");
11815    }else if( z[i]=='>' ){
11816      raw_printf(out,"&gt;");
11817    }else if( z[i]=='\"' ){
11818      raw_printf(out,"&quot;");
11819    }else if( z[i]=='\'' ){
11820      raw_printf(out,"&#39;");
11821    }else{
11822      break;
11823    }
11824    z += i + 1;
11825  }
11826}
11827
11828/*
11829** If a field contains any character identified by a 1 in the following
11830** array, then the string must be quoted for CSV.
11831*/
11832static const char needCsvQuote[] = {
11833  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
11834  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
11835  1, 0, 1, 0, 0, 0, 0, 1,   0, 0, 0, 0, 0, 0, 0, 0,
11836  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
11837  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
11838  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
11839  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
11840  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 1,
11841  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
11842  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
11843  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
11844  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
11845  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
11846  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
11847  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
11848  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
11849};
11850
11851/*
11852** Output a single term of CSV.  Actually, p->colSeparator is used for
11853** the separator, which may or may not be a comma.  p->nullValue is
11854** the null value.  Strings are quoted if necessary.  The separator
11855** is only issued if bSep is true.
11856*/
11857static void output_csv(ShellState *p, const char *z, int bSep){
11858  FILE *out = p->out;
11859  if( z==0 ){
11860    utf8_printf(out,"%s",p->nullValue);
11861  }else{
11862    int i;
11863    int nSep = strlen30(p->colSeparator);
11864    for(i=0; z[i]; i++){
11865      if( needCsvQuote[((unsigned char*)z)[i]]
11866         || (z[i]==p->colSeparator[0] &&
11867             (nSep==1 || memcmp(z, p->colSeparator, nSep)==0)) ){
11868        i = 0;
11869        break;
11870      }
11871    }
11872    if( i==0 ){
11873      char *zQuoted = sqlite3_mprintf("\"%w\"", z);
11874      utf8_printf(out, "%s", zQuoted);
11875      sqlite3_free(zQuoted);
11876    }else{
11877      utf8_printf(out, "%s", z);
11878    }
11879  }
11880  if( bSep ){
11881    utf8_printf(p->out, "%s", p->colSeparator);
11882  }
11883}
11884
11885/*
11886** This routine runs when the user presses Ctrl-C
11887*/
11888static void interrupt_handler(int NotUsed){
11889  UNUSED_PARAMETER(NotUsed);
11890  seenInterrupt++;
11891  if( seenInterrupt>2 ) exit(1);
11892  if( globalDb ) sqlite3_interrupt(globalDb);
11893}
11894
11895#if (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE)
11896/*
11897** This routine runs for console events (e.g. Ctrl-C) on Win32
11898*/
11899static BOOL WINAPI ConsoleCtrlHandler(
11900  DWORD dwCtrlType /* One of the CTRL_*_EVENT constants */
11901){
11902  if( dwCtrlType==CTRL_C_EVENT ){
11903    interrupt_handler(0);
11904    return TRUE;
11905  }
11906  return FALSE;
11907}
11908#endif
11909
11910#ifndef SQLITE_OMIT_AUTHORIZATION
11911/*
11912** When the ".auth ON" is set, the following authorizer callback is
11913** invoked.  It always returns SQLITE_OK.
11914*/
11915static int shellAuth(
11916  void *pClientData,
11917  int op,
11918  const char *zA1,
11919  const char *zA2,
11920  const char *zA3,
11921  const char *zA4
11922){
11923  ShellState *p = (ShellState*)pClientData;
11924  static const char *azAction[] = { 0,
11925     "CREATE_INDEX",         "CREATE_TABLE",         "CREATE_TEMP_INDEX",
11926     "CREATE_TEMP_TABLE",    "CREATE_TEMP_TRIGGER",  "CREATE_TEMP_VIEW",
11927     "CREATE_TRIGGER",       "CREATE_VIEW",          "DELETE",
11928     "DROP_INDEX",           "DROP_TABLE",           "DROP_TEMP_INDEX",
11929     "DROP_TEMP_TABLE",      "DROP_TEMP_TRIGGER",    "DROP_TEMP_VIEW",
11930     "DROP_TRIGGER",         "DROP_VIEW",            "INSERT",
11931     "PRAGMA",               "READ",                 "SELECT",
11932     "TRANSACTION",          "UPDATE",               "ATTACH",
11933     "DETACH",               "ALTER_TABLE",          "REINDEX",
11934     "ANALYZE",              "CREATE_VTABLE",        "DROP_VTABLE",
11935     "FUNCTION",             "SAVEPOINT",            "RECURSIVE"
11936  };
11937  int i;
11938  const char *az[4];
11939  az[0] = zA1;
11940  az[1] = zA2;
11941  az[2] = zA3;
11942  az[3] = zA4;
11943  utf8_printf(p->out, "authorizer: %s", azAction[op]);
11944  for(i=0; i<4; i++){
11945    raw_printf(p->out, " ");
11946    if( az[i] ){
11947      output_c_string(p->out, az[i]);
11948    }else{
11949      raw_printf(p->out, "NULL");
11950    }
11951  }
11952  raw_printf(p->out, "\n");
11953  return SQLITE_OK;
11954}
11955#endif
11956
11957/*
11958** Print a schema statement.  Part of MODE_Semi and MODE_Pretty output.
11959**
11960** This routine converts some CREATE TABLE statements for shadow tables
11961** in FTS3/4/5 into CREATE TABLE IF NOT EXISTS statements.
11962*/
11963static void printSchemaLine(FILE *out, const char *z, const char *zTail){
11964  if( z==0 ) return;
11965  if( zTail==0 ) return;
11966  if( sqlite3_strglob("CREATE TABLE ['\"]*", z)==0 ){
11967    utf8_printf(out, "CREATE TABLE IF NOT EXISTS %s%s", z+13, zTail);
11968  }else{
11969    utf8_printf(out, "%s%s", z, zTail);
11970  }
11971}
11972static void printSchemaLineN(FILE *out, char *z, int n, const char *zTail){
11973  char c = z[n];
11974  z[n] = 0;
11975  printSchemaLine(out, z, zTail);
11976  z[n] = c;
11977}
11978
11979/*
11980** Return true if string z[] has nothing but whitespace and comments to the
11981** end of the first line.
11982*/
11983static int wsToEol(const char *z){
11984  int i;
11985  for(i=0; z[i]; i++){
11986    if( z[i]=='\n' ) return 1;
11987    if( IsSpace(z[i]) ) continue;
11988    if( z[i]=='-' && z[i+1]=='-' ) return 1;
11989    return 0;
11990  }
11991  return 1;
11992}
11993
11994/*
11995** Add a new entry to the EXPLAIN QUERY PLAN data
11996*/
11997static void eqp_append(ShellState *p, int iEqpId, int p2, const char *zText){
11998  EQPGraphRow *pNew;
11999  int nText = strlen30(zText);
12000  if( p->autoEQPtest ){
12001    utf8_printf(p->out, "%d,%d,%s\n", iEqpId, p2, zText);
12002  }
12003  pNew = sqlite3_malloc64( sizeof(*pNew) + nText );
12004  if( pNew==0 ) shell_out_of_memory();
12005  pNew->iEqpId = iEqpId;
12006  pNew->iParentId = p2;
12007  memcpy(pNew->zText, zText, nText+1);
12008  pNew->pNext = 0;
12009  if( p->sGraph.pLast ){
12010    p->sGraph.pLast->pNext = pNew;
12011  }else{
12012    p->sGraph.pRow = pNew;
12013  }
12014  p->sGraph.pLast = pNew;
12015}
12016
12017/*
12018** Free and reset the EXPLAIN QUERY PLAN data that has been collected
12019** in p->sGraph.
12020*/
12021static void eqp_reset(ShellState *p){
12022  EQPGraphRow *pRow, *pNext;
12023  for(pRow = p->sGraph.pRow; pRow; pRow = pNext){
12024    pNext = pRow->pNext;
12025    sqlite3_free(pRow);
12026  }
12027  memset(&p->sGraph, 0, sizeof(p->sGraph));
12028}
12029
12030/* Return the next EXPLAIN QUERY PLAN line with iEqpId that occurs after
12031** pOld, or return the first such line if pOld is NULL
12032*/
12033static EQPGraphRow *eqp_next_row(ShellState *p, int iEqpId, EQPGraphRow *pOld){
12034  EQPGraphRow *pRow = pOld ? pOld->pNext : p->sGraph.pRow;
12035  while( pRow && pRow->iParentId!=iEqpId ) pRow = pRow->pNext;
12036  return pRow;
12037}
12038
12039/* Render a single level of the graph that has iEqpId as its parent.  Called
12040** recursively to render sublevels.
12041*/
12042static void eqp_render_level(ShellState *p, int iEqpId){
12043  EQPGraphRow *pRow, *pNext;
12044  int n = strlen30(p->sGraph.zPrefix);
12045  char *z;
12046  for(pRow = eqp_next_row(p, iEqpId, 0); pRow; pRow = pNext){
12047    pNext = eqp_next_row(p, iEqpId, pRow);
12048    z = pRow->zText;
12049    utf8_printf(p->out, "%s%s%s\n", p->sGraph.zPrefix,
12050                pNext ? "|--" : "`--", z);
12051    if( n<(int)sizeof(p->sGraph.zPrefix)-7 ){
12052      memcpy(&p->sGraph.zPrefix[n], pNext ? "|  " : "   ", 4);
12053      eqp_render_level(p, pRow->iEqpId);
12054      p->sGraph.zPrefix[n] = 0;
12055    }
12056  }
12057}
12058
12059/*
12060** Display and reset the EXPLAIN QUERY PLAN data
12061*/
12062static void eqp_render(ShellState *p){
12063  EQPGraphRow *pRow = p->sGraph.pRow;
12064  if( pRow ){
12065    if( pRow->zText[0]=='-' ){
12066      if( pRow->pNext==0 ){
12067        eqp_reset(p);
12068        return;
12069      }
12070      utf8_printf(p->out, "%s\n", pRow->zText+3);
12071      p->sGraph.pRow = pRow->pNext;
12072      sqlite3_free(pRow);
12073    }else{
12074      utf8_printf(p->out, "QUERY PLAN\n");
12075    }
12076    p->sGraph.zPrefix[0] = 0;
12077    eqp_render_level(p, 0);
12078    eqp_reset(p);
12079  }
12080}
12081
12082#ifndef SQLITE_OMIT_PROGRESS_CALLBACK
12083/*
12084** Progress handler callback.
12085*/
12086static int progress_handler(void *pClientData) {
12087  ShellState *p = (ShellState*)pClientData;
12088  p->nProgress++;
12089  if( p->nProgress>=p->mxProgress && p->mxProgress>0 ){
12090    raw_printf(p->out, "Progress limit reached (%u)\n", p->nProgress);
12091    if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0;
12092    if( p->flgProgress & SHELL_PROGRESS_ONCE ) p->mxProgress = 0;
12093    return 1;
12094  }
12095  if( (p->flgProgress & SHELL_PROGRESS_QUIET)==0 ){
12096    raw_printf(p->out, "Progress %u\n", p->nProgress);
12097  }
12098  return 0;
12099}
12100#endif /* SQLITE_OMIT_PROGRESS_CALLBACK */
12101
12102/*
12103** Print N dashes
12104*/
12105static void print_dashes(FILE *out, int N){
12106  const char zDash[] = "--------------------------------------------------";
12107  const int nDash = sizeof(zDash) - 1;
12108  while( N>nDash ){
12109    fputs(zDash, out);
12110    N -= nDash;
12111  }
12112  raw_printf(out, "%.*s", N, zDash);
12113}
12114
12115/*
12116** Print a markdown or table-style row separator using ascii-art
12117*/
12118static void print_row_separator(
12119  ShellState *p,
12120  int nArg,
12121  const char *zSep
12122){
12123  int i;
12124  if( nArg>0 ){
12125    fputs(zSep, p->out);
12126    print_dashes(p->out, p->actualWidth[0]+2);
12127    for(i=1; i<nArg; i++){
12128      fputs(zSep, p->out);
12129      print_dashes(p->out, p->actualWidth[i]+2);
12130    }
12131    fputs(zSep, p->out);
12132  }
12133  fputs("\n", p->out);
12134}
12135
12136/*
12137** This is the callback routine that the shell
12138** invokes for each row of a query result.
12139*/
12140static int shell_callback(
12141  void *pArg,
12142  int nArg,        /* Number of result columns */
12143  char **azArg,    /* Text of each result column */
12144  char **azCol,    /* Column names */
12145  int *aiType      /* Column types.  Might be NULL */
12146){
12147  int i;
12148  ShellState *p = (ShellState*)pArg;
12149
12150  if( azArg==0 ) return 0;
12151  switch( p->cMode ){
12152    case MODE_Line: {
12153      int w = 5;
12154      if( azArg==0 ) break;
12155      for(i=0; i<nArg; i++){
12156        int len = strlen30(azCol[i] ? azCol[i] : "");
12157        if( len>w ) w = len;
12158      }
12159      if( p->cnt++>0 ) utf8_printf(p->out, "%s", p->rowSeparator);
12160      for(i=0; i<nArg; i++){
12161        utf8_printf(p->out,"%*s = %s%s", w, azCol[i],
12162                azArg[i] ? azArg[i] : p->nullValue, p->rowSeparator);
12163      }
12164      break;
12165    }
12166    case MODE_Explain: {
12167      static const int aExplainWidth[] = {4, 13, 4, 4, 4, 13, 2, 13};
12168      if( nArg>ArraySize(aExplainWidth) ){
12169        nArg = ArraySize(aExplainWidth);
12170      }
12171      if( p->cnt++==0 ){
12172        for(i=0; i<nArg; i++){
12173          int w = aExplainWidth[i];
12174          utf8_width_print(p->out, w, azCol[i]);
12175          fputs(i==nArg-1 ? "\n" : "  ", p->out);
12176        }
12177        for(i=0; i<nArg; i++){
12178          int w = aExplainWidth[i];
12179          print_dashes(p->out, w);
12180          fputs(i==nArg-1 ? "\n" : "  ", p->out);
12181        }
12182      }
12183      if( azArg==0 ) break;
12184      for(i=0; i<nArg; i++){
12185        int w = aExplainWidth[i];
12186        if( i==nArg-1 ) w = 0;
12187        if( azArg[i] && strlenChar(azArg[i])>w ){
12188          w = strlenChar(azArg[i]);
12189        }
12190        if( i==1 && p->aiIndent && p->pStmt ){
12191          if( p->iIndent<p->nIndent ){
12192            utf8_printf(p->out, "%*.s", p->aiIndent[p->iIndent], "");
12193          }
12194          p->iIndent++;
12195        }
12196        utf8_width_print(p->out, w, azArg[i] ? azArg[i] : p->nullValue);
12197        fputs(i==nArg-1 ? "\n" : "  ", p->out);
12198      }
12199      break;
12200    }
12201    case MODE_Semi: {   /* .schema and .fullschema output */
12202      printSchemaLine(p->out, azArg[0], ";\n");
12203      break;
12204    }
12205    case MODE_Pretty: {  /* .schema and .fullschema with --indent */
12206      char *z;
12207      int j;
12208      int nParen = 0;
12209      char cEnd = 0;
12210      char c;
12211      int nLine = 0;
12212      assert( nArg==1 );
12213      if( azArg[0]==0 ) break;
12214      if( sqlite3_strlike("CREATE VIEW%", azArg[0], 0)==0
12215       || sqlite3_strlike("CREATE TRIG%", azArg[0], 0)==0
12216      ){
12217        utf8_printf(p->out, "%s;\n", azArg[0]);
12218        break;
12219      }
12220      z = sqlite3_mprintf("%s", azArg[0]);
12221      j = 0;
12222      for(i=0; IsSpace(z[i]); i++){}
12223      for(; (c = z[i])!=0; i++){
12224        if( IsSpace(c) ){
12225          if( z[j-1]=='\r' ) z[j-1] = '\n';
12226          if( IsSpace(z[j-1]) || z[j-1]=='(' ) continue;
12227        }else if( (c=='(' || c==')') && j>0 && IsSpace(z[j-1]) ){
12228          j--;
12229        }
12230        z[j++] = c;
12231      }
12232      while( j>0 && IsSpace(z[j-1]) ){ j--; }
12233      z[j] = 0;
12234      if( strlen30(z)>=79 ){
12235        for(i=j=0; (c = z[i])!=0; i++){ /* Copy from z[i] back to z[j] */
12236          if( c==cEnd ){
12237            cEnd = 0;
12238          }else if( c=='"' || c=='\'' || c=='`' ){
12239            cEnd = c;
12240          }else if( c=='[' ){
12241            cEnd = ']';
12242          }else if( c=='-' && z[i+1]=='-' ){
12243            cEnd = '\n';
12244          }else if( c=='(' ){
12245            nParen++;
12246          }else if( c==')' ){
12247            nParen--;
12248            if( nLine>0 && nParen==0 && j>0 ){
12249              printSchemaLineN(p->out, z, j, "\n");
12250              j = 0;
12251            }
12252          }
12253          z[j++] = c;
12254          if( nParen==1 && cEnd==0
12255           && (c=='(' || c=='\n' || (c==',' && !wsToEol(z+i+1)))
12256          ){
12257            if( c=='\n' ) j--;
12258            printSchemaLineN(p->out, z, j, "\n  ");
12259            j = 0;
12260            nLine++;
12261            while( IsSpace(z[i+1]) ){ i++; }
12262          }
12263        }
12264        z[j] = 0;
12265      }
12266      printSchemaLine(p->out, z, ";\n");
12267      sqlite3_free(z);
12268      break;
12269    }
12270    case MODE_List: {
12271      if( p->cnt++==0 && p->showHeader ){
12272        for(i=0; i<nArg; i++){
12273          utf8_printf(p->out,"%s%s",azCol[i],
12274                  i==nArg-1 ? p->rowSeparator : p->colSeparator);
12275        }
12276      }
12277      if( azArg==0 ) break;
12278      for(i=0; i<nArg; i++){
12279        char *z = azArg[i];
12280        if( z==0 ) z = p->nullValue;
12281        utf8_printf(p->out, "%s", z);
12282        if( i<nArg-1 ){
12283          utf8_printf(p->out, "%s", p->colSeparator);
12284        }else{
12285          utf8_printf(p->out, "%s", p->rowSeparator);
12286        }
12287      }
12288      break;
12289    }
12290    case MODE_Html: {
12291      if( p->cnt++==0 && p->showHeader ){
12292        raw_printf(p->out,"<TR>");
12293        for(i=0; i<nArg; i++){
12294          raw_printf(p->out,"<TH>");
12295          output_html_string(p->out, azCol[i]);
12296          raw_printf(p->out,"</TH>\n");
12297        }
12298        raw_printf(p->out,"</TR>\n");
12299      }
12300      if( azArg==0 ) break;
12301      raw_printf(p->out,"<TR>");
12302      for(i=0; i<nArg; i++){
12303        raw_printf(p->out,"<TD>");
12304        output_html_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
12305        raw_printf(p->out,"</TD>\n");
12306      }
12307      raw_printf(p->out,"</TR>\n");
12308      break;
12309    }
12310    case MODE_Tcl: {
12311      if( p->cnt++==0 && p->showHeader ){
12312        for(i=0; i<nArg; i++){
12313          output_c_string(p->out,azCol[i] ? azCol[i] : "");
12314          if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
12315        }
12316        utf8_printf(p->out, "%s", p->rowSeparator);
12317      }
12318      if( azArg==0 ) break;
12319      for(i=0; i<nArg; i++){
12320        output_c_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
12321        if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
12322      }
12323      utf8_printf(p->out, "%s", p->rowSeparator);
12324      break;
12325    }
12326    case MODE_Csv: {
12327      setBinaryMode(p->out, 1);
12328      if( p->cnt++==0 && p->showHeader ){
12329        for(i=0; i<nArg; i++){
12330          output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
12331        }
12332        utf8_printf(p->out, "%s", p->rowSeparator);
12333      }
12334      if( nArg>0 ){
12335        for(i=0; i<nArg; i++){
12336          output_csv(p, azArg[i], i<nArg-1);
12337        }
12338        utf8_printf(p->out, "%s", p->rowSeparator);
12339      }
12340      setTextMode(p->out, 1);
12341      break;
12342    }
12343    case MODE_Insert: {
12344      if( azArg==0 ) break;
12345      utf8_printf(p->out,"INSERT INTO %s",p->zDestTable);
12346      if( p->showHeader ){
12347        raw_printf(p->out,"(");
12348        for(i=0; i<nArg; i++){
12349          if( i>0 ) raw_printf(p->out, ",");
12350          if( quoteChar(azCol[i]) ){
12351            char *z = sqlite3_mprintf("\"%w\"", azCol[i]);
12352            utf8_printf(p->out, "%s", z);
12353            sqlite3_free(z);
12354          }else{
12355            raw_printf(p->out, "%s", azCol[i]);
12356          }
12357        }
12358        raw_printf(p->out,")");
12359      }
12360      p->cnt++;
12361      for(i=0; i<nArg; i++){
12362        raw_printf(p->out, i>0 ? "," : " VALUES(");
12363        if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
12364          utf8_printf(p->out,"NULL");
12365        }else if( aiType && aiType[i]==SQLITE_TEXT ){
12366          if( ShellHasFlag(p, SHFLG_Newlines) ){
12367            output_quoted_string(p->out, azArg[i]);
12368          }else{
12369            output_quoted_escaped_string(p->out, azArg[i]);
12370          }
12371        }else if( aiType && aiType[i]==SQLITE_INTEGER ){
12372          utf8_printf(p->out,"%s", azArg[i]);
12373        }else if( aiType && aiType[i]==SQLITE_FLOAT ){
12374          char z[50];
12375          double r = sqlite3_column_double(p->pStmt, i);
12376          sqlite3_uint64 ur;
12377          memcpy(&ur,&r,sizeof(r));
12378          if( ur==0x7ff0000000000000LL ){
12379            raw_printf(p->out, "1e999");
12380          }else if( ur==0xfff0000000000000LL ){
12381            raw_printf(p->out, "-1e999");
12382          }else{
12383            sqlite3_snprintf(50,z,"%!.20g", r);
12384            raw_printf(p->out, "%s", z);
12385          }
12386        }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
12387          const void *pBlob = sqlite3_column_blob(p->pStmt, i);
12388          int nBlob = sqlite3_column_bytes(p->pStmt, i);
12389          output_hex_blob(p->out, pBlob, nBlob);
12390        }else if( isNumber(azArg[i], 0) ){
12391          utf8_printf(p->out,"%s", azArg[i]);
12392        }else if( ShellHasFlag(p, SHFLG_Newlines) ){
12393          output_quoted_string(p->out, azArg[i]);
12394        }else{
12395          output_quoted_escaped_string(p->out, azArg[i]);
12396        }
12397      }
12398      raw_printf(p->out,");\n");
12399      break;
12400    }
12401    case MODE_Json: {
12402      if( azArg==0 ) break;
12403      if( p->cnt==0 ){
12404        fputs("[{", p->out);
12405      }else{
12406        fputs(",\n{", p->out);
12407      }
12408      p->cnt++;
12409      for(i=0; i<nArg; i++){
12410        output_json_string(p->out, azCol[i], -1);
12411        putc(':', p->out);
12412        if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
12413          fputs("null",p->out);
12414        }else if( aiType && aiType[i]==SQLITE_FLOAT ){
12415          char z[50];
12416          double r = sqlite3_column_double(p->pStmt, i);
12417          sqlite3_uint64 ur;
12418          memcpy(&ur,&r,sizeof(r));
12419          if( ur==0x7ff0000000000000LL ){
12420            raw_printf(p->out, "1e999");
12421          }else if( ur==0xfff0000000000000LL ){
12422            raw_printf(p->out, "-1e999");
12423          }else{
12424            sqlite3_snprintf(50,z,"%!.20g", r);
12425            raw_printf(p->out, "%s", z);
12426          }
12427        }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
12428          const void *pBlob = sqlite3_column_blob(p->pStmt, i);
12429          int nBlob = sqlite3_column_bytes(p->pStmt, i);
12430          output_json_string(p->out, pBlob, nBlob);
12431        }else if( aiType && aiType[i]==SQLITE_TEXT ){
12432          output_json_string(p->out, azArg[i], -1);
12433        }else{
12434          utf8_printf(p->out,"%s", azArg[i]);
12435        }
12436        if( i<nArg-1 ){
12437          putc(',', p->out);
12438        }
12439      }
12440      putc('}', p->out);
12441      break;
12442    }
12443    case MODE_Quote: {
12444      if( azArg==0 ) break;
12445      if( p->cnt==0 && p->showHeader ){
12446        for(i=0; i<nArg; i++){
12447          if( i>0 ) fputs(p->colSeparator, p->out);
12448          output_quoted_string(p->out, azCol[i]);
12449        }
12450        fputs(p->rowSeparator, p->out);
12451      }
12452      p->cnt++;
12453      for(i=0; i<nArg; i++){
12454        if( i>0 ) fputs(p->colSeparator, p->out);
12455        if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
12456          utf8_printf(p->out,"NULL");
12457        }else if( aiType && aiType[i]==SQLITE_TEXT ){
12458          output_quoted_string(p->out, azArg[i]);
12459        }else if( aiType && aiType[i]==SQLITE_INTEGER ){
12460          utf8_printf(p->out,"%s", azArg[i]);
12461        }else if( aiType && aiType[i]==SQLITE_FLOAT ){
12462          char z[50];
12463          double r = sqlite3_column_double(p->pStmt, i);
12464          sqlite3_snprintf(50,z,"%!.20g", r);
12465          raw_printf(p->out, "%s", z);
12466        }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
12467          const void *pBlob = sqlite3_column_blob(p->pStmt, i);
12468          int nBlob = sqlite3_column_bytes(p->pStmt, i);
12469          output_hex_blob(p->out, pBlob, nBlob);
12470        }else if( isNumber(azArg[i], 0) ){
12471          utf8_printf(p->out,"%s", azArg[i]);
12472        }else{
12473          output_quoted_string(p->out, azArg[i]);
12474        }
12475      }
12476      fputs(p->rowSeparator, p->out);
12477      break;
12478    }
12479    case MODE_Ascii: {
12480      if( p->cnt++==0 && p->showHeader ){
12481        for(i=0; i<nArg; i++){
12482          if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
12483          utf8_printf(p->out,"%s",azCol[i] ? azCol[i] : "");
12484        }
12485        utf8_printf(p->out, "%s", p->rowSeparator);
12486      }
12487      if( azArg==0 ) break;
12488      for(i=0; i<nArg; i++){
12489        if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
12490        utf8_printf(p->out,"%s",azArg[i] ? azArg[i] : p->nullValue);
12491      }
12492      utf8_printf(p->out, "%s", p->rowSeparator);
12493      break;
12494    }
12495    case MODE_EQP: {
12496      eqp_append(p, atoi(azArg[0]), atoi(azArg[1]), azArg[3]);
12497      break;
12498    }
12499  }
12500  return 0;
12501}
12502
12503/*
12504** This is the callback routine that the SQLite library
12505** invokes for each row of a query result.
12506*/
12507static int callback(void *pArg, int nArg, char **azArg, char **azCol){
12508  /* since we don't have type info, call the shell_callback with a NULL value */
12509  return shell_callback(pArg, nArg, azArg, azCol, NULL);
12510}
12511
12512/*
12513** This is the callback routine from sqlite3_exec() that appends all
12514** output onto the end of a ShellText object.
12515*/
12516static int captureOutputCallback(void *pArg, int nArg, char **azArg, char **az){
12517  ShellText *p = (ShellText*)pArg;
12518  int i;
12519  UNUSED_PARAMETER(az);
12520  if( azArg==0 ) return 0;
12521  if( p->n ) appendText(p, "|", 0);
12522  for(i=0; i<nArg; i++){
12523    if( i ) appendText(p, ",", 0);
12524    if( azArg[i] ) appendText(p, azArg[i], 0);
12525  }
12526  return 0;
12527}
12528
12529/*
12530** Generate an appropriate SELFTEST table in the main database.
12531*/
12532static void createSelftestTable(ShellState *p){
12533  char *zErrMsg = 0;
12534  sqlite3_exec(p->db,
12535    "SAVEPOINT selftest_init;\n"
12536    "CREATE TABLE IF NOT EXISTS selftest(\n"
12537    "  tno INTEGER PRIMARY KEY,\n"   /* Test number */
12538    "  op TEXT,\n"                   /* Operator:  memo run */
12539    "  cmd TEXT,\n"                  /* Command text */
12540    "  ans TEXT\n"                   /* Desired answer */
12541    ");"
12542    "CREATE TEMP TABLE [_shell$self](op,cmd,ans);\n"
12543    "INSERT INTO [_shell$self](rowid,op,cmd)\n"
12544    "  VALUES(coalesce((SELECT (max(tno)+100)/10 FROM selftest),10),\n"
12545    "         'memo','Tests generated by --init');\n"
12546    "INSERT INTO [_shell$self]\n"
12547    "  SELECT 'run',\n"
12548    "    'SELECT hex(sha3_query(''SELECT type,name,tbl_name,sql "
12549                                 "FROM sqlite_schema ORDER BY 2'',224))',\n"
12550    "    hex(sha3_query('SELECT type,name,tbl_name,sql "
12551                          "FROM sqlite_schema ORDER BY 2',224));\n"
12552    "INSERT INTO [_shell$self]\n"
12553    "  SELECT 'run',"
12554    "    'SELECT hex(sha3_query(''SELECT * FROM \"' ||"
12555    "        printf('%w',name) || '\" NOT INDEXED'',224))',\n"
12556    "    hex(sha3_query(printf('SELECT * FROM \"%w\" NOT INDEXED',name),224))\n"
12557    "  FROM (\n"
12558    "    SELECT name FROM sqlite_schema\n"
12559    "     WHERE type='table'\n"
12560    "       AND name<>'selftest'\n"
12561    "       AND coalesce(rootpage,0)>0\n"
12562    "  )\n"
12563    " ORDER BY name;\n"
12564    "INSERT INTO [_shell$self]\n"
12565    "  VALUES('run','PRAGMA integrity_check','ok');\n"
12566    "INSERT INTO selftest(tno,op,cmd,ans)"
12567    "  SELECT rowid*10,op,cmd,ans FROM [_shell$self];\n"
12568    "DROP TABLE [_shell$self];"
12569    ,0,0,&zErrMsg);
12570  if( zErrMsg ){
12571    utf8_printf(stderr, "SELFTEST initialization failure: %s\n", zErrMsg);
12572    sqlite3_free(zErrMsg);
12573  }
12574  sqlite3_exec(p->db, "RELEASE selftest_init",0,0,0);
12575}
12576
12577
12578/*
12579** Set the destination table field of the ShellState structure to
12580** the name of the table given.  Escape any quote characters in the
12581** table name.
12582*/
12583static void set_table_name(ShellState *p, const char *zName){
12584  int i, n;
12585  char cQuote;
12586  char *z;
12587
12588  if( p->zDestTable ){
12589    free(p->zDestTable);
12590    p->zDestTable = 0;
12591  }
12592  if( zName==0 ) return;
12593  cQuote = quoteChar(zName);
12594  n = strlen30(zName);
12595  if( cQuote ) n += n+2;
12596  z = p->zDestTable = malloc( n+1 );
12597  if( z==0 ) shell_out_of_memory();
12598  n = 0;
12599  if( cQuote ) z[n++] = cQuote;
12600  for(i=0; zName[i]; i++){
12601    z[n++] = zName[i];
12602    if( zName[i]==cQuote ) z[n++] = cQuote;
12603  }
12604  if( cQuote ) z[n++] = cQuote;
12605  z[n] = 0;
12606}
12607
12608
12609/*
12610** Execute a query statement that will generate SQL output.  Print
12611** the result columns, comma-separated, on a line and then add a
12612** semicolon terminator to the end of that line.
12613**
12614** If the number of columns is 1 and that column contains text "--"
12615** then write the semicolon on a separate line.  That way, if a
12616** "--" comment occurs at the end of the statement, the comment
12617** won't consume the semicolon terminator.
12618*/
12619static int run_table_dump_query(
12620  ShellState *p,           /* Query context */
12621  const char *zSelect      /* SELECT statement to extract content */
12622){
12623  sqlite3_stmt *pSelect;
12624  int rc;
12625  int nResult;
12626  int i;
12627  const char *z;
12628  rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0);
12629  if( rc!=SQLITE_OK || !pSelect ){
12630    utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc,
12631                sqlite3_errmsg(p->db));
12632    if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
12633    return rc;
12634  }
12635  rc = sqlite3_step(pSelect);
12636  nResult = sqlite3_column_count(pSelect);
12637  while( rc==SQLITE_ROW ){
12638    z = (const char*)sqlite3_column_text(pSelect, 0);
12639    utf8_printf(p->out, "%s", z);
12640    for(i=1; i<nResult; i++){
12641      utf8_printf(p->out, ",%s", sqlite3_column_text(pSelect, i));
12642    }
12643    if( z==0 ) z = "";
12644    while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
12645    if( z[0] ){
12646      raw_printf(p->out, "\n;\n");
12647    }else{
12648      raw_printf(p->out, ";\n");
12649    }
12650    rc = sqlite3_step(pSelect);
12651  }
12652  rc = sqlite3_finalize(pSelect);
12653  if( rc!=SQLITE_OK ){
12654    utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc,
12655                sqlite3_errmsg(p->db));
12656    if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
12657  }
12658  return rc;
12659}
12660
12661/*
12662** Allocate space and save off current error string.
12663*/
12664static char *save_err_msg(
12665  sqlite3 *db            /* Database to query */
12666){
12667  int nErrMsg = 1+strlen30(sqlite3_errmsg(db));
12668  char *zErrMsg = sqlite3_malloc64(nErrMsg);
12669  if( zErrMsg ){
12670    memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg);
12671  }
12672  return zErrMsg;
12673}
12674
12675#ifdef __linux__
12676/*
12677** Attempt to display I/O stats on Linux using /proc/PID/io
12678*/
12679static void displayLinuxIoStats(FILE *out){
12680  FILE *in;
12681  char z[200];
12682  sqlite3_snprintf(sizeof(z), z, "/proc/%d/io", getpid());
12683  in = fopen(z, "rb");
12684  if( in==0 ) return;
12685  while( fgets(z, sizeof(z), in)!=0 ){
12686    static const struct {
12687      const char *zPattern;
12688      const char *zDesc;
12689    } aTrans[] = {
12690      { "rchar: ",                  "Bytes received by read():" },
12691      { "wchar: ",                  "Bytes sent to write():"    },
12692      { "syscr: ",                  "Read() system calls:"      },
12693      { "syscw: ",                  "Write() system calls:"     },
12694      { "read_bytes: ",             "Bytes read from storage:"  },
12695      { "write_bytes: ",            "Bytes written to storage:" },
12696      { "cancelled_write_bytes: ",  "Cancelled write bytes:"    },
12697    };
12698    int i;
12699    for(i=0; i<ArraySize(aTrans); i++){
12700      int n = strlen30(aTrans[i].zPattern);
12701      if( strncmp(aTrans[i].zPattern, z, n)==0 ){
12702        utf8_printf(out, "%-36s %s", aTrans[i].zDesc, &z[n]);
12703        break;
12704      }
12705    }
12706  }
12707  fclose(in);
12708}
12709#endif
12710
12711/*
12712** Display a single line of status using 64-bit values.
12713*/
12714static void displayStatLine(
12715  ShellState *p,            /* The shell context */
12716  char *zLabel,             /* Label for this one line */
12717  char *zFormat,            /* Format for the result */
12718  int iStatusCtrl,          /* Which status to display */
12719  int bReset                /* True to reset the stats */
12720){
12721  sqlite3_int64 iCur = -1;
12722  sqlite3_int64 iHiwtr = -1;
12723  int i, nPercent;
12724  char zLine[200];
12725  sqlite3_status64(iStatusCtrl, &iCur, &iHiwtr, bReset);
12726  for(i=0, nPercent=0; zFormat[i]; i++){
12727    if( zFormat[i]=='%' ) nPercent++;
12728  }
12729  if( nPercent>1 ){
12730    sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iCur, iHiwtr);
12731  }else{
12732    sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iHiwtr);
12733  }
12734  raw_printf(p->out, "%-36s %s\n", zLabel, zLine);
12735}
12736
12737/*
12738** Display memory stats.
12739*/
12740static int display_stats(
12741  sqlite3 *db,                /* Database to query */
12742  ShellState *pArg,           /* Pointer to ShellState */
12743  int bReset                  /* True to reset the stats */
12744){
12745  int iCur;
12746  int iHiwtr;
12747  FILE *out;
12748  if( pArg==0 || pArg->out==0 ) return 0;
12749  out = pArg->out;
12750
12751  if( pArg->pStmt && pArg->statsOn==2 ){
12752    int nCol, i, x;
12753    sqlite3_stmt *pStmt = pArg->pStmt;
12754    char z[100];
12755    nCol = sqlite3_column_count(pStmt);
12756    raw_printf(out, "%-36s %d\n", "Number of output columns:", nCol);
12757    for(i=0; i<nCol; i++){
12758      sqlite3_snprintf(sizeof(z),z,"Column %d %nname:", i, &x);
12759      utf8_printf(out, "%-36s %s\n", z, sqlite3_column_name(pStmt,i));
12760#ifndef SQLITE_OMIT_DECLTYPE
12761      sqlite3_snprintf(30, z+x, "declared type:");
12762      utf8_printf(out, "%-36s %s\n", z, sqlite3_column_decltype(pStmt, i));
12763#endif
12764#ifdef SQLITE_ENABLE_COLUMN_METADATA
12765      sqlite3_snprintf(30, z+x, "database name:");
12766      utf8_printf(out, "%-36s %s\n", z, sqlite3_column_database_name(pStmt,i));
12767      sqlite3_snprintf(30, z+x, "table name:");
12768      utf8_printf(out, "%-36s %s\n", z, sqlite3_column_table_name(pStmt,i));
12769      sqlite3_snprintf(30, z+x, "origin name:");
12770      utf8_printf(out, "%-36s %s\n", z, sqlite3_column_origin_name(pStmt,i));
12771#endif
12772    }
12773  }
12774
12775  if( pArg->statsOn==3 ){
12776    if( pArg->pStmt ){
12777      iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
12778      raw_printf(pArg->out, "VM-steps: %d\n", iCur);
12779    }
12780    return 0;
12781  }
12782
12783  displayStatLine(pArg, "Memory Used:",
12784     "%lld (max %lld) bytes", SQLITE_STATUS_MEMORY_USED, bReset);
12785  displayStatLine(pArg, "Number of Outstanding Allocations:",
12786     "%lld (max %lld)", SQLITE_STATUS_MALLOC_COUNT, bReset);
12787  if( pArg->shellFlgs & SHFLG_Pagecache ){
12788    displayStatLine(pArg, "Number of Pcache Pages Used:",
12789       "%lld (max %lld) pages", SQLITE_STATUS_PAGECACHE_USED, bReset);
12790  }
12791  displayStatLine(pArg, "Number of Pcache Overflow Bytes:",
12792     "%lld (max %lld) bytes", SQLITE_STATUS_PAGECACHE_OVERFLOW, bReset);
12793  displayStatLine(pArg, "Largest Allocation:",
12794     "%lld bytes", SQLITE_STATUS_MALLOC_SIZE, bReset);
12795  displayStatLine(pArg, "Largest Pcache Allocation:",
12796     "%lld bytes", SQLITE_STATUS_PAGECACHE_SIZE, bReset);
12797#ifdef YYTRACKMAXSTACKDEPTH
12798  displayStatLine(pArg, "Deepest Parser Stack:",
12799     "%lld (max %lld)", SQLITE_STATUS_PARSER_STACK, bReset);
12800#endif
12801
12802  if( db ){
12803    if( pArg->shellFlgs & SHFLG_Lookaside ){
12804      iHiwtr = iCur = -1;
12805      sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED,
12806                        &iCur, &iHiwtr, bReset);
12807      raw_printf(pArg->out,
12808              "Lookaside Slots Used:                %d (max %d)\n",
12809              iCur, iHiwtr);
12810      sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT,
12811                        &iCur, &iHiwtr, bReset);
12812      raw_printf(pArg->out, "Successful lookaside attempts:       %d\n",
12813              iHiwtr);
12814      sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE,
12815                        &iCur, &iHiwtr, bReset);
12816      raw_printf(pArg->out, "Lookaside failures due to size:      %d\n",
12817              iHiwtr);
12818      sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL,
12819                        &iCur, &iHiwtr, bReset);
12820      raw_printf(pArg->out, "Lookaside failures due to OOM:       %d\n",
12821              iHiwtr);
12822    }
12823    iHiwtr = iCur = -1;
12824    sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
12825    raw_printf(pArg->out, "Pager Heap Usage:                    %d bytes\n",
12826            iCur);
12827    iHiwtr = iCur = -1;
12828    sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
12829    raw_printf(pArg->out, "Page cache hits:                     %d\n", iCur);
12830    iHiwtr = iCur = -1;
12831    sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
12832    raw_printf(pArg->out, "Page cache misses:                   %d\n", iCur);
12833    iHiwtr = iCur = -1;
12834    sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
12835    raw_printf(pArg->out, "Page cache writes:                   %d\n", iCur);
12836    iHiwtr = iCur = -1;
12837    sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_SPILL, &iCur, &iHiwtr, 1);
12838    raw_printf(pArg->out, "Page cache spills:                   %d\n", iCur);
12839    iHiwtr = iCur = -1;
12840    sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
12841    raw_printf(pArg->out, "Schema Heap Usage:                   %d bytes\n",
12842            iCur);
12843    iHiwtr = iCur = -1;
12844    sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
12845    raw_printf(pArg->out, "Statement Heap/Lookaside Usage:      %d bytes\n",
12846            iCur);
12847  }
12848
12849  if( pArg->pStmt ){
12850    iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP,
12851                               bReset);
12852    raw_printf(pArg->out, "Fullscan Steps:                      %d\n", iCur);
12853    iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
12854    raw_printf(pArg->out, "Sort Operations:                     %d\n", iCur);
12855    iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX,bReset);
12856    raw_printf(pArg->out, "Autoindex Inserts:                   %d\n", iCur);
12857    iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
12858    raw_printf(pArg->out, "Virtual Machine Steps:               %d\n", iCur);
12859    iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_REPREPARE,bReset);
12860    raw_printf(pArg->out, "Reprepare operations:                %d\n", iCur);
12861    iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_RUN, bReset);
12862    raw_printf(pArg->out, "Number of times run:                 %d\n", iCur);
12863    iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_MEMUSED, bReset);
12864    raw_printf(pArg->out, "Memory used by prepared stmt:        %d\n", iCur);
12865  }
12866
12867#ifdef __linux__
12868  displayLinuxIoStats(pArg->out);
12869#endif
12870
12871  /* Do not remove this machine readable comment: extra-stats-output-here */
12872
12873  return 0;
12874}
12875
12876/*
12877** Display scan stats.
12878*/
12879static void display_scanstats(
12880  sqlite3 *db,                    /* Database to query */
12881  ShellState *pArg                /* Pointer to ShellState */
12882){
12883#ifndef SQLITE_ENABLE_STMT_SCANSTATUS
12884  UNUSED_PARAMETER(db);
12885  UNUSED_PARAMETER(pArg);
12886#else
12887  int i, k, n, mx;
12888  raw_printf(pArg->out, "-------- scanstats --------\n");
12889  mx = 0;
12890  for(k=0; k<=mx; k++){
12891    double rEstLoop = 1.0;
12892    for(i=n=0; 1; i++){
12893      sqlite3_stmt *p = pArg->pStmt;
12894      sqlite3_int64 nLoop, nVisit;
12895      double rEst;
12896      int iSid;
12897      const char *zExplain;
12898      if( sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NLOOP, (void*)&nLoop) ){
12899        break;
12900      }
12901      sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_SELECTID, (void*)&iSid);
12902      if( iSid>mx ) mx = iSid;
12903      if( iSid!=k ) continue;
12904      if( n==0 ){
12905        rEstLoop = (double)nLoop;
12906        if( k>0 ) raw_printf(pArg->out, "-------- subquery %d -------\n", k);
12907      }
12908      n++;
12909      sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NVISIT, (void*)&nVisit);
12910      sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EST, (void*)&rEst);
12911      sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EXPLAIN, (void*)&zExplain);
12912      utf8_printf(pArg->out, "Loop %2d: %s\n", n, zExplain);
12913      rEstLoop *= rEst;
12914      raw_printf(pArg->out,
12915          "         nLoop=%-8lld nRow=%-8lld estRow=%-8lld estRow/Loop=%-8g\n",
12916          nLoop, nVisit, (sqlite3_int64)(rEstLoop+0.5), rEst
12917      );
12918    }
12919  }
12920  raw_printf(pArg->out, "---------------------------\n");
12921#endif
12922}
12923
12924/*
12925** Parameter azArray points to a zero-terminated array of strings. zStr
12926** points to a single nul-terminated string. Return non-zero if zStr
12927** is equal, according to strcmp(), to any of the strings in the array.
12928** Otherwise, return zero.
12929*/
12930static int str_in_array(const char *zStr, const char **azArray){
12931  int i;
12932  for(i=0; azArray[i]; i++){
12933    if( 0==strcmp(zStr, azArray[i]) ) return 1;
12934  }
12935  return 0;
12936}
12937
12938/*
12939** If compiled statement pSql appears to be an EXPLAIN statement, allocate
12940** and populate the ShellState.aiIndent[] array with the number of
12941** spaces each opcode should be indented before it is output.
12942**
12943** The indenting rules are:
12944**
12945**     * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
12946**       all opcodes that occur between the p2 jump destination and the opcode
12947**       itself by 2 spaces.
12948**
12949**     * For each "Goto", if the jump destination is earlier in the program
12950**       and ends on one of:
12951**          Yield  SeekGt  SeekLt  RowSetRead  Rewind
12952**       or if the P1 parameter is one instead of zero,
12953**       then indent all opcodes between the earlier instruction
12954**       and "Goto" by 2 spaces.
12955*/
12956static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){
12957  const char *zSql;               /* The text of the SQL statement */
12958  const char *z;                  /* Used to check if this is an EXPLAIN */
12959  int *abYield = 0;               /* True if op is an OP_Yield */
12960  int nAlloc = 0;                 /* Allocated size of p->aiIndent[], abYield */
12961  int iOp;                        /* Index of operation in p->aiIndent[] */
12962
12963  const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext", 0 };
12964  const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead",
12965                            "Rewind", 0 };
12966  const char *azGoto[] = { "Goto", 0 };
12967
12968  /* Try to figure out if this is really an EXPLAIN statement. If this
12969  ** cannot be verified, return early.  */
12970  if( sqlite3_column_count(pSql)!=8 ){
12971    p->cMode = p->mode;
12972    return;
12973  }
12974  zSql = sqlite3_sql(pSql);
12975  if( zSql==0 ) return;
12976  for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++);
12977  if( sqlite3_strnicmp(z, "explain", 7) ){
12978    p->cMode = p->mode;
12979    return;
12980  }
12981
12982  for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
12983    int i;
12984    int iAddr = sqlite3_column_int(pSql, 0);
12985    const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
12986
12987    /* Set p2 to the P2 field of the current opcode. Then, assuming that
12988    ** p2 is an instruction address, set variable p2op to the index of that
12989    ** instruction in the aiIndent[] array. p2 and p2op may be different if
12990    ** the current instruction is part of a sub-program generated by an
12991    ** SQL trigger or foreign key.  */
12992    int p2 = sqlite3_column_int(pSql, 3);
12993    int p2op = (p2 + (iOp-iAddr));
12994
12995    /* Grow the p->aiIndent array as required */
12996    if( iOp>=nAlloc ){
12997      if( iOp==0 ){
12998        /* Do further verfication that this is explain output.  Abort if
12999        ** it is not */
13000        static const char *explainCols[] = {
13001           "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment" };
13002        int jj;
13003        for(jj=0; jj<ArraySize(explainCols); jj++){
13004          if( strcmp(sqlite3_column_name(pSql,jj),explainCols[jj])!=0 ){
13005            p->cMode = p->mode;
13006            sqlite3_reset(pSql);
13007            return;
13008          }
13009        }
13010      }
13011      nAlloc += 100;
13012      p->aiIndent = (int*)sqlite3_realloc64(p->aiIndent, nAlloc*sizeof(int));
13013      if( p->aiIndent==0 ) shell_out_of_memory();
13014      abYield = (int*)sqlite3_realloc64(abYield, nAlloc*sizeof(int));
13015      if( abYield==0 ) shell_out_of_memory();
13016    }
13017    abYield[iOp] = str_in_array(zOp, azYield);
13018    p->aiIndent[iOp] = 0;
13019    p->nIndent = iOp+1;
13020
13021    if( str_in_array(zOp, azNext) ){
13022      for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
13023    }
13024    if( str_in_array(zOp, azGoto) && p2op<p->nIndent
13025     && (abYield[p2op] || sqlite3_column_int(pSql, 2))
13026    ){
13027      for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
13028    }
13029  }
13030
13031  p->iIndent = 0;
13032  sqlite3_free(abYield);
13033  sqlite3_reset(pSql);
13034}
13035
13036/*
13037** Free the array allocated by explain_data_prepare().
13038*/
13039static void explain_data_delete(ShellState *p){
13040  sqlite3_free(p->aiIndent);
13041  p->aiIndent = 0;
13042  p->nIndent = 0;
13043  p->iIndent = 0;
13044}
13045
13046/*
13047** Disable and restore .wheretrace and .selecttrace settings.
13048*/
13049static unsigned int savedSelectTrace;
13050static unsigned int savedWhereTrace;
13051static void disable_debug_trace_modes(void){
13052  unsigned int zero = 0;
13053  sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 0, &savedSelectTrace);
13054  sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &zero);
13055  sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 2, &savedWhereTrace);
13056  sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &zero);
13057}
13058static void restore_debug_trace_modes(void){
13059  sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &savedSelectTrace);
13060  sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &savedWhereTrace);
13061}
13062
13063/* Create the TEMP table used to store parameter bindings */
13064static void bind_table_init(ShellState *p){
13065  int wrSchema = 0;
13066  int defensiveMode = 0;
13067  sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, -1, &defensiveMode);
13068  sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, 0, 0);
13069  sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, -1, &wrSchema);
13070  sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, 1, 0);
13071  sqlite3_exec(p->db,
13072    "CREATE TABLE IF NOT EXISTS temp.sqlite_parameters(\n"
13073    "  key TEXT PRIMARY KEY,\n"
13074    "  value ANY\n"
13075    ") WITHOUT ROWID;",
13076    0, 0, 0);
13077  sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, wrSchema, 0);
13078  sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, defensiveMode, 0);
13079}
13080
13081/*
13082** Bind parameters on a prepared statement.
13083**
13084** Parameter bindings are taken from a TEMP table of the form:
13085**
13086**    CREATE TEMP TABLE sqlite_parameters(key TEXT PRIMARY KEY, value)
13087**    WITHOUT ROWID;
13088**
13089** No bindings occur if this table does not exist.  The name of the table
13090** begins with "sqlite_" so that it will not collide with ordinary application
13091** tables.  The table must be in the TEMP schema.
13092*/
13093static void bind_prepared_stmt(ShellState *pArg, sqlite3_stmt *pStmt){
13094  int nVar;
13095  int i;
13096  int rc;
13097  sqlite3_stmt *pQ = 0;
13098
13099  nVar = sqlite3_bind_parameter_count(pStmt);
13100  if( nVar==0 ) return;  /* Nothing to do */
13101  if( sqlite3_table_column_metadata(pArg->db, "TEMP", "sqlite_parameters",
13102                                    "key", 0, 0, 0, 0, 0)!=SQLITE_OK ){
13103    return; /* Parameter table does not exist */
13104  }
13105  rc = sqlite3_prepare_v2(pArg->db,
13106          "SELECT value FROM temp.sqlite_parameters"
13107          " WHERE key=?1", -1, &pQ, 0);
13108  if( rc || pQ==0 ) return;
13109  for(i=1; i<=nVar; i++){
13110    char zNum[30];
13111    const char *zVar = sqlite3_bind_parameter_name(pStmt, i);
13112    if( zVar==0 ){
13113      sqlite3_snprintf(sizeof(zNum),zNum,"?%d",i);
13114      zVar = zNum;
13115    }
13116    sqlite3_bind_text(pQ, 1, zVar, -1, SQLITE_STATIC);
13117    if( sqlite3_step(pQ)==SQLITE_ROW ){
13118      sqlite3_bind_value(pStmt, i, sqlite3_column_value(pQ, 0));
13119    }else{
13120      sqlite3_bind_null(pStmt, i);
13121    }
13122    sqlite3_reset(pQ);
13123  }
13124  sqlite3_finalize(pQ);
13125}
13126
13127/*
13128** UTF8 box-drawing characters.  Imagine box lines like this:
13129**
13130**           1
13131**           |
13132**       4 --+-- 2
13133**           |
13134**           3
13135**
13136** Each box characters has between 2 and 4 of the lines leading from
13137** the center.  The characters are here identified by the numbers of
13138** their corresponding lines.
13139*/
13140#define BOX_24   "\342\224\200"  /* U+2500 --- */
13141#define BOX_13   "\342\224\202"  /* U+2502  |  */
13142#define BOX_23   "\342\224\214"  /* U+250c  ,- */
13143#define BOX_34   "\342\224\220"  /* U+2510 -,  */
13144#define BOX_12   "\342\224\224"  /* U+2514  '- */
13145#define BOX_14   "\342\224\230"  /* U+2518 -'  */
13146#define BOX_123  "\342\224\234"  /* U+251c  |- */
13147#define BOX_134  "\342\224\244"  /* U+2524 -|  */
13148#define BOX_234  "\342\224\254"  /* U+252c -,- */
13149#define BOX_124  "\342\224\264"  /* U+2534 -'- */
13150#define BOX_1234 "\342\224\274"  /* U+253c -|- */
13151
13152/* Draw horizontal line N characters long using unicode box
13153** characters
13154*/
13155static void print_box_line(FILE *out, int N){
13156  const char zDash[] =
13157      BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24
13158      BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24;
13159  const int nDash = sizeof(zDash) - 1;
13160  N *= 3;
13161  while( N>nDash ){
13162    utf8_printf(out, zDash);
13163    N -= nDash;
13164  }
13165  utf8_printf(out, "%.*s", N, zDash);
13166}
13167
13168/*
13169** Draw a horizontal separator for a MODE_Box table.
13170*/
13171static void print_box_row_separator(
13172  ShellState *p,
13173  int nArg,
13174  const char *zSep1,
13175  const char *zSep2,
13176  const char *zSep3
13177){
13178  int i;
13179  if( nArg>0 ){
13180    utf8_printf(p->out, "%s", zSep1);
13181    print_box_line(p->out, p->actualWidth[0]+2);
13182    for(i=1; i<nArg; i++){
13183      utf8_printf(p->out, "%s", zSep2);
13184      print_box_line(p->out, p->actualWidth[i]+2);
13185    }
13186    utf8_printf(p->out, "%s", zSep3);
13187  }
13188  fputs("\n", p->out);
13189}
13190
13191
13192
13193/*
13194** Run a prepared statement and output the result in one of the
13195** table-oriented formats: MODE_Column, MODE_Markdown, MODE_Table,
13196** or MODE_Box.
13197**
13198** This is different from ordinary exec_prepared_stmt() in that
13199** it has to run the entire query and gather the results into memory
13200** first, in order to determine column widths, before providing
13201** any output.
13202*/
13203static void exec_prepared_stmt_columnar(
13204  ShellState *p,                        /* Pointer to ShellState */
13205  sqlite3_stmt *pStmt                   /* Statment to run */
13206){
13207  sqlite3_int64 nRow = 0;
13208  int nColumn = 0;
13209  char **azData = 0;
13210  sqlite3_int64 nAlloc = 0;
13211  const char *z;
13212  int rc;
13213  sqlite3_int64 i, nData;
13214  int j, nTotal, w, n;
13215  const char *colSep = 0;
13216  const char *rowSep = 0;
13217
13218  rc = sqlite3_step(pStmt);
13219  if( rc!=SQLITE_ROW ) return;
13220  nColumn = sqlite3_column_count(pStmt);
13221  nAlloc = nColumn*4;
13222  if( nAlloc<=0 ) nAlloc = 1;
13223  azData = sqlite3_malloc64( nAlloc*sizeof(char*) );
13224  if( azData==0 ) shell_out_of_memory();
13225  for(i=0; i<nColumn; i++){
13226    azData[i] = strdup(sqlite3_column_name(pStmt,i));
13227  }
13228  do{
13229    if( (nRow+2)*nColumn >= nAlloc ){
13230      nAlloc *= 2;
13231      azData = sqlite3_realloc64(azData, nAlloc*sizeof(char*));
13232      if( azData==0 ) shell_out_of_memory();
13233    }
13234    nRow++;
13235    for(i=0; i<nColumn; i++){
13236      z = (const char*)sqlite3_column_text(pStmt,i);
13237      azData[nRow*nColumn + i] = z ? strdup(z) : 0;
13238    }
13239  }while( (rc = sqlite3_step(pStmt))==SQLITE_ROW );
13240  if( nColumn>p->nWidth ){
13241    p->colWidth = realloc(p->colWidth, nColumn*2*sizeof(int));
13242    if( p->colWidth==0 ) shell_out_of_memory();
13243    for(i=p->nWidth; i<nColumn; i++) p->colWidth[i] = 0;
13244    p->nWidth = nColumn;
13245    p->actualWidth = &p->colWidth[nColumn];
13246  }
13247  memset(p->actualWidth, 0, nColumn*sizeof(int));
13248  for(i=0; i<nColumn; i++){
13249    w = p->colWidth[i];
13250    if( w<0 ) w = -w;
13251    p->actualWidth[i] = w;
13252  }
13253  nTotal = nColumn*(nRow+1);
13254  for(i=0; i<nTotal; i++){
13255    z = azData[i];
13256    if( z==0 ) z = p->nullValue;
13257    n = strlenChar(z);
13258    j = i%nColumn;
13259    if( n>p->actualWidth[j] ) p->actualWidth[j] = n;
13260  }
13261  if( seenInterrupt ) goto columnar_end;
13262  if( nColumn==0 ) goto columnar_end;
13263  switch( p->cMode ){
13264    case MODE_Column: {
13265      colSep = "  ";
13266      rowSep = "\n";
13267      if( p->showHeader ){
13268        for(i=0; i<nColumn; i++){
13269          w = p->actualWidth[i];
13270          if( p->colWidth[i]<0 ) w = -w;
13271          utf8_width_print(p->out, w, azData[i]);
13272          fputs(i==nColumn-1?"\n":"  ", p->out);
13273        }
13274        for(i=0; i<nColumn; i++){
13275          print_dashes(p->out, p->actualWidth[i]);
13276          fputs(i==nColumn-1?"\n":"  ", p->out);
13277        }
13278      }
13279      break;
13280    }
13281    case MODE_Table: {
13282      colSep = " | ";
13283      rowSep = " |\n";
13284      print_row_separator(p, nColumn, "+");
13285      fputs("| ", p->out);
13286      for(i=0; i<nColumn; i++){
13287        w = p->actualWidth[i];
13288        n = strlenChar(azData[i]);
13289        utf8_printf(p->out, "%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, "");
13290        fputs(i==nColumn-1?" |\n":" | ", p->out);
13291      }
13292      print_row_separator(p, nColumn, "+");
13293      break;
13294    }
13295    case MODE_Markdown: {
13296      colSep = " | ";
13297      rowSep = " |\n";
13298      fputs("| ", p->out);
13299      for(i=0; i<nColumn; i++){
13300        w = p->actualWidth[i];
13301        n = strlenChar(azData[i]);
13302        utf8_printf(p->out, "%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, "");
13303        fputs(i==nColumn-1?" |\n":" | ", p->out);
13304      }
13305      print_row_separator(p, nColumn, "|");
13306      break;
13307    }
13308    case MODE_Box: {
13309      colSep = " " BOX_13 " ";
13310      rowSep = " " BOX_13 "\n";
13311      print_box_row_separator(p, nColumn, BOX_23, BOX_234, BOX_34);
13312      utf8_printf(p->out, BOX_13 " ");
13313      for(i=0; i<nColumn; i++){
13314        w = p->actualWidth[i];
13315        n = strlenChar(azData[i]);
13316        utf8_printf(p->out, "%*s%s%*s%s",
13317            (w-n)/2, "", azData[i], (w-n+1)/2, "",
13318            i==nColumn-1?" "BOX_13"\n":" "BOX_13" ");
13319      }
13320      print_box_row_separator(p, nColumn, BOX_123, BOX_1234, BOX_134);
13321      break;
13322    }
13323  }
13324  for(i=nColumn, j=0; i<nTotal; i++, j++){
13325    if( j==0 && p->cMode!=MODE_Column ){
13326      utf8_printf(p->out, "%s", p->cMode==MODE_Box?BOX_13" ":"| ");
13327    }
13328    z = azData[i];
13329    if( z==0 ) z = p->nullValue;
13330    w = p->actualWidth[j];
13331    if( p->colWidth[j]<0 ) w = -w;
13332    utf8_width_print(p->out, w, z);
13333    if( j==nColumn-1 ){
13334      utf8_printf(p->out, "%s", rowSep);
13335      j = -1;
13336      if( seenInterrupt ) goto columnar_end;
13337    }else{
13338      utf8_printf(p->out, "%s", colSep);
13339    }
13340  }
13341  if( p->cMode==MODE_Table ){
13342    print_row_separator(p, nColumn, "+");
13343  }else if( p->cMode==MODE_Box ){
13344    print_box_row_separator(p, nColumn, BOX_12, BOX_124, BOX_14);
13345  }
13346columnar_end:
13347  if( seenInterrupt ){
13348    utf8_printf(p->out, "Interrupt\n");
13349  }
13350  nData = (nRow+1)*nColumn;
13351  for(i=0; i<nData; i++) free(azData[i]);
13352  sqlite3_free(azData);
13353}
13354
13355/*
13356** Run a prepared statement
13357*/
13358static void exec_prepared_stmt(
13359  ShellState *pArg,                                /* Pointer to ShellState */
13360  sqlite3_stmt *pStmt                              /* Statment to run */
13361){
13362  int rc;
13363
13364  if( pArg->cMode==MODE_Column
13365   || pArg->cMode==MODE_Table
13366   || pArg->cMode==MODE_Box
13367   || pArg->cMode==MODE_Markdown
13368  ){
13369    exec_prepared_stmt_columnar(pArg, pStmt);
13370    return;
13371  }
13372
13373  /* perform the first step.  this will tell us if we
13374  ** have a result set or not and how wide it is.
13375  */
13376  rc = sqlite3_step(pStmt);
13377  /* if we have a result set... */
13378  if( SQLITE_ROW == rc ){
13379    /* allocate space for col name ptr, value ptr, and type */
13380    int nCol = sqlite3_column_count(pStmt);
13381    void *pData = sqlite3_malloc64(3*nCol*sizeof(const char*) + 1);
13382    if( !pData ){
13383      rc = SQLITE_NOMEM;
13384    }else{
13385      char **azCols = (char **)pData;      /* Names of result columns */
13386      char **azVals = &azCols[nCol];       /* Results */
13387      int *aiTypes = (int *)&azVals[nCol]; /* Result types */
13388      int i, x;
13389      assert(sizeof(int) <= sizeof(char *));
13390      /* save off ptrs to column names */
13391      for(i=0; i<nCol; i++){
13392        azCols[i] = (char *)sqlite3_column_name(pStmt, i);
13393      }
13394      do{
13395        /* extract the data and data types */
13396        for(i=0; i<nCol; i++){
13397          aiTypes[i] = x = sqlite3_column_type(pStmt, i);
13398          if( x==SQLITE_BLOB && pArg && pArg->cMode==MODE_Insert ){
13399            azVals[i] = "";
13400          }else{
13401            azVals[i] = (char*)sqlite3_column_text(pStmt, i);
13402          }
13403          if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
13404            rc = SQLITE_NOMEM;
13405            break; /* from for */
13406          }
13407        } /* end for */
13408
13409        /* if data and types extracted successfully... */
13410        if( SQLITE_ROW == rc ){
13411          /* call the supplied callback with the result row data */
13412          if( shell_callback(pArg, nCol, azVals, azCols, aiTypes) ){
13413            rc = SQLITE_ABORT;
13414          }else{
13415            rc = sqlite3_step(pStmt);
13416          }
13417        }
13418      } while( SQLITE_ROW == rc );
13419      sqlite3_free(pData);
13420      if( pArg->cMode==MODE_Json ){
13421        fputs("]\n", pArg->out);
13422      }
13423    }
13424  }
13425}
13426
13427#ifndef SQLITE_OMIT_VIRTUALTABLE
13428/*
13429** This function is called to process SQL if the previous shell command
13430** was ".expert". It passes the SQL in the second argument directly to
13431** the sqlite3expert object.
13432**
13433** If successful, SQLITE_OK is returned. Otherwise, an SQLite error
13434** code. In this case, (*pzErr) may be set to point to a buffer containing
13435** an English language error message. It is the responsibility of the
13436** caller to eventually free this buffer using sqlite3_free().
13437*/
13438static int expertHandleSQL(
13439  ShellState *pState,
13440  const char *zSql,
13441  char **pzErr
13442){
13443  assert( pState->expert.pExpert );
13444  assert( pzErr==0 || *pzErr==0 );
13445  return sqlite3_expert_sql(pState->expert.pExpert, zSql, pzErr);
13446}
13447
13448/*
13449** This function is called either to silently clean up the object
13450** created by the ".expert" command (if bCancel==1), or to generate a
13451** report from it and then clean it up (if bCancel==0).
13452**
13453** If successful, SQLITE_OK is returned. Otherwise, an SQLite error
13454** code. In this case, (*pzErr) may be set to point to a buffer containing
13455** an English language error message. It is the responsibility of the
13456** caller to eventually free this buffer using sqlite3_free().
13457*/
13458static int expertFinish(
13459  ShellState *pState,
13460  int bCancel,
13461  char **pzErr
13462){
13463  int rc = SQLITE_OK;
13464  sqlite3expert *p = pState->expert.pExpert;
13465  assert( p );
13466  assert( bCancel || pzErr==0 || *pzErr==0 );
13467  if( bCancel==0 ){
13468    FILE *out = pState->out;
13469    int bVerbose = pState->expert.bVerbose;
13470
13471    rc = sqlite3_expert_analyze(p, pzErr);
13472    if( rc==SQLITE_OK ){
13473      int nQuery = sqlite3_expert_count(p);
13474      int i;
13475
13476      if( bVerbose ){
13477        const char *zCand = sqlite3_expert_report(p,0,EXPERT_REPORT_CANDIDATES);
13478        raw_printf(out, "-- Candidates -----------------------------\n");
13479        raw_printf(out, "%s\n", zCand);
13480      }
13481      for(i=0; i<nQuery; i++){
13482        const char *zSql = sqlite3_expert_report(p, i, EXPERT_REPORT_SQL);
13483        const char *zIdx = sqlite3_expert_report(p, i, EXPERT_REPORT_INDEXES);
13484        const char *zEQP = sqlite3_expert_report(p, i, EXPERT_REPORT_PLAN);
13485        if( zIdx==0 ) zIdx = "(no new indexes)\n";
13486        if( bVerbose ){
13487          raw_printf(out, "-- Query %d --------------------------------\n",i+1);
13488          raw_printf(out, "%s\n\n", zSql);
13489        }
13490        raw_printf(out, "%s\n", zIdx);
13491        raw_printf(out, "%s\n", zEQP);
13492      }
13493    }
13494  }
13495  sqlite3_expert_destroy(p);
13496  pState->expert.pExpert = 0;
13497  return rc;
13498}
13499
13500/*
13501** Implementation of ".expert" dot command.
13502*/
13503static int expertDotCommand(
13504  ShellState *pState,             /* Current shell tool state */
13505  char **azArg,                   /* Array of arguments passed to dot command */
13506  int nArg                        /* Number of entries in azArg[] */
13507){
13508  int rc = SQLITE_OK;
13509  char *zErr = 0;
13510  int i;
13511  int iSample = 0;
13512
13513  assert( pState->expert.pExpert==0 );
13514  memset(&pState->expert, 0, sizeof(ExpertInfo));
13515
13516  for(i=1; rc==SQLITE_OK && i<nArg; i++){
13517    char *z = azArg[i];
13518    int n;
13519    if( z[0]=='-' && z[1]=='-' ) z++;
13520    n = strlen30(z);
13521    if( n>=2 && 0==strncmp(z, "-verbose", n) ){
13522      pState->expert.bVerbose = 1;
13523    }
13524    else if( n>=2 && 0==strncmp(z, "-sample", n) ){
13525      if( i==(nArg-1) ){
13526        raw_printf(stderr, "option requires an argument: %s\n", z);
13527        rc = SQLITE_ERROR;
13528      }else{
13529        iSample = (int)integerValue(azArg[++i]);
13530        if( iSample<0 || iSample>100 ){
13531          raw_printf(stderr, "value out of range: %s\n", azArg[i]);
13532          rc = SQLITE_ERROR;
13533        }
13534      }
13535    }
13536    else{
13537      raw_printf(stderr, "unknown option: %s\n", z);
13538      rc = SQLITE_ERROR;
13539    }
13540  }
13541
13542  if( rc==SQLITE_OK ){
13543    pState->expert.pExpert = sqlite3_expert_new(pState->db, &zErr);
13544    if( pState->expert.pExpert==0 ){
13545      raw_printf(stderr, "sqlite3_expert_new: %s\n", zErr);
13546      rc = SQLITE_ERROR;
13547    }else{
13548      sqlite3_expert_config(
13549          pState->expert.pExpert, EXPERT_CONFIG_SAMPLE, iSample
13550      );
13551    }
13552  }
13553
13554  return rc;
13555}
13556#endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
13557
13558/*
13559** Execute a statement or set of statements.  Print
13560** any result rows/columns depending on the current mode
13561** set via the supplied callback.
13562**
13563** This is very similar to SQLite's built-in sqlite3_exec()
13564** function except it takes a slightly different callback
13565** and callback data argument.
13566*/
13567static int shell_exec(
13568  ShellState *pArg,                         /* Pointer to ShellState */
13569  const char *zSql,                         /* SQL to be evaluated */
13570  char **pzErrMsg                           /* Error msg written here */
13571){
13572  sqlite3_stmt *pStmt = NULL;     /* Statement to execute. */
13573  int rc = SQLITE_OK;             /* Return Code */
13574  int rc2;
13575  const char *zLeftover;          /* Tail of unprocessed SQL */
13576  sqlite3 *db = pArg->db;
13577
13578  if( pzErrMsg ){
13579    *pzErrMsg = NULL;
13580  }
13581
13582#ifndef SQLITE_OMIT_VIRTUALTABLE
13583  if( pArg->expert.pExpert ){
13584    rc = expertHandleSQL(pArg, zSql, pzErrMsg);
13585    return expertFinish(pArg, (rc!=SQLITE_OK), pzErrMsg);
13586  }
13587#endif
13588
13589  while( zSql[0] && (SQLITE_OK == rc) ){
13590    static const char *zStmtSql;
13591    rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
13592    if( SQLITE_OK != rc ){
13593      if( pzErrMsg ){
13594        *pzErrMsg = save_err_msg(db);
13595      }
13596    }else{
13597      if( !pStmt ){
13598        /* this happens for a comment or white-space */
13599        zSql = zLeftover;
13600        while( IsSpace(zSql[0]) ) zSql++;
13601        continue;
13602      }
13603      zStmtSql = sqlite3_sql(pStmt);
13604      if( zStmtSql==0 ) zStmtSql = "";
13605      while( IsSpace(zStmtSql[0]) ) zStmtSql++;
13606
13607      /* save off the prepared statment handle and reset row count */
13608      if( pArg ){
13609        pArg->pStmt = pStmt;
13610        pArg->cnt = 0;
13611      }
13612
13613      /* echo the sql statement if echo on */
13614      if( pArg && ShellHasFlag(pArg, SHFLG_Echo) ){
13615        utf8_printf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
13616      }
13617
13618      /* Show the EXPLAIN QUERY PLAN if .eqp is on */
13619      if( pArg && pArg->autoEQP && sqlite3_stmt_isexplain(pStmt)==0 ){
13620        sqlite3_stmt *pExplain;
13621        char *zEQP;
13622        int triggerEQP = 0;
13623        disable_debug_trace_modes();
13624        sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, -1, &triggerEQP);
13625        if( pArg->autoEQP>=AUTOEQP_trigger ){
13626          sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 1, 0);
13627        }
13628        zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s", zStmtSql);
13629        rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
13630        if( rc==SQLITE_OK ){
13631          while( sqlite3_step(pExplain)==SQLITE_ROW ){
13632            const char *zEQPLine = (const char*)sqlite3_column_text(pExplain,3);
13633            int iEqpId = sqlite3_column_int(pExplain, 0);
13634            int iParentId = sqlite3_column_int(pExplain, 1);
13635            if( zEQPLine==0 ) zEQPLine = "";
13636            if( zEQPLine[0]=='-' ) eqp_render(pArg);
13637            eqp_append(pArg, iEqpId, iParentId, zEQPLine);
13638          }
13639          eqp_render(pArg);
13640        }
13641        sqlite3_finalize(pExplain);
13642        sqlite3_free(zEQP);
13643        if( pArg->autoEQP>=AUTOEQP_full ){
13644          /* Also do an EXPLAIN for ".eqp full" mode */
13645          zEQP = sqlite3_mprintf("EXPLAIN %s", zStmtSql);
13646          rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
13647          if( rc==SQLITE_OK ){
13648            pArg->cMode = MODE_Explain;
13649            explain_data_prepare(pArg, pExplain);
13650            exec_prepared_stmt(pArg, pExplain);
13651            explain_data_delete(pArg);
13652          }
13653          sqlite3_finalize(pExplain);
13654          sqlite3_free(zEQP);
13655        }
13656        if( pArg->autoEQP>=AUTOEQP_trigger && triggerEQP==0 ){
13657          sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 0, 0);
13658          /* Reprepare pStmt before reactiving trace modes */
13659          sqlite3_finalize(pStmt);
13660          sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
13661          if( pArg ) pArg->pStmt = pStmt;
13662        }
13663        restore_debug_trace_modes();
13664      }
13665
13666      if( pArg ){
13667        pArg->cMode = pArg->mode;
13668        if( pArg->autoExplain ){
13669          if( sqlite3_stmt_isexplain(pStmt)==1 ){
13670            pArg->cMode = MODE_Explain;
13671          }
13672          if( sqlite3_stmt_isexplain(pStmt)==2 ){
13673            pArg->cMode = MODE_EQP;
13674          }
13675        }
13676
13677        /* If the shell is currently in ".explain" mode, gather the extra
13678        ** data required to add indents to the output.*/
13679        if( pArg->cMode==MODE_Explain ){
13680          explain_data_prepare(pArg, pStmt);
13681        }
13682      }
13683
13684      bind_prepared_stmt(pArg, pStmt);
13685      exec_prepared_stmt(pArg, pStmt);
13686      explain_data_delete(pArg);
13687      eqp_render(pArg);
13688
13689      /* print usage stats if stats on */
13690      if( pArg && pArg->statsOn ){
13691        display_stats(db, pArg, 0);
13692      }
13693
13694      /* print loop-counters if required */
13695      if( pArg && pArg->scanstatsOn ){
13696        display_scanstats(db, pArg);
13697      }
13698
13699      /* Finalize the statement just executed. If this fails, save a
13700      ** copy of the error message. Otherwise, set zSql to point to the
13701      ** next statement to execute. */
13702      rc2 = sqlite3_finalize(pStmt);
13703      if( rc!=SQLITE_NOMEM ) rc = rc2;
13704      if( rc==SQLITE_OK ){
13705        zSql = zLeftover;
13706        while( IsSpace(zSql[0]) ) zSql++;
13707      }else if( pzErrMsg ){
13708        *pzErrMsg = save_err_msg(db);
13709      }
13710
13711      /* clear saved stmt handle */
13712      if( pArg ){
13713        pArg->pStmt = NULL;
13714      }
13715    }
13716  } /* end while */
13717
13718  return rc;
13719}
13720
13721/*
13722** Release memory previously allocated by tableColumnList().
13723*/
13724static void freeColumnList(char **azCol){
13725  int i;
13726  for(i=1; azCol[i]; i++){
13727    sqlite3_free(azCol[i]);
13728  }
13729  /* azCol[0] is a static string */
13730  sqlite3_free(azCol);
13731}
13732
13733/*
13734** Return a list of pointers to strings which are the names of all
13735** columns in table zTab.   The memory to hold the names is dynamically
13736** allocated and must be released by the caller using a subsequent call
13737** to freeColumnList().
13738**
13739** The azCol[0] entry is usually NULL.  However, if zTab contains a rowid
13740** value that needs to be preserved, then azCol[0] is filled in with the
13741** name of the rowid column.
13742**
13743** The first regular column in the table is azCol[1].  The list is terminated
13744** by an entry with azCol[i]==0.
13745*/
13746static char **tableColumnList(ShellState *p, const char *zTab){
13747  char **azCol = 0;
13748  sqlite3_stmt *pStmt;
13749  char *zSql;
13750  int nCol = 0;
13751  int nAlloc = 0;
13752  int nPK = 0;       /* Number of PRIMARY KEY columns seen */
13753  int isIPK = 0;     /* True if one PRIMARY KEY column of type INTEGER */
13754  int preserveRowid = ShellHasFlag(p, SHFLG_PreserveRowid);
13755  int rc;
13756
13757  zSql = sqlite3_mprintf("PRAGMA table_info=%Q", zTab);
13758  rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
13759  sqlite3_free(zSql);
13760  if( rc ) return 0;
13761  while( sqlite3_step(pStmt)==SQLITE_ROW ){
13762    if( nCol>=nAlloc-2 ){
13763      nAlloc = nAlloc*2 + nCol + 10;
13764      azCol = sqlite3_realloc(azCol, nAlloc*sizeof(azCol[0]));
13765      if( azCol==0 ) shell_out_of_memory();
13766    }
13767    azCol[++nCol] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 1));
13768    if( sqlite3_column_int(pStmt, 5) ){
13769      nPK++;
13770      if( nPK==1
13771       && sqlite3_stricmp((const char*)sqlite3_column_text(pStmt,2),
13772                          "INTEGER")==0
13773      ){
13774        isIPK = 1;
13775      }else{
13776        isIPK = 0;
13777      }
13778    }
13779  }
13780  sqlite3_finalize(pStmt);
13781  if( azCol==0 ) return 0;
13782  azCol[0] = 0;
13783  azCol[nCol+1] = 0;
13784
13785  /* The decision of whether or not a rowid really needs to be preserved
13786  ** is tricky.  We never need to preserve a rowid for a WITHOUT ROWID table
13787  ** or a table with an INTEGER PRIMARY KEY.  We are unable to preserve
13788  ** rowids on tables where the rowid is inaccessible because there are other
13789  ** columns in the table named "rowid", "_rowid_", and "oid".
13790  */
13791  if( preserveRowid && isIPK ){
13792    /* If a single PRIMARY KEY column with type INTEGER was seen, then it
13793    ** might be an alise for the ROWID.  But it might also be a WITHOUT ROWID
13794    ** table or a INTEGER PRIMARY KEY DESC column, neither of which are
13795    ** ROWID aliases.  To distinguish these cases, check to see if
13796    ** there is a "pk" entry in "PRAGMA index_list".  There will be
13797    ** no "pk" index if the PRIMARY KEY really is an alias for the ROWID.
13798    */
13799    zSql = sqlite3_mprintf("SELECT 1 FROM pragma_index_list(%Q)"
13800                           " WHERE origin='pk'", zTab);
13801    rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
13802    sqlite3_free(zSql);
13803    if( rc ){
13804      freeColumnList(azCol);
13805      return 0;
13806    }
13807    rc = sqlite3_step(pStmt);
13808    sqlite3_finalize(pStmt);
13809    preserveRowid = rc==SQLITE_ROW;
13810  }
13811  if( preserveRowid ){
13812    /* Only preserve the rowid if we can find a name to use for the
13813    ** rowid */
13814    static char *azRowid[] = { "rowid", "_rowid_", "oid" };
13815    int i, j;
13816    for(j=0; j<3; j++){
13817      for(i=1; i<=nCol; i++){
13818        if( sqlite3_stricmp(azRowid[j],azCol[i])==0 ) break;
13819      }
13820      if( i>nCol ){
13821        /* At this point, we know that azRowid[j] is not the name of any
13822        ** ordinary column in the table.  Verify that azRowid[j] is a valid
13823        ** name for the rowid before adding it to azCol[0].  WITHOUT ROWID
13824        ** tables will fail this last check */
13825        rc = sqlite3_table_column_metadata(p->db,0,zTab,azRowid[j],0,0,0,0,0);
13826        if( rc==SQLITE_OK ) azCol[0] = azRowid[j];
13827        break;
13828      }
13829    }
13830  }
13831  return azCol;
13832}
13833
13834/*
13835** Toggle the reverse_unordered_selects setting.
13836*/
13837static void toggleSelectOrder(sqlite3 *db){
13838  sqlite3_stmt *pStmt = 0;
13839  int iSetting = 0;
13840  char zStmt[100];
13841  sqlite3_prepare_v2(db, "PRAGMA reverse_unordered_selects", -1, &pStmt, 0);
13842  if( sqlite3_step(pStmt)==SQLITE_ROW ){
13843    iSetting = sqlite3_column_int(pStmt, 0);
13844  }
13845  sqlite3_finalize(pStmt);
13846  sqlite3_snprintf(sizeof(zStmt), zStmt,
13847       "PRAGMA reverse_unordered_selects(%d)", !iSetting);
13848  sqlite3_exec(db, zStmt, 0, 0, 0);
13849}
13850
13851/*
13852** This is a different callback routine used for dumping the database.
13853** Each row received by this callback consists of a table name,
13854** the table type ("index" or "table") and SQL to create the table.
13855** This routine should print text sufficient to recreate the table.
13856*/
13857static int dump_callback(void *pArg, int nArg, char **azArg, char **azNotUsed){
13858  int rc;
13859  const char *zTable;
13860  const char *zType;
13861  const char *zSql;
13862  ShellState *p = (ShellState *)pArg;
13863  int dataOnly;
13864  int noSys;
13865
13866  UNUSED_PARAMETER(azNotUsed);
13867  if( nArg!=3 || azArg==0 ) return 0;
13868  zTable = azArg[0];
13869  zType = azArg[1];
13870  zSql = azArg[2];
13871  dataOnly = (p->shellFlgs & SHFLG_DumpDataOnly)!=0;
13872  noSys    = (p->shellFlgs & SHFLG_DumpNoSys)!=0;
13873
13874  if( strcmp(zTable, "sqlite_sequence")==0 && !noSys ){
13875    if( !dataOnly ) raw_printf(p->out, "DELETE FROM sqlite_sequence;\n");
13876  }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 && !noSys ){
13877    if( !dataOnly ) raw_printf(p->out, "ANALYZE sqlite_schema;\n");
13878  }else if( strncmp(zTable, "sqlite_", 7)==0 ){
13879    return 0;
13880  }else if( dataOnly ){
13881    /* no-op */
13882  }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
13883    char *zIns;
13884    if( !p->writableSchema ){
13885      raw_printf(p->out, "PRAGMA writable_schema=ON;\n");
13886      p->writableSchema = 1;
13887    }
13888    zIns = sqlite3_mprintf(
13889       "INSERT INTO sqlite_schema(type,name,tbl_name,rootpage,sql)"
13890       "VALUES('table','%q','%q',0,'%q');",
13891       zTable, zTable, zSql);
13892    utf8_printf(p->out, "%s\n", zIns);
13893    sqlite3_free(zIns);
13894    return 0;
13895  }else{
13896    printSchemaLine(p->out, zSql, ";\n");
13897  }
13898
13899  if( strcmp(zType, "table")==0 ){
13900    ShellText sSelect;
13901    ShellText sTable;
13902    char **azCol;
13903    int i;
13904    char *savedDestTable;
13905    int savedMode;
13906
13907    azCol = tableColumnList(p, zTable);
13908    if( azCol==0 ){
13909      p->nErr++;
13910      return 0;
13911    }
13912
13913    /* Always quote the table name, even if it appears to be pure ascii,
13914    ** in case it is a keyword. Ex:  INSERT INTO "table" ... */
13915    initText(&sTable);
13916    appendText(&sTable, zTable, quoteChar(zTable));
13917    /* If preserving the rowid, add a column list after the table name.
13918    ** In other words:  "INSERT INTO tab(rowid,a,b,c,...) VALUES(...)"
13919    ** instead of the usual "INSERT INTO tab VALUES(...)".
13920    */
13921    if( azCol[0] ){
13922      appendText(&sTable, "(", 0);
13923      appendText(&sTable, azCol[0], 0);
13924      for(i=1; azCol[i]; i++){
13925        appendText(&sTable, ",", 0);
13926        appendText(&sTable, azCol[i], quoteChar(azCol[i]));
13927      }
13928      appendText(&sTable, ")", 0);
13929    }
13930
13931    /* Build an appropriate SELECT statement */
13932    initText(&sSelect);
13933    appendText(&sSelect, "SELECT ", 0);
13934    if( azCol[0] ){
13935      appendText(&sSelect, azCol[0], 0);
13936      appendText(&sSelect, ",", 0);
13937    }
13938    for(i=1; azCol[i]; i++){
13939      appendText(&sSelect, azCol[i], quoteChar(azCol[i]));
13940      if( azCol[i+1] ){
13941        appendText(&sSelect, ",", 0);
13942      }
13943    }
13944    freeColumnList(azCol);
13945    appendText(&sSelect, " FROM ", 0);
13946    appendText(&sSelect, zTable, quoteChar(zTable));
13947
13948    savedDestTable = p->zDestTable;
13949    savedMode = p->mode;
13950    p->zDestTable = sTable.z;
13951    p->mode = p->cMode = MODE_Insert;
13952    rc = shell_exec(p, sSelect.z, 0);
13953    if( (rc&0xff)==SQLITE_CORRUPT ){
13954      raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n");
13955      toggleSelectOrder(p->db);
13956      shell_exec(p, sSelect.z, 0);
13957      toggleSelectOrder(p->db);
13958    }
13959    p->zDestTable = savedDestTable;
13960    p->mode = savedMode;
13961    freeText(&sTable);
13962    freeText(&sSelect);
13963    if( rc ) p->nErr++;
13964  }
13965  return 0;
13966}
13967
13968/*
13969** Run zQuery.  Use dump_callback() as the callback routine so that
13970** the contents of the query are output as SQL statements.
13971**
13972** If we get a SQLITE_CORRUPT error, rerun the query after appending
13973** "ORDER BY rowid DESC" to the end.
13974*/
13975static int run_schema_dump_query(
13976  ShellState *p,
13977  const char *zQuery
13978){
13979  int rc;
13980  char *zErr = 0;
13981  rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
13982  if( rc==SQLITE_CORRUPT ){
13983    char *zQ2;
13984    int len = strlen30(zQuery);
13985    raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n");
13986    if( zErr ){
13987      utf8_printf(p->out, "/****** %s ******/\n", zErr);
13988      sqlite3_free(zErr);
13989      zErr = 0;
13990    }
13991    zQ2 = malloc( len+100 );
13992    if( zQ2==0 ) return rc;
13993    sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
13994    rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
13995    if( rc ){
13996      utf8_printf(p->out, "/****** ERROR: %s ******/\n", zErr);
13997    }else{
13998      rc = SQLITE_CORRUPT;
13999    }
14000    sqlite3_free(zErr);
14001    free(zQ2);
14002  }
14003  return rc;
14004}
14005
14006/*
14007** Text of help messages.
14008**
14009** The help text for each individual command begins with a line that starts
14010** with ".".  Subsequent lines are supplimental information.
14011**
14012** There must be two or more spaces between the end of the command and the
14013** start of the description of what that command does.
14014*/
14015static const char *(azHelp[]) = {
14016#if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE)
14017  ".archive ...             Manage SQL archives",
14018  "   Each command must have exactly one of the following options:",
14019  "     -c, --create               Create a new archive",
14020  "     -u, --update               Add or update files with changed mtime",
14021  "     -i, --insert               Like -u but always add even if unchanged",
14022  "     -t, --list                 List contents of archive",
14023  "     -x, --extract              Extract files from archive",
14024  "   Optional arguments:",
14025  "     -v, --verbose              Print each filename as it is processed",
14026  "     -f FILE, --file FILE       Use archive FILE (default is current db)",
14027  "     -a FILE, --append FILE     Open FILE using the apndvfs VFS",
14028  "     -C DIR, --directory DIR    Read/extract files from directory DIR",
14029  "     -n, --dryrun               Show the SQL that would have occurred",
14030  "   Examples:",
14031  "     .ar -cf ARCHIVE foo bar  # Create ARCHIVE from files foo and bar",
14032  "     .ar -tf ARCHIVE          # List members of ARCHIVE",
14033  "     .ar -xvf ARCHIVE         # Verbosely extract files from ARCHIVE",
14034  "   See also:",
14035  "      http://sqlite.org/cli.html#sqlar_archive_support",
14036#endif
14037#ifndef SQLITE_OMIT_AUTHORIZATION
14038  ".auth ON|OFF             Show authorizer callbacks",
14039#endif
14040  ".backup ?DB? FILE        Backup DB (default \"main\") to FILE",
14041  "       --append            Use the appendvfs",
14042  "       --async             Write to FILE without journal and fsync()",
14043  ".bail on|off             Stop after hitting an error.  Default OFF",
14044  ".binary on|off           Turn binary output on or off.  Default OFF",
14045  ".cd DIRECTORY            Change the working directory to DIRECTORY",
14046  ".changes on|off          Show number of rows changed by SQL",
14047  ".check GLOB              Fail if output since .testcase does not match",
14048  ".clone NEWDB             Clone data into NEWDB from the existing database",
14049  ".databases               List names and files of attached databases",
14050  ".dbconfig ?op? ?val?     List or change sqlite3_db_config() options",
14051  ".dbinfo ?DB?             Show status information about the database",
14052  ".dump ?OBJECTS?          Render database content as SQL",
14053  "   Options:",
14054  "     --data-only            Output only INSERT statements",
14055  "     --newlines             Allow unescaped newline characters in output",
14056  "     --nosys                Omit system tables (ex: \"sqlite_stat1\")",
14057  "     --preserve-rowids      Include ROWID values in the output",
14058  "   OBJECTS is a LIKE pattern for tables, indexes, triggers or views to dump",
14059  "   Additional LIKE patterns can be given in subsequent arguments",
14060  ".echo on|off             Turn command echo on or off",
14061  ".eqp on|off|full|...     Enable or disable automatic EXPLAIN QUERY PLAN",
14062  "   Other Modes:",
14063#ifdef SQLITE_DEBUG
14064  "      test                  Show raw EXPLAIN QUERY PLAN output",
14065  "      trace                 Like \"full\" but enable \"PRAGMA vdbe_trace\"",
14066#endif
14067  "      trigger               Like \"full\" but also show trigger bytecode",
14068  ".excel                   Display the output of next command in spreadsheet",
14069  "   --bom                   Put a UTF8 byte-order mark on intermediate file",
14070  ".exit ?CODE?             Exit this program with return-code CODE",
14071  ".expert                  EXPERIMENTAL. Suggest indexes for queries",
14072  ".explain ?on|off|auto?   Change the EXPLAIN formatting mode.  Default: auto",
14073  ".filectrl CMD ...        Run various sqlite3_file_control() operations",
14074  "   --schema SCHEMA         Use SCHEMA instead of \"main\"",
14075  "   --help                  Show CMD details",
14076  ".fullschema ?--indent?   Show schema and the content of sqlite_stat tables",
14077  ".headers on|off          Turn display of headers on or off",
14078  ".help ?-all? ?PATTERN?   Show help text for PATTERN",
14079  ".import FILE TABLE       Import data from FILE into TABLE",
14080  "   Options:",
14081  "     --ascii               Use \\037 and \\036 as column and row separators",
14082  "     --csv                 Use , and \\n as column and row separators",
14083  "     --skip N              Skip the first N rows of input",
14084  "     -v                    \"Verbose\" - increase auxiliary output",
14085  "   Notes:",
14086  "     *  If TABLE does not exist, it is created.  The first row of input",
14087  "        determines the column names.",
14088  "     *  If neither --csv or --ascii are used, the input mode is derived",
14089  "        from the \".mode\" output mode",
14090  "     *  If FILE begins with \"|\" then it is a command that generates the",
14091  "        input text.",
14092#ifndef SQLITE_OMIT_TEST_CONTROL
14093  ".imposter INDEX TABLE    Create imposter table TABLE on index INDEX",
14094#endif
14095  ".indexes ?TABLE?         Show names of indexes",
14096  "                           If TABLE is specified, only show indexes for",
14097  "                           tables matching TABLE using the LIKE operator.",
14098#ifdef SQLITE_ENABLE_IOTRACE
14099  ".iotrace FILE            Enable I/O diagnostic logging to FILE",
14100#endif
14101  ".limit ?LIMIT? ?VAL?     Display or change the value of an SQLITE_LIMIT",
14102  ".lint OPTIONS            Report potential schema issues.",
14103  "     Options:",
14104  "        fkey-indexes     Find missing foreign key indexes",
14105#ifndef SQLITE_OMIT_LOAD_EXTENSION
14106  ".load FILE ?ENTRY?       Load an extension library",
14107#endif
14108  ".log FILE|off            Turn logging on or off.  FILE can be stderr/stdout",
14109  ".mode MODE ?TABLE?       Set output mode",
14110  "   MODE is one of:",
14111  "     ascii     Columns/rows delimited by 0x1F and 0x1E",
14112  "     box       Tables using unicode box-drawing characters",
14113  "     csv       Comma-separated values",
14114  "     column    Output in columns.  (See .width)",
14115  "     html      HTML <table> code",
14116  "     insert    SQL insert statements for TABLE",
14117  "     json      Results in a JSON array",
14118  "     line      One value per line",
14119  "     list      Values delimited by \"|\"",
14120  "     markdown  Markdown table format",
14121  "     quote     Escape answers as for SQL",
14122  "     table     ASCII-art table",
14123  "     tabs      Tab-separated values",
14124  "     tcl       TCL list elements",
14125  ".nullvalue STRING        Use STRING in place of NULL values",
14126  ".once ?OPTIONS? ?FILE?   Output for the next SQL command only to FILE",
14127  "     If FILE begins with '|' then open as a pipe",
14128  "       --bom  Put a UTF8 byte-order mark at the beginning",
14129  "       -e     Send output to the system text editor",
14130  "       -x     Send output as CSV to a spreadsheet (same as \".excel\")",
14131#ifdef SQLITE_DEBUG
14132  ".oom ?--repeat M? ?N?    Simulate an OOM error on the N-th allocation",
14133#endif
14134  ".open ?OPTIONS? ?FILE?   Close existing database and reopen FILE",
14135  "     Options:",
14136  "        --append        Use appendvfs to append database to the end of FILE",
14137#ifdef SQLITE_ENABLE_DESERIALIZE
14138  "        --deserialize   Load into memory useing sqlite3_deserialize()",
14139  "        --hexdb         Load the output of \"dbtotxt\" as an in-memory db",
14140  "        --maxsize N     Maximum size for --hexdb or --deserialized database",
14141#endif
14142  "        --new           Initialize FILE to an empty database",
14143  "        --nofollow      Do not follow symbolic links",
14144  "        --readonly      Open FILE readonly",
14145  "        --zip           FILE is a ZIP archive",
14146  ".output ?FILE?           Send output to FILE or stdout if FILE is omitted",
14147  "   If FILE begins with '|' then open it as a pipe.",
14148  "   Options:",
14149  "     --bom                 Prefix output with a UTF8 byte-order mark",
14150  "     -e                    Send output to the system text editor",
14151  "     -x                    Send output as CSV to a spreadsheet",
14152  ".parameter CMD ...       Manage SQL parameter bindings",
14153  "   clear                   Erase all bindings",
14154  "   init                    Initialize the TEMP table that holds bindings",
14155  "   list                    List the current parameter bindings",
14156  "   set PARAMETER VALUE     Given SQL parameter PARAMETER a value of VALUE",
14157  "                           PARAMETER should start with one of: $ : @ ?",
14158  "   unset PARAMETER         Remove PARAMETER from the binding table",
14159  ".print STRING...         Print literal STRING",
14160#ifndef SQLITE_OMIT_PROGRESS_CALLBACK
14161  ".progress N              Invoke progress handler after every N opcodes",
14162  "   --limit N                 Interrupt after N progress callbacks",
14163  "   --once                    Do no more than one progress interrupt",
14164  "   --quiet|-q                No output except at interrupts",
14165  "   --reset                   Reset the count for each input and interrupt",
14166#endif
14167  ".prompt MAIN CONTINUE    Replace the standard prompts",
14168  ".quit                    Exit this program",
14169  ".read FILE               Read input from FILE",
14170#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
14171  ".recover                 Recover as much data as possible from corrupt db.",
14172  "   --freelist-corrupt       Assume the freelist is corrupt",
14173  "   --recovery-db NAME       Store recovery metadata in database file NAME",
14174  "   --lost-and-found TABLE   Alternative name for the lost-and-found table",
14175  "   --no-rowids              Do not attempt to recover rowid values",
14176  "                            that are not also INTEGER PRIMARY KEYs",
14177#endif
14178  ".restore ?DB? FILE       Restore content of DB (default \"main\") from FILE",
14179  ".save FILE               Write in-memory database into FILE",
14180  ".scanstats on|off        Turn sqlite3_stmt_scanstatus() metrics on or off",
14181  ".schema ?PATTERN?        Show the CREATE statements matching PATTERN",
14182  "   Options:",
14183  "      --indent             Try to pretty-print the schema",
14184  "      --nosys              Omit objects whose names start with \"sqlite_\"",
14185  ".selftest ?OPTIONS?      Run tests defined in the SELFTEST table",
14186  "    Options:",
14187  "       --init               Create a new SELFTEST table",
14188  "       -v                   Verbose output",
14189  ".separator COL ?ROW?     Change the column and row separators",
14190#if defined(SQLITE_ENABLE_SESSION)
14191  ".session ?NAME? CMD ...  Create or control sessions",
14192  "   Subcommands:",
14193  "     attach TABLE             Attach TABLE",
14194  "     changeset FILE           Write a changeset into FILE",
14195  "     close                    Close one session",
14196  "     enable ?BOOLEAN?         Set or query the enable bit",
14197  "     filter GLOB...           Reject tables matching GLOBs",
14198  "     indirect ?BOOLEAN?       Mark or query the indirect status",
14199  "     isempty                  Query whether the session is empty",
14200  "     list                     List currently open session names",
14201  "     open DB NAME             Open a new session on DB",
14202  "     patchset FILE            Write a patchset into FILE",
14203  "   If ?NAME? is omitted, the first defined session is used.",
14204#endif
14205  ".sha3sum ...             Compute a SHA3 hash of database content",
14206  "    Options:",
14207  "      --schema              Also hash the sqlite_schema table",
14208  "      --sha3-224            Use the sha3-224 algorithm",
14209  "      --sha3-256            Use the sha3-256 algorithm (default)",
14210  "      --sha3-384            Use the sha3-384 algorithm",
14211  "      --sha3-512            Use the sha3-512 algorithm",
14212  "    Any other argument is a LIKE pattern for tables to hash",
14213#ifndef SQLITE_NOHAVE_SYSTEM
14214  ".shell CMD ARGS...       Run CMD ARGS... in a system shell",
14215#endif
14216  ".show                    Show the current values for various settings",
14217  ".stats ?ARG?             Show stats or turn stats on or off",
14218  "   off                      Turn off automatic stat display",
14219  "   on                       Turn on automatic stat display",
14220  "   stmt                     Show statement stats",
14221  "   vmstep                   Show the virtual machine step count only",
14222#ifndef SQLITE_NOHAVE_SYSTEM
14223  ".system CMD ARGS...      Run CMD ARGS... in a system shell",
14224#endif
14225  ".tables ?TABLE?          List names of tables matching LIKE pattern TABLE",
14226  ".testcase NAME           Begin redirecting output to 'testcase-out.txt'",
14227  ".testctrl CMD ...        Run various sqlite3_test_control() operations",
14228  "                           Run \".testctrl\" with no arguments for details",
14229  ".timeout MS              Try opening locked tables for MS milliseconds",
14230  ".timer on|off            Turn SQL timer on or off",
14231#ifndef SQLITE_OMIT_TRACE
14232  ".trace ?OPTIONS?         Output each SQL statement as it is run",
14233  "    FILE                    Send output to FILE",
14234  "    stdout                  Send output to stdout",
14235  "    stderr                  Send output to stderr",
14236  "    off                     Disable tracing",
14237  "    --expanded              Expand query parameters",
14238#ifdef SQLITE_ENABLE_NORMALIZE
14239  "    --normalized            Normal the SQL statements",
14240#endif
14241  "    --plain                 Show SQL as it is input",
14242  "    --stmt                  Trace statement execution (SQLITE_TRACE_STMT)",
14243  "    --profile               Profile statements (SQLITE_TRACE_PROFILE)",
14244  "    --row                   Trace each row (SQLITE_TRACE_ROW)",
14245  "    --close                 Trace connection close (SQLITE_TRACE_CLOSE)",
14246#endif /* SQLITE_OMIT_TRACE */
14247#ifdef SQLITE_DEBUG
14248  ".unmodule NAME ...       Unregister virtual table modules",
14249  "    --allexcept             Unregister everything except those named",
14250#endif
14251  ".vfsinfo ?AUX?           Information about the top-level VFS",
14252  ".vfslist                 List all available VFSes",
14253  ".vfsname ?AUX?           Print the name of the VFS stack",
14254  ".width NUM1 NUM2 ...     Set minimum column widths for columnar output",
14255  "     Negative values right-justify",
14256};
14257
14258/*
14259** Output help text.
14260**
14261** zPattern describes the set of commands for which help text is provided.
14262** If zPattern is NULL, then show all commands, but only give a one-line
14263** description of each.
14264**
14265** Return the number of matches.
14266*/
14267static int showHelp(FILE *out, const char *zPattern){
14268  int i = 0;
14269  int j = 0;
14270  int n = 0;
14271  char *zPat;
14272  if( zPattern==0
14273   || zPattern[0]=='0'
14274   || strcmp(zPattern,"-a")==0
14275   || strcmp(zPattern,"-all")==0
14276   || strcmp(zPattern,"--all")==0
14277  ){
14278    /* Show all commands, but only one line per command */
14279    if( zPattern==0 ) zPattern = "";
14280    for(i=0; i<ArraySize(azHelp); i++){
14281      if( azHelp[i][0]=='.' || zPattern[0] ){
14282        utf8_printf(out, "%s\n", azHelp[i]);
14283        n++;
14284      }
14285    }
14286  }else{
14287    /* Look for commands that for which zPattern is an exact prefix */
14288    zPat = sqlite3_mprintf(".%s*", zPattern);
14289    for(i=0; i<ArraySize(azHelp); i++){
14290      if( sqlite3_strglob(zPat, azHelp[i])==0 ){
14291        utf8_printf(out, "%s\n", azHelp[i]);
14292        j = i+1;
14293        n++;
14294      }
14295    }
14296    sqlite3_free(zPat);
14297    if( n ){
14298      if( n==1 ){
14299        /* when zPattern is a prefix of exactly one command, then include the
14300        ** details of that command, which should begin at offset j */
14301        while( j<ArraySize(azHelp)-1 && azHelp[j][0]!='.' ){
14302          utf8_printf(out, "%s\n", azHelp[j]);
14303          j++;
14304        }
14305      }
14306      return n;
14307    }
14308    /* Look for commands that contain zPattern anywhere.  Show the complete
14309    ** text of all commands that match. */
14310    zPat = sqlite3_mprintf("%%%s%%", zPattern);
14311    for(i=0; i<ArraySize(azHelp); i++){
14312      if( azHelp[i][0]=='.' ) j = i;
14313      if( sqlite3_strlike(zPat, azHelp[i], 0)==0 ){
14314        utf8_printf(out, "%s\n", azHelp[j]);
14315        while( j<ArraySize(azHelp)-1 && azHelp[j+1][0]!='.' ){
14316          j++;
14317          utf8_printf(out, "%s\n", azHelp[j]);
14318        }
14319        i = j;
14320        n++;
14321      }
14322    }
14323    sqlite3_free(zPat);
14324  }
14325  return n;
14326}
14327
14328/* Forward reference */
14329static int process_input(ShellState *p);
14330
14331/*
14332** Read the content of file zName into memory obtained from sqlite3_malloc64()
14333** and return a pointer to the buffer. The caller is responsible for freeing
14334** the memory.
14335**
14336** If parameter pnByte is not NULL, (*pnByte) is set to the number of bytes
14337** read.
14338**
14339** For convenience, a nul-terminator byte is always appended to the data read
14340** from the file before the buffer is returned. This byte is not included in
14341** the final value of (*pnByte), if applicable.
14342**
14343** NULL is returned if any error is encountered. The final value of *pnByte
14344** is undefined in this case.
14345*/
14346static char *readFile(const char *zName, int *pnByte){
14347  FILE *in = fopen(zName, "rb");
14348  long nIn;
14349  size_t nRead;
14350  char *pBuf;
14351  if( in==0 ) return 0;
14352  fseek(in, 0, SEEK_END);
14353  nIn = ftell(in);
14354  rewind(in);
14355  pBuf = sqlite3_malloc64( nIn+1 );
14356  if( pBuf==0 ){ fclose(in); return 0; }
14357  nRead = fread(pBuf, nIn, 1, in);
14358  fclose(in);
14359  if( nRead!=1 ){
14360    sqlite3_free(pBuf);
14361    return 0;
14362  }
14363  pBuf[nIn] = 0;
14364  if( pnByte ) *pnByte = nIn;
14365  return pBuf;
14366}
14367
14368#if defined(SQLITE_ENABLE_SESSION)
14369/*
14370** Close a single OpenSession object and release all of its associated
14371** resources.
14372*/
14373static void session_close(OpenSession *pSession){
14374  int i;
14375  sqlite3session_delete(pSession->p);
14376  sqlite3_free(pSession->zName);
14377  for(i=0; i<pSession->nFilter; i++){
14378    sqlite3_free(pSession->azFilter[i]);
14379  }
14380  sqlite3_free(pSession->azFilter);
14381  memset(pSession, 0, sizeof(OpenSession));
14382}
14383#endif
14384
14385/*
14386** Close all OpenSession objects and release all associated resources.
14387*/
14388#if defined(SQLITE_ENABLE_SESSION)
14389static void session_close_all(ShellState *p){
14390  int i;
14391  for(i=0; i<p->nSession; i++){
14392    session_close(&p->aSession[i]);
14393  }
14394  p->nSession = 0;
14395}
14396#else
14397# define session_close_all(X)
14398#endif
14399
14400/*
14401** Implementation of the xFilter function for an open session.  Omit
14402** any tables named by ".session filter" but let all other table through.
14403*/
14404#if defined(SQLITE_ENABLE_SESSION)
14405static int session_filter(void *pCtx, const char *zTab){
14406  OpenSession *pSession = (OpenSession*)pCtx;
14407  int i;
14408  for(i=0; i<pSession->nFilter; i++){
14409    if( sqlite3_strglob(pSession->azFilter[i], zTab)==0 ) return 0;
14410  }
14411  return 1;
14412}
14413#endif
14414
14415/*
14416** Try to deduce the type of file for zName based on its content.  Return
14417** one of the SHELL_OPEN_* constants.
14418**
14419** If the file does not exist or is empty but its name looks like a ZIP
14420** archive and the dfltZip flag is true, then assume it is a ZIP archive.
14421** Otherwise, assume an ordinary database regardless of the filename if
14422** the type cannot be determined from content.
14423*/
14424int deduceDatabaseType(const char *zName, int dfltZip){
14425  FILE *f = fopen(zName, "rb");
14426  size_t n;
14427  int rc = SHELL_OPEN_UNSPEC;
14428  char zBuf[100];
14429  if( f==0 ){
14430    if( dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){
14431       return SHELL_OPEN_ZIPFILE;
14432    }else{
14433       return SHELL_OPEN_NORMAL;
14434    }
14435  }
14436  n = fread(zBuf, 16, 1, f);
14437  if( n==1 && memcmp(zBuf, "SQLite format 3", 16)==0 ){
14438    fclose(f);
14439    return SHELL_OPEN_NORMAL;
14440  }
14441  fseek(f, -25, SEEK_END);
14442  n = fread(zBuf, 25, 1, f);
14443  if( n==1 && memcmp(zBuf, "Start-Of-SQLite3-", 17)==0 ){
14444    rc = SHELL_OPEN_APPENDVFS;
14445  }else{
14446    fseek(f, -22, SEEK_END);
14447    n = fread(zBuf, 22, 1, f);
14448    if( n==1 && zBuf[0]==0x50 && zBuf[1]==0x4b && zBuf[2]==0x05
14449       && zBuf[3]==0x06 ){
14450      rc = SHELL_OPEN_ZIPFILE;
14451    }else if( n==0 && dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){
14452      rc = SHELL_OPEN_ZIPFILE;
14453    }
14454  }
14455  fclose(f);
14456  return rc;
14457}
14458
14459#ifdef SQLITE_ENABLE_DESERIALIZE
14460/*
14461** Reconstruct an in-memory database using the output from the "dbtotxt"
14462** program.  Read content from the file in p->zDbFilename.  If p->zDbFilename
14463** is 0, then read from standard input.
14464*/
14465static unsigned char *readHexDb(ShellState *p, int *pnData){
14466  unsigned char *a = 0;
14467  int nLine;
14468  int n = 0;
14469  int pgsz = 0;
14470  int iOffset = 0;
14471  int j, k;
14472  int rc;
14473  FILE *in;
14474  unsigned int x[16];
14475  char zLine[1000];
14476  if( p->zDbFilename ){
14477    in = fopen(p->zDbFilename, "r");
14478    if( in==0 ){
14479      utf8_printf(stderr, "cannot open \"%s\" for reading\n", p->zDbFilename);
14480      return 0;
14481    }
14482    nLine = 0;
14483  }else{
14484    in = p->in;
14485    nLine = p->lineno;
14486    if( in==0 ) in = stdin;
14487  }
14488  *pnData = 0;
14489  nLine++;
14490  if( fgets(zLine, sizeof(zLine), in)==0 ) goto readHexDb_error;
14491  rc = sscanf(zLine, "| size %d pagesize %d", &n, &pgsz);
14492  if( rc!=2 ) goto readHexDb_error;
14493  if( n<0 ) goto readHexDb_error;
14494  if( pgsz<512 || pgsz>65536 || (pgsz&(pgsz-1))!=0 ) goto readHexDb_error;
14495  n = (n+pgsz-1)&~(pgsz-1);  /* Round n up to the next multiple of pgsz */
14496  a = sqlite3_malloc( n ? n : 1 );
14497  if( a==0 ){
14498    utf8_printf(stderr, "Out of memory!\n");
14499    goto readHexDb_error;
14500  }
14501  memset(a, 0, n);
14502  if( pgsz<512 || pgsz>65536 || (pgsz & (pgsz-1))!=0 ){
14503    utf8_printf(stderr, "invalid pagesize\n");
14504    goto readHexDb_error;
14505  }
14506  for(nLine++; fgets(zLine, sizeof(zLine), in)!=0; nLine++){
14507    rc = sscanf(zLine, "| page %d offset %d", &j, &k);
14508    if( rc==2 ){
14509      iOffset = k;
14510      continue;
14511    }
14512    if( strncmp(zLine, "| end ", 6)==0 ){
14513      break;
14514    }
14515    rc = sscanf(zLine,"| %d: %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x",
14516                &j, &x[0], &x[1], &x[2], &x[3], &x[4], &x[5], &x[6], &x[7],
14517                &x[8], &x[9], &x[10], &x[11], &x[12], &x[13], &x[14], &x[15]);
14518    if( rc==17 ){
14519      k = iOffset+j;
14520      if( k+16<=n ){
14521        int ii;
14522        for(ii=0; ii<16; ii++) a[k+ii] = x[ii]&0xff;
14523      }
14524    }
14525  }
14526  *pnData = n;
14527  if( in!=p->in ){
14528    fclose(in);
14529  }else{
14530    p->lineno = nLine;
14531  }
14532  return a;
14533
14534readHexDb_error:
14535  if( in!=p->in ){
14536    fclose(in);
14537  }else{
14538    while( fgets(zLine, sizeof(zLine), p->in)!=0 ){
14539      nLine++;
14540      if(strncmp(zLine, "| end ", 6)==0 ) break;
14541    }
14542    p->lineno = nLine;
14543  }
14544  sqlite3_free(a);
14545  utf8_printf(stderr,"Error on line %d of --hexdb input\n", nLine);
14546  return 0;
14547}
14548#endif /* SQLITE_ENABLE_DESERIALIZE */
14549
14550/*
14551** Scalar function "shell_int32". The first argument to this function
14552** must be a blob. The second a non-negative integer. This function
14553** reads and returns a 32-bit big-endian integer from byte
14554** offset (4*<arg2>) of the blob.
14555*/
14556static void shellInt32(
14557  sqlite3_context *context,
14558  int argc,
14559  sqlite3_value **argv
14560){
14561  const unsigned char *pBlob;
14562  int nBlob;
14563  int iInt;
14564
14565  UNUSED_PARAMETER(argc);
14566  nBlob = sqlite3_value_bytes(argv[0]);
14567  pBlob = (const unsigned char*)sqlite3_value_blob(argv[0]);
14568  iInt = sqlite3_value_int(argv[1]);
14569
14570  if( iInt>=0 && (iInt+1)*4<=nBlob ){
14571    const unsigned char *a = &pBlob[iInt*4];
14572    sqlite3_int64 iVal = ((sqlite3_int64)a[0]<<24)
14573                       + ((sqlite3_int64)a[1]<<16)
14574                       + ((sqlite3_int64)a[2]<< 8)
14575                       + ((sqlite3_int64)a[3]<< 0);
14576    sqlite3_result_int64(context, iVal);
14577  }
14578}
14579
14580/*
14581** Scalar function "shell_idquote(X)" returns string X quoted as an identifier,
14582** using "..." with internal double-quote characters doubled.
14583*/
14584static void shellIdQuote(
14585  sqlite3_context *context,
14586  int argc,
14587  sqlite3_value **argv
14588){
14589  const char *zName = (const char*)sqlite3_value_text(argv[0]);
14590  UNUSED_PARAMETER(argc);
14591  if( zName ){
14592    char *z = sqlite3_mprintf("\"%w\"", zName);
14593    sqlite3_result_text(context, z, -1, sqlite3_free);
14594  }
14595}
14596
14597/*
14598** Scalar function "usleep(X)" invokes sqlite3_sleep(X) and returns X.
14599*/
14600static void shellUSleepFunc(
14601  sqlite3_context *context,
14602  int argcUnused,
14603  sqlite3_value **argv
14604){
14605  int sleep = sqlite3_value_int(argv[0]);
14606  (void)argcUnused;
14607  sqlite3_sleep(sleep/1000);
14608  sqlite3_result_int(context, sleep);
14609}
14610
14611/*
14612** Scalar function "shell_escape_crnl" used by the .recover command.
14613** The argument passed to this function is the output of built-in
14614** function quote(). If the first character of the input is "'",
14615** indicating that the value passed to quote() was a text value,
14616** then this function searches the input for "\n" and "\r" characters
14617** and adds a wrapper similar to the following:
14618**
14619**   replace(replace(<input>, '\n', char(10), '\r', char(13));
14620**
14621** Or, if the first character of the input is not "'", then a copy
14622** of the input is returned.
14623*/
14624static void shellEscapeCrnl(
14625  sqlite3_context *context,
14626  int argc,
14627  sqlite3_value **argv
14628){
14629  const char *zText = (const char*)sqlite3_value_text(argv[0]);
14630  UNUSED_PARAMETER(argc);
14631  if( zText[0]=='\'' ){
14632    int nText = sqlite3_value_bytes(argv[0]);
14633    int i;
14634    char zBuf1[20];
14635    char zBuf2[20];
14636    const char *zNL = 0;
14637    const char *zCR = 0;
14638    int nCR = 0;
14639    int nNL = 0;
14640
14641    for(i=0; zText[i]; i++){
14642      if( zNL==0 && zText[i]=='\n' ){
14643        zNL = unused_string(zText, "\\n", "\\012", zBuf1);
14644        nNL = (int)strlen(zNL);
14645      }
14646      if( zCR==0 && zText[i]=='\r' ){
14647        zCR = unused_string(zText, "\\r", "\\015", zBuf2);
14648        nCR = (int)strlen(zCR);
14649      }
14650    }
14651
14652    if( zNL || zCR ){
14653      int iOut = 0;
14654      i64 nMax = (nNL > nCR) ? nNL : nCR;
14655      i64 nAlloc = nMax * nText + (nMax+64)*2;
14656      char *zOut = (char*)sqlite3_malloc64(nAlloc);
14657      if( zOut==0 ){
14658        sqlite3_result_error_nomem(context);
14659        return;
14660      }
14661
14662      if( zNL && zCR ){
14663        memcpy(&zOut[iOut], "replace(replace(", 16);
14664        iOut += 16;
14665      }else{
14666        memcpy(&zOut[iOut], "replace(", 8);
14667        iOut += 8;
14668      }
14669      for(i=0; zText[i]; i++){
14670        if( zText[i]=='\n' ){
14671          memcpy(&zOut[iOut], zNL, nNL);
14672          iOut += nNL;
14673        }else if( zText[i]=='\r' ){
14674          memcpy(&zOut[iOut], zCR, nCR);
14675          iOut += nCR;
14676        }else{
14677          zOut[iOut] = zText[i];
14678          iOut++;
14679        }
14680      }
14681
14682      if( zNL ){
14683        memcpy(&zOut[iOut], ",'", 2); iOut += 2;
14684        memcpy(&zOut[iOut], zNL, nNL); iOut += nNL;
14685        memcpy(&zOut[iOut], "', char(10))", 12); iOut += 12;
14686      }
14687      if( zCR ){
14688        memcpy(&zOut[iOut], ",'", 2); iOut += 2;
14689        memcpy(&zOut[iOut], zCR, nCR); iOut += nCR;
14690        memcpy(&zOut[iOut], "', char(13))", 12); iOut += 12;
14691      }
14692
14693      sqlite3_result_text(context, zOut, iOut, SQLITE_TRANSIENT);
14694      sqlite3_free(zOut);
14695      return;
14696    }
14697  }
14698
14699  sqlite3_result_value(context, argv[0]);
14700}
14701
14702/* Flags for open_db().
14703**
14704** The default behavior of open_db() is to exit(1) if the database fails to
14705** open.  The OPEN_DB_KEEPALIVE flag changes that so that it prints an error
14706** but still returns without calling exit.
14707**
14708** The OPEN_DB_ZIPFILE flag causes open_db() to prefer to open files as a
14709** ZIP archive if the file does not exist or is empty and its name matches
14710** the *.zip pattern.
14711*/
14712#define OPEN_DB_KEEPALIVE   0x001   /* Return after error if true */
14713#define OPEN_DB_ZIPFILE     0x002   /* Open as ZIP if name matches *.zip */
14714
14715/*
14716** Make sure the database is open.  If it is not, then open it.  If
14717** the database fails to open, print an error message and exit.
14718*/
14719static void open_db(ShellState *p, int openFlags){
14720  if( p->db==0 ){
14721    if( p->openMode==SHELL_OPEN_UNSPEC ){
14722      if( p->zDbFilename==0 || p->zDbFilename[0]==0 ){
14723        p->openMode = SHELL_OPEN_NORMAL;
14724      }else{
14725        p->openMode = (u8)deduceDatabaseType(p->zDbFilename,
14726                             (openFlags & OPEN_DB_ZIPFILE)!=0);
14727      }
14728    }
14729    switch( p->openMode ){
14730      case SHELL_OPEN_APPENDVFS: {
14731        sqlite3_open_v2(p->zDbFilename, &p->db,
14732           SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, "apndvfs");
14733        break;
14734      }
14735      case SHELL_OPEN_HEXDB:
14736      case SHELL_OPEN_DESERIALIZE: {
14737        sqlite3_open(0, &p->db);
14738        break;
14739      }
14740      case SHELL_OPEN_ZIPFILE: {
14741        sqlite3_open(":memory:", &p->db);
14742        break;
14743      }
14744      case SHELL_OPEN_READONLY: {
14745        sqlite3_open_v2(p->zDbFilename, &p->db,
14746            SQLITE_OPEN_READONLY|p->openFlags, 0);
14747        break;
14748      }
14749      case SHELL_OPEN_UNSPEC:
14750      case SHELL_OPEN_NORMAL: {
14751        sqlite3_open_v2(p->zDbFilename, &p->db,
14752           SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, 0);
14753        break;
14754      }
14755    }
14756    globalDb = p->db;
14757    if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){
14758      utf8_printf(stderr,"Error: unable to open database \"%s\": %s\n",
14759          p->zDbFilename, sqlite3_errmsg(p->db));
14760      if( openFlags & OPEN_DB_KEEPALIVE ){
14761        sqlite3_open(":memory:", &p->db);
14762        return;
14763      }
14764      exit(1);
14765    }
14766#ifndef SQLITE_OMIT_LOAD_EXTENSION
14767    sqlite3_enable_load_extension(p->db, 1);
14768#endif
14769    sqlite3_fileio_init(p->db, 0, 0);
14770    sqlite3_shathree_init(p->db, 0, 0);
14771    sqlite3_completion_init(p->db, 0, 0);
14772    sqlite3_uint_init(p->db, 0, 0);
14773    sqlite3_decimal_init(p->db, 0, 0);
14774    sqlite3_ieee_init(p->db, 0, 0);
14775    sqlite3_series_init(p->db, 0, 0);
14776#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
14777    sqlite3_dbdata_init(p->db, 0, 0);
14778#endif
14779#ifdef SQLITE_HAVE_ZLIB
14780    sqlite3_zipfile_init(p->db, 0, 0);
14781    sqlite3_sqlar_init(p->db, 0, 0);
14782#endif
14783    sqlite3_create_function(p->db, "shell_add_schema", 3, SQLITE_UTF8, 0,
14784                            shellAddSchemaName, 0, 0);
14785    sqlite3_create_function(p->db, "shell_module_schema", 1, SQLITE_UTF8, 0,
14786                            shellModuleSchema, 0, 0);
14787    sqlite3_create_function(p->db, "shell_putsnl", 1, SQLITE_UTF8, p,
14788                            shellPutsFunc, 0, 0);
14789    sqlite3_create_function(p->db, "shell_escape_crnl", 1, SQLITE_UTF8, 0,
14790                            shellEscapeCrnl, 0, 0);
14791    sqlite3_create_function(p->db, "shell_int32", 2, SQLITE_UTF8, 0,
14792                            shellInt32, 0, 0);
14793    sqlite3_create_function(p->db, "shell_idquote", 1, SQLITE_UTF8, 0,
14794                            shellIdQuote, 0, 0);
14795    sqlite3_create_function(p->db, "usleep",1,SQLITE_UTF8,0,
14796                            shellUSleepFunc, 0, 0);
14797#ifndef SQLITE_NOHAVE_SYSTEM
14798    sqlite3_create_function(p->db, "edit", 1, SQLITE_UTF8, 0,
14799                            editFunc, 0, 0);
14800    sqlite3_create_function(p->db, "edit", 2, SQLITE_UTF8, 0,
14801                            editFunc, 0, 0);
14802#endif
14803    if( p->openMode==SHELL_OPEN_ZIPFILE ){
14804      char *zSql = sqlite3_mprintf(
14805         "CREATE VIRTUAL TABLE zip USING zipfile(%Q);", p->zDbFilename);
14806      sqlite3_exec(p->db, zSql, 0, 0, 0);
14807      sqlite3_free(zSql);
14808    }
14809#ifdef SQLITE_ENABLE_DESERIALIZE
14810    else
14811    if( p->openMode==SHELL_OPEN_DESERIALIZE || p->openMode==SHELL_OPEN_HEXDB ){
14812      int rc;
14813      int nData = 0;
14814      unsigned char *aData;
14815      if( p->openMode==SHELL_OPEN_DESERIALIZE ){
14816        aData = (unsigned char*)readFile(p->zDbFilename, &nData);
14817      }else{
14818        aData = readHexDb(p, &nData);
14819        if( aData==0 ){
14820          return;
14821        }
14822      }
14823      rc = sqlite3_deserialize(p->db, "main", aData, nData, nData,
14824                   SQLITE_DESERIALIZE_RESIZEABLE |
14825                   SQLITE_DESERIALIZE_FREEONCLOSE);
14826      if( rc ){
14827        utf8_printf(stderr, "Error: sqlite3_deserialize() returns %d\n", rc);
14828      }
14829      if( p->szMax>0 ){
14830        sqlite3_file_control(p->db, "main", SQLITE_FCNTL_SIZE_LIMIT, &p->szMax);
14831      }
14832    }
14833#endif
14834  }
14835}
14836
14837/*
14838** Attempt to close the databaes connection.  Report errors.
14839*/
14840void close_db(sqlite3 *db){
14841  int rc = sqlite3_close(db);
14842  if( rc ){
14843    utf8_printf(stderr, "Error: sqlite3_close() returns %d: %s\n",
14844        rc, sqlite3_errmsg(db));
14845  }
14846}
14847
14848#if HAVE_READLINE || HAVE_EDITLINE
14849/*
14850** Readline completion callbacks
14851*/
14852static char *readline_completion_generator(const char *text, int state){
14853  static sqlite3_stmt *pStmt = 0;
14854  char *zRet;
14855  if( state==0 ){
14856    char *zSql;
14857    sqlite3_finalize(pStmt);
14858    zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
14859                           "  FROM completion(%Q) ORDER BY 1", text);
14860    sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
14861    sqlite3_free(zSql);
14862  }
14863  if( sqlite3_step(pStmt)==SQLITE_ROW ){
14864    zRet = strdup((const char*)sqlite3_column_text(pStmt, 0));
14865  }else{
14866    sqlite3_finalize(pStmt);
14867    pStmt = 0;
14868    zRet = 0;
14869  }
14870  return zRet;
14871}
14872static char **readline_completion(const char *zText, int iStart, int iEnd){
14873  rl_attempted_completion_over = 1;
14874  return rl_completion_matches(zText, readline_completion_generator);
14875}
14876
14877#elif HAVE_LINENOISE
14878/*
14879** Linenoise completion callback
14880*/
14881static void linenoise_completion(const char *zLine, linenoiseCompletions *lc){
14882  int nLine = strlen30(zLine);
14883  int i, iStart;
14884  sqlite3_stmt *pStmt = 0;
14885  char *zSql;
14886  char zBuf[1000];
14887
14888  if( nLine>sizeof(zBuf)-30 ) return;
14889  if( zLine[0]=='.' || zLine[0]=='#') return;
14890  for(i=nLine-1; i>=0 && (isalnum(zLine[i]) || zLine[i]=='_'); i--){}
14891  if( i==nLine-1 ) return;
14892  iStart = i+1;
14893  memcpy(zBuf, zLine, iStart);
14894  zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
14895                         "  FROM completion(%Q,%Q) ORDER BY 1",
14896                         &zLine[iStart], zLine);
14897  sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
14898  sqlite3_free(zSql);
14899  sqlite3_exec(globalDb, "PRAGMA page_count", 0, 0, 0); /* Load the schema */
14900  while( sqlite3_step(pStmt)==SQLITE_ROW ){
14901    const char *zCompletion = (const char*)sqlite3_column_text(pStmt, 0);
14902    int nCompletion = sqlite3_column_bytes(pStmt, 0);
14903    if( iStart+nCompletion < sizeof(zBuf)-1 ){
14904      memcpy(zBuf+iStart, zCompletion, nCompletion+1);
14905      linenoiseAddCompletion(lc, zBuf);
14906    }
14907  }
14908  sqlite3_finalize(pStmt);
14909}
14910#endif
14911
14912/*
14913** Do C-language style dequoting.
14914**
14915**    \a    -> alarm
14916**    \b    -> backspace
14917**    \t    -> tab
14918**    \n    -> newline
14919**    \v    -> vertical tab
14920**    \f    -> form feed
14921**    \r    -> carriage return
14922**    \s    -> space
14923**    \"    -> "
14924**    \'    -> '
14925**    \\    -> backslash
14926**    \NNN  -> ascii character NNN in octal
14927*/
14928static void resolve_backslashes(char *z){
14929  int i, j;
14930  char c;
14931  while( *z && *z!='\\' ) z++;
14932  for(i=j=0; (c = z[i])!=0; i++, j++){
14933    if( c=='\\' && z[i+1]!=0 ){
14934      c = z[++i];
14935      if( c=='a' ){
14936        c = '\a';
14937      }else if( c=='b' ){
14938        c = '\b';
14939      }else if( c=='t' ){
14940        c = '\t';
14941      }else if( c=='n' ){
14942        c = '\n';
14943      }else if( c=='v' ){
14944        c = '\v';
14945      }else if( c=='f' ){
14946        c = '\f';
14947      }else if( c=='r' ){
14948        c = '\r';
14949      }else if( c=='"' ){
14950        c = '"';
14951      }else if( c=='\'' ){
14952        c = '\'';
14953      }else if( c=='\\' ){
14954        c = '\\';
14955      }else if( c>='0' && c<='7' ){
14956        c -= '0';
14957        if( z[i+1]>='0' && z[i+1]<='7' ){
14958          i++;
14959          c = (c<<3) + z[i] - '0';
14960          if( z[i+1]>='0' && z[i+1]<='7' ){
14961            i++;
14962            c = (c<<3) + z[i] - '0';
14963          }
14964        }
14965      }
14966    }
14967    z[j] = c;
14968  }
14969  if( j<i ) z[j] = 0;
14970}
14971
14972/*
14973** Interpret zArg as either an integer or a boolean value.  Return 1 or 0
14974** for TRUE and FALSE.  Return the integer value if appropriate.
14975*/
14976static int booleanValue(const char *zArg){
14977  int i;
14978  if( zArg[0]=='0' && zArg[1]=='x' ){
14979    for(i=2; hexDigitValue(zArg[i])>=0; i++){}
14980  }else{
14981    for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
14982  }
14983  if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
14984  if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
14985    return 1;
14986  }
14987  if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
14988    return 0;
14989  }
14990  utf8_printf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
14991          zArg);
14992  return 0;
14993}
14994
14995/*
14996** Set or clear a shell flag according to a boolean value.
14997*/
14998static void setOrClearFlag(ShellState *p, unsigned mFlag, const char *zArg){
14999  if( booleanValue(zArg) ){
15000    ShellSetFlag(p, mFlag);
15001  }else{
15002    ShellClearFlag(p, mFlag);
15003  }
15004}
15005
15006/*
15007** Close an output file, assuming it is not stderr or stdout
15008*/
15009static void output_file_close(FILE *f){
15010  if( f && f!=stdout && f!=stderr ) fclose(f);
15011}
15012
15013/*
15014** Try to open an output file.   The names "stdout" and "stderr" are
15015** recognized and do the right thing.  NULL is returned if the output
15016** filename is "off".
15017*/
15018static FILE *output_file_open(const char *zFile, int bTextMode){
15019  FILE *f;
15020  if( strcmp(zFile,"stdout")==0 ){
15021    f = stdout;
15022  }else if( strcmp(zFile, "stderr")==0 ){
15023    f = stderr;
15024  }else if( strcmp(zFile, "off")==0 ){
15025    f = 0;
15026  }else{
15027    f = fopen(zFile, bTextMode ? "w" : "wb");
15028    if( f==0 ){
15029      utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
15030    }
15031  }
15032  return f;
15033}
15034
15035#ifndef SQLITE_OMIT_TRACE
15036/*
15037** A routine for handling output from sqlite3_trace().
15038*/
15039static int sql_trace_callback(
15040  unsigned mType,         /* The trace type */
15041  void *pArg,             /* The ShellState pointer */
15042  void *pP,               /* Usually a pointer to sqlite_stmt */
15043  void *pX                /* Auxiliary output */
15044){
15045  ShellState *p = (ShellState*)pArg;
15046  sqlite3_stmt *pStmt;
15047  const char *zSql;
15048  int nSql;
15049  if( p->traceOut==0 ) return 0;
15050  if( mType==SQLITE_TRACE_CLOSE ){
15051    utf8_printf(p->traceOut, "-- closing database connection\n");
15052    return 0;
15053  }
15054  if( mType!=SQLITE_TRACE_ROW && ((const char*)pX)[0]=='-' ){
15055    zSql = (const char*)pX;
15056  }else{
15057    pStmt = (sqlite3_stmt*)pP;
15058    switch( p->eTraceType ){
15059      case SHELL_TRACE_EXPANDED: {
15060        zSql = sqlite3_expanded_sql(pStmt);
15061        break;
15062      }
15063#ifdef SQLITE_ENABLE_NORMALIZE
15064      case SHELL_TRACE_NORMALIZED: {
15065        zSql = sqlite3_normalized_sql(pStmt);
15066        break;
15067      }
15068#endif
15069      default: {
15070        zSql = sqlite3_sql(pStmt);
15071        break;
15072      }
15073    }
15074  }
15075  if( zSql==0 ) return 0;
15076  nSql = strlen30(zSql);
15077  while( nSql>0 && zSql[nSql-1]==';' ){ nSql--; }
15078  switch( mType ){
15079    case SQLITE_TRACE_ROW:
15080    case SQLITE_TRACE_STMT: {
15081      utf8_printf(p->traceOut, "%.*s;\n", nSql, zSql);
15082      break;
15083    }
15084    case SQLITE_TRACE_PROFILE: {
15085      sqlite3_int64 nNanosec = *(sqlite3_int64*)pX;
15086      utf8_printf(p->traceOut, "%.*s; -- %lld ns\n", nSql, zSql, nNanosec);
15087      break;
15088    }
15089  }
15090  return 0;
15091}
15092#endif
15093
15094/*
15095** A no-op routine that runs with the ".breakpoint" doc-command.  This is
15096** a useful spot to set a debugger breakpoint.
15097*/
15098static void test_breakpoint(void){
15099  static int nCall = 0;
15100  nCall++;
15101}
15102
15103/*
15104** An object used to read a CSV and other files for import.
15105*/
15106typedef struct ImportCtx ImportCtx;
15107struct ImportCtx {
15108  const char *zFile;  /* Name of the input file */
15109  FILE *in;           /* Read the CSV text from this input stream */
15110  int (SQLITE_CDECL *xCloser)(FILE*);      /* Func to close in */
15111  char *z;            /* Accumulated text for a field */
15112  int n;              /* Number of bytes in z */
15113  int nAlloc;         /* Space allocated for z[] */
15114  int nLine;          /* Current line number */
15115  int nRow;           /* Number of rows imported */
15116  int nErr;           /* Number of errors encountered */
15117  int bNotFirst;      /* True if one or more bytes already read */
15118  int cTerm;          /* Character that terminated the most recent field */
15119  int cColSep;        /* The column separator character.  (Usually ",") */
15120  int cRowSep;        /* The row separator character.  (Usually "\n") */
15121};
15122
15123/* Clean up resourced used by an ImportCtx */
15124static void import_cleanup(ImportCtx *p){
15125  if( p->in!=0 && p->xCloser!=0 ){
15126    p->xCloser(p->in);
15127    p->in = 0;
15128  }
15129  sqlite3_free(p->z);
15130  p->z = 0;
15131}
15132
15133/* Append a single byte to z[] */
15134static void import_append_char(ImportCtx *p, int c){
15135  if( p->n+1>=p->nAlloc ){
15136    p->nAlloc += p->nAlloc + 100;
15137    p->z = sqlite3_realloc64(p->z, p->nAlloc);
15138    if( p->z==0 ) shell_out_of_memory();
15139  }
15140  p->z[p->n++] = (char)c;
15141}
15142
15143/* Read a single field of CSV text.  Compatible with rfc4180 and extended
15144** with the option of having a separator other than ",".
15145**
15146**   +  Input comes from p->in.
15147**   +  Store results in p->z of length p->n.  Space to hold p->z comes
15148**      from sqlite3_malloc64().
15149**   +  Use p->cSep as the column separator.  The default is ",".
15150**   +  Use p->rSep as the row separator.  The default is "\n".
15151**   +  Keep track of the line number in p->nLine.
15152**   +  Store the character that terminates the field in p->cTerm.  Store
15153**      EOF on end-of-file.
15154**   +  Report syntax errors on stderr
15155*/
15156static char *SQLITE_CDECL csv_read_one_field(ImportCtx *p){
15157  int c;
15158  int cSep = p->cColSep;
15159  int rSep = p->cRowSep;
15160  p->n = 0;
15161  c = fgetc(p->in);
15162  if( c==EOF || seenInterrupt ){
15163    p->cTerm = EOF;
15164    return 0;
15165  }
15166  if( c=='"' ){
15167    int pc, ppc;
15168    int startLine = p->nLine;
15169    int cQuote = c;
15170    pc = ppc = 0;
15171    while( 1 ){
15172      c = fgetc(p->in);
15173      if( c==rSep ) p->nLine++;
15174      if( c==cQuote ){
15175        if( pc==cQuote ){
15176          pc = 0;
15177          continue;
15178        }
15179      }
15180      if( (c==cSep && pc==cQuote)
15181       || (c==rSep && pc==cQuote)
15182       || (c==rSep && pc=='\r' && ppc==cQuote)
15183       || (c==EOF && pc==cQuote)
15184      ){
15185        do{ p->n--; }while( p->z[p->n]!=cQuote );
15186        p->cTerm = c;
15187        break;
15188      }
15189      if( pc==cQuote && c!='\r' ){
15190        utf8_printf(stderr, "%s:%d: unescaped %c character\n",
15191                p->zFile, p->nLine, cQuote);
15192      }
15193      if( c==EOF ){
15194        utf8_printf(stderr, "%s:%d: unterminated %c-quoted field\n",
15195                p->zFile, startLine, cQuote);
15196        p->cTerm = c;
15197        break;
15198      }
15199      import_append_char(p, c);
15200      ppc = pc;
15201      pc = c;
15202    }
15203  }else{
15204    /* If this is the first field being parsed and it begins with the
15205    ** UTF-8 BOM  (0xEF BB BF) then skip the BOM */
15206    if( (c&0xff)==0xef && p->bNotFirst==0 ){
15207      import_append_char(p, c);
15208      c = fgetc(p->in);
15209      if( (c&0xff)==0xbb ){
15210        import_append_char(p, c);
15211        c = fgetc(p->in);
15212        if( (c&0xff)==0xbf ){
15213          p->bNotFirst = 1;
15214          p->n = 0;
15215          return csv_read_one_field(p);
15216        }
15217      }
15218    }
15219    while( c!=EOF && c!=cSep && c!=rSep ){
15220      import_append_char(p, c);
15221      c = fgetc(p->in);
15222    }
15223    if( c==rSep ){
15224      p->nLine++;
15225      if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
15226    }
15227    p->cTerm = c;
15228  }
15229  if( p->z ) p->z[p->n] = 0;
15230  p->bNotFirst = 1;
15231  return p->z;
15232}
15233
15234/* Read a single field of ASCII delimited text.
15235**
15236**   +  Input comes from p->in.
15237**   +  Store results in p->z of length p->n.  Space to hold p->z comes
15238**      from sqlite3_malloc64().
15239**   +  Use p->cSep as the column separator.  The default is "\x1F".
15240**   +  Use p->rSep as the row separator.  The default is "\x1E".
15241**   +  Keep track of the row number in p->nLine.
15242**   +  Store the character that terminates the field in p->cTerm.  Store
15243**      EOF on end-of-file.
15244**   +  Report syntax errors on stderr
15245*/
15246static char *SQLITE_CDECL ascii_read_one_field(ImportCtx *p){
15247  int c;
15248  int cSep = p->cColSep;
15249  int rSep = p->cRowSep;
15250  p->n = 0;
15251  c = fgetc(p->in);
15252  if( c==EOF || seenInterrupt ){
15253    p->cTerm = EOF;
15254    return 0;
15255  }
15256  while( c!=EOF && c!=cSep && c!=rSep ){
15257    import_append_char(p, c);
15258    c = fgetc(p->in);
15259  }
15260  if( c==rSep ){
15261    p->nLine++;
15262  }
15263  p->cTerm = c;
15264  if( p->z ) p->z[p->n] = 0;
15265  return p->z;
15266}
15267
15268/*
15269** Try to transfer data for table zTable.  If an error is seen while
15270** moving forward, try to go backwards.  The backwards movement won't
15271** work for WITHOUT ROWID tables.
15272*/
15273static void tryToCloneData(
15274  ShellState *p,
15275  sqlite3 *newDb,
15276  const char *zTable
15277){
15278  sqlite3_stmt *pQuery = 0;
15279  sqlite3_stmt *pInsert = 0;
15280  char *zQuery = 0;
15281  char *zInsert = 0;
15282  int rc;
15283  int i, j, n;
15284  int nTable = strlen30(zTable);
15285  int k = 0;
15286  int cnt = 0;
15287  const int spinRate = 10000;
15288
15289  zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
15290  rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
15291  if( rc ){
15292    utf8_printf(stderr, "Error %d: %s on [%s]\n",
15293            sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
15294            zQuery);
15295    goto end_data_xfer;
15296  }
15297  n = sqlite3_column_count(pQuery);
15298  zInsert = sqlite3_malloc64(200 + nTable + n*3);
15299  if( zInsert==0 ) shell_out_of_memory();
15300  sqlite3_snprintf(200+nTable,zInsert,
15301                   "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
15302  i = strlen30(zInsert);
15303  for(j=1; j<n; j++){
15304    memcpy(zInsert+i, ",?", 2);
15305    i += 2;
15306  }
15307  memcpy(zInsert+i, ");", 3);
15308  rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
15309  if( rc ){
15310    utf8_printf(stderr, "Error %d: %s on [%s]\n",
15311            sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
15312            zQuery);
15313    goto end_data_xfer;
15314  }
15315  for(k=0; k<2; k++){
15316    while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
15317      for(i=0; i<n; i++){
15318        switch( sqlite3_column_type(pQuery, i) ){
15319          case SQLITE_NULL: {
15320            sqlite3_bind_null(pInsert, i+1);
15321            break;
15322          }
15323          case SQLITE_INTEGER: {
15324            sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
15325            break;
15326          }
15327          case SQLITE_FLOAT: {
15328            sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
15329            break;
15330          }
15331          case SQLITE_TEXT: {
15332            sqlite3_bind_text(pInsert, i+1,
15333                             (const char*)sqlite3_column_text(pQuery,i),
15334                             -1, SQLITE_STATIC);
15335            break;
15336          }
15337          case SQLITE_BLOB: {
15338            sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
15339                                            sqlite3_column_bytes(pQuery,i),
15340                                            SQLITE_STATIC);
15341            break;
15342          }
15343        }
15344      } /* End for */
15345      rc = sqlite3_step(pInsert);
15346      if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
15347        utf8_printf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
15348                        sqlite3_errmsg(newDb));
15349      }
15350      sqlite3_reset(pInsert);
15351      cnt++;
15352      if( (cnt%spinRate)==0 ){
15353        printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
15354        fflush(stdout);
15355      }
15356    } /* End while */
15357    if( rc==SQLITE_DONE ) break;
15358    sqlite3_finalize(pQuery);
15359    sqlite3_free(zQuery);
15360    zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
15361                             zTable);
15362    rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
15363    if( rc ){
15364      utf8_printf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
15365      break;
15366    }
15367  } /* End for(k=0...) */
15368
15369end_data_xfer:
15370  sqlite3_finalize(pQuery);
15371  sqlite3_finalize(pInsert);
15372  sqlite3_free(zQuery);
15373  sqlite3_free(zInsert);
15374}
15375
15376
15377/*
15378** Try to transfer all rows of the schema that match zWhere.  For
15379** each row, invoke xForEach() on the object defined by that row.
15380** If an error is encountered while moving forward through the
15381** sqlite_schema table, try again moving backwards.
15382*/
15383static void tryToCloneSchema(
15384  ShellState *p,
15385  sqlite3 *newDb,
15386  const char *zWhere,
15387  void (*xForEach)(ShellState*,sqlite3*,const char*)
15388){
15389  sqlite3_stmt *pQuery = 0;
15390  char *zQuery = 0;
15391  int rc;
15392  const unsigned char *zName;
15393  const unsigned char *zSql;
15394  char *zErrMsg = 0;
15395
15396  zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_schema"
15397                           " WHERE %s", zWhere);
15398  rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
15399  if( rc ){
15400    utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
15401                    sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
15402                    zQuery);
15403    goto end_schema_xfer;
15404  }
15405  while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
15406    zName = sqlite3_column_text(pQuery, 0);
15407    zSql = sqlite3_column_text(pQuery, 1);
15408    printf("%s... ", zName); fflush(stdout);
15409    sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
15410    if( zErrMsg ){
15411      utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
15412      sqlite3_free(zErrMsg);
15413      zErrMsg = 0;
15414    }
15415    if( xForEach ){
15416      xForEach(p, newDb, (const char*)zName);
15417    }
15418    printf("done\n");
15419  }
15420  if( rc!=SQLITE_DONE ){
15421    sqlite3_finalize(pQuery);
15422    sqlite3_free(zQuery);
15423    zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_schema"
15424                             " WHERE %s ORDER BY rowid DESC", zWhere);
15425    rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
15426    if( rc ){
15427      utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
15428                      sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
15429                      zQuery);
15430      goto end_schema_xfer;
15431    }
15432    while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
15433      zName = sqlite3_column_text(pQuery, 0);
15434      zSql = sqlite3_column_text(pQuery, 1);
15435      printf("%s... ", zName); fflush(stdout);
15436      sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
15437      if( zErrMsg ){
15438        utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
15439        sqlite3_free(zErrMsg);
15440        zErrMsg = 0;
15441      }
15442      if( xForEach ){
15443        xForEach(p, newDb, (const char*)zName);
15444      }
15445      printf("done\n");
15446    }
15447  }
15448end_schema_xfer:
15449  sqlite3_finalize(pQuery);
15450  sqlite3_free(zQuery);
15451}
15452
15453/*
15454** Open a new database file named "zNewDb".  Try to recover as much information
15455** as possible out of the main database (which might be corrupt) and write it
15456** into zNewDb.
15457*/
15458static void tryToClone(ShellState *p, const char *zNewDb){
15459  int rc;
15460  sqlite3 *newDb = 0;
15461  if( access(zNewDb,0)==0 ){
15462    utf8_printf(stderr, "File \"%s\" already exists.\n", zNewDb);
15463    return;
15464  }
15465  rc = sqlite3_open(zNewDb, &newDb);
15466  if( rc ){
15467    utf8_printf(stderr, "Cannot create output database: %s\n",
15468            sqlite3_errmsg(newDb));
15469  }else{
15470    sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0);
15471    sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
15472    tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
15473    tryToCloneSchema(p, newDb, "type!='table'", 0);
15474    sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
15475    sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
15476  }
15477  close_db(newDb);
15478}
15479
15480/*
15481** Change the output file back to stdout.
15482**
15483** If the p->doXdgOpen flag is set, that means the output was being
15484** redirected to a temporary file named by p->zTempFile.  In that case,
15485** launch start/open/xdg-open on that temporary file.
15486*/
15487static void output_reset(ShellState *p){
15488  if( p->outfile[0]=='|' ){
15489#ifndef SQLITE_OMIT_POPEN
15490    pclose(p->out);
15491#endif
15492  }else{
15493    output_file_close(p->out);
15494#ifndef SQLITE_NOHAVE_SYSTEM
15495    if( p->doXdgOpen ){
15496      const char *zXdgOpenCmd =
15497#if defined(_WIN32)
15498      "start";
15499#elif defined(__APPLE__)
15500      "open";
15501#else
15502      "xdg-open";
15503#endif
15504      char *zCmd;
15505      zCmd = sqlite3_mprintf("%s %s", zXdgOpenCmd, p->zTempFile);
15506      if( system(zCmd) ){
15507        utf8_printf(stderr, "Failed: [%s]\n", zCmd);
15508      }else{
15509        /* Give the start/open/xdg-open command some time to get
15510        ** going before we continue, and potential delete the
15511        ** p->zTempFile data file out from under it */
15512        sqlite3_sleep(2000);
15513      }
15514      sqlite3_free(zCmd);
15515      outputModePop(p);
15516      p->doXdgOpen = 0;
15517    }
15518#endif /* !defined(SQLITE_NOHAVE_SYSTEM) */
15519  }
15520  p->outfile[0] = 0;
15521  p->out = stdout;
15522}
15523
15524/*
15525** Run an SQL command and return the single integer result.
15526*/
15527static int db_int(ShellState *p, const char *zSql){
15528  sqlite3_stmt *pStmt;
15529  int res = 0;
15530  sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
15531  if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){
15532    res = sqlite3_column_int(pStmt,0);
15533  }
15534  sqlite3_finalize(pStmt);
15535  return res;
15536}
15537
15538/*
15539** Convert a 2-byte or 4-byte big-endian integer into a native integer
15540*/
15541static unsigned int get2byteInt(unsigned char *a){
15542  return (a[0]<<8) + a[1];
15543}
15544static unsigned int get4byteInt(unsigned char *a){
15545  return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3];
15546}
15547
15548/*
15549** Implementation of the ".dbinfo" command.
15550**
15551** Return 1 on error, 2 to exit, and 0 otherwise.
15552*/
15553static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){
15554  static const struct { const char *zName; int ofst; } aField[] = {
15555     { "file change counter:",  24  },
15556     { "database page count:",  28  },
15557     { "freelist page count:",  36  },
15558     { "schema cookie:",        40  },
15559     { "schema format:",        44  },
15560     { "default cache size:",   48  },
15561     { "autovacuum top root:",  52  },
15562     { "incremental vacuum:",   64  },
15563     { "text encoding:",        56  },
15564     { "user version:",         60  },
15565     { "application id:",       68  },
15566     { "software version:",     96  },
15567  };
15568  static const struct { const char *zName; const char *zSql; } aQuery[] = {
15569     { "number of tables:",
15570       "SELECT count(*) FROM %s WHERE type='table'" },
15571     { "number of indexes:",
15572       "SELECT count(*) FROM %s WHERE type='index'" },
15573     { "number of triggers:",
15574       "SELECT count(*) FROM %s WHERE type='trigger'" },
15575     { "number of views:",
15576       "SELECT count(*) FROM %s WHERE type='view'" },
15577     { "schema size:",
15578       "SELECT total(length(sql)) FROM %s" },
15579  };
15580  int i, rc;
15581  unsigned iDataVersion;
15582  char *zSchemaTab;
15583  char *zDb = nArg>=2 ? azArg[1] : "main";
15584  sqlite3_stmt *pStmt = 0;
15585  unsigned char aHdr[100];
15586  open_db(p, 0);
15587  if( p->db==0 ) return 1;
15588  rc = sqlite3_prepare_v2(p->db,
15589             "SELECT data FROM sqlite_dbpage(?1) WHERE pgno=1",
15590             -1, &pStmt, 0);
15591  if( rc ){
15592    utf8_printf(stderr, "error: %s\n", sqlite3_errmsg(p->db));
15593    sqlite3_finalize(pStmt);
15594    return 1;
15595  }
15596  sqlite3_bind_text(pStmt, 1, zDb, -1, SQLITE_STATIC);
15597  if( sqlite3_step(pStmt)==SQLITE_ROW
15598   && sqlite3_column_bytes(pStmt,0)>100
15599  ){
15600    memcpy(aHdr, sqlite3_column_blob(pStmt,0), 100);
15601    sqlite3_finalize(pStmt);
15602  }else{
15603    raw_printf(stderr, "unable to read database header\n");
15604    sqlite3_finalize(pStmt);
15605    return 1;
15606  }
15607  i = get2byteInt(aHdr+16);
15608  if( i==1 ) i = 65536;
15609  utf8_printf(p->out, "%-20s %d\n", "database page size:", i);
15610  utf8_printf(p->out, "%-20s %d\n", "write format:", aHdr[18]);
15611  utf8_printf(p->out, "%-20s %d\n", "read format:", aHdr[19]);
15612  utf8_printf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]);
15613  for(i=0; i<ArraySize(aField); i++){
15614    int ofst = aField[i].ofst;
15615    unsigned int val = get4byteInt(aHdr + ofst);
15616    utf8_printf(p->out, "%-20s %u", aField[i].zName, val);
15617    switch( ofst ){
15618      case 56: {
15619        if( val==1 ) raw_printf(p->out, " (utf8)");
15620        if( val==2 ) raw_printf(p->out, " (utf16le)");
15621        if( val==3 ) raw_printf(p->out, " (utf16be)");
15622      }
15623    }
15624    raw_printf(p->out, "\n");
15625  }
15626  if( zDb==0 ){
15627    zSchemaTab = sqlite3_mprintf("main.sqlite_schema");
15628  }else if( strcmp(zDb,"temp")==0 ){
15629    zSchemaTab = sqlite3_mprintf("%s", "sqlite_temp_schema");
15630  }else{
15631    zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_schema", zDb);
15632  }
15633  for(i=0; i<ArraySize(aQuery); i++){
15634    char *zSql = sqlite3_mprintf(aQuery[i].zSql, zSchemaTab);
15635    int val = db_int(p, zSql);
15636    sqlite3_free(zSql);
15637    utf8_printf(p->out, "%-20s %d\n", aQuery[i].zName, val);
15638  }
15639  sqlite3_free(zSchemaTab);
15640  sqlite3_file_control(p->db, zDb, SQLITE_FCNTL_DATA_VERSION, &iDataVersion);
15641  utf8_printf(p->out, "%-20s %u\n", "data version", iDataVersion);
15642  return 0;
15643}
15644
15645/*
15646** Print the current sqlite3_errmsg() value to stderr and return 1.
15647*/
15648static int shellDatabaseError(sqlite3 *db){
15649  const char *zErr = sqlite3_errmsg(db);
15650  utf8_printf(stderr, "Error: %s\n", zErr);
15651  return 1;
15652}
15653
15654/*
15655** Compare the pattern in zGlob[] against the text in z[].  Return TRUE
15656** if they match and FALSE (0) if they do not match.
15657**
15658** Globbing rules:
15659**
15660**      '*'       Matches any sequence of zero or more characters.
15661**
15662**      '?'       Matches exactly one character.
15663**
15664**     [...]      Matches one character from the enclosed list of
15665**                characters.
15666**
15667**     [^...]     Matches one character not in the enclosed list.
15668**
15669**      '#'       Matches any sequence of one or more digits with an
15670**                optional + or - sign in front
15671**
15672**      ' '       Any span of whitespace matches any other span of
15673**                whitespace.
15674**
15675** Extra whitespace at the end of z[] is ignored.
15676*/
15677static int testcase_glob(const char *zGlob, const char *z){
15678  int c, c2;
15679  int invert;
15680  int seen;
15681
15682  while( (c = (*(zGlob++)))!=0 ){
15683    if( IsSpace(c) ){
15684      if( !IsSpace(*z) ) return 0;
15685      while( IsSpace(*zGlob) ) zGlob++;
15686      while( IsSpace(*z) ) z++;
15687    }else if( c=='*' ){
15688      while( (c=(*(zGlob++))) == '*' || c=='?' ){
15689        if( c=='?' && (*(z++))==0 ) return 0;
15690      }
15691      if( c==0 ){
15692        return 1;
15693      }else if( c=='[' ){
15694        while( *z && testcase_glob(zGlob-1,z)==0 ){
15695          z++;
15696        }
15697        return (*z)!=0;
15698      }
15699      while( (c2 = (*(z++)))!=0 ){
15700        while( c2!=c ){
15701          c2 = *(z++);
15702          if( c2==0 ) return 0;
15703        }
15704        if( testcase_glob(zGlob,z) ) return 1;
15705      }
15706      return 0;
15707    }else if( c=='?' ){
15708      if( (*(z++))==0 ) return 0;
15709    }else if( c=='[' ){
15710      int prior_c = 0;
15711      seen = 0;
15712      invert = 0;
15713      c = *(z++);
15714      if( c==0 ) return 0;
15715      c2 = *(zGlob++);
15716      if( c2=='^' ){
15717        invert = 1;
15718        c2 = *(zGlob++);
15719      }
15720      if( c2==']' ){
15721        if( c==']' ) seen = 1;
15722        c2 = *(zGlob++);
15723      }
15724      while( c2 && c2!=']' ){
15725        if( c2=='-' && zGlob[0]!=']' && zGlob[0]!=0 && prior_c>0 ){
15726          c2 = *(zGlob++);
15727          if( c>=prior_c && c<=c2 ) seen = 1;
15728          prior_c = 0;
15729        }else{
15730          if( c==c2 ){
15731            seen = 1;
15732          }
15733          prior_c = c2;
15734        }
15735        c2 = *(zGlob++);
15736      }
15737      if( c2==0 || (seen ^ invert)==0 ) return 0;
15738    }else if( c=='#' ){
15739      if( (z[0]=='-' || z[0]=='+') && IsDigit(z[1]) ) z++;
15740      if( !IsDigit(z[0]) ) return 0;
15741      z++;
15742      while( IsDigit(z[0]) ){ z++; }
15743    }else{
15744      if( c!=(*(z++)) ) return 0;
15745    }
15746  }
15747  while( IsSpace(*z) ){ z++; }
15748  return *z==0;
15749}
15750
15751
15752/*
15753** Compare the string as a command-line option with either one or two
15754** initial "-" characters.
15755*/
15756static int optionMatch(const char *zStr, const char *zOpt){
15757  if( zStr[0]!='-' ) return 0;
15758  zStr++;
15759  if( zStr[0]=='-' ) zStr++;
15760  return strcmp(zStr, zOpt)==0;
15761}
15762
15763/*
15764** Delete a file.
15765*/
15766int shellDeleteFile(const char *zFilename){
15767  int rc;
15768#ifdef _WIN32
15769  wchar_t *z = sqlite3_win32_utf8_to_unicode(zFilename);
15770  rc = _wunlink(z);
15771  sqlite3_free(z);
15772#else
15773  rc = unlink(zFilename);
15774#endif
15775  return rc;
15776}
15777
15778/*
15779** Try to delete the temporary file (if there is one) and free the
15780** memory used to hold the name of the temp file.
15781*/
15782static void clearTempFile(ShellState *p){
15783  if( p->zTempFile==0 ) return;
15784  if( p->doXdgOpen ) return;
15785  if( shellDeleteFile(p->zTempFile) ) return;
15786  sqlite3_free(p->zTempFile);
15787  p->zTempFile = 0;
15788}
15789
15790/*
15791** Create a new temp file name with the given suffix.
15792*/
15793static void newTempFile(ShellState *p, const char *zSuffix){
15794  clearTempFile(p);
15795  sqlite3_free(p->zTempFile);
15796  p->zTempFile = 0;
15797  if( p->db ){
15798    sqlite3_file_control(p->db, 0, SQLITE_FCNTL_TEMPFILENAME, &p->zTempFile);
15799  }
15800  if( p->zTempFile==0 ){
15801    /* If p->db is an in-memory database then the TEMPFILENAME file-control
15802    ** will not work and we will need to fallback to guessing */
15803    char *zTemp;
15804    sqlite3_uint64 r;
15805    sqlite3_randomness(sizeof(r), &r);
15806    zTemp = getenv("TEMP");
15807    if( zTemp==0 ) zTemp = getenv("TMP");
15808    if( zTemp==0 ){
15809#ifdef _WIN32
15810      zTemp = "\\tmp";
15811#else
15812      zTemp = "/tmp";
15813#endif
15814    }
15815    p->zTempFile = sqlite3_mprintf("%s/temp%llx.%s", zTemp, r, zSuffix);
15816  }else{
15817    p->zTempFile = sqlite3_mprintf("%z.%s", p->zTempFile, zSuffix);
15818  }
15819  if( p->zTempFile==0 ){
15820    raw_printf(stderr, "out of memory\n");
15821    exit(1);
15822  }
15823}
15824
15825
15826/*
15827** The implementation of SQL scalar function fkey_collate_clause(), used
15828** by the ".lint fkey-indexes" command. This scalar function is always
15829** called with four arguments - the parent table name, the parent column name,
15830** the child table name and the child column name.
15831**
15832**   fkey_collate_clause('parent-tab', 'parent-col', 'child-tab', 'child-col')
15833**
15834** If either of the named tables or columns do not exist, this function
15835** returns an empty string. An empty string is also returned if both tables
15836** and columns exist but have the same default collation sequence. Or,
15837** if both exist but the default collation sequences are different, this
15838** function returns the string " COLLATE <parent-collation>", where
15839** <parent-collation> is the default collation sequence of the parent column.
15840*/
15841static void shellFkeyCollateClause(
15842  sqlite3_context *pCtx,
15843  int nVal,
15844  sqlite3_value **apVal
15845){
15846  sqlite3 *db = sqlite3_context_db_handle(pCtx);
15847  const char *zParent;
15848  const char *zParentCol;
15849  const char *zParentSeq;
15850  const char *zChild;
15851  const char *zChildCol;
15852  const char *zChildSeq = 0;  /* Initialize to avoid false-positive warning */
15853  int rc;
15854
15855  assert( nVal==4 );
15856  zParent = (const char*)sqlite3_value_text(apVal[0]);
15857  zParentCol = (const char*)sqlite3_value_text(apVal[1]);
15858  zChild = (const char*)sqlite3_value_text(apVal[2]);
15859  zChildCol = (const char*)sqlite3_value_text(apVal[3]);
15860
15861  sqlite3_result_text(pCtx, "", -1, SQLITE_STATIC);
15862  rc = sqlite3_table_column_metadata(
15863      db, "main", zParent, zParentCol, 0, &zParentSeq, 0, 0, 0
15864  );
15865  if( rc==SQLITE_OK ){
15866    rc = sqlite3_table_column_metadata(
15867        db, "main", zChild, zChildCol, 0, &zChildSeq, 0, 0, 0
15868    );
15869  }
15870
15871  if( rc==SQLITE_OK && sqlite3_stricmp(zParentSeq, zChildSeq) ){
15872    char *z = sqlite3_mprintf(" COLLATE %s", zParentSeq);
15873    sqlite3_result_text(pCtx, z, -1, SQLITE_TRANSIENT);
15874    sqlite3_free(z);
15875  }
15876}
15877
15878
15879/*
15880** The implementation of dot-command ".lint fkey-indexes".
15881*/
15882static int lintFkeyIndexes(
15883  ShellState *pState,             /* Current shell tool state */
15884  char **azArg,                   /* Array of arguments passed to dot command */
15885  int nArg                        /* Number of entries in azArg[] */
15886){
15887  sqlite3 *db = pState->db;       /* Database handle to query "main" db of */
15888  FILE *out = pState->out;        /* Stream to write non-error output to */
15889  int bVerbose = 0;               /* If -verbose is present */
15890  int bGroupByParent = 0;         /* If -groupbyparent is present */
15891  int i;                          /* To iterate through azArg[] */
15892  const char *zIndent = "";       /* How much to indent CREATE INDEX by */
15893  int rc;                         /* Return code */
15894  sqlite3_stmt *pSql = 0;         /* Compiled version of SQL statement below */
15895
15896  /*
15897  ** This SELECT statement returns one row for each foreign key constraint
15898  ** in the schema of the main database. The column values are:
15899  **
15900  ** 0. The text of an SQL statement similar to:
15901  **
15902  **      "EXPLAIN QUERY PLAN SELECT 1 FROM child_table WHERE child_key=?"
15903  **
15904  **    This SELECT is similar to the one that the foreign keys implementation
15905  **    needs to run internally on child tables. If there is an index that can
15906  **    be used to optimize this query, then it can also be used by the FK
15907  **    implementation to optimize DELETE or UPDATE statements on the parent
15908  **    table.
15909  **
15910  ** 1. A GLOB pattern suitable for sqlite3_strglob(). If the plan output by
15911  **    the EXPLAIN QUERY PLAN command matches this pattern, then the schema
15912  **    contains an index that can be used to optimize the query.
15913  **
15914  ** 2. Human readable text that describes the child table and columns. e.g.
15915  **
15916  **       "child_table(child_key1, child_key2)"
15917  **
15918  ** 3. Human readable text that describes the parent table and columns. e.g.
15919  **
15920  **       "parent_table(parent_key1, parent_key2)"
15921  **
15922  ** 4. A full CREATE INDEX statement for an index that could be used to
15923  **    optimize DELETE or UPDATE statements on the parent table. e.g.
15924  **
15925  **       "CREATE INDEX child_table_child_key ON child_table(child_key)"
15926  **
15927  ** 5. The name of the parent table.
15928  **
15929  ** These six values are used by the C logic below to generate the report.
15930  */
15931  const char *zSql =
15932  "SELECT "
15933    "     'EXPLAIN QUERY PLAN SELECT 1 FROM ' || quote(s.name) || ' WHERE '"
15934    "  || group_concat(quote(s.name) || '.' || quote(f.[from]) || '=?' "
15935    "  || fkey_collate_clause("
15936    "       f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]),' AND ')"
15937    ", "
15938    "     'SEARCH TABLE ' || s.name || ' USING COVERING INDEX*('"
15939    "  || group_concat('*=?', ' AND ') || ')'"
15940    ", "
15941    "     s.name  || '(' || group_concat(f.[from],  ', ') || ')'"
15942    ", "
15943    "     f.[table] || '(' || group_concat(COALESCE(f.[to], p.[name])) || ')'"
15944    ", "
15945    "     'CREATE INDEX ' || quote(s.name ||'_'|| group_concat(f.[from], '_'))"
15946    "  || ' ON ' || quote(s.name) || '('"
15947    "  || group_concat(quote(f.[from]) ||"
15948    "        fkey_collate_clause("
15949    "          f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]), ', ')"
15950    "  || ');'"
15951    ", "
15952    "     f.[table] "
15953    "FROM sqlite_schema AS s, pragma_foreign_key_list(s.name) AS f "
15954    "LEFT JOIN pragma_table_info AS p ON (pk-1=seq AND p.arg=f.[table]) "
15955    "GROUP BY s.name, f.id "
15956    "ORDER BY (CASE WHEN ? THEN f.[table] ELSE s.name END)"
15957  ;
15958  const char *zGlobIPK = "SEARCH TABLE * USING INTEGER PRIMARY KEY (rowid=?)";
15959
15960  for(i=2; i<nArg; i++){
15961    int n = strlen30(azArg[i]);
15962    if( n>1 && sqlite3_strnicmp("-verbose", azArg[i], n)==0 ){
15963      bVerbose = 1;
15964    }
15965    else if( n>1 && sqlite3_strnicmp("-groupbyparent", azArg[i], n)==0 ){
15966      bGroupByParent = 1;
15967      zIndent = "    ";
15968    }
15969    else{
15970      raw_printf(stderr, "Usage: %s %s ?-verbose? ?-groupbyparent?\n",
15971          azArg[0], azArg[1]
15972      );
15973      return SQLITE_ERROR;
15974    }
15975  }
15976
15977  /* Register the fkey_collate_clause() SQL function */
15978  rc = sqlite3_create_function(db, "fkey_collate_clause", 4, SQLITE_UTF8,
15979      0, shellFkeyCollateClause, 0, 0
15980  );
15981
15982
15983  if( rc==SQLITE_OK ){
15984    rc = sqlite3_prepare_v2(db, zSql, -1, &pSql, 0);
15985  }
15986  if( rc==SQLITE_OK ){
15987    sqlite3_bind_int(pSql, 1, bGroupByParent);
15988  }
15989
15990  if( rc==SQLITE_OK ){
15991    int rc2;
15992    char *zPrev = 0;
15993    while( SQLITE_ROW==sqlite3_step(pSql) ){
15994      int res = -1;
15995      sqlite3_stmt *pExplain = 0;
15996      const char *zEQP = (const char*)sqlite3_column_text(pSql, 0);
15997      const char *zGlob = (const char*)sqlite3_column_text(pSql, 1);
15998      const char *zFrom = (const char*)sqlite3_column_text(pSql, 2);
15999      const char *zTarget = (const char*)sqlite3_column_text(pSql, 3);
16000      const char *zCI = (const char*)sqlite3_column_text(pSql, 4);
16001      const char *zParent = (const char*)sqlite3_column_text(pSql, 5);
16002
16003      rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
16004      if( rc!=SQLITE_OK ) break;
16005      if( SQLITE_ROW==sqlite3_step(pExplain) ){
16006        const char *zPlan = (const char*)sqlite3_column_text(pExplain, 3);
16007        res = (
16008              0==sqlite3_strglob(zGlob, zPlan)
16009           || 0==sqlite3_strglob(zGlobIPK, zPlan)
16010        );
16011      }
16012      rc = sqlite3_finalize(pExplain);
16013      if( rc!=SQLITE_OK ) break;
16014
16015      if( res<0 ){
16016        raw_printf(stderr, "Error: internal error");
16017        break;
16018      }else{
16019        if( bGroupByParent
16020        && (bVerbose || res==0)
16021        && (zPrev==0 || sqlite3_stricmp(zParent, zPrev))
16022        ){
16023          raw_printf(out, "-- Parent table %s\n", zParent);
16024          sqlite3_free(zPrev);
16025          zPrev = sqlite3_mprintf("%s", zParent);
16026        }
16027
16028        if( res==0 ){
16029          raw_printf(out, "%s%s --> %s\n", zIndent, zCI, zTarget);
16030        }else if( bVerbose ){
16031          raw_printf(out, "%s/* no extra indexes required for %s -> %s */\n",
16032              zIndent, zFrom, zTarget
16033          );
16034        }
16035      }
16036    }
16037    sqlite3_free(zPrev);
16038
16039    if( rc!=SQLITE_OK ){
16040      raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
16041    }
16042
16043    rc2 = sqlite3_finalize(pSql);
16044    if( rc==SQLITE_OK && rc2!=SQLITE_OK ){
16045      rc = rc2;
16046      raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
16047    }
16048  }else{
16049    raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
16050  }
16051
16052  return rc;
16053}
16054
16055/*
16056** Implementation of ".lint" dot command.
16057*/
16058static int lintDotCommand(
16059  ShellState *pState,             /* Current shell tool state */
16060  char **azArg,                   /* Array of arguments passed to dot command */
16061  int nArg                        /* Number of entries in azArg[] */
16062){
16063  int n;
16064  n = (nArg>=2 ? strlen30(azArg[1]) : 0);
16065  if( n<1 || sqlite3_strnicmp(azArg[1], "fkey-indexes", n) ) goto usage;
16066  return lintFkeyIndexes(pState, azArg, nArg);
16067
16068 usage:
16069  raw_printf(stderr, "Usage %s sub-command ?switches...?\n", azArg[0]);
16070  raw_printf(stderr, "Where sub-commands are:\n");
16071  raw_printf(stderr, "    fkey-indexes\n");
16072  return SQLITE_ERROR;
16073}
16074
16075#if !defined SQLITE_OMIT_VIRTUALTABLE
16076static void shellPrepare(
16077  sqlite3 *db,
16078  int *pRc,
16079  const char *zSql,
16080  sqlite3_stmt **ppStmt
16081){
16082  *ppStmt = 0;
16083  if( *pRc==SQLITE_OK ){
16084    int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0);
16085    if( rc!=SQLITE_OK ){
16086      raw_printf(stderr, "sql error: %s (%d)\n",
16087          sqlite3_errmsg(db), sqlite3_errcode(db)
16088      );
16089      *pRc = rc;
16090    }
16091  }
16092}
16093
16094/*
16095** Create a prepared statement using printf-style arguments for the SQL.
16096**
16097** This routine is could be marked "static".  But it is not always used,
16098** depending on compile-time options.  By omitting the "static", we avoid
16099** nuisance compiler warnings about "defined but not used".
16100*/
16101void shellPreparePrintf(
16102  sqlite3 *db,
16103  int *pRc,
16104  sqlite3_stmt **ppStmt,
16105  const char *zFmt,
16106  ...
16107){
16108  *ppStmt = 0;
16109  if( *pRc==SQLITE_OK ){
16110    va_list ap;
16111    char *z;
16112    va_start(ap, zFmt);
16113    z = sqlite3_vmprintf(zFmt, ap);
16114    va_end(ap);
16115    if( z==0 ){
16116      *pRc = SQLITE_NOMEM;
16117    }else{
16118      shellPrepare(db, pRc, z, ppStmt);
16119      sqlite3_free(z);
16120    }
16121  }
16122}
16123
16124/* Finalize the prepared statement created using shellPreparePrintf().
16125**
16126** This routine is could be marked "static".  But it is not always used,
16127** depending on compile-time options.  By omitting the "static", we avoid
16128** nuisance compiler warnings about "defined but not used".
16129*/
16130void shellFinalize(
16131  int *pRc,
16132  sqlite3_stmt *pStmt
16133){
16134  if( pStmt ){
16135    sqlite3 *db = sqlite3_db_handle(pStmt);
16136    int rc = sqlite3_finalize(pStmt);
16137    if( *pRc==SQLITE_OK ){
16138      if( rc!=SQLITE_OK ){
16139        raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));
16140      }
16141      *pRc = rc;
16142    }
16143  }
16144}
16145
16146/* Reset the prepared statement created using shellPreparePrintf().
16147**
16148** This routine is could be marked "static".  But it is not always used,
16149** depending on compile-time options.  By omitting the "static", we avoid
16150** nuisance compiler warnings about "defined but not used".
16151*/
16152void shellReset(
16153  int *pRc,
16154  sqlite3_stmt *pStmt
16155){
16156  int rc = sqlite3_reset(pStmt);
16157  if( *pRc==SQLITE_OK ){
16158    if( rc!=SQLITE_OK ){
16159      sqlite3 *db = sqlite3_db_handle(pStmt);
16160      raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));
16161    }
16162    *pRc = rc;
16163  }
16164}
16165#endif /* !defined SQLITE_OMIT_VIRTUALTABLE */
16166
16167#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
16168/******************************************************************************
16169** The ".archive" or ".ar" command.
16170*/
16171/*
16172** Structure representing a single ".ar" command.
16173*/
16174typedef struct ArCommand ArCommand;
16175struct ArCommand {
16176  u8 eCmd;                        /* An AR_CMD_* value */
16177  u8 bVerbose;                    /* True if --verbose */
16178  u8 bZip;                        /* True if the archive is a ZIP */
16179  u8 bDryRun;                     /* True if --dry-run */
16180  u8 bAppend;                     /* True if --append */
16181  u8 fromCmdLine;                 /* Run from -A instead of .archive */
16182  int nArg;                       /* Number of command arguments */
16183  char *zSrcTable;                /* "sqlar", "zipfile($file)" or "zip" */
16184  const char *zFile;              /* --file argument, or NULL */
16185  const char *zDir;               /* --directory argument, or NULL */
16186  char **azArg;                   /* Array of command arguments */
16187  ShellState *p;                  /* Shell state */
16188  sqlite3 *db;                    /* Database containing the archive */
16189};
16190
16191/*
16192** Print a usage message for the .ar command to stderr and return SQLITE_ERROR.
16193*/
16194static int arUsage(FILE *f){
16195  showHelp(f,"archive");
16196  return SQLITE_ERROR;
16197}
16198
16199/*
16200** Print an error message for the .ar command to stderr and return
16201** SQLITE_ERROR.
16202*/
16203static int arErrorMsg(ArCommand *pAr, const char *zFmt, ...){
16204  va_list ap;
16205  char *z;
16206  va_start(ap, zFmt);
16207  z = sqlite3_vmprintf(zFmt, ap);
16208  va_end(ap);
16209  utf8_printf(stderr, "Error: %s\n", z);
16210  if( pAr->fromCmdLine ){
16211    utf8_printf(stderr, "Use \"-A\" for more help\n");
16212  }else{
16213    utf8_printf(stderr, "Use \".archive --help\" for more help\n");
16214  }
16215  sqlite3_free(z);
16216  return SQLITE_ERROR;
16217}
16218
16219/*
16220** Values for ArCommand.eCmd.
16221*/
16222#define AR_CMD_CREATE       1
16223#define AR_CMD_UPDATE       2
16224#define AR_CMD_INSERT       3
16225#define AR_CMD_EXTRACT      4
16226#define AR_CMD_LIST         5
16227#define AR_CMD_HELP         6
16228
16229/*
16230** Other (non-command) switches.
16231*/
16232#define AR_SWITCH_VERBOSE     7
16233#define AR_SWITCH_FILE        8
16234#define AR_SWITCH_DIRECTORY   9
16235#define AR_SWITCH_APPEND     10
16236#define AR_SWITCH_DRYRUN     11
16237
16238static int arProcessSwitch(ArCommand *pAr, int eSwitch, const char *zArg){
16239  switch( eSwitch ){
16240    case AR_CMD_CREATE:
16241    case AR_CMD_EXTRACT:
16242    case AR_CMD_LIST:
16243    case AR_CMD_UPDATE:
16244    case AR_CMD_INSERT:
16245    case AR_CMD_HELP:
16246      if( pAr->eCmd ){
16247        return arErrorMsg(pAr, "multiple command options");
16248      }
16249      pAr->eCmd = eSwitch;
16250      break;
16251
16252    case AR_SWITCH_DRYRUN:
16253      pAr->bDryRun = 1;
16254      break;
16255    case AR_SWITCH_VERBOSE:
16256      pAr->bVerbose = 1;
16257      break;
16258    case AR_SWITCH_APPEND:
16259      pAr->bAppend = 1;
16260      /* Fall thru into --file */
16261    case AR_SWITCH_FILE:
16262      pAr->zFile = zArg;
16263      break;
16264    case AR_SWITCH_DIRECTORY:
16265      pAr->zDir = zArg;
16266      break;
16267  }
16268
16269  return SQLITE_OK;
16270}
16271
16272/*
16273** Parse the command line for an ".ar" command. The results are written into
16274** structure (*pAr). SQLITE_OK is returned if the command line is parsed
16275** successfully, otherwise an error message is written to stderr and
16276** SQLITE_ERROR returned.
16277*/
16278static int arParseCommand(
16279  char **azArg,                   /* Array of arguments passed to dot command */
16280  int nArg,                       /* Number of entries in azArg[] */
16281  ArCommand *pAr                  /* Populate this object */
16282){
16283  struct ArSwitch {
16284    const char *zLong;
16285    char cShort;
16286    u8 eSwitch;
16287    u8 bArg;
16288  } aSwitch[] = {
16289    { "create",    'c', AR_CMD_CREATE,       0 },
16290    { "extract",   'x', AR_CMD_EXTRACT,      0 },
16291    { "insert",    'i', AR_CMD_INSERT,       0 },
16292    { "list",      't', AR_CMD_LIST,         0 },
16293    { "update",    'u', AR_CMD_UPDATE,       0 },
16294    { "help",      'h', AR_CMD_HELP,         0 },
16295    { "verbose",   'v', AR_SWITCH_VERBOSE,   0 },
16296    { "file",      'f', AR_SWITCH_FILE,      1 },
16297    { "append",    'a', AR_SWITCH_APPEND,    1 },
16298    { "directory", 'C', AR_SWITCH_DIRECTORY, 1 },
16299    { "dryrun",    'n', AR_SWITCH_DRYRUN,    0 },
16300  };
16301  int nSwitch = sizeof(aSwitch) / sizeof(struct ArSwitch);
16302  struct ArSwitch *pEnd = &aSwitch[nSwitch];
16303
16304  if( nArg<=1 ){
16305    utf8_printf(stderr, "Wrong number of arguments.  Usage:\n");
16306    return arUsage(stderr);
16307  }else{
16308    char *z = azArg[1];
16309    if( z[0]!='-' ){
16310      /* Traditional style [tar] invocation */
16311      int i;
16312      int iArg = 2;
16313      for(i=0; z[i]; i++){
16314        const char *zArg = 0;
16315        struct ArSwitch *pOpt;
16316        for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
16317          if( z[i]==pOpt->cShort ) break;
16318        }
16319        if( pOpt==pEnd ){
16320          return arErrorMsg(pAr, "unrecognized option: %c", z[i]);
16321        }
16322        if( pOpt->bArg ){
16323          if( iArg>=nArg ){
16324            return arErrorMsg(pAr, "option requires an argument: %c",z[i]);
16325          }
16326          zArg = azArg[iArg++];
16327        }
16328        if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR;
16329      }
16330      pAr->nArg = nArg-iArg;
16331      if( pAr->nArg>0 ){
16332        pAr->azArg = &azArg[iArg];
16333      }
16334    }else{
16335      /* Non-traditional invocation */
16336      int iArg;
16337      for(iArg=1; iArg<nArg; iArg++){
16338        int n;
16339        z = azArg[iArg];
16340        if( z[0]!='-' ){
16341          /* All remaining command line words are command arguments. */
16342          pAr->azArg = &azArg[iArg];
16343          pAr->nArg = nArg-iArg;
16344          break;
16345        }
16346        n = strlen30(z);
16347
16348        if( z[1]!='-' ){
16349          int i;
16350          /* One or more short options */
16351          for(i=1; i<n; i++){
16352            const char *zArg = 0;
16353            struct ArSwitch *pOpt;
16354            for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
16355              if( z[i]==pOpt->cShort ) break;
16356            }
16357            if( pOpt==pEnd ){
16358              return arErrorMsg(pAr, "unrecognized option: %c", z[i]);
16359            }
16360            if( pOpt->bArg ){
16361              if( i<(n-1) ){
16362                zArg = &z[i+1];
16363                i = n;
16364              }else{
16365                if( iArg>=(nArg-1) ){
16366                  return arErrorMsg(pAr, "option requires an argument: %c",
16367                                    z[i]);
16368                }
16369                zArg = azArg[++iArg];
16370              }
16371            }
16372            if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR;
16373          }
16374        }else if( z[2]=='\0' ){
16375          /* A -- option, indicating that all remaining command line words
16376          ** are command arguments.  */
16377          pAr->azArg = &azArg[iArg+1];
16378          pAr->nArg = nArg-iArg-1;
16379          break;
16380        }else{
16381          /* A long option */
16382          const char *zArg = 0;             /* Argument for option, if any */
16383          struct ArSwitch *pMatch = 0;      /* Matching option */
16384          struct ArSwitch *pOpt;            /* Iterator */
16385          for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
16386            const char *zLong = pOpt->zLong;
16387            if( (n-2)<=strlen30(zLong) && 0==memcmp(&z[2], zLong, n-2) ){
16388              if( pMatch ){
16389                return arErrorMsg(pAr, "ambiguous option: %s",z);
16390              }else{
16391                pMatch = pOpt;
16392              }
16393            }
16394          }
16395
16396          if( pMatch==0 ){
16397            return arErrorMsg(pAr, "unrecognized option: %s", z);
16398          }
16399          if( pMatch->bArg ){
16400            if( iArg>=(nArg-1) ){
16401              return arErrorMsg(pAr, "option requires an argument: %s", z);
16402            }
16403            zArg = azArg[++iArg];
16404          }
16405          if( arProcessSwitch(pAr, pMatch->eSwitch, zArg) ) return SQLITE_ERROR;
16406        }
16407      }
16408    }
16409  }
16410
16411  return SQLITE_OK;
16412}
16413
16414/*
16415** This function assumes that all arguments within the ArCommand.azArg[]
16416** array refer to archive members, as for the --extract or --list commands.
16417** It checks that each of them are present. If any specified file is not
16418** present in the archive, an error is printed to stderr and an error
16419** code returned. Otherwise, if all specified arguments are present in
16420** the archive, SQLITE_OK is returned.
16421**
16422** This function strips any trailing '/' characters from each argument.
16423** This is consistent with the way the [tar] command seems to work on
16424** Linux.
16425*/
16426static int arCheckEntries(ArCommand *pAr){
16427  int rc = SQLITE_OK;
16428  if( pAr->nArg ){
16429    int i, j;
16430    sqlite3_stmt *pTest = 0;
16431
16432    shellPreparePrintf(pAr->db, &rc, &pTest,
16433        "SELECT name FROM %s WHERE name=$name",
16434        pAr->zSrcTable
16435    );
16436    j = sqlite3_bind_parameter_index(pTest, "$name");
16437    for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){
16438      char *z = pAr->azArg[i];
16439      int n = strlen30(z);
16440      int bOk = 0;
16441      while( n>0 && z[n-1]=='/' ) n--;
16442      z[n] = '\0';
16443      sqlite3_bind_text(pTest, j, z, -1, SQLITE_STATIC);
16444      if( SQLITE_ROW==sqlite3_step(pTest) ){
16445        bOk = 1;
16446      }
16447      shellReset(&rc, pTest);
16448      if( rc==SQLITE_OK && bOk==0 ){
16449        utf8_printf(stderr, "not found in archive: %s\n", z);
16450        rc = SQLITE_ERROR;
16451      }
16452    }
16453    shellFinalize(&rc, pTest);
16454  }
16455  return rc;
16456}
16457
16458/*
16459** Format a WHERE clause that can be used against the "sqlar" table to
16460** identify all archive members that match the command arguments held
16461** in (*pAr). Leave this WHERE clause in (*pzWhere) before returning.
16462** The caller is responsible for eventually calling sqlite3_free() on
16463** any non-NULL (*pzWhere) value.
16464*/
16465static void arWhereClause(
16466  int *pRc,
16467  ArCommand *pAr,
16468  char **pzWhere                  /* OUT: New WHERE clause */
16469){
16470  char *zWhere = 0;
16471  if( *pRc==SQLITE_OK ){
16472    if( pAr->nArg==0 ){
16473      zWhere = sqlite3_mprintf("1");
16474    }else{
16475      int i;
16476      const char *zSep = "";
16477      for(i=0; i<pAr->nArg; i++){
16478        const char *z = pAr->azArg[i];
16479        zWhere = sqlite3_mprintf(
16480          "%z%s name = '%q' OR substr(name,1,%d) = '%q/'",
16481          zWhere, zSep, z, strlen30(z)+1, z
16482        );
16483        if( zWhere==0 ){
16484          *pRc = SQLITE_NOMEM;
16485          break;
16486        }
16487        zSep = " OR ";
16488      }
16489    }
16490  }
16491  *pzWhere = zWhere;
16492}
16493
16494/*
16495** Implementation of .ar "lisT" command.
16496*/
16497static int arListCommand(ArCommand *pAr){
16498  const char *zSql = "SELECT %s FROM %s WHERE %s";
16499  const char *azCols[] = {
16500    "name",
16501    "lsmode(mode), sz, datetime(mtime, 'unixepoch'), name"
16502  };
16503
16504  char *zWhere = 0;
16505  sqlite3_stmt *pSql = 0;
16506  int rc;
16507
16508  rc = arCheckEntries(pAr);
16509  arWhereClause(&rc, pAr, &zWhere);
16510
16511  shellPreparePrintf(pAr->db, &rc, &pSql, zSql, azCols[pAr->bVerbose],
16512                     pAr->zSrcTable, zWhere);
16513  if( pAr->bDryRun ){
16514    utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql));
16515  }else{
16516    while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
16517      if( pAr->bVerbose ){
16518        utf8_printf(pAr->p->out, "%s % 10d  %s  %s\n",
16519            sqlite3_column_text(pSql, 0),
16520            sqlite3_column_int(pSql, 1),
16521            sqlite3_column_text(pSql, 2),
16522            sqlite3_column_text(pSql, 3)
16523        );
16524      }else{
16525        utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0));
16526      }
16527    }
16528  }
16529  shellFinalize(&rc, pSql);
16530  sqlite3_free(zWhere);
16531  return rc;
16532}
16533
16534
16535/*
16536** Implementation of .ar "eXtract" command.
16537*/
16538static int arExtractCommand(ArCommand *pAr){
16539  const char *zSql1 =
16540    "SELECT "
16541    " ($dir || name),"
16542    " writefile(($dir || name), %s, mode, mtime) "
16543    "FROM %s WHERE (%s) AND (data IS NULL OR $dirOnly = 0)"
16544    " AND name NOT GLOB '*..[/\\]*'";
16545
16546  const char *azExtraArg[] = {
16547    "sqlar_uncompress(data, sz)",
16548    "data"
16549  };
16550
16551  sqlite3_stmt *pSql = 0;
16552  int rc = SQLITE_OK;
16553  char *zDir = 0;
16554  char *zWhere = 0;
16555  int i, j;
16556
16557  /* If arguments are specified, check that they actually exist within
16558  ** the archive before proceeding. And formulate a WHERE clause to
16559  ** match them.  */
16560  rc = arCheckEntries(pAr);
16561  arWhereClause(&rc, pAr, &zWhere);
16562
16563  if( rc==SQLITE_OK ){
16564    if( pAr->zDir ){
16565      zDir = sqlite3_mprintf("%s/", pAr->zDir);
16566    }else{
16567      zDir = sqlite3_mprintf("");
16568    }
16569    if( zDir==0 ) rc = SQLITE_NOMEM;
16570  }
16571
16572  shellPreparePrintf(pAr->db, &rc, &pSql, zSql1,
16573      azExtraArg[pAr->bZip], pAr->zSrcTable, zWhere
16574  );
16575
16576  if( rc==SQLITE_OK ){
16577    j = sqlite3_bind_parameter_index(pSql, "$dir");
16578    sqlite3_bind_text(pSql, j, zDir, -1, SQLITE_STATIC);
16579
16580    /* Run the SELECT statement twice. The first time, writefile() is called
16581    ** for all archive members that should be extracted. The second time,
16582    ** only for the directories. This is because the timestamps for
16583    ** extracted directories must be reset after they are populated (as
16584    ** populating them changes the timestamp).  */
16585    for(i=0; i<2; i++){
16586      j = sqlite3_bind_parameter_index(pSql, "$dirOnly");
16587      sqlite3_bind_int(pSql, j, i);
16588      if( pAr->bDryRun ){
16589        utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql));
16590      }else{
16591        while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
16592          if( i==0 && pAr->bVerbose ){
16593            utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0));
16594          }
16595        }
16596      }
16597      shellReset(&rc, pSql);
16598    }
16599    shellFinalize(&rc, pSql);
16600  }
16601
16602  sqlite3_free(zDir);
16603  sqlite3_free(zWhere);
16604  return rc;
16605}
16606
16607/*
16608** Run the SQL statement in zSql.  Or if doing a --dryrun, merely print it out.
16609*/
16610static int arExecSql(ArCommand *pAr, const char *zSql){
16611  int rc;
16612  if( pAr->bDryRun ){
16613    utf8_printf(pAr->p->out, "%s\n", zSql);
16614    rc = SQLITE_OK;
16615  }else{
16616    char *zErr = 0;
16617    rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr);
16618    if( zErr ){
16619      utf8_printf(stdout, "ERROR: %s\n", zErr);
16620      sqlite3_free(zErr);
16621    }
16622  }
16623  return rc;
16624}
16625
16626
16627/*
16628** Implementation of .ar "create", "insert", and "update" commands.
16629**
16630**     create    ->     Create a new SQL archive
16631**     insert    ->     Insert or reinsert all files listed
16632**     update    ->     Insert files that have changed or that were not
16633**                      previously in the archive
16634**
16635** Create the "sqlar" table in the database if it does not already exist.
16636** Then add each file in the azFile[] array to the archive. Directories
16637** are added recursively. If argument bVerbose is non-zero, a message is
16638** printed on stdout for each file archived.
16639**
16640** The create command is the same as update, except that it drops
16641** any existing "sqlar" table before beginning.  The "insert" command
16642** always overwrites every file named on the command-line, where as
16643** "update" only overwrites if the size or mtime or mode has changed.
16644*/
16645static int arCreateOrUpdateCommand(
16646  ArCommand *pAr,                 /* Command arguments and options */
16647  int bUpdate,                    /* true for a --create. */
16648  int bOnlyIfChanged              /* Only update if file has changed */
16649){
16650  const char *zCreate =
16651      "CREATE TABLE IF NOT EXISTS sqlar(\n"
16652      "  name TEXT PRIMARY KEY,  -- name of the file\n"
16653      "  mode INT,               -- access permissions\n"
16654      "  mtime INT,              -- last modification time\n"
16655      "  sz INT,                 -- original file size\n"
16656      "  data BLOB               -- compressed content\n"
16657      ")";
16658  const char *zDrop = "DROP TABLE IF EXISTS sqlar";
16659  const char *zInsertFmt[2] = {
16660     "REPLACE INTO %s(name,mode,mtime,sz,data)\n"
16661     "  SELECT\n"
16662     "    %s,\n"
16663     "    mode,\n"
16664     "    mtime,\n"
16665     "    CASE substr(lsmode(mode),1,1)\n"
16666     "      WHEN '-' THEN length(data)\n"
16667     "      WHEN 'd' THEN 0\n"
16668     "      ELSE -1 END,\n"
16669     "    sqlar_compress(data)\n"
16670     "  FROM fsdir(%Q,%Q) AS disk\n"
16671     "  WHERE lsmode(mode) NOT LIKE '?%%'%s;"
16672     ,
16673     "REPLACE INTO %s(name,mode,mtime,data)\n"
16674     "  SELECT\n"
16675     "    %s,\n"
16676     "    mode,\n"
16677     "    mtime,\n"
16678     "    data\n"
16679     "  FROM fsdir(%Q,%Q) AS disk\n"
16680     "  WHERE lsmode(mode) NOT LIKE '?%%'%s;"
16681  };
16682  int i;                          /* For iterating through azFile[] */
16683  int rc;                         /* Return code */
16684  const char *zTab = 0;           /* SQL table into which to insert */
16685  char *zSql;
16686  char zTemp[50];
16687  char *zExists = 0;
16688
16689  arExecSql(pAr, "PRAGMA page_size=512");
16690  rc = arExecSql(pAr, "SAVEPOINT ar;");
16691  if( rc!=SQLITE_OK ) return rc;
16692  zTemp[0] = 0;
16693  if( pAr->bZip ){
16694    /* Initialize the zipfile virtual table, if necessary */
16695    if( pAr->zFile ){
16696      sqlite3_uint64 r;
16697      sqlite3_randomness(sizeof(r),&r);
16698      sqlite3_snprintf(sizeof(zTemp),zTemp,"zip%016llx",r);
16699      zTab = zTemp;
16700      zSql = sqlite3_mprintf(
16701         "CREATE VIRTUAL TABLE temp.%s USING zipfile(%Q)",
16702         zTab, pAr->zFile
16703      );
16704      rc = arExecSql(pAr, zSql);
16705      sqlite3_free(zSql);
16706    }else{
16707      zTab = "zip";
16708    }
16709  }else{
16710    /* Initialize the table for an SQLAR */
16711    zTab = "sqlar";
16712    if( bUpdate==0 ){
16713      rc = arExecSql(pAr, zDrop);
16714      if( rc!=SQLITE_OK ) goto end_ar_transaction;
16715    }
16716    rc = arExecSql(pAr, zCreate);
16717  }
16718  if( bOnlyIfChanged ){
16719    zExists = sqlite3_mprintf(
16720      " AND NOT EXISTS("
16721          "SELECT 1 FROM %s AS mem"
16722          " WHERE mem.name=disk.name"
16723          " AND mem.mtime=disk.mtime"
16724          " AND mem.mode=disk.mode)", zTab);
16725  }else{
16726    zExists = sqlite3_mprintf("");
16727  }
16728  if( zExists==0 ) rc = SQLITE_NOMEM;
16729  for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){
16730    char *zSql2 = sqlite3_mprintf(zInsertFmt[pAr->bZip], zTab,
16731        pAr->bVerbose ? "shell_putsnl(name)" : "name",
16732        pAr->azArg[i], pAr->zDir, zExists);
16733    rc = arExecSql(pAr, zSql2);
16734    sqlite3_free(zSql2);
16735  }
16736end_ar_transaction:
16737  if( rc!=SQLITE_OK ){
16738    sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0);
16739  }else{
16740    rc = arExecSql(pAr, "RELEASE ar;");
16741    if( pAr->bZip && pAr->zFile ){
16742      zSql = sqlite3_mprintf("DROP TABLE %s", zTemp);
16743      arExecSql(pAr, zSql);
16744      sqlite3_free(zSql);
16745    }
16746  }
16747  sqlite3_free(zExists);
16748  return rc;
16749}
16750
16751/*
16752** Implementation of ".ar" dot command.
16753*/
16754static int arDotCommand(
16755  ShellState *pState,          /* Current shell tool state */
16756  int fromCmdLine,             /* True if -A command-line option, not .ar cmd */
16757  char **azArg,                /* Array of arguments passed to dot command */
16758  int nArg                     /* Number of entries in azArg[] */
16759){
16760  ArCommand cmd;
16761  int rc;
16762  memset(&cmd, 0, sizeof(cmd));
16763  cmd.fromCmdLine = fromCmdLine;
16764  rc = arParseCommand(azArg, nArg, &cmd);
16765  if( rc==SQLITE_OK ){
16766    int eDbType = SHELL_OPEN_UNSPEC;
16767    cmd.p = pState;
16768    cmd.db = pState->db;
16769    if( cmd.zFile ){
16770      eDbType = deduceDatabaseType(cmd.zFile, 1);
16771    }else{
16772      eDbType = pState->openMode;
16773    }
16774    if( eDbType==SHELL_OPEN_ZIPFILE ){
16775      if( cmd.eCmd==AR_CMD_EXTRACT || cmd.eCmd==AR_CMD_LIST ){
16776        if( cmd.zFile==0 ){
16777          cmd.zSrcTable = sqlite3_mprintf("zip");
16778        }else{
16779          cmd.zSrcTable = sqlite3_mprintf("zipfile(%Q)", cmd.zFile);
16780        }
16781      }
16782      cmd.bZip = 1;
16783    }else if( cmd.zFile ){
16784      int flags;
16785      if( cmd.bAppend ) eDbType = SHELL_OPEN_APPENDVFS;
16786      if( cmd.eCmd==AR_CMD_CREATE || cmd.eCmd==AR_CMD_INSERT
16787           || cmd.eCmd==AR_CMD_UPDATE ){
16788        flags = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE;
16789      }else{
16790        flags = SQLITE_OPEN_READONLY;
16791      }
16792      cmd.db = 0;
16793      if( cmd.bDryRun ){
16794        utf8_printf(pState->out, "-- open database '%s'%s\n", cmd.zFile,
16795             eDbType==SHELL_OPEN_APPENDVFS ? " using 'apndvfs'" : "");
16796      }
16797      rc = sqlite3_open_v2(cmd.zFile, &cmd.db, flags,
16798             eDbType==SHELL_OPEN_APPENDVFS ? "apndvfs" : 0);
16799      if( rc!=SQLITE_OK ){
16800        utf8_printf(stderr, "cannot open file: %s (%s)\n",
16801            cmd.zFile, sqlite3_errmsg(cmd.db)
16802        );
16803        goto end_ar_command;
16804      }
16805      sqlite3_fileio_init(cmd.db, 0, 0);
16806      sqlite3_sqlar_init(cmd.db, 0, 0);
16807      sqlite3_create_function(cmd.db, "shell_putsnl", 1, SQLITE_UTF8, cmd.p,
16808                              shellPutsFunc, 0, 0);
16809
16810    }
16811    if( cmd.zSrcTable==0 && cmd.bZip==0 && cmd.eCmd!=AR_CMD_HELP ){
16812      if( cmd.eCmd!=AR_CMD_CREATE
16813       && sqlite3_table_column_metadata(cmd.db,0,"sqlar","name",0,0,0,0,0)
16814      ){
16815        utf8_printf(stderr, "database does not contain an 'sqlar' table\n");
16816        rc = SQLITE_ERROR;
16817        goto end_ar_command;
16818      }
16819      cmd.zSrcTable = sqlite3_mprintf("sqlar");
16820    }
16821
16822    switch( cmd.eCmd ){
16823      case AR_CMD_CREATE:
16824        rc = arCreateOrUpdateCommand(&cmd, 0, 0);
16825        break;
16826
16827      case AR_CMD_EXTRACT:
16828        rc = arExtractCommand(&cmd);
16829        break;
16830
16831      case AR_CMD_LIST:
16832        rc = arListCommand(&cmd);
16833        break;
16834
16835      case AR_CMD_HELP:
16836        arUsage(pState->out);
16837        break;
16838
16839      case AR_CMD_INSERT:
16840        rc = arCreateOrUpdateCommand(&cmd, 1, 0);
16841        break;
16842
16843      default:
16844        assert( cmd.eCmd==AR_CMD_UPDATE );
16845        rc = arCreateOrUpdateCommand(&cmd, 1, 1);
16846        break;
16847    }
16848  }
16849end_ar_command:
16850  if( cmd.db!=pState->db ){
16851    close_db(cmd.db);
16852  }
16853  sqlite3_free(cmd.zSrcTable);
16854
16855  return rc;
16856}
16857/* End of the ".archive" or ".ar" command logic
16858*******************************************************************************/
16859#endif /* !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) */
16860
16861#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
16862/*
16863** If (*pRc) is not SQLITE_OK when this function is called, it is a no-op.
16864** Otherwise, the SQL statement or statements in zSql are executed using
16865** database connection db and the error code written to *pRc before
16866** this function returns.
16867*/
16868static void shellExec(sqlite3 *db, int *pRc, const char *zSql){
16869  int rc = *pRc;
16870  if( rc==SQLITE_OK ){
16871    char *zErr = 0;
16872    rc = sqlite3_exec(db, zSql, 0, 0, &zErr);
16873    if( rc!=SQLITE_OK ){
16874      raw_printf(stderr, "SQL error: %s\n", zErr);
16875    }
16876    *pRc = rc;
16877  }
16878}
16879
16880/*
16881** Like shellExec(), except that zFmt is a printf() style format string.
16882*/
16883static void shellExecPrintf(sqlite3 *db, int *pRc, const char *zFmt, ...){
16884  char *z = 0;
16885  if( *pRc==SQLITE_OK ){
16886    va_list ap;
16887    va_start(ap, zFmt);
16888    z = sqlite3_vmprintf(zFmt, ap);
16889    va_end(ap);
16890    if( z==0 ){
16891      *pRc = SQLITE_NOMEM;
16892    }else{
16893      shellExec(db, pRc, z);
16894    }
16895    sqlite3_free(z);
16896  }
16897}
16898
16899/*
16900** If *pRc is not SQLITE_OK when this function is called, it is a no-op.
16901** Otherwise, an attempt is made to allocate, zero and return a pointer
16902** to a buffer nByte bytes in size. If an OOM error occurs, *pRc is set
16903** to SQLITE_NOMEM and NULL returned.
16904*/
16905static void *shellMalloc(int *pRc, sqlite3_int64 nByte){
16906  void *pRet = 0;
16907  if( *pRc==SQLITE_OK ){
16908    pRet = sqlite3_malloc64(nByte);
16909    if( pRet==0 ){
16910      *pRc = SQLITE_NOMEM;
16911    }else{
16912      memset(pRet, 0, nByte);
16913    }
16914  }
16915  return pRet;
16916}
16917
16918/*
16919** If *pRc is not SQLITE_OK when this function is called, it is a no-op.
16920** Otherwise, zFmt is treated as a printf() style string. The result of
16921** formatting it along with any trailing arguments is written into a
16922** buffer obtained from sqlite3_malloc(), and pointer to which is returned.
16923** It is the responsibility of the caller to eventually free this buffer
16924** using a call to sqlite3_free().
16925**
16926** If an OOM error occurs, (*pRc) is set to SQLITE_NOMEM and a NULL
16927** pointer returned.
16928*/
16929static char *shellMPrintf(int *pRc, const char *zFmt, ...){
16930  char *z = 0;
16931  if( *pRc==SQLITE_OK ){
16932    va_list ap;
16933    va_start(ap, zFmt);
16934    z = sqlite3_vmprintf(zFmt, ap);
16935    va_end(ap);
16936    if( z==0 ){
16937      *pRc = SQLITE_NOMEM;
16938    }
16939  }
16940  return z;
16941}
16942
16943/*
16944** When running the ".recover" command, each output table, and the special
16945** orphaned row table if it is required, is represented by an instance
16946** of the following struct.
16947*/
16948typedef struct RecoverTable RecoverTable;
16949struct RecoverTable {
16950  char *zQuoted;                  /* Quoted version of table name */
16951  int nCol;                       /* Number of columns in table */
16952  char **azlCol;                  /* Array of column lists */
16953  int iPk;                        /* Index of IPK column */
16954};
16955
16956/*
16957** Free a RecoverTable object allocated by recoverFindTable() or
16958** recoverOrphanTable().
16959*/
16960static void recoverFreeTable(RecoverTable *pTab){
16961  if( pTab ){
16962    sqlite3_free(pTab->zQuoted);
16963    if( pTab->azlCol ){
16964      int i;
16965      for(i=0; i<=pTab->nCol; i++){
16966        sqlite3_free(pTab->azlCol[i]);
16967      }
16968      sqlite3_free(pTab->azlCol);
16969    }
16970    sqlite3_free(pTab);
16971  }
16972}
16973
16974/*
16975** This function is a no-op if (*pRc) is not SQLITE_OK when it is called.
16976** Otherwise, it allocates and returns a RecoverTable object based on the
16977** final four arguments passed to this function. It is the responsibility
16978** of the caller to eventually free the returned object using
16979** recoverFreeTable().
16980*/
16981static RecoverTable *recoverNewTable(
16982  int *pRc,                       /* IN/OUT: Error code */
16983  const char *zName,              /* Name of table */
16984  const char *zSql,               /* CREATE TABLE statement */
16985  int bIntkey,
16986  int nCol
16987){
16988  sqlite3 *dbtmp = 0;             /* sqlite3 handle for testing CREATE TABLE */
16989  int rc = *pRc;
16990  RecoverTable *pTab = 0;
16991
16992  pTab = (RecoverTable*)shellMalloc(&rc, sizeof(RecoverTable));
16993  if( rc==SQLITE_OK ){
16994    int nSqlCol = 0;
16995    int bSqlIntkey = 0;
16996    sqlite3_stmt *pStmt = 0;
16997
16998    rc = sqlite3_open("", &dbtmp);
16999    if( rc==SQLITE_OK ){
17000      sqlite3_create_function(dbtmp, "shell_idquote", 1, SQLITE_UTF8, 0,
17001                              shellIdQuote, 0, 0);
17002    }
17003    if( rc==SQLITE_OK ){
17004      rc = sqlite3_exec(dbtmp, "PRAGMA writable_schema = on", 0, 0, 0);
17005    }
17006    if( rc==SQLITE_OK ){
17007      rc = sqlite3_exec(dbtmp, zSql, 0, 0, 0);
17008      if( rc==SQLITE_ERROR ){
17009        rc = SQLITE_OK;
17010        goto finished;
17011      }
17012    }
17013    shellPreparePrintf(dbtmp, &rc, &pStmt,
17014        "SELECT count(*) FROM pragma_table_info(%Q)", zName
17015    );
17016    if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
17017      nSqlCol = sqlite3_column_int(pStmt, 0);
17018    }
17019    shellFinalize(&rc, pStmt);
17020
17021    if( rc!=SQLITE_OK || nSqlCol<nCol ){
17022      goto finished;
17023    }
17024
17025    shellPreparePrintf(dbtmp, &rc, &pStmt,
17026      "SELECT ("
17027      "  SELECT substr(data,1,1)==X'0D' FROM sqlite_dbpage WHERE pgno=rootpage"
17028      ") FROM sqlite_schema WHERE name = %Q", zName
17029    );
17030    if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
17031      bSqlIntkey = sqlite3_column_int(pStmt, 0);
17032    }
17033    shellFinalize(&rc, pStmt);
17034
17035    if( bIntkey==bSqlIntkey ){
17036      int i;
17037      const char *zPk = "_rowid_";
17038      sqlite3_stmt *pPkFinder = 0;
17039
17040      /* If this is an intkey table and there is an INTEGER PRIMARY KEY,
17041      ** set zPk to the name of the PK column, and pTab->iPk to the index
17042      ** of the column, where columns are 0-numbered from left to right.
17043      ** Or, if this is a WITHOUT ROWID table or if there is no IPK column,
17044      ** leave zPk as "_rowid_" and pTab->iPk at -2.  */
17045      pTab->iPk = -2;
17046      if( bIntkey ){
17047        shellPreparePrintf(dbtmp, &rc, &pPkFinder,
17048          "SELECT cid, name FROM pragma_table_info(%Q) "
17049          "  WHERE pk=1 AND type='integer' COLLATE nocase"
17050          "  AND NOT EXISTS (SELECT cid FROM pragma_table_info(%Q) WHERE pk=2)"
17051          , zName, zName
17052        );
17053        if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pPkFinder) ){
17054          pTab->iPk = sqlite3_column_int(pPkFinder, 0);
17055          zPk = (const char*)sqlite3_column_text(pPkFinder, 1);
17056        }
17057      }
17058
17059      pTab->zQuoted = shellMPrintf(&rc, "\"%w\"", zName);
17060      pTab->azlCol = (char**)shellMalloc(&rc, sizeof(char*) * (nSqlCol+1));
17061      pTab->nCol = nSqlCol;
17062
17063      if( bIntkey ){
17064        pTab->azlCol[0] = shellMPrintf(&rc, "\"%w\"", zPk);
17065      }else{
17066        pTab->azlCol[0] = shellMPrintf(&rc, "");
17067      }
17068      i = 1;
17069      shellPreparePrintf(dbtmp, &rc, &pStmt,
17070          "SELECT %Q || group_concat(shell_idquote(name), ', ') "
17071          "  FILTER (WHERE cid!=%d) OVER (ORDER BY %s cid) "
17072          "FROM pragma_table_info(%Q)",
17073          bIntkey ? ", " : "", pTab->iPk,
17074          bIntkey ? "" : "(CASE WHEN pk=0 THEN 1000000 ELSE pk END), ",
17075          zName
17076      );
17077      while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
17078        const char *zText = (const char*)sqlite3_column_text(pStmt, 0);
17079        pTab->azlCol[i] = shellMPrintf(&rc, "%s%s", pTab->azlCol[0], zText);
17080        i++;
17081      }
17082      shellFinalize(&rc, pStmt);
17083
17084      shellFinalize(&rc, pPkFinder);
17085    }
17086  }
17087
17088 finished:
17089  sqlite3_close(dbtmp);
17090  *pRc = rc;
17091  if( rc!=SQLITE_OK || (pTab && pTab->zQuoted==0) ){
17092    recoverFreeTable(pTab);
17093    pTab = 0;
17094  }
17095  return pTab;
17096}
17097
17098/*
17099** This function is called to search the schema recovered from the
17100** sqlite_schema table of the (possibly) corrupt database as part
17101** of a ".recover" command. Specifically, for a table with root page
17102** iRoot and at least nCol columns. Additionally, if bIntkey is 0, the
17103** table must be a WITHOUT ROWID table, or if non-zero, not one of
17104** those.
17105**
17106** If a table is found, a (RecoverTable*) object is returned. Or, if
17107** no such table is found, but bIntkey is false and iRoot is the
17108** root page of an index in the recovered schema, then (*pbNoop) is
17109** set to true and NULL returned. Or, if there is no such table or
17110** index, NULL is returned and (*pbNoop) set to 0, indicating that
17111** the caller should write data to the orphans table.
17112*/
17113static RecoverTable *recoverFindTable(
17114  ShellState *pState,             /* Shell state object */
17115  int *pRc,                       /* IN/OUT: Error code */
17116  int iRoot,                      /* Root page of table */
17117  int bIntkey,                    /* True for an intkey table */
17118  int nCol,                       /* Number of columns in table */
17119  int *pbNoop                     /* OUT: True if iRoot is root of index */
17120){
17121  sqlite3_stmt *pStmt = 0;
17122  RecoverTable *pRet = 0;
17123  int bNoop = 0;
17124  const char *zSql = 0;
17125  const char *zName = 0;
17126
17127  /* Search the recovered schema for an object with root page iRoot. */
17128  shellPreparePrintf(pState->db, pRc, &pStmt,
17129      "SELECT type, name, sql FROM recovery.schema WHERE rootpage=%d", iRoot
17130  );
17131  while( *pRc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
17132    const char *zType = (const char*)sqlite3_column_text(pStmt, 0);
17133    if( bIntkey==0 && sqlite3_stricmp(zType, "index")==0 ){
17134      bNoop = 1;
17135      break;
17136    }
17137    if( sqlite3_stricmp(zType, "table")==0 ){
17138      zName = (const char*)sqlite3_column_text(pStmt, 1);
17139      zSql = (const char*)sqlite3_column_text(pStmt, 2);
17140      pRet = recoverNewTable(pRc, zName, zSql, bIntkey, nCol);
17141      break;
17142    }
17143  }
17144
17145  shellFinalize(pRc, pStmt);
17146  *pbNoop = bNoop;
17147  return pRet;
17148}
17149
17150/*
17151** Return a RecoverTable object representing the orphans table.
17152*/
17153static RecoverTable *recoverOrphanTable(
17154  ShellState *pState,             /* Shell state object */
17155  int *pRc,                       /* IN/OUT: Error code */
17156  const char *zLostAndFound,      /* Base name for orphans table */
17157  int nCol                        /* Number of user data columns */
17158){
17159  RecoverTable *pTab = 0;
17160  if( nCol>=0 && *pRc==SQLITE_OK ){
17161    int i;
17162
17163    /* This block determines the name of the orphan table. The prefered
17164    ** name is zLostAndFound. But if that clashes with another name
17165    ** in the recovered schema, try zLostAndFound_0, zLostAndFound_1
17166    ** and so on until a non-clashing name is found.  */
17167    int iTab = 0;
17168    char *zTab = shellMPrintf(pRc, "%s", zLostAndFound);
17169    sqlite3_stmt *pTest = 0;
17170    shellPrepare(pState->db, pRc,
17171        "SELECT 1 FROM recovery.schema WHERE name=?", &pTest
17172    );
17173    if( pTest ) sqlite3_bind_text(pTest, 1, zTab, -1, SQLITE_TRANSIENT);
17174    while( *pRc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pTest) ){
17175      shellReset(pRc, pTest);
17176      sqlite3_free(zTab);
17177      zTab = shellMPrintf(pRc, "%s_%d", zLostAndFound, iTab++);
17178      sqlite3_bind_text(pTest, 1, zTab, -1, SQLITE_TRANSIENT);
17179    }
17180    shellFinalize(pRc, pTest);
17181
17182    pTab = (RecoverTable*)shellMalloc(pRc, sizeof(RecoverTable));
17183    if( pTab ){
17184      pTab->zQuoted = shellMPrintf(pRc, "\"%w\"", zTab);
17185      pTab->nCol = nCol;
17186      pTab->iPk = -2;
17187      if( nCol>0 ){
17188        pTab->azlCol = (char**)shellMalloc(pRc, sizeof(char*) * (nCol+1));
17189        if( pTab->azlCol ){
17190          pTab->azlCol[nCol] = shellMPrintf(pRc, "");
17191          for(i=nCol-1; i>=0; i--){
17192            pTab->azlCol[i] = shellMPrintf(pRc, "%s, NULL", pTab->azlCol[i+1]);
17193          }
17194        }
17195      }
17196
17197      if( *pRc!=SQLITE_OK ){
17198        recoverFreeTable(pTab);
17199        pTab = 0;
17200      }else{
17201        raw_printf(pState->out,
17202            "CREATE TABLE %s(rootpgno INTEGER, "
17203            "pgno INTEGER, nfield INTEGER, id INTEGER", pTab->zQuoted
17204        );
17205        for(i=0; i<nCol; i++){
17206          raw_printf(pState->out, ", c%d", i);
17207        }
17208        raw_printf(pState->out, ");\n");
17209      }
17210    }
17211    sqlite3_free(zTab);
17212  }
17213  return pTab;
17214}
17215
17216/*
17217** This function is called to recover data from the database. A script
17218** to construct a new database containing all recovered data is output
17219** on stream pState->out.
17220*/
17221static int recoverDatabaseCmd(ShellState *pState, int nArg, char **azArg){
17222  int rc = SQLITE_OK;
17223  sqlite3_stmt *pLoop = 0;        /* Loop through all root pages */
17224  sqlite3_stmt *pPages = 0;       /* Loop through all pages in a group */
17225  sqlite3_stmt *pCells = 0;       /* Loop through all cells in a page */
17226  const char *zRecoveryDb = "";   /* Name of "recovery" database */
17227  const char *zLostAndFound = "lost_and_found";
17228  int i;
17229  int nOrphan = -1;
17230  RecoverTable *pOrphan = 0;
17231
17232  int bFreelist = 1;              /* 0 if --freelist-corrupt is specified */
17233  int bRowids = 1;                /* 0 if --no-rowids */
17234  for(i=1; i<nArg; i++){
17235    char *z = azArg[i];
17236    int n;
17237    if( z[0]=='-' && z[1]=='-' ) z++;
17238    n = strlen30(z);
17239    if( n<=17 && memcmp("-freelist-corrupt", z, n)==0 ){
17240      bFreelist = 0;
17241    }else
17242    if( n<=12 && memcmp("-recovery-db", z, n)==0 && i<(nArg-1) ){
17243      i++;
17244      zRecoveryDb = azArg[i];
17245    }else
17246    if( n<=15 && memcmp("-lost-and-found", z, n)==0 && i<(nArg-1) ){
17247      i++;
17248      zLostAndFound = azArg[i];
17249    }else
17250    if( n<=10 && memcmp("-no-rowids", z, n)==0 ){
17251      bRowids = 0;
17252    }
17253    else{
17254      utf8_printf(stderr, "unexpected option: %s\n", azArg[i]);
17255      showHelp(pState->out, azArg[0]);
17256      return 1;
17257    }
17258  }
17259
17260  shellExecPrintf(pState->db, &rc,
17261    /* Attach an in-memory database named 'recovery'. Create an indexed
17262    ** cache of the sqlite_dbptr virtual table. */
17263    "PRAGMA writable_schema = on;"
17264    "ATTACH %Q AS recovery;"
17265    "DROP TABLE IF EXISTS recovery.dbptr;"
17266    "DROP TABLE IF EXISTS recovery.freelist;"
17267    "DROP TABLE IF EXISTS recovery.map;"
17268    "DROP TABLE IF EXISTS recovery.schema;"
17269    "CREATE TABLE recovery.freelist(pgno INTEGER PRIMARY KEY);", zRecoveryDb
17270  );
17271
17272  if( bFreelist ){
17273    shellExec(pState->db, &rc,
17274      "WITH trunk(pgno) AS ("
17275      "  SELECT shell_int32("
17276      "      (SELECT data FROM sqlite_dbpage WHERE pgno=1), 8) AS x "
17277      "      WHERE x>0"
17278      "    UNION"
17279      "  SELECT shell_int32("
17280      "      (SELECT data FROM sqlite_dbpage WHERE pgno=trunk.pgno), 0) AS x "
17281      "      FROM trunk WHERE x>0"
17282      "),"
17283      "freelist(data, n, freepgno) AS ("
17284      "  SELECT data, min(16384, shell_int32(data, 1)-1), t.pgno "
17285      "      FROM trunk t, sqlite_dbpage s WHERE s.pgno=t.pgno"
17286      "    UNION ALL"
17287      "  SELECT data, n-1, shell_int32(data, 2+n) "
17288      "      FROM freelist WHERE n>=0"
17289      ")"
17290      "REPLACE INTO recovery.freelist SELECT freepgno FROM freelist;"
17291    );
17292  }
17293
17294  /* If this is an auto-vacuum database, add all pointer-map pages to
17295  ** the freelist table. Do this regardless of whether or not
17296  ** --freelist-corrupt was specified.  */
17297  shellExec(pState->db, &rc,
17298    "WITH ptrmap(pgno) AS ("
17299    "  SELECT 2 WHERE shell_int32("
17300    "    (SELECT data FROM sqlite_dbpage WHERE pgno=1), 13"
17301    "  )"
17302    "    UNION ALL "
17303    "  SELECT pgno+1+(SELECT page_size FROM pragma_page_size)/5 AS pp "
17304    "  FROM ptrmap WHERE pp<=(SELECT page_count FROM pragma_page_count)"
17305    ")"
17306    "REPLACE INTO recovery.freelist SELECT pgno FROM ptrmap"
17307  );
17308
17309  shellExec(pState->db, &rc,
17310    "CREATE TABLE recovery.dbptr("
17311    "      pgno, child, PRIMARY KEY(child, pgno)"
17312    ") WITHOUT ROWID;"
17313    "INSERT OR IGNORE INTO recovery.dbptr(pgno, child) "
17314    "    SELECT * FROM sqlite_dbptr"
17315    "      WHERE pgno NOT IN freelist AND child NOT IN freelist;"
17316
17317    /* Delete any pointer to page 1. This ensures that page 1 is considered
17318    ** a root page, regardless of how corrupt the db is. */
17319    "DELETE FROM recovery.dbptr WHERE child = 1;"
17320
17321    /* Delete all pointers to any pages that have more than one pointer
17322    ** to them. Such pages will be treated as root pages when recovering
17323    ** data.  */
17324    "DELETE FROM recovery.dbptr WHERE child IN ("
17325    "  SELECT child FROM recovery.dbptr GROUP BY child HAVING count(*)>1"
17326    ");"
17327
17328    /* Create the "map" table that will (eventually) contain instructions
17329    ** for dealing with each page in the db that contains one or more
17330    ** records. */
17331    "CREATE TABLE recovery.map("
17332      "pgno INTEGER PRIMARY KEY, maxlen INT, intkey, root INT"
17333    ");"
17334
17335    /* Populate table [map]. If there are circular loops of pages in the
17336    ** database, the following adds all pages in such a loop to the map
17337    ** as individual root pages. This could be handled better.  */
17338    "WITH pages(i, maxlen) AS ("
17339    "  SELECT page_count, ("
17340    "    SELECT max(field+1) FROM sqlite_dbdata WHERE pgno=page_count"
17341    "  ) FROM pragma_page_count WHERE page_count>0"
17342    "    UNION ALL"
17343    "  SELECT i-1, ("
17344    "    SELECT max(field+1) FROM sqlite_dbdata WHERE pgno=i-1"
17345    "  ) FROM pages WHERE i>=2"
17346    ")"
17347    "INSERT INTO recovery.map(pgno, maxlen, intkey, root) "
17348    "  SELECT i, maxlen, NULL, ("
17349    "    WITH p(orig, pgno, parent) AS ("
17350    "      SELECT 0, i, (SELECT pgno FROM recovery.dbptr WHERE child=i)"
17351    "        UNION "
17352    "      SELECT i, p.parent, "
17353    "        (SELECT pgno FROM recovery.dbptr WHERE child=p.parent) FROM p"
17354    "    )"
17355    "    SELECT pgno FROM p WHERE (parent IS NULL OR pgno = orig)"
17356    ") "
17357    "FROM pages WHERE maxlen IS NOT NULL AND i NOT IN freelist;"
17358    "UPDATE recovery.map AS o SET intkey = ("
17359    "  SELECT substr(data, 1, 1)==X'0D' FROM sqlite_dbpage WHERE pgno=o.pgno"
17360    ");"
17361
17362    /* Extract data from page 1 and any linked pages into table
17363    ** recovery.schema. With the same schema as an sqlite_schema table.  */
17364    "CREATE TABLE recovery.schema(type, name, tbl_name, rootpage, sql);"
17365    "INSERT INTO recovery.schema SELECT "
17366    "  max(CASE WHEN field=0 THEN value ELSE NULL END),"
17367    "  max(CASE WHEN field=1 THEN value ELSE NULL END),"
17368    "  max(CASE WHEN field=2 THEN value ELSE NULL END),"
17369    "  max(CASE WHEN field=3 THEN value ELSE NULL END),"
17370    "  max(CASE WHEN field=4 THEN value ELSE NULL END)"
17371    "FROM sqlite_dbdata WHERE pgno IN ("
17372    "  SELECT pgno FROM recovery.map WHERE root=1"
17373    ")"
17374    "GROUP BY pgno, cell;"
17375    "CREATE INDEX recovery.schema_rootpage ON schema(rootpage);"
17376  );
17377
17378  /* Open a transaction, then print out all non-virtual, non-"sqlite_%"
17379  ** CREATE TABLE statements that extracted from the existing schema.  */
17380  if( rc==SQLITE_OK ){
17381    sqlite3_stmt *pStmt = 0;
17382    /* ".recover" might output content in an order which causes immediate
17383    ** foreign key constraints to be violated. So disable foreign-key
17384    ** constraint enforcement to prevent problems when running the output
17385    ** script. */
17386    raw_printf(pState->out, "PRAGMA foreign_keys=OFF;\n");
17387    raw_printf(pState->out, "BEGIN;\n");
17388    raw_printf(pState->out, "PRAGMA writable_schema = on;\n");
17389    shellPrepare(pState->db, &rc,
17390        "SELECT sql FROM recovery.schema "
17391        "WHERE type='table' AND sql LIKE 'create table%'", &pStmt
17392    );
17393    while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
17394      const char *zCreateTable = (const char*)sqlite3_column_text(pStmt, 0);
17395      raw_printf(pState->out, "CREATE TABLE IF NOT EXISTS %s;\n",
17396          &zCreateTable[12]
17397      );
17398    }
17399    shellFinalize(&rc, pStmt);
17400  }
17401
17402  /* Figure out if an orphan table will be required. And if so, how many
17403  ** user columns it should contain */
17404  shellPrepare(pState->db, &rc,
17405      "SELECT coalesce(max(maxlen), -2) FROM recovery.map WHERE root>1"
17406      , &pLoop
17407  );
17408  if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pLoop) ){
17409    nOrphan = sqlite3_column_int(pLoop, 0);
17410  }
17411  shellFinalize(&rc, pLoop);
17412  pLoop = 0;
17413
17414  shellPrepare(pState->db, &rc,
17415      "SELECT pgno FROM recovery.map WHERE root=?", &pPages
17416  );
17417
17418  shellPrepare(pState->db, &rc,
17419      "SELECT max(field), group_concat(shell_escape_crnl(quote"
17420      "(case when (? AND field<0) then NULL else value end)"
17421      "), ', ')"
17422      ", min(field) "
17423      "FROM sqlite_dbdata WHERE pgno = ? AND field != ?"
17424      "GROUP BY cell", &pCells
17425  );
17426
17427  /* Loop through each root page. */
17428  shellPrepare(pState->db, &rc,
17429      "SELECT root, intkey, max(maxlen) FROM recovery.map"
17430      " WHERE root>1 GROUP BY root, intkey ORDER BY root=("
17431      "  SELECT rootpage FROM recovery.schema WHERE name='sqlite_sequence'"
17432      ")", &pLoop
17433  );
17434  while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pLoop) ){
17435    int iRoot = sqlite3_column_int(pLoop, 0);
17436    int bIntkey = sqlite3_column_int(pLoop, 1);
17437    int nCol = sqlite3_column_int(pLoop, 2);
17438    int bNoop = 0;
17439    RecoverTable *pTab;
17440
17441    assert( bIntkey==0 || bIntkey==1 );
17442    pTab = recoverFindTable(pState, &rc, iRoot, bIntkey, nCol, &bNoop);
17443    if( bNoop || rc ) continue;
17444    if( pTab==0 ){
17445      if( pOrphan==0 ){
17446        pOrphan = recoverOrphanTable(pState, &rc, zLostAndFound, nOrphan);
17447      }
17448      pTab = pOrphan;
17449      if( pTab==0 ) break;
17450    }
17451
17452    if( 0==sqlite3_stricmp(pTab->zQuoted, "\"sqlite_sequence\"") ){
17453      raw_printf(pState->out, "DELETE FROM sqlite_sequence;\n");
17454    }
17455    sqlite3_bind_int(pPages, 1, iRoot);
17456    if( bRowids==0 && pTab->iPk<0 ){
17457      sqlite3_bind_int(pCells, 1, 1);
17458    }else{
17459      sqlite3_bind_int(pCells, 1, 0);
17460    }
17461    sqlite3_bind_int(pCells, 3, pTab->iPk);
17462
17463    while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pPages) ){
17464      int iPgno = sqlite3_column_int(pPages, 0);
17465      sqlite3_bind_int(pCells, 2, iPgno);
17466      while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pCells) ){
17467        int nField = sqlite3_column_int(pCells, 0);
17468        int iMin = sqlite3_column_int(pCells, 2);
17469        const char *zVal = (const char*)sqlite3_column_text(pCells, 1);
17470
17471        RecoverTable *pTab2 = pTab;
17472        if( pTab!=pOrphan && (iMin<0)!=bIntkey ){
17473          if( pOrphan==0 ){
17474            pOrphan = recoverOrphanTable(pState, &rc, zLostAndFound, nOrphan);
17475          }
17476          pTab2 = pOrphan;
17477          if( pTab2==0 ) break;
17478        }
17479
17480        nField = nField+1;
17481        if( pTab2==pOrphan ){
17482          raw_printf(pState->out,
17483              "INSERT INTO %s VALUES(%d, %d, %d, %s%s%s);\n",
17484              pTab2->zQuoted, iRoot, iPgno, nField,
17485              iMin<0 ? "" : "NULL, ", zVal, pTab2->azlCol[nField]
17486          );
17487        }else{
17488          raw_printf(pState->out, "INSERT INTO %s(%s) VALUES( %s );\n",
17489              pTab2->zQuoted, pTab2->azlCol[nField], zVal
17490          );
17491        }
17492      }
17493      shellReset(&rc, pCells);
17494    }
17495    shellReset(&rc, pPages);
17496    if( pTab!=pOrphan ) recoverFreeTable(pTab);
17497  }
17498  shellFinalize(&rc, pLoop);
17499  shellFinalize(&rc, pPages);
17500  shellFinalize(&rc, pCells);
17501  recoverFreeTable(pOrphan);
17502
17503  /* The rest of the schema */
17504  if( rc==SQLITE_OK ){
17505    sqlite3_stmt *pStmt = 0;
17506    shellPrepare(pState->db, &rc,
17507        "SELECT sql, name FROM recovery.schema "
17508        "WHERE sql NOT LIKE 'create table%'", &pStmt
17509    );
17510    while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
17511      const char *zSql = (const char*)sqlite3_column_text(pStmt, 0);
17512      if( sqlite3_strnicmp(zSql, "create virt", 11)==0 ){
17513        const char *zName = (const char*)sqlite3_column_text(pStmt, 1);
17514        char *zPrint = shellMPrintf(&rc,
17515          "INSERT INTO sqlite_schema VALUES('table', %Q, %Q, 0, %Q)",
17516          zName, zName, zSql
17517        );
17518        raw_printf(pState->out, "%s;\n", zPrint);
17519        sqlite3_free(zPrint);
17520      }else{
17521        raw_printf(pState->out, "%s;\n", zSql);
17522      }
17523    }
17524    shellFinalize(&rc, pStmt);
17525  }
17526
17527  if( rc==SQLITE_OK ){
17528    raw_printf(pState->out, "PRAGMA writable_schema = off;\n");
17529    raw_printf(pState->out, "COMMIT;\n");
17530  }
17531  sqlite3_exec(pState->db, "DETACH recovery", 0, 0, 0);
17532  return rc;
17533}
17534#endif /* !(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) */
17535
17536
17537/*
17538** If an input line begins with "." then invoke this routine to
17539** process that line.
17540**
17541** Return 1 on error, 2 to exit, and 0 otherwise.
17542*/
17543static int do_meta_command(char *zLine, ShellState *p){
17544  int h = 1;
17545  int nArg = 0;
17546  int n, c;
17547  int rc = 0;
17548  char *azArg[52];
17549
17550#ifndef SQLITE_OMIT_VIRTUALTABLE
17551  if( p->expert.pExpert ){
17552    expertFinish(p, 1, 0);
17553  }
17554#endif
17555
17556  /* Parse the input line into tokens.
17557  */
17558  while( zLine[h] && nArg<ArraySize(azArg)-1 ){
17559    while( IsSpace(zLine[h]) ){ h++; }
17560    if( zLine[h]==0 ) break;
17561    if( zLine[h]=='\'' || zLine[h]=='"' ){
17562      int delim = zLine[h++];
17563      azArg[nArg++] = &zLine[h];
17564      while( zLine[h] && zLine[h]!=delim ){
17565        if( zLine[h]=='\\' && delim=='"' && zLine[h+1]!=0 ) h++;
17566        h++;
17567      }
17568      if( zLine[h]==delim ){
17569        zLine[h++] = 0;
17570      }
17571      if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
17572    }else{
17573      azArg[nArg++] = &zLine[h];
17574      while( zLine[h] && !IsSpace(zLine[h]) ){ h++; }
17575      if( zLine[h] ) zLine[h++] = 0;
17576      resolve_backslashes(azArg[nArg-1]);
17577    }
17578  }
17579  azArg[nArg] = 0;
17580
17581  /* Process the input line.
17582  */
17583  if( nArg==0 ) return 0; /* no tokens, no error */
17584  n = strlen30(azArg[0]);
17585  c = azArg[0][0];
17586  clearTempFile(p);
17587
17588#ifndef SQLITE_OMIT_AUTHORIZATION
17589  if( c=='a' && strncmp(azArg[0], "auth", n)==0 ){
17590    if( nArg!=2 ){
17591      raw_printf(stderr, "Usage: .auth ON|OFF\n");
17592      rc = 1;
17593      goto meta_command_exit;
17594    }
17595    open_db(p, 0);
17596    if( booleanValue(azArg[1]) ){
17597      sqlite3_set_authorizer(p->db, shellAuth, p);
17598    }else{
17599      sqlite3_set_authorizer(p->db, 0, 0);
17600    }
17601  }else
17602#endif
17603
17604#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
17605  if( c=='a' && strncmp(azArg[0], "archive", n)==0 ){
17606    open_db(p, 0);
17607    rc = arDotCommand(p, 0, azArg, nArg);
17608  }else
17609#endif
17610
17611  if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0)
17612   || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0)
17613  ){
17614    const char *zDestFile = 0;
17615    const char *zDb = 0;
17616    sqlite3 *pDest;
17617    sqlite3_backup *pBackup;
17618    int j;
17619    int bAsync = 0;
17620    const char *zVfs = 0;
17621    for(j=1; j<nArg; j++){
17622      const char *z = azArg[j];
17623      if( z[0]=='-' ){
17624        if( z[1]=='-' ) z++;
17625        if( strcmp(z, "-append")==0 ){
17626          zVfs = "apndvfs";
17627        }else
17628        if( strcmp(z, "-async")==0 ){
17629          bAsync = 1;
17630        }else
17631        {
17632          utf8_printf(stderr, "unknown option: %s\n", azArg[j]);
17633          return 1;
17634        }
17635      }else if( zDestFile==0 ){
17636        zDestFile = azArg[j];
17637      }else if( zDb==0 ){
17638        zDb = zDestFile;
17639        zDestFile = azArg[j];
17640      }else{
17641        raw_printf(stderr, "Usage: .backup ?DB? ?OPTIONS? FILENAME\n");
17642        return 1;
17643      }
17644    }
17645    if( zDestFile==0 ){
17646      raw_printf(stderr, "missing FILENAME argument on .backup\n");
17647      return 1;
17648    }
17649    if( zDb==0 ) zDb = "main";
17650    rc = sqlite3_open_v2(zDestFile, &pDest,
17651                  SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE, zVfs);
17652    if( rc!=SQLITE_OK ){
17653      utf8_printf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
17654      close_db(pDest);
17655      return 1;
17656    }
17657    if( bAsync ){
17658      sqlite3_exec(pDest, "PRAGMA synchronous=OFF; PRAGMA journal_mode=OFF;",
17659                   0, 0, 0);
17660    }
17661    open_db(p, 0);
17662    pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
17663    if( pBackup==0 ){
17664      utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
17665      close_db(pDest);
17666      return 1;
17667    }
17668    while(  (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
17669    sqlite3_backup_finish(pBackup);
17670    if( rc==SQLITE_DONE ){
17671      rc = 0;
17672    }else{
17673      utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
17674      rc = 1;
17675    }
17676    close_db(pDest);
17677  }else
17678
17679  if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 ){
17680    if( nArg==2 ){
17681      bail_on_error = booleanValue(azArg[1]);
17682    }else{
17683      raw_printf(stderr, "Usage: .bail on|off\n");
17684      rc = 1;
17685    }
17686  }else
17687
17688  if( c=='b' && n>=3 && strncmp(azArg[0], "binary", n)==0 ){
17689    if( nArg==2 ){
17690      if( booleanValue(azArg[1]) ){
17691        setBinaryMode(p->out, 1);
17692      }else{
17693        setTextMode(p->out, 1);
17694      }
17695    }else{
17696      raw_printf(stderr, "Usage: .binary on|off\n");
17697      rc = 1;
17698    }
17699  }else
17700
17701  if( c=='c' && strcmp(azArg[0],"cd")==0 ){
17702    if( nArg==2 ){
17703#if defined(_WIN32) || defined(WIN32)
17704      wchar_t *z = sqlite3_win32_utf8_to_unicode(azArg[1]);
17705      rc = !SetCurrentDirectoryW(z);
17706      sqlite3_free(z);
17707#else
17708      rc = chdir(azArg[1]);
17709#endif
17710      if( rc ){
17711        utf8_printf(stderr, "Cannot change to directory \"%s\"\n", azArg[1]);
17712        rc = 1;
17713      }
17714    }else{
17715      raw_printf(stderr, "Usage: .cd DIRECTORY\n");
17716      rc = 1;
17717    }
17718  }else
17719
17720  /* The undocumented ".breakpoint" command causes a call to the no-op
17721  ** routine named test_breakpoint().
17722  */
17723  if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
17724    test_breakpoint();
17725  }else
17726
17727  if( c=='c' && n>=3 && strncmp(azArg[0], "changes", n)==0 ){
17728    if( nArg==2 ){
17729      setOrClearFlag(p, SHFLG_CountChanges, azArg[1]);
17730    }else{
17731      raw_printf(stderr, "Usage: .changes on|off\n");
17732      rc = 1;
17733    }
17734  }else
17735
17736  /* Cancel output redirection, if it is currently set (by .testcase)
17737  ** Then read the content of the testcase-out.txt file and compare against
17738  ** azArg[1].  If there are differences, report an error and exit.
17739  */
17740  if( c=='c' && n>=3 && strncmp(azArg[0], "check", n)==0 ){
17741    char *zRes = 0;
17742    output_reset(p);
17743    if( nArg!=2 ){
17744      raw_printf(stderr, "Usage: .check GLOB-PATTERN\n");
17745      rc = 2;
17746    }else if( (zRes = readFile("testcase-out.txt", 0))==0 ){
17747      raw_printf(stderr, "Error: cannot read 'testcase-out.txt'\n");
17748      rc = 2;
17749    }else if( testcase_glob(azArg[1],zRes)==0 ){
17750      utf8_printf(stderr,
17751                 "testcase-%s FAILED\n Expected: [%s]\n      Got: [%s]\n",
17752                 p->zTestcase, azArg[1], zRes);
17753      rc = 1;
17754    }else{
17755      utf8_printf(stdout, "testcase-%s ok\n", p->zTestcase);
17756      p->nCheck++;
17757    }
17758    sqlite3_free(zRes);
17759  }else
17760
17761  if( c=='c' && strncmp(azArg[0], "clone", n)==0 ){
17762    if( nArg==2 ){
17763      tryToClone(p, azArg[1]);
17764    }else{
17765      raw_printf(stderr, "Usage: .clone FILENAME\n");
17766      rc = 1;
17767    }
17768  }else
17769
17770  if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){
17771    char **azName = 0;
17772    int nName = 0;
17773    sqlite3_stmt *pStmt;
17774    int i;
17775    open_db(p, 0);
17776    rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
17777    if( rc ){
17778      utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
17779      rc = 1;
17780    }else{
17781      while( sqlite3_step(pStmt)==SQLITE_ROW ){
17782        const char *zSchema = (const char *)sqlite3_column_text(pStmt,1);
17783        const char *zFile = (const char*)sqlite3_column_text(pStmt,2);
17784        azName = sqlite3_realloc(azName, (nName+1)*2*sizeof(char*));
17785        if( azName==0 ){ shell_out_of_memory();  /* Does not return */ }
17786        azName[nName*2] = strdup(zSchema);
17787        azName[nName*2+1] = strdup(zFile);
17788        nName++;
17789      }
17790    }
17791    sqlite3_finalize(pStmt);
17792    for(i=0; i<nName; i++){
17793      int eTxn = sqlite3_txn_state(p->db, azName[i*2]);
17794      int bRdonly = sqlite3_db_readonly(p->db, azName[i*2]);
17795      const char *z = azName[i*2+1];
17796      utf8_printf(p->out, "%s: %s %s%s\n",
17797         azName[i*2],
17798         z && z[0] ? z : "\"\"",
17799         bRdonly ? "r/o" : "r/w",
17800         eTxn==SQLITE_TXN_NONE ? "" :
17801            eTxn==SQLITE_TXN_READ ? " read-txn" : " write-txn");
17802      free(azName[i*2]);
17803      free(azName[i*2+1]);
17804    }
17805    sqlite3_free(azName);
17806  }else
17807
17808  if( c=='d' && n>=3 && strncmp(azArg[0], "dbconfig", n)==0 ){
17809    static const struct DbConfigChoices {
17810      const char *zName;
17811      int op;
17812    } aDbConfig[] = {
17813        { "defensive",          SQLITE_DBCONFIG_DEFENSIVE             },
17814        { "dqs_ddl",            SQLITE_DBCONFIG_DQS_DDL               },
17815        { "dqs_dml",            SQLITE_DBCONFIG_DQS_DML               },
17816        { "enable_fkey",        SQLITE_DBCONFIG_ENABLE_FKEY           },
17817        { "enable_qpsg",        SQLITE_DBCONFIG_ENABLE_QPSG           },
17818        { "enable_trigger",     SQLITE_DBCONFIG_ENABLE_TRIGGER        },
17819        { "enable_view",        SQLITE_DBCONFIG_ENABLE_VIEW           },
17820        { "fts3_tokenizer",     SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER },
17821        { "legacy_alter_table", SQLITE_DBCONFIG_LEGACY_ALTER_TABLE    },
17822        { "legacy_file_format", SQLITE_DBCONFIG_LEGACY_FILE_FORMAT    },
17823        { "load_extension",     SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION },
17824        { "no_ckpt_on_close",   SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE      },
17825        { "reset_database",     SQLITE_DBCONFIG_RESET_DATABASE        },
17826        { "trigger_eqp",        SQLITE_DBCONFIG_TRIGGER_EQP           },
17827        { "trusted_schema",     SQLITE_DBCONFIG_TRUSTED_SCHEMA        },
17828        { "writable_schema",    SQLITE_DBCONFIG_WRITABLE_SCHEMA       },
17829    };
17830    int ii, v;
17831    open_db(p, 0);
17832    for(ii=0; ii<ArraySize(aDbConfig); ii++){
17833      if( nArg>1 && strcmp(azArg[1], aDbConfig[ii].zName)!=0 ) continue;
17834      if( nArg>=3 ){
17835        sqlite3_db_config(p->db, aDbConfig[ii].op, booleanValue(azArg[2]), 0);
17836      }
17837      sqlite3_db_config(p->db, aDbConfig[ii].op, -1, &v);
17838      utf8_printf(p->out, "%19s %s\n", aDbConfig[ii].zName, v ? "on" : "off");
17839      if( nArg>1 ) break;
17840    }
17841    if( nArg>1 && ii==ArraySize(aDbConfig) ){
17842      utf8_printf(stderr, "Error: unknown dbconfig \"%s\"\n", azArg[1]);
17843      utf8_printf(stderr, "Enter \".dbconfig\" with no arguments for a list\n");
17844    }
17845  }else
17846
17847  if( c=='d' && n>=3 && strncmp(azArg[0], "dbinfo", n)==0 ){
17848    rc = shell_dbinfo_command(p, nArg, azArg);
17849  }else
17850
17851#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
17852  if( c=='r' && strncmp(azArg[0], "recover", n)==0 ){
17853    open_db(p, 0);
17854    rc = recoverDatabaseCmd(p, nArg, azArg);
17855  }else
17856#endif /* !(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) */
17857
17858  if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){
17859    char *zLike = 0;
17860    char *zSql;
17861    int i;
17862    int savedShowHeader = p->showHeader;
17863    int savedShellFlags = p->shellFlgs;
17864    ShellClearFlag(p,
17865       SHFLG_PreserveRowid|SHFLG_Newlines|SHFLG_Echo
17866       |SHFLG_DumpDataOnly|SHFLG_DumpNoSys);
17867    for(i=1; i<nArg; i++){
17868      if( azArg[i][0]=='-' ){
17869        const char *z = azArg[i]+1;
17870        if( z[0]=='-' ) z++;
17871        if( strcmp(z,"preserve-rowids")==0 ){
17872#ifdef SQLITE_OMIT_VIRTUALTABLE
17873          raw_printf(stderr, "The --preserve-rowids option is not compatible"
17874                             " with SQLITE_OMIT_VIRTUALTABLE\n");
17875          rc = 1;
17876          sqlite3_free(zLike);
17877          goto meta_command_exit;
17878#else
17879          ShellSetFlag(p, SHFLG_PreserveRowid);
17880#endif
17881        }else
17882        if( strcmp(z,"newlines")==0 ){
17883          ShellSetFlag(p, SHFLG_Newlines);
17884        }else
17885        if( strcmp(z,"data-only")==0 ){
17886          ShellSetFlag(p, SHFLG_DumpDataOnly);
17887        }else
17888        if( strcmp(z,"nosys")==0 ){
17889          ShellSetFlag(p, SHFLG_DumpNoSys);
17890        }else
17891        {
17892          raw_printf(stderr, "Unknown option \"%s\" on \".dump\"\n", azArg[i]);
17893          rc = 1;
17894          sqlite3_free(zLike);
17895          goto meta_command_exit;
17896        }
17897      }else if( zLike ){
17898        zLike = sqlite3_mprintf("%z OR name LIKE %Q ESCAPE '\\'",
17899                zLike, azArg[i]);
17900      }else{
17901        zLike = sqlite3_mprintf("name LIKE %Q ESCAPE '\\'", azArg[i]);
17902      }
17903    }
17904
17905    open_db(p, 0);
17906
17907    if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
17908      /* When playing back a "dump", the content might appear in an order
17909      ** which causes immediate foreign key constraints to be violated.
17910      ** So disable foreign-key constraint enforcement to prevent problems. */
17911      raw_printf(p->out, "PRAGMA foreign_keys=OFF;\n");
17912      raw_printf(p->out, "BEGIN TRANSACTION;\n");
17913    }
17914    p->writableSchema = 0;
17915    p->showHeader = 0;
17916    /* Set writable_schema=ON since doing so forces SQLite to initialize
17917    ** as much of the schema as it can even if the sqlite_schema table is
17918    ** corrupt. */
17919    sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
17920    p->nErr = 0;
17921    if( zLike==0 ) zLike = sqlite3_mprintf("true");
17922    zSql = sqlite3_mprintf(
17923      "SELECT name, type, sql FROM sqlite_schema "
17924      "WHERE (%s) AND type=='table'"
17925      "  AND sql NOT NULL"
17926      " ORDER BY tbl_name='sqlite_sequence', rowid",
17927      zLike
17928    );
17929    run_schema_dump_query(p,zSql);
17930    sqlite3_free(zSql);
17931    if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
17932      zSql = sqlite3_mprintf(
17933        "SELECT sql FROM sqlite_schema "
17934        "WHERE (%s) AND sql NOT NULL"
17935        "  AND type IN ('index','trigger','view')",
17936        zLike
17937      );
17938      run_table_dump_query(p, zSql);
17939      sqlite3_free(zSql);
17940    }
17941    sqlite3_free(zLike);
17942    if( p->writableSchema ){
17943      raw_printf(p->out, "PRAGMA writable_schema=OFF;\n");
17944      p->writableSchema = 0;
17945    }
17946    sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
17947    sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
17948    if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
17949      raw_printf(p->out, p->nErr?"ROLLBACK; -- due to errors\n":"COMMIT;\n");
17950    }
17951    p->showHeader = savedShowHeader;
17952    p->shellFlgs = savedShellFlags;
17953  }else
17954
17955  if( c=='e' && strncmp(azArg[0], "echo", n)==0 ){
17956    if( nArg==2 ){
17957      setOrClearFlag(p, SHFLG_Echo, azArg[1]);
17958    }else{
17959      raw_printf(stderr, "Usage: .echo on|off\n");
17960      rc = 1;
17961    }
17962  }else
17963
17964  if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){
17965    if( nArg==2 ){
17966      p->autoEQPtest = 0;
17967      if( p->autoEQPtrace ){
17968        if( p->db ) sqlite3_exec(p->db, "PRAGMA vdbe_trace=OFF;", 0, 0, 0);
17969        p->autoEQPtrace = 0;
17970      }
17971      if( strcmp(azArg[1],"full")==0 ){
17972        p->autoEQP = AUTOEQP_full;
17973      }else if( strcmp(azArg[1],"trigger")==0 ){
17974        p->autoEQP = AUTOEQP_trigger;
17975#ifdef SQLITE_DEBUG
17976      }else if( strcmp(azArg[1],"test")==0 ){
17977        p->autoEQP = AUTOEQP_on;
17978        p->autoEQPtest = 1;
17979      }else if( strcmp(azArg[1],"trace")==0 ){
17980        p->autoEQP = AUTOEQP_full;
17981        p->autoEQPtrace = 1;
17982        open_db(p, 0);
17983        sqlite3_exec(p->db, "SELECT name FROM sqlite_schema LIMIT 1", 0, 0, 0);
17984        sqlite3_exec(p->db, "PRAGMA vdbe_trace=ON;", 0, 0, 0);
17985#endif
17986      }else{
17987        p->autoEQP = (u8)booleanValue(azArg[1]);
17988      }
17989    }else{
17990      raw_printf(stderr, "Usage: .eqp off|on|trace|trigger|full\n");
17991      rc = 1;
17992    }
17993  }else
17994
17995  if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
17996    if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
17997    rc = 2;
17998  }else
17999
18000  /* The ".explain" command is automatic now.  It is largely pointless.  It
18001  ** retained purely for backwards compatibility */
18002  if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){
18003    int val = 1;
18004    if( nArg>=2 ){
18005      if( strcmp(azArg[1],"auto")==0 ){
18006        val = 99;
18007      }else{
18008        val =  booleanValue(azArg[1]);
18009      }
18010    }
18011    if( val==1 && p->mode!=MODE_Explain ){
18012      p->normalMode = p->mode;
18013      p->mode = MODE_Explain;
18014      p->autoExplain = 0;
18015    }else if( val==0 ){
18016      if( p->mode==MODE_Explain ) p->mode = p->normalMode;
18017      p->autoExplain = 0;
18018    }else if( val==99 ){
18019      if( p->mode==MODE_Explain ) p->mode = p->normalMode;
18020      p->autoExplain = 1;
18021    }
18022  }else
18023
18024#ifndef SQLITE_OMIT_VIRTUALTABLE
18025  if( c=='e' && strncmp(azArg[0], "expert", n)==0 ){
18026    open_db(p, 0);
18027    expertDotCommand(p, azArg, nArg);
18028  }else
18029#endif
18030
18031  if( c=='f' && strncmp(azArg[0], "filectrl", n)==0 ){
18032    static const struct {
18033       const char *zCtrlName;   /* Name of a test-control option */
18034       int ctrlCode;            /* Integer code for that option */
18035       const char *zUsage;      /* Usage notes */
18036    } aCtrl[] = {
18037      { "chunk_size",     SQLITE_FCNTL_CHUNK_SIZE,      "SIZE"           },
18038      { "data_version",   SQLITE_FCNTL_DATA_VERSION,    ""               },
18039      { "has_moved",      SQLITE_FCNTL_HAS_MOVED,       ""               },
18040      { "lock_timeout",   SQLITE_FCNTL_LOCK_TIMEOUT,    "MILLISEC"       },
18041      { "persist_wal",    SQLITE_FCNTL_PERSIST_WAL,     "[BOOLEAN]"      },
18042   /* { "pragma",         SQLITE_FCNTL_PRAGMA,          "NAME ARG"       },*/
18043      { "psow",       SQLITE_FCNTL_POWERSAFE_OVERWRITE, "[BOOLEAN]"      },
18044      { "reserve_bytes",  SQLITE_FCNTL_RESERVE_BYTES,   "[N]"            },
18045      { "size_limit",     SQLITE_FCNTL_SIZE_LIMIT,      "[LIMIT]"        },
18046      { "tempfilename",   SQLITE_FCNTL_TEMPFILENAME,    ""               },
18047   /* { "win32_av_retry", SQLITE_FCNTL_WIN32_AV_RETRY,  "COUNT DELAY"    },*/
18048    };
18049    int filectrl = -1;
18050    int iCtrl = -1;
18051    sqlite3_int64 iRes = 0;  /* Integer result to display if rc2==1 */
18052    int isOk = 0;            /* 0: usage  1: %lld  2: no-result */
18053    int n2, i;
18054    const char *zCmd = 0;
18055    const char *zSchema = 0;
18056
18057    open_db(p, 0);
18058    zCmd = nArg>=2 ? azArg[1] : "help";
18059
18060    if( zCmd[0]=='-'
18061     && (strcmp(zCmd,"--schema")==0 || strcmp(zCmd,"-schema")==0)
18062     && nArg>=4
18063    ){
18064      zSchema = azArg[2];
18065      for(i=3; i<nArg; i++) azArg[i-2] = azArg[i];
18066      nArg -= 2;
18067      zCmd = azArg[1];
18068    }
18069
18070    /* The argument can optionally begin with "-" or "--" */
18071    if( zCmd[0]=='-' && zCmd[1] ){
18072      zCmd++;
18073      if( zCmd[0]=='-' && zCmd[1] ) zCmd++;
18074    }
18075
18076    /* --help lists all file-controls */
18077    if( strcmp(zCmd,"help")==0 ){
18078      utf8_printf(p->out, "Available file-controls:\n");
18079      for(i=0; i<ArraySize(aCtrl); i++){
18080        utf8_printf(p->out, "  .filectrl %s %s\n",
18081                    aCtrl[i].zCtrlName, aCtrl[i].zUsage);
18082      }
18083      rc = 1;
18084      goto meta_command_exit;
18085    }
18086
18087    /* convert filectrl text option to value. allow any unique prefix
18088    ** of the option name, or a numerical value. */
18089    n2 = strlen30(zCmd);
18090    for(i=0; i<ArraySize(aCtrl); i++){
18091      if( strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){
18092        if( filectrl<0 ){
18093          filectrl = aCtrl[i].ctrlCode;
18094          iCtrl = i;
18095        }else{
18096          utf8_printf(stderr, "Error: ambiguous file-control: \"%s\"\n"
18097                              "Use \".filectrl --help\" for help\n", zCmd);
18098          rc = 1;
18099          goto meta_command_exit;
18100        }
18101      }
18102    }
18103    if( filectrl<0 ){
18104      utf8_printf(stderr,"Error: unknown file-control: %s\n"
18105                         "Use \".filectrl --help\" for help\n", zCmd);
18106    }else{
18107      switch(filectrl){
18108        case SQLITE_FCNTL_SIZE_LIMIT: {
18109          if( nArg!=2 && nArg!=3 ) break;
18110          iRes = nArg==3 ? integerValue(azArg[2]) : -1;
18111          sqlite3_file_control(p->db, zSchema, SQLITE_FCNTL_SIZE_LIMIT, &iRes);
18112          isOk = 1;
18113          break;
18114        }
18115        case SQLITE_FCNTL_LOCK_TIMEOUT:
18116        case SQLITE_FCNTL_CHUNK_SIZE: {
18117          int x;
18118          if( nArg!=3 ) break;
18119          x = (int)integerValue(azArg[2]);
18120          sqlite3_file_control(p->db, zSchema, filectrl, &x);
18121          isOk = 2;
18122          break;
18123        }
18124        case SQLITE_FCNTL_PERSIST_WAL:
18125        case SQLITE_FCNTL_POWERSAFE_OVERWRITE: {
18126          int x;
18127          if( nArg!=2 && nArg!=3 ) break;
18128          x = nArg==3 ? booleanValue(azArg[2]) : -1;
18129          sqlite3_file_control(p->db, zSchema, filectrl, &x);
18130          iRes = x;
18131          isOk = 1;
18132          break;
18133        }
18134        case SQLITE_FCNTL_DATA_VERSION:
18135        case SQLITE_FCNTL_HAS_MOVED: {
18136          int x;
18137          if( nArg!=2 ) break;
18138          sqlite3_file_control(p->db, zSchema, filectrl, &x);
18139          iRes = x;
18140          isOk = 1;
18141          break;
18142        }
18143        case SQLITE_FCNTL_TEMPFILENAME: {
18144          char *z = 0;
18145          if( nArg!=2 ) break;
18146          sqlite3_file_control(p->db, zSchema, filectrl, &z);
18147          if( z ){
18148            utf8_printf(p->out, "%s\n", z);
18149            sqlite3_free(z);
18150          }
18151          isOk = 2;
18152          break;
18153        }
18154        case SQLITE_FCNTL_RESERVE_BYTES: {
18155          int x;
18156          if( nArg>=3 ){
18157            x = atoi(azArg[2]);
18158            sqlite3_file_control(p->db, zSchema, filectrl, &x);
18159          }
18160          x = -1;
18161          sqlite3_file_control(p->db, zSchema, filectrl, &x);
18162          utf8_printf(p->out,"%d\n", x);
18163          isOk = 2;
18164          break;
18165        }
18166      }
18167    }
18168    if( isOk==0 && iCtrl>=0 ){
18169      utf8_printf(p->out, "Usage: .filectrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage);
18170      rc = 1;
18171    }else if( isOk==1 ){
18172      char zBuf[100];
18173      sqlite3_snprintf(sizeof(zBuf), zBuf, "%lld", iRes);
18174      raw_printf(p->out, "%s\n", zBuf);
18175    }
18176  }else
18177
18178  if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){
18179    ShellState data;
18180    char *zErrMsg = 0;
18181    int doStats = 0;
18182    memcpy(&data, p, sizeof(data));
18183    data.showHeader = 0;
18184    data.cMode = data.mode = MODE_Semi;
18185    if( nArg==2 && optionMatch(azArg[1], "indent") ){
18186      data.cMode = data.mode = MODE_Pretty;
18187      nArg = 1;
18188    }
18189    if( nArg!=1 ){
18190      raw_printf(stderr, "Usage: .fullschema ?--indent?\n");
18191      rc = 1;
18192      goto meta_command_exit;
18193    }
18194    open_db(p, 0);
18195    rc = sqlite3_exec(p->db,
18196       "SELECT sql FROM"
18197       "  (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
18198       "     FROM sqlite_schema UNION ALL"
18199       "   SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_schema) "
18200       "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
18201       "ORDER BY rowid",
18202       callback, &data, &zErrMsg
18203    );
18204    if( rc==SQLITE_OK ){
18205      sqlite3_stmt *pStmt;
18206      rc = sqlite3_prepare_v2(p->db,
18207               "SELECT rowid FROM sqlite_schema"
18208               " WHERE name GLOB 'sqlite_stat[134]'",
18209               -1, &pStmt, 0);
18210      doStats = sqlite3_step(pStmt)==SQLITE_ROW;
18211      sqlite3_finalize(pStmt);
18212    }
18213    if( doStats==0 ){
18214      raw_printf(p->out, "/* No STAT tables available */\n");
18215    }else{
18216      raw_printf(p->out, "ANALYZE sqlite_schema;\n");
18217      sqlite3_exec(p->db, "SELECT 'ANALYZE sqlite_schema'",
18218                   callback, &data, &zErrMsg);
18219      data.cMode = data.mode = MODE_Insert;
18220      data.zDestTable = "sqlite_stat1";
18221      shell_exec(&data, "SELECT * FROM sqlite_stat1", &zErrMsg);
18222      data.zDestTable = "sqlite_stat4";
18223      shell_exec(&data, "SELECT * FROM sqlite_stat4", &zErrMsg);
18224      raw_printf(p->out, "ANALYZE sqlite_schema;\n");
18225    }
18226  }else
18227
18228  if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){
18229    if( nArg==2 ){
18230      p->showHeader = booleanValue(azArg[1]);
18231      p->shellFlgs |= SHFLG_HeaderSet;
18232    }else{
18233      raw_printf(stderr, "Usage: .headers on|off\n");
18234      rc = 1;
18235    }
18236  }else
18237
18238  if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
18239    if( nArg>=2 ){
18240      n = showHelp(p->out, azArg[1]);
18241      if( n==0 ){
18242        utf8_printf(p->out, "Nothing matches '%s'\n", azArg[1]);
18243      }
18244    }else{
18245      showHelp(p->out, 0);
18246    }
18247  }else
18248
18249  if( c=='i' && strncmp(azArg[0], "import", n)==0 ){
18250    char *zTable = 0;           /* Insert data into this table */
18251    char *zFile = 0;            /* Name of file to extra content from */
18252    sqlite3_stmt *pStmt = NULL; /* A statement */
18253    int nCol;                   /* Number of columns in the table */
18254    int nByte;                  /* Number of bytes in an SQL string */
18255    int i, j;                   /* Loop counters */
18256    int needCommit;             /* True to COMMIT or ROLLBACK at end */
18257    int nSep;                   /* Number of bytes in p->colSeparator[] */
18258    char *zSql;                 /* An SQL statement */
18259    ImportCtx sCtx;             /* Reader context */
18260    char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */
18261    int eVerbose = 0;           /* Larger for more console output */
18262    int nSkip = 0;              /* Initial lines to skip */
18263    int useOutputMode = 1;      /* Use output mode to determine separators */
18264
18265    memset(&sCtx, 0, sizeof(sCtx));
18266    if( p->mode==MODE_Ascii ){
18267      xRead = ascii_read_one_field;
18268    }else{
18269      xRead = csv_read_one_field;
18270    }
18271    for(i=1; i<nArg; i++){
18272      char *z = azArg[i];
18273      if( z[0]=='-' && z[1]=='-' ) z++;
18274      if( z[0]!='-' ){
18275        if( zFile==0 ){
18276          zFile = z;
18277        }else if( zTable==0 ){
18278          zTable = z;
18279        }else{
18280          utf8_printf(p->out, "ERROR: extra argument: \"%s\".  Usage:\n", z);
18281          showHelp(p->out, "import");
18282          rc = 1;
18283          goto meta_command_exit;
18284        }
18285      }else if( strcmp(z,"-v")==0 ){
18286        eVerbose++;
18287      }else if( strcmp(z,"-skip")==0 && i<nArg-1 ){
18288        nSkip = integerValue(azArg[++i]);
18289      }else if( strcmp(z,"-ascii")==0 ){
18290        sCtx.cColSep = SEP_Unit[0];
18291        sCtx.cRowSep = SEP_Record[0];
18292        xRead = ascii_read_one_field;
18293        useOutputMode = 0;
18294      }else if( strcmp(z,"-csv")==0 ){
18295        sCtx.cColSep = ',';
18296        sCtx.cRowSep = '\n';
18297        xRead = csv_read_one_field;
18298        useOutputMode = 0;
18299      }else{
18300        utf8_printf(p->out, "ERROR: unknown option: \"%s\".  Usage:\n", z);
18301        showHelp(p->out, "import");
18302        rc = 1;
18303        goto meta_command_exit;
18304      }
18305    }
18306    if( zTable==0 ){
18307      utf8_printf(p->out, "ERROR: missing %s argument. Usage:\n",
18308                  zFile==0 ? "FILE" : "TABLE");
18309      showHelp(p->out, "import");
18310      rc = 1;
18311      goto meta_command_exit;
18312    }
18313    seenInterrupt = 0;
18314    open_db(p, 0);
18315    if( useOutputMode ){
18316      /* If neither the --csv or --ascii options are specified, then set
18317      ** the column and row separator characters from the output mode. */
18318      nSep = strlen30(p->colSeparator);
18319      if( nSep==0 ){
18320        raw_printf(stderr,
18321                   "Error: non-null column separator required for import\n");
18322        rc = 1;
18323        goto meta_command_exit;
18324      }
18325      if( nSep>1 ){
18326        raw_printf(stderr,
18327              "Error: multi-character column separators not allowed"
18328              " for import\n");
18329        rc = 1;
18330        goto meta_command_exit;
18331      }
18332      nSep = strlen30(p->rowSeparator);
18333      if( nSep==0 ){
18334        raw_printf(stderr,
18335            "Error: non-null row separator required for import\n");
18336        rc = 1;
18337        goto meta_command_exit;
18338      }
18339      if( nSep==2 && p->mode==MODE_Csv && strcmp(p->rowSeparator,SEP_CrLf)==0 ){
18340        /* When importing CSV (only), if the row separator is set to the
18341        ** default output row separator, change it to the default input
18342        ** row separator.  This avoids having to maintain different input
18343        ** and output row separators. */
18344        sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
18345        nSep = strlen30(p->rowSeparator);
18346      }
18347      if( nSep>1 ){
18348        raw_printf(stderr, "Error: multi-character row separators not allowed"
18349                           " for import\n");
18350        rc = 1;
18351        goto meta_command_exit;
18352      }
18353      sCtx.cColSep = p->colSeparator[0];
18354      sCtx.cRowSep = p->rowSeparator[0];
18355    }
18356    sCtx.zFile = zFile;
18357    sCtx.nLine = 1;
18358    if( sCtx.zFile[0]=='|' ){
18359#ifdef SQLITE_OMIT_POPEN
18360      raw_printf(stderr, "Error: pipes are not supported in this OS\n");
18361      rc = 1;
18362      goto meta_command_exit;
18363#else
18364      sCtx.in = popen(sCtx.zFile+1, "r");
18365      sCtx.zFile = "<pipe>";
18366      sCtx.xCloser = pclose;
18367#endif
18368    }else{
18369      sCtx.in = fopen(sCtx.zFile, "rb");
18370      sCtx.xCloser = fclose;
18371    }
18372    if( sCtx.in==0 ){
18373      utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
18374      rc = 1;
18375      goto meta_command_exit;
18376    }
18377    if( eVerbose>=2 || (eVerbose>=1 && useOutputMode) ){
18378      char zSep[2];
18379      zSep[1] = 0;
18380      zSep[0] = sCtx.cColSep;
18381      utf8_printf(p->out, "Column separator ");
18382      output_c_string(p->out, zSep);
18383      utf8_printf(p->out, ", row separator ");
18384      zSep[0] = sCtx.cRowSep;
18385      output_c_string(p->out, zSep);
18386      utf8_printf(p->out, "\n");
18387    }
18388    while( (nSkip--)>0 ){
18389      while( xRead(&sCtx) && sCtx.cTerm==sCtx.cColSep ){}
18390    }
18391    zSql = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
18392    if( zSql==0 ){
18393      import_cleanup(&sCtx);
18394      shell_out_of_memory();
18395    }
18396    nByte = strlen30(zSql);
18397    rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
18398    import_append_char(&sCtx, 0);    /* To ensure sCtx.z is allocated */
18399    if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(p->db))==0 ){
18400      char *zCreate = sqlite3_mprintf("CREATE TABLE \"%w\"", zTable);
18401      char cSep = '(';
18402      while( xRead(&sCtx) ){
18403        zCreate = sqlite3_mprintf("%z%c\n  \"%w\" TEXT", zCreate, cSep, sCtx.z);
18404        cSep = ',';
18405        if( sCtx.cTerm!=sCtx.cColSep ) break;
18406      }
18407      if( cSep=='(' ){
18408        sqlite3_free(zCreate);
18409        import_cleanup(&sCtx);
18410        utf8_printf(stderr,"%s: empty file\n", sCtx.zFile);
18411        rc = 1;
18412        goto meta_command_exit;
18413      }
18414      zCreate = sqlite3_mprintf("%z\n)", zCreate);
18415      if( eVerbose>=1 ){
18416        utf8_printf(p->out, "%s\n", zCreate);
18417      }
18418      rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
18419      sqlite3_free(zCreate);
18420      if( rc ){
18421        utf8_printf(stderr, "CREATE TABLE \"%s\"(...) failed: %s\n", zTable,
18422                sqlite3_errmsg(p->db));
18423        import_cleanup(&sCtx);
18424        rc = 1;
18425        goto meta_command_exit;
18426      }
18427      rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
18428    }
18429    sqlite3_free(zSql);
18430    if( rc ){
18431      if (pStmt) sqlite3_finalize(pStmt);
18432      utf8_printf(stderr,"Error: %s\n", sqlite3_errmsg(p->db));
18433      import_cleanup(&sCtx);
18434      rc = 1;
18435      goto meta_command_exit;
18436    }
18437    nCol = sqlite3_column_count(pStmt);
18438    sqlite3_finalize(pStmt);
18439    pStmt = 0;
18440    if( nCol==0 ) return 0; /* no columns, no error */
18441    zSql = sqlite3_malloc64( nByte*2 + 20 + nCol*2 );
18442    if( zSql==0 ){
18443      import_cleanup(&sCtx);
18444      shell_out_of_memory();
18445    }
18446    sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
18447    j = strlen30(zSql);
18448    for(i=1; i<nCol; i++){
18449      zSql[j++] = ',';
18450      zSql[j++] = '?';
18451    }
18452    zSql[j++] = ')';
18453    zSql[j] = 0;
18454    if( eVerbose>=2 ){
18455      utf8_printf(p->out, "Insert using: %s\n", zSql);
18456    }
18457    rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
18458    sqlite3_free(zSql);
18459    if( rc ){
18460      utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
18461      if (pStmt) sqlite3_finalize(pStmt);
18462      import_cleanup(&sCtx);
18463      rc = 1;
18464      goto meta_command_exit;
18465    }
18466    needCommit = sqlite3_get_autocommit(p->db);
18467    if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
18468    do{
18469      int startLine = sCtx.nLine;
18470      for(i=0; i<nCol; i++){
18471        char *z = xRead(&sCtx);
18472        /*
18473        ** Did we reach end-of-file before finding any columns?
18474        ** If so, stop instead of NULL filling the remaining columns.
18475        */
18476        if( z==0 && i==0 ) break;
18477        /*
18478        ** Did we reach end-of-file OR end-of-line before finding any
18479        ** columns in ASCII mode?  If so, stop instead of NULL filling
18480        ** the remaining columns.
18481        */
18482        if( p->mode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break;
18483        sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
18484        if( i<nCol-1 && sCtx.cTerm!=sCtx.cColSep ){
18485          utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
18486                          "filling the rest with NULL\n",
18487                          sCtx.zFile, startLine, nCol, i+1);
18488          i += 2;
18489          while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; }
18490        }
18491      }
18492      if( sCtx.cTerm==sCtx.cColSep ){
18493        do{
18494          xRead(&sCtx);
18495          i++;
18496        }while( sCtx.cTerm==sCtx.cColSep );
18497        utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
18498                        "extras ignored\n",
18499                        sCtx.zFile, startLine, nCol, i);
18500      }
18501      if( i>=nCol ){
18502        sqlite3_step(pStmt);
18503        rc = sqlite3_reset(pStmt);
18504        if( rc!=SQLITE_OK ){
18505          utf8_printf(stderr, "%s:%d: INSERT failed: %s\n", sCtx.zFile,
18506                      startLine, sqlite3_errmsg(p->db));
18507          sCtx.nErr++;
18508        }else{
18509          sCtx.nRow++;
18510        }
18511      }
18512    }while( sCtx.cTerm!=EOF );
18513
18514    import_cleanup(&sCtx);
18515    sqlite3_finalize(pStmt);
18516    if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0);
18517    if( eVerbose>0 ){
18518      utf8_printf(p->out,
18519          "Added %d rows with %d errors using %d lines of input\n",
18520          sCtx.nRow, sCtx.nErr, sCtx.nLine-1);
18521    }
18522  }else
18523
18524#ifndef SQLITE_UNTESTABLE
18525  if( c=='i' && strncmp(azArg[0], "imposter", n)==0 ){
18526    char *zSql;
18527    char *zCollist = 0;
18528    sqlite3_stmt *pStmt;
18529    int tnum = 0;
18530    int isWO = 0;  /* True if making an imposter of a WITHOUT ROWID table */
18531    int lenPK = 0; /* Length of the PRIMARY KEY string for isWO tables */
18532    int i;
18533    if( !(nArg==3 || (nArg==2 && sqlite3_stricmp(azArg[1],"off")==0)) ){
18534      utf8_printf(stderr, "Usage: .imposter INDEX IMPOSTER\n"
18535                          "       .imposter off\n");
18536      /* Also allowed, but not documented:
18537      **
18538      **    .imposter TABLE IMPOSTER
18539      **
18540      ** where TABLE is a WITHOUT ROWID table.  In that case, the
18541      ** imposter is another WITHOUT ROWID table with the columns in
18542      ** storage order. */
18543      rc = 1;
18544      goto meta_command_exit;
18545    }
18546    open_db(p, 0);
18547    if( nArg==2 ){
18548      sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 1);
18549      goto meta_command_exit;
18550    }
18551    zSql = sqlite3_mprintf(
18552      "SELECT rootpage, 0 FROM sqlite_schema"
18553      " WHERE name='%q' AND type='index'"
18554      "UNION ALL "
18555      "SELECT rootpage, 1 FROM sqlite_schema"
18556      " WHERE name='%q' AND type='table'"
18557      "   AND sql LIKE '%%without%%rowid%%'",
18558      azArg[1], azArg[1]
18559    );
18560    sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
18561    sqlite3_free(zSql);
18562    if( sqlite3_step(pStmt)==SQLITE_ROW ){
18563      tnum = sqlite3_column_int(pStmt, 0);
18564      isWO = sqlite3_column_int(pStmt, 1);
18565    }
18566    sqlite3_finalize(pStmt);
18567    zSql = sqlite3_mprintf("PRAGMA index_xinfo='%q'", azArg[1]);
18568    rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
18569    sqlite3_free(zSql);
18570    i = 0;
18571    while( sqlite3_step(pStmt)==SQLITE_ROW ){
18572      char zLabel[20];
18573      const char *zCol = (const char*)sqlite3_column_text(pStmt,2);
18574      i++;
18575      if( zCol==0 ){
18576        if( sqlite3_column_int(pStmt,1)==-1 ){
18577          zCol = "_ROWID_";
18578        }else{
18579          sqlite3_snprintf(sizeof(zLabel),zLabel,"expr%d",i);
18580          zCol = zLabel;
18581        }
18582      }
18583      if( isWO && lenPK==0 && sqlite3_column_int(pStmt,5)==0 && zCollist ){
18584        lenPK = (int)strlen(zCollist);
18585      }
18586      if( zCollist==0 ){
18587        zCollist = sqlite3_mprintf("\"%w\"", zCol);
18588      }else{
18589        zCollist = sqlite3_mprintf("%z,\"%w\"", zCollist, zCol);
18590      }
18591    }
18592    sqlite3_finalize(pStmt);
18593    if( i==0 || tnum==0 ){
18594      utf8_printf(stderr, "no such index: \"%s\"\n", azArg[1]);
18595      rc = 1;
18596      sqlite3_free(zCollist);
18597      goto meta_command_exit;
18598    }
18599    if( lenPK==0 ) lenPK = 100000;
18600    zSql = sqlite3_mprintf(
18601          "CREATE TABLE \"%w\"(%s,PRIMARY KEY(%.*s))WITHOUT ROWID",
18602          azArg[2], zCollist, lenPK, zCollist);
18603    sqlite3_free(zCollist);
18604    rc = sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 1, tnum);
18605    if( rc==SQLITE_OK ){
18606      rc = sqlite3_exec(p->db, zSql, 0, 0, 0);
18607      sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 0);
18608      if( rc ){
18609        utf8_printf(stderr, "Error in [%s]: %s\n", zSql, sqlite3_errmsg(p->db));
18610      }else{
18611        utf8_printf(stdout, "%s;\n", zSql);
18612        raw_printf(stdout,
18613          "WARNING: writing to an imposter table will corrupt the \"%s\" %s!\n",
18614          azArg[1], isWO ? "table" : "index"
18615        );
18616      }
18617    }else{
18618      raw_printf(stderr, "SQLITE_TESTCTRL_IMPOSTER returns %d\n", rc);
18619      rc = 1;
18620    }
18621    sqlite3_free(zSql);
18622  }else
18623#endif /* !defined(SQLITE_OMIT_TEST_CONTROL) */
18624
18625#ifdef SQLITE_ENABLE_IOTRACE
18626  if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
18627    SQLITE_API extern void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...);
18628    if( iotrace && iotrace!=stdout ) fclose(iotrace);
18629    iotrace = 0;
18630    if( nArg<2 ){
18631      sqlite3IoTrace = 0;
18632    }else if( strcmp(azArg[1], "-")==0 ){
18633      sqlite3IoTrace = iotracePrintf;
18634      iotrace = stdout;
18635    }else{
18636      iotrace = fopen(azArg[1], "w");
18637      if( iotrace==0 ){
18638        utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
18639        sqlite3IoTrace = 0;
18640        rc = 1;
18641      }else{
18642        sqlite3IoTrace = iotracePrintf;
18643      }
18644    }
18645  }else
18646#endif
18647
18648  if( c=='l' && n>=5 && strncmp(azArg[0], "limits", n)==0 ){
18649    static const struct {
18650       const char *zLimitName;   /* Name of a limit */
18651       int limitCode;            /* Integer code for that limit */
18652    } aLimit[] = {
18653      { "length",                SQLITE_LIMIT_LENGTH                    },
18654      { "sql_length",            SQLITE_LIMIT_SQL_LENGTH                },
18655      { "column",                SQLITE_LIMIT_COLUMN                    },
18656      { "expr_depth",            SQLITE_LIMIT_EXPR_DEPTH                },
18657      { "compound_select",       SQLITE_LIMIT_COMPOUND_SELECT           },
18658      { "vdbe_op",               SQLITE_LIMIT_VDBE_OP                   },
18659      { "function_arg",          SQLITE_LIMIT_FUNCTION_ARG              },
18660      { "attached",              SQLITE_LIMIT_ATTACHED                  },
18661      { "like_pattern_length",   SQLITE_LIMIT_LIKE_PATTERN_LENGTH       },
18662      { "variable_number",       SQLITE_LIMIT_VARIABLE_NUMBER           },
18663      { "trigger_depth",         SQLITE_LIMIT_TRIGGER_DEPTH             },
18664      { "worker_threads",        SQLITE_LIMIT_WORKER_THREADS            },
18665    };
18666    int i, n2;
18667    open_db(p, 0);
18668    if( nArg==1 ){
18669      for(i=0; i<ArraySize(aLimit); i++){
18670        printf("%20s %d\n", aLimit[i].zLimitName,
18671               sqlite3_limit(p->db, aLimit[i].limitCode, -1));
18672      }
18673    }else if( nArg>3 ){
18674      raw_printf(stderr, "Usage: .limit NAME ?NEW-VALUE?\n");
18675      rc = 1;
18676      goto meta_command_exit;
18677    }else{
18678      int iLimit = -1;
18679      n2 = strlen30(azArg[1]);
18680      for(i=0; i<ArraySize(aLimit); i++){
18681        if( sqlite3_strnicmp(aLimit[i].zLimitName, azArg[1], n2)==0 ){
18682          if( iLimit<0 ){
18683            iLimit = i;
18684          }else{
18685            utf8_printf(stderr, "ambiguous limit: \"%s\"\n", azArg[1]);
18686            rc = 1;
18687            goto meta_command_exit;
18688          }
18689        }
18690      }
18691      if( iLimit<0 ){
18692        utf8_printf(stderr, "unknown limit: \"%s\"\n"
18693                        "enter \".limits\" with no arguments for a list.\n",
18694                         azArg[1]);
18695        rc = 1;
18696        goto meta_command_exit;
18697      }
18698      if( nArg==3 ){
18699        sqlite3_limit(p->db, aLimit[iLimit].limitCode,
18700                      (int)integerValue(azArg[2]));
18701      }
18702      printf("%20s %d\n", aLimit[iLimit].zLimitName,
18703             sqlite3_limit(p->db, aLimit[iLimit].limitCode, -1));
18704    }
18705  }else
18706
18707  if( c=='l' && n>2 && strncmp(azArg[0], "lint", n)==0 ){
18708    open_db(p, 0);
18709    lintDotCommand(p, azArg, nArg);
18710  }else
18711
18712#ifndef SQLITE_OMIT_LOAD_EXTENSION
18713  if( c=='l' && strncmp(azArg[0], "load", n)==0 ){
18714    const char *zFile, *zProc;
18715    char *zErrMsg = 0;
18716    if( nArg<2 ){
18717      raw_printf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n");
18718      rc = 1;
18719      goto meta_command_exit;
18720    }
18721    zFile = azArg[1];
18722    zProc = nArg>=3 ? azArg[2] : 0;
18723    open_db(p, 0);
18724    rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
18725    if( rc!=SQLITE_OK ){
18726      utf8_printf(stderr, "Error: %s\n", zErrMsg);
18727      sqlite3_free(zErrMsg);
18728      rc = 1;
18729    }
18730  }else
18731#endif
18732
18733  if( c=='l' && strncmp(azArg[0], "log", n)==0 ){
18734    if( nArg!=2 ){
18735      raw_printf(stderr, "Usage: .log FILENAME\n");
18736      rc = 1;
18737    }else{
18738      const char *zFile = azArg[1];
18739      output_file_close(p->pLog);
18740      p->pLog = output_file_open(zFile, 0);
18741    }
18742  }else
18743
18744  if( c=='m' && strncmp(azArg[0], "mode", n)==0 ){
18745    const char *zMode = nArg>=2 ? azArg[1] : "";
18746    int n2 = strlen30(zMode);
18747    int c2 = zMode[0];
18748    if( c2=='l' && n2>2 && strncmp(azArg[1],"lines",n2)==0 ){
18749      p->mode = MODE_Line;
18750      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
18751    }else if( c2=='c' && strncmp(azArg[1],"columns",n2)==0 ){
18752      p->mode = MODE_Column;
18753      if( (p->shellFlgs & SHFLG_HeaderSet)==0 ){
18754        p->showHeader = 1;
18755      }
18756      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
18757    }else if( c2=='l' && n2>2 && strncmp(azArg[1],"list",n2)==0 ){
18758      p->mode = MODE_List;
18759      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Column);
18760      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
18761    }else if( c2=='h' && strncmp(azArg[1],"html",n2)==0 ){
18762      p->mode = MODE_Html;
18763    }else if( c2=='t' && strncmp(azArg[1],"tcl",n2)==0 ){
18764      p->mode = MODE_Tcl;
18765      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Space);
18766      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
18767    }else if( c2=='c' && strncmp(azArg[1],"csv",n2)==0 ){
18768      p->mode = MODE_Csv;
18769      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
18770      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
18771    }else if( c2=='t' && strncmp(azArg[1],"tabs",n2)==0 ){
18772      p->mode = MODE_List;
18773      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Tab);
18774    }else if( c2=='i' && strncmp(azArg[1],"insert",n2)==0 ){
18775      p->mode = MODE_Insert;
18776      set_table_name(p, nArg>=3 ? azArg[2] : "table");
18777    }else if( c2=='q' && strncmp(azArg[1],"quote",n2)==0 ){
18778      p->mode = MODE_Quote;
18779      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
18780      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
18781    }else if( c2=='a' && strncmp(azArg[1],"ascii",n2)==0 ){
18782      p->mode = MODE_Ascii;
18783      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit);
18784      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record);
18785    }else if( c2=='m' && strncmp(azArg[1],"markdown",n2)==0 ){
18786      p->mode = MODE_Markdown;
18787    }else if( c2=='t' && strncmp(azArg[1],"table",n2)==0 ){
18788      p->mode = MODE_Table;
18789    }else if( c2=='b' && strncmp(azArg[1],"box",n2)==0 ){
18790      p->mode = MODE_Box;
18791    }else if( c2=='j' && strncmp(azArg[1],"json",n2)==0 ){
18792      p->mode = MODE_Json;
18793    }else if( nArg==1 ){
18794      raw_printf(p->out, "current output mode: %s\n", modeDescr[p->mode]);
18795    }else{
18796      raw_printf(stderr, "Error: mode should be one of: "
18797         "ascii box column csv html insert json line list markdown "
18798         "quote table tabs tcl\n");
18799      rc = 1;
18800    }
18801    p->cMode = p->mode;
18802  }else
18803
18804  if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){
18805    if( nArg==2 ){
18806      sqlite3_snprintf(sizeof(p->nullValue), p->nullValue,
18807                       "%.*s", (int)ArraySize(p->nullValue)-1, azArg[1]);
18808    }else{
18809      raw_printf(stderr, "Usage: .nullvalue STRING\n");
18810      rc = 1;
18811    }
18812  }else
18813
18814#ifdef SQLITE_DEBUG
18815  if( c=='o' && strcmp(azArg[0],"oom")==0 ){
18816    int i;
18817    for(i=1; i<nArg; i++){
18818      const char *z = azArg[i];
18819      if( z[0]=='-' && z[1]=='-' ) z++;
18820      if( strcmp(z,"-repeat")==0 ){
18821        if( i==nArg-1 ){
18822          raw_printf(p->out, "missing argument on \"%s\"\n", azArg[i]);
18823          rc = 1;
18824        }else{
18825          oomRepeat = (int)integerValue(azArg[++i]);
18826        }
18827      }else if( IsDigit(z[0]) ){
18828        oomCounter = (int)integerValue(azArg[i]);
18829      }else{
18830        raw_printf(p->out, "unknown argument: \"%s\"\n", azArg[i]);
18831        raw_printf(p->out, "Usage: .oom [--repeat N] [M]\n");
18832        rc = 1;
18833      }
18834    }
18835    if( rc==0 ){
18836      raw_printf(p->out, "oomCounter = %d\n", oomCounter);
18837      raw_printf(p->out, "oomRepeat  = %d\n", oomRepeat);
18838    }
18839  }else
18840#endif /* SQLITE_DEBUG */
18841
18842  if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
18843    char *zNewFilename = 0;  /* Name of the database file to open */
18844    int iName = 1;           /* Index in azArg[] of the filename */
18845    int newFlag = 0;         /* True to delete file before opening */
18846    /* Close the existing database */
18847    session_close_all(p);
18848    close_db(p->db);
18849    p->db = 0;
18850    p->zDbFilename = 0;
18851    sqlite3_free(p->zFreeOnClose);
18852    p->zFreeOnClose = 0;
18853    p->openMode = SHELL_OPEN_UNSPEC;
18854    p->openFlags = 0;
18855    p->szMax = 0;
18856    /* Check for command-line arguments */
18857    for(iName=1; iName<nArg; iName++){
18858      const char *z = azArg[iName];
18859      if( optionMatch(z,"new") ){
18860        newFlag = 1;
18861#ifdef SQLITE_HAVE_ZLIB
18862      }else if( optionMatch(z, "zip") ){
18863        p->openMode = SHELL_OPEN_ZIPFILE;
18864#endif
18865      }else if( optionMatch(z, "append") ){
18866        p->openMode = SHELL_OPEN_APPENDVFS;
18867      }else if( optionMatch(z, "readonly") ){
18868        p->openMode = SHELL_OPEN_READONLY;
18869      }else if( optionMatch(z, "nofollow") ){
18870        p->openFlags |= SQLITE_OPEN_NOFOLLOW;
18871#ifdef SQLITE_ENABLE_DESERIALIZE
18872      }else if( optionMatch(z, "deserialize") ){
18873        p->openMode = SHELL_OPEN_DESERIALIZE;
18874      }else if( optionMatch(z, "hexdb") ){
18875        p->openMode = SHELL_OPEN_HEXDB;
18876      }else if( optionMatch(z, "maxsize") && iName+1<nArg ){
18877        p->szMax = integerValue(azArg[++iName]);
18878#endif /* SQLITE_ENABLE_DESERIALIZE */
18879      }else if( z[0]=='-' ){
18880        utf8_printf(stderr, "unknown option: %s\n", z);
18881        rc = 1;
18882        goto meta_command_exit;
18883      }else if( zNewFilename ){
18884        utf8_printf(stderr, "extra argument: \"%s\"\n", z);
18885        rc = 1;
18886        goto meta_command_exit;
18887      }else{
18888        zNewFilename = sqlite3_mprintf("%s", z);
18889      }
18890    }
18891    /* If a filename is specified, try to open it first */
18892    if( zNewFilename || p->openMode==SHELL_OPEN_HEXDB ){
18893      if( newFlag ) shellDeleteFile(zNewFilename);
18894      p->zDbFilename = zNewFilename;
18895      open_db(p, OPEN_DB_KEEPALIVE);
18896      if( p->db==0 ){
18897        utf8_printf(stderr, "Error: cannot open '%s'\n", zNewFilename);
18898        sqlite3_free(zNewFilename);
18899      }else{
18900        p->zFreeOnClose = zNewFilename;
18901      }
18902    }
18903    if( p->db==0 ){
18904      /* As a fall-back open a TEMP database */
18905      p->zDbFilename = 0;
18906      open_db(p, 0);
18907    }
18908  }else
18909
18910  if( (c=='o'
18911        && (strncmp(azArg[0], "output", n)==0||strncmp(azArg[0], "once", n)==0))
18912   || (c=='e' && n==5 && strcmp(azArg[0],"excel")==0)
18913  ){
18914    char *zFile = 0;
18915    int bTxtMode = 0;
18916    int i;
18917    int eMode = 0;
18918    int bBOM = 0;
18919    int bOnce = 0;  /* 0: .output, 1: .once, 2: .excel */
18920
18921    if( c=='e' ){
18922      eMode = 'x';
18923      bOnce = 2;
18924    }else if( strncmp(azArg[0],"once",n)==0 ){
18925      bOnce = 1;
18926    }
18927    for(i=1; i<nArg; i++){
18928      char *z = azArg[i];
18929      if( z[0]=='-' ){
18930        if( z[1]=='-' ) z++;
18931        if( strcmp(z,"-bom")==0 ){
18932          bBOM = 1;
18933        }else if( c!='e' && strcmp(z,"-x")==0 ){
18934          eMode = 'x';  /* spreadsheet */
18935        }else if( c!='e' && strcmp(z,"-e")==0 ){
18936          eMode = 'e';  /* text editor */
18937        }else{
18938          utf8_printf(p->out, "ERROR: unknown option: \"%s\".  Usage:\n",
18939                      azArg[i]);
18940          showHelp(p->out, azArg[0]);
18941          rc = 1;
18942          goto meta_command_exit;
18943        }
18944      }else if( zFile==0 && eMode!='e' && eMode!='x' ){
18945        zFile = sqlite3_mprintf("%s", z);
18946        if( zFile[0]=='|' ){
18947          while( i+1<nArg ) zFile = sqlite3_mprintf("%z %s", zFile, azArg[++i]);
18948          break;
18949        }
18950      }else{
18951        utf8_printf(p->out,"ERROR: extra parameter: \"%s\".  Usage:\n",
18952                    azArg[i]);
18953        showHelp(p->out, azArg[0]);
18954        rc = 1;
18955        sqlite3_free(zFile);
18956        goto meta_command_exit;
18957      }
18958    }
18959    if( zFile==0 ) zFile = sqlite3_mprintf("stdout");
18960    if( bOnce ){
18961      p->outCount = 2;
18962    }else{
18963      p->outCount = 0;
18964    }
18965    output_reset(p);
18966#ifndef SQLITE_NOHAVE_SYSTEM
18967    if( eMode=='e' || eMode=='x' ){
18968      p->doXdgOpen = 1;
18969      outputModePush(p);
18970      if( eMode=='x' ){
18971        /* spreadsheet mode.  Output as CSV. */
18972        newTempFile(p, "csv");
18973        ShellClearFlag(p, SHFLG_Echo);
18974        p->mode = MODE_Csv;
18975        sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
18976        sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
18977      }else{
18978        /* text editor mode */
18979        newTempFile(p, "txt");
18980        bTxtMode = 1;
18981      }
18982      sqlite3_free(zFile);
18983      zFile = sqlite3_mprintf("%s", p->zTempFile);
18984    }
18985#endif /* SQLITE_NOHAVE_SYSTEM */
18986    if( zFile[0]=='|' ){
18987#ifdef SQLITE_OMIT_POPEN
18988      raw_printf(stderr, "Error: pipes are not supported in this OS\n");
18989      rc = 1;
18990      p->out = stdout;
18991#else
18992      p->out = popen(zFile + 1, "w");
18993      if( p->out==0 ){
18994        utf8_printf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1);
18995        p->out = stdout;
18996        rc = 1;
18997      }else{
18998        if( bBOM ) fprintf(p->out,"\357\273\277");
18999        sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
19000      }
19001#endif
19002    }else{
19003      p->out = output_file_open(zFile, bTxtMode);
19004      if( p->out==0 ){
19005        if( strcmp(zFile,"off")!=0 ){
19006          utf8_printf(stderr,"Error: cannot write to \"%s\"\n", zFile);
19007        }
19008        p->out = stdout;
19009        rc = 1;
19010      } else {
19011        if( bBOM ) fprintf(p->out,"\357\273\277");
19012        sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
19013      }
19014    }
19015    sqlite3_free(zFile);
19016  }else
19017
19018  if( c=='p' && n>=3 && strncmp(azArg[0], "parameter", n)==0 ){
19019    open_db(p,0);
19020    if( nArg<=1 ) goto parameter_syntax_error;
19021
19022    /* .parameter clear
19023    ** Clear all bind parameters by dropping the TEMP table that holds them.
19024    */
19025    if( nArg==2 && strcmp(azArg[1],"clear")==0 ){
19026      sqlite3_exec(p->db, "DROP TABLE IF EXISTS temp.sqlite_parameters;",
19027                   0, 0, 0);
19028    }else
19029
19030    /* .parameter list
19031    ** List all bind parameters.
19032    */
19033    if( nArg==2 && strcmp(azArg[1],"list")==0 ){
19034      sqlite3_stmt *pStmt = 0;
19035      int rx;
19036      int len = 0;
19037      rx = sqlite3_prepare_v2(p->db,
19038             "SELECT max(length(key)) "
19039             "FROM temp.sqlite_parameters;", -1, &pStmt, 0);
19040      if( rx==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
19041        len = sqlite3_column_int(pStmt, 0);
19042        if( len>40 ) len = 40;
19043      }
19044      sqlite3_finalize(pStmt);
19045      pStmt = 0;
19046      if( len ){
19047        rx = sqlite3_prepare_v2(p->db,
19048             "SELECT key, quote(value) "
19049             "FROM temp.sqlite_parameters;", -1, &pStmt, 0);
19050        while( sqlite3_step(pStmt)==SQLITE_ROW ){
19051          utf8_printf(p->out, "%-*s %s\n", len, sqlite3_column_text(pStmt,0),
19052                      sqlite3_column_text(pStmt,1));
19053        }
19054        sqlite3_finalize(pStmt);
19055      }
19056    }else
19057
19058    /* .parameter init
19059    ** Make sure the TEMP table used to hold bind parameters exists.
19060    ** Create it if necessary.
19061    */
19062    if( nArg==2 && strcmp(azArg[1],"init")==0 ){
19063      bind_table_init(p);
19064    }else
19065
19066    /* .parameter set NAME VALUE
19067    ** Set or reset a bind parameter.  NAME should be the full parameter
19068    ** name exactly as it appears in the query.  (ex: $abc, @def).  The
19069    ** VALUE can be in either SQL literal notation, or if not it will be
19070    ** understood to be a text string.
19071    */
19072    if( nArg==4 && strcmp(azArg[1],"set")==0 ){
19073      int rx;
19074      char *zSql;
19075      sqlite3_stmt *pStmt;
19076      const char *zKey = azArg[2];
19077      const char *zValue = azArg[3];
19078      bind_table_init(p);
19079      zSql = sqlite3_mprintf(
19080                  "REPLACE INTO temp.sqlite_parameters(key,value)"
19081                  "VALUES(%Q,%s);", zKey, zValue);
19082      if( zSql==0 ) shell_out_of_memory();
19083      pStmt = 0;
19084      rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
19085      sqlite3_free(zSql);
19086      if( rx!=SQLITE_OK ){
19087        sqlite3_finalize(pStmt);
19088        pStmt = 0;
19089        zSql = sqlite3_mprintf(
19090                   "REPLACE INTO temp.sqlite_parameters(key,value)"
19091                   "VALUES(%Q,%Q);", zKey, zValue);
19092        if( zSql==0 ) shell_out_of_memory();
19093        rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
19094        sqlite3_free(zSql);
19095        if( rx!=SQLITE_OK ){
19096          utf8_printf(p->out, "Error: %s\n", sqlite3_errmsg(p->db));
19097          sqlite3_finalize(pStmt);
19098          pStmt = 0;
19099          rc = 1;
19100        }
19101      }
19102      sqlite3_step(pStmt);
19103      sqlite3_finalize(pStmt);
19104    }else
19105
19106    /* .parameter unset NAME
19107    ** Remove the NAME binding from the parameter binding table, if it
19108    ** exists.
19109    */
19110    if( nArg==3 && strcmp(azArg[1],"unset")==0 ){
19111      char *zSql = sqlite3_mprintf(
19112          "DELETE FROM temp.sqlite_parameters WHERE key=%Q", azArg[2]);
19113      if( zSql==0 ) shell_out_of_memory();
19114      sqlite3_exec(p->db, zSql, 0, 0, 0);
19115      sqlite3_free(zSql);
19116    }else
19117    /* If no command name matches, show a syntax error */
19118    parameter_syntax_error:
19119    showHelp(p->out, "parameter");
19120  }else
19121
19122  if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
19123    int i;
19124    for(i=1; i<nArg; i++){
19125      if( i>1 ) raw_printf(p->out, " ");
19126      utf8_printf(p->out, "%s", azArg[i]);
19127    }
19128    raw_printf(p->out, "\n");
19129  }else
19130
19131#ifndef SQLITE_OMIT_PROGRESS_CALLBACK
19132  if( c=='p' && n>=3 && strncmp(azArg[0], "progress", n)==0 ){
19133    int i;
19134    int nn = 0;
19135    p->flgProgress = 0;
19136    p->mxProgress = 0;
19137    p->nProgress = 0;
19138    for(i=1; i<nArg; i++){
19139      const char *z = azArg[i];
19140      if( z[0]=='-' ){
19141        z++;
19142        if( z[0]=='-' ) z++;
19143        if( strcmp(z,"quiet")==0 || strcmp(z,"q")==0 ){
19144          p->flgProgress |= SHELL_PROGRESS_QUIET;
19145          continue;
19146        }
19147        if( strcmp(z,"reset")==0 ){
19148          p->flgProgress |= SHELL_PROGRESS_RESET;
19149          continue;
19150        }
19151        if( strcmp(z,"once")==0 ){
19152          p->flgProgress |= SHELL_PROGRESS_ONCE;
19153          continue;
19154        }
19155        if( strcmp(z,"limit")==0 ){
19156          if( i+1>=nArg ){
19157            utf8_printf(stderr, "Error: missing argument on --limit\n");
19158            rc = 1;
19159            goto meta_command_exit;
19160          }else{
19161            p->mxProgress = (int)integerValue(azArg[++i]);
19162          }
19163          continue;
19164        }
19165        utf8_printf(stderr, "Error: unknown option: \"%s\"\n", azArg[i]);
19166        rc = 1;
19167        goto meta_command_exit;
19168      }else{
19169        nn = (int)integerValue(z);
19170      }
19171    }
19172    open_db(p, 0);
19173    sqlite3_progress_handler(p->db, nn, progress_handler, p);
19174  }else
19175#endif /* SQLITE_OMIT_PROGRESS_CALLBACK */
19176
19177  if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){
19178    if( nArg >= 2) {
19179      strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
19180    }
19181    if( nArg >= 3) {
19182      strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
19183    }
19184  }else
19185
19186  if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){
19187    rc = 2;
19188  }else
19189
19190  if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){
19191    FILE *inSaved = p->in;
19192    int savedLineno = p->lineno;
19193    if( nArg!=2 ){
19194      raw_printf(stderr, "Usage: .read FILE\n");
19195      rc = 1;
19196      goto meta_command_exit;
19197    }
19198    if( azArg[1][0]=='|' ){
19199#ifdef SQLITE_OMIT_POPEN
19200      raw_printf(stderr, "Error: pipes are not supported in this OS\n");
19201      rc = 1;
19202      p->out = stdout;
19203#else
19204      p->in = popen(azArg[1]+1, "r");
19205      if( p->in==0 ){
19206        utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
19207        rc = 1;
19208      }else{
19209        rc = process_input(p);
19210        pclose(p->in);
19211      }
19212#endif
19213    }else if( notNormalFile(azArg[1]) || (p->in = fopen(azArg[1], "rb"))==0 ){
19214      utf8_printf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
19215      rc = 1;
19216    }else{
19217      rc = process_input(p);
19218      fclose(p->in);
19219    }
19220    p->in = inSaved;
19221    p->lineno = savedLineno;
19222  }else
19223
19224  if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){
19225    const char *zSrcFile;
19226    const char *zDb;
19227    sqlite3 *pSrc;
19228    sqlite3_backup *pBackup;
19229    int nTimeout = 0;
19230
19231    if( nArg==2 ){
19232      zSrcFile = azArg[1];
19233      zDb = "main";
19234    }else if( nArg==3 ){
19235      zSrcFile = azArg[2];
19236      zDb = azArg[1];
19237    }else{
19238      raw_printf(stderr, "Usage: .restore ?DB? FILE\n");
19239      rc = 1;
19240      goto meta_command_exit;
19241    }
19242    rc = sqlite3_open(zSrcFile, &pSrc);
19243    if( rc!=SQLITE_OK ){
19244      utf8_printf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
19245      close_db(pSrc);
19246      return 1;
19247    }
19248    open_db(p, 0);
19249    pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
19250    if( pBackup==0 ){
19251      utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
19252      close_db(pSrc);
19253      return 1;
19254    }
19255    while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
19256          || rc==SQLITE_BUSY  ){
19257      if( rc==SQLITE_BUSY ){
19258        if( nTimeout++ >= 3 ) break;
19259        sqlite3_sleep(100);
19260      }
19261    }
19262    sqlite3_backup_finish(pBackup);
19263    if( rc==SQLITE_DONE ){
19264      rc = 0;
19265    }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
19266      raw_printf(stderr, "Error: source database is busy\n");
19267      rc = 1;
19268    }else{
19269      utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
19270      rc = 1;
19271    }
19272    close_db(pSrc);
19273  }else
19274
19275  if( c=='s' && strncmp(azArg[0], "scanstats", n)==0 ){
19276    if( nArg==2 ){
19277      p->scanstatsOn = (u8)booleanValue(azArg[1]);
19278#ifndef SQLITE_ENABLE_STMT_SCANSTATUS
19279      raw_printf(stderr, "Warning: .scanstats not available in this build.\n");
19280#endif
19281    }else{
19282      raw_printf(stderr, "Usage: .scanstats on|off\n");
19283      rc = 1;
19284    }
19285  }else
19286
19287  if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){
19288    ShellText sSelect;
19289    ShellState data;
19290    char *zErrMsg = 0;
19291    const char *zDiv = "(";
19292    const char *zName = 0;
19293    int iSchema = 0;
19294    int bDebug = 0;
19295    int bNoSystemTabs = 0;
19296    int ii;
19297
19298    open_db(p, 0);
19299    memcpy(&data, p, sizeof(data));
19300    data.showHeader = 0;
19301    data.cMode = data.mode = MODE_Semi;
19302    initText(&sSelect);
19303    for(ii=1; ii<nArg; ii++){
19304      if( optionMatch(azArg[ii],"indent") ){
19305        data.cMode = data.mode = MODE_Pretty;
19306      }else if( optionMatch(azArg[ii],"debug") ){
19307        bDebug = 1;
19308      }else if( optionMatch(azArg[ii],"nosys") ){
19309        bNoSystemTabs = 1;
19310      }else if( azArg[ii][0]=='-' ){
19311        utf8_printf(stderr, "Unknown option: \"%s\"\n", azArg[ii]);
19312        rc = 1;
19313        goto meta_command_exit;
19314      }else if( zName==0 ){
19315        zName = azArg[ii];
19316      }else{
19317        raw_printf(stderr, "Usage: .schema ?--indent? ?--nosys? ?LIKE-PATTERN?\n");
19318        rc = 1;
19319        goto meta_command_exit;
19320      }
19321    }
19322    if( zName!=0 ){
19323      int isSchema = sqlite3_strlike(zName, "sqlite_master", '\\')==0
19324                  || sqlite3_strlike(zName, "sqlite_schema", '\\')==0
19325                  || sqlite3_strlike(zName,"sqlite_temp_master", '\\')==0
19326                  || sqlite3_strlike(zName,"sqlite_temp_schema", '\\')==0;
19327      if( isSchema ){
19328        char *new_argv[2], *new_colv[2];
19329        new_argv[0] = sqlite3_mprintf(
19330                      "CREATE TABLE %s (\n"
19331                      "  type text,\n"
19332                      "  name text,\n"
19333                      "  tbl_name text,\n"
19334                      "  rootpage integer,\n"
19335                      "  sql text\n"
19336                      ")", zName);
19337        new_argv[1] = 0;
19338        new_colv[0] = "sql";
19339        new_colv[1] = 0;
19340        callback(&data, 1, new_argv, new_colv);
19341        sqlite3_free(new_argv[0]);
19342      }
19343    }
19344    if( zDiv ){
19345      sqlite3_stmt *pStmt = 0;
19346      rc = sqlite3_prepare_v2(p->db, "SELECT name FROM pragma_database_list",
19347                              -1, &pStmt, 0);
19348      if( rc ){
19349        utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
19350        sqlite3_finalize(pStmt);
19351        rc = 1;
19352        goto meta_command_exit;
19353      }
19354      appendText(&sSelect, "SELECT sql FROM", 0);
19355      iSchema = 0;
19356      while( sqlite3_step(pStmt)==SQLITE_ROW ){
19357        const char *zDb = (const char*)sqlite3_column_text(pStmt, 0);
19358        char zScNum[30];
19359        sqlite3_snprintf(sizeof(zScNum), zScNum, "%d", ++iSchema);
19360        appendText(&sSelect, zDiv, 0);
19361        zDiv = " UNION ALL ";
19362        appendText(&sSelect, "SELECT shell_add_schema(sql,", 0);
19363        if( sqlite3_stricmp(zDb, "main")!=0 ){
19364          appendText(&sSelect, zDb, '\'');
19365        }else{
19366          appendText(&sSelect, "NULL", 0);
19367        }
19368        appendText(&sSelect, ",name) AS sql, type, tbl_name, name, rowid,", 0);
19369        appendText(&sSelect, zScNum, 0);
19370        appendText(&sSelect, " AS snum, ", 0);
19371        appendText(&sSelect, zDb, '\'');
19372        appendText(&sSelect, " AS sname FROM ", 0);
19373        appendText(&sSelect, zDb, quoteChar(zDb));
19374        appendText(&sSelect, ".sqlite_schema", 0);
19375      }
19376      sqlite3_finalize(pStmt);
19377#ifndef SQLITE_OMIT_INTROSPECTION_PRAGMAS
19378      if( zName ){
19379        appendText(&sSelect,
19380           " UNION ALL SELECT shell_module_schema(name),"
19381           " 'table', name, name, name, 9e+99, 'main' FROM pragma_module_list",
19382        0);
19383      }
19384#endif
19385      appendText(&sSelect, ") WHERE ", 0);
19386      if( zName ){
19387        char *zQarg = sqlite3_mprintf("%Q", zName);
19388        int bGlob = strchr(zName, '*') != 0 || strchr(zName, '?') != 0 ||
19389                    strchr(zName, '[') != 0;
19390        if( strchr(zName, '.') ){
19391          appendText(&sSelect, "lower(printf('%s.%s',sname,tbl_name))", 0);
19392        }else{
19393          appendText(&sSelect, "lower(tbl_name)", 0);
19394        }
19395        appendText(&sSelect, bGlob ? " GLOB " : " LIKE ", 0);
19396        appendText(&sSelect, zQarg, 0);
19397        if( !bGlob ){
19398          appendText(&sSelect, " ESCAPE '\\' ", 0);
19399        }
19400        appendText(&sSelect, " AND ", 0);
19401        sqlite3_free(zQarg);
19402      }
19403      if( bNoSystemTabs ){
19404        appendText(&sSelect, "name NOT LIKE 'sqlite_%%' AND ", 0);
19405      }
19406      appendText(&sSelect, "sql IS NOT NULL"
19407                           " ORDER BY snum, rowid", 0);
19408      if( bDebug ){
19409        utf8_printf(p->out, "SQL: %s;\n", sSelect.z);
19410      }else{
19411        rc = sqlite3_exec(p->db, sSelect.z, callback, &data, &zErrMsg);
19412      }
19413      freeText(&sSelect);
19414    }
19415    if( zErrMsg ){
19416      utf8_printf(stderr,"Error: %s\n", zErrMsg);
19417      sqlite3_free(zErrMsg);
19418      rc = 1;
19419    }else if( rc != SQLITE_OK ){
19420      raw_printf(stderr,"Error: querying schema information\n");
19421      rc = 1;
19422    }else{
19423      rc = 0;
19424    }
19425  }else
19426
19427  if( c=='s' && n==11 && strncmp(azArg[0], "selecttrace", n)==0 ){
19428    unsigned int x = nArg>=2 ? (unsigned int)integerValue(azArg[1]) : 0xffffffff;
19429    sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &x);
19430  }else
19431
19432#if defined(SQLITE_ENABLE_SESSION)
19433  if( c=='s' && strncmp(azArg[0],"session",n)==0 && n>=3 ){
19434    OpenSession *pSession = &p->aSession[0];
19435    char **azCmd = &azArg[1];
19436    int iSes = 0;
19437    int nCmd = nArg - 1;
19438    int i;
19439    if( nArg<=1 ) goto session_syntax_error;
19440    open_db(p, 0);
19441    if( nArg>=3 ){
19442      for(iSes=0; iSes<p->nSession; iSes++){
19443        if( strcmp(p->aSession[iSes].zName, azArg[1])==0 ) break;
19444      }
19445      if( iSes<p->nSession ){
19446        pSession = &p->aSession[iSes];
19447        azCmd++;
19448        nCmd--;
19449      }else{
19450        pSession = &p->aSession[0];
19451        iSes = 0;
19452      }
19453    }
19454
19455    /* .session attach TABLE
19456    ** Invoke the sqlite3session_attach() interface to attach a particular
19457    ** table so that it is never filtered.
19458    */
19459    if( strcmp(azCmd[0],"attach")==0 ){
19460      if( nCmd!=2 ) goto session_syntax_error;
19461      if( pSession->p==0 ){
19462        session_not_open:
19463        raw_printf(stderr, "ERROR: No sessions are open\n");
19464      }else{
19465        rc = sqlite3session_attach(pSession->p, azCmd[1]);
19466        if( rc ){
19467          raw_printf(stderr, "ERROR: sqlite3session_attach() returns %d\n", rc);
19468          rc = 0;
19469        }
19470      }
19471    }else
19472
19473    /* .session changeset FILE
19474    ** .session patchset FILE
19475    ** Write a changeset or patchset into a file.  The file is overwritten.
19476    */
19477    if( strcmp(azCmd[0],"changeset")==0 || strcmp(azCmd[0],"patchset")==0 ){
19478      FILE *out = 0;
19479      if( nCmd!=2 ) goto session_syntax_error;
19480      if( pSession->p==0 ) goto session_not_open;
19481      out = fopen(azCmd[1], "wb");
19482      if( out==0 ){
19483        utf8_printf(stderr, "ERROR: cannot open \"%s\" for writing\n",
19484                    azCmd[1]);
19485      }else{
19486        int szChng;
19487        void *pChng;
19488        if( azCmd[0][0]=='c' ){
19489          rc = sqlite3session_changeset(pSession->p, &szChng, &pChng);
19490        }else{
19491          rc = sqlite3session_patchset(pSession->p, &szChng, &pChng);
19492        }
19493        if( rc ){
19494          printf("Error: error code %d\n", rc);
19495          rc = 0;
19496        }
19497        if( pChng
19498          && fwrite(pChng, szChng, 1, out)!=1 ){
19499          raw_printf(stderr, "ERROR: Failed to write entire %d-byte output\n",
19500                  szChng);
19501        }
19502        sqlite3_free(pChng);
19503        fclose(out);
19504      }
19505    }else
19506
19507    /* .session close
19508    ** Close the identified session
19509    */
19510    if( strcmp(azCmd[0], "close")==0 ){
19511      if( nCmd!=1 ) goto session_syntax_error;
19512      if( p->nSession ){
19513        session_close(pSession);
19514        p->aSession[iSes] = p->aSession[--p->nSession];
19515      }
19516    }else
19517
19518    /* .session enable ?BOOLEAN?
19519    ** Query or set the enable flag
19520    */
19521    if( strcmp(azCmd[0], "enable")==0 ){
19522      int ii;
19523      if( nCmd>2 ) goto session_syntax_error;
19524      ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
19525      if( p->nSession ){
19526        ii = sqlite3session_enable(pSession->p, ii);
19527        utf8_printf(p->out, "session %s enable flag = %d\n",
19528                    pSession->zName, ii);
19529      }
19530    }else
19531
19532    /* .session filter GLOB ....
19533    ** Set a list of GLOB patterns of table names to be excluded.
19534    */
19535    if( strcmp(azCmd[0], "filter")==0 ){
19536      int ii, nByte;
19537      if( nCmd<2 ) goto session_syntax_error;
19538      if( p->nSession ){
19539        for(ii=0; ii<pSession->nFilter; ii++){
19540          sqlite3_free(pSession->azFilter[ii]);
19541        }
19542        sqlite3_free(pSession->azFilter);
19543        nByte = sizeof(pSession->azFilter[0])*(nCmd-1);
19544        pSession->azFilter = sqlite3_malloc( nByte );
19545        if( pSession->azFilter==0 ){
19546          raw_printf(stderr, "Error: out or memory\n");
19547          exit(1);
19548        }
19549        for(ii=1; ii<nCmd; ii++){
19550          pSession->azFilter[ii-1] = sqlite3_mprintf("%s", azCmd[ii]);
19551        }
19552        pSession->nFilter = ii-1;
19553      }
19554    }else
19555
19556    /* .session indirect ?BOOLEAN?
19557    ** Query or set the indirect flag
19558    */
19559    if( strcmp(azCmd[0], "indirect")==0 ){
19560      int ii;
19561      if( nCmd>2 ) goto session_syntax_error;
19562      ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
19563      if( p->nSession ){
19564        ii = sqlite3session_indirect(pSession->p, ii);
19565        utf8_printf(p->out, "session %s indirect flag = %d\n",
19566                    pSession->zName, ii);
19567      }
19568    }else
19569
19570    /* .session isempty
19571    ** Determine if the session is empty
19572    */
19573    if( strcmp(azCmd[0], "isempty")==0 ){
19574      int ii;
19575      if( nCmd!=1 ) goto session_syntax_error;
19576      if( p->nSession ){
19577        ii = sqlite3session_isempty(pSession->p);
19578        utf8_printf(p->out, "session %s isempty flag = %d\n",
19579                    pSession->zName, ii);
19580      }
19581    }else
19582
19583    /* .session list
19584    ** List all currently open sessions
19585    */
19586    if( strcmp(azCmd[0],"list")==0 ){
19587      for(i=0; i<p->nSession; i++){
19588        utf8_printf(p->out, "%d %s\n", i, p->aSession[i].zName);
19589      }
19590    }else
19591
19592    /* .session open DB NAME
19593    ** Open a new session called NAME on the attached database DB.
19594    ** DB is normally "main".
19595    */
19596    if( strcmp(azCmd[0],"open")==0 ){
19597      char *zName;
19598      if( nCmd!=3 ) goto session_syntax_error;
19599      zName = azCmd[2];
19600      if( zName[0]==0 ) goto session_syntax_error;
19601      for(i=0; i<p->nSession; i++){
19602        if( strcmp(p->aSession[i].zName,zName)==0 ){
19603          utf8_printf(stderr, "Session \"%s\" already exists\n", zName);
19604          goto meta_command_exit;
19605        }
19606      }
19607      if( p->nSession>=ArraySize(p->aSession) ){
19608        raw_printf(stderr, "Maximum of %d sessions\n", ArraySize(p->aSession));
19609        goto meta_command_exit;
19610      }
19611      pSession = &p->aSession[p->nSession];
19612      rc = sqlite3session_create(p->db, azCmd[1], &pSession->p);
19613      if( rc ){
19614        raw_printf(stderr, "Cannot open session: error code=%d\n", rc);
19615        rc = 0;
19616        goto meta_command_exit;
19617      }
19618      pSession->nFilter = 0;
19619      sqlite3session_table_filter(pSession->p, session_filter, pSession);
19620      p->nSession++;
19621      pSession->zName = sqlite3_mprintf("%s", zName);
19622    }else
19623    /* If no command name matches, show a syntax error */
19624    session_syntax_error:
19625    showHelp(p->out, "session");
19626  }else
19627#endif
19628
19629#ifdef SQLITE_DEBUG
19630  /* Undocumented commands for internal testing.  Subject to change
19631  ** without notice. */
19632  if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
19633    if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
19634      int i, v;
19635      for(i=1; i<nArg; i++){
19636        v = booleanValue(azArg[i]);
19637        utf8_printf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
19638      }
19639    }
19640    if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
19641      int i; sqlite3_int64 v;
19642      for(i=1; i<nArg; i++){
19643        char zBuf[200];
19644        v = integerValue(azArg[i]);
19645        sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v);
19646        utf8_printf(p->out, "%s", zBuf);
19647      }
19648    }
19649  }else
19650#endif
19651
19652  if( c=='s' && n>=4 && strncmp(azArg[0],"selftest",n)==0 ){
19653    int bIsInit = 0;         /* True to initialize the SELFTEST table */
19654    int bVerbose = 0;        /* Verbose output */
19655    int bSelftestExists;     /* True if SELFTEST already exists */
19656    int i, k;                /* Loop counters */
19657    int nTest = 0;           /* Number of tests runs */
19658    int nErr = 0;            /* Number of errors seen */
19659    ShellText str;           /* Answer for a query */
19660    sqlite3_stmt *pStmt = 0; /* Query against the SELFTEST table */
19661
19662    open_db(p,0);
19663    for(i=1; i<nArg; i++){
19664      const char *z = azArg[i];
19665      if( z[0]=='-' && z[1]=='-' ) z++;
19666      if( strcmp(z,"-init")==0 ){
19667        bIsInit = 1;
19668      }else
19669      if( strcmp(z,"-v")==0 ){
19670        bVerbose++;
19671      }else
19672      {
19673        utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n",
19674                    azArg[i], azArg[0]);
19675        raw_printf(stderr, "Should be one of: --init -v\n");
19676        rc = 1;
19677        goto meta_command_exit;
19678      }
19679    }
19680    if( sqlite3_table_column_metadata(p->db,"main","selftest",0,0,0,0,0,0)
19681           != SQLITE_OK ){
19682      bSelftestExists = 0;
19683    }else{
19684      bSelftestExists = 1;
19685    }
19686    if( bIsInit ){
19687      createSelftestTable(p);
19688      bSelftestExists = 1;
19689    }
19690    initText(&str);
19691    appendText(&str, "x", 0);
19692    for(k=bSelftestExists; k>=0; k--){
19693      if( k==1 ){
19694        rc = sqlite3_prepare_v2(p->db,
19695            "SELECT tno,op,cmd,ans FROM selftest ORDER BY tno",
19696            -1, &pStmt, 0);
19697      }else{
19698        rc = sqlite3_prepare_v2(p->db,
19699          "VALUES(0,'memo','Missing SELFTEST table - default checks only',''),"
19700          "      (1,'run','PRAGMA integrity_check','ok')",
19701          -1, &pStmt, 0);
19702      }
19703      if( rc ){
19704        raw_printf(stderr, "Error querying the selftest table\n");
19705        rc = 1;
19706        sqlite3_finalize(pStmt);
19707        goto meta_command_exit;
19708      }
19709      for(i=1; sqlite3_step(pStmt)==SQLITE_ROW; i++){
19710        int tno = sqlite3_column_int(pStmt, 0);
19711        const char *zOp = (const char*)sqlite3_column_text(pStmt, 1);
19712        const char *zSql = (const char*)sqlite3_column_text(pStmt, 2);
19713        const char *zAns = (const char*)sqlite3_column_text(pStmt, 3);
19714
19715        k = 0;
19716        if( bVerbose>0 ){
19717          char *zQuote = sqlite3_mprintf("%q", zSql);
19718          printf("%d: %s %s\n", tno, zOp, zSql);
19719          sqlite3_free(zQuote);
19720        }
19721        if( strcmp(zOp,"memo")==0 ){
19722          utf8_printf(p->out, "%s\n", zSql);
19723        }else
19724        if( strcmp(zOp,"run")==0 ){
19725          char *zErrMsg = 0;
19726          str.n = 0;
19727          str.z[0] = 0;
19728          rc = sqlite3_exec(p->db, zSql, captureOutputCallback, &str, &zErrMsg);
19729          nTest++;
19730          if( bVerbose ){
19731            utf8_printf(p->out, "Result: %s\n", str.z);
19732          }
19733          if( rc || zErrMsg ){
19734            nErr++;
19735            rc = 1;
19736            utf8_printf(p->out, "%d: error-code-%d: %s\n", tno, rc, zErrMsg);
19737            sqlite3_free(zErrMsg);
19738          }else if( strcmp(zAns,str.z)!=0 ){
19739            nErr++;
19740            rc = 1;
19741            utf8_printf(p->out, "%d: Expected: [%s]\n", tno, zAns);
19742            utf8_printf(p->out, "%d:      Got: [%s]\n", tno, str.z);
19743          }
19744        }else
19745        {
19746          utf8_printf(stderr,
19747            "Unknown operation \"%s\" on selftest line %d\n", zOp, tno);
19748          rc = 1;
19749          break;
19750        }
19751      } /* End loop over rows of content from SELFTEST */
19752      sqlite3_finalize(pStmt);
19753    } /* End loop over k */
19754    freeText(&str);
19755    utf8_printf(p->out, "%d errors out of %d tests\n", nErr, nTest);
19756  }else
19757
19758  if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){
19759    if( nArg<2 || nArg>3 ){
19760      raw_printf(stderr, "Usage: .separator COL ?ROW?\n");
19761      rc = 1;
19762    }
19763    if( nArg>=2 ){
19764      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator,
19765                       "%.*s", (int)ArraySize(p->colSeparator)-1, azArg[1]);
19766    }
19767    if( nArg>=3 ){
19768      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator,
19769                       "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]);
19770    }
19771  }else
19772
19773  if( c=='s' && n>=4 && strncmp(azArg[0],"sha3sum",n)==0 ){
19774    const char *zLike = 0;   /* Which table to checksum. 0 means everything */
19775    int i;                   /* Loop counter */
19776    int bSchema = 0;         /* Also hash the schema */
19777    int bSeparate = 0;       /* Hash each table separately */
19778    int iSize = 224;         /* Hash algorithm to use */
19779    int bDebug = 0;          /* Only show the query that would have run */
19780    sqlite3_stmt *pStmt;     /* For querying tables names */
19781    char *zSql;              /* SQL to be run */
19782    char *zSep;              /* Separator */
19783    ShellText sSql;          /* Complete SQL for the query to run the hash */
19784    ShellText sQuery;        /* Set of queries used to read all content */
19785    open_db(p, 0);
19786    for(i=1; i<nArg; i++){
19787      const char *z = azArg[i];
19788      if( z[0]=='-' ){
19789        z++;
19790        if( z[0]=='-' ) z++;
19791        if( strcmp(z,"schema")==0 ){
19792          bSchema = 1;
19793        }else
19794        if( strcmp(z,"sha3-224")==0 || strcmp(z,"sha3-256")==0
19795         || strcmp(z,"sha3-384")==0 || strcmp(z,"sha3-512")==0
19796        ){
19797          iSize = atoi(&z[5]);
19798        }else
19799        if( strcmp(z,"debug")==0 ){
19800          bDebug = 1;
19801        }else
19802        {
19803          utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n",
19804                      azArg[i], azArg[0]);
19805          showHelp(p->out, azArg[0]);
19806          rc = 1;
19807          goto meta_command_exit;
19808        }
19809      }else if( zLike ){
19810        raw_printf(stderr, "Usage: .sha3sum ?OPTIONS? ?LIKE-PATTERN?\n");
19811        rc = 1;
19812        goto meta_command_exit;
19813      }else{
19814        zLike = z;
19815        bSeparate = 1;
19816        if( sqlite3_strlike("sqlite\\_%", zLike, '\\')==0 ) bSchema = 1;
19817      }
19818    }
19819    if( bSchema ){
19820      zSql = "SELECT lower(name) FROM sqlite_schema"
19821             " WHERE type='table' AND coalesce(rootpage,0)>1"
19822             " UNION ALL SELECT 'sqlite_schema'"
19823             " ORDER BY 1 collate nocase";
19824    }else{
19825      zSql = "SELECT lower(name) FROM sqlite_schema"
19826             " WHERE type='table' AND coalesce(rootpage,0)>1"
19827             " AND name NOT LIKE 'sqlite_%'"
19828             " ORDER BY 1 collate nocase";
19829    }
19830    sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
19831    initText(&sQuery);
19832    initText(&sSql);
19833    appendText(&sSql, "WITH [sha3sum$query](a,b) AS(",0);
19834    zSep = "VALUES(";
19835    while( SQLITE_ROW==sqlite3_step(pStmt) ){
19836      const char *zTab = (const char*)sqlite3_column_text(pStmt,0);
19837      if( zLike && sqlite3_strlike(zLike, zTab, 0)!=0 ) continue;
19838      if( strncmp(zTab, "sqlite_",7)!=0 ){
19839        appendText(&sQuery,"SELECT * FROM ", 0);
19840        appendText(&sQuery,zTab,'"');
19841        appendText(&sQuery," NOT INDEXED;", 0);
19842      }else if( strcmp(zTab, "sqlite_schema")==0 ){
19843        appendText(&sQuery,"SELECT type,name,tbl_name,sql FROM sqlite_schema"
19844                           " ORDER BY name;", 0);
19845      }else if( strcmp(zTab, "sqlite_sequence")==0 ){
19846        appendText(&sQuery,"SELECT name,seq FROM sqlite_sequence"
19847                           " ORDER BY name;", 0);
19848      }else if( strcmp(zTab, "sqlite_stat1")==0 ){
19849        appendText(&sQuery,"SELECT tbl,idx,stat FROM sqlite_stat1"
19850                           " ORDER BY tbl,idx;", 0);
19851      }else if( strcmp(zTab, "sqlite_stat4")==0 ){
19852        appendText(&sQuery, "SELECT * FROM ", 0);
19853        appendText(&sQuery, zTab, 0);
19854        appendText(&sQuery, " ORDER BY tbl, idx, rowid;\n", 0);
19855      }
19856      appendText(&sSql, zSep, 0);
19857      appendText(&sSql, sQuery.z, '\'');
19858      sQuery.n = 0;
19859      appendText(&sSql, ",", 0);
19860      appendText(&sSql, zTab, '\'');
19861      zSep = "),(";
19862    }
19863    sqlite3_finalize(pStmt);
19864    if( bSeparate ){
19865      zSql = sqlite3_mprintf(
19866          "%s))"
19867          " SELECT lower(hex(sha3_query(a,%d))) AS hash, b AS label"
19868          "   FROM [sha3sum$query]",
19869          sSql.z, iSize);
19870    }else{
19871      zSql = sqlite3_mprintf(
19872          "%s))"
19873          " SELECT lower(hex(sha3_query(group_concat(a,''),%d))) AS hash"
19874          "   FROM [sha3sum$query]",
19875          sSql.z, iSize);
19876    }
19877    freeText(&sQuery);
19878    freeText(&sSql);
19879    if( bDebug ){
19880      utf8_printf(p->out, "%s\n", zSql);
19881    }else{
19882      shell_exec(p, zSql, 0);
19883    }
19884    sqlite3_free(zSql);
19885  }else
19886
19887#ifndef SQLITE_NOHAVE_SYSTEM
19888  if( c=='s'
19889   && (strncmp(azArg[0], "shell", n)==0 || strncmp(azArg[0],"system",n)==0)
19890  ){
19891    char *zCmd;
19892    int i, x;
19893    if( nArg<2 ){
19894      raw_printf(stderr, "Usage: .system COMMAND\n");
19895      rc = 1;
19896      goto meta_command_exit;
19897    }
19898    zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]);
19899    for(i=2; i<nArg; i++){
19900      zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"",
19901                             zCmd, azArg[i]);
19902    }
19903    x = system(zCmd);
19904    sqlite3_free(zCmd);
19905    if( x ) raw_printf(stderr, "System command returns %d\n", x);
19906  }else
19907#endif /* !defined(SQLITE_NOHAVE_SYSTEM) */
19908
19909  if( c=='s' && strncmp(azArg[0], "show", n)==0 ){
19910    static const char *azBool[] = { "off", "on", "trigger", "full"};
19911    const char *zOut;
19912    int i;
19913    if( nArg!=1 ){
19914      raw_printf(stderr, "Usage: .show\n");
19915      rc = 1;
19916      goto meta_command_exit;
19917    }
19918    utf8_printf(p->out, "%12.12s: %s\n","echo",
19919                                  azBool[ShellHasFlag(p, SHFLG_Echo)]);
19920    utf8_printf(p->out, "%12.12s: %s\n","eqp", azBool[p->autoEQP&3]);
19921    utf8_printf(p->out, "%12.12s: %s\n","explain",
19922         p->mode==MODE_Explain ? "on" : p->autoExplain ? "auto" : "off");
19923    utf8_printf(p->out,"%12.12s: %s\n","headers", azBool[p->showHeader!=0]);
19924    utf8_printf(p->out, "%12.12s: %s\n","mode", modeDescr[p->mode]);
19925    utf8_printf(p->out, "%12.12s: ", "nullvalue");
19926      output_c_string(p->out, p->nullValue);
19927      raw_printf(p->out, "\n");
19928    utf8_printf(p->out,"%12.12s: %s\n","output",
19929            strlen30(p->outfile) ? p->outfile : "stdout");
19930    utf8_printf(p->out,"%12.12s: ", "colseparator");
19931      output_c_string(p->out, p->colSeparator);
19932      raw_printf(p->out, "\n");
19933    utf8_printf(p->out,"%12.12s: ", "rowseparator");
19934      output_c_string(p->out, p->rowSeparator);
19935      raw_printf(p->out, "\n");
19936    switch( p->statsOn ){
19937      case 0:  zOut = "off";     break;
19938      default: zOut = "on";      break;
19939      case 2:  zOut = "stmt";    break;
19940      case 3:  zOut = "vmstep";  break;
19941    }
19942    utf8_printf(p->out, "%12.12s: %s\n","stats", zOut);
19943    utf8_printf(p->out, "%12.12s: ", "width");
19944    for (i=0;i<p->nWidth;i++) {
19945      raw_printf(p->out, "%d ", p->colWidth[i]);
19946    }
19947    raw_printf(p->out, "\n");
19948    utf8_printf(p->out, "%12.12s: %s\n", "filename",
19949                p->zDbFilename ? p->zDbFilename : "");
19950  }else
19951
19952  if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){
19953    if( nArg==2 ){
19954      if( strcmp(azArg[1],"stmt")==0 ){
19955        p->statsOn = 2;
19956      }else if( strcmp(azArg[1],"vmstep")==0 ){
19957        p->statsOn = 3;
19958      }else{
19959        p->statsOn = (u8)booleanValue(azArg[1]);
19960      }
19961    }else if( nArg==1 ){
19962      display_stats(p->db, p, 0);
19963    }else{
19964      raw_printf(stderr, "Usage: .stats ?on|off|stmt|vmstep?\n");
19965      rc = 1;
19966    }
19967  }else
19968
19969  if( (c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0)
19970   || (c=='i' && (strncmp(azArg[0], "indices", n)==0
19971                 || strncmp(azArg[0], "indexes", n)==0) )
19972  ){
19973    sqlite3_stmt *pStmt;
19974    char **azResult;
19975    int nRow, nAlloc;
19976    int ii;
19977    ShellText s;
19978    initText(&s);
19979    open_db(p, 0);
19980    rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
19981    if( rc ){
19982      sqlite3_finalize(pStmt);
19983      return shellDatabaseError(p->db);
19984    }
19985
19986    if( nArg>2 && c=='i' ){
19987      /* It is an historical accident that the .indexes command shows an error
19988      ** when called with the wrong number of arguments whereas the .tables
19989      ** command does not. */
19990      raw_printf(stderr, "Usage: .indexes ?LIKE-PATTERN?\n");
19991      rc = 1;
19992      sqlite3_finalize(pStmt);
19993      goto meta_command_exit;
19994    }
19995    for(ii=0; sqlite3_step(pStmt)==SQLITE_ROW; ii++){
19996      const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
19997      if( zDbName==0 ) continue;
19998      if( s.z && s.z[0] ) appendText(&s, " UNION ALL ", 0);
19999      if( sqlite3_stricmp(zDbName, "main")==0 ){
20000        appendText(&s, "SELECT name FROM ", 0);
20001      }else{
20002        appendText(&s, "SELECT ", 0);
20003        appendText(&s, zDbName, '\'');
20004        appendText(&s, "||'.'||name FROM ", 0);
20005      }
20006      appendText(&s, zDbName, '"');
20007      appendText(&s, ".sqlite_schema ", 0);
20008      if( c=='t' ){
20009        appendText(&s," WHERE type IN ('table','view')"
20010                      "   AND name NOT LIKE 'sqlite_%'"
20011                      "   AND name LIKE ?1", 0);
20012      }else{
20013        appendText(&s," WHERE type='index'"
20014                      "   AND tbl_name LIKE ?1", 0);
20015      }
20016    }
20017    rc = sqlite3_finalize(pStmt);
20018    appendText(&s, " ORDER BY 1", 0);
20019    rc = sqlite3_prepare_v2(p->db, s.z, -1, &pStmt, 0);
20020    freeText(&s);
20021    if( rc ) return shellDatabaseError(p->db);
20022
20023    /* Run the SQL statement prepared by the above block. Store the results
20024    ** as an array of nul-terminated strings in azResult[].  */
20025    nRow = nAlloc = 0;
20026    azResult = 0;
20027    if( nArg>1 ){
20028      sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
20029    }else{
20030      sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
20031    }
20032    while( sqlite3_step(pStmt)==SQLITE_ROW ){
20033      if( nRow>=nAlloc ){
20034        char **azNew;
20035        int n2 = nAlloc*2 + 10;
20036        azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2);
20037        if( azNew==0 ) shell_out_of_memory();
20038        nAlloc = n2;
20039        azResult = azNew;
20040      }
20041      azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
20042      if( 0==azResult[nRow] ) shell_out_of_memory();
20043      nRow++;
20044    }
20045    if( sqlite3_finalize(pStmt)!=SQLITE_OK ){
20046      rc = shellDatabaseError(p->db);
20047    }
20048
20049    /* Pretty-print the contents of array azResult[] to the output */
20050    if( rc==0 && nRow>0 ){
20051      int len, maxlen = 0;
20052      int i, j;
20053      int nPrintCol, nPrintRow;
20054      for(i=0; i<nRow; i++){
20055        len = strlen30(azResult[i]);
20056        if( len>maxlen ) maxlen = len;
20057      }
20058      nPrintCol = 80/(maxlen+2);
20059      if( nPrintCol<1 ) nPrintCol = 1;
20060      nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
20061      for(i=0; i<nPrintRow; i++){
20062        for(j=i; j<nRow; j+=nPrintRow){
20063          char *zSp = j<nPrintRow ? "" : "  ";
20064          utf8_printf(p->out, "%s%-*s", zSp, maxlen,
20065                      azResult[j] ? azResult[j]:"");
20066        }
20067        raw_printf(p->out, "\n");
20068      }
20069    }
20070
20071    for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
20072    sqlite3_free(azResult);
20073  }else
20074
20075  /* Begin redirecting output to the file "testcase-out.txt" */
20076  if( c=='t' && strcmp(azArg[0],"testcase")==0 ){
20077    output_reset(p);
20078    p->out = output_file_open("testcase-out.txt", 0);
20079    if( p->out==0 ){
20080      raw_printf(stderr, "Error: cannot open 'testcase-out.txt'\n");
20081    }
20082    if( nArg>=2 ){
20083      sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "%s", azArg[1]);
20084    }else{
20085      sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "?");
20086    }
20087  }else
20088
20089#ifndef SQLITE_UNTESTABLE
20090  if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 ){
20091    static const struct {
20092       const char *zCtrlName;   /* Name of a test-control option */
20093       int ctrlCode;            /* Integer code for that option */
20094       const char *zUsage;      /* Usage notes */
20095    } aCtrl[] = {
20096      { "always",             SQLITE_TESTCTRL_ALWAYS,        "BOOLEAN"        },
20097      { "assert",             SQLITE_TESTCTRL_ASSERT,        "BOOLEAN"        },
20098    /*{ "benign_malloc_hooks",SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS, ""       },*/
20099    /*{ "bitvec_test",        SQLITE_TESTCTRL_BITVEC_TEST,   ""             },*/
20100      { "byteorder",          SQLITE_TESTCTRL_BYTEORDER,     ""               },
20101      { "extra_schema_checks",SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS,"BOOLEAN"   },
20102    /*{ "fault_install",      SQLITE_TESTCTRL_FAULT_INSTALL, ""             },*/
20103      { "imposter",         SQLITE_TESTCTRL_IMPOSTER, "SCHEMA ON/OFF ROOTPAGE"},
20104      { "internal_functions", SQLITE_TESTCTRL_INTERNAL_FUNCTIONS, "" },
20105      { "localtime_fault",    SQLITE_TESTCTRL_LOCALTIME_FAULT,"BOOLEAN"       },
20106      { "never_corrupt",      SQLITE_TESTCTRL_NEVER_CORRUPT, "BOOLEAN"        },
20107      { "optimizations",      SQLITE_TESTCTRL_OPTIMIZATIONS, "DISABLE-MASK"   },
20108#ifdef YYCOVERAGE
20109      { "parser_coverage",    SQLITE_TESTCTRL_PARSER_COVERAGE, ""             },
20110#endif
20111      { "pending_byte",       SQLITE_TESTCTRL_PENDING_BYTE,  "OFFSET  "       },
20112      { "prng_restore",       SQLITE_TESTCTRL_PRNG_RESTORE,  ""               },
20113      { "prng_save",          SQLITE_TESTCTRL_PRNG_SAVE,     ""               },
20114      { "prng_seed",          SQLITE_TESTCTRL_PRNG_SEED,     "SEED ?db?"      },
20115      { "seek_count",         SQLITE_TESTCTRL_SEEK_COUNT,    ""               },
20116    };
20117    int testctrl = -1;
20118    int iCtrl = -1;
20119    int rc2 = 0;    /* 0: usage.  1: %d  2: %x  3: no-output */
20120    int isOk = 0;
20121    int i, n2;
20122    const char *zCmd = 0;
20123
20124    open_db(p, 0);
20125    zCmd = nArg>=2 ? azArg[1] : "help";
20126
20127    /* The argument can optionally begin with "-" or "--" */
20128    if( zCmd[0]=='-' && zCmd[1] ){
20129      zCmd++;
20130      if( zCmd[0]=='-' && zCmd[1] ) zCmd++;
20131    }
20132
20133    /* --help lists all test-controls */
20134    if( strcmp(zCmd,"help")==0 ){
20135      utf8_printf(p->out, "Available test-controls:\n");
20136      for(i=0; i<ArraySize(aCtrl); i++){
20137        utf8_printf(p->out, "  .testctrl %s %s\n",
20138                    aCtrl[i].zCtrlName, aCtrl[i].zUsage);
20139      }
20140      rc = 1;
20141      goto meta_command_exit;
20142    }
20143
20144    /* convert testctrl text option to value. allow any unique prefix
20145    ** of the option name, or a numerical value. */
20146    n2 = strlen30(zCmd);
20147    for(i=0; i<ArraySize(aCtrl); i++){
20148      if( strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){
20149        if( testctrl<0 ){
20150          testctrl = aCtrl[i].ctrlCode;
20151          iCtrl = i;
20152        }else{
20153          utf8_printf(stderr, "Error: ambiguous test-control: \"%s\"\n"
20154                              "Use \".testctrl --help\" for help\n", zCmd);
20155          rc = 1;
20156          goto meta_command_exit;
20157        }
20158      }
20159    }
20160    if( testctrl<0 ){
20161      utf8_printf(stderr,"Error: unknown test-control: %s\n"
20162                         "Use \".testctrl --help\" for help\n", zCmd);
20163    }else{
20164      switch(testctrl){
20165
20166        /* sqlite3_test_control(int, db, int) */
20167        case SQLITE_TESTCTRL_OPTIMIZATIONS:
20168          if( nArg==3 ){
20169            unsigned int opt = (unsigned int)strtol(azArg[2], 0, 0);
20170            rc2 = sqlite3_test_control(testctrl, p->db, opt);
20171            isOk = 3;
20172          }
20173          break;
20174
20175        /* sqlite3_test_control(int) */
20176        case SQLITE_TESTCTRL_PRNG_SAVE:
20177        case SQLITE_TESTCTRL_PRNG_RESTORE:
20178        case SQLITE_TESTCTRL_BYTEORDER:
20179          if( nArg==2 ){
20180            rc2 = sqlite3_test_control(testctrl);
20181            isOk = testctrl==SQLITE_TESTCTRL_BYTEORDER ? 1 : 3;
20182          }
20183          break;
20184
20185        /* sqlite3_test_control(int, uint) */
20186        case SQLITE_TESTCTRL_PENDING_BYTE:
20187          if( nArg==3 ){
20188            unsigned int opt = (unsigned int)integerValue(azArg[2]);
20189            rc2 = sqlite3_test_control(testctrl, opt);
20190            isOk = 3;
20191          }
20192          break;
20193
20194        /* sqlite3_test_control(int, int, sqlite3*) */
20195        case SQLITE_TESTCTRL_PRNG_SEED:
20196          if( nArg==3 || nArg==4 ){
20197            int ii = (int)integerValue(azArg[2]);
20198            sqlite3 *db;
20199            if( ii==0 && strcmp(azArg[2],"random")==0 ){
20200              sqlite3_randomness(sizeof(ii),&ii);
20201              printf("-- random seed: %d\n", ii);
20202            }
20203            if( nArg==3 ){
20204              db = 0;
20205            }else{
20206              db = p->db;
20207              /* Make sure the schema has been loaded */
20208              sqlite3_table_column_metadata(db, 0, "x", 0, 0, 0, 0, 0, 0);
20209            }
20210            rc2 = sqlite3_test_control(testctrl, ii, db);
20211            isOk = 3;
20212          }
20213          break;
20214
20215        /* sqlite3_test_control(int, int) */
20216        case SQLITE_TESTCTRL_ASSERT:
20217        case SQLITE_TESTCTRL_ALWAYS:
20218          if( nArg==3 ){
20219            int opt = booleanValue(azArg[2]);
20220            rc2 = sqlite3_test_control(testctrl, opt);
20221            isOk = 1;
20222          }
20223          break;
20224
20225        /* sqlite3_test_control(int, int) */
20226        case SQLITE_TESTCTRL_LOCALTIME_FAULT:
20227        case SQLITE_TESTCTRL_NEVER_CORRUPT:
20228          if( nArg==3 ){
20229            int opt = booleanValue(azArg[2]);
20230            rc2 = sqlite3_test_control(testctrl, opt);
20231            isOk = 3;
20232          }
20233          break;
20234
20235        /* sqlite3_test_control(sqlite3*) */
20236        case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS:
20237          rc2 = sqlite3_test_control(testctrl, p->db);
20238          isOk = 3;
20239          break;
20240
20241        case SQLITE_TESTCTRL_IMPOSTER:
20242          if( nArg==5 ){
20243            rc2 = sqlite3_test_control(testctrl, p->db,
20244                          azArg[2],
20245                          integerValue(azArg[3]),
20246                          integerValue(azArg[4]));
20247            isOk = 3;
20248          }
20249          break;
20250
20251        case SQLITE_TESTCTRL_SEEK_COUNT: {
20252          u64 x = 0;
20253          rc2 = sqlite3_test_control(testctrl, p->db, &x);
20254          utf8_printf(p->out, "%llu\n", x);
20255          isOk = 3;
20256          break;
20257        }
20258
20259#ifdef YYCOVERAGE
20260        case SQLITE_TESTCTRL_PARSER_COVERAGE:
20261          if( nArg==2 ){
20262            sqlite3_test_control(testctrl, p->out);
20263            isOk = 3;
20264          }
20265#endif
20266      }
20267    }
20268    if( isOk==0 && iCtrl>=0 ){
20269      utf8_printf(p->out, "Usage: .testctrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage);
20270      rc = 1;
20271    }else if( isOk==1 ){
20272      raw_printf(p->out, "%d\n", rc2);
20273    }else if( isOk==2 ){
20274      raw_printf(p->out, "0x%08x\n", rc2);
20275    }
20276  }else
20277#endif /* !defined(SQLITE_UNTESTABLE) */
20278
20279  if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 ){
20280    open_db(p, 0);
20281    sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0);
20282  }else
20283
20284  if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 ){
20285    if( nArg==2 ){
20286      enableTimer = booleanValue(azArg[1]);
20287      if( enableTimer && !HAS_TIMER ){
20288        raw_printf(stderr, "Error: timer not available on this system.\n");
20289        enableTimer = 0;
20290      }
20291    }else{
20292      raw_printf(stderr, "Usage: .timer on|off\n");
20293      rc = 1;
20294    }
20295  }else
20296
20297#ifndef SQLITE_OMIT_TRACE
20298  if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){
20299    int mType = 0;
20300    int jj;
20301    open_db(p, 0);
20302    for(jj=1; jj<nArg; jj++){
20303      const char *z = azArg[jj];
20304      if( z[0]=='-' ){
20305        if( optionMatch(z, "expanded") ){
20306          p->eTraceType = SHELL_TRACE_EXPANDED;
20307        }
20308#ifdef SQLITE_ENABLE_NORMALIZE
20309        else if( optionMatch(z, "normalized") ){
20310          p->eTraceType = SHELL_TRACE_NORMALIZED;
20311        }
20312#endif
20313        else if( optionMatch(z, "plain") ){
20314          p->eTraceType = SHELL_TRACE_PLAIN;
20315        }
20316        else if( optionMatch(z, "profile") ){
20317          mType |= SQLITE_TRACE_PROFILE;
20318        }
20319        else if( optionMatch(z, "row") ){
20320          mType |= SQLITE_TRACE_ROW;
20321        }
20322        else if( optionMatch(z, "stmt") ){
20323          mType |= SQLITE_TRACE_STMT;
20324        }
20325        else if( optionMatch(z, "close") ){
20326          mType |= SQLITE_TRACE_CLOSE;
20327        }
20328        else {
20329          raw_printf(stderr, "Unknown option \"%s\" on \".trace\"\n", z);
20330          rc = 1;
20331          goto meta_command_exit;
20332        }
20333      }else{
20334        output_file_close(p->traceOut);
20335        p->traceOut = output_file_open(azArg[1], 0);
20336      }
20337    }
20338    if( p->traceOut==0 ){
20339      sqlite3_trace_v2(p->db, 0, 0, 0);
20340    }else{
20341      if( mType==0 ) mType = SQLITE_TRACE_STMT;
20342      sqlite3_trace_v2(p->db, mType, sql_trace_callback, p);
20343    }
20344  }else
20345#endif /* !defined(SQLITE_OMIT_TRACE) */
20346
20347#if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_VIRTUALTABLE)
20348  if( c=='u' && strncmp(azArg[0], "unmodule", n)==0 ){
20349    int ii;
20350    int lenOpt;
20351    char *zOpt;
20352    if( nArg<2 ){
20353      raw_printf(stderr, "Usage: .unmodule [--allexcept] NAME ...\n");
20354      rc = 1;
20355      goto meta_command_exit;
20356    }
20357    open_db(p, 0);
20358    zOpt = azArg[1];
20359    if( zOpt[0]=='-' && zOpt[1]=='-' && zOpt[2]!=0 ) zOpt++;
20360    lenOpt = (int)strlen(zOpt);
20361    if( lenOpt>=3 && strncmp(zOpt, "-allexcept",lenOpt)==0 ){
20362      assert( azArg[nArg]==0 );
20363      sqlite3_drop_modules(p->db, nArg>2 ? (const char**)(azArg+2) : 0);
20364    }else{
20365      for(ii=1; ii<nArg; ii++){
20366        sqlite3_create_module(p->db, azArg[ii], 0, 0);
20367      }
20368    }
20369  }else
20370#endif
20371
20372#if SQLITE_USER_AUTHENTICATION
20373  if( c=='u' && strncmp(azArg[0], "user", n)==0 ){
20374    if( nArg<2 ){
20375      raw_printf(stderr, "Usage: .user SUBCOMMAND ...\n");
20376      rc = 1;
20377      goto meta_command_exit;
20378    }
20379    open_db(p, 0);
20380    if( strcmp(azArg[1],"login")==0 ){
20381      if( nArg!=4 ){
20382        raw_printf(stderr, "Usage: .user login USER PASSWORD\n");
20383        rc = 1;
20384        goto meta_command_exit;
20385      }
20386      rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3],
20387                                     strlen30(azArg[3]));
20388      if( rc ){
20389        utf8_printf(stderr, "Authentication failed for user %s\n", azArg[2]);
20390        rc = 1;
20391      }
20392    }else if( strcmp(azArg[1],"add")==0 ){
20393      if( nArg!=5 ){
20394        raw_printf(stderr, "Usage: .user add USER PASSWORD ISADMIN\n");
20395        rc = 1;
20396        goto meta_command_exit;
20397      }
20398      rc = sqlite3_user_add(p->db, azArg[2], azArg[3], strlen30(azArg[3]),
20399                            booleanValue(azArg[4]));
20400      if( rc ){
20401        raw_printf(stderr, "User-Add failed: %d\n", rc);
20402        rc = 1;
20403      }
20404    }else if( strcmp(azArg[1],"edit")==0 ){
20405      if( nArg!=5 ){
20406        raw_printf(stderr, "Usage: .user edit USER PASSWORD ISADMIN\n");
20407        rc = 1;
20408        goto meta_command_exit;
20409      }
20410      rc = sqlite3_user_change(p->db, azArg[2], azArg[3], strlen30(azArg[3]),
20411                              booleanValue(azArg[4]));
20412      if( rc ){
20413        raw_printf(stderr, "User-Edit failed: %d\n", rc);
20414        rc = 1;
20415      }
20416    }else if( strcmp(azArg[1],"delete")==0 ){
20417      if( nArg!=3 ){
20418        raw_printf(stderr, "Usage: .user delete USER\n");
20419        rc = 1;
20420        goto meta_command_exit;
20421      }
20422      rc = sqlite3_user_delete(p->db, azArg[2]);
20423      if( rc ){
20424        raw_printf(stderr, "User-Delete failed: %d\n", rc);
20425        rc = 1;
20426      }
20427    }else{
20428      raw_printf(stderr, "Usage: .user login|add|edit|delete ...\n");
20429      rc = 1;
20430      goto meta_command_exit;
20431    }
20432  }else
20433#endif /* SQLITE_USER_AUTHENTICATION */
20434
20435  if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
20436    utf8_printf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
20437        sqlite3_libversion(), sqlite3_sourceid());
20438#if SQLITE_HAVE_ZLIB
20439    utf8_printf(p->out, "zlib version %s\n", zlibVersion());
20440#endif
20441#define CTIMEOPT_VAL_(opt) #opt
20442#define CTIMEOPT_VAL(opt) CTIMEOPT_VAL_(opt)
20443#if defined(__clang__) && defined(__clang_major__)
20444    utf8_printf(p->out, "clang-" CTIMEOPT_VAL(__clang_major__) "."
20445                    CTIMEOPT_VAL(__clang_minor__) "."
20446                    CTIMEOPT_VAL(__clang_patchlevel__) "\n");
20447#elif defined(_MSC_VER)
20448    utf8_printf(p->out, "msvc-" CTIMEOPT_VAL(_MSC_VER) "\n");
20449#elif defined(__GNUC__) && defined(__VERSION__)
20450    utf8_printf(p->out, "gcc-" __VERSION__ "\n");
20451#endif
20452  }else
20453
20454  if( c=='v' && strncmp(azArg[0], "vfsinfo", n)==0 ){
20455    const char *zDbName = nArg==2 ? azArg[1] : "main";
20456    sqlite3_vfs *pVfs = 0;
20457    if( p->db ){
20458      sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFS_POINTER, &pVfs);
20459      if( pVfs ){
20460        utf8_printf(p->out, "vfs.zName      = \"%s\"\n", pVfs->zName);
20461        raw_printf(p->out, "vfs.iVersion   = %d\n", pVfs->iVersion);
20462        raw_printf(p->out, "vfs.szOsFile   = %d\n", pVfs->szOsFile);
20463        raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
20464      }
20465    }
20466  }else
20467
20468  if( c=='v' && strncmp(azArg[0], "vfslist", n)==0 ){
20469    sqlite3_vfs *pVfs;
20470    sqlite3_vfs *pCurrent = 0;
20471    if( p->db ){
20472      sqlite3_file_control(p->db, "main", SQLITE_FCNTL_VFS_POINTER, &pCurrent);
20473    }
20474    for(pVfs=sqlite3_vfs_find(0); pVfs; pVfs=pVfs->pNext){
20475      utf8_printf(p->out, "vfs.zName      = \"%s\"%s\n", pVfs->zName,
20476           pVfs==pCurrent ? "  <--- CURRENT" : "");
20477      raw_printf(p->out, "vfs.iVersion   = %d\n", pVfs->iVersion);
20478      raw_printf(p->out, "vfs.szOsFile   = %d\n", pVfs->szOsFile);
20479      raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
20480      if( pVfs->pNext ){
20481        raw_printf(p->out, "-----------------------------------\n");
20482      }
20483    }
20484  }else
20485
20486  if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
20487    const char *zDbName = nArg==2 ? azArg[1] : "main";
20488    char *zVfsName = 0;
20489    if( p->db ){
20490      sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
20491      if( zVfsName ){
20492        utf8_printf(p->out, "%s\n", zVfsName);
20493        sqlite3_free(zVfsName);
20494      }
20495    }
20496  }else
20497
20498  if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
20499    unsigned int x = nArg>=2 ? (unsigned int)integerValue(azArg[1]) : 0xffffffff;
20500    sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &x);
20501  }else
20502
20503  if( c=='w' && strncmp(azArg[0], "width", n)==0 ){
20504    int j;
20505    assert( nArg<=ArraySize(azArg) );
20506    p->nWidth = nArg-1;
20507    p->colWidth = realloc(p->colWidth, p->nWidth*sizeof(int)*2);
20508    if( p->colWidth==0 && p->nWidth>0 ) shell_out_of_memory();
20509    if( p->nWidth ) p->actualWidth = &p->colWidth[p->nWidth];
20510    for(j=1; j<nArg; j++){
20511      p->colWidth[j-1] = (int)integerValue(azArg[j]);
20512    }
20513  }else
20514
20515  {
20516    utf8_printf(stderr, "Error: unknown command or invalid arguments: "
20517      " \"%s\". Enter \".help\" for help\n", azArg[0]);
20518    rc = 1;
20519  }
20520
20521meta_command_exit:
20522  if( p->outCount ){
20523    p->outCount--;
20524    if( p->outCount==0 ) output_reset(p);
20525  }
20526  return rc;
20527}
20528
20529/*
20530** Return TRUE if a semicolon occurs anywhere in the first N characters
20531** of string z[].
20532*/
20533static int line_contains_semicolon(const char *z, int N){
20534  int i;
20535  for(i=0; i<N; i++){  if( z[i]==';' ) return 1; }
20536  return 0;
20537}
20538
20539/*
20540** Test to see if a line consists entirely of whitespace.
20541*/
20542static int _all_whitespace(const char *z){
20543  for(; *z; z++){
20544    if( IsSpace(z[0]) ) continue;
20545    if( *z=='/' && z[1]=='*' ){
20546      z += 2;
20547      while( *z && (*z!='*' || z[1]!='/') ){ z++; }
20548      if( *z==0 ) return 0;
20549      z++;
20550      continue;
20551    }
20552    if( *z=='-' && z[1]=='-' ){
20553      z += 2;
20554      while( *z && *z!='\n' ){ z++; }
20555      if( *z==0 ) return 1;
20556      continue;
20557    }
20558    return 0;
20559  }
20560  return 1;
20561}
20562
20563/*
20564** Return TRUE if the line typed in is an SQL command terminator other
20565** than a semi-colon.  The SQL Server style "go" command is understood
20566** as is the Oracle "/".
20567*/
20568static int line_is_command_terminator(const char *zLine){
20569  while( IsSpace(zLine[0]) ){ zLine++; };
20570  if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){
20571    return 1;  /* Oracle */
20572  }
20573  if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o'
20574         && _all_whitespace(&zLine[2]) ){
20575    return 1;  /* SQL Server */
20576  }
20577  return 0;
20578}
20579
20580/*
20581** We need a default sqlite3_complete() implementation to use in case
20582** the shell is compiled with SQLITE_OMIT_COMPLETE.  The default assumes
20583** any arbitrary text is a complete SQL statement.  This is not very
20584** user-friendly, but it does seem to work.
20585*/
20586#ifdef SQLITE_OMIT_COMPLETE
20587#define sqlite3_complete(x) 1
20588#endif
20589
20590/*
20591** Return true if zSql is a complete SQL statement.  Return false if it
20592** ends in the middle of a string literal or C-style comment.
20593*/
20594static int line_is_complete(char *zSql, int nSql){
20595  int rc;
20596  if( zSql==0 ) return 1;
20597  zSql[nSql] = ';';
20598  zSql[nSql+1] = 0;
20599  rc = sqlite3_complete(zSql);
20600  zSql[nSql] = 0;
20601  return rc;
20602}
20603
20604/*
20605** Run a single line of SQL.  Return the number of errors.
20606*/
20607static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){
20608  int rc;
20609  char *zErrMsg = 0;
20610
20611  open_db(p, 0);
20612  if( ShellHasFlag(p,SHFLG_Backslash) ) resolve_backslashes(zSql);
20613  if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0;
20614  BEGIN_TIMER;
20615  rc = shell_exec(p, zSql, &zErrMsg);
20616  END_TIMER;
20617  if( rc || zErrMsg ){
20618    char zPrefix[100];
20619    if( in!=0 || !stdin_is_interactive ){
20620      sqlite3_snprintf(sizeof(zPrefix), zPrefix,
20621                       "Error: near line %d:", startline);
20622    }else{
20623      sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
20624    }
20625    if( zErrMsg!=0 ){
20626      utf8_printf(stderr, "%s %s\n", zPrefix, zErrMsg);
20627      sqlite3_free(zErrMsg);
20628      zErrMsg = 0;
20629    }else{
20630      utf8_printf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
20631    }
20632    return 1;
20633  }else if( ShellHasFlag(p, SHFLG_CountChanges) ){
20634    raw_printf(p->out, "changes: %3d   total_changes: %d\n",
20635            sqlite3_changes(p->db), sqlite3_total_changes(p->db));
20636  }
20637  return 0;
20638}
20639
20640
20641/*
20642** Read input from *in and process it.  If *in==0 then input
20643** is interactive - the user is typing it it.  Otherwise, input
20644** is coming from a file or device.  A prompt is issued and history
20645** is saved only if input is interactive.  An interrupt signal will
20646** cause this routine to exit immediately, unless input is interactive.
20647**
20648** Return the number of errors.
20649*/
20650static int process_input(ShellState *p){
20651  char *zLine = 0;          /* A single input line */
20652  char *zSql = 0;           /* Accumulated SQL text */
20653  int nLine;                /* Length of current line */
20654  int nSql = 0;             /* Bytes of zSql[] used */
20655  int nAlloc = 0;           /* Allocated zSql[] space */
20656  int nSqlPrior = 0;        /* Bytes of zSql[] used by prior line */
20657  int rc;                   /* Error code */
20658  int errCnt = 0;           /* Number of errors seen */
20659  int startline = 0;        /* Line number for start of current input */
20660
20661  p->lineno = 0;
20662  while( errCnt==0 || !bail_on_error || (p->in==0 && stdin_is_interactive) ){
20663    fflush(p->out);
20664    zLine = one_input_line(p->in, zLine, nSql>0);
20665    if( zLine==0 ){
20666      /* End of input */
20667      if( p->in==0 && stdin_is_interactive ) printf("\n");
20668      break;
20669    }
20670    if( seenInterrupt ){
20671      if( p->in!=0 ) break;
20672      seenInterrupt = 0;
20673    }
20674    p->lineno++;
20675    if( nSql==0 && _all_whitespace(zLine) ){
20676      if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine);
20677      continue;
20678    }
20679    if( zLine && (zLine[0]=='.' || zLine[0]=='#') && nSql==0 ){
20680      if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine);
20681      if( zLine[0]=='.' ){
20682        rc = do_meta_command(zLine, p);
20683        if( rc==2 ){ /* exit requested */
20684          break;
20685        }else if( rc ){
20686          errCnt++;
20687        }
20688      }
20689      continue;
20690    }
20691    if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){
20692      memcpy(zLine,";",2);
20693    }
20694    nLine = strlen30(zLine);
20695    if( nSql+nLine+2>=nAlloc ){
20696      nAlloc = nSql+nLine+100;
20697      zSql = realloc(zSql, nAlloc);
20698      if( zSql==0 ) shell_out_of_memory();
20699    }
20700    nSqlPrior = nSql;
20701    if( nSql==0 ){
20702      int i;
20703      for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
20704      assert( nAlloc>0 && zSql!=0 );
20705      memcpy(zSql, zLine+i, nLine+1-i);
20706      startline = p->lineno;
20707      nSql = nLine-i;
20708    }else{
20709      zSql[nSql++] = '\n';
20710      memcpy(zSql+nSql, zLine, nLine+1);
20711      nSql += nLine;
20712    }
20713    if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
20714                && sqlite3_complete(zSql) ){
20715      errCnt += runOneSqlLine(p, zSql, p->in, startline);
20716      nSql = 0;
20717      if( p->outCount ){
20718        output_reset(p);
20719        p->outCount = 0;
20720      }else{
20721        clearTempFile(p);
20722      }
20723    }else if( nSql && _all_whitespace(zSql) ){
20724      if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zSql);
20725      nSql = 0;
20726    }
20727  }
20728  if( nSql && !_all_whitespace(zSql) ){
20729    errCnt += runOneSqlLine(p, zSql, p->in, startline);
20730  }
20731  free(zSql);
20732  free(zLine);
20733  return errCnt>0;
20734}
20735
20736/*
20737** Return a pathname which is the user's home directory.  A
20738** 0 return indicates an error of some kind.
20739*/
20740static char *find_home_dir(int clearFlag){
20741  static char *home_dir = NULL;
20742  if( clearFlag ){
20743    free(home_dir);
20744    home_dir = 0;
20745    return 0;
20746  }
20747  if( home_dir ) return home_dir;
20748
20749#if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) \
20750     && !defined(__RTP__) && !defined(_WRS_KERNEL)
20751  {
20752    struct passwd *pwent;
20753    uid_t uid = getuid();
20754    if( (pwent=getpwuid(uid)) != NULL) {
20755      home_dir = pwent->pw_dir;
20756    }
20757  }
20758#endif
20759
20760#if defined(_WIN32_WCE)
20761  /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
20762   */
20763  home_dir = "/";
20764#else
20765
20766#if defined(_WIN32) || defined(WIN32)
20767  if (!home_dir) {
20768    home_dir = getenv("USERPROFILE");
20769  }
20770#endif
20771
20772  if (!home_dir) {
20773    home_dir = getenv("HOME");
20774  }
20775
20776#if defined(_WIN32) || defined(WIN32)
20777  if (!home_dir) {
20778    char *zDrive, *zPath;
20779    int n;
20780    zDrive = getenv("HOMEDRIVE");
20781    zPath = getenv("HOMEPATH");
20782    if( zDrive && zPath ){
20783      n = strlen30(zDrive) + strlen30(zPath) + 1;
20784      home_dir = malloc( n );
20785      if( home_dir==0 ) return 0;
20786      sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
20787      return home_dir;
20788    }
20789    home_dir = "c:\\";
20790  }
20791#endif
20792
20793#endif /* !_WIN32_WCE */
20794
20795  if( home_dir ){
20796    int n = strlen30(home_dir) + 1;
20797    char *z = malloc( n );
20798    if( z ) memcpy(z, home_dir, n);
20799    home_dir = z;
20800  }
20801
20802  return home_dir;
20803}
20804
20805/*
20806** Read input from the file given by sqliterc_override.  Or if that
20807** parameter is NULL, take input from ~/.sqliterc
20808**
20809** Returns the number of errors.
20810*/
20811static void process_sqliterc(
20812  ShellState *p,                  /* Configuration data */
20813  const char *sqliterc_override   /* Name of config file. NULL to use default */
20814){
20815  char *home_dir = NULL;
20816  const char *sqliterc = sqliterc_override;
20817  char *zBuf = 0;
20818  FILE *inSaved = p->in;
20819  int savedLineno = p->lineno;
20820
20821  if (sqliterc == NULL) {
20822    home_dir = find_home_dir(0);
20823    if( home_dir==0 ){
20824      raw_printf(stderr, "-- warning: cannot find home directory;"
20825                      " cannot read ~/.sqliterc\n");
20826      return;
20827    }
20828    zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
20829    sqliterc = zBuf;
20830  }
20831  p->in = fopen(sqliterc,"rb");
20832  if( p->in ){
20833    if( stdin_is_interactive ){
20834      utf8_printf(stderr,"-- Loading resources from %s\n",sqliterc);
20835    }
20836    if( process_input(p) && bail_on_error ) exit(1);
20837    fclose(p->in);
20838  }else if( sqliterc_override!=0 ){
20839    utf8_printf(stderr,"cannot open: \"%s\"\n", sqliterc);
20840    if( bail_on_error ) exit(1);
20841  }
20842  p->in = inSaved;
20843  p->lineno = savedLineno;
20844  sqlite3_free(zBuf);
20845}
20846
20847/*
20848** Show available command line options
20849*/
20850static const char zOptions[] =
20851#if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE)
20852  "   -A ARGS...           run \".archive ARGS\" and exit\n"
20853#endif
20854  "   -append              append the database to the end of the file\n"
20855  "   -ascii               set output mode to 'ascii'\n"
20856  "   -bail                stop after hitting an error\n"
20857  "   -batch               force batch I/O\n"
20858  "   -box                 set output mode to 'box'\n"
20859  "   -column              set output mode to 'column'\n"
20860  "   -cmd COMMAND         run \"COMMAND\" before reading stdin\n"
20861  "   -csv                 set output mode to 'csv'\n"
20862#if defined(SQLITE_ENABLE_DESERIALIZE)
20863  "   -deserialize         open the database using sqlite3_deserialize()\n"
20864#endif
20865  "   -echo                print commands before execution\n"
20866  "   -init FILENAME       read/process named file\n"
20867  "   -[no]header          turn headers on or off\n"
20868#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
20869  "   -heap SIZE           Size of heap for memsys3 or memsys5\n"
20870#endif
20871  "   -help                show this message\n"
20872  "   -html                set output mode to HTML\n"
20873  "   -interactive         force interactive I/O\n"
20874  "   -json                set output mode to 'json'\n"
20875  "   -line                set output mode to 'line'\n"
20876  "   -list                set output mode to 'list'\n"
20877  "   -lookaside SIZE N    use N entries of SZ bytes for lookaside memory\n"
20878  "   -markdown            set output mode to 'markdown'\n"
20879#if defined(SQLITE_ENABLE_DESERIALIZE)
20880  "   -maxsize N           maximum size for a --deserialize database\n"
20881#endif
20882  "   -memtrace            trace all memory allocations and deallocations\n"
20883  "   -mmap N              default mmap size set to N\n"
20884#ifdef SQLITE_ENABLE_MULTIPLEX
20885  "   -multiplex           enable the multiplexor VFS\n"
20886#endif
20887  "   -newline SEP         set output row separator. Default: '\\n'\n"
20888  "   -nofollow            refuse to open symbolic links to database files\n"
20889  "   -nullvalue TEXT      set text string for NULL values. Default ''\n"
20890  "   -pagecache SIZE N    use N slots of SZ bytes each for page cache memory\n"
20891  "   -quote               set output mode to 'quote'\n"
20892  "   -readonly            open the database read-only\n"
20893  "   -separator SEP       set output column separator. Default: '|'\n"
20894#ifdef SQLITE_ENABLE_SORTER_REFERENCES
20895  "   -sorterref SIZE      sorter references threshold size\n"
20896#endif
20897  "   -stats               print memory stats before each finalize\n"
20898  "   -table               set output mode to 'table'\n"
20899  "   -tabs                set output mode to 'tabs'\n"
20900  "   -version             show SQLite version\n"
20901  "   -vfs NAME            use NAME as the default VFS\n"
20902#ifdef SQLITE_ENABLE_VFSTRACE
20903  "   -vfstrace            enable tracing of all VFS calls\n"
20904#endif
20905#ifdef SQLITE_HAVE_ZLIB
20906  "   -zip                 open the file as a ZIP Archive\n"
20907#endif
20908;
20909static void usage(int showDetail){
20910  utf8_printf(stderr,
20911      "Usage: %s [OPTIONS] FILENAME [SQL]\n"
20912      "FILENAME is the name of an SQLite database. A new database is created\n"
20913      "if the file does not previously exist.\n", Argv0);
20914  if( showDetail ){
20915    utf8_printf(stderr, "OPTIONS include:\n%s", zOptions);
20916  }else{
20917    raw_printf(stderr, "Use the -help option for additional information\n");
20918  }
20919  exit(1);
20920}
20921
20922/*
20923** Internal check:  Verify that the SQLite is uninitialized.  Print a
20924** error message if it is initialized.
20925*/
20926static void verify_uninitialized(void){
20927  if( sqlite3_config(-1)==SQLITE_MISUSE ){
20928    utf8_printf(stdout, "WARNING: attempt to configure SQLite after"
20929                        " initialization.\n");
20930  }
20931}
20932
20933/*
20934** Initialize the state information in data
20935*/
20936static void main_init(ShellState *data) {
20937  memset(data, 0, sizeof(*data));
20938  data->normalMode = data->cMode = data->mode = MODE_List;
20939  data->autoExplain = 1;
20940  memcpy(data->colSeparator,SEP_Column, 2);
20941  memcpy(data->rowSeparator,SEP_Row, 2);
20942  data->showHeader = 0;
20943  data->shellFlgs = SHFLG_Lookaside;
20944  verify_uninitialized();
20945  sqlite3_config(SQLITE_CONFIG_URI, 1);
20946  sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
20947  sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
20948  sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
20949  sqlite3_snprintf(sizeof(continuePrompt), continuePrompt,"   ...> ");
20950}
20951
20952/*
20953** Output text to the console in a font that attracts extra attention.
20954*/
20955#ifdef _WIN32
20956static void printBold(const char *zText){
20957#if !SQLITE_OS_WINRT
20958  HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
20959  CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
20960  GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
20961  SetConsoleTextAttribute(out,
20962         FOREGROUND_RED|FOREGROUND_INTENSITY
20963  );
20964#endif
20965  printf("%s", zText);
20966#if !SQLITE_OS_WINRT
20967  SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
20968#endif
20969}
20970#else
20971static void printBold(const char *zText){
20972  printf("\033[1m%s\033[0m", zText);
20973}
20974#endif
20975
20976/*
20977** Get the argument to an --option.  Throw an error and die if no argument
20978** is available.
20979*/
20980static char *cmdline_option_value(int argc, char **argv, int i){
20981  if( i==argc ){
20982    utf8_printf(stderr, "%s: Error: missing argument to %s\n",
20983            argv[0], argv[argc-1]);
20984    exit(1);
20985  }
20986  return argv[i];
20987}
20988
20989#ifndef SQLITE_SHELL_IS_UTF8
20990#  if (defined(_WIN32) || defined(WIN32)) \
20991   && (defined(_MSC_VER) || (defined(UNICODE) && defined(__GNUC__)))
20992#    define SQLITE_SHELL_IS_UTF8          (0)
20993#  else
20994#    define SQLITE_SHELL_IS_UTF8          (1)
20995#  endif
20996#endif
20997
20998#if SQLITE_SHELL_IS_UTF8
20999int SQLITE_CDECL main(int argc, char **argv){
21000#else
21001int SQLITE_CDECL wmain(int argc, wchar_t **wargv){
21002  char **argv;
21003#endif
21004  char *zErrMsg = 0;
21005  ShellState data;
21006  const char *zInitFile = 0;
21007  int i;
21008  int rc = 0;
21009  int warnInmemoryDb = 0;
21010  int readStdin = 1;
21011  int nCmd = 0;
21012  char **azCmd = 0;
21013  const char *zVfs = 0;           /* Value of -vfs command-line option */
21014#if !SQLITE_SHELL_IS_UTF8
21015  char **argvToFree = 0;
21016  int argcToFree = 0;
21017#endif
21018
21019  setBinaryMode(stdin, 0);
21020  setvbuf(stderr, 0, _IONBF, 0); /* Make sure stderr is unbuffered */
21021  stdin_is_interactive = isatty(0);
21022  stdout_is_console = isatty(1);
21023
21024#ifdef SQLITE_DEBUG
21025  registerOomSimulator();
21026#endif
21027
21028#if !defined(_WIN32_WCE)
21029  if( getenv("SQLITE_DEBUG_BREAK") ){
21030    if( isatty(0) && isatty(2) ){
21031      fprintf(stderr,
21032          "attach debugger to process %d and press any key to continue.\n",
21033          GETPID());
21034      fgetc(stdin);
21035    }else{
21036#if defined(_WIN32) || defined(WIN32)
21037#if SQLITE_OS_WINRT
21038      __debugbreak();
21039#else
21040      DebugBreak();
21041#endif
21042#elif defined(SIGTRAP)
21043      raise(SIGTRAP);
21044#endif
21045    }
21046  }
21047#endif
21048
21049#if USE_SYSTEM_SQLITE+0!=1
21050  if( strncmp(sqlite3_sourceid(),SQLITE_SOURCE_ID,60)!=0 ){
21051    utf8_printf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
21052            sqlite3_sourceid(), SQLITE_SOURCE_ID);
21053    exit(1);
21054  }
21055#endif
21056  main_init(&data);
21057
21058  /* On Windows, we must translate command-line arguments into UTF-8.
21059  ** The SQLite memory allocator subsystem has to be enabled in order to
21060  ** do this.  But we want to run an sqlite3_shutdown() afterwards so that
21061  ** subsequent sqlite3_config() calls will work.  So copy all results into
21062  ** memory that does not come from the SQLite memory allocator.
21063  */
21064#if !SQLITE_SHELL_IS_UTF8
21065  sqlite3_initialize();
21066  argvToFree = malloc(sizeof(argv[0])*argc*2);
21067  argcToFree = argc;
21068  argv = argvToFree + argc;
21069  if( argv==0 ) shell_out_of_memory();
21070  for(i=0; i<argc; i++){
21071    char *z = sqlite3_win32_unicode_to_utf8(wargv[i]);
21072    int n;
21073    if( z==0 ) shell_out_of_memory();
21074    n = (int)strlen(z);
21075    argv[i] = malloc( n+1 );
21076    if( argv[i]==0 ) shell_out_of_memory();
21077    memcpy(argv[i], z, n+1);
21078    argvToFree[i] = argv[i];
21079    sqlite3_free(z);
21080  }
21081  sqlite3_shutdown();
21082#endif
21083
21084  assert( argc>=1 && argv && argv[0] );
21085  Argv0 = argv[0];
21086
21087  /* Make sure we have a valid signal handler early, before anything
21088  ** else is done.
21089  */
21090#ifdef SIGINT
21091  signal(SIGINT, interrupt_handler);
21092#elif (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE)
21093  SetConsoleCtrlHandler(ConsoleCtrlHandler, TRUE);
21094#endif
21095
21096#ifdef SQLITE_SHELL_DBNAME_PROC
21097  {
21098    /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name
21099    ** of a C-function that will provide the name of the database file.  Use
21100    ** this compile-time option to embed this shell program in larger
21101    ** applications. */
21102    extern void SQLITE_SHELL_DBNAME_PROC(const char**);
21103    SQLITE_SHELL_DBNAME_PROC(&data.zDbFilename);
21104    warnInmemoryDb = 0;
21105  }
21106#endif
21107
21108  /* Do an initial pass through the command-line argument to locate
21109  ** the name of the database file, the name of the initialization file,
21110  ** the size of the alternative malloc heap,
21111  ** and the first command to execute.
21112  */
21113  verify_uninitialized();
21114  for(i=1; i<argc; i++){
21115    char *z;
21116    z = argv[i];
21117    if( z[0]!='-' ){
21118      if( data.zDbFilename==0 ){
21119        data.zDbFilename = z;
21120      }else{
21121        /* Excesss arguments are interpreted as SQL (or dot-commands) and
21122        ** mean that nothing is read from stdin */
21123        readStdin = 0;
21124        nCmd++;
21125        azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd);
21126        if( azCmd==0 ) shell_out_of_memory();
21127        azCmd[nCmd-1] = z;
21128      }
21129    }
21130    if( z[1]=='-' ) z++;
21131    if( strcmp(z,"-separator")==0
21132     || strcmp(z,"-nullvalue")==0
21133     || strcmp(z,"-newline")==0
21134     || strcmp(z,"-cmd")==0
21135    ){
21136      (void)cmdline_option_value(argc, argv, ++i);
21137    }else if( strcmp(z,"-init")==0 ){
21138      zInitFile = cmdline_option_value(argc, argv, ++i);
21139    }else if( strcmp(z,"-batch")==0 ){
21140      /* Need to check for batch mode here to so we can avoid printing
21141      ** informational messages (like from process_sqliterc) before
21142      ** we do the actual processing of arguments later in a second pass.
21143      */
21144      stdin_is_interactive = 0;
21145    }else if( strcmp(z,"-heap")==0 ){
21146#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
21147      const char *zSize;
21148      sqlite3_int64 szHeap;
21149
21150      zSize = cmdline_option_value(argc, argv, ++i);
21151      szHeap = integerValue(zSize);
21152      if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
21153      sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
21154#else
21155      (void)cmdline_option_value(argc, argv, ++i);
21156#endif
21157    }else if( strcmp(z,"-pagecache")==0 ){
21158      sqlite3_int64 n, sz;
21159      sz = integerValue(cmdline_option_value(argc,argv,++i));
21160      if( sz>70000 ) sz = 70000;
21161      if( sz<0 ) sz = 0;
21162      n = integerValue(cmdline_option_value(argc,argv,++i));
21163      if( sz>0 && n>0 && 0xffffffffffffLL/sz<n ){
21164        n = 0xffffffffffffLL/sz;
21165      }
21166      sqlite3_config(SQLITE_CONFIG_PAGECACHE,
21167                    (n>0 && sz>0) ? malloc(n*sz) : 0, sz, n);
21168      data.shellFlgs |= SHFLG_Pagecache;
21169    }else if( strcmp(z,"-lookaside")==0 ){
21170      int n, sz;
21171      sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
21172      if( sz<0 ) sz = 0;
21173      n = (int)integerValue(cmdline_option_value(argc,argv,++i));
21174      if( n<0 ) n = 0;
21175      sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n);
21176      if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside;
21177#ifdef SQLITE_ENABLE_VFSTRACE
21178    }else if( strcmp(z,"-vfstrace")==0 ){
21179      extern int vfstrace_register(
21180         const char *zTraceName,
21181         const char *zOldVfsName,
21182         int (*xOut)(const char*,void*),
21183         void *pOutArg,
21184         int makeDefault
21185      );
21186      vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
21187#endif
21188#ifdef SQLITE_ENABLE_MULTIPLEX
21189    }else if( strcmp(z,"-multiplex")==0 ){
21190      extern int sqlite3_multiple_initialize(const char*,int);
21191      sqlite3_multiplex_initialize(0, 1);
21192#endif
21193    }else if( strcmp(z,"-mmap")==0 ){
21194      sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
21195      sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
21196#ifdef SQLITE_ENABLE_SORTER_REFERENCES
21197    }else if( strcmp(z,"-sorterref")==0 ){
21198      sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
21199      sqlite3_config(SQLITE_CONFIG_SORTERREF_SIZE, (int)sz);
21200#endif
21201    }else if( strcmp(z,"-vfs")==0 ){
21202      zVfs = cmdline_option_value(argc, argv, ++i);
21203#ifdef SQLITE_HAVE_ZLIB
21204    }else if( strcmp(z,"-zip")==0 ){
21205      data.openMode = SHELL_OPEN_ZIPFILE;
21206#endif
21207    }else if( strcmp(z,"-append")==0 ){
21208      data.openMode = SHELL_OPEN_APPENDVFS;
21209#ifdef SQLITE_ENABLE_DESERIALIZE
21210    }else if( strcmp(z,"-deserialize")==0 ){
21211      data.openMode = SHELL_OPEN_DESERIALIZE;
21212    }else if( strcmp(z,"-maxsize")==0 && i+1<argc ){
21213      data.szMax = integerValue(argv[++i]);
21214#endif
21215    }else if( strcmp(z,"-readonly")==0 ){
21216      data.openMode = SHELL_OPEN_READONLY;
21217    }else if( strcmp(z,"-nofollow")==0 ){
21218      data.openFlags = SQLITE_OPEN_NOFOLLOW;
21219#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
21220    }else if( strncmp(z, "-A",2)==0 ){
21221      /* All remaining command-line arguments are passed to the ".archive"
21222      ** command, so ignore them */
21223      break;
21224#endif
21225    }else if( strcmp(z, "-memtrace")==0 ){
21226      sqlite3MemTraceActivate(stderr);
21227    }else if( strcmp(z,"-bail")==0 ){
21228      bail_on_error = 1;
21229    }
21230  }
21231  verify_uninitialized();
21232
21233
21234#ifdef SQLITE_SHELL_INIT_PROC
21235  {
21236    /* If the SQLITE_SHELL_INIT_PROC macro is defined, then it is the name
21237    ** of a C-function that will perform initialization actions on SQLite that
21238    ** occur just before or after sqlite3_initialize(). Use this compile-time
21239    ** option to embed this shell program in larger applications. */
21240    extern void SQLITE_SHELL_INIT_PROC(void);
21241    SQLITE_SHELL_INIT_PROC();
21242  }
21243#else
21244  /* All the sqlite3_config() calls have now been made. So it is safe
21245  ** to call sqlite3_initialize() and process any command line -vfs option. */
21246  sqlite3_initialize();
21247#endif
21248
21249  if( zVfs ){
21250    sqlite3_vfs *pVfs = sqlite3_vfs_find(zVfs);
21251    if( pVfs ){
21252      sqlite3_vfs_register(pVfs, 1);
21253    }else{
21254      utf8_printf(stderr, "no such VFS: \"%s\"\n", argv[i]);
21255      exit(1);
21256    }
21257  }
21258
21259  if( data.zDbFilename==0 ){
21260#ifndef SQLITE_OMIT_MEMORYDB
21261    data.zDbFilename = ":memory:";
21262    warnInmemoryDb = argc==1;
21263#else
21264    utf8_printf(stderr,"%s: Error: no database filename specified\n", Argv0);
21265    return 1;
21266#endif
21267  }
21268  data.out = stdout;
21269  sqlite3_appendvfs_init(0,0,0);
21270
21271  /* Go ahead and open the database file if it already exists.  If the
21272  ** file does not exist, delay opening it.  This prevents empty database
21273  ** files from being created if a user mistypes the database name argument
21274  ** to the sqlite command-line tool.
21275  */
21276  if( access(data.zDbFilename, 0)==0 ){
21277    open_db(&data, 0);
21278  }
21279
21280  /* Process the initialization file if there is one.  If no -init option
21281  ** is given on the command line, look for a file named ~/.sqliterc and
21282  ** try to process it.
21283  */
21284  process_sqliterc(&data,zInitFile);
21285
21286  /* Make a second pass through the command-line argument and set
21287  ** options.  This second pass is delayed until after the initialization
21288  ** file is processed so that the command-line arguments will override
21289  ** settings in the initialization file.
21290  */
21291  for(i=1; i<argc; i++){
21292    char *z = argv[i];
21293    if( z[0]!='-' ) continue;
21294    if( z[1]=='-' ){ z++; }
21295    if( strcmp(z,"-init")==0 ){
21296      i++;
21297    }else if( strcmp(z,"-html")==0 ){
21298      data.mode = MODE_Html;
21299    }else if( strcmp(z,"-list")==0 ){
21300      data.mode = MODE_List;
21301    }else if( strcmp(z,"-quote")==0 ){
21302      data.mode = MODE_Quote;
21303      sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Comma);
21304      sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Row);
21305    }else if( strcmp(z,"-line")==0 ){
21306      data.mode = MODE_Line;
21307    }else if( strcmp(z,"-column")==0 ){
21308      data.mode = MODE_Column;
21309    }else if( strcmp(z,"-json")==0 ){
21310      data.mode = MODE_Json;
21311    }else if( strcmp(z,"-markdown")==0 ){
21312      data.mode = MODE_Markdown;
21313    }else if( strcmp(z,"-table")==0 ){
21314      data.mode = MODE_Table;
21315    }else if( strcmp(z,"-box")==0 ){
21316      data.mode = MODE_Box;
21317    }else if( strcmp(z,"-csv")==0 ){
21318      data.mode = MODE_Csv;
21319      memcpy(data.colSeparator,",",2);
21320#ifdef SQLITE_HAVE_ZLIB
21321    }else if( strcmp(z,"-zip")==0 ){
21322      data.openMode = SHELL_OPEN_ZIPFILE;
21323#endif
21324    }else if( strcmp(z,"-append")==0 ){
21325      data.openMode = SHELL_OPEN_APPENDVFS;
21326#ifdef SQLITE_ENABLE_DESERIALIZE
21327    }else if( strcmp(z,"-deserialize")==0 ){
21328      data.openMode = SHELL_OPEN_DESERIALIZE;
21329    }else if( strcmp(z,"-maxsize")==0 && i+1<argc ){
21330      data.szMax = integerValue(argv[++i]);
21331#endif
21332    }else if( strcmp(z,"-readonly")==0 ){
21333      data.openMode = SHELL_OPEN_READONLY;
21334    }else if( strcmp(z,"-nofollow")==0 ){
21335      data.openFlags |= SQLITE_OPEN_NOFOLLOW;
21336    }else if( strcmp(z,"-ascii")==0 ){
21337      data.mode = MODE_Ascii;
21338      sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Unit);
21339      sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Record);
21340    }else if( strcmp(z,"-tabs")==0 ){
21341      data.mode = MODE_List;
21342      sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Tab);
21343      sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Row);
21344    }else if( strcmp(z,"-separator")==0 ){
21345      sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
21346                       "%s",cmdline_option_value(argc,argv,++i));
21347    }else if( strcmp(z,"-newline")==0 ){
21348      sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
21349                       "%s",cmdline_option_value(argc,argv,++i));
21350    }else if( strcmp(z,"-nullvalue")==0 ){
21351      sqlite3_snprintf(sizeof(data.nullValue), data.nullValue,
21352                       "%s",cmdline_option_value(argc,argv,++i));
21353    }else if( strcmp(z,"-header")==0 ){
21354      data.showHeader = 1;
21355    }else if( strcmp(z,"-noheader")==0 ){
21356      data.showHeader = 0;
21357    }else if( strcmp(z,"-echo")==0 ){
21358      ShellSetFlag(&data, SHFLG_Echo);
21359    }else if( strcmp(z,"-eqp")==0 ){
21360      data.autoEQP = AUTOEQP_on;
21361    }else if( strcmp(z,"-eqpfull")==0 ){
21362      data.autoEQP = AUTOEQP_full;
21363    }else if( strcmp(z,"-stats")==0 ){
21364      data.statsOn = 1;
21365    }else if( strcmp(z,"-scanstats")==0 ){
21366      data.scanstatsOn = 1;
21367    }else if( strcmp(z,"-backslash")==0 ){
21368      /* Undocumented command-line option: -backslash
21369      ** Causes C-style backslash escapes to be evaluated in SQL statements
21370      ** prior to sending the SQL into SQLite.  Useful for injecting
21371      ** crazy bytes in the middle of SQL statements for testing and debugging.
21372      */
21373      ShellSetFlag(&data, SHFLG_Backslash);
21374    }else if( strcmp(z,"-bail")==0 ){
21375      /* No-op.  The bail_on_error flag should already be set. */
21376    }else if( strcmp(z,"-version")==0 ){
21377      printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
21378      return 0;
21379    }else if( strcmp(z,"-interactive")==0 ){
21380      stdin_is_interactive = 1;
21381    }else if( strcmp(z,"-batch")==0 ){
21382      stdin_is_interactive = 0;
21383    }else if( strcmp(z,"-heap")==0 ){
21384      i++;
21385    }else if( strcmp(z,"-pagecache")==0 ){
21386      i+=2;
21387    }else if( strcmp(z,"-lookaside")==0 ){
21388      i+=2;
21389    }else if( strcmp(z,"-mmap")==0 ){
21390      i++;
21391    }else if( strcmp(z,"-memtrace")==0 ){
21392      i++;
21393#ifdef SQLITE_ENABLE_SORTER_REFERENCES
21394    }else if( strcmp(z,"-sorterref")==0 ){
21395      i++;
21396#endif
21397    }else if( strcmp(z,"-vfs")==0 ){
21398      i++;
21399#ifdef SQLITE_ENABLE_VFSTRACE
21400    }else if( strcmp(z,"-vfstrace")==0 ){
21401      i++;
21402#endif
21403#ifdef SQLITE_ENABLE_MULTIPLEX
21404    }else if( strcmp(z,"-multiplex")==0 ){
21405      i++;
21406#endif
21407    }else if( strcmp(z,"-help")==0 ){
21408      usage(1);
21409    }else if( strcmp(z,"-cmd")==0 ){
21410      /* Run commands that follow -cmd first and separately from commands
21411      ** that simply appear on the command-line.  This seems goofy.  It would
21412      ** be better if all commands ran in the order that they appear.  But
21413      ** we retain the goofy behavior for historical compatibility. */
21414      if( i==argc-1 ) break;
21415      z = cmdline_option_value(argc,argv,++i);
21416      if( z[0]=='.' ){
21417        rc = do_meta_command(z, &data);
21418        if( rc && bail_on_error ) return rc==2 ? 0 : rc;
21419      }else{
21420        open_db(&data, 0);
21421        rc = shell_exec(&data, z, &zErrMsg);
21422        if( zErrMsg!=0 ){
21423          utf8_printf(stderr,"Error: %s\n", zErrMsg);
21424          if( bail_on_error ) return rc!=0 ? rc : 1;
21425        }else if( rc!=0 ){
21426          utf8_printf(stderr,"Error: unable to process SQL \"%s\"\n", z);
21427          if( bail_on_error ) return rc;
21428        }
21429      }
21430#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
21431    }else if( strncmp(z, "-A", 2)==0 ){
21432      if( nCmd>0 ){
21433        utf8_printf(stderr, "Error: cannot mix regular SQL or dot-commands"
21434                            " with \"%s\"\n", z);
21435        return 1;
21436      }
21437      open_db(&data, OPEN_DB_ZIPFILE);
21438      if( z[2] ){
21439        argv[i] = &z[2];
21440        arDotCommand(&data, 1, argv+(i-1), argc-(i-1));
21441      }else{
21442        arDotCommand(&data, 1, argv+i, argc-i);
21443      }
21444      readStdin = 0;
21445      break;
21446#endif
21447    }else{
21448      utf8_printf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
21449      raw_printf(stderr,"Use -help for a list of options.\n");
21450      return 1;
21451    }
21452    data.cMode = data.mode;
21453  }
21454
21455  if( !readStdin ){
21456    /* Run all arguments that do not begin with '-' as if they were separate
21457    ** command-line inputs, except for the argToSkip argument which contains
21458    ** the database filename.
21459    */
21460    for(i=0; i<nCmd; i++){
21461      if( azCmd[i][0]=='.' ){
21462        rc = do_meta_command(azCmd[i], &data);
21463        if( rc ){
21464          free(azCmd);
21465          return rc==2 ? 0 : rc;
21466        }
21467      }else{
21468        open_db(&data, 0);
21469        rc = shell_exec(&data, azCmd[i], &zErrMsg);
21470        if( zErrMsg || rc ){
21471          if( zErrMsg!=0 ){
21472            utf8_printf(stderr,"Error: %s\n", zErrMsg);
21473          }else{
21474            utf8_printf(stderr,"Error: unable to process SQL: %s\n", azCmd[i]);
21475          }
21476          sqlite3_free(zErrMsg);
21477          free(azCmd);
21478          return rc!=0 ? rc : 1;
21479        }
21480      }
21481    }
21482  }else{
21483    /* Run commands received from standard input
21484    */
21485    if( stdin_is_interactive ){
21486      char *zHome;
21487      char *zHistory;
21488      int nHistory;
21489      printf(
21490        "SQLite version %s %.19s\n" /*extra-version-info*/
21491        "Enter \".help\" for usage hints.\n",
21492        sqlite3_libversion(), sqlite3_sourceid()
21493      );
21494      if( warnInmemoryDb ){
21495        printf("Connected to a ");
21496        printBold("transient in-memory database");
21497        printf(".\nUse \".open FILENAME\" to reopen on a "
21498               "persistent database.\n");
21499      }
21500      zHistory = getenv("SQLITE_HISTORY");
21501      if( zHistory ){
21502        zHistory = strdup(zHistory);
21503      }else if( (zHome = find_home_dir(0))!=0 ){
21504        nHistory = strlen30(zHome) + 20;
21505        if( (zHistory = malloc(nHistory))!=0 ){
21506          sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
21507        }
21508      }
21509      if( zHistory ){ shell_read_history(zHistory); }
21510#if HAVE_READLINE || HAVE_EDITLINE
21511      rl_attempted_completion_function = readline_completion;
21512#elif HAVE_LINENOISE
21513      linenoiseSetCompletionCallback(linenoise_completion);
21514#endif
21515      data.in = 0;
21516      rc = process_input(&data);
21517      if( zHistory ){
21518        shell_stifle_history(2000);
21519        shell_write_history(zHistory);
21520        free(zHistory);
21521      }
21522    }else{
21523      data.in = stdin;
21524      rc = process_input(&data);
21525    }
21526  }
21527  free(azCmd);
21528  set_table_name(&data, 0);
21529  if( data.db ){
21530    session_close_all(&data);
21531    close_db(data.db);
21532  }
21533  sqlite3_free(data.zFreeOnClose);
21534  find_home_dir(1);
21535  output_reset(&data);
21536  data.doXdgOpen = 0;
21537  clearTempFile(&data);
21538#if !SQLITE_SHELL_IS_UTF8
21539  for(i=0; i<argcToFree; i++) free(argvToFree[i]);
21540  free(argvToFree);
21541#endif
21542  free(data.colWidth);
21543  /* Clear the global data structure so that valgrind will detect memory
21544  ** leaks */
21545  memset(&data, 0, sizeof(data));
21546  return rc;
21547}
21548