xref: /freebsd/contrib/sqlite3/shell.c (revision cd0d51baaa4509a1db83251a601d34404d20c990)
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 ** Warning pragmas copied from msvc.h in the core.
40 */
41 #if defined(_MSC_VER)
42 #pragma warning(disable : 4054)
43 #pragma warning(disable : 4055)
44 #pragma warning(disable : 4100)
45 #pragma warning(disable : 4127)
46 #pragma warning(disable : 4130)
47 #pragma warning(disable : 4152)
48 #pragma warning(disable : 4189)
49 #pragma warning(disable : 4206)
50 #pragma warning(disable : 4210)
51 #pragma warning(disable : 4232)
52 #pragma warning(disable : 4244)
53 #pragma warning(disable : 4305)
54 #pragma warning(disable : 4306)
55 #pragma warning(disable : 4702)
56 #pragma warning(disable : 4706)
57 #endif /* defined(_MSC_VER) */
58 
59 /*
60 ** No support for loadable extensions in VxWorks.
61 */
62 #if (defined(__RTP__) || defined(_WRS_KERNEL)) && !SQLITE_OMIT_LOAD_EXTENSION
63 # define SQLITE_OMIT_LOAD_EXTENSION 1
64 #endif
65 
66 /*
67 ** Enable large-file support for fopen() and friends on unix.
68 */
69 #ifndef SQLITE_DISABLE_LFS
70 # define _LARGE_FILE       1
71 # ifndef _FILE_OFFSET_BITS
72 #   define _FILE_OFFSET_BITS 64
73 # endif
74 # define _LARGEFILE_SOURCE 1
75 #endif
76 
77 #include <stdlib.h>
78 #include <string.h>
79 #include <stdio.h>
80 #include <assert.h>
81 #include "sqlite3.h"
82 typedef sqlite3_int64 i64;
83 typedef sqlite3_uint64 u64;
84 typedef unsigned char u8;
85 #if SQLITE_USER_AUTHENTICATION
86 # include "sqlite3userauth.h"
87 #endif
88 #include <ctype.h>
89 #include <stdarg.h>
90 
91 #if !defined(_WIN32) && !defined(WIN32)
92 # include <signal.h>
93 # if !defined(__RTP__) && !defined(_WRS_KERNEL)
94 #  include <pwd.h>
95 # endif
96 #endif
97 #if (!defined(_WIN32) && !defined(WIN32)) || defined(__MINGW32__)
98 # include <unistd.h>
99 # include <dirent.h>
100 # define GETPID getpid
101 # if defined(__MINGW32__)
102 #  define DIRENT dirent
103 #  ifndef S_ISLNK
104 #   define S_ISLNK(mode) (0)
105 #  endif
106 # endif
107 #else
108 # define GETPID (int)GetCurrentProcessId
109 #endif
110 #include <sys/types.h>
111 #include <sys/stat.h>
112 
113 #if HAVE_READLINE
114 # include <readline/readline.h>
115 # include <readline/history.h>
116 #endif
117 
118 #if HAVE_EDITLINE
119 # include <editline/readline.h>
120 #endif
121 
122 #if HAVE_EDITLINE || HAVE_READLINE
123 
124 # define shell_add_history(X) add_history(X)
125 # define shell_read_history(X) read_history(X)
126 # define shell_write_history(X) write_history(X)
127 # define shell_stifle_history(X) stifle_history(X)
128 # define shell_readline(X) readline(X)
129 
130 #elif HAVE_LINENOISE
131 
132 # include "linenoise.h"
133 # define shell_add_history(X) linenoiseHistoryAdd(X)
134 # define shell_read_history(X) linenoiseHistoryLoad(X)
135 # define shell_write_history(X) linenoiseHistorySave(X)
136 # define shell_stifle_history(X) linenoiseHistorySetMaxLen(X)
137 # define shell_readline(X) linenoise(X)
138 
139 #else
140 
141 # define shell_read_history(X)
142 # define shell_write_history(X)
143 # define shell_stifle_history(X)
144 
145 # define SHELL_USE_LOCAL_GETLINE 1
146 #endif
147 
148 
149 #if defined(_WIN32) || defined(WIN32)
150 # include <io.h>
151 # include <fcntl.h>
152 # define isatty(h) _isatty(h)
153 # ifndef access
154 #  define access(f,m) _access((f),(m))
155 # endif
156 # ifndef unlink
157 #  define unlink _unlink
158 # endif
159 # ifndef strdup
160 #  define strdup _strdup
161 # endif
162 # undef popen
163 # define popen _popen
164 # undef pclose
165 # define pclose _pclose
166 #else
167  /* Make sure isatty() has a prototype. */
168  extern int isatty(int);
169 
170 # if !defined(__RTP__) && !defined(_WRS_KERNEL)
171   /* popen and pclose are not C89 functions and so are
172   ** sometimes omitted from the <stdio.h> header */
173    extern FILE *popen(const char*,const char*);
174    extern int pclose(FILE*);
175 # else
176 #  define SQLITE_OMIT_POPEN 1
177 # endif
178 #endif
179 
180 #if defined(_WIN32_WCE)
181 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
182  * thus we always assume that we have a console. That can be
183  * overridden with the -batch command line option.
184  */
185 #define isatty(x) 1
186 #endif
187 
188 /* ctype macros that work with signed characters */
189 #define IsSpace(X)  isspace((unsigned char)X)
190 #define IsDigit(X)  isdigit((unsigned char)X)
191 #define ToLower(X)  (char)tolower((unsigned char)X)
192 
193 #if defined(_WIN32) || defined(WIN32)
194 #include <windows.h>
195 
196 /* string conversion routines only needed on Win32 */
197 extern char *sqlite3_win32_unicode_to_utf8(LPCWSTR);
198 extern char *sqlite3_win32_mbcs_to_utf8_v2(const char *, int);
199 extern char *sqlite3_win32_utf8_to_mbcs_v2(const char *, int);
200 extern LPWSTR sqlite3_win32_utf8_to_unicode(const char *zText);
201 #endif
202 
203 /* On Windows, we normally run with output mode of TEXT so that \n characters
204 ** are automatically translated into \r\n.  However, this behavior needs
205 ** to be disabled in some cases (ex: when generating CSV output and when
206 ** rendering quoted strings that contain \n characters).  The following
207 ** routines take care of that.
208 */
209 #if defined(_WIN32) || defined(WIN32)
210 static void setBinaryMode(FILE *file, int isOutput){
211   if( isOutput ) fflush(file);
212   _setmode(_fileno(file), _O_BINARY);
213 }
214 static void setTextMode(FILE *file, int isOutput){
215   if( isOutput ) fflush(file);
216   _setmode(_fileno(file), _O_TEXT);
217 }
218 #else
219 # define setBinaryMode(X,Y)
220 # define setTextMode(X,Y)
221 #endif
222 
223 
224 /* True if the timer is enabled */
225 static int enableTimer = 0;
226 
227 /* Return the current wall-clock time */
228 static sqlite3_int64 timeOfDay(void){
229   static sqlite3_vfs *clockVfs = 0;
230   sqlite3_int64 t;
231   if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0);
232   if( clockVfs->iVersion>=2 && clockVfs->xCurrentTimeInt64!=0 ){
233     clockVfs->xCurrentTimeInt64(clockVfs, &t);
234   }else{
235     double r;
236     clockVfs->xCurrentTime(clockVfs, &r);
237     t = (sqlite3_int64)(r*86400000.0);
238   }
239   return t;
240 }
241 
242 #if !defined(_WIN32) && !defined(WIN32) && !defined(__minux)
243 #include <sys/time.h>
244 #include <sys/resource.h>
245 
246 /* VxWorks does not support getrusage() as far as we can determine */
247 #if defined(_WRS_KERNEL) || defined(__RTP__)
248 struct rusage {
249   struct timeval ru_utime; /* user CPU time used */
250   struct timeval ru_stime; /* system CPU time used */
251 };
252 #define getrusage(A,B) memset(B,0,sizeof(*B))
253 #endif
254 
255 /* Saved resource information for the beginning of an operation */
256 static struct rusage sBegin;  /* CPU time at start */
257 static sqlite3_int64 iBegin;  /* Wall-clock time at start */
258 
259 /*
260 ** Begin timing an operation
261 */
262 static void beginTimer(void){
263   if( enableTimer ){
264     getrusage(RUSAGE_SELF, &sBegin);
265     iBegin = timeOfDay();
266   }
267 }
268 
269 /* Return the difference of two time_structs in seconds */
270 static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
271   return (pEnd->tv_usec - pStart->tv_usec)*0.000001 +
272          (double)(pEnd->tv_sec - pStart->tv_sec);
273 }
274 
275 /*
276 ** Print the timing results.
277 */
278 static void endTimer(void){
279   if( enableTimer ){
280     sqlite3_int64 iEnd = timeOfDay();
281     struct rusage sEnd;
282     getrusage(RUSAGE_SELF, &sEnd);
283     printf("Run Time: real %.3f user %f sys %f\n",
284        (iEnd - iBegin)*0.001,
285        timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
286        timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
287   }
288 }
289 
290 #define BEGIN_TIMER beginTimer()
291 #define END_TIMER endTimer()
292 #define HAS_TIMER 1
293 
294 #elif (defined(_WIN32) || defined(WIN32))
295 
296 /* Saved resource information for the beginning of an operation */
297 static HANDLE hProcess;
298 static FILETIME ftKernelBegin;
299 static FILETIME ftUserBegin;
300 static sqlite3_int64 ftWallBegin;
301 typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME,
302                                     LPFILETIME, LPFILETIME);
303 static GETPROCTIMES getProcessTimesAddr = NULL;
304 
305 /*
306 ** Check to see if we have timer support.  Return 1 if necessary
307 ** support found (or found previously).
308 */
309 static int hasTimer(void){
310   if( getProcessTimesAddr ){
311     return 1;
312   } else {
313     /* GetProcessTimes() isn't supported in WIN95 and some other Windows
314     ** versions. See if the version we are running on has it, and if it
315     ** does, save off a pointer to it and the current process handle.
316     */
317     hProcess = GetCurrentProcess();
318     if( hProcess ){
319       HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll"));
320       if( NULL != hinstLib ){
321         getProcessTimesAddr =
322             (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes");
323         if( NULL != getProcessTimesAddr ){
324           return 1;
325         }
326         FreeLibrary(hinstLib);
327       }
328     }
329   }
330   return 0;
331 }
332 
333 /*
334 ** Begin timing an operation
335 */
336 static void beginTimer(void){
337   if( enableTimer && getProcessTimesAddr ){
338     FILETIME ftCreation, ftExit;
339     getProcessTimesAddr(hProcess,&ftCreation,&ftExit,
340                         &ftKernelBegin,&ftUserBegin);
341     ftWallBegin = timeOfDay();
342   }
343 }
344 
345 /* Return the difference of two FILETIME structs in seconds */
346 static double timeDiff(FILETIME *pStart, FILETIME *pEnd){
347   sqlite_int64 i64Start = *((sqlite_int64 *) pStart);
348   sqlite_int64 i64End = *((sqlite_int64 *) pEnd);
349   return (double) ((i64End - i64Start) / 10000000.0);
350 }
351 
352 /*
353 ** Print the timing results.
354 */
355 static void endTimer(void){
356   if( enableTimer && getProcessTimesAddr){
357     FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
358     sqlite3_int64 ftWallEnd = timeOfDay();
359     getProcessTimesAddr(hProcess,&ftCreation,&ftExit,&ftKernelEnd,&ftUserEnd);
360     printf("Run Time: real %.3f user %f sys %f\n",
361        (ftWallEnd - ftWallBegin)*0.001,
362        timeDiff(&ftUserBegin, &ftUserEnd),
363        timeDiff(&ftKernelBegin, &ftKernelEnd));
364   }
365 }
366 
367 #define BEGIN_TIMER beginTimer()
368 #define END_TIMER endTimer()
369 #define HAS_TIMER hasTimer()
370 
371 #else
372 #define BEGIN_TIMER
373 #define END_TIMER
374 #define HAS_TIMER 0
375 #endif
376 
377 /*
378 ** Used to prevent warnings about unused parameters
379 */
380 #define UNUSED_PARAMETER(x) (void)(x)
381 
382 /*
383 ** Number of elements in an array
384 */
385 #define ArraySize(X)  (int)(sizeof(X)/sizeof(X[0]))
386 
387 /*
388 ** If the following flag is set, then command execution stops
389 ** at an error if we are not interactive.
390 */
391 static int bail_on_error = 0;
392 
393 /*
394 ** Threat stdin as an interactive input if the following variable
395 ** is true.  Otherwise, assume stdin is connected to a file or pipe.
396 */
397 static int stdin_is_interactive = 1;
398 
399 /*
400 ** On Windows systems we have to know if standard output is a console
401 ** in order to translate UTF-8 into MBCS.  The following variable is
402 ** true if translation is required.
403 */
404 static int stdout_is_console = 1;
405 
406 /*
407 ** The following is the open SQLite database.  We make a pointer
408 ** to this database a static variable so that it can be accessed
409 ** by the SIGINT handler to interrupt database processing.
410 */
411 static sqlite3 *globalDb = 0;
412 
413 /*
414 ** True if an interrupt (Control-C) has been received.
415 */
416 static volatile int seenInterrupt = 0;
417 
418 /*
419 ** This is the name of our program. It is set in main(), used
420 ** in a number of other places, mostly for error messages.
421 */
422 static char *Argv0;
423 
424 /*
425 ** Prompt strings. Initialized in main. Settable with
426 **   .prompt main continue
427 */
428 static char mainPrompt[20];     /* First line prompt. default: "sqlite> "*/
429 static char continuePrompt[20]; /* Continuation prompt. default: "   ...> " */
430 
431 /*
432 ** Render output like fprintf().  Except, if the output is going to the
433 ** console and if this is running on a Windows machine, translate the
434 ** output from UTF-8 into MBCS.
435 */
436 #if defined(_WIN32) || defined(WIN32)
437 void utf8_printf(FILE *out, const char *zFormat, ...){
438   va_list ap;
439   va_start(ap, zFormat);
440   if( stdout_is_console && (out==stdout || out==stderr) ){
441     char *z1 = sqlite3_vmprintf(zFormat, ap);
442     char *z2 = sqlite3_win32_utf8_to_mbcs_v2(z1, 0);
443     sqlite3_free(z1);
444     fputs(z2, out);
445     sqlite3_free(z2);
446   }else{
447     vfprintf(out, zFormat, ap);
448   }
449   va_end(ap);
450 }
451 #elif !defined(utf8_printf)
452 # define utf8_printf fprintf
453 #endif
454 
455 /*
456 ** Render output like fprintf().  This should not be used on anything that
457 ** includes string formatting (e.g. "%s").
458 */
459 #if !defined(raw_printf)
460 # define raw_printf fprintf
461 #endif
462 
463 /* Indicate out-of-memory and exit. */
464 static void shell_out_of_memory(void){
465   raw_printf(stderr,"Error: out of memory\n");
466   exit(1);
467 }
468 
469 /*
470 ** Write I/O traces to the following stream.
471 */
472 #ifdef SQLITE_ENABLE_IOTRACE
473 static FILE *iotrace = 0;
474 #endif
475 
476 /*
477 ** This routine works like printf in that its first argument is a
478 ** format string and subsequent arguments are values to be substituted
479 ** in place of % fields.  The result of formatting this string
480 ** is written to iotrace.
481 */
482 #ifdef SQLITE_ENABLE_IOTRACE
483 static void SQLITE_CDECL iotracePrintf(const char *zFormat, ...){
484   va_list ap;
485   char *z;
486   if( iotrace==0 ) return;
487   va_start(ap, zFormat);
488   z = sqlite3_vmprintf(zFormat, ap);
489   va_end(ap);
490   utf8_printf(iotrace, "%s", z);
491   sqlite3_free(z);
492 }
493 #endif
494 
495 /*
496 ** Output string zUtf to stream pOut as w characters.  If w is negative,
497 ** then right-justify the text.  W is the width in UTF-8 characters, not
498 ** in bytes.  This is different from the %*.*s specification in printf
499 ** since with %*.*s the width is measured in bytes, not characters.
500 */
501 static void utf8_width_print(FILE *pOut, int w, const char *zUtf){
502   int i;
503   int n;
504   int aw = w<0 ? -w : w;
505   char zBuf[1000];
506   if( aw>(int)sizeof(zBuf)/3 ) aw = (int)sizeof(zBuf)/3;
507   for(i=n=0; zUtf[i]; i++){
508     if( (zUtf[i]&0xc0)!=0x80 ){
509       n++;
510       if( n==aw ){
511         do{ i++; }while( (zUtf[i]&0xc0)==0x80 );
512         break;
513       }
514     }
515   }
516   if( n>=aw ){
517     utf8_printf(pOut, "%.*s", i, zUtf);
518   }else if( w<0 ){
519     utf8_printf(pOut, "%*s%s", aw-n, "", zUtf);
520   }else{
521     utf8_printf(pOut, "%s%*s", zUtf, aw-n, "");
522   }
523 }
524 
525 
526 /*
527 ** Determines if a string is a number of not.
528 */
529 static int isNumber(const char *z, int *realnum){
530   if( *z=='-' || *z=='+' ) z++;
531   if( !IsDigit(*z) ){
532     return 0;
533   }
534   z++;
535   if( realnum ) *realnum = 0;
536   while( IsDigit(*z) ){ z++; }
537   if( *z=='.' ){
538     z++;
539     if( !IsDigit(*z) ) return 0;
540     while( IsDigit(*z) ){ z++; }
541     if( realnum ) *realnum = 1;
542   }
543   if( *z=='e' || *z=='E' ){
544     z++;
545     if( *z=='+' || *z=='-' ) z++;
546     if( !IsDigit(*z) ) return 0;
547     while( IsDigit(*z) ){ z++; }
548     if( realnum ) *realnum = 1;
549   }
550   return *z==0;
551 }
552 
553 /*
554 ** Compute a string length that is limited to what can be stored in
555 ** lower 30 bits of a 32-bit signed integer.
556 */
557 static int strlen30(const char *z){
558   const char *z2 = z;
559   while( *z2 ){ z2++; }
560   return 0x3fffffff & (int)(z2 - z);
561 }
562 
563 /*
564 ** Return the length of a string in characters.  Multibyte UTF8 characters
565 ** count as a single character.
566 */
567 static int strlenChar(const char *z){
568   int n = 0;
569   while( *z ){
570     if( (0xc0&*(z++))!=0x80 ) n++;
571   }
572   return n;
573 }
574 
575 /*
576 ** This routine reads a line of text from FILE in, stores
577 ** the text in memory obtained from malloc() and returns a pointer
578 ** to the text.  NULL is returned at end of file, or if malloc()
579 ** fails.
580 **
581 ** If zLine is not NULL then it is a malloced buffer returned from
582 ** a previous call to this routine that may be reused.
583 */
584 static char *local_getline(char *zLine, FILE *in){
585   int nLine = zLine==0 ? 0 : 100;
586   int n = 0;
587 
588   while( 1 ){
589     if( n+100>nLine ){
590       nLine = nLine*2 + 100;
591       zLine = realloc(zLine, nLine);
592       if( zLine==0 ) shell_out_of_memory();
593     }
594     if( fgets(&zLine[n], nLine - n, in)==0 ){
595       if( n==0 ){
596         free(zLine);
597         return 0;
598       }
599       zLine[n] = 0;
600       break;
601     }
602     while( zLine[n] ) n++;
603     if( n>0 && zLine[n-1]=='\n' ){
604       n--;
605       if( n>0 && zLine[n-1]=='\r' ) n--;
606       zLine[n] = 0;
607       break;
608     }
609   }
610 #if defined(_WIN32) || defined(WIN32)
611   /* For interactive input on Windows systems, translate the
612   ** multi-byte characterset characters into UTF-8. */
613   if( stdin_is_interactive && in==stdin ){
614     char *zTrans = sqlite3_win32_mbcs_to_utf8_v2(zLine, 0);
615     if( zTrans ){
616       int nTrans = strlen30(zTrans)+1;
617       if( nTrans>nLine ){
618         zLine = realloc(zLine, nTrans);
619         if( zLine==0 ) shell_out_of_memory();
620       }
621       memcpy(zLine, zTrans, nTrans);
622       sqlite3_free(zTrans);
623     }
624   }
625 #endif /* defined(_WIN32) || defined(WIN32) */
626   return zLine;
627 }
628 
629 /*
630 ** Retrieve a single line of input text.
631 **
632 ** If in==0 then read from standard input and prompt before each line.
633 ** If isContinuation is true, then a continuation prompt is appropriate.
634 ** If isContinuation is zero, then the main prompt should be used.
635 **
636 ** If zPrior is not NULL then it is a buffer from a prior call to this
637 ** routine that can be reused.
638 **
639 ** The result is stored in space obtained from malloc() and must either
640 ** be freed by the caller or else passed back into this routine via the
641 ** zPrior argument for reuse.
642 */
643 static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
644   char *zPrompt;
645   char *zResult;
646   if( in!=0 ){
647     zResult = local_getline(zPrior, in);
648   }else{
649     zPrompt = isContinuation ? continuePrompt : mainPrompt;
650 #if SHELL_USE_LOCAL_GETLINE
651     printf("%s", zPrompt);
652     fflush(stdout);
653     zResult = local_getline(zPrior, stdin);
654 #else
655     free(zPrior);
656     zResult = shell_readline(zPrompt);
657     if( zResult && *zResult ) shell_add_history(zResult);
658 #endif
659   }
660   return zResult;
661 }
662 
663 
664 /*
665 ** Return the value of a hexadecimal digit.  Return -1 if the input
666 ** is not a hex digit.
667 */
668 static int hexDigitValue(char c){
669   if( c>='0' && c<='9' ) return c - '0';
670   if( c>='a' && c<='f' ) return c - 'a' + 10;
671   if( c>='A' && c<='F' ) return c - 'A' + 10;
672   return -1;
673 }
674 
675 /*
676 ** Interpret zArg as an integer value, possibly with suffixes.
677 */
678 static sqlite3_int64 integerValue(const char *zArg){
679   sqlite3_int64 v = 0;
680   static const struct { char *zSuffix; int iMult; } aMult[] = {
681     { "KiB", 1024 },
682     { "MiB", 1024*1024 },
683     { "GiB", 1024*1024*1024 },
684     { "KB",  1000 },
685     { "MB",  1000000 },
686     { "GB",  1000000000 },
687     { "K",   1000 },
688     { "M",   1000000 },
689     { "G",   1000000000 },
690   };
691   int i;
692   int isNeg = 0;
693   if( zArg[0]=='-' ){
694     isNeg = 1;
695     zArg++;
696   }else if( zArg[0]=='+' ){
697     zArg++;
698   }
699   if( zArg[0]=='0' && zArg[1]=='x' ){
700     int x;
701     zArg += 2;
702     while( (x = hexDigitValue(zArg[0]))>=0 ){
703       v = (v<<4) + x;
704       zArg++;
705     }
706   }else{
707     while( IsDigit(zArg[0]) ){
708       v = v*10 + zArg[0] - '0';
709       zArg++;
710     }
711   }
712   for(i=0; i<ArraySize(aMult); i++){
713     if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
714       v *= aMult[i].iMult;
715       break;
716     }
717   }
718   return isNeg? -v : v;
719 }
720 
721 /*
722 ** A variable length string to which one can append text.
723 */
724 typedef struct ShellText ShellText;
725 struct ShellText {
726   char *z;
727   int n;
728   int nAlloc;
729 };
730 
731 /*
732 ** Initialize and destroy a ShellText object
733 */
734 static void initText(ShellText *p){
735   memset(p, 0, sizeof(*p));
736 }
737 static void freeText(ShellText *p){
738   free(p->z);
739   initText(p);
740 }
741 
742 /* zIn is either a pointer to a NULL-terminated string in memory obtained
743 ** from malloc(), or a NULL pointer. The string pointed to by zAppend is
744 ** added to zIn, and the result returned in memory obtained from malloc().
745 ** zIn, if it was not NULL, is freed.
746 **
747 ** If the third argument, quote, is not '\0', then it is used as a
748 ** quote character for zAppend.
749 */
750 static void appendText(ShellText *p, char const *zAppend, char quote){
751   int len;
752   int i;
753   int nAppend = strlen30(zAppend);
754 
755   len = nAppend+p->n+1;
756   if( quote ){
757     len += 2;
758     for(i=0; i<nAppend; i++){
759       if( zAppend[i]==quote ) len++;
760     }
761   }
762 
763   if( p->n+len>=p->nAlloc ){
764     p->nAlloc = p->nAlloc*2 + len + 20;
765     p->z = realloc(p->z, p->nAlloc);
766     if( p->z==0 ) shell_out_of_memory();
767   }
768 
769   if( quote ){
770     char *zCsr = p->z+p->n;
771     *zCsr++ = quote;
772     for(i=0; i<nAppend; i++){
773       *zCsr++ = zAppend[i];
774       if( zAppend[i]==quote ) *zCsr++ = quote;
775     }
776     *zCsr++ = quote;
777     p->n = (int)(zCsr - p->z);
778     *zCsr = '\0';
779   }else{
780     memcpy(p->z+p->n, zAppend, nAppend);
781     p->n += nAppend;
782     p->z[p->n] = '\0';
783   }
784 }
785 
786 /*
787 ** Attempt to determine if identifier zName needs to be quoted, either
788 ** because it contains non-alphanumeric characters, or because it is an
789 ** SQLite keyword.  Be conservative in this estimate:  When in doubt assume
790 ** that quoting is required.
791 **
792 ** Return '"' if quoting is required.  Return 0 if no quoting is required.
793 */
794 static char quoteChar(const char *zName){
795   int i;
796   if( !isalpha((unsigned char)zName[0]) && zName[0]!='_' ) return '"';
797   for(i=0; zName[i]; i++){
798     if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ) return '"';
799   }
800   return sqlite3_keyword_check(zName, i) ? '"' : 0;
801 }
802 
803 /*
804 ** Construct a fake object name and column list to describe the structure
805 ** of the view, virtual table, or table valued function zSchema.zName.
806 */
807 static char *shellFakeSchema(
808   sqlite3 *db,            /* The database connection containing the vtab */
809   const char *zSchema,    /* Schema of the database holding the vtab */
810   const char *zName       /* The name of the virtual table */
811 ){
812   sqlite3_stmt *pStmt = 0;
813   char *zSql;
814   ShellText s;
815   char cQuote;
816   char *zDiv = "(";
817   int nRow = 0;
818 
819   zSql = sqlite3_mprintf("PRAGMA \"%w\".table_info=%Q;",
820                          zSchema ? zSchema : "main", zName);
821   sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
822   sqlite3_free(zSql);
823   initText(&s);
824   if( zSchema ){
825     cQuote = quoteChar(zSchema);
826     if( cQuote && sqlite3_stricmp(zSchema,"temp")==0 ) cQuote = 0;
827     appendText(&s, zSchema, cQuote);
828     appendText(&s, ".", 0);
829   }
830   cQuote = quoteChar(zName);
831   appendText(&s, zName, cQuote);
832   while( sqlite3_step(pStmt)==SQLITE_ROW ){
833     const char *zCol = (const char*)sqlite3_column_text(pStmt, 1);
834     nRow++;
835     appendText(&s, zDiv, 0);
836     zDiv = ",";
837     cQuote = quoteChar(zCol);
838     appendText(&s, zCol, cQuote);
839   }
840   appendText(&s, ")", 0);
841   sqlite3_finalize(pStmt);
842   if( nRow==0 ){
843     freeText(&s);
844     s.z = 0;
845   }
846   return s.z;
847 }
848 
849 /*
850 ** SQL function:  shell_module_schema(X)
851 **
852 ** Return a fake schema for the table-valued function or eponymous virtual
853 ** table X.
854 */
855 static void shellModuleSchema(
856   sqlite3_context *pCtx,
857   int nVal,
858   sqlite3_value **apVal
859 ){
860   const char *zName = (const char*)sqlite3_value_text(apVal[0]);
861   char *zFake = shellFakeSchema(sqlite3_context_db_handle(pCtx), 0, zName);
862   UNUSED_PARAMETER(nVal);
863   if( zFake ){
864     sqlite3_result_text(pCtx, sqlite3_mprintf("/* %s */", zFake),
865                         -1, sqlite3_free);
866     free(zFake);
867   }
868 }
869 
870 /*
871 ** SQL function:  shell_add_schema(S,X)
872 **
873 ** Add the schema name X to the CREATE statement in S and return the result.
874 ** Examples:
875 **
876 **    CREATE TABLE t1(x)   ->   CREATE TABLE xyz.t1(x);
877 **
878 ** Also works on
879 **
880 **    CREATE INDEX
881 **    CREATE UNIQUE INDEX
882 **    CREATE VIEW
883 **    CREATE TRIGGER
884 **    CREATE VIRTUAL TABLE
885 **
886 ** This UDF is used by the .schema command to insert the schema name of
887 ** attached databases into the middle of the sqlite_master.sql field.
888 */
889 static void shellAddSchemaName(
890   sqlite3_context *pCtx,
891   int nVal,
892   sqlite3_value **apVal
893 ){
894   static const char *aPrefix[] = {
895      "TABLE",
896      "INDEX",
897      "UNIQUE INDEX",
898      "VIEW",
899      "TRIGGER",
900      "VIRTUAL TABLE"
901   };
902   int i = 0;
903   const char *zIn = (const char*)sqlite3_value_text(apVal[0]);
904   const char *zSchema = (const char*)sqlite3_value_text(apVal[1]);
905   const char *zName = (const char*)sqlite3_value_text(apVal[2]);
906   sqlite3 *db = sqlite3_context_db_handle(pCtx);
907   UNUSED_PARAMETER(nVal);
908   if( zIn!=0 && strncmp(zIn, "CREATE ", 7)==0 ){
909     for(i=0; i<(int)(sizeof(aPrefix)/sizeof(aPrefix[0])); i++){
910       int n = strlen30(aPrefix[i]);
911       if( strncmp(zIn+7, aPrefix[i], n)==0 && zIn[n+7]==' ' ){
912         char *z = 0;
913         char *zFake = 0;
914         if( zSchema ){
915           char cQuote = quoteChar(zSchema);
916           if( cQuote && sqlite3_stricmp(zSchema,"temp")!=0 ){
917             z = sqlite3_mprintf("%.*s \"%w\".%s", n+7, zIn, zSchema, zIn+n+8);
918           }else{
919             z = sqlite3_mprintf("%.*s %s.%s", n+7, zIn, zSchema, zIn+n+8);
920           }
921         }
922         if( zName
923          && aPrefix[i][0]=='V'
924          && (zFake = shellFakeSchema(db, zSchema, zName))!=0
925         ){
926           if( z==0 ){
927             z = sqlite3_mprintf("%s\n/* %s */", zIn, zFake);
928           }else{
929             z = sqlite3_mprintf("%z\n/* %s */", z, zFake);
930           }
931           free(zFake);
932         }
933         if( z ){
934           sqlite3_result_text(pCtx, z, -1, sqlite3_free);
935           return;
936         }
937       }
938     }
939   }
940   sqlite3_result_value(pCtx, apVal[0]);
941 }
942 
943 /*
944 ** The source code for several run-time loadable extensions is inserted
945 ** below by the ../tool/mkshellc.tcl script.  Before processing that included
946 ** code, we need to override some macros to make the included program code
947 ** work here in the middle of this regular program.
948 */
949 #define SQLITE_EXTENSION_INIT1
950 #define SQLITE_EXTENSION_INIT2(X) (void)(X)
951 
952 #if defined(_WIN32) && defined(_MSC_VER)
953 /************************* Begin test_windirent.h ******************/
954 /*
955 ** 2015 November 30
956 **
957 ** The author disclaims copyright to this source code.  In place of
958 ** a legal notice, here is a blessing:
959 **
960 **    May you do good and not evil.
961 **    May you find forgiveness for yourself and forgive others.
962 **    May you share freely, never taking more than you give.
963 **
964 *************************************************************************
965 ** This file contains declarations for most of the opendir() family of
966 ** POSIX functions on Win32 using the MSVCRT.
967 */
968 
969 #if defined(_WIN32) && defined(_MSC_VER) && !defined(SQLITE_WINDIRENT_H)
970 #define SQLITE_WINDIRENT_H
971 
972 /*
973 ** We need several data types from the Windows SDK header.
974 */
975 
976 #ifndef WIN32_LEAN_AND_MEAN
977 #define WIN32_LEAN_AND_MEAN
978 #endif
979 
980 #include "windows.h"
981 
982 /*
983 ** We need several support functions from the SQLite core.
984 */
985 
986 /* #include "sqlite3.h" */
987 
988 /*
989 ** We need several things from the ANSI and MSVCRT headers.
990 */
991 
992 #include <stdio.h>
993 #include <stdlib.h>
994 #include <errno.h>
995 #include <io.h>
996 #include <limits.h>
997 #include <sys/types.h>
998 #include <sys/stat.h>
999 
1000 /*
1001 ** We may need several defines that should have been in "sys/stat.h".
1002 */
1003 
1004 #ifndef S_ISREG
1005 #define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG)
1006 #endif
1007 
1008 #ifndef S_ISDIR
1009 #define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
1010 #endif
1011 
1012 #ifndef S_ISLNK
1013 #define S_ISLNK(mode) (0)
1014 #endif
1015 
1016 /*
1017 ** We may need to provide the "mode_t" type.
1018 */
1019 
1020 #ifndef MODE_T_DEFINED
1021   #define MODE_T_DEFINED
1022   typedef unsigned short mode_t;
1023 #endif
1024 
1025 /*
1026 ** We may need to provide the "ino_t" type.
1027 */
1028 
1029 #ifndef INO_T_DEFINED
1030   #define INO_T_DEFINED
1031   typedef unsigned short ino_t;
1032 #endif
1033 
1034 /*
1035 ** We need to define "NAME_MAX" if it was not present in "limits.h".
1036 */
1037 
1038 #ifndef NAME_MAX
1039 #  ifdef FILENAME_MAX
1040 #    define NAME_MAX (FILENAME_MAX)
1041 #  else
1042 #    define NAME_MAX (260)
1043 #  endif
1044 #endif
1045 
1046 /*
1047 ** We need to define "NULL_INTPTR_T" and "BAD_INTPTR_T".
1048 */
1049 
1050 #ifndef NULL_INTPTR_T
1051 #  define NULL_INTPTR_T ((intptr_t)(0))
1052 #endif
1053 
1054 #ifndef BAD_INTPTR_T
1055 #  define BAD_INTPTR_T ((intptr_t)(-1))
1056 #endif
1057 
1058 /*
1059 ** We need to provide the necessary structures and related types.
1060 */
1061 
1062 #ifndef DIRENT_DEFINED
1063 #define DIRENT_DEFINED
1064 typedef struct DIRENT DIRENT;
1065 typedef DIRENT *LPDIRENT;
1066 struct DIRENT {
1067   ino_t d_ino;               /* Sequence number, do not use. */
1068   unsigned d_attributes;     /* Win32 file attributes. */
1069   char d_name[NAME_MAX + 1]; /* Name within the directory. */
1070 };
1071 #endif
1072 
1073 #ifndef DIR_DEFINED
1074 #define DIR_DEFINED
1075 typedef struct DIR DIR;
1076 typedef DIR *LPDIR;
1077 struct DIR {
1078   intptr_t d_handle; /* Value returned by "_findfirst". */
1079   DIRENT d_first;    /* DIRENT constructed based on "_findfirst". */
1080   DIRENT d_next;     /* DIRENT constructed based on "_findnext". */
1081 };
1082 #endif
1083 
1084 /*
1085 ** Provide a macro, for use by the implementation, to determine if a
1086 ** particular directory entry should be skipped over when searching for
1087 ** the next directory entry that should be returned by the readdir() or
1088 ** readdir_r() functions.
1089 */
1090 
1091 #ifndef is_filtered
1092 #  define is_filtered(a) ((((a).attrib)&_A_HIDDEN) || (((a).attrib)&_A_SYSTEM))
1093 #endif
1094 
1095 /*
1096 ** Provide the function prototype for the POSIX compatiable getenv()
1097 ** function.  This function is not thread-safe.
1098 */
1099 
1100 extern const char *windirent_getenv(const char *name);
1101 
1102 /*
1103 ** Finally, we can provide the function prototypes for the opendir(),
1104 ** readdir(), readdir_r(), and closedir() POSIX functions.
1105 */
1106 
1107 extern LPDIR opendir(const char *dirname);
1108 extern LPDIRENT readdir(LPDIR dirp);
1109 extern INT readdir_r(LPDIR dirp, LPDIRENT entry, LPDIRENT *result);
1110 extern INT closedir(LPDIR dirp);
1111 
1112 #endif /* defined(WIN32) && defined(_MSC_VER) */
1113 
1114 /************************* End test_windirent.h ********************/
1115 /************************* Begin test_windirent.c ******************/
1116 /*
1117 ** 2015 November 30
1118 **
1119 ** The author disclaims copyright to this source code.  In place of
1120 ** a legal notice, here is a blessing:
1121 **
1122 **    May you do good and not evil.
1123 **    May you find forgiveness for yourself and forgive others.
1124 **    May you share freely, never taking more than you give.
1125 **
1126 *************************************************************************
1127 ** This file contains code to implement most of the opendir() family of
1128 ** POSIX functions on Win32 using the MSVCRT.
1129 */
1130 
1131 #if defined(_WIN32) && defined(_MSC_VER)
1132 /* #include "test_windirent.h" */
1133 
1134 /*
1135 ** Implementation of the POSIX getenv() function using the Win32 API.
1136 ** This function is not thread-safe.
1137 */
1138 const char *windirent_getenv(
1139   const char *name
1140 ){
1141   static char value[32768]; /* Maximum length, per MSDN */
1142   DWORD dwSize = sizeof(value) / sizeof(char); /* Size in chars */
1143   DWORD dwRet; /* Value returned by GetEnvironmentVariableA() */
1144 
1145   memset(value, 0, sizeof(value));
1146   dwRet = GetEnvironmentVariableA(name, value, dwSize);
1147   if( dwRet==0 || dwRet>dwSize ){
1148     /*
1149     ** The function call to GetEnvironmentVariableA() failed -OR-
1150     ** the buffer is not large enough.  Either way, return NULL.
1151     */
1152     return 0;
1153   }else{
1154     /*
1155     ** The function call to GetEnvironmentVariableA() succeeded
1156     ** -AND- the buffer contains the entire value.
1157     */
1158     return value;
1159   }
1160 }
1161 
1162 /*
1163 ** Implementation of the POSIX opendir() function using the MSVCRT.
1164 */
1165 LPDIR opendir(
1166   const char *dirname
1167 ){
1168   struct _finddata_t data;
1169   LPDIR dirp = (LPDIR)sqlite3_malloc(sizeof(DIR));
1170   SIZE_T namesize = sizeof(data.name) / sizeof(data.name[0]);
1171 
1172   if( dirp==NULL ) return NULL;
1173   memset(dirp, 0, sizeof(DIR));
1174 
1175   /* TODO: Remove this if Unix-style root paths are not used. */
1176   if( sqlite3_stricmp(dirname, "/")==0 ){
1177     dirname = windirent_getenv("SystemDrive");
1178   }
1179 
1180   memset(&data, 0, sizeof(struct _finddata_t));
1181   _snprintf(data.name, namesize, "%s\\*", dirname);
1182   dirp->d_handle = _findfirst(data.name, &data);
1183 
1184   if( dirp->d_handle==BAD_INTPTR_T ){
1185     closedir(dirp);
1186     return NULL;
1187   }
1188 
1189   /* TODO: Remove this block to allow hidden and/or system files. */
1190   if( is_filtered(data) ){
1191 next:
1192 
1193     memset(&data, 0, sizeof(struct _finddata_t));
1194     if( _findnext(dirp->d_handle, &data)==-1 ){
1195       closedir(dirp);
1196       return NULL;
1197     }
1198 
1199     /* TODO: Remove this block to allow hidden and/or system files. */
1200     if( is_filtered(data) ) goto next;
1201   }
1202 
1203   dirp->d_first.d_attributes = data.attrib;
1204   strncpy(dirp->d_first.d_name, data.name, NAME_MAX);
1205   dirp->d_first.d_name[NAME_MAX] = '\0';
1206 
1207   return dirp;
1208 }
1209 
1210 /*
1211 ** Implementation of the POSIX readdir() function using the MSVCRT.
1212 */
1213 LPDIRENT readdir(
1214   LPDIR dirp
1215 ){
1216   struct _finddata_t data;
1217 
1218   if( dirp==NULL ) return NULL;
1219 
1220   if( dirp->d_first.d_ino==0 ){
1221     dirp->d_first.d_ino++;
1222     dirp->d_next.d_ino++;
1223 
1224     return &dirp->d_first;
1225   }
1226 
1227 next:
1228 
1229   memset(&data, 0, sizeof(struct _finddata_t));
1230   if( _findnext(dirp->d_handle, &data)==-1 ) return NULL;
1231 
1232   /* TODO: Remove this block to allow hidden and/or system files. */
1233   if( is_filtered(data) ) goto next;
1234 
1235   dirp->d_next.d_ino++;
1236   dirp->d_next.d_attributes = data.attrib;
1237   strncpy(dirp->d_next.d_name, data.name, NAME_MAX);
1238   dirp->d_next.d_name[NAME_MAX] = '\0';
1239 
1240   return &dirp->d_next;
1241 }
1242 
1243 /*
1244 ** Implementation of the POSIX readdir_r() function using the MSVCRT.
1245 */
1246 INT readdir_r(
1247   LPDIR dirp,
1248   LPDIRENT entry,
1249   LPDIRENT *result
1250 ){
1251   struct _finddata_t data;
1252 
1253   if( dirp==NULL ) return EBADF;
1254 
1255   if( dirp->d_first.d_ino==0 ){
1256     dirp->d_first.d_ino++;
1257     dirp->d_next.d_ino++;
1258 
1259     entry->d_ino = dirp->d_first.d_ino;
1260     entry->d_attributes = dirp->d_first.d_attributes;
1261     strncpy(entry->d_name, dirp->d_first.d_name, NAME_MAX);
1262     entry->d_name[NAME_MAX] = '\0';
1263 
1264     *result = entry;
1265     return 0;
1266   }
1267 
1268 next:
1269 
1270   memset(&data, 0, sizeof(struct _finddata_t));
1271   if( _findnext(dirp->d_handle, &data)==-1 ){
1272     *result = NULL;
1273     return ENOENT;
1274   }
1275 
1276   /* TODO: Remove this block to allow hidden and/or system files. */
1277   if( is_filtered(data) ) goto next;
1278 
1279   entry->d_ino = (ino_t)-1; /* not available */
1280   entry->d_attributes = data.attrib;
1281   strncpy(entry->d_name, data.name, NAME_MAX);
1282   entry->d_name[NAME_MAX] = '\0';
1283 
1284   *result = entry;
1285   return 0;
1286 }
1287 
1288 /*
1289 ** Implementation of the POSIX closedir() function using the MSVCRT.
1290 */
1291 INT closedir(
1292   LPDIR dirp
1293 ){
1294   INT result = 0;
1295 
1296   if( dirp==NULL ) return EINVAL;
1297 
1298   if( dirp->d_handle!=NULL_INTPTR_T && dirp->d_handle!=BAD_INTPTR_T ){
1299     result = _findclose(dirp->d_handle);
1300   }
1301 
1302   sqlite3_free(dirp);
1303   return result;
1304 }
1305 
1306 #endif /* defined(WIN32) && defined(_MSC_VER) */
1307 
1308 /************************* End test_windirent.c ********************/
1309 #define dirent DIRENT
1310 #endif
1311 /************************* Begin ../ext/misc/shathree.c ******************/
1312 /*
1313 ** 2017-03-08
1314 **
1315 ** The author disclaims copyright to this source code.  In place of
1316 ** a legal notice, here is a blessing:
1317 **
1318 **    May you do good and not evil.
1319 **    May you find forgiveness for yourself and forgive others.
1320 **    May you share freely, never taking more than you give.
1321 **
1322 ******************************************************************************
1323 **
1324 ** This SQLite extension implements functions that compute SHA3 hashes.
1325 ** Two SQL functions are implemented:
1326 **
1327 **     sha3(X,SIZE)
1328 **     sha3_query(Y,SIZE)
1329 **
1330 ** The sha3(X) function computes the SHA3 hash of the input X, or NULL if
1331 ** X is NULL.
1332 **
1333 ** The sha3_query(Y) function evalutes all queries in the SQL statements of Y
1334 ** and returns a hash of their results.
1335 **
1336 ** The SIZE argument is optional.  If omitted, the SHA3-256 hash algorithm
1337 ** is used.  If SIZE is included it must be one of the integers 224, 256,
1338 ** 384, or 512, to determine SHA3 hash variant that is computed.
1339 */
1340 /* #include "sqlite3ext.h" */
1341 SQLITE_EXTENSION_INIT1
1342 #include <assert.h>
1343 #include <string.h>
1344 #include <stdarg.h>
1345 /* typedef sqlite3_uint64 u64; */
1346 
1347 /******************************************************************************
1348 ** The Hash Engine
1349 */
1350 /*
1351 ** Macros to determine whether the machine is big or little endian,
1352 ** and whether or not that determination is run-time or compile-time.
1353 **
1354 ** For best performance, an attempt is made to guess at the byte-order
1355 ** using C-preprocessor macros.  If that is unsuccessful, or if
1356 ** -DSHA3_BYTEORDER=0 is set, then byte-order is determined
1357 ** at run-time.
1358 */
1359 #ifndef SHA3_BYTEORDER
1360 # if defined(i386)     || defined(__i386__)   || defined(_M_IX86) ||    \
1361      defined(__x86_64) || defined(__x86_64__) || defined(_M_X64)  ||    \
1362      defined(_M_AMD64) || defined(_M_ARM)     || defined(__x86)   ||    \
1363      defined(__arm__)
1364 #   define SHA3_BYTEORDER    1234
1365 # elif defined(sparc)    || defined(__ppc__)
1366 #   define SHA3_BYTEORDER    4321
1367 # else
1368 #   define SHA3_BYTEORDER 0
1369 # endif
1370 #endif
1371 
1372 
1373 /*
1374 ** State structure for a SHA3 hash in progress
1375 */
1376 typedef struct SHA3Context SHA3Context;
1377 struct SHA3Context {
1378   union {
1379     u64 s[25];                /* Keccak state. 5x5 lines of 64 bits each */
1380     unsigned char x[1600];    /* ... or 1600 bytes */
1381   } u;
1382   unsigned nRate;        /* Bytes of input accepted per Keccak iteration */
1383   unsigned nLoaded;      /* Input bytes loaded into u.x[] so far this cycle */
1384   unsigned ixMask;       /* Insert next input into u.x[nLoaded^ixMask]. */
1385 };
1386 
1387 /*
1388 ** A single step of the Keccak mixing function for a 1600-bit state
1389 */
1390 static void KeccakF1600Step(SHA3Context *p){
1391   int i;
1392   u64 b0, b1, b2, b3, b4;
1393   u64 c0, c1, c2, c3, c4;
1394   u64 d0, d1, d2, d3, d4;
1395   static const u64 RC[] = {
1396     0x0000000000000001ULL,  0x0000000000008082ULL,
1397     0x800000000000808aULL,  0x8000000080008000ULL,
1398     0x000000000000808bULL,  0x0000000080000001ULL,
1399     0x8000000080008081ULL,  0x8000000000008009ULL,
1400     0x000000000000008aULL,  0x0000000000000088ULL,
1401     0x0000000080008009ULL,  0x000000008000000aULL,
1402     0x000000008000808bULL,  0x800000000000008bULL,
1403     0x8000000000008089ULL,  0x8000000000008003ULL,
1404     0x8000000000008002ULL,  0x8000000000000080ULL,
1405     0x000000000000800aULL,  0x800000008000000aULL,
1406     0x8000000080008081ULL,  0x8000000000008080ULL,
1407     0x0000000080000001ULL,  0x8000000080008008ULL
1408   };
1409 # define a00 (p->u.s[0])
1410 # define a01 (p->u.s[1])
1411 # define a02 (p->u.s[2])
1412 # define a03 (p->u.s[3])
1413 # define a04 (p->u.s[4])
1414 # define a10 (p->u.s[5])
1415 # define a11 (p->u.s[6])
1416 # define a12 (p->u.s[7])
1417 # define a13 (p->u.s[8])
1418 # define a14 (p->u.s[9])
1419 # define a20 (p->u.s[10])
1420 # define a21 (p->u.s[11])
1421 # define a22 (p->u.s[12])
1422 # define a23 (p->u.s[13])
1423 # define a24 (p->u.s[14])
1424 # define a30 (p->u.s[15])
1425 # define a31 (p->u.s[16])
1426 # define a32 (p->u.s[17])
1427 # define a33 (p->u.s[18])
1428 # define a34 (p->u.s[19])
1429 # define a40 (p->u.s[20])
1430 # define a41 (p->u.s[21])
1431 # define a42 (p->u.s[22])
1432 # define a43 (p->u.s[23])
1433 # define a44 (p->u.s[24])
1434 # define ROL64(a,x) ((a<<x)|(a>>(64-x)))
1435 
1436   for(i=0; i<24; i+=4){
1437     c0 = a00^a10^a20^a30^a40;
1438     c1 = a01^a11^a21^a31^a41;
1439     c2 = a02^a12^a22^a32^a42;
1440     c3 = a03^a13^a23^a33^a43;
1441     c4 = a04^a14^a24^a34^a44;
1442     d0 = c4^ROL64(c1, 1);
1443     d1 = c0^ROL64(c2, 1);
1444     d2 = c1^ROL64(c3, 1);
1445     d3 = c2^ROL64(c4, 1);
1446     d4 = c3^ROL64(c0, 1);
1447 
1448     b0 = (a00^d0);
1449     b1 = ROL64((a11^d1), 44);
1450     b2 = ROL64((a22^d2), 43);
1451     b3 = ROL64((a33^d3), 21);
1452     b4 = ROL64((a44^d4), 14);
1453     a00 =   b0 ^((~b1)&  b2 );
1454     a00 ^= RC[i];
1455     a11 =   b1 ^((~b2)&  b3 );
1456     a22 =   b2 ^((~b3)&  b4 );
1457     a33 =   b3 ^((~b4)&  b0 );
1458     a44 =   b4 ^((~b0)&  b1 );
1459 
1460     b2 = ROL64((a20^d0), 3);
1461     b3 = ROL64((a31^d1), 45);
1462     b4 = ROL64((a42^d2), 61);
1463     b0 = ROL64((a03^d3), 28);
1464     b1 = ROL64((a14^d4), 20);
1465     a20 =   b0 ^((~b1)&  b2 );
1466     a31 =   b1 ^((~b2)&  b3 );
1467     a42 =   b2 ^((~b3)&  b4 );
1468     a03 =   b3 ^((~b4)&  b0 );
1469     a14 =   b4 ^((~b0)&  b1 );
1470 
1471     b4 = ROL64((a40^d0), 18);
1472     b0 = ROL64((a01^d1), 1);
1473     b1 = ROL64((a12^d2), 6);
1474     b2 = ROL64((a23^d3), 25);
1475     b3 = ROL64((a34^d4), 8);
1476     a40 =   b0 ^((~b1)&  b2 );
1477     a01 =   b1 ^((~b2)&  b3 );
1478     a12 =   b2 ^((~b3)&  b4 );
1479     a23 =   b3 ^((~b4)&  b0 );
1480     a34 =   b4 ^((~b0)&  b1 );
1481 
1482     b1 = ROL64((a10^d0), 36);
1483     b2 = ROL64((a21^d1), 10);
1484     b3 = ROL64((a32^d2), 15);
1485     b4 = ROL64((a43^d3), 56);
1486     b0 = ROL64((a04^d4), 27);
1487     a10 =   b0 ^((~b1)&  b2 );
1488     a21 =   b1 ^((~b2)&  b3 );
1489     a32 =   b2 ^((~b3)&  b4 );
1490     a43 =   b3 ^((~b4)&  b0 );
1491     a04 =   b4 ^((~b0)&  b1 );
1492 
1493     b3 = ROL64((a30^d0), 41);
1494     b4 = ROL64((a41^d1), 2);
1495     b0 = ROL64((a02^d2), 62);
1496     b1 = ROL64((a13^d3), 55);
1497     b2 = ROL64((a24^d4), 39);
1498     a30 =   b0 ^((~b1)&  b2 );
1499     a41 =   b1 ^((~b2)&  b3 );
1500     a02 =   b2 ^((~b3)&  b4 );
1501     a13 =   b3 ^((~b4)&  b0 );
1502     a24 =   b4 ^((~b0)&  b1 );
1503 
1504     c0 = a00^a20^a40^a10^a30;
1505     c1 = a11^a31^a01^a21^a41;
1506     c2 = a22^a42^a12^a32^a02;
1507     c3 = a33^a03^a23^a43^a13;
1508     c4 = a44^a14^a34^a04^a24;
1509     d0 = c4^ROL64(c1, 1);
1510     d1 = c0^ROL64(c2, 1);
1511     d2 = c1^ROL64(c3, 1);
1512     d3 = c2^ROL64(c4, 1);
1513     d4 = c3^ROL64(c0, 1);
1514 
1515     b0 = (a00^d0);
1516     b1 = ROL64((a31^d1), 44);
1517     b2 = ROL64((a12^d2), 43);
1518     b3 = ROL64((a43^d3), 21);
1519     b4 = ROL64((a24^d4), 14);
1520     a00 =   b0 ^((~b1)&  b2 );
1521     a00 ^= RC[i+1];
1522     a31 =   b1 ^((~b2)&  b3 );
1523     a12 =   b2 ^((~b3)&  b4 );
1524     a43 =   b3 ^((~b4)&  b0 );
1525     a24 =   b4 ^((~b0)&  b1 );
1526 
1527     b2 = ROL64((a40^d0), 3);
1528     b3 = ROL64((a21^d1), 45);
1529     b4 = ROL64((a02^d2), 61);
1530     b0 = ROL64((a33^d3), 28);
1531     b1 = ROL64((a14^d4), 20);
1532     a40 =   b0 ^((~b1)&  b2 );
1533     a21 =   b1 ^((~b2)&  b3 );
1534     a02 =   b2 ^((~b3)&  b4 );
1535     a33 =   b3 ^((~b4)&  b0 );
1536     a14 =   b4 ^((~b0)&  b1 );
1537 
1538     b4 = ROL64((a30^d0), 18);
1539     b0 = ROL64((a11^d1), 1);
1540     b1 = ROL64((a42^d2), 6);
1541     b2 = ROL64((a23^d3), 25);
1542     b3 = ROL64((a04^d4), 8);
1543     a30 =   b0 ^((~b1)&  b2 );
1544     a11 =   b1 ^((~b2)&  b3 );
1545     a42 =   b2 ^((~b3)&  b4 );
1546     a23 =   b3 ^((~b4)&  b0 );
1547     a04 =   b4 ^((~b0)&  b1 );
1548 
1549     b1 = ROL64((a20^d0), 36);
1550     b2 = ROL64((a01^d1), 10);
1551     b3 = ROL64((a32^d2), 15);
1552     b4 = ROL64((a13^d3), 56);
1553     b0 = ROL64((a44^d4), 27);
1554     a20 =   b0 ^((~b1)&  b2 );
1555     a01 =   b1 ^((~b2)&  b3 );
1556     a32 =   b2 ^((~b3)&  b4 );
1557     a13 =   b3 ^((~b4)&  b0 );
1558     a44 =   b4 ^((~b0)&  b1 );
1559 
1560     b3 = ROL64((a10^d0), 41);
1561     b4 = ROL64((a41^d1), 2);
1562     b0 = ROL64((a22^d2), 62);
1563     b1 = ROL64((a03^d3), 55);
1564     b2 = ROL64((a34^d4), 39);
1565     a10 =   b0 ^((~b1)&  b2 );
1566     a41 =   b1 ^((~b2)&  b3 );
1567     a22 =   b2 ^((~b3)&  b4 );
1568     a03 =   b3 ^((~b4)&  b0 );
1569     a34 =   b4 ^((~b0)&  b1 );
1570 
1571     c0 = a00^a40^a30^a20^a10;
1572     c1 = a31^a21^a11^a01^a41;
1573     c2 = a12^a02^a42^a32^a22;
1574     c3 = a43^a33^a23^a13^a03;
1575     c4 = a24^a14^a04^a44^a34;
1576     d0 = c4^ROL64(c1, 1);
1577     d1 = c0^ROL64(c2, 1);
1578     d2 = c1^ROL64(c3, 1);
1579     d3 = c2^ROL64(c4, 1);
1580     d4 = c3^ROL64(c0, 1);
1581 
1582     b0 = (a00^d0);
1583     b1 = ROL64((a21^d1), 44);
1584     b2 = ROL64((a42^d2), 43);
1585     b3 = ROL64((a13^d3), 21);
1586     b4 = ROL64((a34^d4), 14);
1587     a00 =   b0 ^((~b1)&  b2 );
1588     a00 ^= RC[i+2];
1589     a21 =   b1 ^((~b2)&  b3 );
1590     a42 =   b2 ^((~b3)&  b4 );
1591     a13 =   b3 ^((~b4)&  b0 );
1592     a34 =   b4 ^((~b0)&  b1 );
1593 
1594     b2 = ROL64((a30^d0), 3);
1595     b3 = ROL64((a01^d1), 45);
1596     b4 = ROL64((a22^d2), 61);
1597     b0 = ROL64((a43^d3), 28);
1598     b1 = ROL64((a14^d4), 20);
1599     a30 =   b0 ^((~b1)&  b2 );
1600     a01 =   b1 ^((~b2)&  b3 );
1601     a22 =   b2 ^((~b3)&  b4 );
1602     a43 =   b3 ^((~b4)&  b0 );
1603     a14 =   b4 ^((~b0)&  b1 );
1604 
1605     b4 = ROL64((a10^d0), 18);
1606     b0 = ROL64((a31^d1), 1);
1607     b1 = ROL64((a02^d2), 6);
1608     b2 = ROL64((a23^d3), 25);
1609     b3 = ROL64((a44^d4), 8);
1610     a10 =   b0 ^((~b1)&  b2 );
1611     a31 =   b1 ^((~b2)&  b3 );
1612     a02 =   b2 ^((~b3)&  b4 );
1613     a23 =   b3 ^((~b4)&  b0 );
1614     a44 =   b4 ^((~b0)&  b1 );
1615 
1616     b1 = ROL64((a40^d0), 36);
1617     b2 = ROL64((a11^d1), 10);
1618     b3 = ROL64((a32^d2), 15);
1619     b4 = ROL64((a03^d3), 56);
1620     b0 = ROL64((a24^d4), 27);
1621     a40 =   b0 ^((~b1)&  b2 );
1622     a11 =   b1 ^((~b2)&  b3 );
1623     a32 =   b2 ^((~b3)&  b4 );
1624     a03 =   b3 ^((~b4)&  b0 );
1625     a24 =   b4 ^((~b0)&  b1 );
1626 
1627     b3 = ROL64((a20^d0), 41);
1628     b4 = ROL64((a41^d1), 2);
1629     b0 = ROL64((a12^d2), 62);
1630     b1 = ROL64((a33^d3), 55);
1631     b2 = ROL64((a04^d4), 39);
1632     a20 =   b0 ^((~b1)&  b2 );
1633     a41 =   b1 ^((~b2)&  b3 );
1634     a12 =   b2 ^((~b3)&  b4 );
1635     a33 =   b3 ^((~b4)&  b0 );
1636     a04 =   b4 ^((~b0)&  b1 );
1637 
1638     c0 = a00^a30^a10^a40^a20;
1639     c1 = a21^a01^a31^a11^a41;
1640     c2 = a42^a22^a02^a32^a12;
1641     c3 = a13^a43^a23^a03^a33;
1642     c4 = a34^a14^a44^a24^a04;
1643     d0 = c4^ROL64(c1, 1);
1644     d1 = c0^ROL64(c2, 1);
1645     d2 = c1^ROL64(c3, 1);
1646     d3 = c2^ROL64(c4, 1);
1647     d4 = c3^ROL64(c0, 1);
1648 
1649     b0 = (a00^d0);
1650     b1 = ROL64((a01^d1), 44);
1651     b2 = ROL64((a02^d2), 43);
1652     b3 = ROL64((a03^d3), 21);
1653     b4 = ROL64((a04^d4), 14);
1654     a00 =   b0 ^((~b1)&  b2 );
1655     a00 ^= RC[i+3];
1656     a01 =   b1 ^((~b2)&  b3 );
1657     a02 =   b2 ^((~b3)&  b4 );
1658     a03 =   b3 ^((~b4)&  b0 );
1659     a04 =   b4 ^((~b0)&  b1 );
1660 
1661     b2 = ROL64((a10^d0), 3);
1662     b3 = ROL64((a11^d1), 45);
1663     b4 = ROL64((a12^d2), 61);
1664     b0 = ROL64((a13^d3), 28);
1665     b1 = ROL64((a14^d4), 20);
1666     a10 =   b0 ^((~b1)&  b2 );
1667     a11 =   b1 ^((~b2)&  b3 );
1668     a12 =   b2 ^((~b3)&  b4 );
1669     a13 =   b3 ^((~b4)&  b0 );
1670     a14 =   b4 ^((~b0)&  b1 );
1671 
1672     b4 = ROL64((a20^d0), 18);
1673     b0 = ROL64((a21^d1), 1);
1674     b1 = ROL64((a22^d2), 6);
1675     b2 = ROL64((a23^d3), 25);
1676     b3 = ROL64((a24^d4), 8);
1677     a20 =   b0 ^((~b1)&  b2 );
1678     a21 =   b1 ^((~b2)&  b3 );
1679     a22 =   b2 ^((~b3)&  b4 );
1680     a23 =   b3 ^((~b4)&  b0 );
1681     a24 =   b4 ^((~b0)&  b1 );
1682 
1683     b1 = ROL64((a30^d0), 36);
1684     b2 = ROL64((a31^d1), 10);
1685     b3 = ROL64((a32^d2), 15);
1686     b4 = ROL64((a33^d3), 56);
1687     b0 = ROL64((a34^d4), 27);
1688     a30 =   b0 ^((~b1)&  b2 );
1689     a31 =   b1 ^((~b2)&  b3 );
1690     a32 =   b2 ^((~b3)&  b4 );
1691     a33 =   b3 ^((~b4)&  b0 );
1692     a34 =   b4 ^((~b0)&  b1 );
1693 
1694     b3 = ROL64((a40^d0), 41);
1695     b4 = ROL64((a41^d1), 2);
1696     b0 = ROL64((a42^d2), 62);
1697     b1 = ROL64((a43^d3), 55);
1698     b2 = ROL64((a44^d4), 39);
1699     a40 =   b0 ^((~b1)&  b2 );
1700     a41 =   b1 ^((~b2)&  b3 );
1701     a42 =   b2 ^((~b3)&  b4 );
1702     a43 =   b3 ^((~b4)&  b0 );
1703     a44 =   b4 ^((~b0)&  b1 );
1704   }
1705 }
1706 
1707 /*
1708 ** Initialize a new hash.  iSize determines the size of the hash
1709 ** in bits and should be one of 224, 256, 384, or 512.  Or iSize
1710 ** can be zero to use the default hash size of 256 bits.
1711 */
1712 static void SHA3Init(SHA3Context *p, int iSize){
1713   memset(p, 0, sizeof(*p));
1714   if( iSize>=128 && iSize<=512 ){
1715     p->nRate = (1600 - ((iSize + 31)&~31)*2)/8;
1716   }else{
1717     p->nRate = (1600 - 2*256)/8;
1718   }
1719 #if SHA3_BYTEORDER==1234
1720   /* Known to be little-endian at compile-time. No-op */
1721 #elif SHA3_BYTEORDER==4321
1722   p->ixMask = 7;  /* Big-endian */
1723 #else
1724   {
1725     static unsigned int one = 1;
1726     if( 1==*(unsigned char*)&one ){
1727       /* Little endian.  No byte swapping. */
1728       p->ixMask = 0;
1729     }else{
1730       /* Big endian.  Byte swap. */
1731       p->ixMask = 7;
1732     }
1733   }
1734 #endif
1735 }
1736 
1737 /*
1738 ** Make consecutive calls to the SHA3Update function to add new content
1739 ** to the hash
1740 */
1741 static void SHA3Update(
1742   SHA3Context *p,
1743   const unsigned char *aData,
1744   unsigned int nData
1745 ){
1746   unsigned int i = 0;
1747 #if SHA3_BYTEORDER==1234
1748   if( (p->nLoaded % 8)==0 && ((aData - (const unsigned char*)0)&7)==0 ){
1749     for(; i+7<nData; i+=8){
1750       p->u.s[p->nLoaded/8] ^= *(u64*)&aData[i];
1751       p->nLoaded += 8;
1752       if( p->nLoaded>=p->nRate ){
1753         KeccakF1600Step(p);
1754         p->nLoaded = 0;
1755       }
1756     }
1757   }
1758 #endif
1759   for(; i<nData; i++){
1760 #if SHA3_BYTEORDER==1234
1761     p->u.x[p->nLoaded] ^= aData[i];
1762 #elif SHA3_BYTEORDER==4321
1763     p->u.x[p->nLoaded^0x07] ^= aData[i];
1764 #else
1765     p->u.x[p->nLoaded^p->ixMask] ^= aData[i];
1766 #endif
1767     p->nLoaded++;
1768     if( p->nLoaded==p->nRate ){
1769       KeccakF1600Step(p);
1770       p->nLoaded = 0;
1771     }
1772   }
1773 }
1774 
1775 /*
1776 ** After all content has been added, invoke SHA3Final() to compute
1777 ** the final hash.  The function returns a pointer to the binary
1778 ** hash value.
1779 */
1780 static unsigned char *SHA3Final(SHA3Context *p){
1781   unsigned int i;
1782   if( p->nLoaded==p->nRate-1 ){
1783     const unsigned char c1 = 0x86;
1784     SHA3Update(p, &c1, 1);
1785   }else{
1786     const unsigned char c2 = 0x06;
1787     const unsigned char c3 = 0x80;
1788     SHA3Update(p, &c2, 1);
1789     p->nLoaded = p->nRate - 1;
1790     SHA3Update(p, &c3, 1);
1791   }
1792   for(i=0; i<p->nRate; i++){
1793     p->u.x[i+p->nRate] = p->u.x[i^p->ixMask];
1794   }
1795   return &p->u.x[p->nRate];
1796 }
1797 /* End of the hashing logic
1798 *****************************************************************************/
1799 
1800 /*
1801 ** Implementation of the sha3(X,SIZE) function.
1802 **
1803 ** Return a BLOB which is the SIZE-bit SHA3 hash of X.  The default
1804 ** size is 256.  If X is a BLOB, it is hashed as is.
1805 ** For all other non-NULL types of input, X is converted into a UTF-8 string
1806 ** and the string is hashed without the trailing 0x00 terminator.  The hash
1807 ** of a NULL value is NULL.
1808 */
1809 static void sha3Func(
1810   sqlite3_context *context,
1811   int argc,
1812   sqlite3_value **argv
1813 ){
1814   SHA3Context cx;
1815   int eType = sqlite3_value_type(argv[0]);
1816   int nByte = sqlite3_value_bytes(argv[0]);
1817   int iSize;
1818   if( argc==1 ){
1819     iSize = 256;
1820   }else{
1821     iSize = sqlite3_value_int(argv[1]);
1822     if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){
1823       sqlite3_result_error(context, "SHA3 size should be one of: 224 256 "
1824                                     "384 512", -1);
1825       return;
1826     }
1827   }
1828   if( eType==SQLITE_NULL ) return;
1829   SHA3Init(&cx, iSize);
1830   if( eType==SQLITE_BLOB ){
1831     SHA3Update(&cx, sqlite3_value_blob(argv[0]), nByte);
1832   }else{
1833     SHA3Update(&cx, sqlite3_value_text(argv[0]), nByte);
1834   }
1835   sqlite3_result_blob(context, SHA3Final(&cx), iSize/8, SQLITE_TRANSIENT);
1836 }
1837 
1838 /* Compute a string using sqlite3_vsnprintf() with a maximum length
1839 ** of 50 bytes and add it to the hash.
1840 */
1841 static void hash_step_vformat(
1842   SHA3Context *p,                 /* Add content to this context */
1843   const char *zFormat,
1844   ...
1845 ){
1846   va_list ap;
1847   int n;
1848   char zBuf[50];
1849   va_start(ap, zFormat);
1850   sqlite3_vsnprintf(sizeof(zBuf),zBuf,zFormat,ap);
1851   va_end(ap);
1852   n = (int)strlen(zBuf);
1853   SHA3Update(p, (unsigned char*)zBuf, n);
1854 }
1855 
1856 /*
1857 ** Implementation of the sha3_query(SQL,SIZE) function.
1858 **
1859 ** This function compiles and runs the SQL statement(s) given in the
1860 ** argument. The results are hashed using a SIZE-bit SHA3.  The default
1861 ** size is 256.
1862 **
1863 ** The format of the byte stream that is hashed is summarized as follows:
1864 **
1865 **       S<n>:<sql>
1866 **       R
1867 **       N
1868 **       I<int>
1869 **       F<ieee-float>
1870 **       B<size>:<bytes>
1871 **       T<size>:<text>
1872 **
1873 ** <sql> is the original SQL text for each statement run and <n> is
1874 ** the size of that text.  The SQL text is UTF-8.  A single R character
1875 ** occurs before the start of each row.  N means a NULL value.
1876 ** I mean an 8-byte little-endian integer <int>.  F is a floating point
1877 ** number with an 8-byte little-endian IEEE floating point value <ieee-float>.
1878 ** B means blobs of <size> bytes.  T means text rendered as <size>
1879 ** bytes of UTF-8.  The <n> and <size> values are expressed as an ASCII
1880 ** text integers.
1881 **
1882 ** For each SQL statement in the X input, there is one S segment.  Each
1883 ** S segment is followed by zero or more R segments, one for each row in the
1884 ** result set.  After each R, there are one or more N, I, F, B, or T segments,
1885 ** one for each column in the result set.  Segments are concatentated directly
1886 ** with no delimiters of any kind.
1887 */
1888 static void sha3QueryFunc(
1889   sqlite3_context *context,
1890   int argc,
1891   sqlite3_value **argv
1892 ){
1893   sqlite3 *db = sqlite3_context_db_handle(context);
1894   const char *zSql = (const char*)sqlite3_value_text(argv[0]);
1895   sqlite3_stmt *pStmt = 0;
1896   int nCol;                   /* Number of columns in the result set */
1897   int i;                      /* Loop counter */
1898   int rc;
1899   int n;
1900   const char *z;
1901   SHA3Context cx;
1902   int iSize;
1903 
1904   if( argc==1 ){
1905     iSize = 256;
1906   }else{
1907     iSize = sqlite3_value_int(argv[1]);
1908     if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){
1909       sqlite3_result_error(context, "SHA3 size should be one of: 224 256 "
1910                                     "384 512", -1);
1911       return;
1912     }
1913   }
1914   if( zSql==0 ) return;
1915   SHA3Init(&cx, iSize);
1916   while( zSql[0] ){
1917     rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zSql);
1918     if( rc ){
1919       char *zMsg = sqlite3_mprintf("error SQL statement [%s]: %s",
1920                                    zSql, sqlite3_errmsg(db));
1921       sqlite3_finalize(pStmt);
1922       sqlite3_result_error(context, zMsg, -1);
1923       sqlite3_free(zMsg);
1924       return;
1925     }
1926     if( !sqlite3_stmt_readonly(pStmt) ){
1927       char *zMsg = sqlite3_mprintf("non-query: [%s]", sqlite3_sql(pStmt));
1928       sqlite3_finalize(pStmt);
1929       sqlite3_result_error(context, zMsg, -1);
1930       sqlite3_free(zMsg);
1931       return;
1932     }
1933     nCol = sqlite3_column_count(pStmt);
1934     z = sqlite3_sql(pStmt);
1935     n = (int)strlen(z);
1936     hash_step_vformat(&cx,"S%d:",n);
1937     SHA3Update(&cx,(unsigned char*)z,n);
1938 
1939     /* Compute a hash over the result of the query */
1940     while( SQLITE_ROW==sqlite3_step(pStmt) ){
1941       SHA3Update(&cx,(const unsigned char*)"R",1);
1942       for(i=0; i<nCol; i++){
1943         switch( sqlite3_column_type(pStmt,i) ){
1944           case SQLITE_NULL: {
1945             SHA3Update(&cx, (const unsigned char*)"N",1);
1946             break;
1947           }
1948           case SQLITE_INTEGER: {
1949             sqlite3_uint64 u;
1950             int j;
1951             unsigned char x[9];
1952             sqlite3_int64 v = sqlite3_column_int64(pStmt,i);
1953             memcpy(&u, &v, 8);
1954             for(j=8; j>=1; j--){
1955               x[j] = u & 0xff;
1956               u >>= 8;
1957             }
1958             x[0] = 'I';
1959             SHA3Update(&cx, x, 9);
1960             break;
1961           }
1962           case SQLITE_FLOAT: {
1963             sqlite3_uint64 u;
1964             int j;
1965             unsigned char x[9];
1966             double r = sqlite3_column_double(pStmt,i);
1967             memcpy(&u, &r, 8);
1968             for(j=8; j>=1; j--){
1969               x[j] = u & 0xff;
1970               u >>= 8;
1971             }
1972             x[0] = 'F';
1973             SHA3Update(&cx,x,9);
1974             break;
1975           }
1976           case SQLITE_TEXT: {
1977             int n2 = sqlite3_column_bytes(pStmt, i);
1978             const unsigned char *z2 = sqlite3_column_text(pStmt, i);
1979             hash_step_vformat(&cx,"T%d:",n2);
1980             SHA3Update(&cx, z2, n2);
1981             break;
1982           }
1983           case SQLITE_BLOB: {
1984             int n2 = sqlite3_column_bytes(pStmt, i);
1985             const unsigned char *z2 = sqlite3_column_blob(pStmt, i);
1986             hash_step_vformat(&cx,"B%d:",n2);
1987             SHA3Update(&cx, z2, n2);
1988             break;
1989           }
1990         }
1991       }
1992     }
1993     sqlite3_finalize(pStmt);
1994   }
1995   sqlite3_result_blob(context, SHA3Final(&cx), iSize/8, SQLITE_TRANSIENT);
1996 }
1997 
1998 
1999 #ifdef _WIN32
2000 
2001 #endif
2002 int sqlite3_shathree_init(
2003   sqlite3 *db,
2004   char **pzErrMsg,
2005   const sqlite3_api_routines *pApi
2006 ){
2007   int rc = SQLITE_OK;
2008   SQLITE_EXTENSION_INIT2(pApi);
2009   (void)pzErrMsg;  /* Unused parameter */
2010   rc = sqlite3_create_function(db, "sha3", 1, SQLITE_UTF8, 0,
2011                                sha3Func, 0, 0);
2012   if( rc==SQLITE_OK ){
2013     rc = sqlite3_create_function(db, "sha3", 2, SQLITE_UTF8, 0,
2014                                  sha3Func, 0, 0);
2015   }
2016   if( rc==SQLITE_OK ){
2017     rc = sqlite3_create_function(db, "sha3_query", 1, SQLITE_UTF8, 0,
2018                                  sha3QueryFunc, 0, 0);
2019   }
2020   if( rc==SQLITE_OK ){
2021     rc = sqlite3_create_function(db, "sha3_query", 2, SQLITE_UTF8, 0,
2022                                  sha3QueryFunc, 0, 0);
2023   }
2024   return rc;
2025 }
2026 
2027 /************************* End ../ext/misc/shathree.c ********************/
2028 /************************* Begin ../ext/misc/fileio.c ******************/
2029 /*
2030 ** 2014-06-13
2031 **
2032 ** The author disclaims copyright to this source code.  In place of
2033 ** a legal notice, here is a blessing:
2034 **
2035 **    May you do good and not evil.
2036 **    May you find forgiveness for yourself and forgive others.
2037 **    May you share freely, never taking more than you give.
2038 **
2039 ******************************************************************************
2040 **
2041 ** This SQLite extension implements SQL functions readfile() and
2042 ** writefile(), and eponymous virtual type "fsdir".
2043 **
2044 ** WRITEFILE(FILE, DATA [, MODE [, MTIME]]):
2045 **
2046 **   If neither of the optional arguments is present, then this UDF
2047 **   function writes blob DATA to file FILE. If successful, the number
2048 **   of bytes written is returned. If an error occurs, NULL is returned.
2049 **
2050 **   If the first option argument - MODE - is present, then it must
2051 **   be passed an integer value that corresponds to a POSIX mode
2052 **   value (file type + permissions, as returned in the stat.st_mode
2053 **   field by the stat() system call). Three types of files may
2054 **   be written/created:
2055 **
2056 **     regular files:  (mode & 0170000)==0100000
2057 **     symbolic links: (mode & 0170000)==0120000
2058 **     directories:    (mode & 0170000)==0040000
2059 **
2060 **   For a directory, the DATA is ignored. For a symbolic link, it is
2061 **   interpreted as text and used as the target of the link. For a
2062 **   regular file, it is interpreted as a blob and written into the
2063 **   named file. Regardless of the type of file, its permissions are
2064 **   set to (mode & 0777) before returning.
2065 **
2066 **   If the optional MTIME argument is present, then it is interpreted
2067 **   as an integer - the number of seconds since the unix epoch. The
2068 **   modification-time of the target file is set to this value before
2069 **   returning.
2070 **
2071 **   If three or more arguments are passed to this function and an
2072 **   error is encountered, an exception is raised.
2073 **
2074 ** READFILE(FILE):
2075 **
2076 **   Read and return the contents of file FILE (type blob) from disk.
2077 **
2078 ** FSDIR:
2079 **
2080 **   Used as follows:
2081 **
2082 **     SELECT * FROM fsdir($path [, $dir]);
2083 **
2084 **   Parameter $path is an absolute or relative pathname. If the file that it
2085 **   refers to does not exist, it is an error. If the path refers to a regular
2086 **   file or symbolic link, it returns a single row. Or, if the path refers
2087 **   to a directory, it returns one row for the directory, and one row for each
2088 **   file within the hierarchy rooted at $path.
2089 **
2090 **   Each row has the following columns:
2091 **
2092 **     name:  Path to file or directory (text value).
2093 **     mode:  Value of stat.st_mode for directory entry (an integer).
2094 **     mtime: Value of stat.st_mtime for directory entry (an integer).
2095 **     data:  For a regular file, a blob containing the file data. For a
2096 **            symlink, a text value containing the text of the link. For a
2097 **            directory, NULL.
2098 **
2099 **   If a non-NULL value is specified for the optional $dir parameter and
2100 **   $path is a relative path, then $path is interpreted relative to $dir.
2101 **   And the paths returned in the "name" column of the table are also
2102 **   relative to directory $dir.
2103 */
2104 /* #include "sqlite3ext.h" */
2105 SQLITE_EXTENSION_INIT1
2106 #include <stdio.h>
2107 #include <string.h>
2108 #include <assert.h>
2109 
2110 #include <sys/types.h>
2111 #include <sys/stat.h>
2112 #include <fcntl.h>
2113 #if !defined(_WIN32) && !defined(WIN32)
2114 #  include <unistd.h>
2115 #  include <dirent.h>
2116 #  include <utime.h>
2117 #  include <sys/time.h>
2118 #else
2119 #  include "windows.h"
2120 #  include <io.h>
2121 #  include <direct.h>
2122 /* #  include "test_windirent.h" */
2123 #  define dirent DIRENT
2124 #  ifndef chmod
2125 #    define chmod _chmod
2126 #  endif
2127 #  ifndef stat
2128 #    define stat _stat
2129 #  endif
2130 #  define mkdir(path,mode) _mkdir(path)
2131 #  define lstat(path,buf) stat(path,buf)
2132 #endif
2133 #include <time.h>
2134 #include <errno.h>
2135 
2136 
2137 /*
2138 ** Structure of the fsdir() table-valued function
2139 */
2140                  /*    0    1    2     3    4           5             */
2141 #define FSDIR_SCHEMA "(name,mode,mtime,data,path HIDDEN,dir HIDDEN)"
2142 #define FSDIR_COLUMN_NAME     0     /* Name of the file */
2143 #define FSDIR_COLUMN_MODE     1     /* Access mode */
2144 #define FSDIR_COLUMN_MTIME    2     /* Last modification time */
2145 #define FSDIR_COLUMN_DATA     3     /* File content */
2146 #define FSDIR_COLUMN_PATH     4     /* Path to top of search */
2147 #define FSDIR_COLUMN_DIR      5     /* Path is relative to this directory */
2148 
2149 
2150 /*
2151 ** Set the result stored by context ctx to a blob containing the
2152 ** contents of file zName.  Or, leave the result unchanged (NULL)
2153 ** if the file does not exist or is unreadable.
2154 **
2155 ** If the file exceeds the SQLite blob size limit, through an
2156 ** SQLITE_TOOBIG error.
2157 **
2158 ** Throw an SQLITE_IOERR if there are difficulties pulling the file
2159 ** off of disk.
2160 */
2161 static void readFileContents(sqlite3_context *ctx, const char *zName){
2162   FILE *in;
2163   sqlite3_int64 nIn;
2164   void *pBuf;
2165   sqlite3 *db;
2166   int mxBlob;
2167 
2168   in = fopen(zName, "rb");
2169   if( in==0 ){
2170     /* File does not exist or is unreadable. Leave the result set to NULL. */
2171     return;
2172   }
2173   fseek(in, 0, SEEK_END);
2174   nIn = ftell(in);
2175   rewind(in);
2176   db = sqlite3_context_db_handle(ctx);
2177   mxBlob = sqlite3_limit(db, SQLITE_LIMIT_LENGTH, -1);
2178   if( nIn>mxBlob ){
2179     sqlite3_result_error_code(ctx, SQLITE_TOOBIG);
2180     fclose(in);
2181     return;
2182   }
2183   pBuf = sqlite3_malloc64( nIn ? nIn : 1 );
2184   if( pBuf==0 ){
2185     sqlite3_result_error_nomem(ctx);
2186     fclose(in);
2187     return;
2188   }
2189   if( nIn==(sqlite3_int64)fread(pBuf, 1, (size_t)nIn, in) ){
2190     sqlite3_result_blob64(ctx, pBuf, nIn, sqlite3_free);
2191   }else{
2192     sqlite3_result_error_code(ctx, SQLITE_IOERR);
2193     sqlite3_free(pBuf);
2194   }
2195   fclose(in);
2196 }
2197 
2198 /*
2199 ** Implementation of the "readfile(X)" SQL function.  The entire content
2200 ** of the file named X is read and returned as a BLOB.  NULL is returned
2201 ** if the file does not exist or is unreadable.
2202 */
2203 static void readfileFunc(
2204   sqlite3_context *context,
2205   int argc,
2206   sqlite3_value **argv
2207 ){
2208   const char *zName;
2209   (void)(argc);  /* Unused parameter */
2210   zName = (const char*)sqlite3_value_text(argv[0]);
2211   if( zName==0 ) return;
2212   readFileContents(context, zName);
2213 }
2214 
2215 /*
2216 ** Set the error message contained in context ctx to the results of
2217 ** vprintf(zFmt, ...).
2218 */
2219 static void ctxErrorMsg(sqlite3_context *ctx, const char *zFmt, ...){
2220   char *zMsg = 0;
2221   va_list ap;
2222   va_start(ap, zFmt);
2223   zMsg = sqlite3_vmprintf(zFmt, ap);
2224   sqlite3_result_error(ctx, zMsg, -1);
2225   sqlite3_free(zMsg);
2226   va_end(ap);
2227 }
2228 
2229 #if defined(_WIN32)
2230 /*
2231 ** This function is designed to convert a Win32 FILETIME structure into the
2232 ** number of seconds since the Unix Epoch (1970-01-01 00:00:00 UTC).
2233 */
2234 static sqlite3_uint64 fileTimeToUnixTime(
2235   LPFILETIME pFileTime
2236 ){
2237   SYSTEMTIME epochSystemTime;
2238   ULARGE_INTEGER epochIntervals;
2239   FILETIME epochFileTime;
2240   ULARGE_INTEGER fileIntervals;
2241 
2242   memset(&epochSystemTime, 0, sizeof(SYSTEMTIME));
2243   epochSystemTime.wYear = 1970;
2244   epochSystemTime.wMonth = 1;
2245   epochSystemTime.wDay = 1;
2246   SystemTimeToFileTime(&epochSystemTime, &epochFileTime);
2247   epochIntervals.LowPart = epochFileTime.dwLowDateTime;
2248   epochIntervals.HighPart = epochFileTime.dwHighDateTime;
2249 
2250   fileIntervals.LowPart = pFileTime->dwLowDateTime;
2251   fileIntervals.HighPart = pFileTime->dwHighDateTime;
2252 
2253   return (fileIntervals.QuadPart - epochIntervals.QuadPart) / 10000000;
2254 }
2255 
2256 /*
2257 ** This function attempts to normalize the time values found in the stat()
2258 ** buffer to UTC.  This is necessary on Win32, where the runtime library
2259 ** appears to return these values as local times.
2260 */
2261 static void statTimesToUtc(
2262   const char *zPath,
2263   struct stat *pStatBuf
2264 ){
2265   HANDLE hFindFile;
2266   WIN32_FIND_DATAW fd;
2267   LPWSTR zUnicodeName;
2268   extern LPWSTR sqlite3_win32_utf8_to_unicode(const char*);
2269   zUnicodeName = sqlite3_win32_utf8_to_unicode(zPath);
2270   if( zUnicodeName ){
2271     memset(&fd, 0, sizeof(WIN32_FIND_DATAW));
2272     hFindFile = FindFirstFileW(zUnicodeName, &fd);
2273     if( hFindFile!=NULL ){
2274       pStatBuf->st_ctime = (time_t)fileTimeToUnixTime(&fd.ftCreationTime);
2275       pStatBuf->st_atime = (time_t)fileTimeToUnixTime(&fd.ftLastAccessTime);
2276       pStatBuf->st_mtime = (time_t)fileTimeToUnixTime(&fd.ftLastWriteTime);
2277       FindClose(hFindFile);
2278     }
2279     sqlite3_free(zUnicodeName);
2280   }
2281 }
2282 #endif
2283 
2284 /*
2285 ** This function is used in place of stat().  On Windows, special handling
2286 ** is required in order for the included time to be returned as UTC.  On all
2287 ** other systems, this function simply calls stat().
2288 */
2289 static int fileStat(
2290   const char *zPath,
2291   struct stat *pStatBuf
2292 ){
2293 #if defined(_WIN32)
2294   int rc = stat(zPath, pStatBuf);
2295   if( rc==0 ) statTimesToUtc(zPath, pStatBuf);
2296   return rc;
2297 #else
2298   return stat(zPath, pStatBuf);
2299 #endif
2300 }
2301 
2302 /*
2303 ** This function is used in place of lstat().  On Windows, special handling
2304 ** is required in order for the included time to be returned as UTC.  On all
2305 ** other systems, this function simply calls lstat().
2306 */
2307 static int fileLinkStat(
2308   const char *zPath,
2309   struct stat *pStatBuf
2310 ){
2311 #if defined(_WIN32)
2312   int rc = lstat(zPath, pStatBuf);
2313   if( rc==0 ) statTimesToUtc(zPath, pStatBuf);
2314   return rc;
2315 #else
2316   return lstat(zPath, pStatBuf);
2317 #endif
2318 }
2319 
2320 /*
2321 ** Argument zFile is the name of a file that will be created and/or written
2322 ** by SQL function writefile(). This function ensures that the directory
2323 ** zFile will be written to exists, creating it if required. The permissions
2324 ** for any path components created by this function are set in accordance
2325 ** with the current umask.
2326 **
2327 ** If an OOM condition is encountered, SQLITE_NOMEM is returned. Otherwise,
2328 ** SQLITE_OK is returned if the directory is successfully created, or
2329 ** SQLITE_ERROR otherwise.
2330 */
2331 static int makeDirectory(
2332   const char *zFile
2333 ){
2334   char *zCopy = sqlite3_mprintf("%s", zFile);
2335   int rc = SQLITE_OK;
2336 
2337   if( zCopy==0 ){
2338     rc = SQLITE_NOMEM;
2339   }else{
2340     int nCopy = (int)strlen(zCopy);
2341     int i = 1;
2342 
2343     while( rc==SQLITE_OK ){
2344       struct stat sStat;
2345       int rc2;
2346 
2347       for(; zCopy[i]!='/' && i<nCopy; i++);
2348       if( i==nCopy ) break;
2349       zCopy[i] = '\0';
2350 
2351       rc2 = fileStat(zCopy, &sStat);
2352       if( rc2!=0 ){
2353         if( mkdir(zCopy, 0777) ) rc = SQLITE_ERROR;
2354       }else{
2355         if( !S_ISDIR(sStat.st_mode) ) rc = SQLITE_ERROR;
2356       }
2357       zCopy[i] = '/';
2358       i++;
2359     }
2360 
2361     sqlite3_free(zCopy);
2362   }
2363 
2364   return rc;
2365 }
2366 
2367 /*
2368 ** This function does the work for the writefile() UDF. Refer to
2369 ** header comments at the top of this file for details.
2370 */
2371 static int writeFile(
2372   sqlite3_context *pCtx,          /* Context to return bytes written in */
2373   const char *zFile,              /* File to write */
2374   sqlite3_value *pData,           /* Data to write */
2375   mode_t mode,                    /* MODE parameter passed to writefile() */
2376   sqlite3_int64 mtime             /* MTIME parameter (or -1 to not set time) */
2377 ){
2378 #if !defined(_WIN32) && !defined(WIN32)
2379   if( S_ISLNK(mode) ){
2380     const char *zTo = (const char*)sqlite3_value_text(pData);
2381     if( symlink(zTo, zFile)<0 ) return 1;
2382   }else
2383 #endif
2384   {
2385     if( S_ISDIR(mode) ){
2386       if( mkdir(zFile, mode) ){
2387         /* The mkdir() call to create the directory failed. This might not
2388         ** be an error though - if there is already a directory at the same
2389         ** path and either the permissions already match or can be changed
2390         ** to do so using chmod(), it is not an error.  */
2391         struct stat sStat;
2392         if( errno!=EEXIST
2393          || 0!=fileStat(zFile, &sStat)
2394          || !S_ISDIR(sStat.st_mode)
2395          || ((sStat.st_mode&0777)!=(mode&0777) && 0!=chmod(zFile, mode&0777))
2396         ){
2397           return 1;
2398         }
2399       }
2400     }else{
2401       sqlite3_int64 nWrite = 0;
2402       const char *z;
2403       int rc = 0;
2404       FILE *out = fopen(zFile, "wb");
2405       if( out==0 ) return 1;
2406       z = (const char*)sqlite3_value_blob(pData);
2407       if( z ){
2408         sqlite3_int64 n = fwrite(z, 1, sqlite3_value_bytes(pData), out);
2409         nWrite = sqlite3_value_bytes(pData);
2410         if( nWrite!=n ){
2411           rc = 1;
2412         }
2413       }
2414       fclose(out);
2415       if( rc==0 && mode && chmod(zFile, mode & 0777) ){
2416         rc = 1;
2417       }
2418       if( rc ) return 2;
2419       sqlite3_result_int64(pCtx, nWrite);
2420     }
2421   }
2422 
2423   if( mtime>=0 ){
2424 #if defined(_WIN32)
2425     /* Windows */
2426     FILETIME lastAccess;
2427     FILETIME lastWrite;
2428     SYSTEMTIME currentTime;
2429     LONGLONG intervals;
2430     HANDLE hFile;
2431     LPWSTR zUnicodeName;
2432     extern LPWSTR sqlite3_win32_utf8_to_unicode(const char*);
2433 
2434     GetSystemTime(&currentTime);
2435     SystemTimeToFileTime(&currentTime, &lastAccess);
2436     intervals = Int32x32To64(mtime, 10000000) + 116444736000000000;
2437     lastWrite.dwLowDateTime = (DWORD)intervals;
2438     lastWrite.dwHighDateTime = intervals >> 32;
2439     zUnicodeName = sqlite3_win32_utf8_to_unicode(zFile);
2440     if( zUnicodeName==0 ){
2441       return 1;
2442     }
2443     hFile = CreateFileW(
2444       zUnicodeName, FILE_WRITE_ATTRIBUTES, 0, NULL, OPEN_EXISTING,
2445       FILE_FLAG_BACKUP_SEMANTICS, NULL
2446     );
2447     sqlite3_free(zUnicodeName);
2448     if( hFile!=INVALID_HANDLE_VALUE ){
2449       BOOL bResult = SetFileTime(hFile, NULL, &lastAccess, &lastWrite);
2450       CloseHandle(hFile);
2451       return !bResult;
2452     }else{
2453       return 1;
2454     }
2455 #elif defined(AT_FDCWD) && 0 /* utimensat() is not universally available */
2456     /* Recent unix */
2457     struct timespec times[2];
2458     times[0].tv_nsec = times[1].tv_nsec = 0;
2459     times[0].tv_sec = time(0);
2460     times[1].tv_sec = mtime;
2461     if( utimensat(AT_FDCWD, zFile, times, AT_SYMLINK_NOFOLLOW) ){
2462       return 1;
2463     }
2464 #else
2465     /* Legacy unix */
2466     struct timeval times[2];
2467     times[0].tv_usec = times[1].tv_usec = 0;
2468     times[0].tv_sec = time(0);
2469     times[1].tv_sec = mtime;
2470     if( utimes(zFile, times) ){
2471       return 1;
2472     }
2473 #endif
2474   }
2475 
2476   return 0;
2477 }
2478 
2479 /*
2480 ** Implementation of the "writefile(W,X[,Y[,Z]]])" SQL function.
2481 ** Refer to header comments at the top of this file for details.
2482 */
2483 static void writefileFunc(
2484   sqlite3_context *context,
2485   int argc,
2486   sqlite3_value **argv
2487 ){
2488   const char *zFile;
2489   mode_t mode = 0;
2490   int res;
2491   sqlite3_int64 mtime = -1;
2492 
2493   if( argc<2 || argc>4 ){
2494     sqlite3_result_error(context,
2495         "wrong number of arguments to function writefile()", -1
2496     );
2497     return;
2498   }
2499 
2500   zFile = (const char*)sqlite3_value_text(argv[0]);
2501   if( zFile==0 ) return;
2502   if( argc>=3 ){
2503     mode = (mode_t)sqlite3_value_int(argv[2]);
2504   }
2505   if( argc==4 ){
2506     mtime = sqlite3_value_int64(argv[3]);
2507   }
2508 
2509   res = writeFile(context, zFile, argv[1], mode, mtime);
2510   if( res==1 && errno==ENOENT ){
2511     if( makeDirectory(zFile)==SQLITE_OK ){
2512       res = writeFile(context, zFile, argv[1], mode, mtime);
2513     }
2514   }
2515 
2516   if( argc>2 && res!=0 ){
2517     if( S_ISLNK(mode) ){
2518       ctxErrorMsg(context, "failed to create symlink: %s", zFile);
2519     }else if( S_ISDIR(mode) ){
2520       ctxErrorMsg(context, "failed to create directory: %s", zFile);
2521     }else{
2522       ctxErrorMsg(context, "failed to write file: %s", zFile);
2523     }
2524   }
2525 }
2526 
2527 /*
2528 ** SQL function:   lsmode(MODE)
2529 **
2530 ** Given a numberic st_mode from stat(), convert it into a human-readable
2531 ** text string in the style of "ls -l".
2532 */
2533 static void lsModeFunc(
2534   sqlite3_context *context,
2535   int argc,
2536   sqlite3_value **argv
2537 ){
2538   int i;
2539   int iMode = sqlite3_value_int(argv[0]);
2540   char z[16];
2541   (void)argc;
2542   if( S_ISLNK(iMode) ){
2543     z[0] = 'l';
2544   }else if( S_ISREG(iMode) ){
2545     z[0] = '-';
2546   }else if( S_ISDIR(iMode) ){
2547     z[0] = 'd';
2548   }else{
2549     z[0] = '?';
2550   }
2551   for(i=0; i<3; i++){
2552     int m = (iMode >> ((2-i)*3));
2553     char *a = &z[1 + i*3];
2554     a[0] = (m & 0x4) ? 'r' : '-';
2555     a[1] = (m & 0x2) ? 'w' : '-';
2556     a[2] = (m & 0x1) ? 'x' : '-';
2557   }
2558   z[10] = '\0';
2559   sqlite3_result_text(context, z, -1, SQLITE_TRANSIENT);
2560 }
2561 
2562 #ifndef SQLITE_OMIT_VIRTUALTABLE
2563 
2564 /*
2565 ** Cursor type for recursively iterating through a directory structure.
2566 */
2567 typedef struct fsdir_cursor fsdir_cursor;
2568 typedef struct FsdirLevel FsdirLevel;
2569 
2570 struct FsdirLevel {
2571   DIR *pDir;                 /* From opendir() */
2572   char *zDir;                /* Name of directory (nul-terminated) */
2573 };
2574 
2575 struct fsdir_cursor {
2576   sqlite3_vtab_cursor base;  /* Base class - must be first */
2577 
2578   int nLvl;                  /* Number of entries in aLvl[] array */
2579   int iLvl;                  /* Index of current entry */
2580   FsdirLevel *aLvl;          /* Hierarchy of directories being traversed */
2581 
2582   const char *zBase;
2583   int nBase;
2584 
2585   struct stat sStat;         /* Current lstat() results */
2586   char *zPath;               /* Path to current entry */
2587   sqlite3_int64 iRowid;      /* Current rowid */
2588 };
2589 
2590 typedef struct fsdir_tab fsdir_tab;
2591 struct fsdir_tab {
2592   sqlite3_vtab base;         /* Base class - must be first */
2593 };
2594 
2595 /*
2596 ** Construct a new fsdir virtual table object.
2597 */
2598 static int fsdirConnect(
2599   sqlite3 *db,
2600   void *pAux,
2601   int argc, const char *const*argv,
2602   sqlite3_vtab **ppVtab,
2603   char **pzErr
2604 ){
2605   fsdir_tab *pNew = 0;
2606   int rc;
2607   (void)pAux;
2608   (void)argc;
2609   (void)argv;
2610   (void)pzErr;
2611   rc = sqlite3_declare_vtab(db, "CREATE TABLE x" FSDIR_SCHEMA);
2612   if( rc==SQLITE_OK ){
2613     pNew = (fsdir_tab*)sqlite3_malloc( sizeof(*pNew) );
2614     if( pNew==0 ) return SQLITE_NOMEM;
2615     memset(pNew, 0, sizeof(*pNew));
2616   }
2617   *ppVtab = (sqlite3_vtab*)pNew;
2618   return rc;
2619 }
2620 
2621 /*
2622 ** This method is the destructor for fsdir vtab objects.
2623 */
2624 static int fsdirDisconnect(sqlite3_vtab *pVtab){
2625   sqlite3_free(pVtab);
2626   return SQLITE_OK;
2627 }
2628 
2629 /*
2630 ** Constructor for a new fsdir_cursor object.
2631 */
2632 static int fsdirOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){
2633   fsdir_cursor *pCur;
2634   (void)p;
2635   pCur = sqlite3_malloc( sizeof(*pCur) );
2636   if( pCur==0 ) return SQLITE_NOMEM;
2637   memset(pCur, 0, sizeof(*pCur));
2638   pCur->iLvl = -1;
2639   *ppCursor = &pCur->base;
2640   return SQLITE_OK;
2641 }
2642 
2643 /*
2644 ** Reset a cursor back to the state it was in when first returned
2645 ** by fsdirOpen().
2646 */
2647 static void fsdirResetCursor(fsdir_cursor *pCur){
2648   int i;
2649   for(i=0; i<=pCur->iLvl; i++){
2650     FsdirLevel *pLvl = &pCur->aLvl[i];
2651     if( pLvl->pDir ) closedir(pLvl->pDir);
2652     sqlite3_free(pLvl->zDir);
2653   }
2654   sqlite3_free(pCur->zPath);
2655   sqlite3_free(pCur->aLvl);
2656   pCur->aLvl = 0;
2657   pCur->zPath = 0;
2658   pCur->zBase = 0;
2659   pCur->nBase = 0;
2660   pCur->nLvl = 0;
2661   pCur->iLvl = -1;
2662   pCur->iRowid = 1;
2663 }
2664 
2665 /*
2666 ** Destructor for an fsdir_cursor.
2667 */
2668 static int fsdirClose(sqlite3_vtab_cursor *cur){
2669   fsdir_cursor *pCur = (fsdir_cursor*)cur;
2670 
2671   fsdirResetCursor(pCur);
2672   sqlite3_free(pCur);
2673   return SQLITE_OK;
2674 }
2675 
2676 /*
2677 ** Set the error message for the virtual table associated with cursor
2678 ** pCur to the results of vprintf(zFmt, ...).
2679 */
2680 static void fsdirSetErrmsg(fsdir_cursor *pCur, const char *zFmt, ...){
2681   va_list ap;
2682   va_start(ap, zFmt);
2683   pCur->base.pVtab->zErrMsg = sqlite3_vmprintf(zFmt, ap);
2684   va_end(ap);
2685 }
2686 
2687 
2688 /*
2689 ** Advance an fsdir_cursor to its next row of output.
2690 */
2691 static int fsdirNext(sqlite3_vtab_cursor *cur){
2692   fsdir_cursor *pCur = (fsdir_cursor*)cur;
2693   mode_t m = pCur->sStat.st_mode;
2694 
2695   pCur->iRowid++;
2696   if( S_ISDIR(m) ){
2697     /* Descend into this directory */
2698     int iNew = pCur->iLvl + 1;
2699     FsdirLevel *pLvl;
2700     if( iNew>=pCur->nLvl ){
2701       int nNew = iNew+1;
2702       sqlite3_int64 nByte = nNew*sizeof(FsdirLevel);
2703       FsdirLevel *aNew = (FsdirLevel*)sqlite3_realloc64(pCur->aLvl, nByte);
2704       if( aNew==0 ) return SQLITE_NOMEM;
2705       memset(&aNew[pCur->nLvl], 0, sizeof(FsdirLevel)*(nNew-pCur->nLvl));
2706       pCur->aLvl = aNew;
2707       pCur->nLvl = nNew;
2708     }
2709     pCur->iLvl = iNew;
2710     pLvl = &pCur->aLvl[iNew];
2711 
2712     pLvl->zDir = pCur->zPath;
2713     pCur->zPath = 0;
2714     pLvl->pDir = opendir(pLvl->zDir);
2715     if( pLvl->pDir==0 ){
2716       fsdirSetErrmsg(pCur, "cannot read directory: %s", pCur->zPath);
2717       return SQLITE_ERROR;
2718     }
2719   }
2720 
2721   while( pCur->iLvl>=0 ){
2722     FsdirLevel *pLvl = &pCur->aLvl[pCur->iLvl];
2723     struct dirent *pEntry = readdir(pLvl->pDir);
2724     if( pEntry ){
2725       if( pEntry->d_name[0]=='.' ){
2726        if( pEntry->d_name[1]=='.' && pEntry->d_name[2]=='\0' ) continue;
2727        if( pEntry->d_name[1]=='\0' ) continue;
2728       }
2729       sqlite3_free(pCur->zPath);
2730       pCur->zPath = sqlite3_mprintf("%s/%s", pLvl->zDir, pEntry->d_name);
2731       if( pCur->zPath==0 ) return SQLITE_NOMEM;
2732       if( fileLinkStat(pCur->zPath, &pCur->sStat) ){
2733         fsdirSetErrmsg(pCur, "cannot stat file: %s", pCur->zPath);
2734         return SQLITE_ERROR;
2735       }
2736       return SQLITE_OK;
2737     }
2738     closedir(pLvl->pDir);
2739     sqlite3_free(pLvl->zDir);
2740     pLvl->pDir = 0;
2741     pLvl->zDir = 0;
2742     pCur->iLvl--;
2743   }
2744 
2745   /* EOF */
2746   sqlite3_free(pCur->zPath);
2747   pCur->zPath = 0;
2748   return SQLITE_OK;
2749 }
2750 
2751 /*
2752 ** Return values of columns for the row at which the series_cursor
2753 ** is currently pointing.
2754 */
2755 static int fsdirColumn(
2756   sqlite3_vtab_cursor *cur,   /* The cursor */
2757   sqlite3_context *ctx,       /* First argument to sqlite3_result_...() */
2758   int i                       /* Which column to return */
2759 ){
2760   fsdir_cursor *pCur = (fsdir_cursor*)cur;
2761   switch( i ){
2762     case FSDIR_COLUMN_NAME: {
2763       sqlite3_result_text(ctx, &pCur->zPath[pCur->nBase], -1, SQLITE_TRANSIENT);
2764       break;
2765     }
2766 
2767     case FSDIR_COLUMN_MODE:
2768       sqlite3_result_int64(ctx, pCur->sStat.st_mode);
2769       break;
2770 
2771     case FSDIR_COLUMN_MTIME:
2772       sqlite3_result_int64(ctx, pCur->sStat.st_mtime);
2773       break;
2774 
2775     case FSDIR_COLUMN_DATA: {
2776       mode_t m = pCur->sStat.st_mode;
2777       if( S_ISDIR(m) ){
2778         sqlite3_result_null(ctx);
2779 #if !defined(_WIN32) && !defined(WIN32)
2780       }else if( S_ISLNK(m) ){
2781         char aStatic[64];
2782         char *aBuf = aStatic;
2783         sqlite3_int64 nBuf = 64;
2784         int n;
2785 
2786         while( 1 ){
2787           n = readlink(pCur->zPath, aBuf, nBuf);
2788           if( n<nBuf ) break;
2789           if( aBuf!=aStatic ) sqlite3_free(aBuf);
2790           nBuf = nBuf*2;
2791           aBuf = sqlite3_malloc64(nBuf);
2792           if( aBuf==0 ){
2793             sqlite3_result_error_nomem(ctx);
2794             return SQLITE_NOMEM;
2795           }
2796         }
2797 
2798         sqlite3_result_text(ctx, aBuf, n, SQLITE_TRANSIENT);
2799         if( aBuf!=aStatic ) sqlite3_free(aBuf);
2800 #endif
2801       }else{
2802         readFileContents(ctx, pCur->zPath);
2803       }
2804     }
2805     case FSDIR_COLUMN_PATH:
2806     default: {
2807       /* The FSDIR_COLUMN_PATH and FSDIR_COLUMN_DIR are input parameters.
2808       ** always return their values as NULL */
2809       break;
2810     }
2811   }
2812   return SQLITE_OK;
2813 }
2814 
2815 /*
2816 ** Return the rowid for the current row. In this implementation, the
2817 ** first row returned is assigned rowid value 1, and each subsequent
2818 ** row a value 1 more than that of the previous.
2819 */
2820 static int fsdirRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
2821   fsdir_cursor *pCur = (fsdir_cursor*)cur;
2822   *pRowid = pCur->iRowid;
2823   return SQLITE_OK;
2824 }
2825 
2826 /*
2827 ** Return TRUE if the cursor has been moved off of the last
2828 ** row of output.
2829 */
2830 static int fsdirEof(sqlite3_vtab_cursor *cur){
2831   fsdir_cursor *pCur = (fsdir_cursor*)cur;
2832   return (pCur->zPath==0);
2833 }
2834 
2835 /*
2836 ** xFilter callback.
2837 **
2838 ** idxNum==1   PATH parameter only
2839 ** idxNum==2   Both PATH and DIR supplied
2840 */
2841 static int fsdirFilter(
2842   sqlite3_vtab_cursor *cur,
2843   int idxNum, const char *idxStr,
2844   int argc, sqlite3_value **argv
2845 ){
2846   const char *zDir = 0;
2847   fsdir_cursor *pCur = (fsdir_cursor*)cur;
2848   (void)idxStr;
2849   fsdirResetCursor(pCur);
2850 
2851   if( idxNum==0 ){
2852     fsdirSetErrmsg(pCur, "table function fsdir requires an argument");
2853     return SQLITE_ERROR;
2854   }
2855 
2856   assert( argc==idxNum && (argc==1 || argc==2) );
2857   zDir = (const char*)sqlite3_value_text(argv[0]);
2858   if( zDir==0 ){
2859     fsdirSetErrmsg(pCur, "table function fsdir requires a non-NULL argument");
2860     return SQLITE_ERROR;
2861   }
2862   if( argc==2 ){
2863     pCur->zBase = (const char*)sqlite3_value_text(argv[1]);
2864   }
2865   if( pCur->zBase ){
2866     pCur->nBase = (int)strlen(pCur->zBase)+1;
2867     pCur->zPath = sqlite3_mprintf("%s/%s", pCur->zBase, zDir);
2868   }else{
2869     pCur->zPath = sqlite3_mprintf("%s", zDir);
2870   }
2871 
2872   if( pCur->zPath==0 ){
2873     return SQLITE_NOMEM;
2874   }
2875   if( fileLinkStat(pCur->zPath, &pCur->sStat) ){
2876     fsdirSetErrmsg(pCur, "cannot stat file: %s", pCur->zPath);
2877     return SQLITE_ERROR;
2878   }
2879 
2880   return SQLITE_OK;
2881 }
2882 
2883 /*
2884 ** SQLite will invoke this method one or more times while planning a query
2885 ** that uses the generate_series virtual table.  This routine needs to create
2886 ** a query plan for each invocation and compute an estimated cost for that
2887 ** plan.
2888 **
2889 ** In this implementation idxNum is used to represent the
2890 ** query plan.  idxStr is unused.
2891 **
2892 ** The query plan is represented by values of idxNum:
2893 **
2894 **  (1)  The path value is supplied by argv[0]
2895 **  (2)  Path is in argv[0] and dir is in argv[1]
2896 */
2897 static int fsdirBestIndex(
2898   sqlite3_vtab *tab,
2899   sqlite3_index_info *pIdxInfo
2900 ){
2901   int i;                 /* Loop over constraints */
2902   int idxPath = -1;      /* Index in pIdxInfo->aConstraint of PATH= */
2903   int idxDir = -1;       /* Index in pIdxInfo->aConstraint of DIR= */
2904   int seenPath = 0;      /* True if an unusable PATH= constraint is seen */
2905   int seenDir = 0;       /* True if an unusable DIR= constraint is seen */
2906   const struct sqlite3_index_constraint *pConstraint;
2907 
2908   (void)tab;
2909   pConstraint = pIdxInfo->aConstraint;
2910   for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){
2911     if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue;
2912     switch( pConstraint->iColumn ){
2913       case FSDIR_COLUMN_PATH: {
2914         if( pConstraint->usable ){
2915           idxPath = i;
2916           seenPath = 0;
2917         }else if( idxPath<0 ){
2918           seenPath = 1;
2919         }
2920         break;
2921       }
2922       case FSDIR_COLUMN_DIR: {
2923         if( pConstraint->usable ){
2924           idxDir = i;
2925           seenDir = 0;
2926         }else if( idxDir<0 ){
2927           seenDir = 1;
2928         }
2929         break;
2930       }
2931     }
2932   }
2933   if( seenPath || seenDir ){
2934     /* If input parameters are unusable, disallow this plan */
2935     return SQLITE_CONSTRAINT;
2936   }
2937 
2938   if( idxPath<0 ){
2939     pIdxInfo->idxNum = 0;
2940     /* The pIdxInfo->estimatedCost should have been initialized to a huge
2941     ** number.  Leave it unchanged. */
2942     pIdxInfo->estimatedRows = 0x7fffffff;
2943   }else{
2944     pIdxInfo->aConstraintUsage[idxPath].omit = 1;
2945     pIdxInfo->aConstraintUsage[idxPath].argvIndex = 1;
2946     if( idxDir>=0 ){
2947       pIdxInfo->aConstraintUsage[idxDir].omit = 1;
2948       pIdxInfo->aConstraintUsage[idxDir].argvIndex = 2;
2949       pIdxInfo->idxNum = 2;
2950       pIdxInfo->estimatedCost = 10.0;
2951     }else{
2952       pIdxInfo->idxNum = 1;
2953       pIdxInfo->estimatedCost = 100.0;
2954     }
2955   }
2956 
2957   return SQLITE_OK;
2958 }
2959 
2960 /*
2961 ** Register the "fsdir" virtual table.
2962 */
2963 static int fsdirRegister(sqlite3 *db){
2964   static sqlite3_module fsdirModule = {
2965     0,                         /* iVersion */
2966     0,                         /* xCreate */
2967     fsdirConnect,              /* xConnect */
2968     fsdirBestIndex,            /* xBestIndex */
2969     fsdirDisconnect,           /* xDisconnect */
2970     0,                         /* xDestroy */
2971     fsdirOpen,                 /* xOpen - open a cursor */
2972     fsdirClose,                /* xClose - close a cursor */
2973     fsdirFilter,               /* xFilter - configure scan constraints */
2974     fsdirNext,                 /* xNext - advance a cursor */
2975     fsdirEof,                  /* xEof - check for end of scan */
2976     fsdirColumn,               /* xColumn - read data */
2977     fsdirRowid,                /* xRowid - read data */
2978     0,                         /* xUpdate */
2979     0,                         /* xBegin */
2980     0,                         /* xSync */
2981     0,                         /* xCommit */
2982     0,                         /* xRollback */
2983     0,                         /* xFindMethod */
2984     0,                         /* xRename */
2985     0,                         /* xSavepoint */
2986     0,                         /* xRelease */
2987     0,                         /* xRollbackTo */
2988     0,                         /* xShadowName */
2989   };
2990 
2991   int rc = sqlite3_create_module(db, "fsdir", &fsdirModule, 0);
2992   return rc;
2993 }
2994 #else         /* SQLITE_OMIT_VIRTUALTABLE */
2995 # define fsdirRegister(x) SQLITE_OK
2996 #endif
2997 
2998 #ifdef _WIN32
2999 
3000 #endif
3001 int sqlite3_fileio_init(
3002   sqlite3 *db,
3003   char **pzErrMsg,
3004   const sqlite3_api_routines *pApi
3005 ){
3006   int rc = SQLITE_OK;
3007   SQLITE_EXTENSION_INIT2(pApi);
3008   (void)pzErrMsg;  /* Unused parameter */
3009   rc = sqlite3_create_function(db, "readfile", 1, SQLITE_UTF8, 0,
3010                                readfileFunc, 0, 0);
3011   if( rc==SQLITE_OK ){
3012     rc = sqlite3_create_function(db, "writefile", -1, SQLITE_UTF8, 0,
3013                                  writefileFunc, 0, 0);
3014   }
3015   if( rc==SQLITE_OK ){
3016     rc = sqlite3_create_function(db, "lsmode", 1, SQLITE_UTF8, 0,
3017                                  lsModeFunc, 0, 0);
3018   }
3019   if( rc==SQLITE_OK ){
3020     rc = fsdirRegister(db);
3021   }
3022   return rc;
3023 }
3024 
3025 /************************* End ../ext/misc/fileio.c ********************/
3026 /************************* Begin ../ext/misc/completion.c ******************/
3027 /*
3028 ** 2017-07-10
3029 **
3030 ** The author disclaims copyright to this source code.  In place of
3031 ** a legal notice, here is a blessing:
3032 **
3033 **    May you do good and not evil.
3034 **    May you find forgiveness for yourself and forgive others.
3035 **    May you share freely, never taking more than you give.
3036 **
3037 *************************************************************************
3038 **
3039 ** This file implements an eponymous virtual table that returns suggested
3040 ** completions for a partial SQL input.
3041 **
3042 ** Suggested usage:
3043 **
3044 **     SELECT DISTINCT candidate COLLATE nocase
3045 **       FROM completion($prefix,$wholeline)
3046 **      ORDER BY 1;
3047 **
3048 ** The two query parameters are optional.  $prefix is the text of the
3049 ** current word being typed and that is to be completed.  $wholeline is
3050 ** the complete input line, used for context.
3051 **
3052 ** The raw completion() table might return the same candidate multiple
3053 ** times, for example if the same column name is used to two or more
3054 ** tables.  And the candidates are returned in an arbitrary order.  Hence,
3055 ** the DISTINCT and ORDER BY are recommended.
3056 **
3057 ** This virtual table operates at the speed of human typing, and so there
3058 ** is no attempt to make it fast.  Even a slow implementation will be much
3059 ** faster than any human can type.
3060 **
3061 */
3062 /* #include "sqlite3ext.h" */
3063 SQLITE_EXTENSION_INIT1
3064 #include <assert.h>
3065 #include <string.h>
3066 #include <ctype.h>
3067 
3068 #ifndef SQLITE_OMIT_VIRTUALTABLE
3069 
3070 /* completion_vtab is a subclass of sqlite3_vtab which will
3071 ** serve as the underlying representation of a completion virtual table
3072 */
3073 typedef struct completion_vtab completion_vtab;
3074 struct completion_vtab {
3075   sqlite3_vtab base;  /* Base class - must be first */
3076   sqlite3 *db;        /* Database connection for this completion vtab */
3077 };
3078 
3079 /* completion_cursor is a subclass of sqlite3_vtab_cursor which will
3080 ** serve as the underlying representation of a cursor that scans
3081 ** over rows of the result
3082 */
3083 typedef struct completion_cursor completion_cursor;
3084 struct completion_cursor {
3085   sqlite3_vtab_cursor base;  /* Base class - must be first */
3086   sqlite3 *db;               /* Database connection for this cursor */
3087   int nPrefix, nLine;        /* Number of bytes in zPrefix and zLine */
3088   char *zPrefix;             /* The prefix for the word we want to complete */
3089   char *zLine;               /* The whole that we want to complete */
3090   const char *zCurrentRow;   /* Current output row */
3091   int szRow;                 /* Length of the zCurrentRow string */
3092   sqlite3_stmt *pStmt;       /* Current statement */
3093   sqlite3_int64 iRowid;      /* The rowid */
3094   int ePhase;                /* Current phase */
3095   int j;                     /* inter-phase counter */
3096 };
3097 
3098 /* Values for ePhase:
3099 */
3100 #define COMPLETION_FIRST_PHASE   1
3101 #define COMPLETION_KEYWORDS      1
3102 #define COMPLETION_PRAGMAS       2
3103 #define COMPLETION_FUNCTIONS     3
3104 #define COMPLETION_COLLATIONS    4
3105 #define COMPLETION_INDEXES       5
3106 #define COMPLETION_TRIGGERS      6
3107 #define COMPLETION_DATABASES     7
3108 #define COMPLETION_TABLES        8    /* Also VIEWs and TRIGGERs */
3109 #define COMPLETION_COLUMNS       9
3110 #define COMPLETION_MODULES       10
3111 #define COMPLETION_EOF           11
3112 
3113 /*
3114 ** The completionConnect() method is invoked to create a new
3115 ** completion_vtab that describes the completion virtual table.
3116 **
3117 ** Think of this routine as the constructor for completion_vtab objects.
3118 **
3119 ** All this routine needs to do is:
3120 **
3121 **    (1) Allocate the completion_vtab object and initialize all fields.
3122 **
3123 **    (2) Tell SQLite (via the sqlite3_declare_vtab() interface) what the
3124 **        result set of queries against completion will look like.
3125 */
3126 static int completionConnect(
3127   sqlite3 *db,
3128   void *pAux,
3129   int argc, const char *const*argv,
3130   sqlite3_vtab **ppVtab,
3131   char **pzErr
3132 ){
3133   completion_vtab *pNew;
3134   int rc;
3135 
3136   (void)(pAux);    /* Unused parameter */
3137   (void)(argc);    /* Unused parameter */
3138   (void)(argv);    /* Unused parameter */
3139   (void)(pzErr);   /* Unused parameter */
3140 
3141 /* Column numbers */
3142 #define COMPLETION_COLUMN_CANDIDATE 0  /* Suggested completion of the input */
3143 #define COMPLETION_COLUMN_PREFIX    1  /* Prefix of the word to be completed */
3144 #define COMPLETION_COLUMN_WHOLELINE 2  /* Entire line seen so far */
3145 #define COMPLETION_COLUMN_PHASE     3  /* ePhase - used for debugging only */
3146 
3147   rc = sqlite3_declare_vtab(db,
3148       "CREATE TABLE x("
3149       "  candidate TEXT,"
3150       "  prefix TEXT HIDDEN,"
3151       "  wholeline TEXT HIDDEN,"
3152       "  phase INT HIDDEN"        /* Used for debugging only */
3153       ")");
3154   if( rc==SQLITE_OK ){
3155     pNew = sqlite3_malloc( sizeof(*pNew) );
3156     *ppVtab = (sqlite3_vtab*)pNew;
3157     if( pNew==0 ) return SQLITE_NOMEM;
3158     memset(pNew, 0, sizeof(*pNew));
3159     pNew->db = db;
3160   }
3161   return rc;
3162 }
3163 
3164 /*
3165 ** This method is the destructor for completion_cursor objects.
3166 */
3167 static int completionDisconnect(sqlite3_vtab *pVtab){
3168   sqlite3_free(pVtab);
3169   return SQLITE_OK;
3170 }
3171 
3172 /*
3173 ** Constructor for a new completion_cursor object.
3174 */
3175 static int completionOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){
3176   completion_cursor *pCur;
3177   pCur = sqlite3_malloc( sizeof(*pCur) );
3178   if( pCur==0 ) return SQLITE_NOMEM;
3179   memset(pCur, 0, sizeof(*pCur));
3180   pCur->db = ((completion_vtab*)p)->db;
3181   *ppCursor = &pCur->base;
3182   return SQLITE_OK;
3183 }
3184 
3185 /*
3186 ** Reset the completion_cursor.
3187 */
3188 static void completionCursorReset(completion_cursor *pCur){
3189   sqlite3_free(pCur->zPrefix);   pCur->zPrefix = 0;  pCur->nPrefix = 0;
3190   sqlite3_free(pCur->zLine);     pCur->zLine = 0;    pCur->nLine = 0;
3191   sqlite3_finalize(pCur->pStmt); pCur->pStmt = 0;
3192   pCur->j = 0;
3193 }
3194 
3195 /*
3196 ** Destructor for a completion_cursor.
3197 */
3198 static int completionClose(sqlite3_vtab_cursor *cur){
3199   completionCursorReset((completion_cursor*)cur);
3200   sqlite3_free(cur);
3201   return SQLITE_OK;
3202 }
3203 
3204 /*
3205 ** Advance a completion_cursor to its next row of output.
3206 **
3207 ** The ->ePhase, ->j, and ->pStmt fields of the completion_cursor object
3208 ** record the current state of the scan.  This routine sets ->zCurrentRow
3209 ** to the current row of output and then returns.  If no more rows remain,
3210 ** then ->ePhase is set to COMPLETION_EOF which will signal the virtual
3211 ** table that has reached the end of its scan.
3212 **
3213 ** The current implementation just lists potential identifiers and
3214 ** keywords and filters them by zPrefix.  Future enhancements should
3215 ** take zLine into account to try to restrict the set of identifiers and
3216 ** keywords based on what would be legal at the current point of input.
3217 */
3218 static int completionNext(sqlite3_vtab_cursor *cur){
3219   completion_cursor *pCur = (completion_cursor*)cur;
3220   int eNextPhase = 0;  /* Next phase to try if current phase reaches end */
3221   int iCol = -1;       /* If >=0, step pCur->pStmt and use the i-th column */
3222   pCur->iRowid++;
3223   while( pCur->ePhase!=COMPLETION_EOF ){
3224     switch( pCur->ePhase ){
3225       case COMPLETION_KEYWORDS: {
3226         if( pCur->j >= sqlite3_keyword_count() ){
3227           pCur->zCurrentRow = 0;
3228           pCur->ePhase = COMPLETION_DATABASES;
3229         }else{
3230           sqlite3_keyword_name(pCur->j++, &pCur->zCurrentRow, &pCur->szRow);
3231         }
3232         iCol = -1;
3233         break;
3234       }
3235       case COMPLETION_DATABASES: {
3236         if( pCur->pStmt==0 ){
3237           sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1,
3238                              &pCur->pStmt, 0);
3239         }
3240         iCol = 1;
3241         eNextPhase = COMPLETION_TABLES;
3242         break;
3243       }
3244       case COMPLETION_TABLES: {
3245         if( pCur->pStmt==0 ){
3246           sqlite3_stmt *pS2;
3247           char *zSql = 0;
3248           const char *zSep = "";
3249           sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1, &pS2, 0);
3250           while( sqlite3_step(pS2)==SQLITE_ROW ){
3251             const char *zDb = (const char*)sqlite3_column_text(pS2, 1);
3252             zSql = sqlite3_mprintf(
3253                "%z%s"
3254                "SELECT name FROM \"%w\".sqlite_master",
3255                zSql, zSep, zDb
3256             );
3257             if( zSql==0 ) return SQLITE_NOMEM;
3258             zSep = " UNION ";
3259           }
3260           sqlite3_finalize(pS2);
3261           sqlite3_prepare_v2(pCur->db, zSql, -1, &pCur->pStmt, 0);
3262           sqlite3_free(zSql);
3263         }
3264         iCol = 0;
3265         eNextPhase = COMPLETION_COLUMNS;
3266         break;
3267       }
3268       case COMPLETION_COLUMNS: {
3269         if( pCur->pStmt==0 ){
3270           sqlite3_stmt *pS2;
3271           char *zSql = 0;
3272           const char *zSep = "";
3273           sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1, &pS2, 0);
3274           while( sqlite3_step(pS2)==SQLITE_ROW ){
3275             const char *zDb = (const char*)sqlite3_column_text(pS2, 1);
3276             zSql = sqlite3_mprintf(
3277                "%z%s"
3278                "SELECT pti.name FROM \"%w\".sqlite_master AS sm"
3279                        " JOIN pragma_table_info(sm.name,%Q) AS pti"
3280                " WHERE sm.type='table'",
3281                zSql, zSep, zDb, zDb
3282             );
3283             if( zSql==0 ) return SQLITE_NOMEM;
3284             zSep = " UNION ";
3285           }
3286           sqlite3_finalize(pS2);
3287           sqlite3_prepare_v2(pCur->db, zSql, -1, &pCur->pStmt, 0);
3288           sqlite3_free(zSql);
3289         }
3290         iCol = 0;
3291         eNextPhase = COMPLETION_EOF;
3292         break;
3293       }
3294     }
3295     if( iCol<0 ){
3296       /* This case is when the phase presets zCurrentRow */
3297       if( pCur->zCurrentRow==0 ) continue;
3298     }else{
3299       if( sqlite3_step(pCur->pStmt)==SQLITE_ROW ){
3300         /* Extract the next row of content */
3301         pCur->zCurrentRow = (const char*)sqlite3_column_text(pCur->pStmt, iCol);
3302         pCur->szRow = sqlite3_column_bytes(pCur->pStmt, iCol);
3303       }else{
3304         /* When all rows are finished, advance to the next phase */
3305         sqlite3_finalize(pCur->pStmt);
3306         pCur->pStmt = 0;
3307         pCur->ePhase = eNextPhase;
3308         continue;
3309       }
3310     }
3311     if( pCur->nPrefix==0 ) break;
3312     if( pCur->nPrefix<=pCur->szRow
3313      && sqlite3_strnicmp(pCur->zPrefix, pCur->zCurrentRow, pCur->nPrefix)==0
3314     ){
3315       break;
3316     }
3317   }
3318 
3319   return SQLITE_OK;
3320 }
3321 
3322 /*
3323 ** Return values of columns for the row at which the completion_cursor
3324 ** is currently pointing.
3325 */
3326 static int completionColumn(
3327   sqlite3_vtab_cursor *cur,   /* The cursor */
3328   sqlite3_context *ctx,       /* First argument to sqlite3_result_...() */
3329   int i                       /* Which column to return */
3330 ){
3331   completion_cursor *pCur = (completion_cursor*)cur;
3332   switch( i ){
3333     case COMPLETION_COLUMN_CANDIDATE: {
3334       sqlite3_result_text(ctx, pCur->zCurrentRow, pCur->szRow,SQLITE_TRANSIENT);
3335       break;
3336     }
3337     case COMPLETION_COLUMN_PREFIX: {
3338       sqlite3_result_text(ctx, pCur->zPrefix, -1, SQLITE_TRANSIENT);
3339       break;
3340     }
3341     case COMPLETION_COLUMN_WHOLELINE: {
3342       sqlite3_result_text(ctx, pCur->zLine, -1, SQLITE_TRANSIENT);
3343       break;
3344     }
3345     case COMPLETION_COLUMN_PHASE: {
3346       sqlite3_result_int(ctx, pCur->ePhase);
3347       break;
3348     }
3349   }
3350   return SQLITE_OK;
3351 }
3352 
3353 /*
3354 ** Return the rowid for the current row.  In this implementation, the
3355 ** rowid is the same as the output value.
3356 */
3357 static int completionRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
3358   completion_cursor *pCur = (completion_cursor*)cur;
3359   *pRowid = pCur->iRowid;
3360   return SQLITE_OK;
3361 }
3362 
3363 /*
3364 ** Return TRUE if the cursor has been moved off of the last
3365 ** row of output.
3366 */
3367 static int completionEof(sqlite3_vtab_cursor *cur){
3368   completion_cursor *pCur = (completion_cursor*)cur;
3369   return pCur->ePhase >= COMPLETION_EOF;
3370 }
3371 
3372 /*
3373 ** This method is called to "rewind" the completion_cursor object back
3374 ** to the first row of output.  This method is always called at least
3375 ** once prior to any call to completionColumn() or completionRowid() or
3376 ** completionEof().
3377 */
3378 static int completionFilter(
3379   sqlite3_vtab_cursor *pVtabCursor,
3380   int idxNum, const char *idxStr,
3381   int argc, sqlite3_value **argv
3382 ){
3383   completion_cursor *pCur = (completion_cursor *)pVtabCursor;
3384   int iArg = 0;
3385   (void)(idxStr);   /* Unused parameter */
3386   (void)(argc);     /* Unused parameter */
3387   completionCursorReset(pCur);
3388   if( idxNum & 1 ){
3389     pCur->nPrefix = sqlite3_value_bytes(argv[iArg]);
3390     if( pCur->nPrefix>0 ){
3391       pCur->zPrefix = sqlite3_mprintf("%s", sqlite3_value_text(argv[iArg]));
3392       if( pCur->zPrefix==0 ) return SQLITE_NOMEM;
3393     }
3394     iArg = 1;
3395   }
3396   if( idxNum & 2 ){
3397     pCur->nLine = sqlite3_value_bytes(argv[iArg]);
3398     if( pCur->nLine>0 ){
3399       pCur->zLine = sqlite3_mprintf("%s", sqlite3_value_text(argv[iArg]));
3400       if( pCur->zLine==0 ) return SQLITE_NOMEM;
3401     }
3402   }
3403   if( pCur->zLine!=0 && pCur->zPrefix==0 ){
3404     int i = pCur->nLine;
3405     while( i>0 && (isalnum(pCur->zLine[i-1]) || pCur->zLine[i-1]=='_') ){
3406       i--;
3407     }
3408     pCur->nPrefix = pCur->nLine - i;
3409     if( pCur->nPrefix>0 ){
3410       pCur->zPrefix = sqlite3_mprintf("%.*s", pCur->nPrefix, pCur->zLine + i);
3411       if( pCur->zPrefix==0 ) return SQLITE_NOMEM;
3412     }
3413   }
3414   pCur->iRowid = 0;
3415   pCur->ePhase = COMPLETION_FIRST_PHASE;
3416   return completionNext(pVtabCursor);
3417 }
3418 
3419 /*
3420 ** SQLite will invoke this method one or more times while planning a query
3421 ** that uses the completion virtual table.  This routine needs to create
3422 ** a query plan for each invocation and compute an estimated cost for that
3423 ** plan.
3424 **
3425 ** There are two hidden parameters that act as arguments to the table-valued
3426 ** function:  "prefix" and "wholeline".  Bit 0 of idxNum is set if "prefix"
3427 ** is available and bit 1 is set if "wholeline" is available.
3428 */
3429 static int completionBestIndex(
3430   sqlite3_vtab *tab,
3431   sqlite3_index_info *pIdxInfo
3432 ){
3433   int i;                 /* Loop over constraints */
3434   int idxNum = 0;        /* The query plan bitmask */
3435   int prefixIdx = -1;    /* Index of the start= constraint, or -1 if none */
3436   int wholelineIdx = -1; /* Index of the stop= constraint, or -1 if none */
3437   int nArg = 0;          /* Number of arguments that completeFilter() expects */
3438   const struct sqlite3_index_constraint *pConstraint;
3439 
3440   (void)(tab);    /* Unused parameter */
3441   pConstraint = pIdxInfo->aConstraint;
3442   for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){
3443     if( pConstraint->usable==0 ) continue;
3444     if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue;
3445     switch( pConstraint->iColumn ){
3446       case COMPLETION_COLUMN_PREFIX:
3447         prefixIdx = i;
3448         idxNum |= 1;
3449         break;
3450       case COMPLETION_COLUMN_WHOLELINE:
3451         wholelineIdx = i;
3452         idxNum |= 2;
3453         break;
3454     }
3455   }
3456   if( prefixIdx>=0 ){
3457     pIdxInfo->aConstraintUsage[prefixIdx].argvIndex = ++nArg;
3458     pIdxInfo->aConstraintUsage[prefixIdx].omit = 1;
3459   }
3460   if( wholelineIdx>=0 ){
3461     pIdxInfo->aConstraintUsage[wholelineIdx].argvIndex = ++nArg;
3462     pIdxInfo->aConstraintUsage[wholelineIdx].omit = 1;
3463   }
3464   pIdxInfo->idxNum = idxNum;
3465   pIdxInfo->estimatedCost = (double)5000 - 1000*nArg;
3466   pIdxInfo->estimatedRows = 500 - 100*nArg;
3467   return SQLITE_OK;
3468 }
3469 
3470 /*
3471 ** This following structure defines all the methods for the
3472 ** completion virtual table.
3473 */
3474 static sqlite3_module completionModule = {
3475   0,                         /* iVersion */
3476   0,                         /* xCreate */
3477   completionConnect,         /* xConnect */
3478   completionBestIndex,       /* xBestIndex */
3479   completionDisconnect,      /* xDisconnect */
3480   0,                         /* xDestroy */
3481   completionOpen,            /* xOpen - open a cursor */
3482   completionClose,           /* xClose - close a cursor */
3483   completionFilter,          /* xFilter - configure scan constraints */
3484   completionNext,            /* xNext - advance a cursor */
3485   completionEof,             /* xEof - check for end of scan */
3486   completionColumn,          /* xColumn - read data */
3487   completionRowid,           /* xRowid - read data */
3488   0,                         /* xUpdate */
3489   0,                         /* xBegin */
3490   0,                         /* xSync */
3491   0,                         /* xCommit */
3492   0,                         /* xRollback */
3493   0,                         /* xFindMethod */
3494   0,                         /* xRename */
3495   0,                         /* xSavepoint */
3496   0,                         /* xRelease */
3497   0,                         /* xRollbackTo */
3498   0                          /* xShadowName */
3499 };
3500 
3501 #endif /* SQLITE_OMIT_VIRTUALTABLE */
3502 
3503 int sqlite3CompletionVtabInit(sqlite3 *db){
3504   int rc = SQLITE_OK;
3505 #ifndef SQLITE_OMIT_VIRTUALTABLE
3506   rc = sqlite3_create_module(db, "completion", &completionModule, 0);
3507 #endif
3508   return rc;
3509 }
3510 
3511 #ifdef _WIN32
3512 
3513 #endif
3514 int sqlite3_completion_init(
3515   sqlite3 *db,
3516   char **pzErrMsg,
3517   const sqlite3_api_routines *pApi
3518 ){
3519   int rc = SQLITE_OK;
3520   SQLITE_EXTENSION_INIT2(pApi);
3521   (void)(pzErrMsg);  /* Unused parameter */
3522 #ifndef SQLITE_OMIT_VIRTUALTABLE
3523   rc = sqlite3CompletionVtabInit(db);
3524 #endif
3525   return rc;
3526 }
3527 
3528 /************************* End ../ext/misc/completion.c ********************/
3529 /************************* Begin ../ext/misc/appendvfs.c ******************/
3530 /*
3531 ** 2017-10-20
3532 **
3533 ** The author disclaims copyright to this source code.  In place of
3534 ** a legal notice, here is a blessing:
3535 **
3536 **    May you do good and not evil.
3537 **    May you find forgiveness for yourself and forgive others.
3538 **    May you share freely, never taking more than you give.
3539 **
3540 ******************************************************************************
3541 **
3542 ** This file implements a VFS shim that allows an SQLite database to be
3543 ** appended onto the end of some other file, such as an executable.
3544 **
3545 ** A special record must appear at the end of the file that identifies the
3546 ** file as an appended database and provides an offset to page 1.  For
3547 ** best performance page 1 should be located at a disk page boundary, though
3548 ** that is not required.
3549 **
3550 ** When opening a database using this VFS, the connection might treat
3551 ** the file as an ordinary SQLite database, or it might treat is as a
3552 ** database appended onto some other file.  Here are the rules:
3553 **
3554 **  (1)  When opening a new empty file, that file is treated as an ordinary
3555 **       database.
3556 **
3557 **  (2)  When opening a file that begins with the standard SQLite prefix
3558 **       string "SQLite format 3", that file is treated as an ordinary
3559 **       database.
3560 **
3561 **  (3)  When opening a file that ends with the appendvfs trailer string
3562 **       "Start-Of-SQLite3-NNNNNNNN" that file is treated as an appended
3563 **       database.
3564 **
3565 **  (4)  If none of the above apply and the SQLITE_OPEN_CREATE flag is
3566 **       set, then a new database is appended to the already existing file.
3567 **
3568 **  (5)  Otherwise, SQLITE_CANTOPEN is returned.
3569 **
3570 ** To avoid unnecessary complications with the PENDING_BYTE, the size of
3571 ** the file containing the database is limited to 1GB.  This VFS will refuse
3572 ** to read or write past the 1GB mark.  This restriction might be lifted in
3573 ** future versions.  For now, if you need a large database, then keep the
3574 ** database in a separate file.
3575 **
3576 ** If the file being opened is not an appended database, then this shim is
3577 ** a pass-through into the default underlying VFS.
3578 **/
3579 /* #include "sqlite3ext.h" */
3580 SQLITE_EXTENSION_INIT1
3581 #include <string.h>
3582 #include <assert.h>
3583 
3584 /* The append mark at the end of the database is:
3585 **
3586 **     Start-Of-SQLite3-NNNNNNNN
3587 **     123456789 123456789 12345
3588 **
3589 ** The NNNNNNNN represents a 64-bit big-endian unsigned integer which is
3590 ** the offset to page 1.
3591 */
3592 #define APND_MARK_PREFIX     "Start-Of-SQLite3-"
3593 #define APND_MARK_PREFIX_SZ  17
3594 #define APND_MARK_SIZE       25
3595 
3596 /*
3597 ** Maximum size of the combined prefix + database + append-mark.  This
3598 ** must be less than 0x40000000 to avoid locking issues on Windows.
3599 */
3600 #define APND_MAX_SIZE  (65536*15259)
3601 
3602 /*
3603 ** Forward declaration of objects used by this utility
3604 */
3605 typedef struct sqlite3_vfs ApndVfs;
3606 typedef struct ApndFile ApndFile;
3607 
3608 /* Access to a lower-level VFS that (might) implement dynamic loading,
3609 ** access to randomness, etc.
3610 */
3611 #define ORIGVFS(p)  ((sqlite3_vfs*)((p)->pAppData))
3612 #define ORIGFILE(p) ((sqlite3_file*)(((ApndFile*)(p))+1))
3613 
3614 /* An open file */
3615 struct ApndFile {
3616   sqlite3_file base;              /* IO methods */
3617   sqlite3_int64 iPgOne;           /* File offset to page 1 */
3618   sqlite3_int64 iMark;            /* Start of the append-mark */
3619 };
3620 
3621 /*
3622 ** Methods for ApndFile
3623 */
3624 static int apndClose(sqlite3_file*);
3625 static int apndRead(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst);
3626 static int apndWrite(sqlite3_file*,const void*,int iAmt, sqlite3_int64 iOfst);
3627 static int apndTruncate(sqlite3_file*, sqlite3_int64 size);
3628 static int apndSync(sqlite3_file*, int flags);
3629 static int apndFileSize(sqlite3_file*, sqlite3_int64 *pSize);
3630 static int apndLock(sqlite3_file*, int);
3631 static int apndUnlock(sqlite3_file*, int);
3632 static int apndCheckReservedLock(sqlite3_file*, int *pResOut);
3633 static int apndFileControl(sqlite3_file*, int op, void *pArg);
3634 static int apndSectorSize(sqlite3_file*);
3635 static int apndDeviceCharacteristics(sqlite3_file*);
3636 static int apndShmMap(sqlite3_file*, int iPg, int pgsz, int, void volatile**);
3637 static int apndShmLock(sqlite3_file*, int offset, int n, int flags);
3638 static void apndShmBarrier(sqlite3_file*);
3639 static int apndShmUnmap(sqlite3_file*, int deleteFlag);
3640 static int apndFetch(sqlite3_file*, sqlite3_int64 iOfst, int iAmt, void **pp);
3641 static int apndUnfetch(sqlite3_file*, sqlite3_int64 iOfst, void *p);
3642 
3643 /*
3644 ** Methods for ApndVfs
3645 */
3646 static int apndOpen(sqlite3_vfs*, const char *, sqlite3_file*, int , int *);
3647 static int apndDelete(sqlite3_vfs*, const char *zName, int syncDir);
3648 static int apndAccess(sqlite3_vfs*, const char *zName, int flags, int *);
3649 static int apndFullPathname(sqlite3_vfs*, const char *zName, int, char *zOut);
3650 static void *apndDlOpen(sqlite3_vfs*, const char *zFilename);
3651 static void apndDlError(sqlite3_vfs*, int nByte, char *zErrMsg);
3652 static void (*apndDlSym(sqlite3_vfs *pVfs, void *p, const char*zSym))(void);
3653 static void apndDlClose(sqlite3_vfs*, void*);
3654 static int apndRandomness(sqlite3_vfs*, int nByte, char *zOut);
3655 static int apndSleep(sqlite3_vfs*, int microseconds);
3656 static int apndCurrentTime(sqlite3_vfs*, double*);
3657 static int apndGetLastError(sqlite3_vfs*, int, char *);
3658 static int apndCurrentTimeInt64(sqlite3_vfs*, sqlite3_int64*);
3659 static int apndSetSystemCall(sqlite3_vfs*, const char*,sqlite3_syscall_ptr);
3660 static sqlite3_syscall_ptr apndGetSystemCall(sqlite3_vfs*, const char *z);
3661 static const char *apndNextSystemCall(sqlite3_vfs*, const char *zName);
3662 
3663 static sqlite3_vfs apnd_vfs = {
3664   3,                            /* iVersion (set when registered) */
3665   0,                            /* szOsFile (set when registered) */
3666   1024,                         /* mxPathname */
3667   0,                            /* pNext */
3668   "apndvfs",                    /* zName */
3669   0,                            /* pAppData (set when registered) */
3670   apndOpen,                     /* xOpen */
3671   apndDelete,                   /* xDelete */
3672   apndAccess,                   /* xAccess */
3673   apndFullPathname,             /* xFullPathname */
3674   apndDlOpen,                   /* xDlOpen */
3675   apndDlError,                  /* xDlError */
3676   apndDlSym,                    /* xDlSym */
3677   apndDlClose,                  /* xDlClose */
3678   apndRandomness,               /* xRandomness */
3679   apndSleep,                    /* xSleep */
3680   apndCurrentTime,              /* xCurrentTime */
3681   apndGetLastError,             /* xGetLastError */
3682   apndCurrentTimeInt64,         /* xCurrentTimeInt64 */
3683   apndSetSystemCall,            /* xSetSystemCall */
3684   apndGetSystemCall,            /* xGetSystemCall */
3685   apndNextSystemCall            /* xNextSystemCall */
3686 };
3687 
3688 static const sqlite3_io_methods apnd_io_methods = {
3689   3,                              /* iVersion */
3690   apndClose,                      /* xClose */
3691   apndRead,                       /* xRead */
3692   apndWrite,                      /* xWrite */
3693   apndTruncate,                   /* xTruncate */
3694   apndSync,                       /* xSync */
3695   apndFileSize,                   /* xFileSize */
3696   apndLock,                       /* xLock */
3697   apndUnlock,                     /* xUnlock */
3698   apndCheckReservedLock,          /* xCheckReservedLock */
3699   apndFileControl,                /* xFileControl */
3700   apndSectorSize,                 /* xSectorSize */
3701   apndDeviceCharacteristics,      /* xDeviceCharacteristics */
3702   apndShmMap,                     /* xShmMap */
3703   apndShmLock,                    /* xShmLock */
3704   apndShmBarrier,                 /* xShmBarrier */
3705   apndShmUnmap,                   /* xShmUnmap */
3706   apndFetch,                      /* xFetch */
3707   apndUnfetch                     /* xUnfetch */
3708 };
3709 
3710 
3711 
3712 /*
3713 ** Close an apnd-file.
3714 */
3715 static int apndClose(sqlite3_file *pFile){
3716   pFile = ORIGFILE(pFile);
3717   return pFile->pMethods->xClose(pFile);
3718 }
3719 
3720 /*
3721 ** Read data from an apnd-file.
3722 */
3723 static int apndRead(
3724   sqlite3_file *pFile,
3725   void *zBuf,
3726   int iAmt,
3727   sqlite_int64 iOfst
3728 ){
3729   ApndFile *p = (ApndFile *)pFile;
3730   pFile = ORIGFILE(pFile);
3731   return pFile->pMethods->xRead(pFile, zBuf, iAmt, iOfst+p->iPgOne);
3732 }
3733 
3734 /*
3735 ** Add the append-mark onto the end of the file.
3736 */
3737 static int apndWriteMark(ApndFile *p, sqlite3_file *pFile){
3738   int i;
3739   unsigned char a[APND_MARK_SIZE];
3740   memcpy(a, APND_MARK_PREFIX, APND_MARK_PREFIX_SZ);
3741   for(i=0; i<8; i++){
3742     a[APND_MARK_PREFIX_SZ+i] = (p->iPgOne >> (56 - i*8)) & 0xff;
3743   }
3744   return pFile->pMethods->xWrite(pFile, a, APND_MARK_SIZE, p->iMark);
3745 }
3746 
3747 /*
3748 ** Write data to an apnd-file.
3749 */
3750 static int apndWrite(
3751   sqlite3_file *pFile,
3752   const void *zBuf,
3753   int iAmt,
3754   sqlite_int64 iOfst
3755 ){
3756   int rc;
3757   ApndFile *p = (ApndFile *)pFile;
3758   pFile = ORIGFILE(pFile);
3759   if( iOfst+iAmt>=APND_MAX_SIZE ) return SQLITE_FULL;
3760   rc = pFile->pMethods->xWrite(pFile, zBuf, iAmt, iOfst+p->iPgOne);
3761   if( rc==SQLITE_OK &&  iOfst + iAmt + p->iPgOne > p->iMark ){
3762     sqlite3_int64 sz = 0;
3763     rc = pFile->pMethods->xFileSize(pFile, &sz);
3764     if( rc==SQLITE_OK ){
3765       p->iMark = sz - APND_MARK_SIZE;
3766       if( iOfst + iAmt + p->iPgOne > p->iMark ){
3767         p->iMark = p->iPgOne + iOfst + iAmt;
3768         rc = apndWriteMark(p, pFile);
3769       }
3770     }
3771   }
3772   return rc;
3773 }
3774 
3775 /*
3776 ** Truncate an apnd-file.
3777 */
3778 static int apndTruncate(sqlite3_file *pFile, sqlite_int64 size){
3779   int rc;
3780   ApndFile *p = (ApndFile *)pFile;
3781   pFile = ORIGFILE(pFile);
3782   rc = pFile->pMethods->xTruncate(pFile, size+p->iPgOne+APND_MARK_SIZE);
3783   if( rc==SQLITE_OK ){
3784     p->iMark = p->iPgOne+size;
3785     rc = apndWriteMark(p, pFile);
3786   }
3787   return rc;
3788 }
3789 
3790 /*
3791 ** Sync an apnd-file.
3792 */
3793 static int apndSync(sqlite3_file *pFile, int flags){
3794   pFile = ORIGFILE(pFile);
3795   return pFile->pMethods->xSync(pFile, flags);
3796 }
3797 
3798 /*
3799 ** Return the current file-size of an apnd-file.
3800 */
3801 static int apndFileSize(sqlite3_file *pFile, sqlite_int64 *pSize){
3802   ApndFile *p = (ApndFile *)pFile;
3803   int rc;
3804   pFile = ORIGFILE(p);
3805   rc = pFile->pMethods->xFileSize(pFile, pSize);
3806   if( rc==SQLITE_OK && p->iPgOne ){
3807     *pSize -= p->iPgOne + APND_MARK_SIZE;
3808   }
3809   return rc;
3810 }
3811 
3812 /*
3813 ** Lock an apnd-file.
3814 */
3815 static int apndLock(sqlite3_file *pFile, int eLock){
3816   pFile = ORIGFILE(pFile);
3817   return pFile->pMethods->xLock(pFile, eLock);
3818 }
3819 
3820 /*
3821 ** Unlock an apnd-file.
3822 */
3823 static int apndUnlock(sqlite3_file *pFile, int eLock){
3824   pFile = ORIGFILE(pFile);
3825   return pFile->pMethods->xUnlock(pFile, eLock);
3826 }
3827 
3828 /*
3829 ** Check if another file-handle holds a RESERVED lock on an apnd-file.
3830 */
3831 static int apndCheckReservedLock(sqlite3_file *pFile, int *pResOut){
3832   pFile = ORIGFILE(pFile);
3833   return pFile->pMethods->xCheckReservedLock(pFile, pResOut);
3834 }
3835 
3836 /*
3837 ** File control method. For custom operations on an apnd-file.
3838 */
3839 static int apndFileControl(sqlite3_file *pFile, int op, void *pArg){
3840   ApndFile *p = (ApndFile *)pFile;
3841   int rc;
3842   pFile = ORIGFILE(pFile);
3843   rc = pFile->pMethods->xFileControl(pFile, op, pArg);
3844   if( rc==SQLITE_OK && op==SQLITE_FCNTL_VFSNAME ){
3845     *(char**)pArg = sqlite3_mprintf("apnd(%lld)/%z", p->iPgOne, *(char**)pArg);
3846   }
3847   return rc;
3848 }
3849 
3850 /*
3851 ** Return the sector-size in bytes for an apnd-file.
3852 */
3853 static int apndSectorSize(sqlite3_file *pFile){
3854   pFile = ORIGFILE(pFile);
3855   return pFile->pMethods->xSectorSize(pFile);
3856 }
3857 
3858 /*
3859 ** Return the device characteristic flags supported by an apnd-file.
3860 */
3861 static int apndDeviceCharacteristics(sqlite3_file *pFile){
3862   pFile = ORIGFILE(pFile);
3863   return pFile->pMethods->xDeviceCharacteristics(pFile);
3864 }
3865 
3866 /* Create a shared memory file mapping */
3867 static int apndShmMap(
3868   sqlite3_file *pFile,
3869   int iPg,
3870   int pgsz,
3871   int bExtend,
3872   void volatile **pp
3873 ){
3874   pFile = ORIGFILE(pFile);
3875   return pFile->pMethods->xShmMap(pFile,iPg,pgsz,bExtend,pp);
3876 }
3877 
3878 /* Perform locking on a shared-memory segment */
3879 static int apndShmLock(sqlite3_file *pFile, int offset, int n, int flags){
3880   pFile = ORIGFILE(pFile);
3881   return pFile->pMethods->xShmLock(pFile,offset,n,flags);
3882 }
3883 
3884 /* Memory barrier operation on shared memory */
3885 static void apndShmBarrier(sqlite3_file *pFile){
3886   pFile = ORIGFILE(pFile);
3887   pFile->pMethods->xShmBarrier(pFile);
3888 }
3889 
3890 /* Unmap a shared memory segment */
3891 static int apndShmUnmap(sqlite3_file *pFile, int deleteFlag){
3892   pFile = ORIGFILE(pFile);
3893   return pFile->pMethods->xShmUnmap(pFile,deleteFlag);
3894 }
3895 
3896 /* Fetch a page of a memory-mapped file */
3897 static int apndFetch(
3898   sqlite3_file *pFile,
3899   sqlite3_int64 iOfst,
3900   int iAmt,
3901   void **pp
3902 ){
3903   ApndFile *p = (ApndFile *)pFile;
3904   pFile = ORIGFILE(pFile);
3905   return pFile->pMethods->xFetch(pFile, iOfst+p->iPgOne, iAmt, pp);
3906 }
3907 
3908 /* Release a memory-mapped page */
3909 static int apndUnfetch(sqlite3_file *pFile, sqlite3_int64 iOfst, void *pPage){
3910   ApndFile *p = (ApndFile *)pFile;
3911   pFile = ORIGFILE(pFile);
3912   return pFile->pMethods->xUnfetch(pFile, iOfst+p->iPgOne, pPage);
3913 }
3914 
3915 /*
3916 ** Check to see if the file is an ordinary SQLite database file.
3917 */
3918 static int apndIsOrdinaryDatabaseFile(sqlite3_int64 sz, sqlite3_file *pFile){
3919   int rc;
3920   char zHdr[16];
3921   static const char aSqliteHdr[] = "SQLite format 3";
3922   if( sz<512 ) return 0;
3923   rc = pFile->pMethods->xRead(pFile, zHdr, sizeof(zHdr), 0);
3924   if( rc ) return 0;
3925   return memcmp(zHdr, aSqliteHdr, sizeof(zHdr))==0;
3926 }
3927 
3928 /*
3929 ** Try to read the append-mark off the end of a file.  Return the
3930 ** start of the appended database if the append-mark is present.  If
3931 ** there is no append-mark, return -1;
3932 */
3933 static sqlite3_int64 apndReadMark(sqlite3_int64 sz, sqlite3_file *pFile){
3934   int rc, i;
3935   sqlite3_int64 iMark;
3936   unsigned char a[APND_MARK_SIZE];
3937 
3938   if( sz<=APND_MARK_SIZE ) return -1;
3939   rc = pFile->pMethods->xRead(pFile, a, APND_MARK_SIZE, sz-APND_MARK_SIZE);
3940   if( rc ) return -1;
3941   if( memcmp(a, APND_MARK_PREFIX, APND_MARK_PREFIX_SZ)!=0 ) return -1;
3942   iMark = ((sqlite3_int64)(a[APND_MARK_PREFIX_SZ]&0x7f))<<56;
3943   for(i=1; i<8; i++){
3944     iMark += (sqlite3_int64)a[APND_MARK_PREFIX_SZ+i]<<(56-8*i);
3945   }
3946   return iMark;
3947 }
3948 
3949 /*
3950 ** Open an apnd file handle.
3951 */
3952 static int apndOpen(
3953   sqlite3_vfs *pVfs,
3954   const char *zName,
3955   sqlite3_file *pFile,
3956   int flags,
3957   int *pOutFlags
3958 ){
3959   ApndFile *p;
3960   sqlite3_file *pSubFile;
3961   sqlite3_vfs *pSubVfs;
3962   int rc;
3963   sqlite3_int64 sz;
3964   pSubVfs = ORIGVFS(pVfs);
3965   if( (flags & SQLITE_OPEN_MAIN_DB)==0 ){
3966     return pSubVfs->xOpen(pSubVfs, zName, pFile, flags, pOutFlags);
3967   }
3968   p = (ApndFile*)pFile;
3969   memset(p, 0, sizeof(*p));
3970   pSubFile = ORIGFILE(pFile);
3971   p->base.pMethods = &apnd_io_methods;
3972   rc = pSubVfs->xOpen(pSubVfs, zName, pSubFile, flags, pOutFlags);
3973   if( rc ) goto apnd_open_done;
3974   rc = pSubFile->pMethods->xFileSize(pSubFile, &sz);
3975   if( rc ){
3976     pSubFile->pMethods->xClose(pSubFile);
3977     goto apnd_open_done;
3978   }
3979   if( apndIsOrdinaryDatabaseFile(sz, pSubFile) ){
3980     memmove(pFile, pSubFile, pSubVfs->szOsFile);
3981     return SQLITE_OK;
3982   }
3983   p->iMark = 0;
3984   p->iPgOne = apndReadMark(sz, pFile);
3985   if( p->iPgOne>0 ){
3986     return SQLITE_OK;
3987   }
3988   if( (flags & SQLITE_OPEN_CREATE)==0 ){
3989     pSubFile->pMethods->xClose(pSubFile);
3990     rc = SQLITE_CANTOPEN;
3991   }
3992   p->iPgOne = (sz+0xfff) & ~(sqlite3_int64)0xfff;
3993 apnd_open_done:
3994   if( rc ) pFile->pMethods = 0;
3995   return rc;
3996 }
3997 
3998 /*
3999 ** All other VFS methods are pass-thrus.
4000 */
4001 static int apndDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){
4002   return ORIGVFS(pVfs)->xDelete(ORIGVFS(pVfs), zPath, dirSync);
4003 }
4004 static int apndAccess(
4005   sqlite3_vfs *pVfs,
4006   const char *zPath,
4007   int flags,
4008   int *pResOut
4009 ){
4010   return ORIGVFS(pVfs)->xAccess(ORIGVFS(pVfs), zPath, flags, pResOut);
4011 }
4012 static int apndFullPathname(
4013   sqlite3_vfs *pVfs,
4014   const char *zPath,
4015   int nOut,
4016   char *zOut
4017 ){
4018   return ORIGVFS(pVfs)->xFullPathname(ORIGVFS(pVfs),zPath,nOut,zOut);
4019 }
4020 static void *apndDlOpen(sqlite3_vfs *pVfs, const char *zPath){
4021   return ORIGVFS(pVfs)->xDlOpen(ORIGVFS(pVfs), zPath);
4022 }
4023 static void apndDlError(sqlite3_vfs *pVfs, int nByte, char *zErrMsg){
4024   ORIGVFS(pVfs)->xDlError(ORIGVFS(pVfs), nByte, zErrMsg);
4025 }
4026 static void (*apndDlSym(sqlite3_vfs *pVfs, void *p, const char *zSym))(void){
4027   return ORIGVFS(pVfs)->xDlSym(ORIGVFS(pVfs), p, zSym);
4028 }
4029 static void apndDlClose(sqlite3_vfs *pVfs, void *pHandle){
4030   ORIGVFS(pVfs)->xDlClose(ORIGVFS(pVfs), pHandle);
4031 }
4032 static int apndRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){
4033   return ORIGVFS(pVfs)->xRandomness(ORIGVFS(pVfs), nByte, zBufOut);
4034 }
4035 static int apndSleep(sqlite3_vfs *pVfs, int nMicro){
4036   return ORIGVFS(pVfs)->xSleep(ORIGVFS(pVfs), nMicro);
4037 }
4038 static int apndCurrentTime(sqlite3_vfs *pVfs, double *pTimeOut){
4039   return ORIGVFS(pVfs)->xCurrentTime(ORIGVFS(pVfs), pTimeOut);
4040 }
4041 static int apndGetLastError(sqlite3_vfs *pVfs, int a, char *b){
4042   return ORIGVFS(pVfs)->xGetLastError(ORIGVFS(pVfs), a, b);
4043 }
4044 static int apndCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *p){
4045   return ORIGVFS(pVfs)->xCurrentTimeInt64(ORIGVFS(pVfs), p);
4046 }
4047 static int apndSetSystemCall(
4048   sqlite3_vfs *pVfs,
4049   const char *zName,
4050   sqlite3_syscall_ptr pCall
4051 ){
4052   return ORIGVFS(pVfs)->xSetSystemCall(ORIGVFS(pVfs),zName,pCall);
4053 }
4054 static sqlite3_syscall_ptr apndGetSystemCall(
4055   sqlite3_vfs *pVfs,
4056   const char *zName
4057 ){
4058   return ORIGVFS(pVfs)->xGetSystemCall(ORIGVFS(pVfs),zName);
4059 }
4060 static const char *apndNextSystemCall(sqlite3_vfs *pVfs, const char *zName){
4061   return ORIGVFS(pVfs)->xNextSystemCall(ORIGVFS(pVfs), zName);
4062 }
4063 
4064 
4065 #ifdef _WIN32
4066 
4067 #endif
4068 /*
4069 ** This routine is called when the extension is loaded.
4070 ** Register the new VFS.
4071 */
4072 int sqlite3_appendvfs_init(
4073   sqlite3 *db,
4074   char **pzErrMsg,
4075   const sqlite3_api_routines *pApi
4076 ){
4077   int rc = SQLITE_OK;
4078   sqlite3_vfs *pOrig;
4079   SQLITE_EXTENSION_INIT2(pApi);
4080   (void)pzErrMsg;
4081   (void)db;
4082   pOrig = sqlite3_vfs_find(0);
4083   apnd_vfs.iVersion = pOrig->iVersion;
4084   apnd_vfs.pAppData = pOrig;
4085   apnd_vfs.szOsFile = pOrig->szOsFile + sizeof(ApndFile);
4086   rc = sqlite3_vfs_register(&apnd_vfs, 0);
4087 #ifdef APPENDVFS_TEST
4088   if( rc==SQLITE_OK ){
4089     rc = sqlite3_auto_extension((void(*)(void))apndvfsRegister);
4090   }
4091 #endif
4092   if( rc==SQLITE_OK ) rc = SQLITE_OK_LOAD_PERMANENTLY;
4093   return rc;
4094 }
4095 
4096 /************************* End ../ext/misc/appendvfs.c ********************/
4097 /************************* Begin ../ext/misc/memtrace.c ******************/
4098 /*
4099 ** 2019-01-21
4100 **
4101 ** The author disclaims copyright to this source code.  In place of
4102 ** a legal notice, here is a blessing:
4103 **
4104 **    May you do good and not evil.
4105 **    May you find forgiveness for yourself and forgive others.
4106 **    May you share freely, never taking more than you give.
4107 **
4108 *************************************************************************
4109 **
4110 ** This file implements an extension that uses the SQLITE_CONFIG_MALLOC
4111 ** mechanism to add a tracing layer on top of SQLite.  If this extension
4112 ** is registered prior to sqlite3_initialize(), it will cause all memory
4113 ** allocation activities to be logged on standard output, or to some other
4114 ** FILE specified by the initializer.
4115 **
4116 ** This file needs to be compiled into the application that uses it.
4117 **
4118 ** This extension is used to implement the --memtrace option of the
4119 ** command-line shell.
4120 */
4121 #include <assert.h>
4122 #include <string.h>
4123 #include <stdio.h>
4124 
4125 /* The original memory allocation routines */
4126 static sqlite3_mem_methods memtraceBase;
4127 static FILE *memtraceOut;
4128 
4129 /* Methods that trace memory allocations */
4130 static void *memtraceMalloc(int n){
4131   if( memtraceOut ){
4132     fprintf(memtraceOut, "MEMTRACE: allocate %d bytes\n",
4133             memtraceBase.xRoundup(n));
4134   }
4135   return memtraceBase.xMalloc(n);
4136 }
4137 static void memtraceFree(void *p){
4138   if( p==0 ) return;
4139   if( memtraceOut ){
4140     fprintf(memtraceOut, "MEMTRACE: free %d bytes\n", memtraceBase.xSize(p));
4141   }
4142   memtraceBase.xFree(p);
4143 }
4144 static void *memtraceRealloc(void *p, int n){
4145   if( p==0 ) return memtraceMalloc(n);
4146   if( n==0 ){
4147     memtraceFree(p);
4148     return 0;
4149   }
4150   if( memtraceOut ){
4151     fprintf(memtraceOut, "MEMTRACE: resize %d -> %d bytes\n",
4152             memtraceBase.xSize(p), memtraceBase.xRoundup(n));
4153   }
4154   return memtraceBase.xRealloc(p, n);
4155 }
4156 static int memtraceSize(void *p){
4157   return memtraceBase.xSize(p);
4158 }
4159 static int memtraceRoundup(int n){
4160   return memtraceBase.xRoundup(n);
4161 }
4162 static int memtraceInit(void *p){
4163   return memtraceBase.xInit(p);
4164 }
4165 static void memtraceShutdown(void *p){
4166   memtraceBase.xShutdown(p);
4167 }
4168 
4169 /* The substitute memory allocator */
4170 static sqlite3_mem_methods ersaztMethods = {
4171   memtraceMalloc,
4172   memtraceFree,
4173   memtraceRealloc,
4174   memtraceSize,
4175   memtraceRoundup,
4176   memtraceInit,
4177   memtraceShutdown,
4178   0
4179 };
4180 
4181 /* Begin tracing memory allocations to out. */
4182 int sqlite3MemTraceActivate(FILE *out){
4183   int rc = SQLITE_OK;
4184   if( memtraceBase.xMalloc==0 ){
4185     rc = sqlite3_config(SQLITE_CONFIG_GETMALLOC, &memtraceBase);
4186     if( rc==SQLITE_OK ){
4187       rc = sqlite3_config(SQLITE_CONFIG_MALLOC, &ersaztMethods);
4188     }
4189   }
4190   memtraceOut = out;
4191   return rc;
4192 }
4193 
4194 /* Deactivate memory tracing */
4195 int sqlite3MemTraceDeactivate(void){
4196   int rc = SQLITE_OK;
4197   if( memtraceBase.xMalloc!=0 ){
4198     rc = sqlite3_config(SQLITE_CONFIG_MALLOC, &memtraceBase);
4199     if( rc==SQLITE_OK ){
4200       memset(&memtraceBase, 0, sizeof(memtraceBase));
4201     }
4202   }
4203   memtraceOut = 0;
4204   return rc;
4205 }
4206 
4207 /************************* End ../ext/misc/memtrace.c ********************/
4208 #ifdef SQLITE_HAVE_ZLIB
4209 /************************* Begin ../ext/misc/zipfile.c ******************/
4210 /*
4211 ** 2017-12-26
4212 **
4213 ** The author disclaims copyright to this source code.  In place of
4214 ** a legal notice, here is a blessing:
4215 **
4216 **    May you do good and not evil.
4217 **    May you find forgiveness for yourself and forgive others.
4218 **    May you share freely, never taking more than you give.
4219 **
4220 ******************************************************************************
4221 **
4222 ** This file implements a virtual table for reading and writing ZIP archive
4223 ** files.
4224 **
4225 ** Usage example:
4226 **
4227 **     SELECT name, sz, datetime(mtime,'unixepoch') FROM zipfile($filename);
4228 **
4229 ** Current limitations:
4230 **
4231 **    *  No support for encryption
4232 **    *  No support for ZIP archives spanning multiple files
4233 **    *  No support for zip64 extensions
4234 **    *  Only the "inflate/deflate" (zlib) compression method is supported
4235 */
4236 /* #include "sqlite3ext.h" */
4237 SQLITE_EXTENSION_INIT1
4238 #include <stdio.h>
4239 #include <string.h>
4240 #include <assert.h>
4241 
4242 #include <zlib.h>
4243 
4244 #ifndef SQLITE_OMIT_VIRTUALTABLE
4245 
4246 #ifndef SQLITE_AMALGAMATION
4247 
4248 /* typedef sqlite3_int64 i64; */
4249 /* typedef unsigned char u8; */
4250 typedef unsigned short u16;
4251 typedef unsigned long u32;
4252 #define MIN(a,b) ((a)<(b) ? (a) : (b))
4253 
4254 #if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST)
4255 # define ALWAYS(X)      (1)
4256 # define NEVER(X)       (0)
4257 #elif !defined(NDEBUG)
4258 # define ALWAYS(X)      ((X)?1:(assert(0),0))
4259 # define NEVER(X)       ((X)?(assert(0),1):0)
4260 #else
4261 # define ALWAYS(X)      (X)
4262 # define NEVER(X)       (X)
4263 #endif
4264 
4265 #endif   /* SQLITE_AMALGAMATION */
4266 
4267 /*
4268 ** Definitions for mode bitmasks S_IFDIR, S_IFREG and S_IFLNK.
4269 **
4270 ** In some ways it would be better to obtain these values from system
4271 ** header files. But, the dependency is undesirable and (a) these
4272 ** have been stable for decades, (b) the values are part of POSIX and
4273 ** are also made explicit in [man stat], and (c) are part of the
4274 ** file format for zip archives.
4275 */
4276 #ifndef S_IFDIR
4277 # define S_IFDIR 0040000
4278 #endif
4279 #ifndef S_IFREG
4280 # define S_IFREG 0100000
4281 #endif
4282 #ifndef S_IFLNK
4283 # define S_IFLNK 0120000
4284 #endif
4285 
4286 static const char ZIPFILE_SCHEMA[] =
4287   "CREATE TABLE y("
4288     "name PRIMARY KEY,"  /* 0: Name of file in zip archive */
4289     "mode,"              /* 1: POSIX mode for file */
4290     "mtime,"             /* 2: Last modification time (secs since 1970)*/
4291     "sz,"                /* 3: Size of object */
4292     "rawdata,"           /* 4: Raw data */
4293     "data,"              /* 5: Uncompressed data */
4294     "method,"            /* 6: Compression method (integer) */
4295     "z HIDDEN"           /* 7: Name of zip file */
4296   ") WITHOUT ROWID;";
4297 
4298 #define ZIPFILE_F_COLUMN_IDX 7    /* Index of column "file" in the above */
4299 #define ZIPFILE_BUFFER_SIZE (64*1024)
4300 
4301 
4302 /*
4303 ** Magic numbers used to read and write zip files.
4304 **
4305 ** ZIPFILE_NEWENTRY_MADEBY:
4306 **   Use this value for the "version-made-by" field in new zip file
4307 **   entries. The upper byte indicates "unix", and the lower byte
4308 **   indicates that the zip file matches pkzip specification 3.0.
4309 **   This is what info-zip seems to do.
4310 **
4311 ** ZIPFILE_NEWENTRY_REQUIRED:
4312 **   Value for "version-required-to-extract" field of new entries.
4313 **   Version 2.0 is required to support folders and deflate compression.
4314 **
4315 ** ZIPFILE_NEWENTRY_FLAGS:
4316 **   Value for "general-purpose-bit-flags" field of new entries. Bit
4317 **   11 means "utf-8 filename and comment".
4318 **
4319 ** ZIPFILE_SIGNATURE_CDS:
4320 **   First 4 bytes of a valid CDS record.
4321 **
4322 ** ZIPFILE_SIGNATURE_LFH:
4323 **   First 4 bytes of a valid LFH record.
4324 **
4325 ** ZIPFILE_SIGNATURE_EOCD
4326 **   First 4 bytes of a valid EOCD record.
4327 */
4328 #define ZIPFILE_EXTRA_TIMESTAMP   0x5455
4329 #define ZIPFILE_NEWENTRY_MADEBY   ((3<<8) + 30)
4330 #define ZIPFILE_NEWENTRY_REQUIRED 20
4331 #define ZIPFILE_NEWENTRY_FLAGS    0x800
4332 #define ZIPFILE_SIGNATURE_CDS     0x02014b50
4333 #define ZIPFILE_SIGNATURE_LFH     0x04034b50
4334 #define ZIPFILE_SIGNATURE_EOCD    0x06054b50
4335 
4336 /*
4337 ** The sizes of the fixed-size part of each of the three main data
4338 ** structures in a zip archive.
4339 */
4340 #define ZIPFILE_LFH_FIXED_SZ      30
4341 #define ZIPFILE_EOCD_FIXED_SZ     22
4342 #define ZIPFILE_CDS_FIXED_SZ      46
4343 
4344 /*
4345 *** 4.3.16  End of central directory record:
4346 ***
4347 ***   end of central dir signature    4 bytes  (0x06054b50)
4348 ***   number of this disk             2 bytes
4349 ***   number of the disk with the
4350 ***   start of the central directory  2 bytes
4351 ***   total number of entries in the
4352 ***   central directory on this disk  2 bytes
4353 ***   total number of entries in
4354 ***   the central directory           2 bytes
4355 ***   size of the central directory   4 bytes
4356 ***   offset of start of central
4357 ***   directory with respect to
4358 ***   the starting disk number        4 bytes
4359 ***   .ZIP file comment length        2 bytes
4360 ***   .ZIP file comment       (variable size)
4361 */
4362 typedef struct ZipfileEOCD ZipfileEOCD;
4363 struct ZipfileEOCD {
4364   u16 iDisk;
4365   u16 iFirstDisk;
4366   u16 nEntry;
4367   u16 nEntryTotal;
4368   u32 nSize;
4369   u32 iOffset;
4370 };
4371 
4372 /*
4373 *** 4.3.12  Central directory structure:
4374 ***
4375 *** ...
4376 ***
4377 ***   central file header signature   4 bytes  (0x02014b50)
4378 ***   version made by                 2 bytes
4379 ***   version needed to extract       2 bytes
4380 ***   general purpose bit flag        2 bytes
4381 ***   compression method              2 bytes
4382 ***   last mod file time              2 bytes
4383 ***   last mod file date              2 bytes
4384 ***   crc-32                          4 bytes
4385 ***   compressed size                 4 bytes
4386 ***   uncompressed size               4 bytes
4387 ***   file name length                2 bytes
4388 ***   extra field length              2 bytes
4389 ***   file comment length             2 bytes
4390 ***   disk number start               2 bytes
4391 ***   internal file attributes        2 bytes
4392 ***   external file attributes        4 bytes
4393 ***   relative offset of local header 4 bytes
4394 */
4395 typedef struct ZipfileCDS ZipfileCDS;
4396 struct ZipfileCDS {
4397   u16 iVersionMadeBy;
4398   u16 iVersionExtract;
4399   u16 flags;
4400   u16 iCompression;
4401   u16 mTime;
4402   u16 mDate;
4403   u32 crc32;
4404   u32 szCompressed;
4405   u32 szUncompressed;
4406   u16 nFile;
4407   u16 nExtra;
4408   u16 nComment;
4409   u16 iDiskStart;
4410   u16 iInternalAttr;
4411   u32 iExternalAttr;
4412   u32 iOffset;
4413   char *zFile;                    /* Filename (sqlite3_malloc()) */
4414 };
4415 
4416 /*
4417 *** 4.3.7  Local file header:
4418 ***
4419 ***   local file header signature     4 bytes  (0x04034b50)
4420 ***   version needed to extract       2 bytes
4421 ***   general purpose bit flag        2 bytes
4422 ***   compression method              2 bytes
4423 ***   last mod file time              2 bytes
4424 ***   last mod file date              2 bytes
4425 ***   crc-32                          4 bytes
4426 ***   compressed size                 4 bytes
4427 ***   uncompressed size               4 bytes
4428 ***   file name length                2 bytes
4429 ***   extra field length              2 bytes
4430 ***
4431 */
4432 typedef struct ZipfileLFH ZipfileLFH;
4433 struct ZipfileLFH {
4434   u16 iVersionExtract;
4435   u16 flags;
4436   u16 iCompression;
4437   u16 mTime;
4438   u16 mDate;
4439   u32 crc32;
4440   u32 szCompressed;
4441   u32 szUncompressed;
4442   u16 nFile;
4443   u16 nExtra;
4444 };
4445 
4446 typedef struct ZipfileEntry ZipfileEntry;
4447 struct ZipfileEntry {
4448   ZipfileCDS cds;            /* Parsed CDS record */
4449   u32 mUnixTime;             /* Modification time, in UNIX format */
4450   u8 *aExtra;                /* cds.nExtra+cds.nComment bytes of extra data */
4451   i64 iDataOff;              /* Offset to data in file (if aData==0) */
4452   u8 *aData;                 /* cds.szCompressed bytes of compressed data */
4453   ZipfileEntry *pNext;       /* Next element in in-memory CDS */
4454 };
4455 
4456 /*
4457 ** Cursor type for zipfile tables.
4458 */
4459 typedef struct ZipfileCsr ZipfileCsr;
4460 struct ZipfileCsr {
4461   sqlite3_vtab_cursor base;  /* Base class - must be first */
4462   i64 iId;                   /* Cursor ID */
4463   u8 bEof;                   /* True when at EOF */
4464   u8 bNoop;                  /* If next xNext() call is no-op */
4465 
4466   /* Used outside of write transactions */
4467   FILE *pFile;               /* Zip file */
4468   i64 iNextOff;              /* Offset of next record in central directory */
4469   ZipfileEOCD eocd;          /* Parse of central directory record */
4470 
4471   ZipfileEntry *pFreeEntry;  /* Free this list when cursor is closed or reset */
4472   ZipfileEntry *pCurrent;    /* Current entry */
4473   ZipfileCsr *pCsrNext;      /* Next cursor on same virtual table */
4474 };
4475 
4476 typedef struct ZipfileTab ZipfileTab;
4477 struct ZipfileTab {
4478   sqlite3_vtab base;         /* Base class - must be first */
4479   char *zFile;               /* Zip file this table accesses (may be NULL) */
4480   sqlite3 *db;               /* Host database connection */
4481   u8 *aBuffer;               /* Temporary buffer used for various tasks */
4482 
4483   ZipfileCsr *pCsrList;      /* List of cursors */
4484   i64 iNextCsrid;
4485 
4486   /* The following are used by write transactions only */
4487   ZipfileEntry *pFirstEntry; /* Linked list of all files (if pWriteFd!=0) */
4488   ZipfileEntry *pLastEntry;  /* Last element in pFirstEntry list */
4489   FILE *pWriteFd;            /* File handle open on zip archive */
4490   i64 szCurrent;             /* Current size of zip archive */
4491   i64 szOrig;                /* Size of archive at start of transaction */
4492 };
4493 
4494 /*
4495 ** Set the error message contained in context ctx to the results of
4496 ** vprintf(zFmt, ...).
4497 */
4498 static void zipfileCtxErrorMsg(sqlite3_context *ctx, const char *zFmt, ...){
4499   char *zMsg = 0;
4500   va_list ap;
4501   va_start(ap, zFmt);
4502   zMsg = sqlite3_vmprintf(zFmt, ap);
4503   sqlite3_result_error(ctx, zMsg, -1);
4504   sqlite3_free(zMsg);
4505   va_end(ap);
4506 }
4507 
4508 /*
4509 ** If string zIn is quoted, dequote it in place. Otherwise, if the string
4510 ** is not quoted, do nothing.
4511 */
4512 static void zipfileDequote(char *zIn){
4513   char q = zIn[0];
4514   if( q=='"' || q=='\'' || q=='`' || q=='[' ){
4515     int iIn = 1;
4516     int iOut = 0;
4517     if( q=='[' ) q = ']';
4518     while( ALWAYS(zIn[iIn]) ){
4519       char c = zIn[iIn++];
4520       if( c==q && zIn[iIn++]!=q ) break;
4521       zIn[iOut++] = c;
4522     }
4523     zIn[iOut] = '\0';
4524   }
4525 }
4526 
4527 /*
4528 ** Construct a new ZipfileTab virtual table object.
4529 **
4530 **   argv[0]   -> module name  ("zipfile")
4531 **   argv[1]   -> database name
4532 **   argv[2]   -> table name
4533 **   argv[...] -> "column name" and other module argument fields.
4534 */
4535 static int zipfileConnect(
4536   sqlite3 *db,
4537   void *pAux,
4538   int argc, const char *const*argv,
4539   sqlite3_vtab **ppVtab,
4540   char **pzErr
4541 ){
4542   int nByte = sizeof(ZipfileTab) + ZIPFILE_BUFFER_SIZE;
4543   int nFile = 0;
4544   const char *zFile = 0;
4545   ZipfileTab *pNew = 0;
4546   int rc;
4547 
4548   /* If the table name is not "zipfile", require that the argument be
4549   ** specified. This stops zipfile tables from being created as:
4550   **
4551   **   CREATE VIRTUAL TABLE zzz USING zipfile();
4552   **
4553   ** It does not prevent:
4554   **
4555   **   CREATE VIRTUAL TABLE zipfile USING zipfile();
4556   */
4557   assert( 0==sqlite3_stricmp(argv[0], "zipfile") );
4558   if( (0!=sqlite3_stricmp(argv[2], "zipfile") && argc<4) || argc>4 ){
4559     *pzErr = sqlite3_mprintf("zipfile constructor requires one argument");
4560     return SQLITE_ERROR;
4561   }
4562 
4563   if( argc>3 ){
4564     zFile = argv[3];
4565     nFile = (int)strlen(zFile)+1;
4566   }
4567 
4568   rc = sqlite3_declare_vtab(db, ZIPFILE_SCHEMA);
4569   if( rc==SQLITE_OK ){
4570     pNew = (ZipfileTab*)sqlite3_malloc64((sqlite3_int64)nByte+nFile);
4571     if( pNew==0 ) return SQLITE_NOMEM;
4572     memset(pNew, 0, nByte+nFile);
4573     pNew->db = db;
4574     pNew->aBuffer = (u8*)&pNew[1];
4575     if( zFile ){
4576       pNew->zFile = (char*)&pNew->aBuffer[ZIPFILE_BUFFER_SIZE];
4577       memcpy(pNew->zFile, zFile, nFile);
4578       zipfileDequote(pNew->zFile);
4579     }
4580   }
4581   *ppVtab = (sqlite3_vtab*)pNew;
4582   return rc;
4583 }
4584 
4585 /*
4586 ** Free the ZipfileEntry structure indicated by the only argument.
4587 */
4588 static void zipfileEntryFree(ZipfileEntry *p){
4589   if( p ){
4590     sqlite3_free(p->cds.zFile);
4591     sqlite3_free(p);
4592   }
4593 }
4594 
4595 /*
4596 ** Release resources that should be freed at the end of a write
4597 ** transaction.
4598 */
4599 static void zipfileCleanupTransaction(ZipfileTab *pTab){
4600   ZipfileEntry *pEntry;
4601   ZipfileEntry *pNext;
4602 
4603   if( pTab->pWriteFd ){
4604     fclose(pTab->pWriteFd);
4605     pTab->pWriteFd = 0;
4606   }
4607   for(pEntry=pTab->pFirstEntry; pEntry; pEntry=pNext){
4608     pNext = pEntry->pNext;
4609     zipfileEntryFree(pEntry);
4610   }
4611   pTab->pFirstEntry = 0;
4612   pTab->pLastEntry = 0;
4613   pTab->szCurrent = 0;
4614   pTab->szOrig = 0;
4615 }
4616 
4617 /*
4618 ** This method is the destructor for zipfile vtab objects.
4619 */
4620 static int zipfileDisconnect(sqlite3_vtab *pVtab){
4621   zipfileCleanupTransaction((ZipfileTab*)pVtab);
4622   sqlite3_free(pVtab);
4623   return SQLITE_OK;
4624 }
4625 
4626 /*
4627 ** Constructor for a new ZipfileCsr object.
4628 */
4629 static int zipfileOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCsr){
4630   ZipfileTab *pTab = (ZipfileTab*)p;
4631   ZipfileCsr *pCsr;
4632   pCsr = sqlite3_malloc(sizeof(*pCsr));
4633   *ppCsr = (sqlite3_vtab_cursor*)pCsr;
4634   if( pCsr==0 ){
4635     return SQLITE_NOMEM;
4636   }
4637   memset(pCsr, 0, sizeof(*pCsr));
4638   pCsr->iId = ++pTab->iNextCsrid;
4639   pCsr->pCsrNext = pTab->pCsrList;
4640   pTab->pCsrList = pCsr;
4641   return SQLITE_OK;
4642 }
4643 
4644 /*
4645 ** Reset a cursor back to the state it was in when first returned
4646 ** by zipfileOpen().
4647 */
4648 static void zipfileResetCursor(ZipfileCsr *pCsr){
4649   ZipfileEntry *p;
4650   ZipfileEntry *pNext;
4651 
4652   pCsr->bEof = 0;
4653   if( pCsr->pFile ){
4654     fclose(pCsr->pFile);
4655     pCsr->pFile = 0;
4656     zipfileEntryFree(pCsr->pCurrent);
4657     pCsr->pCurrent = 0;
4658   }
4659 
4660   for(p=pCsr->pFreeEntry; p; p=pNext){
4661     pNext = p->pNext;
4662     zipfileEntryFree(p);
4663   }
4664 }
4665 
4666 /*
4667 ** Destructor for an ZipfileCsr.
4668 */
4669 static int zipfileClose(sqlite3_vtab_cursor *cur){
4670   ZipfileCsr *pCsr = (ZipfileCsr*)cur;
4671   ZipfileTab *pTab = (ZipfileTab*)(pCsr->base.pVtab);
4672   ZipfileCsr **pp;
4673   zipfileResetCursor(pCsr);
4674 
4675   /* Remove this cursor from the ZipfileTab.pCsrList list. */
4676   for(pp=&pTab->pCsrList; *pp!=pCsr; pp=&((*pp)->pCsrNext));
4677   *pp = pCsr->pCsrNext;
4678 
4679   sqlite3_free(pCsr);
4680   return SQLITE_OK;
4681 }
4682 
4683 /*
4684 ** Set the error message for the virtual table associated with cursor
4685 ** pCsr to the results of vprintf(zFmt, ...).
4686 */
4687 static void zipfileTableErr(ZipfileTab *pTab, const char *zFmt, ...){
4688   va_list ap;
4689   va_start(ap, zFmt);
4690   sqlite3_free(pTab->base.zErrMsg);
4691   pTab->base.zErrMsg = sqlite3_vmprintf(zFmt, ap);
4692   va_end(ap);
4693 }
4694 static void zipfileCursorErr(ZipfileCsr *pCsr, const char *zFmt, ...){
4695   va_list ap;
4696   va_start(ap, zFmt);
4697   sqlite3_free(pCsr->base.pVtab->zErrMsg);
4698   pCsr->base.pVtab->zErrMsg = sqlite3_vmprintf(zFmt, ap);
4699   va_end(ap);
4700 }
4701 
4702 /*
4703 ** Read nRead bytes of data from offset iOff of file pFile into buffer
4704 ** aRead[]. Return SQLITE_OK if successful, or an SQLite error code
4705 ** otherwise.
4706 **
4707 ** If an error does occur, output variable (*pzErrmsg) may be set to point
4708 ** to an English language error message. It is the responsibility of the
4709 ** caller to eventually free this buffer using
4710 ** sqlite3_free().
4711 */
4712 static int zipfileReadData(
4713   FILE *pFile,                    /* Read from this file */
4714   u8 *aRead,                      /* Read into this buffer */
4715   int nRead,                      /* Number of bytes to read */
4716   i64 iOff,                       /* Offset to read from */
4717   char **pzErrmsg                 /* OUT: Error message (from sqlite3_malloc) */
4718 ){
4719   size_t n;
4720   fseek(pFile, (long)iOff, SEEK_SET);
4721   n = fread(aRead, 1, nRead, pFile);
4722   if( (int)n!=nRead ){
4723     *pzErrmsg = sqlite3_mprintf("error in fread()");
4724     return SQLITE_ERROR;
4725   }
4726   return SQLITE_OK;
4727 }
4728 
4729 static int zipfileAppendData(
4730   ZipfileTab *pTab,
4731   const u8 *aWrite,
4732   int nWrite
4733 ){
4734   size_t n;
4735   fseek(pTab->pWriteFd, (long)pTab->szCurrent, SEEK_SET);
4736   n = fwrite(aWrite, 1, nWrite, pTab->pWriteFd);
4737   if( (int)n!=nWrite ){
4738     pTab->base.zErrMsg = sqlite3_mprintf("error in fwrite()");
4739     return SQLITE_ERROR;
4740   }
4741   pTab->szCurrent += nWrite;
4742   return SQLITE_OK;
4743 }
4744 
4745 /*
4746 ** Read and return a 16-bit little-endian unsigned integer from buffer aBuf.
4747 */
4748 static u16 zipfileGetU16(const u8 *aBuf){
4749   return (aBuf[1] << 8) + aBuf[0];
4750 }
4751 
4752 /*
4753 ** Read and return a 32-bit little-endian unsigned integer from buffer aBuf.
4754 */
4755 static u32 zipfileGetU32(const u8 *aBuf){
4756   return ((u32)(aBuf[3]) << 24)
4757        + ((u32)(aBuf[2]) << 16)
4758        + ((u32)(aBuf[1]) <<  8)
4759        + ((u32)(aBuf[0]) <<  0);
4760 }
4761 
4762 /*
4763 ** Write a 16-bit little endiate integer into buffer aBuf.
4764 */
4765 static void zipfilePutU16(u8 *aBuf, u16 val){
4766   aBuf[0] = val & 0xFF;
4767   aBuf[1] = (val>>8) & 0xFF;
4768 }
4769 
4770 /*
4771 ** Write a 32-bit little endiate integer into buffer aBuf.
4772 */
4773 static void zipfilePutU32(u8 *aBuf, u32 val){
4774   aBuf[0] = val & 0xFF;
4775   aBuf[1] = (val>>8) & 0xFF;
4776   aBuf[2] = (val>>16) & 0xFF;
4777   aBuf[3] = (val>>24) & 0xFF;
4778 }
4779 
4780 #define zipfileRead32(aBuf) ( aBuf+=4, zipfileGetU32(aBuf-4) )
4781 #define zipfileRead16(aBuf) ( aBuf+=2, zipfileGetU16(aBuf-2) )
4782 
4783 #define zipfileWrite32(aBuf,val) { zipfilePutU32(aBuf,val); aBuf+=4; }
4784 #define zipfileWrite16(aBuf,val) { zipfilePutU16(aBuf,val); aBuf+=2; }
4785 
4786 /*
4787 ** Magic numbers used to read CDS records.
4788 */
4789 #define ZIPFILE_CDS_NFILE_OFF        28
4790 #define ZIPFILE_CDS_SZCOMPRESSED_OFF 20
4791 
4792 /*
4793 ** Decode the CDS record in buffer aBuf into (*pCDS). Return SQLITE_ERROR
4794 ** if the record is not well-formed, or SQLITE_OK otherwise.
4795 */
4796 static int zipfileReadCDS(u8 *aBuf, ZipfileCDS *pCDS){
4797   u8 *aRead = aBuf;
4798   u32 sig = zipfileRead32(aRead);
4799   int rc = SQLITE_OK;
4800   if( sig!=ZIPFILE_SIGNATURE_CDS ){
4801     rc = SQLITE_ERROR;
4802   }else{
4803     pCDS->iVersionMadeBy = zipfileRead16(aRead);
4804     pCDS->iVersionExtract = zipfileRead16(aRead);
4805     pCDS->flags = zipfileRead16(aRead);
4806     pCDS->iCompression = zipfileRead16(aRead);
4807     pCDS->mTime = zipfileRead16(aRead);
4808     pCDS->mDate = zipfileRead16(aRead);
4809     pCDS->crc32 = zipfileRead32(aRead);
4810     pCDS->szCompressed = zipfileRead32(aRead);
4811     pCDS->szUncompressed = zipfileRead32(aRead);
4812     assert( aRead==&aBuf[ZIPFILE_CDS_NFILE_OFF] );
4813     pCDS->nFile = zipfileRead16(aRead);
4814     pCDS->nExtra = zipfileRead16(aRead);
4815     pCDS->nComment = zipfileRead16(aRead);
4816     pCDS->iDiskStart = zipfileRead16(aRead);
4817     pCDS->iInternalAttr = zipfileRead16(aRead);
4818     pCDS->iExternalAttr = zipfileRead32(aRead);
4819     pCDS->iOffset = zipfileRead32(aRead);
4820     assert( aRead==&aBuf[ZIPFILE_CDS_FIXED_SZ] );
4821   }
4822 
4823   return rc;
4824 }
4825 
4826 /*
4827 ** Decode the LFH record in buffer aBuf into (*pLFH). Return SQLITE_ERROR
4828 ** if the record is not well-formed, or SQLITE_OK otherwise.
4829 */
4830 static int zipfileReadLFH(
4831   u8 *aBuffer,
4832   ZipfileLFH *pLFH
4833 ){
4834   u8 *aRead = aBuffer;
4835   int rc = SQLITE_OK;
4836 
4837   u32 sig = zipfileRead32(aRead);
4838   if( sig!=ZIPFILE_SIGNATURE_LFH ){
4839     rc = SQLITE_ERROR;
4840   }else{
4841     pLFH->iVersionExtract = zipfileRead16(aRead);
4842     pLFH->flags = zipfileRead16(aRead);
4843     pLFH->iCompression = zipfileRead16(aRead);
4844     pLFH->mTime = zipfileRead16(aRead);
4845     pLFH->mDate = zipfileRead16(aRead);
4846     pLFH->crc32 = zipfileRead32(aRead);
4847     pLFH->szCompressed = zipfileRead32(aRead);
4848     pLFH->szUncompressed = zipfileRead32(aRead);
4849     pLFH->nFile = zipfileRead16(aRead);
4850     pLFH->nExtra = zipfileRead16(aRead);
4851   }
4852   return rc;
4853 }
4854 
4855 
4856 /*
4857 ** Buffer aExtra (size nExtra bytes) contains zip archive "extra" fields.
4858 ** Scan through this buffer to find an "extra-timestamp" field. If one
4859 ** exists, extract the 32-bit modification-timestamp from it and store
4860 ** the value in output parameter *pmTime.
4861 **
4862 ** Zero is returned if no extra-timestamp record could be found (and so
4863 ** *pmTime is left unchanged), or non-zero otherwise.
4864 **
4865 ** The general format of an extra field is:
4866 **
4867 **   Header ID    2 bytes
4868 **   Data Size    2 bytes
4869 **   Data         N bytes
4870 */
4871 static int zipfileScanExtra(u8 *aExtra, int nExtra, u32 *pmTime){
4872   int ret = 0;
4873   u8 *p = aExtra;
4874   u8 *pEnd = &aExtra[nExtra];
4875 
4876   while( p<pEnd ){
4877     u16 id = zipfileRead16(p);
4878     u16 nByte = zipfileRead16(p);
4879 
4880     switch( id ){
4881       case ZIPFILE_EXTRA_TIMESTAMP: {
4882         u8 b = p[0];
4883         if( b & 0x01 ){     /* 0x01 -> modtime is present */
4884           *pmTime = zipfileGetU32(&p[1]);
4885           ret = 1;
4886         }
4887         break;
4888       }
4889     }
4890 
4891     p += nByte;
4892   }
4893   return ret;
4894 }
4895 
4896 /*
4897 ** Convert the standard MS-DOS timestamp stored in the mTime and mDate
4898 ** fields of the CDS structure passed as the only argument to a 32-bit
4899 ** UNIX seconds-since-the-epoch timestamp. Return the result.
4900 **
4901 ** "Standard" MS-DOS time format:
4902 **
4903 **   File modification time:
4904 **     Bits 00-04: seconds divided by 2
4905 **     Bits 05-10: minute
4906 **     Bits 11-15: hour
4907 **   File modification date:
4908 **     Bits 00-04: day
4909 **     Bits 05-08: month (1-12)
4910 **     Bits 09-15: years from 1980
4911 **
4912 ** https://msdn.microsoft.com/en-us/library/9kkf9tah.aspx
4913 */
4914 static u32 zipfileMtime(ZipfileCDS *pCDS){
4915   int Y = (1980 + ((pCDS->mDate >> 9) & 0x7F));
4916   int M = ((pCDS->mDate >> 5) & 0x0F);
4917   int D = (pCDS->mDate & 0x1F);
4918   int B = -13;
4919 
4920   int sec = (pCDS->mTime & 0x1F)*2;
4921   int min = (pCDS->mTime >> 5) & 0x3F;
4922   int hr = (pCDS->mTime >> 11) & 0x1F;
4923   i64 JD;
4924 
4925   /* JD = INT(365.25 * (Y+4716)) + INT(30.6001 * (M+1)) + D + B - 1524.5 */
4926 
4927   /* Calculate the JD in seconds for noon on the day in question */
4928   if( M<3 ){
4929     Y = Y-1;
4930     M = M+12;
4931   }
4932   JD = (i64)(24*60*60) * (
4933       (int)(365.25 * (Y + 4716))
4934     + (int)(30.6001 * (M + 1))
4935     + D + B - 1524
4936   );
4937 
4938   /* Correct the JD for the time within the day */
4939   JD += (hr-12) * 3600 + min * 60 + sec;
4940 
4941   /* Convert JD to unix timestamp (the JD epoch is 2440587.5) */
4942   return (u32)(JD - (i64)(24405875) * 24*60*6);
4943 }
4944 
4945 /*
4946 ** The opposite of zipfileMtime(). This function populates the mTime and
4947 ** mDate fields of the CDS structure passed as the first argument according
4948 ** to the UNIX timestamp value passed as the second.
4949 */
4950 static void zipfileMtimeToDos(ZipfileCDS *pCds, u32 mUnixTime){
4951   /* Convert unix timestamp to JD (2440588 is noon on 1/1/1970) */
4952   i64 JD = (i64)2440588 + mUnixTime / (24*60*60);
4953 
4954   int A, B, C, D, E;
4955   int yr, mon, day;
4956   int hr, min, sec;
4957 
4958   A = (int)((JD - 1867216.25)/36524.25);
4959   A = (int)(JD + 1 + A - (A/4));
4960   B = A + 1524;
4961   C = (int)((B - 122.1)/365.25);
4962   D = (36525*(C&32767))/100;
4963   E = (int)((B-D)/30.6001);
4964 
4965   day = B - D - (int)(30.6001*E);
4966   mon = (E<14 ? E-1 : E-13);
4967   yr = mon>2 ? C-4716 : C-4715;
4968 
4969   hr = (mUnixTime % (24*60*60)) / (60*60);
4970   min = (mUnixTime % (60*60)) / 60;
4971   sec = (mUnixTime % 60);
4972 
4973   if( yr>=1980 ){
4974     pCds->mDate = (u16)(day + (mon << 5) + ((yr-1980) << 9));
4975     pCds->mTime = (u16)(sec/2 + (min<<5) + (hr<<11));
4976   }else{
4977     pCds->mDate = pCds->mTime = 0;
4978   }
4979 
4980   assert( mUnixTime<315507600
4981        || mUnixTime==zipfileMtime(pCds)
4982        || ((mUnixTime % 2) && mUnixTime-1==zipfileMtime(pCds))
4983        /* || (mUnixTime % 2) */
4984   );
4985 }
4986 
4987 /*
4988 ** If aBlob is not NULL, then it is a pointer to a buffer (nBlob bytes in
4989 ** size) containing an entire zip archive image. Or, if aBlob is NULL,
4990 ** then pFile is a file-handle open on a zip file. In either case, this
4991 ** function creates a ZipfileEntry object based on the zip archive entry
4992 ** for which the CDS record is at offset iOff.
4993 **
4994 ** If successful, SQLITE_OK is returned and (*ppEntry) set to point to
4995 ** the new object. Otherwise, an SQLite error code is returned and the
4996 ** final value of (*ppEntry) undefined.
4997 */
4998 static int zipfileGetEntry(
4999   ZipfileTab *pTab,               /* Store any error message here */
5000   const u8 *aBlob,                /* Pointer to in-memory file image */
5001   int nBlob,                      /* Size of aBlob[] in bytes */
5002   FILE *pFile,                    /* If aBlob==0, read from this file */
5003   i64 iOff,                       /* Offset of CDS record */
5004   ZipfileEntry **ppEntry          /* OUT: Pointer to new object */
5005 ){
5006   u8 *aRead;
5007   char **pzErr = &pTab->base.zErrMsg;
5008   int rc = SQLITE_OK;
5009 
5010   if( aBlob==0 ){
5011     aRead = pTab->aBuffer;
5012     rc = zipfileReadData(pFile, aRead, ZIPFILE_CDS_FIXED_SZ, iOff, pzErr);
5013   }else{
5014     aRead = (u8*)&aBlob[iOff];
5015   }
5016 
5017   if( rc==SQLITE_OK ){
5018     sqlite3_int64 nAlloc;
5019     ZipfileEntry *pNew;
5020 
5021     int nFile = zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF]);
5022     int nExtra = zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF+2]);
5023     nExtra += zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF+4]);
5024 
5025     nAlloc = sizeof(ZipfileEntry) + nExtra;
5026     if( aBlob ){
5027       nAlloc += zipfileGetU32(&aRead[ZIPFILE_CDS_SZCOMPRESSED_OFF]);
5028     }
5029 
5030     pNew = (ZipfileEntry*)sqlite3_malloc64(nAlloc);
5031     if( pNew==0 ){
5032       rc = SQLITE_NOMEM;
5033     }else{
5034       memset(pNew, 0, sizeof(ZipfileEntry));
5035       rc = zipfileReadCDS(aRead, &pNew->cds);
5036       if( rc!=SQLITE_OK ){
5037         *pzErr = sqlite3_mprintf("failed to read CDS at offset %lld", iOff);
5038       }else if( aBlob==0 ){
5039         rc = zipfileReadData(
5040             pFile, aRead, nExtra+nFile, iOff+ZIPFILE_CDS_FIXED_SZ, pzErr
5041         );
5042       }else{
5043         aRead = (u8*)&aBlob[iOff + ZIPFILE_CDS_FIXED_SZ];
5044       }
5045     }
5046 
5047     if( rc==SQLITE_OK ){
5048       u32 *pt = &pNew->mUnixTime;
5049       pNew->cds.zFile = sqlite3_mprintf("%.*s", nFile, aRead);
5050       pNew->aExtra = (u8*)&pNew[1];
5051       memcpy(pNew->aExtra, &aRead[nFile], nExtra);
5052       if( pNew->cds.zFile==0 ){
5053         rc = SQLITE_NOMEM;
5054       }else if( 0==zipfileScanExtra(&aRead[nFile], pNew->cds.nExtra, pt) ){
5055         pNew->mUnixTime = zipfileMtime(&pNew->cds);
5056       }
5057     }
5058 
5059     if( rc==SQLITE_OK ){
5060       static const int szFix = ZIPFILE_LFH_FIXED_SZ;
5061       ZipfileLFH lfh;
5062       if( pFile ){
5063         rc = zipfileReadData(pFile, aRead, szFix, pNew->cds.iOffset, pzErr);
5064       }else{
5065         aRead = (u8*)&aBlob[pNew->cds.iOffset];
5066       }
5067 
5068       rc = zipfileReadLFH(aRead, &lfh);
5069       if( rc==SQLITE_OK ){
5070         pNew->iDataOff =  pNew->cds.iOffset + ZIPFILE_LFH_FIXED_SZ;
5071         pNew->iDataOff += lfh.nFile + lfh.nExtra;
5072         if( aBlob && pNew->cds.szCompressed ){
5073           pNew->aData = &pNew->aExtra[nExtra];
5074           memcpy(pNew->aData, &aBlob[pNew->iDataOff], pNew->cds.szCompressed);
5075         }
5076       }else{
5077         *pzErr = sqlite3_mprintf("failed to read LFH at offset %d",
5078             (int)pNew->cds.iOffset
5079         );
5080       }
5081     }
5082 
5083     if( rc!=SQLITE_OK ){
5084       zipfileEntryFree(pNew);
5085     }else{
5086       *ppEntry = pNew;
5087     }
5088   }
5089 
5090   return rc;
5091 }
5092 
5093 /*
5094 ** Advance an ZipfileCsr to its next row of output.
5095 */
5096 static int zipfileNext(sqlite3_vtab_cursor *cur){
5097   ZipfileCsr *pCsr = (ZipfileCsr*)cur;
5098   int rc = SQLITE_OK;
5099 
5100   if( pCsr->pFile ){
5101     i64 iEof = pCsr->eocd.iOffset + pCsr->eocd.nSize;
5102     zipfileEntryFree(pCsr->pCurrent);
5103     pCsr->pCurrent = 0;
5104     if( pCsr->iNextOff>=iEof ){
5105       pCsr->bEof = 1;
5106     }else{
5107       ZipfileEntry *p = 0;
5108       ZipfileTab *pTab = (ZipfileTab*)(cur->pVtab);
5109       rc = zipfileGetEntry(pTab, 0, 0, pCsr->pFile, pCsr->iNextOff, &p);
5110       if( rc==SQLITE_OK ){
5111         pCsr->iNextOff += ZIPFILE_CDS_FIXED_SZ;
5112         pCsr->iNextOff += (int)p->cds.nExtra + p->cds.nFile + p->cds.nComment;
5113       }
5114       pCsr->pCurrent = p;
5115     }
5116   }else{
5117     if( !pCsr->bNoop ){
5118       pCsr->pCurrent = pCsr->pCurrent->pNext;
5119     }
5120     if( pCsr->pCurrent==0 ){
5121       pCsr->bEof = 1;
5122     }
5123   }
5124 
5125   pCsr->bNoop = 0;
5126   return rc;
5127 }
5128 
5129 static void zipfileFree(void *p) {
5130   sqlite3_free(p);
5131 }
5132 
5133 /*
5134 ** Buffer aIn (size nIn bytes) contains compressed data. Uncompressed, the
5135 ** size is nOut bytes. This function uncompresses the data and sets the
5136 ** return value in context pCtx to the result (a blob).
5137 **
5138 ** If an error occurs, an error code is left in pCtx instead.
5139 */
5140 static void zipfileInflate(
5141   sqlite3_context *pCtx,          /* Store result here */
5142   const u8 *aIn,                  /* Compressed data */
5143   int nIn,                        /* Size of buffer aIn[] in bytes */
5144   int nOut                        /* Expected output size */
5145 ){
5146   u8 *aRes = sqlite3_malloc(nOut);
5147   if( aRes==0 ){
5148     sqlite3_result_error_nomem(pCtx);
5149   }else{
5150     int err;
5151     z_stream str;
5152     memset(&str, 0, sizeof(str));
5153 
5154     str.next_in = (Byte*)aIn;
5155     str.avail_in = nIn;
5156     str.next_out = (Byte*)aRes;
5157     str.avail_out = nOut;
5158 
5159     err = inflateInit2(&str, -15);
5160     if( err!=Z_OK ){
5161       zipfileCtxErrorMsg(pCtx, "inflateInit2() failed (%d)", err);
5162     }else{
5163       err = inflate(&str, Z_NO_FLUSH);
5164       if( err!=Z_STREAM_END ){
5165         zipfileCtxErrorMsg(pCtx, "inflate() failed (%d)", err);
5166       }else{
5167         sqlite3_result_blob(pCtx, aRes, nOut, zipfileFree);
5168         aRes = 0;
5169       }
5170     }
5171     sqlite3_free(aRes);
5172     inflateEnd(&str);
5173   }
5174 }
5175 
5176 /*
5177 ** Buffer aIn (size nIn bytes) contains uncompressed data. This function
5178 ** compresses it and sets (*ppOut) to point to a buffer containing the
5179 ** compressed data. The caller is responsible for eventually calling
5180 ** sqlite3_free() to release buffer (*ppOut). Before returning, (*pnOut)
5181 ** is set to the size of buffer (*ppOut) in bytes.
5182 **
5183 ** If no error occurs, SQLITE_OK is returned. Otherwise, an SQLite error
5184 ** code is returned and an error message left in virtual-table handle
5185 ** pTab. The values of (*ppOut) and (*pnOut) are left unchanged in this
5186 ** case.
5187 */
5188 static int zipfileDeflate(
5189   const u8 *aIn, int nIn,         /* Input */
5190   u8 **ppOut, int *pnOut,         /* Output */
5191   char **pzErr                    /* OUT: Error message */
5192 ){
5193   sqlite3_int64 nAlloc = compressBound(nIn);
5194   u8 *aOut;
5195   int rc = SQLITE_OK;
5196 
5197   aOut = (u8*)sqlite3_malloc64(nAlloc);
5198   if( aOut==0 ){
5199     rc = SQLITE_NOMEM;
5200   }else{
5201     int res;
5202     z_stream str;
5203     memset(&str, 0, sizeof(str));
5204     str.next_in = (Bytef*)aIn;
5205     str.avail_in = nIn;
5206     str.next_out = aOut;
5207     str.avail_out = nAlloc;
5208 
5209     deflateInit2(&str, 9, Z_DEFLATED, -15, 8, Z_DEFAULT_STRATEGY);
5210     res = deflate(&str, Z_FINISH);
5211 
5212     if( res==Z_STREAM_END ){
5213       *ppOut = aOut;
5214       *pnOut = (int)str.total_out;
5215     }else{
5216       sqlite3_free(aOut);
5217       *pzErr = sqlite3_mprintf("zipfile: deflate() error");
5218       rc = SQLITE_ERROR;
5219     }
5220     deflateEnd(&str);
5221   }
5222 
5223   return rc;
5224 }
5225 
5226 
5227 /*
5228 ** Return values of columns for the row at which the series_cursor
5229 ** is currently pointing.
5230 */
5231 static int zipfileColumn(
5232   sqlite3_vtab_cursor *cur,   /* The cursor */
5233   sqlite3_context *ctx,       /* First argument to sqlite3_result_...() */
5234   int i                       /* Which column to return */
5235 ){
5236   ZipfileCsr *pCsr = (ZipfileCsr*)cur;
5237   ZipfileCDS *pCDS = &pCsr->pCurrent->cds;
5238   int rc = SQLITE_OK;
5239   switch( i ){
5240     case 0:   /* name */
5241       sqlite3_result_text(ctx, pCDS->zFile, -1, SQLITE_TRANSIENT);
5242       break;
5243     case 1:   /* mode */
5244       /* TODO: Whether or not the following is correct surely depends on
5245       ** the platform on which the archive was created.  */
5246       sqlite3_result_int(ctx, pCDS->iExternalAttr >> 16);
5247       break;
5248     case 2: { /* mtime */
5249       sqlite3_result_int64(ctx, pCsr->pCurrent->mUnixTime);
5250       break;
5251     }
5252     case 3: { /* sz */
5253       if( sqlite3_vtab_nochange(ctx)==0 ){
5254         sqlite3_result_int64(ctx, pCDS->szUncompressed);
5255       }
5256       break;
5257     }
5258     case 4:   /* rawdata */
5259       if( sqlite3_vtab_nochange(ctx) ) break;
5260     case 5: { /* data */
5261       if( i==4 || pCDS->iCompression==0 || pCDS->iCompression==8 ){
5262         int sz = pCDS->szCompressed;
5263         int szFinal = pCDS->szUncompressed;
5264         if( szFinal>0 ){
5265           u8 *aBuf;
5266           u8 *aFree = 0;
5267           if( pCsr->pCurrent->aData ){
5268             aBuf = pCsr->pCurrent->aData;
5269           }else{
5270             aBuf = aFree = sqlite3_malloc64(sz);
5271             if( aBuf==0 ){
5272               rc = SQLITE_NOMEM;
5273             }else{
5274               FILE *pFile = pCsr->pFile;
5275               if( pFile==0 ){
5276                 pFile = ((ZipfileTab*)(pCsr->base.pVtab))->pWriteFd;
5277               }
5278               rc = zipfileReadData(pFile, aBuf, sz, pCsr->pCurrent->iDataOff,
5279                   &pCsr->base.pVtab->zErrMsg
5280               );
5281             }
5282           }
5283           if( rc==SQLITE_OK ){
5284             if( i==5 && pCDS->iCompression ){
5285               zipfileInflate(ctx, aBuf, sz, szFinal);
5286             }else{
5287               sqlite3_result_blob(ctx, aBuf, sz, SQLITE_TRANSIENT);
5288             }
5289           }
5290           sqlite3_free(aFree);
5291         }else{
5292           /* Figure out if this is a directory or a zero-sized file. Consider
5293           ** it to be a directory either if the mode suggests so, or if
5294           ** the final character in the name is '/'.  */
5295           u32 mode = pCDS->iExternalAttr >> 16;
5296           if( !(mode & S_IFDIR) && pCDS->zFile[pCDS->nFile-1]!='/' ){
5297             sqlite3_result_blob(ctx, "", 0, SQLITE_STATIC);
5298           }
5299         }
5300       }
5301       break;
5302     }
5303     case 6:   /* method */
5304       sqlite3_result_int(ctx, pCDS->iCompression);
5305       break;
5306     default:  /* z */
5307       assert( i==7 );
5308       sqlite3_result_int64(ctx, pCsr->iId);
5309       break;
5310   }
5311 
5312   return rc;
5313 }
5314 
5315 /*
5316 ** Return TRUE if the cursor is at EOF.
5317 */
5318 static int zipfileEof(sqlite3_vtab_cursor *cur){
5319   ZipfileCsr *pCsr = (ZipfileCsr*)cur;
5320   return pCsr->bEof;
5321 }
5322 
5323 /*
5324 ** If aBlob is not NULL, then it points to a buffer nBlob bytes in size
5325 ** containing an entire zip archive image. Or, if aBlob is NULL, then pFile
5326 ** is guaranteed to be a file-handle open on a zip file.
5327 **
5328 ** This function attempts to locate the EOCD record within the zip archive
5329 ** and populate *pEOCD with the results of decoding it. SQLITE_OK is
5330 ** returned if successful. Otherwise, an SQLite error code is returned and
5331 ** an English language error message may be left in virtual-table pTab.
5332 */
5333 static int zipfileReadEOCD(
5334   ZipfileTab *pTab,               /* Return errors here */
5335   const u8 *aBlob,                /* Pointer to in-memory file image */
5336   int nBlob,                      /* Size of aBlob[] in bytes */
5337   FILE *pFile,                    /* Read from this file if aBlob==0 */
5338   ZipfileEOCD *pEOCD              /* Object to populate */
5339 ){
5340   u8 *aRead = pTab->aBuffer;      /* Temporary buffer */
5341   int nRead;                      /* Bytes to read from file */
5342   int rc = SQLITE_OK;
5343 
5344   if( aBlob==0 ){
5345     i64 iOff;                     /* Offset to read from */
5346     i64 szFile;                   /* Total size of file in bytes */
5347     fseek(pFile, 0, SEEK_END);
5348     szFile = (i64)ftell(pFile);
5349     if( szFile==0 ){
5350       memset(pEOCD, 0, sizeof(ZipfileEOCD));
5351       return SQLITE_OK;
5352     }
5353     nRead = (int)(MIN(szFile, ZIPFILE_BUFFER_SIZE));
5354     iOff = szFile - nRead;
5355     rc = zipfileReadData(pFile, aRead, nRead, iOff, &pTab->base.zErrMsg);
5356   }else{
5357     nRead = (int)(MIN(nBlob, ZIPFILE_BUFFER_SIZE));
5358     aRead = (u8*)&aBlob[nBlob-nRead];
5359   }
5360 
5361   if( rc==SQLITE_OK ){
5362     int i;
5363 
5364     /* Scan backwards looking for the signature bytes */
5365     for(i=nRead-20; i>=0; i--){
5366       if( aRead[i]==0x50 && aRead[i+1]==0x4b
5367        && aRead[i+2]==0x05 && aRead[i+3]==0x06
5368       ){
5369         break;
5370       }
5371     }
5372     if( i<0 ){
5373       pTab->base.zErrMsg = sqlite3_mprintf(
5374           "cannot find end of central directory record"
5375       );
5376       return SQLITE_ERROR;
5377     }
5378 
5379     aRead += i+4;
5380     pEOCD->iDisk = zipfileRead16(aRead);
5381     pEOCD->iFirstDisk = zipfileRead16(aRead);
5382     pEOCD->nEntry = zipfileRead16(aRead);
5383     pEOCD->nEntryTotal = zipfileRead16(aRead);
5384     pEOCD->nSize = zipfileRead32(aRead);
5385     pEOCD->iOffset = zipfileRead32(aRead);
5386   }
5387 
5388   return rc;
5389 }
5390 
5391 /*
5392 ** Add object pNew to the linked list that begins at ZipfileTab.pFirstEntry
5393 ** and ends with pLastEntry. If argument pBefore is NULL, then pNew is added
5394 ** to the end of the list. Otherwise, it is added to the list immediately
5395 ** before pBefore (which is guaranteed to be a part of said list).
5396 */
5397 static void zipfileAddEntry(
5398   ZipfileTab *pTab,
5399   ZipfileEntry *pBefore,
5400   ZipfileEntry *pNew
5401 ){
5402   assert( (pTab->pFirstEntry==0)==(pTab->pLastEntry==0) );
5403   assert( pNew->pNext==0 );
5404   if( pBefore==0 ){
5405     if( pTab->pFirstEntry==0 ){
5406       pTab->pFirstEntry = pTab->pLastEntry = pNew;
5407     }else{
5408       assert( pTab->pLastEntry->pNext==0 );
5409       pTab->pLastEntry->pNext = pNew;
5410       pTab->pLastEntry = pNew;
5411     }
5412   }else{
5413     ZipfileEntry **pp;
5414     for(pp=&pTab->pFirstEntry; *pp!=pBefore; pp=&((*pp)->pNext));
5415     pNew->pNext = pBefore;
5416     *pp = pNew;
5417   }
5418 }
5419 
5420 static int zipfileLoadDirectory(ZipfileTab *pTab, const u8 *aBlob, int nBlob){
5421   ZipfileEOCD eocd;
5422   int rc;
5423   int i;
5424   i64 iOff;
5425 
5426   rc = zipfileReadEOCD(pTab, aBlob, nBlob, pTab->pWriteFd, &eocd);
5427   iOff = eocd.iOffset;
5428   for(i=0; rc==SQLITE_OK && i<eocd.nEntry; i++){
5429     ZipfileEntry *pNew = 0;
5430     rc = zipfileGetEntry(pTab, aBlob, nBlob, pTab->pWriteFd, iOff, &pNew);
5431 
5432     if( rc==SQLITE_OK ){
5433       zipfileAddEntry(pTab, 0, pNew);
5434       iOff += ZIPFILE_CDS_FIXED_SZ;
5435       iOff += (int)pNew->cds.nExtra + pNew->cds.nFile + pNew->cds.nComment;
5436     }
5437   }
5438   return rc;
5439 }
5440 
5441 /*
5442 ** xFilter callback.
5443 */
5444 static int zipfileFilter(
5445   sqlite3_vtab_cursor *cur,
5446   int idxNum, const char *idxStr,
5447   int argc, sqlite3_value **argv
5448 ){
5449   ZipfileTab *pTab = (ZipfileTab*)cur->pVtab;
5450   ZipfileCsr *pCsr = (ZipfileCsr*)cur;
5451   const char *zFile = 0;          /* Zip file to scan */
5452   int rc = SQLITE_OK;             /* Return Code */
5453   int bInMemory = 0;              /* True for an in-memory zipfile */
5454 
5455   zipfileResetCursor(pCsr);
5456 
5457   if( pTab->zFile ){
5458     zFile = pTab->zFile;
5459   }else if( idxNum==0 ){
5460     zipfileCursorErr(pCsr, "zipfile() function requires an argument");
5461     return SQLITE_ERROR;
5462   }else if( sqlite3_value_type(argv[0])==SQLITE_BLOB ){
5463     const u8 *aBlob = (const u8*)sqlite3_value_blob(argv[0]);
5464     int nBlob = sqlite3_value_bytes(argv[0]);
5465     assert( pTab->pFirstEntry==0 );
5466     rc = zipfileLoadDirectory(pTab, aBlob, nBlob);
5467     pCsr->pFreeEntry = pTab->pFirstEntry;
5468     pTab->pFirstEntry = pTab->pLastEntry = 0;
5469     if( rc!=SQLITE_OK ) return rc;
5470     bInMemory = 1;
5471   }else{
5472     zFile = (const char*)sqlite3_value_text(argv[0]);
5473   }
5474 
5475   if( 0==pTab->pWriteFd && 0==bInMemory ){
5476     pCsr->pFile = fopen(zFile, "rb");
5477     if( pCsr->pFile==0 ){
5478       zipfileCursorErr(pCsr, "cannot open file: %s", zFile);
5479       rc = SQLITE_ERROR;
5480     }else{
5481       rc = zipfileReadEOCD(pTab, 0, 0, pCsr->pFile, &pCsr->eocd);
5482       if( rc==SQLITE_OK ){
5483         if( pCsr->eocd.nEntry==0 ){
5484           pCsr->bEof = 1;
5485         }else{
5486           pCsr->iNextOff = pCsr->eocd.iOffset;
5487           rc = zipfileNext(cur);
5488         }
5489       }
5490     }
5491   }else{
5492     pCsr->bNoop = 1;
5493     pCsr->pCurrent = pCsr->pFreeEntry ? pCsr->pFreeEntry : pTab->pFirstEntry;
5494     rc = zipfileNext(cur);
5495   }
5496 
5497   return rc;
5498 }
5499 
5500 /*
5501 ** xBestIndex callback.
5502 */
5503 static int zipfileBestIndex(
5504   sqlite3_vtab *tab,
5505   sqlite3_index_info *pIdxInfo
5506 ){
5507   int i;
5508   int idx = -1;
5509   int unusable = 0;
5510 
5511   for(i=0; i<pIdxInfo->nConstraint; i++){
5512     const struct sqlite3_index_constraint *pCons = &pIdxInfo->aConstraint[i];
5513     if( pCons->iColumn!=ZIPFILE_F_COLUMN_IDX ) continue;
5514     if( pCons->usable==0 ){
5515       unusable = 1;
5516     }else if( pCons->op==SQLITE_INDEX_CONSTRAINT_EQ ){
5517       idx = i;
5518     }
5519   }
5520   if( idx>=0 ){
5521     pIdxInfo->aConstraintUsage[idx].argvIndex = 1;
5522     pIdxInfo->aConstraintUsage[idx].omit = 1;
5523     pIdxInfo->estimatedCost = 1000.0;
5524     pIdxInfo->idxNum = 1;
5525   }else if( unusable ){
5526     return SQLITE_CONSTRAINT;
5527   }
5528   return SQLITE_OK;
5529 }
5530 
5531 static ZipfileEntry *zipfileNewEntry(const char *zPath){
5532   ZipfileEntry *pNew;
5533   pNew = sqlite3_malloc(sizeof(ZipfileEntry));
5534   if( pNew ){
5535     memset(pNew, 0, sizeof(ZipfileEntry));
5536     pNew->cds.zFile = sqlite3_mprintf("%s", zPath);
5537     if( pNew->cds.zFile==0 ){
5538       sqlite3_free(pNew);
5539       pNew = 0;
5540     }
5541   }
5542   return pNew;
5543 }
5544 
5545 static int zipfileSerializeLFH(ZipfileEntry *pEntry, u8 *aBuf){
5546   ZipfileCDS *pCds = &pEntry->cds;
5547   u8 *a = aBuf;
5548 
5549   pCds->nExtra = 9;
5550 
5551   /* Write the LFH itself */
5552   zipfileWrite32(a, ZIPFILE_SIGNATURE_LFH);
5553   zipfileWrite16(a, pCds->iVersionExtract);
5554   zipfileWrite16(a, pCds->flags);
5555   zipfileWrite16(a, pCds->iCompression);
5556   zipfileWrite16(a, pCds->mTime);
5557   zipfileWrite16(a, pCds->mDate);
5558   zipfileWrite32(a, pCds->crc32);
5559   zipfileWrite32(a, pCds->szCompressed);
5560   zipfileWrite32(a, pCds->szUncompressed);
5561   zipfileWrite16(a, (u16)pCds->nFile);
5562   zipfileWrite16(a, pCds->nExtra);
5563   assert( a==&aBuf[ZIPFILE_LFH_FIXED_SZ] );
5564 
5565   /* Add the file name */
5566   memcpy(a, pCds->zFile, (int)pCds->nFile);
5567   a += (int)pCds->nFile;
5568 
5569   /* The "extra" data */
5570   zipfileWrite16(a, ZIPFILE_EXTRA_TIMESTAMP);
5571   zipfileWrite16(a, 5);
5572   *a++ = 0x01;
5573   zipfileWrite32(a, pEntry->mUnixTime);
5574 
5575   return a-aBuf;
5576 }
5577 
5578 static int zipfileAppendEntry(
5579   ZipfileTab *pTab,
5580   ZipfileEntry *pEntry,
5581   const u8 *pData,
5582   int nData
5583 ){
5584   u8 *aBuf = pTab->aBuffer;
5585   int nBuf;
5586   int rc;
5587 
5588   nBuf = zipfileSerializeLFH(pEntry, aBuf);
5589   rc = zipfileAppendData(pTab, aBuf, nBuf);
5590   if( rc==SQLITE_OK ){
5591     pEntry->iDataOff = pTab->szCurrent;
5592     rc = zipfileAppendData(pTab, pData, nData);
5593   }
5594 
5595   return rc;
5596 }
5597 
5598 static int zipfileGetMode(
5599   sqlite3_value *pVal,
5600   int bIsDir,                     /* If true, default to directory */
5601   u32 *pMode,                     /* OUT: Mode value */
5602   char **pzErr                    /* OUT: Error message */
5603 ){
5604   const char *z = (const char*)sqlite3_value_text(pVal);
5605   u32 mode = 0;
5606   if( z==0 ){
5607     mode = (bIsDir ? (S_IFDIR + 0755) : (S_IFREG + 0644));
5608   }else if( z[0]>='0' && z[0]<='9' ){
5609     mode = (unsigned int)sqlite3_value_int(pVal);
5610   }else{
5611     const char zTemplate[11] = "-rwxrwxrwx";
5612     int i;
5613     if( strlen(z)!=10 ) goto parse_error;
5614     switch( z[0] ){
5615       case '-': mode |= S_IFREG; break;
5616       case 'd': mode |= S_IFDIR; break;
5617       case 'l': mode |= S_IFLNK; break;
5618       default: goto parse_error;
5619     }
5620     for(i=1; i<10; i++){
5621       if( z[i]==zTemplate[i] ) mode |= 1 << (9-i);
5622       else if( z[i]!='-' ) goto parse_error;
5623     }
5624   }
5625   if( ((mode & S_IFDIR)==0)==bIsDir ){
5626     /* The "mode" attribute is a directory, but data has been specified.
5627     ** Or vice-versa - no data but "mode" is a file or symlink.  */
5628     *pzErr = sqlite3_mprintf("zipfile: mode does not match data");
5629     return SQLITE_CONSTRAINT;
5630   }
5631   *pMode = mode;
5632   return SQLITE_OK;
5633 
5634  parse_error:
5635   *pzErr = sqlite3_mprintf("zipfile: parse error in mode: %s", z);
5636   return SQLITE_ERROR;
5637 }
5638 
5639 /*
5640 ** Both (const char*) arguments point to nul-terminated strings. Argument
5641 ** nB is the value of strlen(zB). This function returns 0 if the strings are
5642 ** identical, ignoring any trailing '/' character in either path.  */
5643 static int zipfileComparePath(const char *zA, const char *zB, int nB){
5644   int nA = (int)strlen(zA);
5645   if( zA[nA-1]=='/' ) nA--;
5646   if( zB[nB-1]=='/' ) nB--;
5647   if( nA==nB && memcmp(zA, zB, nA)==0 ) return 0;
5648   return 1;
5649 }
5650 
5651 static int zipfileBegin(sqlite3_vtab *pVtab){
5652   ZipfileTab *pTab = (ZipfileTab*)pVtab;
5653   int rc = SQLITE_OK;
5654 
5655   assert( pTab->pWriteFd==0 );
5656 
5657   /* Open a write fd on the file. Also load the entire central directory
5658   ** structure into memory. During the transaction any new file data is
5659   ** appended to the archive file, but the central directory is accumulated
5660   ** in main-memory until the transaction is committed.  */
5661   pTab->pWriteFd = fopen(pTab->zFile, "ab+");
5662   if( pTab->pWriteFd==0 ){
5663     pTab->base.zErrMsg = sqlite3_mprintf(
5664         "zipfile: failed to open file %s for writing", pTab->zFile
5665         );
5666     rc = SQLITE_ERROR;
5667   }else{
5668     fseek(pTab->pWriteFd, 0, SEEK_END);
5669     pTab->szCurrent = pTab->szOrig = (i64)ftell(pTab->pWriteFd);
5670     rc = zipfileLoadDirectory(pTab, 0, 0);
5671   }
5672 
5673   if( rc!=SQLITE_OK ){
5674     zipfileCleanupTransaction(pTab);
5675   }
5676 
5677   return rc;
5678 }
5679 
5680 /*
5681 ** Return the current time as a 32-bit timestamp in UNIX epoch format (like
5682 ** time(2)).
5683 */
5684 static u32 zipfileTime(void){
5685   sqlite3_vfs *pVfs = sqlite3_vfs_find(0);
5686   u32 ret;
5687   if( pVfs->iVersion>=2 && pVfs->xCurrentTimeInt64 ){
5688     i64 ms;
5689     pVfs->xCurrentTimeInt64(pVfs, &ms);
5690     ret = (u32)((ms/1000) - ((i64)24405875 * 8640));
5691   }else{
5692     double day;
5693     pVfs->xCurrentTime(pVfs, &day);
5694     ret = (u32)((day - 2440587.5) * 86400);
5695   }
5696   return ret;
5697 }
5698 
5699 /*
5700 ** Return a 32-bit timestamp in UNIX epoch format.
5701 **
5702 ** If the value passed as the only argument is either NULL or an SQL NULL,
5703 ** return the current time. Otherwise, return the value stored in (*pVal)
5704 ** cast to a 32-bit unsigned integer.
5705 */
5706 static u32 zipfileGetTime(sqlite3_value *pVal){
5707   if( pVal==0 || sqlite3_value_type(pVal)==SQLITE_NULL ){
5708     return zipfileTime();
5709   }
5710   return (u32)sqlite3_value_int64(pVal);
5711 }
5712 
5713 /*
5714 ** Unless it is NULL, entry pOld is currently part of the pTab->pFirstEntry
5715 ** linked list.  Remove it from the list and free the object.
5716 */
5717 static void zipfileRemoveEntryFromList(ZipfileTab *pTab, ZipfileEntry *pOld){
5718   if( pOld ){
5719     ZipfileEntry **pp;
5720     for(pp=&pTab->pFirstEntry; (*pp)!=pOld; pp=&((*pp)->pNext));
5721     *pp = (*pp)->pNext;
5722     zipfileEntryFree(pOld);
5723   }
5724 }
5725 
5726 /*
5727 ** xUpdate method.
5728 */
5729 static int zipfileUpdate(
5730   sqlite3_vtab *pVtab,
5731   int nVal,
5732   sqlite3_value **apVal,
5733   sqlite_int64 *pRowid
5734 ){
5735   ZipfileTab *pTab = (ZipfileTab*)pVtab;
5736   int rc = SQLITE_OK;             /* Return Code */
5737   ZipfileEntry *pNew = 0;         /* New in-memory CDS entry */
5738 
5739   u32 mode = 0;                   /* Mode for new entry */
5740   u32 mTime = 0;                  /* Modification time for new entry */
5741   i64 sz = 0;                     /* Uncompressed size */
5742   const char *zPath = 0;          /* Path for new entry */
5743   int nPath = 0;                  /* strlen(zPath) */
5744   const u8 *pData = 0;            /* Pointer to buffer containing content */
5745   int nData = 0;                  /* Size of pData buffer in bytes */
5746   int iMethod = 0;                /* Compression method for new entry */
5747   u8 *pFree = 0;                  /* Free this */
5748   char *zFree = 0;                /* Also free this */
5749   ZipfileEntry *pOld = 0;
5750   ZipfileEntry *pOld2 = 0;
5751   int bUpdate = 0;                /* True for an update that modifies "name" */
5752   int bIsDir = 0;
5753   u32 iCrc32 = 0;
5754 
5755   if( pTab->pWriteFd==0 ){
5756     rc = zipfileBegin(pVtab);
5757     if( rc!=SQLITE_OK ) return rc;
5758   }
5759 
5760   /* If this is a DELETE or UPDATE, find the archive entry to delete. */
5761   if( sqlite3_value_type(apVal[0])!=SQLITE_NULL ){
5762     const char *zDelete = (const char*)sqlite3_value_text(apVal[0]);
5763     int nDelete = (int)strlen(zDelete);
5764     if( nVal>1 ){
5765       const char *zUpdate = (const char*)sqlite3_value_text(apVal[1]);
5766       if( zUpdate && zipfileComparePath(zUpdate, zDelete, nDelete)!=0 ){
5767         bUpdate = 1;
5768       }
5769     }
5770     for(pOld=pTab->pFirstEntry; 1; pOld=pOld->pNext){
5771       if( zipfileComparePath(pOld->cds.zFile, zDelete, nDelete)==0 ){
5772         break;
5773       }
5774       assert( pOld->pNext );
5775     }
5776   }
5777 
5778   if( nVal>1 ){
5779     /* Check that "sz" and "rawdata" are both NULL: */
5780     if( sqlite3_value_type(apVal[5])!=SQLITE_NULL ){
5781       zipfileTableErr(pTab, "sz must be NULL");
5782       rc = SQLITE_CONSTRAINT;
5783     }
5784     if( sqlite3_value_type(apVal[6])!=SQLITE_NULL ){
5785       zipfileTableErr(pTab, "rawdata must be NULL");
5786       rc = SQLITE_CONSTRAINT;
5787     }
5788 
5789     if( rc==SQLITE_OK ){
5790       if( sqlite3_value_type(apVal[7])==SQLITE_NULL ){
5791         /* data=NULL. A directory */
5792         bIsDir = 1;
5793       }else{
5794         /* Value specified for "data", and possibly "method". This must be
5795         ** a regular file or a symlink. */
5796         const u8 *aIn = sqlite3_value_blob(apVal[7]);
5797         int nIn = sqlite3_value_bytes(apVal[7]);
5798         int bAuto = sqlite3_value_type(apVal[8])==SQLITE_NULL;
5799 
5800         iMethod = sqlite3_value_int(apVal[8]);
5801         sz = nIn;
5802         pData = aIn;
5803         nData = nIn;
5804         if( iMethod!=0 && iMethod!=8 ){
5805           zipfileTableErr(pTab, "unknown compression method: %d", iMethod);
5806           rc = SQLITE_CONSTRAINT;
5807         }else{
5808           if( bAuto || iMethod ){
5809             int nCmp;
5810             rc = zipfileDeflate(aIn, nIn, &pFree, &nCmp, &pTab->base.zErrMsg);
5811             if( rc==SQLITE_OK ){
5812               if( iMethod || nCmp<nIn ){
5813                 iMethod = 8;
5814                 pData = pFree;
5815                 nData = nCmp;
5816               }
5817             }
5818           }
5819           iCrc32 = crc32(0, aIn, nIn);
5820         }
5821       }
5822     }
5823 
5824     if( rc==SQLITE_OK ){
5825       rc = zipfileGetMode(apVal[3], bIsDir, &mode, &pTab->base.zErrMsg);
5826     }
5827 
5828     if( rc==SQLITE_OK ){
5829       zPath = (const char*)sqlite3_value_text(apVal[2]);
5830       nPath = (int)strlen(zPath);
5831       mTime = zipfileGetTime(apVal[4]);
5832     }
5833 
5834     if( rc==SQLITE_OK && bIsDir ){
5835       /* For a directory, check that the last character in the path is a
5836       ** '/'. This appears to be required for compatibility with info-zip
5837       ** (the unzip command on unix). It does not create directories
5838       ** otherwise.  */
5839       if( zPath[nPath-1]!='/' ){
5840         zFree = sqlite3_mprintf("%s/", zPath);
5841         if( zFree==0 ){ rc = SQLITE_NOMEM; }
5842         zPath = (const char*)zFree;
5843         nPath++;
5844       }
5845     }
5846 
5847     /* Check that we're not inserting a duplicate entry -OR- updating an
5848     ** entry with a path, thereby making it into a duplicate. */
5849     if( (pOld==0 || bUpdate) && rc==SQLITE_OK ){
5850       ZipfileEntry *p;
5851       for(p=pTab->pFirstEntry; p; p=p->pNext){
5852         if( zipfileComparePath(p->cds.zFile, zPath, nPath)==0 ){
5853           switch( sqlite3_vtab_on_conflict(pTab->db) ){
5854             case SQLITE_IGNORE: {
5855               goto zipfile_update_done;
5856             }
5857             case SQLITE_REPLACE: {
5858               pOld2 = p;
5859               break;
5860             }
5861             default: {
5862               zipfileTableErr(pTab, "duplicate name: \"%s\"", zPath);
5863               rc = SQLITE_CONSTRAINT;
5864               break;
5865             }
5866           }
5867           break;
5868         }
5869       }
5870     }
5871 
5872     if( rc==SQLITE_OK ){
5873       /* Create the new CDS record. */
5874       pNew = zipfileNewEntry(zPath);
5875       if( pNew==0 ){
5876         rc = SQLITE_NOMEM;
5877       }else{
5878         pNew->cds.iVersionMadeBy = ZIPFILE_NEWENTRY_MADEBY;
5879         pNew->cds.iVersionExtract = ZIPFILE_NEWENTRY_REQUIRED;
5880         pNew->cds.flags = ZIPFILE_NEWENTRY_FLAGS;
5881         pNew->cds.iCompression = (u16)iMethod;
5882         zipfileMtimeToDos(&pNew->cds, mTime);
5883         pNew->cds.crc32 = iCrc32;
5884         pNew->cds.szCompressed = nData;
5885         pNew->cds.szUncompressed = (u32)sz;
5886         pNew->cds.iExternalAttr = (mode<<16);
5887         pNew->cds.iOffset = (u32)pTab->szCurrent;
5888         pNew->cds.nFile = (u16)nPath;
5889         pNew->mUnixTime = (u32)mTime;
5890         rc = zipfileAppendEntry(pTab, pNew, pData, nData);
5891         zipfileAddEntry(pTab, pOld, pNew);
5892       }
5893     }
5894   }
5895 
5896   if( rc==SQLITE_OK && (pOld || pOld2) ){
5897     ZipfileCsr *pCsr;
5898     for(pCsr=pTab->pCsrList; pCsr; pCsr=pCsr->pCsrNext){
5899       if( pCsr->pCurrent && (pCsr->pCurrent==pOld || pCsr->pCurrent==pOld2) ){
5900         pCsr->pCurrent = pCsr->pCurrent->pNext;
5901         pCsr->bNoop = 1;
5902       }
5903     }
5904 
5905     zipfileRemoveEntryFromList(pTab, pOld);
5906     zipfileRemoveEntryFromList(pTab, pOld2);
5907   }
5908 
5909 zipfile_update_done:
5910   sqlite3_free(pFree);
5911   sqlite3_free(zFree);
5912   return rc;
5913 }
5914 
5915 static int zipfileSerializeEOCD(ZipfileEOCD *p, u8 *aBuf){
5916   u8 *a = aBuf;
5917   zipfileWrite32(a, ZIPFILE_SIGNATURE_EOCD);
5918   zipfileWrite16(a, p->iDisk);
5919   zipfileWrite16(a, p->iFirstDisk);
5920   zipfileWrite16(a, p->nEntry);
5921   zipfileWrite16(a, p->nEntryTotal);
5922   zipfileWrite32(a, p->nSize);
5923   zipfileWrite32(a, p->iOffset);
5924   zipfileWrite16(a, 0);        /* Size of trailing comment in bytes*/
5925 
5926   return a-aBuf;
5927 }
5928 
5929 static int zipfileAppendEOCD(ZipfileTab *pTab, ZipfileEOCD *p){
5930   int nBuf = zipfileSerializeEOCD(p, pTab->aBuffer);
5931   assert( nBuf==ZIPFILE_EOCD_FIXED_SZ );
5932   return zipfileAppendData(pTab, pTab->aBuffer, nBuf);
5933 }
5934 
5935 /*
5936 ** Serialize the CDS structure into buffer aBuf[]. Return the number
5937 ** of bytes written.
5938 */
5939 static int zipfileSerializeCDS(ZipfileEntry *pEntry, u8 *aBuf){
5940   u8 *a = aBuf;
5941   ZipfileCDS *pCDS = &pEntry->cds;
5942 
5943   if( pEntry->aExtra==0 ){
5944     pCDS->nExtra = 9;
5945   }
5946 
5947   zipfileWrite32(a, ZIPFILE_SIGNATURE_CDS);
5948   zipfileWrite16(a, pCDS->iVersionMadeBy);
5949   zipfileWrite16(a, pCDS->iVersionExtract);
5950   zipfileWrite16(a, pCDS->flags);
5951   zipfileWrite16(a, pCDS->iCompression);
5952   zipfileWrite16(a, pCDS->mTime);
5953   zipfileWrite16(a, pCDS->mDate);
5954   zipfileWrite32(a, pCDS->crc32);
5955   zipfileWrite32(a, pCDS->szCompressed);
5956   zipfileWrite32(a, pCDS->szUncompressed);
5957   assert( a==&aBuf[ZIPFILE_CDS_NFILE_OFF] );
5958   zipfileWrite16(a, pCDS->nFile);
5959   zipfileWrite16(a, pCDS->nExtra);
5960   zipfileWrite16(a, pCDS->nComment);
5961   zipfileWrite16(a, pCDS->iDiskStart);
5962   zipfileWrite16(a, pCDS->iInternalAttr);
5963   zipfileWrite32(a, pCDS->iExternalAttr);
5964   zipfileWrite32(a, pCDS->iOffset);
5965 
5966   memcpy(a, pCDS->zFile, pCDS->nFile);
5967   a += pCDS->nFile;
5968 
5969   if( pEntry->aExtra ){
5970     int n = (int)pCDS->nExtra + (int)pCDS->nComment;
5971     memcpy(a, pEntry->aExtra, n);
5972     a += n;
5973   }else{
5974     assert( pCDS->nExtra==9 );
5975     zipfileWrite16(a, ZIPFILE_EXTRA_TIMESTAMP);
5976     zipfileWrite16(a, 5);
5977     *a++ = 0x01;
5978     zipfileWrite32(a, pEntry->mUnixTime);
5979   }
5980 
5981   return a-aBuf;
5982 }
5983 
5984 static int zipfileCommit(sqlite3_vtab *pVtab){
5985   ZipfileTab *pTab = (ZipfileTab*)pVtab;
5986   int rc = SQLITE_OK;
5987   if( pTab->pWriteFd ){
5988     i64 iOffset = pTab->szCurrent;
5989     ZipfileEntry *p;
5990     ZipfileEOCD eocd;
5991     int nEntry = 0;
5992 
5993     /* Write out all entries */
5994     for(p=pTab->pFirstEntry; rc==SQLITE_OK && p; p=p->pNext){
5995       int n = zipfileSerializeCDS(p, pTab->aBuffer);
5996       rc = zipfileAppendData(pTab, pTab->aBuffer, n);
5997       nEntry++;
5998     }
5999 
6000     /* Write out the EOCD record */
6001     eocd.iDisk = 0;
6002     eocd.iFirstDisk = 0;
6003     eocd.nEntry = (u16)nEntry;
6004     eocd.nEntryTotal = (u16)nEntry;
6005     eocd.nSize = (u32)(pTab->szCurrent - iOffset);
6006     eocd.iOffset = (u32)iOffset;
6007     rc = zipfileAppendEOCD(pTab, &eocd);
6008 
6009     zipfileCleanupTransaction(pTab);
6010   }
6011   return rc;
6012 }
6013 
6014 static int zipfileRollback(sqlite3_vtab *pVtab){
6015   return zipfileCommit(pVtab);
6016 }
6017 
6018 static ZipfileCsr *zipfileFindCursor(ZipfileTab *pTab, i64 iId){
6019   ZipfileCsr *pCsr;
6020   for(pCsr=pTab->pCsrList; pCsr; pCsr=pCsr->pCsrNext){
6021     if( iId==pCsr->iId ) break;
6022   }
6023   return pCsr;
6024 }
6025 
6026 static void zipfileFunctionCds(
6027   sqlite3_context *context,
6028   int argc,
6029   sqlite3_value **argv
6030 ){
6031   ZipfileCsr *pCsr;
6032   ZipfileTab *pTab = (ZipfileTab*)sqlite3_user_data(context);
6033   assert( argc>0 );
6034 
6035   pCsr = zipfileFindCursor(pTab, sqlite3_value_int64(argv[0]));
6036   if( pCsr ){
6037     ZipfileCDS *p = &pCsr->pCurrent->cds;
6038     char *zRes = sqlite3_mprintf("{"
6039         "\"version-made-by\" : %u, "
6040         "\"version-to-extract\" : %u, "
6041         "\"flags\" : %u, "
6042         "\"compression\" : %u, "
6043         "\"time\" : %u, "
6044         "\"date\" : %u, "
6045         "\"crc32\" : %u, "
6046         "\"compressed-size\" : %u, "
6047         "\"uncompressed-size\" : %u, "
6048         "\"file-name-length\" : %u, "
6049         "\"extra-field-length\" : %u, "
6050         "\"file-comment-length\" : %u, "
6051         "\"disk-number-start\" : %u, "
6052         "\"internal-attr\" : %u, "
6053         "\"external-attr\" : %u, "
6054         "\"offset\" : %u }",
6055         (u32)p->iVersionMadeBy, (u32)p->iVersionExtract,
6056         (u32)p->flags, (u32)p->iCompression,
6057         (u32)p->mTime, (u32)p->mDate,
6058         (u32)p->crc32, (u32)p->szCompressed,
6059         (u32)p->szUncompressed, (u32)p->nFile,
6060         (u32)p->nExtra, (u32)p->nComment,
6061         (u32)p->iDiskStart, (u32)p->iInternalAttr,
6062         (u32)p->iExternalAttr, (u32)p->iOffset
6063     );
6064 
6065     if( zRes==0 ){
6066       sqlite3_result_error_nomem(context);
6067     }else{
6068       sqlite3_result_text(context, zRes, -1, SQLITE_TRANSIENT);
6069       sqlite3_free(zRes);
6070     }
6071   }
6072 }
6073 
6074 /*
6075 ** xFindFunction method.
6076 */
6077 static int zipfileFindFunction(
6078   sqlite3_vtab *pVtab,            /* Virtual table handle */
6079   int nArg,                       /* Number of SQL function arguments */
6080   const char *zName,              /* Name of SQL function */
6081   void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), /* OUT: Result */
6082   void **ppArg                    /* OUT: User data for *pxFunc */
6083 ){
6084   if( sqlite3_stricmp("zipfile_cds", zName)==0 ){
6085     *pxFunc = zipfileFunctionCds;
6086     *ppArg = (void*)pVtab;
6087     return 1;
6088   }
6089   return 0;
6090 }
6091 
6092 typedef struct ZipfileBuffer ZipfileBuffer;
6093 struct ZipfileBuffer {
6094   u8 *a;                          /* Pointer to buffer */
6095   int n;                          /* Size of buffer in bytes */
6096   int nAlloc;                     /* Byte allocated at a[] */
6097 };
6098 
6099 typedef struct ZipfileCtx ZipfileCtx;
6100 struct ZipfileCtx {
6101   int nEntry;
6102   ZipfileBuffer body;
6103   ZipfileBuffer cds;
6104 };
6105 
6106 static int zipfileBufferGrow(ZipfileBuffer *pBuf, int nByte){
6107   if( pBuf->n+nByte>pBuf->nAlloc ){
6108     u8 *aNew;
6109     sqlite3_int64 nNew = pBuf->n ? pBuf->n*2 : 512;
6110     int nReq = pBuf->n + nByte;
6111 
6112     while( nNew<nReq ) nNew = nNew*2;
6113     aNew = sqlite3_realloc64(pBuf->a, nNew);
6114     if( aNew==0 ) return SQLITE_NOMEM;
6115     pBuf->a = aNew;
6116     pBuf->nAlloc = (int)nNew;
6117   }
6118   return SQLITE_OK;
6119 }
6120 
6121 /*
6122 ** xStep() callback for the zipfile() aggregate. This can be called in
6123 ** any of the following ways:
6124 **
6125 **   SELECT zipfile(name,data) ...
6126 **   SELECT zipfile(name,mode,mtime,data) ...
6127 **   SELECT zipfile(name,mode,mtime,data,method) ...
6128 */
6129 void zipfileStep(sqlite3_context *pCtx, int nVal, sqlite3_value **apVal){
6130   ZipfileCtx *p;                  /* Aggregate function context */
6131   ZipfileEntry e;                 /* New entry to add to zip archive */
6132 
6133   sqlite3_value *pName = 0;
6134   sqlite3_value *pMode = 0;
6135   sqlite3_value *pMtime = 0;
6136   sqlite3_value *pData = 0;
6137   sqlite3_value *pMethod = 0;
6138 
6139   int bIsDir = 0;
6140   u32 mode;
6141   int rc = SQLITE_OK;
6142   char *zErr = 0;
6143 
6144   int iMethod = -1;               /* Compression method to use (0 or 8) */
6145 
6146   const u8 *aData = 0;            /* Possibly compressed data for new entry */
6147   int nData = 0;                  /* Size of aData[] in bytes */
6148   int szUncompressed = 0;         /* Size of data before compression */
6149   u8 *aFree = 0;                  /* Free this before returning */
6150   u32 iCrc32 = 0;                 /* crc32 of uncompressed data */
6151 
6152   char *zName = 0;                /* Path (name) of new entry */
6153   int nName = 0;                  /* Size of zName in bytes */
6154   char *zFree = 0;                /* Free this before returning */
6155   int nByte;
6156 
6157   memset(&e, 0, sizeof(e));
6158   p = (ZipfileCtx*)sqlite3_aggregate_context(pCtx, sizeof(ZipfileCtx));
6159   if( p==0 ) return;
6160 
6161   /* Martial the arguments into stack variables */
6162   if( nVal!=2 && nVal!=4 && nVal!=5 ){
6163     zErr = sqlite3_mprintf("wrong number of arguments to function zipfile()");
6164     rc = SQLITE_ERROR;
6165     goto zipfile_step_out;
6166   }
6167   pName = apVal[0];
6168   if( nVal==2 ){
6169     pData = apVal[1];
6170   }else{
6171     pMode = apVal[1];
6172     pMtime = apVal[2];
6173     pData = apVal[3];
6174     if( nVal==5 ){
6175       pMethod = apVal[4];
6176     }
6177   }
6178 
6179   /* Check that the 'name' parameter looks ok. */
6180   zName = (char*)sqlite3_value_text(pName);
6181   nName = sqlite3_value_bytes(pName);
6182   if( zName==0 ){
6183     zErr = sqlite3_mprintf("first argument to zipfile() must be non-NULL");
6184     rc = SQLITE_ERROR;
6185     goto zipfile_step_out;
6186   }
6187 
6188   /* Inspect the 'method' parameter. This must be either 0 (store), 8 (use
6189   ** deflate compression) or NULL (choose automatically).  */
6190   if( pMethod && SQLITE_NULL!=sqlite3_value_type(pMethod) ){
6191     iMethod = (int)sqlite3_value_int64(pMethod);
6192     if( iMethod!=0 && iMethod!=8 ){
6193       zErr = sqlite3_mprintf("illegal method value: %d", iMethod);
6194       rc = SQLITE_ERROR;
6195       goto zipfile_step_out;
6196     }
6197   }
6198 
6199   /* Now inspect the data. If this is NULL, then the new entry must be a
6200   ** directory.  Otherwise, figure out whether or not the data should
6201   ** be deflated or simply stored in the zip archive. */
6202   if( sqlite3_value_type(pData)==SQLITE_NULL ){
6203     bIsDir = 1;
6204     iMethod = 0;
6205   }else{
6206     aData = sqlite3_value_blob(pData);
6207     szUncompressed = nData = sqlite3_value_bytes(pData);
6208     iCrc32 = crc32(0, aData, nData);
6209     if( iMethod<0 || iMethod==8 ){
6210       int nOut = 0;
6211       rc = zipfileDeflate(aData, nData, &aFree, &nOut, &zErr);
6212       if( rc!=SQLITE_OK ){
6213         goto zipfile_step_out;
6214       }
6215       if( iMethod==8 || nOut<nData ){
6216         aData = aFree;
6217         nData = nOut;
6218         iMethod = 8;
6219       }else{
6220         iMethod = 0;
6221       }
6222     }
6223   }
6224 
6225   /* Decode the "mode" argument. */
6226   rc = zipfileGetMode(pMode, bIsDir, &mode, &zErr);
6227   if( rc ) goto zipfile_step_out;
6228 
6229   /* Decode the "mtime" argument. */
6230   e.mUnixTime = zipfileGetTime(pMtime);
6231 
6232   /* If this is a directory entry, ensure that there is exactly one '/'
6233   ** at the end of the path. Or, if this is not a directory and the path
6234   ** ends in '/' it is an error. */
6235   if( bIsDir==0 ){
6236     if( zName[nName-1]=='/' ){
6237       zErr = sqlite3_mprintf("non-directory name must not end with /");
6238       rc = SQLITE_ERROR;
6239       goto zipfile_step_out;
6240     }
6241   }else{
6242     if( zName[nName-1]!='/' ){
6243       zName = zFree = sqlite3_mprintf("%s/", zName);
6244       nName++;
6245       if( zName==0 ){
6246         rc = SQLITE_NOMEM;
6247         goto zipfile_step_out;
6248       }
6249     }else{
6250       while( nName>1 && zName[nName-2]=='/' ) nName--;
6251     }
6252   }
6253 
6254   /* Assemble the ZipfileEntry object for the new zip archive entry */
6255   e.cds.iVersionMadeBy = ZIPFILE_NEWENTRY_MADEBY;
6256   e.cds.iVersionExtract = ZIPFILE_NEWENTRY_REQUIRED;
6257   e.cds.flags = ZIPFILE_NEWENTRY_FLAGS;
6258   e.cds.iCompression = (u16)iMethod;
6259   zipfileMtimeToDos(&e.cds, (u32)e.mUnixTime);
6260   e.cds.crc32 = iCrc32;
6261   e.cds.szCompressed = nData;
6262   e.cds.szUncompressed = szUncompressed;
6263   e.cds.iExternalAttr = (mode<<16);
6264   e.cds.iOffset = p->body.n;
6265   e.cds.nFile = (u16)nName;
6266   e.cds.zFile = zName;
6267 
6268   /* Append the LFH to the body of the new archive */
6269   nByte = ZIPFILE_LFH_FIXED_SZ + e.cds.nFile + 9;
6270   if( (rc = zipfileBufferGrow(&p->body, nByte)) ) goto zipfile_step_out;
6271   p->body.n += zipfileSerializeLFH(&e, &p->body.a[p->body.n]);
6272 
6273   /* Append the data to the body of the new archive */
6274   if( nData>0 ){
6275     if( (rc = zipfileBufferGrow(&p->body, nData)) ) goto zipfile_step_out;
6276     memcpy(&p->body.a[p->body.n], aData, nData);
6277     p->body.n += nData;
6278   }
6279 
6280   /* Append the CDS record to the directory of the new archive */
6281   nByte = ZIPFILE_CDS_FIXED_SZ + e.cds.nFile + 9;
6282   if( (rc = zipfileBufferGrow(&p->cds, nByte)) ) goto zipfile_step_out;
6283   p->cds.n += zipfileSerializeCDS(&e, &p->cds.a[p->cds.n]);
6284 
6285   /* Increment the count of entries in the archive */
6286   p->nEntry++;
6287 
6288  zipfile_step_out:
6289   sqlite3_free(aFree);
6290   sqlite3_free(zFree);
6291   if( rc ){
6292     if( zErr ){
6293       sqlite3_result_error(pCtx, zErr, -1);
6294     }else{
6295       sqlite3_result_error_code(pCtx, rc);
6296     }
6297   }
6298   sqlite3_free(zErr);
6299 }
6300 
6301 /*
6302 ** xFinalize() callback for zipfile aggregate function.
6303 */
6304 void zipfileFinal(sqlite3_context *pCtx){
6305   ZipfileCtx *p;
6306   ZipfileEOCD eocd;
6307   sqlite3_int64 nZip;
6308   u8 *aZip;
6309 
6310   p = (ZipfileCtx*)sqlite3_aggregate_context(pCtx, sizeof(ZipfileCtx));
6311   if( p==0 ) return;
6312   if( p->nEntry>0 ){
6313     memset(&eocd, 0, sizeof(eocd));
6314     eocd.nEntry = (u16)p->nEntry;
6315     eocd.nEntryTotal = (u16)p->nEntry;
6316     eocd.nSize = p->cds.n;
6317     eocd.iOffset = p->body.n;
6318 
6319     nZip = p->body.n + p->cds.n + ZIPFILE_EOCD_FIXED_SZ;
6320     aZip = (u8*)sqlite3_malloc64(nZip);
6321     if( aZip==0 ){
6322       sqlite3_result_error_nomem(pCtx);
6323     }else{
6324       memcpy(aZip, p->body.a, p->body.n);
6325       memcpy(&aZip[p->body.n], p->cds.a, p->cds.n);
6326       zipfileSerializeEOCD(&eocd, &aZip[p->body.n + p->cds.n]);
6327       sqlite3_result_blob(pCtx, aZip, (int)nZip, zipfileFree);
6328     }
6329   }
6330 
6331   sqlite3_free(p->body.a);
6332   sqlite3_free(p->cds.a);
6333 }
6334 
6335 
6336 /*
6337 ** Register the "zipfile" virtual table.
6338 */
6339 static int zipfileRegister(sqlite3 *db){
6340   static sqlite3_module zipfileModule = {
6341     1,                         /* iVersion */
6342     zipfileConnect,            /* xCreate */
6343     zipfileConnect,            /* xConnect */
6344     zipfileBestIndex,          /* xBestIndex */
6345     zipfileDisconnect,         /* xDisconnect */
6346     zipfileDisconnect,         /* xDestroy */
6347     zipfileOpen,               /* xOpen - open a cursor */
6348     zipfileClose,              /* xClose - close a cursor */
6349     zipfileFilter,             /* xFilter - configure scan constraints */
6350     zipfileNext,               /* xNext - advance a cursor */
6351     zipfileEof,                /* xEof - check for end of scan */
6352     zipfileColumn,             /* xColumn - read data */
6353     0,                         /* xRowid - read data */
6354     zipfileUpdate,             /* xUpdate */
6355     zipfileBegin,              /* xBegin */
6356     0,                         /* xSync */
6357     zipfileCommit,             /* xCommit */
6358     zipfileRollback,           /* xRollback */
6359     zipfileFindFunction,       /* xFindMethod */
6360     0,                         /* xRename */
6361   };
6362 
6363   int rc = sqlite3_create_module(db, "zipfile"  , &zipfileModule, 0);
6364   if( rc==SQLITE_OK ) rc = sqlite3_overload_function(db, "zipfile_cds", -1);
6365   if( rc==SQLITE_OK ){
6366     rc = sqlite3_create_function(db, "zipfile", -1, SQLITE_UTF8, 0, 0,
6367         zipfileStep, zipfileFinal
6368     );
6369   }
6370   return rc;
6371 }
6372 #else         /* SQLITE_OMIT_VIRTUALTABLE */
6373 # define zipfileRegister(x) SQLITE_OK
6374 #endif
6375 
6376 #ifdef _WIN32
6377 
6378 #endif
6379 int sqlite3_zipfile_init(
6380   sqlite3 *db,
6381   char **pzErrMsg,
6382   const sqlite3_api_routines *pApi
6383 ){
6384   SQLITE_EXTENSION_INIT2(pApi);
6385   (void)pzErrMsg;  /* Unused parameter */
6386   return zipfileRegister(db);
6387 }
6388 
6389 /************************* End ../ext/misc/zipfile.c ********************/
6390 /************************* Begin ../ext/misc/sqlar.c ******************/
6391 /*
6392 ** 2017-12-17
6393 **
6394 ** The author disclaims copyright to this source code.  In place of
6395 ** a legal notice, here is a blessing:
6396 **
6397 **    May you do good and not evil.
6398 **    May you find forgiveness for yourself and forgive others.
6399 **    May you share freely, never taking more than you give.
6400 **
6401 ******************************************************************************
6402 **
6403 ** Utility functions sqlar_compress() and sqlar_uncompress(). Useful
6404 ** for working with sqlar archives and used by the shell tool's built-in
6405 ** sqlar support.
6406 */
6407 /* #include "sqlite3ext.h" */
6408 SQLITE_EXTENSION_INIT1
6409 #include <zlib.h>
6410 
6411 /*
6412 ** Implementation of the "sqlar_compress(X)" SQL function.
6413 **
6414 ** If the type of X is SQLITE_BLOB, and compressing that blob using
6415 ** zlib utility function compress() yields a smaller blob, return the
6416 ** compressed blob. Otherwise, return a copy of X.
6417 **
6418 ** SQLar uses the "zlib format" for compressed content.  The zlib format
6419 ** contains a two-byte identification header and a four-byte checksum at
6420 ** the end.  This is different from ZIP which uses the raw deflate format.
6421 **
6422 ** Future enhancements to SQLar might add support for new compression formats.
6423 ** If so, those new formats will be identified by alternative headers in the
6424 ** compressed data.
6425 */
6426 static void sqlarCompressFunc(
6427   sqlite3_context *context,
6428   int argc,
6429   sqlite3_value **argv
6430 ){
6431   assert( argc==1 );
6432   if( sqlite3_value_type(argv[0])==SQLITE_BLOB ){
6433     const Bytef *pData = sqlite3_value_blob(argv[0]);
6434     uLong nData = sqlite3_value_bytes(argv[0]);
6435     uLongf nOut = compressBound(nData);
6436     Bytef *pOut;
6437 
6438     pOut = (Bytef*)sqlite3_malloc(nOut);
6439     if( pOut==0 ){
6440       sqlite3_result_error_nomem(context);
6441       return;
6442     }else{
6443       if( Z_OK!=compress(pOut, &nOut, pData, nData) ){
6444         sqlite3_result_error(context, "error in compress()", -1);
6445       }else if( nOut<nData ){
6446         sqlite3_result_blob(context, pOut, nOut, SQLITE_TRANSIENT);
6447       }else{
6448         sqlite3_result_value(context, argv[0]);
6449       }
6450       sqlite3_free(pOut);
6451     }
6452   }else{
6453     sqlite3_result_value(context, argv[0]);
6454   }
6455 }
6456 
6457 /*
6458 ** Implementation of the "sqlar_uncompress(X,SZ)" SQL function
6459 **
6460 ** Parameter SZ is interpreted as an integer. If it is less than or
6461 ** equal to zero, then this function returns a copy of X. Or, if
6462 ** SZ is equal to the size of X when interpreted as a blob, also
6463 ** return a copy of X. Otherwise, decompress blob X using zlib
6464 ** utility function uncompress() and return the results (another
6465 ** blob).
6466 */
6467 static void sqlarUncompressFunc(
6468   sqlite3_context *context,
6469   int argc,
6470   sqlite3_value **argv
6471 ){
6472   uLong nData;
6473   uLongf sz;
6474 
6475   assert( argc==2 );
6476   sz = sqlite3_value_int(argv[1]);
6477 
6478   if( sz<=0 || sz==(nData = sqlite3_value_bytes(argv[0])) ){
6479     sqlite3_result_value(context, argv[0]);
6480   }else{
6481     const Bytef *pData= sqlite3_value_blob(argv[0]);
6482     Bytef *pOut = sqlite3_malloc(sz);
6483     if( Z_OK!=uncompress(pOut, &sz, pData, nData) ){
6484       sqlite3_result_error(context, "error in uncompress()", -1);
6485     }else{
6486       sqlite3_result_blob(context, pOut, sz, SQLITE_TRANSIENT);
6487     }
6488     sqlite3_free(pOut);
6489   }
6490 }
6491 
6492 
6493 #ifdef _WIN32
6494 
6495 #endif
6496 int sqlite3_sqlar_init(
6497   sqlite3 *db,
6498   char **pzErrMsg,
6499   const sqlite3_api_routines *pApi
6500 ){
6501   int rc = SQLITE_OK;
6502   SQLITE_EXTENSION_INIT2(pApi);
6503   (void)pzErrMsg;  /* Unused parameter */
6504   rc = sqlite3_create_function(db, "sqlar_compress", 1, SQLITE_UTF8, 0,
6505                                sqlarCompressFunc, 0, 0);
6506   if( rc==SQLITE_OK ){
6507     rc = sqlite3_create_function(db, "sqlar_uncompress", 2, SQLITE_UTF8, 0,
6508                                  sqlarUncompressFunc, 0, 0);
6509   }
6510   return rc;
6511 }
6512 
6513 /************************* End ../ext/misc/sqlar.c ********************/
6514 #endif
6515 /************************* Begin ../ext/expert/sqlite3expert.h ******************/
6516 /*
6517 ** 2017 April 07
6518 **
6519 ** The author disclaims copyright to this source code.  In place of
6520 ** a legal notice, here is a blessing:
6521 **
6522 **    May you do good and not evil.
6523 **    May you find forgiveness for yourself and forgive others.
6524 **    May you share freely, never taking more than you give.
6525 **
6526 *************************************************************************
6527 */
6528 
6529 
6530 /* #include "sqlite3.h" */
6531 
6532 typedef struct sqlite3expert sqlite3expert;
6533 
6534 /*
6535 ** Create a new sqlite3expert object.
6536 **
6537 ** If successful, a pointer to the new object is returned and (*pzErr) set
6538 ** to NULL. Or, if an error occurs, NULL is returned and (*pzErr) set to
6539 ** an English-language error message. In this case it is the responsibility
6540 ** of the caller to eventually free the error message buffer using
6541 ** sqlite3_free().
6542 */
6543 sqlite3expert *sqlite3_expert_new(sqlite3 *db, char **pzErr);
6544 
6545 /*
6546 ** Configure an sqlite3expert object.
6547 **
6548 ** EXPERT_CONFIG_SAMPLE:
6549 **   By default, sqlite3_expert_analyze() generates sqlite_stat1 data for
6550 **   each candidate index. This involves scanning and sorting the entire
6551 **   contents of each user database table once for each candidate index
6552 **   associated with the table. For large databases, this can be
6553 **   prohibitively slow. This option allows the sqlite3expert object to
6554 **   be configured so that sqlite_stat1 data is instead generated based on a
6555 **   subset of each table, or so that no sqlite_stat1 data is used at all.
6556 **
6557 **   A single integer argument is passed to this option. If the value is less
6558 **   than or equal to zero, then no sqlite_stat1 data is generated or used by
6559 **   the analysis - indexes are recommended based on the database schema only.
6560 **   Or, if the value is 100 or greater, complete sqlite_stat1 data is
6561 **   generated for each candidate index (this is the default). Finally, if the
6562 **   value falls between 0 and 100, then it represents the percentage of user
6563 **   table rows that should be considered when generating sqlite_stat1 data.
6564 **
6565 **   Examples:
6566 **
6567 **     // Do not generate any sqlite_stat1 data
6568 **     sqlite3_expert_config(pExpert, EXPERT_CONFIG_SAMPLE, 0);
6569 **
6570 **     // Generate sqlite_stat1 data based on 10% of the rows in each table.
6571 **     sqlite3_expert_config(pExpert, EXPERT_CONFIG_SAMPLE, 10);
6572 */
6573 int sqlite3_expert_config(sqlite3expert *p, int op, ...);
6574 
6575 #define EXPERT_CONFIG_SAMPLE 1    /* int */
6576 
6577 /*
6578 ** Specify zero or more SQL statements to be included in the analysis.
6579 **
6580 ** Buffer zSql must contain zero or more complete SQL statements. This
6581 ** function parses all statements contained in the buffer and adds them
6582 ** to the internal list of statements to analyze. If successful, SQLITE_OK
6583 ** is returned and (*pzErr) set to NULL. Or, if an error occurs - for example
6584 ** due to a error in the SQL - an SQLite error code is returned and (*pzErr)
6585 ** may be set to point to an English language error message. In this case
6586 ** the caller is responsible for eventually freeing the error message buffer
6587 ** using sqlite3_free().
6588 **
6589 ** If an error does occur while processing one of the statements in the
6590 ** buffer passed as the second argument, none of the statements in the
6591 ** buffer are added to the analysis.
6592 **
6593 ** This function must be called before sqlite3_expert_analyze(). If a call
6594 ** to this function is made on an sqlite3expert object that has already
6595 ** been passed to sqlite3_expert_analyze() SQLITE_MISUSE is returned
6596 ** immediately and no statements are added to the analysis.
6597 */
6598 int sqlite3_expert_sql(
6599   sqlite3expert *p,               /* From a successful sqlite3_expert_new() */
6600   const char *zSql,               /* SQL statement(s) to add */
6601   char **pzErr                    /* OUT: Error message (if any) */
6602 );
6603 
6604 
6605 /*
6606 ** This function is called after the sqlite3expert object has been configured
6607 ** with all SQL statements using sqlite3_expert_sql() to actually perform
6608 ** the analysis. Once this function has been called, it is not possible to
6609 ** add further SQL statements to the analysis.
6610 **
6611 ** If successful, SQLITE_OK is returned and (*pzErr) is set to NULL. Or, if
6612 ** an error occurs, an SQLite error code is returned and (*pzErr) set to
6613 ** point to a buffer containing an English language error message. In this
6614 ** case it is the responsibility of the caller to eventually free the buffer
6615 ** using sqlite3_free().
6616 **
6617 ** If an error does occur within this function, the sqlite3expert object
6618 ** is no longer useful for any purpose. At that point it is no longer
6619 ** possible to add further SQL statements to the object or to re-attempt
6620 ** the analysis. The sqlite3expert object must still be freed using a call
6621 ** sqlite3_expert_destroy().
6622 */
6623 int sqlite3_expert_analyze(sqlite3expert *p, char **pzErr);
6624 
6625 /*
6626 ** Return the total number of statements loaded using sqlite3_expert_sql().
6627 ** The total number of SQL statements may be different from the total number
6628 ** to calls to sqlite3_expert_sql().
6629 */
6630 int sqlite3_expert_count(sqlite3expert*);
6631 
6632 /*
6633 ** Return a component of the report.
6634 **
6635 ** This function is called after sqlite3_expert_analyze() to extract the
6636 ** results of the analysis. Each call to this function returns either a
6637 ** NULL pointer or a pointer to a buffer containing a nul-terminated string.
6638 ** The value passed as the third argument must be one of the EXPERT_REPORT_*
6639 ** #define constants defined below.
6640 **
6641 ** For some EXPERT_REPORT_* parameters, the buffer returned contains
6642 ** information relating to a specific SQL statement. In these cases that
6643 ** SQL statement is identified by the value passed as the second argument.
6644 ** SQL statements are numbered from 0 in the order in which they are parsed.
6645 ** If an out-of-range value (less than zero or equal to or greater than the
6646 ** value returned by sqlite3_expert_count()) is passed as the second argument
6647 ** along with such an EXPERT_REPORT_* parameter, NULL is always returned.
6648 **
6649 ** EXPERT_REPORT_SQL:
6650 **   Return the text of SQL statement iStmt.
6651 **
6652 ** EXPERT_REPORT_INDEXES:
6653 **   Return a buffer containing the CREATE INDEX statements for all recommended
6654 **   indexes for statement iStmt. If there are no new recommeded indexes, NULL
6655 **   is returned.
6656 **
6657 ** EXPERT_REPORT_PLAN:
6658 **   Return a buffer containing the EXPLAIN QUERY PLAN output for SQL query
6659 **   iStmt after the proposed indexes have been added to the database schema.
6660 **
6661 ** EXPERT_REPORT_CANDIDATES:
6662 **   Return a pointer to a buffer containing the CREATE INDEX statements
6663 **   for all indexes that were tested (for all SQL statements). The iStmt
6664 **   parameter is ignored for EXPERT_REPORT_CANDIDATES calls.
6665 */
6666 const char *sqlite3_expert_report(sqlite3expert*, int iStmt, int eReport);
6667 
6668 /*
6669 ** Values for the third argument passed to sqlite3_expert_report().
6670 */
6671 #define EXPERT_REPORT_SQL        1
6672 #define EXPERT_REPORT_INDEXES    2
6673 #define EXPERT_REPORT_PLAN       3
6674 #define EXPERT_REPORT_CANDIDATES 4
6675 
6676 /*
6677 ** Free an (sqlite3expert*) handle and all associated resources. There
6678 ** should be one call to this function for each successful call to
6679 ** sqlite3-expert_new().
6680 */
6681 void sqlite3_expert_destroy(sqlite3expert*);
6682 
6683 
6684 
6685 /************************* End ../ext/expert/sqlite3expert.h ********************/
6686 /************************* Begin ../ext/expert/sqlite3expert.c ******************/
6687 /*
6688 ** 2017 April 09
6689 **
6690 ** The author disclaims copyright to this source code.  In place of
6691 ** a legal notice, here is a blessing:
6692 **
6693 **    May you do good and not evil.
6694 **    May you find forgiveness for yourself and forgive others.
6695 **    May you share freely, never taking more than you give.
6696 **
6697 *************************************************************************
6698 */
6699 /* #include "sqlite3expert.h" */
6700 #include <assert.h>
6701 #include <string.h>
6702 #include <stdio.h>
6703 
6704 #ifndef SQLITE_OMIT_VIRTUALTABLE
6705 
6706 /* typedef sqlite3_int64 i64; */
6707 /* typedef sqlite3_uint64 u64; */
6708 
6709 typedef struct IdxColumn IdxColumn;
6710 typedef struct IdxConstraint IdxConstraint;
6711 typedef struct IdxScan IdxScan;
6712 typedef struct IdxStatement IdxStatement;
6713 typedef struct IdxTable IdxTable;
6714 typedef struct IdxWrite IdxWrite;
6715 
6716 #define STRLEN  (int)strlen
6717 
6718 /*
6719 ** A temp table name that we assume no user database will actually use.
6720 ** If this assumption proves incorrect triggers on the table with the
6721 ** conflicting name will be ignored.
6722 */
6723 #define UNIQUE_TABLE_NAME "t592690916721053953805701627921227776"
6724 
6725 /*
6726 ** A single constraint. Equivalent to either "col = ?" or "col < ?" (or
6727 ** any other type of single-ended range constraint on a column).
6728 **
6729 ** pLink:
6730 **   Used to temporarily link IdxConstraint objects into lists while
6731 **   creating candidate indexes.
6732 */
6733 struct IdxConstraint {
6734   char *zColl;                    /* Collation sequence */
6735   int bRange;                     /* True for range, false for eq */
6736   int iCol;                       /* Constrained table column */
6737   int bFlag;                      /* Used by idxFindCompatible() */
6738   int bDesc;                      /* True if ORDER BY <expr> DESC */
6739   IdxConstraint *pNext;           /* Next constraint in pEq or pRange list */
6740   IdxConstraint *pLink;           /* See above */
6741 };
6742 
6743 /*
6744 ** A single scan of a single table.
6745 */
6746 struct IdxScan {
6747   IdxTable *pTab;                 /* Associated table object */
6748   int iDb;                        /* Database containing table zTable */
6749   i64 covering;                   /* Mask of columns required for cov. index */
6750   IdxConstraint *pOrder;          /* ORDER BY columns */
6751   IdxConstraint *pEq;             /* List of == constraints */
6752   IdxConstraint *pRange;          /* List of < constraints */
6753   IdxScan *pNextScan;             /* Next IdxScan object for same analysis */
6754 };
6755 
6756 /*
6757 ** Information regarding a single database table. Extracted from
6758 ** "PRAGMA table_info" by function idxGetTableInfo().
6759 */
6760 struct IdxColumn {
6761   char *zName;
6762   char *zColl;
6763   int iPk;
6764 };
6765 struct IdxTable {
6766   int nCol;
6767   char *zName;                    /* Table name */
6768   IdxColumn *aCol;
6769   IdxTable *pNext;                /* Next table in linked list of all tables */
6770 };
6771 
6772 /*
6773 ** An object of the following type is created for each unique table/write-op
6774 ** seen. The objects are stored in a singly-linked list beginning at
6775 ** sqlite3expert.pWrite.
6776 */
6777 struct IdxWrite {
6778   IdxTable *pTab;
6779   int eOp;                        /* SQLITE_UPDATE, DELETE or INSERT */
6780   IdxWrite *pNext;
6781 };
6782 
6783 /*
6784 ** Each statement being analyzed is represented by an instance of this
6785 ** structure.
6786 */
6787 struct IdxStatement {
6788   int iId;                        /* Statement number */
6789   char *zSql;                     /* SQL statement */
6790   char *zIdx;                     /* Indexes */
6791   char *zEQP;                     /* Plan */
6792   IdxStatement *pNext;
6793 };
6794 
6795 
6796 /*
6797 ** A hash table for storing strings. With space for a payload string
6798 ** with each entry. Methods are:
6799 **
6800 **   idxHashInit()
6801 **   idxHashClear()
6802 **   idxHashAdd()
6803 **   idxHashSearch()
6804 */
6805 #define IDX_HASH_SIZE 1023
6806 typedef struct IdxHashEntry IdxHashEntry;
6807 typedef struct IdxHash IdxHash;
6808 struct IdxHashEntry {
6809   char *zKey;                     /* nul-terminated key */
6810   char *zVal;                     /* nul-terminated value string */
6811   char *zVal2;                    /* nul-terminated value string 2 */
6812   IdxHashEntry *pHashNext;        /* Next entry in same hash bucket */
6813   IdxHashEntry *pNext;            /* Next entry in hash */
6814 };
6815 struct IdxHash {
6816   IdxHashEntry *pFirst;
6817   IdxHashEntry *aHash[IDX_HASH_SIZE];
6818 };
6819 
6820 /*
6821 ** sqlite3expert object.
6822 */
6823 struct sqlite3expert {
6824   int iSample;                    /* Percentage of tables to sample for stat1 */
6825   sqlite3 *db;                    /* User database */
6826   sqlite3 *dbm;                   /* In-memory db for this analysis */
6827   sqlite3 *dbv;                   /* Vtab schema for this analysis */
6828   IdxTable *pTable;               /* List of all IdxTable objects */
6829   IdxScan *pScan;                 /* List of scan objects */
6830   IdxWrite *pWrite;               /* List of write objects */
6831   IdxStatement *pStatement;       /* List of IdxStatement objects */
6832   int bRun;                       /* True once analysis has run */
6833   char **pzErrmsg;
6834   int rc;                         /* Error code from whereinfo hook */
6835   IdxHash hIdx;                   /* Hash containing all candidate indexes */
6836   char *zCandidates;              /* For EXPERT_REPORT_CANDIDATES */
6837 };
6838 
6839 
6840 /*
6841 ** Allocate and return nByte bytes of zeroed memory using sqlite3_malloc().
6842 ** If the allocation fails, set *pRc to SQLITE_NOMEM and return NULL.
6843 */
6844 static void *idxMalloc(int *pRc, int nByte){
6845   void *pRet;
6846   assert( *pRc==SQLITE_OK );
6847   assert( nByte>0 );
6848   pRet = sqlite3_malloc(nByte);
6849   if( pRet ){
6850     memset(pRet, 0, nByte);
6851   }else{
6852     *pRc = SQLITE_NOMEM;
6853   }
6854   return pRet;
6855 }
6856 
6857 /*
6858 ** Initialize an IdxHash hash table.
6859 */
6860 static void idxHashInit(IdxHash *pHash){
6861   memset(pHash, 0, sizeof(IdxHash));
6862 }
6863 
6864 /*
6865 ** Reset an IdxHash hash table.
6866 */
6867 static void idxHashClear(IdxHash *pHash){
6868   int i;
6869   for(i=0; i<IDX_HASH_SIZE; i++){
6870     IdxHashEntry *pEntry;
6871     IdxHashEntry *pNext;
6872     for(pEntry=pHash->aHash[i]; pEntry; pEntry=pNext){
6873       pNext = pEntry->pHashNext;
6874       sqlite3_free(pEntry->zVal2);
6875       sqlite3_free(pEntry);
6876     }
6877   }
6878   memset(pHash, 0, sizeof(IdxHash));
6879 }
6880 
6881 /*
6882 ** Return the index of the hash bucket that the string specified by the
6883 ** arguments to this function belongs.
6884 */
6885 static int idxHashString(const char *z, int n){
6886   unsigned int ret = 0;
6887   int i;
6888   for(i=0; i<n; i++){
6889     ret += (ret<<3) + (unsigned char)(z[i]);
6890   }
6891   return (int)(ret % IDX_HASH_SIZE);
6892 }
6893 
6894 /*
6895 ** If zKey is already present in the hash table, return non-zero and do
6896 ** nothing. Otherwise, add an entry with key zKey and payload string zVal to
6897 ** the hash table passed as the second argument.
6898 */
6899 static int idxHashAdd(
6900   int *pRc,
6901   IdxHash *pHash,
6902   const char *zKey,
6903   const char *zVal
6904 ){
6905   int nKey = STRLEN(zKey);
6906   int iHash = idxHashString(zKey, nKey);
6907   int nVal = (zVal ? STRLEN(zVal) : 0);
6908   IdxHashEntry *pEntry;
6909   assert( iHash>=0 );
6910   for(pEntry=pHash->aHash[iHash]; pEntry; pEntry=pEntry->pHashNext){
6911     if( STRLEN(pEntry->zKey)==nKey && 0==memcmp(pEntry->zKey, zKey, nKey) ){
6912       return 1;
6913     }
6914   }
6915   pEntry = idxMalloc(pRc, sizeof(IdxHashEntry) + nKey+1 + nVal+1);
6916   if( pEntry ){
6917     pEntry->zKey = (char*)&pEntry[1];
6918     memcpy(pEntry->zKey, zKey, nKey);
6919     if( zVal ){
6920       pEntry->zVal = &pEntry->zKey[nKey+1];
6921       memcpy(pEntry->zVal, zVal, nVal);
6922     }
6923     pEntry->pHashNext = pHash->aHash[iHash];
6924     pHash->aHash[iHash] = pEntry;
6925 
6926     pEntry->pNext = pHash->pFirst;
6927     pHash->pFirst = pEntry;
6928   }
6929   return 0;
6930 }
6931 
6932 /*
6933 ** If zKey/nKey is present in the hash table, return a pointer to the
6934 ** hash-entry object.
6935 */
6936 static IdxHashEntry *idxHashFind(IdxHash *pHash, const char *zKey, int nKey){
6937   int iHash;
6938   IdxHashEntry *pEntry;
6939   if( nKey<0 ) nKey = STRLEN(zKey);
6940   iHash = idxHashString(zKey, nKey);
6941   assert( iHash>=0 );
6942   for(pEntry=pHash->aHash[iHash]; pEntry; pEntry=pEntry->pHashNext){
6943     if( STRLEN(pEntry->zKey)==nKey && 0==memcmp(pEntry->zKey, zKey, nKey) ){
6944       return pEntry;
6945     }
6946   }
6947   return 0;
6948 }
6949 
6950 /*
6951 ** If the hash table contains an entry with a key equal to the string
6952 ** passed as the final two arguments to this function, return a pointer
6953 ** to the payload string. Otherwise, if zKey/nKey is not present in the
6954 ** hash table, return NULL.
6955 */
6956 static const char *idxHashSearch(IdxHash *pHash, const char *zKey, int nKey){
6957   IdxHashEntry *pEntry = idxHashFind(pHash, zKey, nKey);
6958   if( pEntry ) return pEntry->zVal;
6959   return 0;
6960 }
6961 
6962 /*
6963 ** Allocate and return a new IdxConstraint object. Set the IdxConstraint.zColl
6964 ** variable to point to a copy of nul-terminated string zColl.
6965 */
6966 static IdxConstraint *idxNewConstraint(int *pRc, const char *zColl){
6967   IdxConstraint *pNew;
6968   int nColl = STRLEN(zColl);
6969 
6970   assert( *pRc==SQLITE_OK );
6971   pNew = (IdxConstraint*)idxMalloc(pRc, sizeof(IdxConstraint) * nColl + 1);
6972   if( pNew ){
6973     pNew->zColl = (char*)&pNew[1];
6974     memcpy(pNew->zColl, zColl, nColl+1);
6975   }
6976   return pNew;
6977 }
6978 
6979 /*
6980 ** An error associated with database handle db has just occurred. Pass
6981 ** the error message to callback function xOut.
6982 */
6983 static void idxDatabaseError(
6984   sqlite3 *db,                    /* Database handle */
6985   char **pzErrmsg                 /* Write error here */
6986 ){
6987   *pzErrmsg = sqlite3_mprintf("%s", sqlite3_errmsg(db));
6988 }
6989 
6990 /*
6991 ** Prepare an SQL statement.
6992 */
6993 static int idxPrepareStmt(
6994   sqlite3 *db,                    /* Database handle to compile against */
6995   sqlite3_stmt **ppStmt,          /* OUT: Compiled SQL statement */
6996   char **pzErrmsg,                /* OUT: sqlite3_malloc()ed error message */
6997   const char *zSql                /* SQL statement to compile */
6998 ){
6999   int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0);
7000   if( rc!=SQLITE_OK ){
7001     *ppStmt = 0;
7002     idxDatabaseError(db, pzErrmsg);
7003   }
7004   return rc;
7005 }
7006 
7007 /*
7008 ** Prepare an SQL statement using the results of a printf() formatting.
7009 */
7010 static int idxPrintfPrepareStmt(
7011   sqlite3 *db,                    /* Database handle to compile against */
7012   sqlite3_stmt **ppStmt,          /* OUT: Compiled SQL statement */
7013   char **pzErrmsg,                /* OUT: sqlite3_malloc()ed error message */
7014   const char *zFmt,               /* printf() format of SQL statement */
7015   ...                             /* Trailing printf() arguments */
7016 ){
7017   va_list ap;
7018   int rc;
7019   char *zSql;
7020   va_start(ap, zFmt);
7021   zSql = sqlite3_vmprintf(zFmt, ap);
7022   if( zSql==0 ){
7023     rc = SQLITE_NOMEM;
7024   }else{
7025     rc = idxPrepareStmt(db, ppStmt, pzErrmsg, zSql);
7026     sqlite3_free(zSql);
7027   }
7028   va_end(ap);
7029   return rc;
7030 }
7031 
7032 
7033 /*************************************************************************
7034 ** Beginning of virtual table implementation.
7035 */
7036 typedef struct ExpertVtab ExpertVtab;
7037 struct ExpertVtab {
7038   sqlite3_vtab base;
7039   IdxTable *pTab;
7040   sqlite3expert *pExpert;
7041 };
7042 
7043 typedef struct ExpertCsr ExpertCsr;
7044 struct ExpertCsr {
7045   sqlite3_vtab_cursor base;
7046   sqlite3_stmt *pData;
7047 };
7048 
7049 static char *expertDequote(const char *zIn){
7050   int n = STRLEN(zIn);
7051   char *zRet = sqlite3_malloc(n);
7052 
7053   assert( zIn[0]=='\'' );
7054   assert( zIn[n-1]=='\'' );
7055 
7056   if( zRet ){
7057     int iOut = 0;
7058     int iIn = 0;
7059     for(iIn=1; iIn<(n-1); iIn++){
7060       if( zIn[iIn]=='\'' ){
7061         assert( zIn[iIn+1]=='\'' );
7062         iIn++;
7063       }
7064       zRet[iOut++] = zIn[iIn];
7065     }
7066     zRet[iOut] = '\0';
7067   }
7068 
7069   return zRet;
7070 }
7071 
7072 /*
7073 ** This function is the implementation of both the xConnect and xCreate
7074 ** methods of the r-tree virtual table.
7075 **
7076 **   argv[0]   -> module name
7077 **   argv[1]   -> database name
7078 **   argv[2]   -> table name
7079 **   argv[...] -> column names...
7080 */
7081 static int expertConnect(
7082   sqlite3 *db,
7083   void *pAux,
7084   int argc, const char *const*argv,
7085   sqlite3_vtab **ppVtab,
7086   char **pzErr
7087 ){
7088   sqlite3expert *pExpert = (sqlite3expert*)pAux;
7089   ExpertVtab *p = 0;
7090   int rc;
7091 
7092   if( argc!=4 ){
7093     *pzErr = sqlite3_mprintf("internal error!");
7094     rc = SQLITE_ERROR;
7095   }else{
7096     char *zCreateTable = expertDequote(argv[3]);
7097     if( zCreateTable ){
7098       rc = sqlite3_declare_vtab(db, zCreateTable);
7099       if( rc==SQLITE_OK ){
7100         p = idxMalloc(&rc, sizeof(ExpertVtab));
7101       }
7102       if( rc==SQLITE_OK ){
7103         p->pExpert = pExpert;
7104         p->pTab = pExpert->pTable;
7105         assert( sqlite3_stricmp(p->pTab->zName, argv[2])==0 );
7106       }
7107       sqlite3_free(zCreateTable);
7108     }else{
7109       rc = SQLITE_NOMEM;
7110     }
7111   }
7112 
7113   *ppVtab = (sqlite3_vtab*)p;
7114   return rc;
7115 }
7116 
7117 static int expertDisconnect(sqlite3_vtab *pVtab){
7118   ExpertVtab *p = (ExpertVtab*)pVtab;
7119   sqlite3_free(p);
7120   return SQLITE_OK;
7121 }
7122 
7123 static int expertBestIndex(sqlite3_vtab *pVtab, sqlite3_index_info *pIdxInfo){
7124   ExpertVtab *p = (ExpertVtab*)pVtab;
7125   int rc = SQLITE_OK;
7126   int n = 0;
7127   IdxScan *pScan;
7128   const int opmask =
7129     SQLITE_INDEX_CONSTRAINT_EQ | SQLITE_INDEX_CONSTRAINT_GT |
7130     SQLITE_INDEX_CONSTRAINT_LT | SQLITE_INDEX_CONSTRAINT_GE |
7131     SQLITE_INDEX_CONSTRAINT_LE;
7132 
7133   pScan = idxMalloc(&rc, sizeof(IdxScan));
7134   if( pScan ){
7135     int i;
7136 
7137     /* Link the new scan object into the list */
7138     pScan->pTab = p->pTab;
7139     pScan->pNextScan = p->pExpert->pScan;
7140     p->pExpert->pScan = pScan;
7141 
7142     /* Add the constraints to the IdxScan object */
7143     for(i=0; i<pIdxInfo->nConstraint; i++){
7144       struct sqlite3_index_constraint *pCons = &pIdxInfo->aConstraint[i];
7145       if( pCons->usable
7146        && pCons->iColumn>=0
7147        && p->pTab->aCol[pCons->iColumn].iPk==0
7148        && (pCons->op & opmask)
7149       ){
7150         IdxConstraint *pNew;
7151         const char *zColl = sqlite3_vtab_collation(pIdxInfo, i);
7152         pNew = idxNewConstraint(&rc, zColl);
7153         if( pNew ){
7154           pNew->iCol = pCons->iColumn;
7155           if( pCons->op==SQLITE_INDEX_CONSTRAINT_EQ ){
7156             pNew->pNext = pScan->pEq;
7157             pScan->pEq = pNew;
7158           }else{
7159             pNew->bRange = 1;
7160             pNew->pNext = pScan->pRange;
7161             pScan->pRange = pNew;
7162           }
7163         }
7164         n++;
7165         pIdxInfo->aConstraintUsage[i].argvIndex = n;
7166       }
7167     }
7168 
7169     /* Add the ORDER BY to the IdxScan object */
7170     for(i=pIdxInfo->nOrderBy-1; i>=0; i--){
7171       int iCol = pIdxInfo->aOrderBy[i].iColumn;
7172       if( iCol>=0 ){
7173         IdxConstraint *pNew = idxNewConstraint(&rc, p->pTab->aCol[iCol].zColl);
7174         if( pNew ){
7175           pNew->iCol = iCol;
7176           pNew->bDesc = pIdxInfo->aOrderBy[i].desc;
7177           pNew->pNext = pScan->pOrder;
7178           pNew->pLink = pScan->pOrder;
7179           pScan->pOrder = pNew;
7180           n++;
7181         }
7182       }
7183     }
7184   }
7185 
7186   pIdxInfo->estimatedCost = 1000000.0 / (n+1);
7187   return rc;
7188 }
7189 
7190 static int expertUpdate(
7191   sqlite3_vtab *pVtab,
7192   int nData,
7193   sqlite3_value **azData,
7194   sqlite_int64 *pRowid
7195 ){
7196   (void)pVtab;
7197   (void)nData;
7198   (void)azData;
7199   (void)pRowid;
7200   return SQLITE_OK;
7201 }
7202 
7203 /*
7204 ** Virtual table module xOpen method.
7205 */
7206 static int expertOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){
7207   int rc = SQLITE_OK;
7208   ExpertCsr *pCsr;
7209   (void)pVTab;
7210   pCsr = idxMalloc(&rc, sizeof(ExpertCsr));
7211   *ppCursor = (sqlite3_vtab_cursor*)pCsr;
7212   return rc;
7213 }
7214 
7215 /*
7216 ** Virtual table module xClose method.
7217 */
7218 static int expertClose(sqlite3_vtab_cursor *cur){
7219   ExpertCsr *pCsr = (ExpertCsr*)cur;
7220   sqlite3_finalize(pCsr->pData);
7221   sqlite3_free(pCsr);
7222   return SQLITE_OK;
7223 }
7224 
7225 /*
7226 ** Virtual table module xEof method.
7227 **
7228 ** Return non-zero if the cursor does not currently point to a valid
7229 ** record (i.e if the scan has finished), or zero otherwise.
7230 */
7231 static int expertEof(sqlite3_vtab_cursor *cur){
7232   ExpertCsr *pCsr = (ExpertCsr*)cur;
7233   return pCsr->pData==0;
7234 }
7235 
7236 /*
7237 ** Virtual table module xNext method.
7238 */
7239 static int expertNext(sqlite3_vtab_cursor *cur){
7240   ExpertCsr *pCsr = (ExpertCsr*)cur;
7241   int rc = SQLITE_OK;
7242 
7243   assert( pCsr->pData );
7244   rc = sqlite3_step(pCsr->pData);
7245   if( rc!=SQLITE_ROW ){
7246     rc = sqlite3_finalize(pCsr->pData);
7247     pCsr->pData = 0;
7248   }else{
7249     rc = SQLITE_OK;
7250   }
7251 
7252   return rc;
7253 }
7254 
7255 /*
7256 ** Virtual table module xRowid method.
7257 */
7258 static int expertRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
7259   (void)cur;
7260   *pRowid = 0;
7261   return SQLITE_OK;
7262 }
7263 
7264 /*
7265 ** Virtual table module xColumn method.
7266 */
7267 static int expertColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){
7268   ExpertCsr *pCsr = (ExpertCsr*)cur;
7269   sqlite3_value *pVal;
7270   pVal = sqlite3_column_value(pCsr->pData, i);
7271   if( pVal ){
7272     sqlite3_result_value(ctx, pVal);
7273   }
7274   return SQLITE_OK;
7275 }
7276 
7277 /*
7278 ** Virtual table module xFilter method.
7279 */
7280 static int expertFilter(
7281   sqlite3_vtab_cursor *cur,
7282   int idxNum, const char *idxStr,
7283   int argc, sqlite3_value **argv
7284 ){
7285   ExpertCsr *pCsr = (ExpertCsr*)cur;
7286   ExpertVtab *pVtab = (ExpertVtab*)(cur->pVtab);
7287   sqlite3expert *pExpert = pVtab->pExpert;
7288   int rc;
7289 
7290   (void)idxNum;
7291   (void)idxStr;
7292   (void)argc;
7293   (void)argv;
7294   rc = sqlite3_finalize(pCsr->pData);
7295   pCsr->pData = 0;
7296   if( rc==SQLITE_OK ){
7297     rc = idxPrintfPrepareStmt(pExpert->db, &pCsr->pData, &pVtab->base.zErrMsg,
7298         "SELECT * FROM main.%Q WHERE sample()", pVtab->pTab->zName
7299     );
7300   }
7301 
7302   if( rc==SQLITE_OK ){
7303     rc = expertNext(cur);
7304   }
7305   return rc;
7306 }
7307 
7308 static int idxRegisterVtab(sqlite3expert *p){
7309   static sqlite3_module expertModule = {
7310     2,                            /* iVersion */
7311     expertConnect,                /* xCreate - create a table */
7312     expertConnect,                /* xConnect - connect to an existing table */
7313     expertBestIndex,              /* xBestIndex - Determine search strategy */
7314     expertDisconnect,             /* xDisconnect - Disconnect from a table */
7315     expertDisconnect,             /* xDestroy - Drop a table */
7316     expertOpen,                   /* xOpen - open a cursor */
7317     expertClose,                  /* xClose - close a cursor */
7318     expertFilter,                 /* xFilter - configure scan constraints */
7319     expertNext,                   /* xNext - advance a cursor */
7320     expertEof,                    /* xEof */
7321     expertColumn,                 /* xColumn - read data */
7322     expertRowid,                  /* xRowid - read data */
7323     expertUpdate,                 /* xUpdate - write data */
7324     0,                            /* xBegin - begin transaction */
7325     0,                            /* xSync - sync transaction */
7326     0,                            /* xCommit - commit transaction */
7327     0,                            /* xRollback - rollback transaction */
7328     0,                            /* xFindFunction - function overloading */
7329     0,                            /* xRename - rename the table */
7330     0,                            /* xSavepoint */
7331     0,                            /* xRelease */
7332     0,                            /* xRollbackTo */
7333     0,                            /* xShadowName */
7334   };
7335 
7336   return sqlite3_create_module(p->dbv, "expert", &expertModule, (void*)p);
7337 }
7338 /*
7339 ** End of virtual table implementation.
7340 *************************************************************************/
7341 /*
7342 ** Finalize SQL statement pStmt. If (*pRc) is SQLITE_OK when this function
7343 ** is called, set it to the return value of sqlite3_finalize() before
7344 ** returning. Otherwise, discard the sqlite3_finalize() return value.
7345 */
7346 static void idxFinalize(int *pRc, sqlite3_stmt *pStmt){
7347   int rc = sqlite3_finalize(pStmt);
7348   if( *pRc==SQLITE_OK ) *pRc = rc;
7349 }
7350 
7351 /*
7352 ** Attempt to allocate an IdxTable structure corresponding to table zTab
7353 ** in the main database of connection db. If successful, set (*ppOut) to
7354 ** point to the new object and return SQLITE_OK. Otherwise, return an
7355 ** SQLite error code and set (*ppOut) to NULL. In this case *pzErrmsg may be
7356 ** set to point to an error string.
7357 **
7358 ** It is the responsibility of the caller to eventually free either the
7359 ** IdxTable object or error message using sqlite3_free().
7360 */
7361 static int idxGetTableInfo(
7362   sqlite3 *db,                    /* Database connection to read details from */
7363   const char *zTab,               /* Table name */
7364   IdxTable **ppOut,               /* OUT: New object (if successful) */
7365   char **pzErrmsg                 /* OUT: Error message (if not) */
7366 ){
7367   sqlite3_stmt *p1 = 0;
7368   int nCol = 0;
7369   int nTab = STRLEN(zTab);
7370   int nByte = sizeof(IdxTable) + nTab + 1;
7371   IdxTable *pNew = 0;
7372   int rc, rc2;
7373   char *pCsr = 0;
7374 
7375   rc = idxPrintfPrepareStmt(db, &p1, pzErrmsg, "PRAGMA table_info=%Q", zTab);
7376   while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(p1) ){
7377     const char *zCol = (const char*)sqlite3_column_text(p1, 1);
7378     nByte += 1 + STRLEN(zCol);
7379     rc = sqlite3_table_column_metadata(
7380         db, "main", zTab, zCol, 0, &zCol, 0, 0, 0
7381     );
7382     nByte += 1 + STRLEN(zCol);
7383     nCol++;
7384   }
7385   rc2 = sqlite3_reset(p1);
7386   if( rc==SQLITE_OK ) rc = rc2;
7387 
7388   nByte += sizeof(IdxColumn) * nCol;
7389   if( rc==SQLITE_OK ){
7390     pNew = idxMalloc(&rc, nByte);
7391   }
7392   if( rc==SQLITE_OK ){
7393     pNew->aCol = (IdxColumn*)&pNew[1];
7394     pNew->nCol = nCol;
7395     pCsr = (char*)&pNew->aCol[nCol];
7396   }
7397 
7398   nCol = 0;
7399   while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(p1) ){
7400     const char *zCol = (const char*)sqlite3_column_text(p1, 1);
7401     int nCopy = STRLEN(zCol) + 1;
7402     pNew->aCol[nCol].zName = pCsr;
7403     pNew->aCol[nCol].iPk = sqlite3_column_int(p1, 5);
7404     memcpy(pCsr, zCol, nCopy);
7405     pCsr += nCopy;
7406 
7407     rc = sqlite3_table_column_metadata(
7408         db, "main", zTab, zCol, 0, &zCol, 0, 0, 0
7409     );
7410     if( rc==SQLITE_OK ){
7411       nCopy = STRLEN(zCol) + 1;
7412       pNew->aCol[nCol].zColl = pCsr;
7413       memcpy(pCsr, zCol, nCopy);
7414       pCsr += nCopy;
7415     }
7416 
7417     nCol++;
7418   }
7419   idxFinalize(&rc, p1);
7420 
7421   if( rc!=SQLITE_OK ){
7422     sqlite3_free(pNew);
7423     pNew = 0;
7424   }else{
7425     pNew->zName = pCsr;
7426     memcpy(pNew->zName, zTab, nTab+1);
7427   }
7428 
7429   *ppOut = pNew;
7430   return rc;
7431 }
7432 
7433 /*
7434 ** This function is a no-op if *pRc is set to anything other than
7435 ** SQLITE_OK when it is called.
7436 **
7437 ** If *pRc is initially set to SQLITE_OK, then the text specified by
7438 ** the printf() style arguments is appended to zIn and the result returned
7439 ** in a buffer allocated by sqlite3_malloc(). sqlite3_free() is called on
7440 ** zIn before returning.
7441 */
7442 static char *idxAppendText(int *pRc, char *zIn, const char *zFmt, ...){
7443   va_list ap;
7444   char *zAppend = 0;
7445   char *zRet = 0;
7446   int nIn = zIn ? STRLEN(zIn) : 0;
7447   int nAppend = 0;
7448   va_start(ap, zFmt);
7449   if( *pRc==SQLITE_OK ){
7450     zAppend = sqlite3_vmprintf(zFmt, ap);
7451     if( zAppend ){
7452       nAppend = STRLEN(zAppend);
7453       zRet = (char*)sqlite3_malloc(nIn + nAppend + 1);
7454     }
7455     if( zAppend && zRet ){
7456       if( nIn ) memcpy(zRet, zIn, nIn);
7457       memcpy(&zRet[nIn], zAppend, nAppend+1);
7458     }else{
7459       sqlite3_free(zRet);
7460       zRet = 0;
7461       *pRc = SQLITE_NOMEM;
7462     }
7463     sqlite3_free(zAppend);
7464     sqlite3_free(zIn);
7465   }
7466   va_end(ap);
7467   return zRet;
7468 }
7469 
7470 /*
7471 ** Return true if zId must be quoted in order to use it as an SQL
7472 ** identifier, or false otherwise.
7473 */
7474 static int idxIdentifierRequiresQuotes(const char *zId){
7475   int i;
7476   for(i=0; zId[i]; i++){
7477     if( !(zId[i]=='_')
7478      && !(zId[i]>='0' && zId[i]<='9')
7479      && !(zId[i]>='a' && zId[i]<='z')
7480      && !(zId[i]>='A' && zId[i]<='Z')
7481     ){
7482       return 1;
7483     }
7484   }
7485   return 0;
7486 }
7487 
7488 /*
7489 ** This function appends an index column definition suitable for constraint
7490 ** pCons to the string passed as zIn and returns the result.
7491 */
7492 static char *idxAppendColDefn(
7493   int *pRc,                       /* IN/OUT: Error code */
7494   char *zIn,                      /* Column defn accumulated so far */
7495   IdxTable *pTab,                 /* Table index will be created on */
7496   IdxConstraint *pCons
7497 ){
7498   char *zRet = zIn;
7499   IdxColumn *p = &pTab->aCol[pCons->iCol];
7500   if( zRet ) zRet = idxAppendText(pRc, zRet, ", ");
7501 
7502   if( idxIdentifierRequiresQuotes(p->zName) ){
7503     zRet = idxAppendText(pRc, zRet, "%Q", p->zName);
7504   }else{
7505     zRet = idxAppendText(pRc, zRet, "%s", p->zName);
7506   }
7507 
7508   if( sqlite3_stricmp(p->zColl, pCons->zColl) ){
7509     if( idxIdentifierRequiresQuotes(pCons->zColl) ){
7510       zRet = idxAppendText(pRc, zRet, " COLLATE %Q", pCons->zColl);
7511     }else{
7512       zRet = idxAppendText(pRc, zRet, " COLLATE %s", pCons->zColl);
7513     }
7514   }
7515 
7516   if( pCons->bDesc ){
7517     zRet = idxAppendText(pRc, zRet, " DESC");
7518   }
7519   return zRet;
7520 }
7521 
7522 /*
7523 ** Search database dbm for an index compatible with the one idxCreateFromCons()
7524 ** would create from arguments pScan, pEq and pTail. If no error occurs and
7525 ** such an index is found, return non-zero. Or, if no such index is found,
7526 ** return zero.
7527 **
7528 ** If an error occurs, set *pRc to an SQLite error code and return zero.
7529 */
7530 static int idxFindCompatible(
7531   int *pRc,                       /* OUT: Error code */
7532   sqlite3* dbm,                   /* Database to search */
7533   IdxScan *pScan,                 /* Scan for table to search for index on */
7534   IdxConstraint *pEq,             /* List of == constraints */
7535   IdxConstraint *pTail            /* List of range constraints */
7536 ){
7537   const char *zTbl = pScan->pTab->zName;
7538   sqlite3_stmt *pIdxList = 0;
7539   IdxConstraint *pIter;
7540   int nEq = 0;                    /* Number of elements in pEq */
7541   int rc;
7542 
7543   /* Count the elements in list pEq */
7544   for(pIter=pEq; pIter; pIter=pIter->pLink) nEq++;
7545 
7546   rc = idxPrintfPrepareStmt(dbm, &pIdxList, 0, "PRAGMA index_list=%Q", zTbl);
7547   while( rc==SQLITE_OK && sqlite3_step(pIdxList)==SQLITE_ROW ){
7548     int bMatch = 1;
7549     IdxConstraint *pT = pTail;
7550     sqlite3_stmt *pInfo = 0;
7551     const char *zIdx = (const char*)sqlite3_column_text(pIdxList, 1);
7552 
7553     /* Zero the IdxConstraint.bFlag values in the pEq list */
7554     for(pIter=pEq; pIter; pIter=pIter->pLink) pIter->bFlag = 0;
7555 
7556     rc = idxPrintfPrepareStmt(dbm, &pInfo, 0, "PRAGMA index_xInfo=%Q", zIdx);
7557     while( rc==SQLITE_OK && sqlite3_step(pInfo)==SQLITE_ROW ){
7558       int iIdx = sqlite3_column_int(pInfo, 0);
7559       int iCol = sqlite3_column_int(pInfo, 1);
7560       const char *zColl = (const char*)sqlite3_column_text(pInfo, 4);
7561 
7562       if( iIdx<nEq ){
7563         for(pIter=pEq; pIter; pIter=pIter->pLink){
7564           if( pIter->bFlag ) continue;
7565           if( pIter->iCol!=iCol ) continue;
7566           if( sqlite3_stricmp(pIter->zColl, zColl) ) continue;
7567           pIter->bFlag = 1;
7568           break;
7569         }
7570         if( pIter==0 ){
7571           bMatch = 0;
7572           break;
7573         }
7574       }else{
7575         if( pT ){
7576           if( pT->iCol!=iCol || sqlite3_stricmp(pT->zColl, zColl) ){
7577             bMatch = 0;
7578             break;
7579           }
7580           pT = pT->pLink;
7581         }
7582       }
7583     }
7584     idxFinalize(&rc, pInfo);
7585 
7586     if( rc==SQLITE_OK && bMatch ){
7587       sqlite3_finalize(pIdxList);
7588       return 1;
7589     }
7590   }
7591   idxFinalize(&rc, pIdxList);
7592 
7593   *pRc = rc;
7594   return 0;
7595 }
7596 
7597 static int idxCreateFromCons(
7598   sqlite3expert *p,
7599   IdxScan *pScan,
7600   IdxConstraint *pEq,
7601   IdxConstraint *pTail
7602 ){
7603   sqlite3 *dbm = p->dbm;
7604   int rc = SQLITE_OK;
7605   if( (pEq || pTail) && 0==idxFindCompatible(&rc, dbm, pScan, pEq, pTail) ){
7606     IdxTable *pTab = pScan->pTab;
7607     char *zCols = 0;
7608     char *zIdx = 0;
7609     IdxConstraint *pCons;
7610     unsigned int h = 0;
7611     const char *zFmt;
7612 
7613     for(pCons=pEq; pCons; pCons=pCons->pLink){
7614       zCols = idxAppendColDefn(&rc, zCols, pTab, pCons);
7615     }
7616     for(pCons=pTail; pCons; pCons=pCons->pLink){
7617       zCols = idxAppendColDefn(&rc, zCols, pTab, pCons);
7618     }
7619 
7620     if( rc==SQLITE_OK ){
7621       /* Hash the list of columns to come up with a name for the index */
7622       const char *zTable = pScan->pTab->zName;
7623       char *zName;                /* Index name */
7624       int i;
7625       for(i=0; zCols[i]; i++){
7626         h += ((h<<3) + zCols[i]);
7627       }
7628       zName = sqlite3_mprintf("%s_idx_%08x", zTable, h);
7629       if( zName==0 ){
7630         rc = SQLITE_NOMEM;
7631       }else{
7632         if( idxIdentifierRequiresQuotes(zTable) ){
7633           zFmt = "CREATE INDEX '%q' ON %Q(%s)";
7634         }else{
7635           zFmt = "CREATE INDEX %s ON %s(%s)";
7636         }
7637         zIdx = sqlite3_mprintf(zFmt, zName, zTable, zCols);
7638         if( !zIdx ){
7639           rc = SQLITE_NOMEM;
7640         }else{
7641           rc = sqlite3_exec(dbm, zIdx, 0, 0, p->pzErrmsg);
7642           idxHashAdd(&rc, &p->hIdx, zName, zIdx);
7643         }
7644         sqlite3_free(zName);
7645         sqlite3_free(zIdx);
7646       }
7647     }
7648 
7649     sqlite3_free(zCols);
7650   }
7651   return rc;
7652 }
7653 
7654 /*
7655 ** Return true if list pList (linked by IdxConstraint.pLink) contains
7656 ** a constraint compatible with *p. Otherwise return false.
7657 */
7658 static int idxFindConstraint(IdxConstraint *pList, IdxConstraint *p){
7659   IdxConstraint *pCmp;
7660   for(pCmp=pList; pCmp; pCmp=pCmp->pLink){
7661     if( p->iCol==pCmp->iCol ) return 1;
7662   }
7663   return 0;
7664 }
7665 
7666 static int idxCreateFromWhere(
7667   sqlite3expert *p,
7668   IdxScan *pScan,                 /* Create indexes for this scan */
7669   IdxConstraint *pTail            /* range/ORDER BY constraints for inclusion */
7670 ){
7671   IdxConstraint *p1 = 0;
7672   IdxConstraint *pCon;
7673   int rc;
7674 
7675   /* Gather up all the == constraints. */
7676   for(pCon=pScan->pEq; pCon; pCon=pCon->pNext){
7677     if( !idxFindConstraint(p1, pCon) && !idxFindConstraint(pTail, pCon) ){
7678       pCon->pLink = p1;
7679       p1 = pCon;
7680     }
7681   }
7682 
7683   /* Create an index using the == constraints collected above. And the
7684   ** range constraint/ORDER BY terms passed in by the caller, if any. */
7685   rc = idxCreateFromCons(p, pScan, p1, pTail);
7686 
7687   /* If no range/ORDER BY passed by the caller, create a version of the
7688   ** index for each range constraint.  */
7689   if( pTail==0 ){
7690     for(pCon=pScan->pRange; rc==SQLITE_OK && pCon; pCon=pCon->pNext){
7691       assert( pCon->pLink==0 );
7692       if( !idxFindConstraint(p1, pCon) && !idxFindConstraint(pTail, pCon) ){
7693         rc = idxCreateFromCons(p, pScan, p1, pCon);
7694       }
7695     }
7696   }
7697 
7698   return rc;
7699 }
7700 
7701 /*
7702 ** Create candidate indexes in database [dbm] based on the data in
7703 ** linked-list pScan.
7704 */
7705 static int idxCreateCandidates(sqlite3expert *p){
7706   int rc = SQLITE_OK;
7707   IdxScan *pIter;
7708 
7709   for(pIter=p->pScan; pIter && rc==SQLITE_OK; pIter=pIter->pNextScan){
7710     rc = idxCreateFromWhere(p, pIter, 0);
7711     if( rc==SQLITE_OK && pIter->pOrder ){
7712       rc = idxCreateFromWhere(p, pIter, pIter->pOrder);
7713     }
7714   }
7715 
7716   return rc;
7717 }
7718 
7719 /*
7720 ** Free all elements of the linked list starting at pConstraint.
7721 */
7722 static void idxConstraintFree(IdxConstraint *pConstraint){
7723   IdxConstraint *pNext;
7724   IdxConstraint *p;
7725 
7726   for(p=pConstraint; p; p=pNext){
7727     pNext = p->pNext;
7728     sqlite3_free(p);
7729   }
7730 }
7731 
7732 /*
7733 ** Free all elements of the linked list starting from pScan up until pLast
7734 ** (pLast is not freed).
7735 */
7736 static void idxScanFree(IdxScan *pScan, IdxScan *pLast){
7737   IdxScan *p;
7738   IdxScan *pNext;
7739   for(p=pScan; p!=pLast; p=pNext){
7740     pNext = p->pNextScan;
7741     idxConstraintFree(p->pOrder);
7742     idxConstraintFree(p->pEq);
7743     idxConstraintFree(p->pRange);
7744     sqlite3_free(p);
7745   }
7746 }
7747 
7748 /*
7749 ** Free all elements of the linked list starting from pStatement up
7750 ** until pLast (pLast is not freed).
7751 */
7752 static void idxStatementFree(IdxStatement *pStatement, IdxStatement *pLast){
7753   IdxStatement *p;
7754   IdxStatement *pNext;
7755   for(p=pStatement; p!=pLast; p=pNext){
7756     pNext = p->pNext;
7757     sqlite3_free(p->zEQP);
7758     sqlite3_free(p->zIdx);
7759     sqlite3_free(p);
7760   }
7761 }
7762 
7763 /*
7764 ** Free the linked list of IdxTable objects starting at pTab.
7765 */
7766 static void idxTableFree(IdxTable *pTab){
7767   IdxTable *pIter;
7768   IdxTable *pNext;
7769   for(pIter=pTab; pIter; pIter=pNext){
7770     pNext = pIter->pNext;
7771     sqlite3_free(pIter);
7772   }
7773 }
7774 
7775 /*
7776 ** Free the linked list of IdxWrite objects starting at pTab.
7777 */
7778 static void idxWriteFree(IdxWrite *pTab){
7779   IdxWrite *pIter;
7780   IdxWrite *pNext;
7781   for(pIter=pTab; pIter; pIter=pNext){
7782     pNext = pIter->pNext;
7783     sqlite3_free(pIter);
7784   }
7785 }
7786 
7787 
7788 
7789 /*
7790 ** This function is called after candidate indexes have been created. It
7791 ** runs all the queries to see which indexes they prefer, and populates
7792 ** IdxStatement.zIdx and IdxStatement.zEQP with the results.
7793 */
7794 int idxFindIndexes(
7795   sqlite3expert *p,
7796   char **pzErr                         /* OUT: Error message (sqlite3_malloc) */
7797 ){
7798   IdxStatement *pStmt;
7799   sqlite3 *dbm = p->dbm;
7800   int rc = SQLITE_OK;
7801 
7802   IdxHash hIdx;
7803   idxHashInit(&hIdx);
7804 
7805   for(pStmt=p->pStatement; rc==SQLITE_OK && pStmt; pStmt=pStmt->pNext){
7806     IdxHashEntry *pEntry;
7807     sqlite3_stmt *pExplain = 0;
7808     idxHashClear(&hIdx);
7809     rc = idxPrintfPrepareStmt(dbm, &pExplain, pzErr,
7810         "EXPLAIN QUERY PLAN %s", pStmt->zSql
7811     );
7812     while( rc==SQLITE_OK && sqlite3_step(pExplain)==SQLITE_ROW ){
7813       /* int iId = sqlite3_column_int(pExplain, 0); */
7814       /* int iParent = sqlite3_column_int(pExplain, 1); */
7815       /* int iNotUsed = sqlite3_column_int(pExplain, 2); */
7816       const char *zDetail = (const char*)sqlite3_column_text(pExplain, 3);
7817       int nDetail = STRLEN(zDetail);
7818       int i;
7819 
7820       for(i=0; i<nDetail; i++){
7821         const char *zIdx = 0;
7822         if( memcmp(&zDetail[i], " USING INDEX ", 13)==0 ){
7823           zIdx = &zDetail[i+13];
7824         }else if( memcmp(&zDetail[i], " USING COVERING INDEX ", 22)==0 ){
7825           zIdx = &zDetail[i+22];
7826         }
7827         if( zIdx ){
7828           const char *zSql;
7829           int nIdx = 0;
7830           while( zIdx[nIdx]!='\0' && (zIdx[nIdx]!=' ' || zIdx[nIdx+1]!='(') ){
7831             nIdx++;
7832           }
7833           zSql = idxHashSearch(&p->hIdx, zIdx, nIdx);
7834           if( zSql ){
7835             idxHashAdd(&rc, &hIdx, zSql, 0);
7836             if( rc ) goto find_indexes_out;
7837           }
7838           break;
7839         }
7840       }
7841 
7842       if( zDetail[0]!='-' ){
7843         pStmt->zEQP = idxAppendText(&rc, pStmt->zEQP, "%s\n", zDetail);
7844       }
7845     }
7846 
7847     for(pEntry=hIdx.pFirst; pEntry; pEntry=pEntry->pNext){
7848       pStmt->zIdx = idxAppendText(&rc, pStmt->zIdx, "%s;\n", pEntry->zKey);
7849     }
7850 
7851     idxFinalize(&rc, pExplain);
7852   }
7853 
7854  find_indexes_out:
7855   idxHashClear(&hIdx);
7856   return rc;
7857 }
7858 
7859 static int idxAuthCallback(
7860   void *pCtx,
7861   int eOp,
7862   const char *z3,
7863   const char *z4,
7864   const char *zDb,
7865   const char *zTrigger
7866 ){
7867   int rc = SQLITE_OK;
7868   (void)z4;
7869   (void)zTrigger;
7870   if( eOp==SQLITE_INSERT || eOp==SQLITE_UPDATE || eOp==SQLITE_DELETE ){
7871     if( sqlite3_stricmp(zDb, "main")==0 ){
7872       sqlite3expert *p = (sqlite3expert*)pCtx;
7873       IdxTable *pTab;
7874       for(pTab=p->pTable; pTab; pTab=pTab->pNext){
7875         if( 0==sqlite3_stricmp(z3, pTab->zName) ) break;
7876       }
7877       if( pTab ){
7878         IdxWrite *pWrite;
7879         for(pWrite=p->pWrite; pWrite; pWrite=pWrite->pNext){
7880           if( pWrite->pTab==pTab && pWrite->eOp==eOp ) break;
7881         }
7882         if( pWrite==0 ){
7883           pWrite = idxMalloc(&rc, sizeof(IdxWrite));
7884           if( rc==SQLITE_OK ){
7885             pWrite->pTab = pTab;
7886             pWrite->eOp = eOp;
7887             pWrite->pNext = p->pWrite;
7888             p->pWrite = pWrite;
7889           }
7890         }
7891       }
7892     }
7893   }
7894   return rc;
7895 }
7896 
7897 static int idxProcessOneTrigger(
7898   sqlite3expert *p,
7899   IdxWrite *pWrite,
7900   char **pzErr
7901 ){
7902   static const char *zInt = UNIQUE_TABLE_NAME;
7903   static const char *zDrop = "DROP TABLE " UNIQUE_TABLE_NAME;
7904   IdxTable *pTab = pWrite->pTab;
7905   const char *zTab = pTab->zName;
7906   const char *zSql =
7907     "SELECT 'CREATE TEMP' || substr(sql, 7) FROM sqlite_master "
7908     "WHERE tbl_name = %Q AND type IN ('table', 'trigger') "
7909     "ORDER BY type;";
7910   sqlite3_stmt *pSelect = 0;
7911   int rc = SQLITE_OK;
7912   char *zWrite = 0;
7913 
7914   /* Create the table and its triggers in the temp schema */
7915   rc = idxPrintfPrepareStmt(p->db, &pSelect, pzErr, zSql, zTab, zTab);
7916   while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSelect) ){
7917     const char *zCreate = (const char*)sqlite3_column_text(pSelect, 0);
7918     rc = sqlite3_exec(p->dbv, zCreate, 0, 0, pzErr);
7919   }
7920   idxFinalize(&rc, pSelect);
7921 
7922   /* Rename the table in the temp schema to zInt */
7923   if( rc==SQLITE_OK ){
7924     char *z = sqlite3_mprintf("ALTER TABLE temp.%Q RENAME TO %Q", zTab, zInt);
7925     if( z==0 ){
7926       rc = SQLITE_NOMEM;
7927     }else{
7928       rc = sqlite3_exec(p->dbv, z, 0, 0, pzErr);
7929       sqlite3_free(z);
7930     }
7931   }
7932 
7933   switch( pWrite->eOp ){
7934     case SQLITE_INSERT: {
7935       int i;
7936       zWrite = idxAppendText(&rc, zWrite, "INSERT INTO %Q VALUES(", zInt);
7937       for(i=0; i<pTab->nCol; i++){
7938         zWrite = idxAppendText(&rc, zWrite, "%s?", i==0 ? "" : ", ");
7939       }
7940       zWrite = idxAppendText(&rc, zWrite, ")");
7941       break;
7942     }
7943     case SQLITE_UPDATE: {
7944       int i;
7945       zWrite = idxAppendText(&rc, zWrite, "UPDATE %Q SET ", zInt);
7946       for(i=0; i<pTab->nCol; i++){
7947         zWrite = idxAppendText(&rc, zWrite, "%s%Q=?", i==0 ? "" : ", ",
7948             pTab->aCol[i].zName
7949         );
7950       }
7951       break;
7952     }
7953     default: {
7954       assert( pWrite->eOp==SQLITE_DELETE );
7955       if( rc==SQLITE_OK ){
7956         zWrite = sqlite3_mprintf("DELETE FROM %Q", zInt);
7957         if( zWrite==0 ) rc = SQLITE_NOMEM;
7958       }
7959     }
7960   }
7961 
7962   if( rc==SQLITE_OK ){
7963     sqlite3_stmt *pX = 0;
7964     rc = sqlite3_prepare_v2(p->dbv, zWrite, -1, &pX, 0);
7965     idxFinalize(&rc, pX);
7966     if( rc!=SQLITE_OK ){
7967       idxDatabaseError(p->dbv, pzErr);
7968     }
7969   }
7970   sqlite3_free(zWrite);
7971 
7972   if( rc==SQLITE_OK ){
7973     rc = sqlite3_exec(p->dbv, zDrop, 0, 0, pzErr);
7974   }
7975 
7976   return rc;
7977 }
7978 
7979 static int idxProcessTriggers(sqlite3expert *p, char **pzErr){
7980   int rc = SQLITE_OK;
7981   IdxWrite *pEnd = 0;
7982   IdxWrite *pFirst = p->pWrite;
7983 
7984   while( rc==SQLITE_OK && pFirst!=pEnd ){
7985     IdxWrite *pIter;
7986     for(pIter=pFirst; rc==SQLITE_OK && pIter!=pEnd; pIter=pIter->pNext){
7987       rc = idxProcessOneTrigger(p, pIter, pzErr);
7988     }
7989     pEnd = pFirst;
7990     pFirst = p->pWrite;
7991   }
7992 
7993   return rc;
7994 }
7995 
7996 
7997 static int idxCreateVtabSchema(sqlite3expert *p, char **pzErrmsg){
7998   int rc = idxRegisterVtab(p);
7999   sqlite3_stmt *pSchema = 0;
8000 
8001   /* For each table in the main db schema:
8002   **
8003   **   1) Add an entry to the p->pTable list, and
8004   **   2) Create the equivalent virtual table in dbv.
8005   */
8006   rc = idxPrepareStmt(p->db, &pSchema, pzErrmsg,
8007       "SELECT type, name, sql, 1 FROM sqlite_master "
8008       "WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%%' "
8009       " UNION ALL "
8010       "SELECT type, name, sql, 2 FROM sqlite_master "
8011       "WHERE type = 'trigger'"
8012       "  AND tbl_name IN(SELECT name FROM sqlite_master WHERE type = 'view') "
8013       "ORDER BY 4, 1"
8014   );
8015   while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSchema) ){
8016     const char *zType = (const char*)sqlite3_column_text(pSchema, 0);
8017     const char *zName = (const char*)sqlite3_column_text(pSchema, 1);
8018     const char *zSql = (const char*)sqlite3_column_text(pSchema, 2);
8019 
8020     if( zType[0]=='v' || zType[1]=='r' ){
8021       rc = sqlite3_exec(p->dbv, zSql, 0, 0, pzErrmsg);
8022     }else{
8023       IdxTable *pTab;
8024       rc = idxGetTableInfo(p->db, zName, &pTab, pzErrmsg);
8025       if( rc==SQLITE_OK ){
8026         int i;
8027         char *zInner = 0;
8028         char *zOuter = 0;
8029         pTab->pNext = p->pTable;
8030         p->pTable = pTab;
8031 
8032         /* The statement the vtab will pass to sqlite3_declare_vtab() */
8033         zInner = idxAppendText(&rc, 0, "CREATE TABLE x(");
8034         for(i=0; i<pTab->nCol; i++){
8035           zInner = idxAppendText(&rc, zInner, "%s%Q COLLATE %s",
8036               (i==0 ? "" : ", "), pTab->aCol[i].zName, pTab->aCol[i].zColl
8037           );
8038         }
8039         zInner = idxAppendText(&rc, zInner, ")");
8040 
8041         /* The CVT statement to create the vtab */
8042         zOuter = idxAppendText(&rc, 0,
8043             "CREATE VIRTUAL TABLE %Q USING expert(%Q)", zName, zInner
8044         );
8045         if( rc==SQLITE_OK ){
8046           rc = sqlite3_exec(p->dbv, zOuter, 0, 0, pzErrmsg);
8047         }
8048         sqlite3_free(zInner);
8049         sqlite3_free(zOuter);
8050       }
8051     }
8052   }
8053   idxFinalize(&rc, pSchema);
8054   return rc;
8055 }
8056 
8057 struct IdxSampleCtx {
8058   int iTarget;
8059   double target;                  /* Target nRet/nRow value */
8060   double nRow;                    /* Number of rows seen */
8061   double nRet;                    /* Number of rows returned */
8062 };
8063 
8064 static void idxSampleFunc(
8065   sqlite3_context *pCtx,
8066   int argc,
8067   sqlite3_value **argv
8068 ){
8069   struct IdxSampleCtx *p = (struct IdxSampleCtx*)sqlite3_user_data(pCtx);
8070   int bRet;
8071 
8072   (void)argv;
8073   assert( argc==0 );
8074   if( p->nRow==0.0 ){
8075     bRet = 1;
8076   }else{
8077     bRet = (p->nRet / p->nRow) <= p->target;
8078     if( bRet==0 ){
8079       unsigned short rnd;
8080       sqlite3_randomness(2, (void*)&rnd);
8081       bRet = ((int)rnd % 100) <= p->iTarget;
8082     }
8083   }
8084 
8085   sqlite3_result_int(pCtx, bRet);
8086   p->nRow += 1.0;
8087   p->nRet += (double)bRet;
8088 }
8089 
8090 struct IdxRemCtx {
8091   int nSlot;
8092   struct IdxRemSlot {
8093     int eType;                    /* SQLITE_NULL, INTEGER, REAL, TEXT, BLOB */
8094     i64 iVal;                     /* SQLITE_INTEGER value */
8095     double rVal;                  /* SQLITE_FLOAT value */
8096     int nByte;                    /* Bytes of space allocated at z */
8097     int n;                        /* Size of buffer z */
8098     char *z;                      /* SQLITE_TEXT/BLOB value */
8099   } aSlot[1];
8100 };
8101 
8102 /*
8103 ** Implementation of scalar function rem().
8104 */
8105 static void idxRemFunc(
8106   sqlite3_context *pCtx,
8107   int argc,
8108   sqlite3_value **argv
8109 ){
8110   struct IdxRemCtx *p = (struct IdxRemCtx*)sqlite3_user_data(pCtx);
8111   struct IdxRemSlot *pSlot;
8112   int iSlot;
8113   assert( argc==2 );
8114 
8115   iSlot = sqlite3_value_int(argv[0]);
8116   assert( iSlot<=p->nSlot );
8117   pSlot = &p->aSlot[iSlot];
8118 
8119   switch( pSlot->eType ){
8120     case SQLITE_NULL:
8121       /* no-op */
8122       break;
8123 
8124     case SQLITE_INTEGER:
8125       sqlite3_result_int64(pCtx, pSlot->iVal);
8126       break;
8127 
8128     case SQLITE_FLOAT:
8129       sqlite3_result_double(pCtx, pSlot->rVal);
8130       break;
8131 
8132     case SQLITE_BLOB:
8133       sqlite3_result_blob(pCtx, pSlot->z, pSlot->n, SQLITE_TRANSIENT);
8134       break;
8135 
8136     case SQLITE_TEXT:
8137       sqlite3_result_text(pCtx, pSlot->z, pSlot->n, SQLITE_TRANSIENT);
8138       break;
8139   }
8140 
8141   pSlot->eType = sqlite3_value_type(argv[1]);
8142   switch( pSlot->eType ){
8143     case SQLITE_NULL:
8144       /* no-op */
8145       break;
8146 
8147     case SQLITE_INTEGER:
8148       pSlot->iVal = sqlite3_value_int64(argv[1]);
8149       break;
8150 
8151     case SQLITE_FLOAT:
8152       pSlot->rVal = sqlite3_value_double(argv[1]);
8153       break;
8154 
8155     case SQLITE_BLOB:
8156     case SQLITE_TEXT: {
8157       int nByte = sqlite3_value_bytes(argv[1]);
8158       if( nByte>pSlot->nByte ){
8159         char *zNew = (char*)sqlite3_realloc(pSlot->z, nByte*2);
8160         if( zNew==0 ){
8161           sqlite3_result_error_nomem(pCtx);
8162           return;
8163         }
8164         pSlot->nByte = nByte*2;
8165         pSlot->z = zNew;
8166       }
8167       pSlot->n = nByte;
8168       if( pSlot->eType==SQLITE_BLOB ){
8169         memcpy(pSlot->z, sqlite3_value_blob(argv[1]), nByte);
8170       }else{
8171         memcpy(pSlot->z, sqlite3_value_text(argv[1]), nByte);
8172       }
8173       break;
8174     }
8175   }
8176 }
8177 
8178 static int idxLargestIndex(sqlite3 *db, int *pnMax, char **pzErr){
8179   int rc = SQLITE_OK;
8180   const char *zMax =
8181     "SELECT max(i.seqno) FROM "
8182     "  sqlite_master AS s, "
8183     "  pragma_index_list(s.name) AS l, "
8184     "  pragma_index_info(l.name) AS i "
8185     "WHERE s.type = 'table'";
8186   sqlite3_stmt *pMax = 0;
8187 
8188   *pnMax = 0;
8189   rc = idxPrepareStmt(db, &pMax, pzErr, zMax);
8190   if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pMax) ){
8191     *pnMax = sqlite3_column_int(pMax, 0) + 1;
8192   }
8193   idxFinalize(&rc, pMax);
8194 
8195   return rc;
8196 }
8197 
8198 static int idxPopulateOneStat1(
8199   sqlite3expert *p,
8200   sqlite3_stmt *pIndexXInfo,
8201   sqlite3_stmt *pWriteStat,
8202   const char *zTab,
8203   const char *zIdx,
8204   char **pzErr
8205 ){
8206   char *zCols = 0;
8207   char *zOrder = 0;
8208   char *zQuery = 0;
8209   int nCol = 0;
8210   int i;
8211   sqlite3_stmt *pQuery = 0;
8212   int *aStat = 0;
8213   int rc = SQLITE_OK;
8214 
8215   assert( p->iSample>0 );
8216 
8217   /* Formulate the query text */
8218   sqlite3_bind_text(pIndexXInfo, 1, zIdx, -1, SQLITE_STATIC);
8219   while( SQLITE_OK==rc && SQLITE_ROW==sqlite3_step(pIndexXInfo) ){
8220     const char *zComma = zCols==0 ? "" : ", ";
8221     const char *zName = (const char*)sqlite3_column_text(pIndexXInfo, 0);
8222     const char *zColl = (const char*)sqlite3_column_text(pIndexXInfo, 1);
8223     zCols = idxAppendText(&rc, zCols,
8224         "%sx.%Q IS rem(%d, x.%Q) COLLATE %s", zComma, zName, nCol, zName, zColl
8225     );
8226     zOrder = idxAppendText(&rc, zOrder, "%s%d", zComma, ++nCol);
8227   }
8228   sqlite3_reset(pIndexXInfo);
8229   if( rc==SQLITE_OK ){
8230     if( p->iSample==100 ){
8231       zQuery = sqlite3_mprintf(
8232           "SELECT %s FROM %Q x ORDER BY %s", zCols, zTab, zOrder
8233       );
8234     }else{
8235       zQuery = sqlite3_mprintf(
8236           "SELECT %s FROM temp."UNIQUE_TABLE_NAME" x ORDER BY %s", zCols, zOrder
8237       );
8238     }
8239   }
8240   sqlite3_free(zCols);
8241   sqlite3_free(zOrder);
8242 
8243   /* Formulate the query text */
8244   if( rc==SQLITE_OK ){
8245     sqlite3 *dbrem = (p->iSample==100 ? p->db : p->dbv);
8246     rc = idxPrepareStmt(dbrem, &pQuery, pzErr, zQuery);
8247   }
8248   sqlite3_free(zQuery);
8249 
8250   if( rc==SQLITE_OK ){
8251     aStat = (int*)idxMalloc(&rc, sizeof(int)*(nCol+1));
8252   }
8253   if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pQuery) ){
8254     IdxHashEntry *pEntry;
8255     char *zStat = 0;
8256     for(i=0; i<=nCol; i++) aStat[i] = 1;
8257     while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pQuery) ){
8258       aStat[0]++;
8259       for(i=0; i<nCol; i++){
8260         if( sqlite3_column_int(pQuery, i)==0 ) break;
8261       }
8262       for(/*no-op*/; i<nCol; i++){
8263         aStat[i+1]++;
8264       }
8265     }
8266 
8267     if( rc==SQLITE_OK ){
8268       int s0 = aStat[0];
8269       zStat = sqlite3_mprintf("%d", s0);
8270       if( zStat==0 ) rc = SQLITE_NOMEM;
8271       for(i=1; rc==SQLITE_OK && i<=nCol; i++){
8272         zStat = idxAppendText(&rc, zStat, " %d", (s0+aStat[i]/2) / aStat[i]);
8273       }
8274     }
8275 
8276     if( rc==SQLITE_OK ){
8277       sqlite3_bind_text(pWriteStat, 1, zTab, -1, SQLITE_STATIC);
8278       sqlite3_bind_text(pWriteStat, 2, zIdx, -1, SQLITE_STATIC);
8279       sqlite3_bind_text(pWriteStat, 3, zStat, -1, SQLITE_STATIC);
8280       sqlite3_step(pWriteStat);
8281       rc = sqlite3_reset(pWriteStat);
8282     }
8283 
8284     pEntry = idxHashFind(&p->hIdx, zIdx, STRLEN(zIdx));
8285     if( pEntry ){
8286       assert( pEntry->zVal2==0 );
8287       pEntry->zVal2 = zStat;
8288     }else{
8289       sqlite3_free(zStat);
8290     }
8291   }
8292   sqlite3_free(aStat);
8293   idxFinalize(&rc, pQuery);
8294 
8295   return rc;
8296 }
8297 
8298 static int idxBuildSampleTable(sqlite3expert *p, const char *zTab){
8299   int rc;
8300   char *zSql;
8301 
8302   rc = sqlite3_exec(p->dbv,"DROP TABLE IF EXISTS temp."UNIQUE_TABLE_NAME,0,0,0);
8303   if( rc!=SQLITE_OK ) return rc;
8304 
8305   zSql = sqlite3_mprintf(
8306       "CREATE TABLE temp." UNIQUE_TABLE_NAME " AS SELECT * FROM %Q", zTab
8307   );
8308   if( zSql==0 ) return SQLITE_NOMEM;
8309   rc = sqlite3_exec(p->dbv, zSql, 0, 0, 0);
8310   sqlite3_free(zSql);
8311 
8312   return rc;
8313 }
8314 
8315 /*
8316 ** This function is called as part of sqlite3_expert_analyze(). Candidate
8317 ** indexes have already been created in database sqlite3expert.dbm, this
8318 ** function populates sqlite_stat1 table in the same database.
8319 **
8320 ** The stat1 data is generated by querying the
8321 */
8322 static int idxPopulateStat1(sqlite3expert *p, char **pzErr){
8323   int rc = SQLITE_OK;
8324   int nMax =0;
8325   struct IdxRemCtx *pCtx = 0;
8326   struct IdxSampleCtx samplectx;
8327   int i;
8328   i64 iPrev = -100000;
8329   sqlite3_stmt *pAllIndex = 0;
8330   sqlite3_stmt *pIndexXInfo = 0;
8331   sqlite3_stmt *pWrite = 0;
8332 
8333   const char *zAllIndex =
8334     "SELECT s.rowid, s.name, l.name FROM "
8335     "  sqlite_master AS s, "
8336     "  pragma_index_list(s.name) AS l "
8337     "WHERE s.type = 'table'";
8338   const char *zIndexXInfo =
8339     "SELECT name, coll FROM pragma_index_xinfo(?) WHERE key";
8340   const char *zWrite = "INSERT INTO sqlite_stat1 VALUES(?, ?, ?)";
8341 
8342   /* If iSample==0, no sqlite_stat1 data is required. */
8343   if( p->iSample==0 ) return SQLITE_OK;
8344 
8345   rc = idxLargestIndex(p->dbm, &nMax, pzErr);
8346   if( nMax<=0 || rc!=SQLITE_OK ) return rc;
8347 
8348   rc = sqlite3_exec(p->dbm, "ANALYZE; PRAGMA writable_schema=1", 0, 0, 0);
8349 
8350   if( rc==SQLITE_OK ){
8351     int nByte = sizeof(struct IdxRemCtx) + (sizeof(struct IdxRemSlot) * nMax);
8352     pCtx = (struct IdxRemCtx*)idxMalloc(&rc, nByte);
8353   }
8354 
8355   if( rc==SQLITE_OK ){
8356     sqlite3 *dbrem = (p->iSample==100 ? p->db : p->dbv);
8357     rc = sqlite3_create_function(
8358         dbrem, "rem", 2, SQLITE_UTF8, (void*)pCtx, idxRemFunc, 0, 0
8359     );
8360   }
8361   if( rc==SQLITE_OK ){
8362     rc = sqlite3_create_function(
8363         p->db, "sample", 0, SQLITE_UTF8, (void*)&samplectx, idxSampleFunc, 0, 0
8364     );
8365   }
8366 
8367   if( rc==SQLITE_OK ){
8368     pCtx->nSlot = nMax+1;
8369     rc = idxPrepareStmt(p->dbm, &pAllIndex, pzErr, zAllIndex);
8370   }
8371   if( rc==SQLITE_OK ){
8372     rc = idxPrepareStmt(p->dbm, &pIndexXInfo, pzErr, zIndexXInfo);
8373   }
8374   if( rc==SQLITE_OK ){
8375     rc = idxPrepareStmt(p->dbm, &pWrite, pzErr, zWrite);
8376   }
8377 
8378   while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pAllIndex) ){
8379     i64 iRowid = sqlite3_column_int64(pAllIndex, 0);
8380     const char *zTab = (const char*)sqlite3_column_text(pAllIndex, 1);
8381     const char *zIdx = (const char*)sqlite3_column_text(pAllIndex, 2);
8382     if( p->iSample<100 && iPrev!=iRowid ){
8383       samplectx.target = (double)p->iSample / 100.0;
8384       samplectx.iTarget = p->iSample;
8385       samplectx.nRow = 0.0;
8386       samplectx.nRet = 0.0;
8387       rc = idxBuildSampleTable(p, zTab);
8388       if( rc!=SQLITE_OK ) break;
8389     }
8390     rc = idxPopulateOneStat1(p, pIndexXInfo, pWrite, zTab, zIdx, pzErr);
8391     iPrev = iRowid;
8392   }
8393   if( rc==SQLITE_OK && p->iSample<100 ){
8394     rc = sqlite3_exec(p->dbv,
8395         "DROP TABLE IF EXISTS temp." UNIQUE_TABLE_NAME, 0,0,0
8396     );
8397   }
8398 
8399   idxFinalize(&rc, pAllIndex);
8400   idxFinalize(&rc, pIndexXInfo);
8401   idxFinalize(&rc, pWrite);
8402 
8403   for(i=0; i<pCtx->nSlot; i++){
8404     sqlite3_free(pCtx->aSlot[i].z);
8405   }
8406   sqlite3_free(pCtx);
8407 
8408   if( rc==SQLITE_OK ){
8409     rc = sqlite3_exec(p->dbm, "ANALYZE sqlite_master", 0, 0, 0);
8410   }
8411 
8412   sqlite3_exec(p->db, "DROP TABLE IF EXISTS temp."UNIQUE_TABLE_NAME,0,0,0);
8413   return rc;
8414 }
8415 
8416 /*
8417 ** Allocate a new sqlite3expert object.
8418 */
8419 sqlite3expert *sqlite3_expert_new(sqlite3 *db, char **pzErrmsg){
8420   int rc = SQLITE_OK;
8421   sqlite3expert *pNew;
8422 
8423   pNew = (sqlite3expert*)idxMalloc(&rc, sizeof(sqlite3expert));
8424 
8425   /* Open two in-memory databases to work with. The "vtab database" (dbv)
8426   ** will contain a virtual table corresponding to each real table in
8427   ** the user database schema, and a copy of each view. It is used to
8428   ** collect information regarding the WHERE, ORDER BY and other clauses
8429   ** of the user's query.
8430   */
8431   if( rc==SQLITE_OK ){
8432     pNew->db = db;
8433     pNew->iSample = 100;
8434     rc = sqlite3_open(":memory:", &pNew->dbv);
8435   }
8436   if( rc==SQLITE_OK ){
8437     rc = sqlite3_open(":memory:", &pNew->dbm);
8438     if( rc==SQLITE_OK ){
8439       sqlite3_db_config(pNew->dbm, SQLITE_DBCONFIG_TRIGGER_EQP, 1, (int*)0);
8440     }
8441   }
8442 
8443 
8444   /* Copy the entire schema of database [db] into [dbm]. */
8445   if( rc==SQLITE_OK ){
8446     sqlite3_stmt *pSql;
8447     rc = idxPrintfPrepareStmt(pNew->db, &pSql, pzErrmsg,
8448         "SELECT sql FROM sqlite_master WHERE name NOT LIKE 'sqlite_%%'"
8449         " AND sql NOT LIKE 'CREATE VIRTUAL %%'"
8450     );
8451     while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
8452       const char *zSql = (const char*)sqlite3_column_text(pSql, 0);
8453       rc = sqlite3_exec(pNew->dbm, zSql, 0, 0, pzErrmsg);
8454     }
8455     idxFinalize(&rc, pSql);
8456   }
8457 
8458   /* Create the vtab schema */
8459   if( rc==SQLITE_OK ){
8460     rc = idxCreateVtabSchema(pNew, pzErrmsg);
8461   }
8462 
8463   /* Register the auth callback with dbv */
8464   if( rc==SQLITE_OK ){
8465     sqlite3_set_authorizer(pNew->dbv, idxAuthCallback, (void*)pNew);
8466   }
8467 
8468   /* If an error has occurred, free the new object and reutrn NULL. Otherwise,
8469   ** return the new sqlite3expert handle.  */
8470   if( rc!=SQLITE_OK ){
8471     sqlite3_expert_destroy(pNew);
8472     pNew = 0;
8473   }
8474   return pNew;
8475 }
8476 
8477 /*
8478 ** Configure an sqlite3expert object.
8479 */
8480 int sqlite3_expert_config(sqlite3expert *p, int op, ...){
8481   int rc = SQLITE_OK;
8482   va_list ap;
8483   va_start(ap, op);
8484   switch( op ){
8485     case EXPERT_CONFIG_SAMPLE: {
8486       int iVal = va_arg(ap, int);
8487       if( iVal<0 ) iVal = 0;
8488       if( iVal>100 ) iVal = 100;
8489       p->iSample = iVal;
8490       break;
8491     }
8492     default:
8493       rc = SQLITE_NOTFOUND;
8494       break;
8495   }
8496 
8497   va_end(ap);
8498   return rc;
8499 }
8500 
8501 /*
8502 ** Add an SQL statement to the analysis.
8503 */
8504 int sqlite3_expert_sql(
8505   sqlite3expert *p,               /* From sqlite3_expert_new() */
8506   const char *zSql,               /* SQL statement to add */
8507   char **pzErr                    /* OUT: Error message (if any) */
8508 ){
8509   IdxScan *pScanOrig = p->pScan;
8510   IdxStatement *pStmtOrig = p->pStatement;
8511   int rc = SQLITE_OK;
8512   const char *zStmt = zSql;
8513 
8514   if( p->bRun ) return SQLITE_MISUSE;
8515 
8516   while( rc==SQLITE_OK && zStmt && zStmt[0] ){
8517     sqlite3_stmt *pStmt = 0;
8518     rc = sqlite3_prepare_v2(p->dbv, zStmt, -1, &pStmt, &zStmt);
8519     if( rc==SQLITE_OK ){
8520       if( pStmt ){
8521         IdxStatement *pNew;
8522         const char *z = sqlite3_sql(pStmt);
8523         int n = STRLEN(z);
8524         pNew = (IdxStatement*)idxMalloc(&rc, sizeof(IdxStatement) + n+1);
8525         if( rc==SQLITE_OK ){
8526           pNew->zSql = (char*)&pNew[1];
8527           memcpy(pNew->zSql, z, n+1);
8528           pNew->pNext = p->pStatement;
8529           if( p->pStatement ) pNew->iId = p->pStatement->iId+1;
8530           p->pStatement = pNew;
8531         }
8532         sqlite3_finalize(pStmt);
8533       }
8534     }else{
8535       idxDatabaseError(p->dbv, pzErr);
8536     }
8537   }
8538 
8539   if( rc!=SQLITE_OK ){
8540     idxScanFree(p->pScan, pScanOrig);
8541     idxStatementFree(p->pStatement, pStmtOrig);
8542     p->pScan = pScanOrig;
8543     p->pStatement = pStmtOrig;
8544   }
8545 
8546   return rc;
8547 }
8548 
8549 int sqlite3_expert_analyze(sqlite3expert *p, char **pzErr){
8550   int rc;
8551   IdxHashEntry *pEntry;
8552 
8553   /* Do trigger processing to collect any extra IdxScan structures */
8554   rc = idxProcessTriggers(p, pzErr);
8555 
8556   /* Create candidate indexes within the in-memory database file */
8557   if( rc==SQLITE_OK ){
8558     rc = idxCreateCandidates(p);
8559   }
8560 
8561   /* Generate the stat1 data */
8562   if( rc==SQLITE_OK ){
8563     rc = idxPopulateStat1(p, pzErr);
8564   }
8565 
8566   /* Formulate the EXPERT_REPORT_CANDIDATES text */
8567   for(pEntry=p->hIdx.pFirst; pEntry; pEntry=pEntry->pNext){
8568     p->zCandidates = idxAppendText(&rc, p->zCandidates,
8569         "%s;%s%s\n", pEntry->zVal,
8570         pEntry->zVal2 ? " -- stat1: " : "", pEntry->zVal2
8571     );
8572   }
8573 
8574   /* Figure out which of the candidate indexes are preferred by the query
8575   ** planner and report the results to the user.  */
8576   if( rc==SQLITE_OK ){
8577     rc = idxFindIndexes(p, pzErr);
8578   }
8579 
8580   if( rc==SQLITE_OK ){
8581     p->bRun = 1;
8582   }
8583   return rc;
8584 }
8585 
8586 /*
8587 ** Return the total number of statements that have been added to this
8588 ** sqlite3expert using sqlite3_expert_sql().
8589 */
8590 int sqlite3_expert_count(sqlite3expert *p){
8591   int nRet = 0;
8592   if( p->pStatement ) nRet = p->pStatement->iId+1;
8593   return nRet;
8594 }
8595 
8596 /*
8597 ** Return a component of the report.
8598 */
8599 const char *sqlite3_expert_report(sqlite3expert *p, int iStmt, int eReport){
8600   const char *zRet = 0;
8601   IdxStatement *pStmt;
8602 
8603   if( p->bRun==0 ) return 0;
8604   for(pStmt=p->pStatement; pStmt && pStmt->iId!=iStmt; pStmt=pStmt->pNext);
8605   switch( eReport ){
8606     case EXPERT_REPORT_SQL:
8607       if( pStmt ) zRet = pStmt->zSql;
8608       break;
8609     case EXPERT_REPORT_INDEXES:
8610       if( pStmt ) zRet = pStmt->zIdx;
8611       break;
8612     case EXPERT_REPORT_PLAN:
8613       if( pStmt ) zRet = pStmt->zEQP;
8614       break;
8615     case EXPERT_REPORT_CANDIDATES:
8616       zRet = p->zCandidates;
8617       break;
8618   }
8619   return zRet;
8620 }
8621 
8622 /*
8623 ** Free an sqlite3expert object.
8624 */
8625 void sqlite3_expert_destroy(sqlite3expert *p){
8626   if( p ){
8627     sqlite3_close(p->dbm);
8628     sqlite3_close(p->dbv);
8629     idxScanFree(p->pScan, 0);
8630     idxStatementFree(p->pStatement, 0);
8631     idxTableFree(p->pTable);
8632     idxWriteFree(p->pWrite);
8633     idxHashClear(&p->hIdx);
8634     sqlite3_free(p->zCandidates);
8635     sqlite3_free(p);
8636   }
8637 }
8638 
8639 #endif /* ifndef SQLITE_OMIT_VIRTUAL_TABLE */
8640 
8641 /************************* End ../ext/expert/sqlite3expert.c ********************/
8642 
8643 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
8644 /************************* Begin ../ext/misc/dbdata.c ******************/
8645 /*
8646 ** 2019-04-17
8647 **
8648 ** The author disclaims copyright to this source code.  In place of
8649 ** a legal notice, here is a blessing:
8650 **
8651 **    May you do good and not evil.
8652 **    May you find forgiveness for yourself and forgive others.
8653 **    May you share freely, never taking more than you give.
8654 **
8655 ******************************************************************************
8656 **
8657 ** This file contains an implementation of two eponymous virtual tables,
8658 ** "sqlite_dbdata" and "sqlite_dbptr". Both modules require that the
8659 ** "sqlite_dbpage" eponymous virtual table be available.
8660 **
8661 ** SQLITE_DBDATA:
8662 **   sqlite_dbdata is used to extract data directly from a database b-tree
8663 **   page and its associated overflow pages, bypassing the b-tree layer.
8664 **   The table schema is equivalent to:
8665 **
8666 **     CREATE TABLE sqlite_dbdata(
8667 **       pgno INTEGER,
8668 **       cell INTEGER,
8669 **       field INTEGER,
8670 **       value ANY,
8671 **       schema TEXT HIDDEN
8672 **     );
8673 **
8674 **   IMPORTANT: THE VIRTUAL TABLE SCHEMA ABOVE IS SUBJECT TO CHANGE. IN THE
8675 **   FUTURE NEW NON-HIDDEN COLUMNS MAY BE ADDED BETWEEN "value" AND
8676 **   "schema".
8677 **
8678 **   Each page of the database is inspected. If it cannot be interpreted as
8679 **   a b-tree page, or if it is a b-tree page containing 0 entries, the
8680 **   sqlite_dbdata table contains no rows for that page.  Otherwise, the
8681 **   table contains one row for each field in the record associated with
8682 **   each cell on the page. For intkey b-trees, the key value is stored in
8683 **   field -1.
8684 **
8685 **   For example, for the database:
8686 **
8687 **     CREATE TABLE t1(a, b);     -- root page is page 2
8688 **     INSERT INTO t1(rowid, a, b) VALUES(5, 'v', 'five');
8689 **     INSERT INTO t1(rowid, a, b) VALUES(10, 'x', 'ten');
8690 **
8691 **   the sqlite_dbdata table contains, as well as from entries related to
8692 **   page 1, content equivalent to:
8693 **
8694 **     INSERT INTO sqlite_dbdata(pgno, cell, field, value) VALUES
8695 **         (2, 0, -1, 5     ),
8696 **         (2, 0,  0, 'v'   ),
8697 **         (2, 0,  1, 'five'),
8698 **         (2, 1, -1, 10    ),
8699 **         (2, 1,  0, 'x'   ),
8700 **         (2, 1,  1, 'ten' );
8701 **
8702 **   If database corruption is encountered, this module does not report an
8703 **   error. Instead, it attempts to extract as much data as possible and
8704 **   ignores the corruption.
8705 **
8706 ** SQLITE_DBPTR:
8707 **   The sqlite_dbptr table has the following schema:
8708 **
8709 **     CREATE TABLE sqlite_dbptr(
8710 **       pgno INTEGER,
8711 **       child INTEGER,
8712 **       schema TEXT HIDDEN
8713 **     );
8714 **
8715 **   It contains one entry for each b-tree pointer between a parent and
8716 **   child page in the database.
8717 */
8718 #if !defined(SQLITEINT_H)
8719 /* #include "sqlite3ext.h" */
8720 
8721 /* typedef unsigned char u8; */
8722 
8723 #endif
8724 SQLITE_EXTENSION_INIT1
8725 #include <string.h>
8726 #include <assert.h>
8727 
8728 #define DBDATA_PADDING_BYTES 100
8729 
8730 typedef struct DbdataTable DbdataTable;
8731 typedef struct DbdataCursor DbdataCursor;
8732 
8733 /* Cursor object */
8734 struct DbdataCursor {
8735   sqlite3_vtab_cursor base;       /* Base class.  Must be first */
8736   sqlite3_stmt *pStmt;            /* For fetching database pages */
8737 
8738   int iPgno;                      /* Current page number */
8739   u8 *aPage;                      /* Buffer containing page */
8740   int nPage;                      /* Size of aPage[] in bytes */
8741   int nCell;                      /* Number of cells on aPage[] */
8742   int iCell;                      /* Current cell number */
8743   int bOnePage;                   /* True to stop after one page */
8744   int szDb;
8745   sqlite3_int64 iRowid;
8746 
8747   /* Only for the sqlite_dbdata table */
8748   u8 *pRec;                       /* Buffer containing current record */
8749   int nRec;                       /* Size of pRec[] in bytes */
8750   int nHdr;                       /* Size of header in bytes */
8751   int iField;                     /* Current field number */
8752   u8 *pHdrPtr;
8753   u8 *pPtr;
8754 
8755   sqlite3_int64 iIntkey;          /* Integer key value */
8756 };
8757 
8758 /* Table object */
8759 struct DbdataTable {
8760   sqlite3_vtab base;              /* Base class.  Must be first */
8761   sqlite3 *db;                    /* The database connection */
8762   sqlite3_stmt *pStmt;            /* For fetching database pages */
8763   int bPtr;                       /* True for sqlite3_dbptr table */
8764 };
8765 
8766 /* Column and schema definitions for sqlite_dbdata */
8767 #define DBDATA_COLUMN_PGNO        0
8768 #define DBDATA_COLUMN_CELL        1
8769 #define DBDATA_COLUMN_FIELD       2
8770 #define DBDATA_COLUMN_VALUE       3
8771 #define DBDATA_COLUMN_SCHEMA      4
8772 #define DBDATA_SCHEMA             \
8773       "CREATE TABLE x("           \
8774       "  pgno INTEGER,"           \
8775       "  cell INTEGER,"           \
8776       "  field INTEGER,"          \
8777       "  value ANY,"              \
8778       "  schema TEXT HIDDEN"      \
8779       ")"
8780 
8781 /* Column and schema definitions for sqlite_dbptr */
8782 #define DBPTR_COLUMN_PGNO         0
8783 #define DBPTR_COLUMN_CHILD        1
8784 #define DBPTR_COLUMN_SCHEMA       2
8785 #define DBPTR_SCHEMA              \
8786       "CREATE TABLE x("           \
8787       "  pgno INTEGER,"           \
8788       "  child INTEGER,"          \
8789       "  schema TEXT HIDDEN"      \
8790       ")"
8791 
8792 /*
8793 ** Connect to an sqlite_dbdata (pAux==0) or sqlite_dbptr (pAux!=0) virtual
8794 ** table.
8795 */
8796 static int dbdataConnect(
8797   sqlite3 *db,
8798   void *pAux,
8799   int argc, const char *const*argv,
8800   sqlite3_vtab **ppVtab,
8801   char **pzErr
8802 ){
8803   DbdataTable *pTab = 0;
8804   int rc = sqlite3_declare_vtab(db, pAux ? DBPTR_SCHEMA : DBDATA_SCHEMA);
8805 
8806   if( rc==SQLITE_OK ){
8807     pTab = (DbdataTable*)sqlite3_malloc64(sizeof(DbdataTable));
8808     if( pTab==0 ){
8809       rc = SQLITE_NOMEM;
8810     }else{
8811       memset(pTab, 0, sizeof(DbdataTable));
8812       pTab->db = db;
8813       pTab->bPtr = (pAux!=0);
8814     }
8815   }
8816 
8817   *ppVtab = (sqlite3_vtab*)pTab;
8818   return rc;
8819 }
8820 
8821 /*
8822 ** Disconnect from or destroy a sqlite_dbdata or sqlite_dbptr virtual table.
8823 */
8824 static int dbdataDisconnect(sqlite3_vtab *pVtab){
8825   DbdataTable *pTab = (DbdataTable*)pVtab;
8826   if( pTab ){
8827     sqlite3_finalize(pTab->pStmt);
8828     sqlite3_free(pVtab);
8829   }
8830   return SQLITE_OK;
8831 }
8832 
8833 /*
8834 ** This function interprets two types of constraints:
8835 **
8836 **       schema=?
8837 **       pgno=?
8838 **
8839 ** If neither are present, idxNum is set to 0. If schema=? is present,
8840 ** the 0x01 bit in idxNum is set. If pgno=? is present, the 0x02 bit
8841 ** in idxNum is set.
8842 **
8843 ** If both parameters are present, schema is in position 0 and pgno in
8844 ** position 1.
8845 */
8846 static int dbdataBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdx){
8847   DbdataTable *pTab = (DbdataTable*)tab;
8848   int i;
8849   int iSchema = -1;
8850   int iPgno = -1;
8851   int colSchema = (pTab->bPtr ? DBPTR_COLUMN_SCHEMA : DBDATA_COLUMN_SCHEMA);
8852 
8853   for(i=0; i<pIdx->nConstraint; i++){
8854     struct sqlite3_index_constraint *p = &pIdx->aConstraint[i];
8855     if( p->op==SQLITE_INDEX_CONSTRAINT_EQ ){
8856       if( p->iColumn==colSchema ){
8857         if( p->usable==0 ) return SQLITE_CONSTRAINT;
8858         iSchema = i;
8859       }
8860       if( p->iColumn==DBDATA_COLUMN_PGNO && p->usable ){
8861         iPgno = i;
8862       }
8863     }
8864   }
8865 
8866   if( iSchema>=0 ){
8867     pIdx->aConstraintUsage[iSchema].argvIndex = 1;
8868     pIdx->aConstraintUsage[iSchema].omit = 1;
8869   }
8870   if( iPgno>=0 ){
8871     pIdx->aConstraintUsage[iPgno].argvIndex = 1 + (iSchema>=0);
8872     pIdx->aConstraintUsage[iPgno].omit = 1;
8873     pIdx->estimatedCost = 100;
8874     pIdx->estimatedRows =  50;
8875 
8876     if( pTab->bPtr==0 && pIdx->nOrderBy && pIdx->aOrderBy[0].desc==0 ){
8877       int iCol = pIdx->aOrderBy[0].iColumn;
8878       if( pIdx->nOrderBy==1 ){
8879         pIdx->orderByConsumed = (iCol==0 || iCol==1);
8880       }else if( pIdx->nOrderBy==2 && pIdx->aOrderBy[1].desc==0 && iCol==0 ){
8881         pIdx->orderByConsumed = (pIdx->aOrderBy[1].iColumn==1);
8882       }
8883     }
8884 
8885   }else{
8886     pIdx->estimatedCost = 100000000;
8887     pIdx->estimatedRows = 1000000000;
8888   }
8889   pIdx->idxNum = (iSchema>=0 ? 0x01 : 0x00) | (iPgno>=0 ? 0x02 : 0x00);
8890   return SQLITE_OK;
8891 }
8892 
8893 /*
8894 ** Open a new sqlite_dbdata or sqlite_dbptr cursor.
8895 */
8896 static int dbdataOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){
8897   DbdataCursor *pCsr;
8898 
8899   pCsr = (DbdataCursor*)sqlite3_malloc64(sizeof(DbdataCursor));
8900   if( pCsr==0 ){
8901     return SQLITE_NOMEM;
8902   }else{
8903     memset(pCsr, 0, sizeof(DbdataCursor));
8904     pCsr->base.pVtab = pVTab;
8905   }
8906 
8907   *ppCursor = (sqlite3_vtab_cursor *)pCsr;
8908   return SQLITE_OK;
8909 }
8910 
8911 /*
8912 ** Restore a cursor object to the state it was in when first allocated
8913 ** by dbdataOpen().
8914 */
8915 static void dbdataResetCursor(DbdataCursor *pCsr){
8916   DbdataTable *pTab = (DbdataTable*)(pCsr->base.pVtab);
8917   if( pTab->pStmt==0 ){
8918     pTab->pStmt = pCsr->pStmt;
8919   }else{
8920     sqlite3_finalize(pCsr->pStmt);
8921   }
8922   pCsr->pStmt = 0;
8923   pCsr->iPgno = 1;
8924   pCsr->iCell = 0;
8925   pCsr->iField = 0;
8926   pCsr->bOnePage = 0;
8927   sqlite3_free(pCsr->aPage);
8928   sqlite3_free(pCsr->pRec);
8929   pCsr->pRec = 0;
8930   pCsr->aPage = 0;
8931 }
8932 
8933 /*
8934 ** Close an sqlite_dbdata or sqlite_dbptr cursor.
8935 */
8936 static int dbdataClose(sqlite3_vtab_cursor *pCursor){
8937   DbdataCursor *pCsr = (DbdataCursor*)pCursor;
8938   dbdataResetCursor(pCsr);
8939   sqlite3_free(pCsr);
8940   return SQLITE_OK;
8941 }
8942 
8943 /*
8944 ** Utility methods to decode 16 and 32-bit big-endian unsigned integers.
8945 */
8946 static unsigned int get_uint16(unsigned char *a){
8947   return (a[0]<<8)|a[1];
8948 }
8949 static unsigned int get_uint32(unsigned char *a){
8950   return ((unsigned int)a[0]<<24)
8951        | ((unsigned int)a[1]<<16)
8952        | ((unsigned int)a[2]<<8)
8953        | ((unsigned int)a[3]);
8954 }
8955 
8956 /*
8957 ** Load page pgno from the database via the sqlite_dbpage virtual table.
8958 ** If successful, set (*ppPage) to point to a buffer containing the page
8959 ** data, (*pnPage) to the size of that buffer in bytes and return
8960 ** SQLITE_OK. In this case it is the responsibility of the caller to
8961 ** eventually free the buffer using sqlite3_free().
8962 **
8963 ** Or, if an error occurs, set both (*ppPage) and (*pnPage) to 0 and
8964 ** return an SQLite error code.
8965 */
8966 static int dbdataLoadPage(
8967   DbdataCursor *pCsr,             /* Cursor object */
8968   unsigned int pgno,              /* Page number of page to load */
8969   u8 **ppPage,                    /* OUT: pointer to page buffer */
8970   int *pnPage                     /* OUT: Size of (*ppPage) in bytes */
8971 ){
8972   int rc2;
8973   int rc = SQLITE_OK;
8974   sqlite3_stmt *pStmt = pCsr->pStmt;
8975 
8976   *ppPage = 0;
8977   *pnPage = 0;
8978   sqlite3_bind_int64(pStmt, 2, pgno);
8979   if( SQLITE_ROW==sqlite3_step(pStmt) ){
8980     int nCopy = sqlite3_column_bytes(pStmt, 0);
8981     if( nCopy>0 ){
8982       u8 *pPage;
8983       pPage = (u8*)sqlite3_malloc64(nCopy + DBDATA_PADDING_BYTES);
8984       if( pPage==0 ){
8985         rc = SQLITE_NOMEM;
8986       }else{
8987         const u8 *pCopy = sqlite3_column_blob(pStmt, 0);
8988         memcpy(pPage, pCopy, nCopy);
8989         memset(&pPage[nCopy], 0, DBDATA_PADDING_BYTES);
8990       }
8991       *ppPage = pPage;
8992       *pnPage = nCopy;
8993     }
8994   }
8995   rc2 = sqlite3_reset(pStmt);
8996   if( rc==SQLITE_OK ) rc = rc2;
8997 
8998   return rc;
8999 }
9000 
9001 /*
9002 ** Read a varint.  Put the value in *pVal and return the number of bytes.
9003 */
9004 static int dbdataGetVarint(const u8 *z, sqlite3_int64 *pVal){
9005   sqlite3_int64 v = 0;
9006   int i;
9007   for(i=0; i<8; i++){
9008     v = (v<<7) + (z[i]&0x7f);
9009     if( (z[i]&0x80)==0 ){ *pVal = v; return i+1; }
9010   }
9011   v = (v<<8) + (z[i]&0xff);
9012   *pVal = v;
9013   return 9;
9014 }
9015 
9016 /*
9017 ** Return the number of bytes of space used by an SQLite value of type
9018 ** eType.
9019 */
9020 static int dbdataValueBytes(int eType){
9021   switch( eType ){
9022     case 0: case 8: case 9:
9023     case 10: case 11:
9024       return 0;
9025     case 1:
9026       return 1;
9027     case 2:
9028       return 2;
9029     case 3:
9030       return 3;
9031     case 4:
9032       return 4;
9033     case 5:
9034       return 6;
9035     case 6:
9036     case 7:
9037       return 8;
9038     default:
9039       if( eType>0 ){
9040         return ((eType-12) / 2);
9041       }
9042       return 0;
9043   }
9044 }
9045 
9046 /*
9047 ** Load a value of type eType from buffer pData and use it to set the
9048 ** result of context object pCtx.
9049 */
9050 static void dbdataValue(
9051   sqlite3_context *pCtx,
9052   int eType,
9053   u8 *pData,
9054   int nData
9055 ){
9056   if( eType>=0 && dbdataValueBytes(eType)<=nData ){
9057     switch( eType ){
9058       case 0:
9059       case 10:
9060       case 11:
9061         sqlite3_result_null(pCtx);
9062         break;
9063 
9064       case 8:
9065         sqlite3_result_int(pCtx, 0);
9066         break;
9067       case 9:
9068         sqlite3_result_int(pCtx, 1);
9069         break;
9070 
9071       case 1: case 2: case 3: case 4: case 5: case 6: case 7: {
9072         sqlite3_uint64 v = (signed char)pData[0];
9073         pData++;
9074         switch( eType ){
9075           case 7:
9076           case 6:  v = (v<<16) + (pData[0]<<8) + pData[1];  pData += 2;
9077           case 5:  v = (v<<16) + (pData[0]<<8) + pData[1];  pData += 2;
9078           case 4:  v = (v<<8) + pData[0];  pData++;
9079           case 3:  v = (v<<8) + pData[0];  pData++;
9080           case 2:  v = (v<<8) + pData[0];  pData++;
9081         }
9082 
9083         if( eType==7 ){
9084           double r;
9085           memcpy(&r, &v, sizeof(r));
9086           sqlite3_result_double(pCtx, r);
9087         }else{
9088           sqlite3_result_int64(pCtx, (sqlite3_int64)v);
9089         }
9090         break;
9091       }
9092 
9093       default: {
9094         int n = ((eType-12) / 2);
9095         if( eType % 2 ){
9096           sqlite3_result_text(pCtx, (const char*)pData, n, SQLITE_TRANSIENT);
9097         }else{
9098           sqlite3_result_blob(pCtx, pData, n, SQLITE_TRANSIENT);
9099         }
9100       }
9101     }
9102   }
9103 }
9104 
9105 /*
9106 ** Move an sqlite_dbdata or sqlite_dbptr cursor to the next entry.
9107 */
9108 static int dbdataNext(sqlite3_vtab_cursor *pCursor){
9109   DbdataCursor *pCsr = (DbdataCursor*)pCursor;
9110   DbdataTable *pTab = (DbdataTable*)pCursor->pVtab;
9111 
9112   pCsr->iRowid++;
9113   while( 1 ){
9114     int rc;
9115     int iOff = (pCsr->iPgno==1 ? 100 : 0);
9116     int bNextPage = 0;
9117 
9118     if( pCsr->aPage==0 ){
9119       while( 1 ){
9120         if( pCsr->bOnePage==0 && pCsr->iPgno>pCsr->szDb ) return SQLITE_OK;
9121         rc = dbdataLoadPage(pCsr, pCsr->iPgno, &pCsr->aPage, &pCsr->nPage);
9122         if( rc!=SQLITE_OK ) return rc;
9123         if( pCsr->aPage ) break;
9124         pCsr->iPgno++;
9125       }
9126       pCsr->iCell = pTab->bPtr ? -2 : 0;
9127       pCsr->nCell = get_uint16(&pCsr->aPage[iOff+3]);
9128     }
9129 
9130     if( pTab->bPtr ){
9131       if( pCsr->aPage[iOff]!=0x02 && pCsr->aPage[iOff]!=0x05 ){
9132         pCsr->iCell = pCsr->nCell;
9133       }
9134       pCsr->iCell++;
9135       if( pCsr->iCell>=pCsr->nCell ){
9136         sqlite3_free(pCsr->aPage);
9137         pCsr->aPage = 0;
9138         if( pCsr->bOnePage ) return SQLITE_OK;
9139         pCsr->iPgno++;
9140       }else{
9141         return SQLITE_OK;
9142       }
9143     }else{
9144       /* If there is no record loaded, load it now. */
9145       if( pCsr->pRec==0 ){
9146         int bHasRowid = 0;
9147         int nPointer = 0;
9148         sqlite3_int64 nPayload = 0;
9149         sqlite3_int64 nHdr = 0;
9150         int iHdr;
9151         int U, X;
9152         int nLocal;
9153 
9154         switch( pCsr->aPage[iOff] ){
9155           case 0x02:
9156             nPointer = 4;
9157             break;
9158           case 0x0a:
9159             break;
9160           case 0x0d:
9161             bHasRowid = 1;
9162             break;
9163           default:
9164             /* This is not a b-tree page with records on it. Continue. */
9165             pCsr->iCell = pCsr->nCell;
9166             break;
9167         }
9168 
9169         if( pCsr->iCell>=pCsr->nCell ){
9170           bNextPage = 1;
9171         }else{
9172 
9173           iOff += 8 + nPointer + pCsr->iCell*2;
9174           if( iOff>pCsr->nPage ){
9175             bNextPage = 1;
9176           }else{
9177             iOff = get_uint16(&pCsr->aPage[iOff]);
9178           }
9179 
9180           /* For an interior node cell, skip past the child-page number */
9181           iOff += nPointer;
9182 
9183           /* Load the "byte of payload including overflow" field */
9184           if( bNextPage || iOff>pCsr->nPage ){
9185             bNextPage = 1;
9186           }else{
9187             iOff += dbdataGetVarint(&pCsr->aPage[iOff], &nPayload);
9188           }
9189 
9190           /* If this is a leaf intkey cell, load the rowid */
9191           if( bHasRowid && !bNextPage && iOff<pCsr->nPage ){
9192             iOff += dbdataGetVarint(&pCsr->aPage[iOff], &pCsr->iIntkey);
9193           }
9194 
9195           /* Figure out how much data to read from the local page */
9196           U = pCsr->nPage;
9197           if( bHasRowid ){
9198             X = U-35;
9199           }else{
9200             X = ((U-12)*64/255)-23;
9201           }
9202           if( nPayload<=X ){
9203             nLocal = nPayload;
9204           }else{
9205             int M, K;
9206             M = ((U-12)*32/255)-23;
9207             K = M+((nPayload-M)%(U-4));
9208             if( K<=X ){
9209               nLocal = K;
9210             }else{
9211               nLocal = M;
9212             }
9213           }
9214 
9215           if( bNextPage || nLocal+iOff>pCsr->nPage ){
9216             bNextPage = 1;
9217           }else{
9218 
9219             /* Allocate space for payload. And a bit more to catch small buffer
9220             ** overruns caused by attempting to read a varint or similar from
9221             ** near the end of a corrupt record.  */
9222             pCsr->pRec = (u8*)sqlite3_malloc64(nPayload+DBDATA_PADDING_BYTES);
9223             if( pCsr->pRec==0 ) return SQLITE_NOMEM;
9224             memset(pCsr->pRec, 0, nPayload+DBDATA_PADDING_BYTES);
9225             pCsr->nRec = nPayload;
9226 
9227             /* Load the nLocal bytes of payload */
9228             memcpy(pCsr->pRec, &pCsr->aPage[iOff], nLocal);
9229             iOff += nLocal;
9230 
9231             /* Load content from overflow pages */
9232             if( nPayload>nLocal ){
9233               sqlite3_int64 nRem = nPayload - nLocal;
9234               unsigned int pgnoOvfl = get_uint32(&pCsr->aPage[iOff]);
9235               while( nRem>0 ){
9236                 u8 *aOvfl = 0;
9237                 int nOvfl = 0;
9238                 int nCopy;
9239                 rc = dbdataLoadPage(pCsr, pgnoOvfl, &aOvfl, &nOvfl);
9240                 assert( rc!=SQLITE_OK || aOvfl==0 || nOvfl==pCsr->nPage );
9241                 if( rc!=SQLITE_OK ) return rc;
9242                 if( aOvfl==0 ) break;
9243 
9244                 nCopy = U-4;
9245                 if( nCopy>nRem ) nCopy = nRem;
9246                 memcpy(&pCsr->pRec[nPayload-nRem], &aOvfl[4], nCopy);
9247                 nRem -= nCopy;
9248 
9249                 pgnoOvfl = get_uint32(aOvfl);
9250                 sqlite3_free(aOvfl);
9251               }
9252             }
9253 
9254             iHdr = dbdataGetVarint(pCsr->pRec, &nHdr);
9255             pCsr->nHdr = nHdr;
9256             pCsr->pHdrPtr = &pCsr->pRec[iHdr];
9257             pCsr->pPtr = &pCsr->pRec[pCsr->nHdr];
9258             pCsr->iField = (bHasRowid ? -1 : 0);
9259           }
9260         }
9261       }else{
9262         pCsr->iField++;
9263         if( pCsr->iField>0 ){
9264           sqlite3_int64 iType;
9265           if( pCsr->pHdrPtr>&pCsr->pRec[pCsr->nRec] ){
9266             bNextPage = 1;
9267           }else{
9268             pCsr->pHdrPtr += dbdataGetVarint(pCsr->pHdrPtr, &iType);
9269             pCsr->pPtr += dbdataValueBytes(iType);
9270           }
9271         }
9272       }
9273 
9274       if( bNextPage ){
9275         sqlite3_free(pCsr->aPage);
9276         sqlite3_free(pCsr->pRec);
9277         pCsr->aPage = 0;
9278         pCsr->pRec = 0;
9279         if( pCsr->bOnePage ) return SQLITE_OK;
9280         pCsr->iPgno++;
9281       }else{
9282         if( pCsr->iField<0 || pCsr->pHdrPtr<&pCsr->pRec[pCsr->nHdr] ){
9283           return SQLITE_OK;
9284         }
9285 
9286         /* Advance to the next cell. The next iteration of the loop will load
9287         ** the record and so on. */
9288         sqlite3_free(pCsr->pRec);
9289         pCsr->pRec = 0;
9290         pCsr->iCell++;
9291       }
9292     }
9293   }
9294 
9295   assert( !"can't get here" );
9296   return SQLITE_OK;
9297 }
9298 
9299 /*
9300 ** Return true if the cursor is at EOF.
9301 */
9302 static int dbdataEof(sqlite3_vtab_cursor *pCursor){
9303   DbdataCursor *pCsr = (DbdataCursor*)pCursor;
9304   return pCsr->aPage==0;
9305 }
9306 
9307 /*
9308 ** Determine the size in pages of database zSchema (where zSchema is
9309 ** "main", "temp" or the name of an attached database) and set
9310 ** pCsr->szDb accordingly. If successful, return SQLITE_OK. Otherwise,
9311 ** an SQLite error code.
9312 */
9313 static int dbdataDbsize(DbdataCursor *pCsr, const char *zSchema){
9314   DbdataTable *pTab = (DbdataTable*)pCsr->base.pVtab;
9315   char *zSql = 0;
9316   int rc, rc2;
9317   sqlite3_stmt *pStmt = 0;
9318 
9319   zSql = sqlite3_mprintf("PRAGMA %Q.page_count", zSchema);
9320   if( zSql==0 ) return SQLITE_NOMEM;
9321   rc = sqlite3_prepare_v2(pTab->db, zSql, -1, &pStmt, 0);
9322   sqlite3_free(zSql);
9323   if( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
9324     pCsr->szDb = sqlite3_column_int(pStmt, 0);
9325   }
9326   rc2 = sqlite3_finalize(pStmt);
9327   if( rc==SQLITE_OK ) rc = rc2;
9328   return rc;
9329 }
9330 
9331 /*
9332 ** xFilter method for sqlite_dbdata and sqlite_dbptr.
9333 */
9334 static int dbdataFilter(
9335   sqlite3_vtab_cursor *pCursor,
9336   int idxNum, const char *idxStr,
9337   int argc, sqlite3_value **argv
9338 ){
9339   DbdataCursor *pCsr = (DbdataCursor*)pCursor;
9340   DbdataTable *pTab = (DbdataTable*)pCursor->pVtab;
9341   int rc = SQLITE_OK;
9342   const char *zSchema = "main";
9343 
9344   dbdataResetCursor(pCsr);
9345   assert( pCsr->iPgno==1 );
9346   if( idxNum & 0x01 ){
9347     zSchema = (const char*)sqlite3_value_text(argv[0]);
9348   }
9349   if( idxNum & 0x02 ){
9350     pCsr->iPgno = sqlite3_value_int(argv[(idxNum & 0x01)]);
9351     pCsr->bOnePage = 1;
9352   }else{
9353     pCsr->nPage = dbdataDbsize(pCsr, zSchema);
9354     rc = dbdataDbsize(pCsr, zSchema);
9355   }
9356 
9357   if( rc==SQLITE_OK ){
9358     if( pTab->pStmt ){
9359       pCsr->pStmt = pTab->pStmt;
9360       pTab->pStmt = 0;
9361     }else{
9362       rc = sqlite3_prepare_v2(pTab->db,
9363           "SELECT data FROM sqlite_dbpage(?) WHERE pgno=?", -1,
9364           &pCsr->pStmt, 0
9365       );
9366     }
9367   }
9368   if( rc==SQLITE_OK ){
9369     rc = sqlite3_bind_text(pCsr->pStmt, 1, zSchema, -1, SQLITE_TRANSIENT);
9370   }else{
9371     pTab->base.zErrMsg = sqlite3_mprintf("%s", sqlite3_errmsg(pTab->db));
9372   }
9373   if( rc==SQLITE_OK ){
9374     rc = dbdataNext(pCursor);
9375   }
9376   return rc;
9377 }
9378 
9379 /*
9380 ** Return a column for the sqlite_dbdata or sqlite_dbptr table.
9381 */
9382 static int dbdataColumn(
9383   sqlite3_vtab_cursor *pCursor,
9384   sqlite3_context *ctx,
9385   int i
9386 ){
9387   DbdataCursor *pCsr = (DbdataCursor*)pCursor;
9388   DbdataTable *pTab = (DbdataTable*)pCursor->pVtab;
9389   if( pTab->bPtr ){
9390     switch( i ){
9391       case DBPTR_COLUMN_PGNO:
9392         sqlite3_result_int64(ctx, pCsr->iPgno);
9393         break;
9394       case DBPTR_COLUMN_CHILD: {
9395         int iOff = pCsr->iPgno==1 ? 100 : 0;
9396         if( pCsr->iCell<0 ){
9397           iOff += 8;
9398         }else{
9399           iOff += 12 + pCsr->iCell*2;
9400           if( iOff>pCsr->nPage ) return SQLITE_OK;
9401           iOff = get_uint16(&pCsr->aPage[iOff]);
9402         }
9403         if( iOff<=pCsr->nPage ){
9404           sqlite3_result_int64(ctx, get_uint32(&pCsr->aPage[iOff]));
9405         }
9406         break;
9407       }
9408     }
9409   }else{
9410     switch( i ){
9411       case DBDATA_COLUMN_PGNO:
9412         sqlite3_result_int64(ctx, pCsr->iPgno);
9413         break;
9414       case DBDATA_COLUMN_CELL:
9415         sqlite3_result_int(ctx, pCsr->iCell);
9416         break;
9417       case DBDATA_COLUMN_FIELD:
9418         sqlite3_result_int(ctx, pCsr->iField);
9419         break;
9420       case DBDATA_COLUMN_VALUE: {
9421         if( pCsr->iField<0 ){
9422           sqlite3_result_int64(ctx, pCsr->iIntkey);
9423         }else{
9424           sqlite3_int64 iType;
9425           dbdataGetVarint(pCsr->pHdrPtr, &iType);
9426           dbdataValue(
9427               ctx, iType, pCsr->pPtr, &pCsr->pRec[pCsr->nRec] - pCsr->pPtr
9428           );
9429         }
9430         break;
9431       }
9432     }
9433   }
9434   return SQLITE_OK;
9435 }
9436 
9437 /*
9438 ** Return the rowid for an sqlite_dbdata or sqlite_dptr table.
9439 */
9440 static int dbdataRowid(sqlite3_vtab_cursor *pCursor, sqlite_int64 *pRowid){
9441   DbdataCursor *pCsr = (DbdataCursor*)pCursor;
9442   *pRowid = pCsr->iRowid;
9443   return SQLITE_OK;
9444 }
9445 
9446 
9447 /*
9448 ** Invoke this routine to register the "sqlite_dbdata" virtual table module
9449 */
9450 static int sqlite3DbdataRegister(sqlite3 *db){
9451   static sqlite3_module dbdata_module = {
9452     0,                            /* iVersion */
9453     0,                            /* xCreate */
9454     dbdataConnect,                /* xConnect */
9455     dbdataBestIndex,              /* xBestIndex */
9456     dbdataDisconnect,             /* xDisconnect */
9457     0,                            /* xDestroy */
9458     dbdataOpen,                   /* xOpen - open a cursor */
9459     dbdataClose,                  /* xClose - close a cursor */
9460     dbdataFilter,                 /* xFilter - configure scan constraints */
9461     dbdataNext,                   /* xNext - advance a cursor */
9462     dbdataEof,                    /* xEof - check for end of scan */
9463     dbdataColumn,                 /* xColumn - read data */
9464     dbdataRowid,                  /* xRowid - read data */
9465     0,                            /* xUpdate */
9466     0,                            /* xBegin */
9467     0,                            /* xSync */
9468     0,                            /* xCommit */
9469     0,                            /* xRollback */
9470     0,                            /* xFindMethod */
9471     0,                            /* xRename */
9472     0,                            /* xSavepoint */
9473     0,                            /* xRelease */
9474     0,                            /* xRollbackTo */
9475     0                             /* xShadowName */
9476   };
9477 
9478   int rc = sqlite3_create_module(db, "sqlite_dbdata", &dbdata_module, 0);
9479   if( rc==SQLITE_OK ){
9480     rc = sqlite3_create_module(db, "sqlite_dbptr", &dbdata_module, (void*)1);
9481   }
9482   return rc;
9483 }
9484 
9485 #ifdef _WIN32
9486 
9487 #endif
9488 int sqlite3_dbdata_init(
9489   sqlite3 *db,
9490   char **pzErrMsg,
9491   const sqlite3_api_routines *pApi
9492 ){
9493   SQLITE_EXTENSION_INIT2(pApi);
9494   return sqlite3DbdataRegister(db);
9495 }
9496 
9497 /************************* End ../ext/misc/dbdata.c ********************/
9498 #endif
9499 
9500 #if defined(SQLITE_ENABLE_SESSION)
9501 /*
9502 ** State information for a single open session
9503 */
9504 typedef struct OpenSession OpenSession;
9505 struct OpenSession {
9506   char *zName;             /* Symbolic name for this session */
9507   int nFilter;             /* Number of xFilter rejection GLOB patterns */
9508   char **azFilter;         /* Array of xFilter rejection GLOB patterns */
9509   sqlite3_session *p;      /* The open session */
9510 };
9511 #endif
9512 
9513 /*
9514 ** Shell output mode information from before ".explain on",
9515 ** saved so that it can be restored by ".explain off"
9516 */
9517 typedef struct SavedModeInfo SavedModeInfo;
9518 struct SavedModeInfo {
9519   int valid;          /* Is there legit data in here? */
9520   int mode;           /* Mode prior to ".explain on" */
9521   int showHeader;     /* The ".header" setting prior to ".explain on" */
9522   int colWidth[100];  /* Column widths prior to ".explain on" */
9523 };
9524 
9525 typedef struct ExpertInfo ExpertInfo;
9526 struct ExpertInfo {
9527   sqlite3expert *pExpert;
9528   int bVerbose;
9529 };
9530 
9531 /* A single line in the EQP output */
9532 typedef struct EQPGraphRow EQPGraphRow;
9533 struct EQPGraphRow {
9534   int iEqpId;           /* ID for this row */
9535   int iParentId;        /* ID of the parent row */
9536   EQPGraphRow *pNext;   /* Next row in sequence */
9537   char zText[1];        /* Text to display for this row */
9538 };
9539 
9540 /* All EQP output is collected into an instance of the following */
9541 typedef struct EQPGraph EQPGraph;
9542 struct EQPGraph {
9543   EQPGraphRow *pRow;    /* Linked list of all rows of the EQP output */
9544   EQPGraphRow *pLast;   /* Last element of the pRow list */
9545   char zPrefix[100];    /* Graph prefix */
9546 };
9547 
9548 /*
9549 ** State information about the database connection is contained in an
9550 ** instance of the following structure.
9551 */
9552 typedef struct ShellState ShellState;
9553 struct ShellState {
9554   sqlite3 *db;           /* The database */
9555   u8 autoExplain;        /* Automatically turn on .explain mode */
9556   u8 autoEQP;            /* Run EXPLAIN QUERY PLAN prior to seach SQL stmt */
9557   u8 autoEQPtest;        /* autoEQP is in test mode */
9558   u8 autoEQPtrace;       /* autoEQP is in trace mode */
9559   u8 statsOn;            /* True to display memory stats before each finalize */
9560   u8 scanstatsOn;        /* True to display scan stats before each finalize */
9561   u8 openMode;           /* SHELL_OPEN_NORMAL, _APPENDVFS, or _ZIPFILE */
9562   u8 doXdgOpen;          /* Invoke start/open/xdg-open in output_reset() */
9563   u8 nEqpLevel;          /* Depth of the EQP output graph */
9564   u8 eTraceType;         /* SHELL_TRACE_* value for type of trace */
9565   unsigned mEqpLines;    /* Mask of veritical lines in the EQP output graph */
9566   int outCount;          /* Revert to stdout when reaching zero */
9567   int cnt;               /* Number of records displayed so far */
9568   int lineno;            /* Line number of last line read from in */
9569   FILE *in;              /* Read commands from this stream */
9570   FILE *out;             /* Write results here */
9571   FILE *traceOut;        /* Output for sqlite3_trace() */
9572   int nErr;              /* Number of errors seen */
9573   int mode;              /* An output mode setting */
9574   int modePrior;         /* Saved mode */
9575   int cMode;             /* temporary output mode for the current query */
9576   int normalMode;        /* Output mode before ".explain on" */
9577   int writableSchema;    /* True if PRAGMA writable_schema=ON */
9578   int showHeader;        /* True to show column names in List or Column mode */
9579   int nCheck;            /* Number of ".check" commands run */
9580   unsigned nProgress;    /* Number of progress callbacks encountered */
9581   unsigned mxProgress;   /* Maximum progress callbacks before failing */
9582   unsigned flgProgress;  /* Flags for the progress callback */
9583   unsigned shellFlgs;    /* Various flags */
9584   sqlite3_int64 szMax;   /* --maxsize argument to .open */
9585   char *zDestTable;      /* Name of destination table when MODE_Insert */
9586   char *zTempFile;       /* Temporary file that might need deleting */
9587   char zTestcase[30];    /* Name of current test case */
9588   char colSeparator[20]; /* Column separator character for several modes */
9589   char rowSeparator[20]; /* Row separator character for MODE_Ascii */
9590   char colSepPrior[20];  /* Saved column separator */
9591   char rowSepPrior[20];  /* Saved row separator */
9592   int colWidth[100];     /* Requested width of each column when in column mode*/
9593   int actualWidth[100];  /* Actual width of each column */
9594   char nullValue[20];    /* The text to print when a NULL comes back from
9595                          ** the database */
9596   char outfile[FILENAME_MAX]; /* Filename for *out */
9597   const char *zDbFilename;    /* name of the database file */
9598   char *zFreeOnClose;         /* Filename to free when closing */
9599   const char *zVfs;           /* Name of VFS to use */
9600   sqlite3_stmt *pStmt;   /* Current statement if any. */
9601   FILE *pLog;            /* Write log output here */
9602   int *aiIndent;         /* Array of indents used in MODE_Explain */
9603   int nIndent;           /* Size of array aiIndent[] */
9604   int iIndent;           /* Index of current op in aiIndent[] */
9605   EQPGraph sGraph;       /* Information for the graphical EXPLAIN QUERY PLAN */
9606 #if defined(SQLITE_ENABLE_SESSION)
9607   int nSession;             /* Number of active sessions */
9608   OpenSession aSession[4];  /* Array of sessions.  [0] is in focus. */
9609 #endif
9610   ExpertInfo expert;        /* Valid if previous command was ".expert OPT..." */
9611 };
9612 
9613 
9614 /* Allowed values for ShellState.autoEQP
9615 */
9616 #define AUTOEQP_off      0           /* Automatic EXPLAIN QUERY PLAN is off */
9617 #define AUTOEQP_on       1           /* Automatic EQP is on */
9618 #define AUTOEQP_trigger  2           /* On and also show plans for triggers */
9619 #define AUTOEQP_full     3           /* Show full EXPLAIN */
9620 
9621 /* Allowed values for ShellState.openMode
9622 */
9623 #define SHELL_OPEN_UNSPEC      0      /* No open-mode specified */
9624 #define SHELL_OPEN_NORMAL      1      /* Normal database file */
9625 #define SHELL_OPEN_APPENDVFS   2      /* Use appendvfs */
9626 #define SHELL_OPEN_ZIPFILE     3      /* Use the zipfile virtual table */
9627 #define SHELL_OPEN_READONLY    4      /* Open a normal database read-only */
9628 #define SHELL_OPEN_DESERIALIZE 5      /* Open using sqlite3_deserialize() */
9629 #define SHELL_OPEN_HEXDB       6      /* Use "dbtotxt" output as data source */
9630 
9631 /* Allowed values for ShellState.eTraceType
9632 */
9633 #define SHELL_TRACE_PLAIN      0      /* Show input SQL text */
9634 #define SHELL_TRACE_EXPANDED   1      /* Show expanded SQL text */
9635 #define SHELL_TRACE_NORMALIZED 2      /* Show normalized SQL text */
9636 
9637 /* Bits in the ShellState.flgProgress variable */
9638 #define SHELL_PROGRESS_QUIET 0x01  /* Omit announcing every progress callback */
9639 #define SHELL_PROGRESS_RESET 0x02  /* Reset the count when the progres
9640                                    ** callback limit is reached, and for each
9641                                    ** top-level SQL statement */
9642 #define SHELL_PROGRESS_ONCE  0x04  /* Cancel the --limit after firing once */
9643 
9644 /*
9645 ** These are the allowed shellFlgs values
9646 */
9647 #define SHFLG_Pagecache      0x00000001 /* The --pagecache option is used */
9648 #define SHFLG_Lookaside      0x00000002 /* Lookaside memory is used */
9649 #define SHFLG_Backslash      0x00000004 /* The --backslash option is used */
9650 #define SHFLG_PreserveRowid  0x00000008 /* .dump preserves rowid values */
9651 #define SHFLG_Newlines       0x00000010 /* .dump --newline flag */
9652 #define SHFLG_CountChanges   0x00000020 /* .changes setting */
9653 #define SHFLG_Echo           0x00000040 /* .echo or --echo setting */
9654 
9655 /*
9656 ** Macros for testing and setting shellFlgs
9657 */
9658 #define ShellHasFlag(P,X)    (((P)->shellFlgs & (X))!=0)
9659 #define ShellSetFlag(P,X)    ((P)->shellFlgs|=(X))
9660 #define ShellClearFlag(P,X)  ((P)->shellFlgs&=(~(X)))
9661 
9662 /*
9663 ** These are the allowed modes.
9664 */
9665 #define MODE_Line     0  /* One column per line.  Blank line between records */
9666 #define MODE_Column   1  /* One record per line in neat columns */
9667 #define MODE_List     2  /* One record per line with a separator */
9668 #define MODE_Semi     3  /* Same as MODE_List but append ";" to each line */
9669 #define MODE_Html     4  /* Generate an XHTML table */
9670 #define MODE_Insert   5  /* Generate SQL "insert" statements */
9671 #define MODE_Quote    6  /* Quote values as for SQL */
9672 #define MODE_Tcl      7  /* Generate ANSI-C or TCL quoted elements */
9673 #define MODE_Csv      8  /* Quote strings, numbers are plain */
9674 #define MODE_Explain  9  /* Like MODE_Column, but do not truncate data */
9675 #define MODE_Ascii   10  /* Use ASCII unit and record separators (0x1F/0x1E) */
9676 #define MODE_Pretty  11  /* Pretty-print schemas */
9677 #define MODE_EQP     12  /* Converts EXPLAIN QUERY PLAN output into a graph */
9678 
9679 static const char *modeDescr[] = {
9680   "line",
9681   "column",
9682   "list",
9683   "semi",
9684   "html",
9685   "insert",
9686   "quote",
9687   "tcl",
9688   "csv",
9689   "explain",
9690   "ascii",
9691   "prettyprint",
9692   "eqp"
9693 };
9694 
9695 /*
9696 ** These are the column/row/line separators used by the various
9697 ** import/export modes.
9698 */
9699 #define SEP_Column    "|"
9700 #define SEP_Row       "\n"
9701 #define SEP_Tab       "\t"
9702 #define SEP_Space     " "
9703 #define SEP_Comma     ","
9704 #define SEP_CrLf      "\r\n"
9705 #define SEP_Unit      "\x1F"
9706 #define SEP_Record    "\x1E"
9707 
9708 /*
9709 ** A callback for the sqlite3_log() interface.
9710 */
9711 static void shellLog(void *pArg, int iErrCode, const char *zMsg){
9712   ShellState *p = (ShellState*)pArg;
9713   if( p->pLog==0 ) return;
9714   utf8_printf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
9715   fflush(p->pLog);
9716 }
9717 
9718 /*
9719 ** SQL function:  shell_putsnl(X)
9720 **
9721 ** Write the text X to the screen (or whatever output is being directed)
9722 ** adding a newline at the end, and then return X.
9723 */
9724 static void shellPutsFunc(
9725   sqlite3_context *pCtx,
9726   int nVal,
9727   sqlite3_value **apVal
9728 ){
9729   ShellState *p = (ShellState*)sqlite3_user_data(pCtx);
9730   (void)nVal;
9731   utf8_printf(p->out, "%s\n", sqlite3_value_text(apVal[0]));
9732   sqlite3_result_value(pCtx, apVal[0]);
9733 }
9734 
9735 /*
9736 ** SQL function:   edit(VALUE)
9737 **                 edit(VALUE,EDITOR)
9738 **
9739 ** These steps:
9740 **
9741 **     (1) Write VALUE into a temporary file.
9742 **     (2) Run program EDITOR on that temporary file.
9743 **     (3) Read the temporary file back and return its content as the result.
9744 **     (4) Delete the temporary file
9745 **
9746 ** If the EDITOR argument is omitted, use the value in the VISUAL
9747 ** environment variable.  If still there is no EDITOR, through an error.
9748 **
9749 ** Also throw an error if the EDITOR program returns a non-zero exit code.
9750 */
9751 #ifndef SQLITE_NOHAVE_SYSTEM
9752 static void editFunc(
9753   sqlite3_context *context,
9754   int argc,
9755   sqlite3_value **argv
9756 ){
9757   const char *zEditor;
9758   char *zTempFile = 0;
9759   sqlite3 *db;
9760   char *zCmd = 0;
9761   int bBin;
9762   int rc;
9763   int hasCRNL = 0;
9764   FILE *f = 0;
9765   sqlite3_int64 sz;
9766   sqlite3_int64 x;
9767   unsigned char *p = 0;
9768 
9769   if( argc==2 ){
9770     zEditor = (const char*)sqlite3_value_text(argv[1]);
9771   }else{
9772     zEditor = getenv("VISUAL");
9773   }
9774   if( zEditor==0 ){
9775     sqlite3_result_error(context, "no editor for edit()", -1);
9776     return;
9777   }
9778   if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
9779     sqlite3_result_error(context, "NULL input to edit()", -1);
9780     return;
9781   }
9782   db = sqlite3_context_db_handle(context);
9783   zTempFile = 0;
9784   sqlite3_file_control(db, 0, SQLITE_FCNTL_TEMPFILENAME, &zTempFile);
9785   if( zTempFile==0 ){
9786     sqlite3_uint64 r = 0;
9787     sqlite3_randomness(sizeof(r), &r);
9788     zTempFile = sqlite3_mprintf("temp%llx", r);
9789     if( zTempFile==0 ){
9790       sqlite3_result_error_nomem(context);
9791       return;
9792     }
9793   }
9794   bBin = sqlite3_value_type(argv[0])==SQLITE_BLOB;
9795   /* When writing the file to be edited, do \n to \r\n conversions on systems
9796   ** that want \r\n line endings */
9797   f = fopen(zTempFile, bBin ? "wb" : "w");
9798   if( f==0 ){
9799     sqlite3_result_error(context, "edit() cannot open temp file", -1);
9800     goto edit_func_end;
9801   }
9802   sz = sqlite3_value_bytes(argv[0]);
9803   if( bBin ){
9804     x = fwrite(sqlite3_value_blob(argv[0]), 1, (size_t)sz, f);
9805   }else{
9806     const char *z = (const char*)sqlite3_value_text(argv[0]);
9807     /* Remember whether or not the value originally contained \r\n */
9808     if( z && strstr(z,"\r\n")!=0 ) hasCRNL = 1;
9809     x = fwrite(sqlite3_value_text(argv[0]), 1, (size_t)sz, f);
9810   }
9811   fclose(f);
9812   f = 0;
9813   if( x!=sz ){
9814     sqlite3_result_error(context, "edit() could not write the whole file", -1);
9815     goto edit_func_end;
9816   }
9817   zCmd = sqlite3_mprintf("%s \"%s\"", zEditor, zTempFile);
9818   if( zCmd==0 ){
9819     sqlite3_result_error_nomem(context);
9820     goto edit_func_end;
9821   }
9822   rc = system(zCmd);
9823   sqlite3_free(zCmd);
9824   if( rc ){
9825     sqlite3_result_error(context, "EDITOR returned non-zero", -1);
9826     goto edit_func_end;
9827   }
9828   f = fopen(zTempFile, "rb");
9829   if( f==0 ){
9830     sqlite3_result_error(context,
9831       "edit() cannot reopen temp file after edit", -1);
9832     goto edit_func_end;
9833   }
9834   fseek(f, 0, SEEK_END);
9835   sz = ftell(f);
9836   rewind(f);
9837   p = sqlite3_malloc64( sz+1 );
9838   if( p==0 ){
9839     sqlite3_result_error_nomem(context);
9840     goto edit_func_end;
9841   }
9842   x = fread(p, 1, (size_t)sz, f);
9843   fclose(f);
9844   f = 0;
9845   if( x!=sz ){
9846     sqlite3_result_error(context, "could not read back the whole file", -1);
9847     goto edit_func_end;
9848   }
9849   if( bBin ){
9850     sqlite3_result_blob64(context, p, sz, sqlite3_free);
9851   }else{
9852     sqlite3_int64 i, j;
9853     if( hasCRNL ){
9854       /* If the original contains \r\n then do no conversions back to \n */
9855       j = sz;
9856     }else{
9857       /* If the file did not originally contain \r\n then convert any new
9858       ** \r\n back into \n */
9859       for(i=j=0; i<sz; i++){
9860         if( p[i]=='\r' && p[i+1]=='\n' ) i++;
9861         p[j++] = p[i];
9862       }
9863       sz = j;
9864       p[sz] = 0;
9865     }
9866     sqlite3_result_text64(context, (const char*)p, sz,
9867                           sqlite3_free, SQLITE_UTF8);
9868   }
9869   p = 0;
9870 
9871 edit_func_end:
9872   if( f ) fclose(f);
9873   unlink(zTempFile);
9874   sqlite3_free(zTempFile);
9875   sqlite3_free(p);
9876 }
9877 #endif /* SQLITE_NOHAVE_SYSTEM */
9878 
9879 /*
9880 ** Save or restore the current output mode
9881 */
9882 static void outputModePush(ShellState *p){
9883   p->modePrior = p->mode;
9884   memcpy(p->colSepPrior, p->colSeparator, sizeof(p->colSeparator));
9885   memcpy(p->rowSepPrior, p->rowSeparator, sizeof(p->rowSeparator));
9886 }
9887 static void outputModePop(ShellState *p){
9888   p->mode = p->modePrior;
9889   memcpy(p->colSeparator, p->colSepPrior, sizeof(p->colSeparator));
9890   memcpy(p->rowSeparator, p->rowSepPrior, sizeof(p->rowSeparator));
9891 }
9892 
9893 /*
9894 ** Output the given string as a hex-encoded blob (eg. X'1234' )
9895 */
9896 static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
9897   int i;
9898   char *zBlob = (char *)pBlob;
9899   raw_printf(out,"X'");
9900   for(i=0; i<nBlob; i++){ raw_printf(out,"%02x",zBlob[i]&0xff); }
9901   raw_printf(out,"'");
9902 }
9903 
9904 /*
9905 ** Find a string that is not found anywhere in z[].  Return a pointer
9906 ** to that string.
9907 **
9908 ** Try to use zA and zB first.  If both of those are already found in z[]
9909 ** then make up some string and store it in the buffer zBuf.
9910 */
9911 static const char *unused_string(
9912   const char *z,                    /* Result must not appear anywhere in z */
9913   const char *zA, const char *zB,   /* Try these first */
9914   char *zBuf                        /* Space to store a generated string */
9915 ){
9916   unsigned i = 0;
9917   if( strstr(z, zA)==0 ) return zA;
9918   if( strstr(z, zB)==0 ) return zB;
9919   do{
9920     sqlite3_snprintf(20,zBuf,"(%s%u)", zA, i++);
9921   }while( strstr(z,zBuf)!=0 );
9922   return zBuf;
9923 }
9924 
9925 /*
9926 ** Output the given string as a quoted string using SQL quoting conventions.
9927 **
9928 ** See also: output_quoted_escaped_string()
9929 */
9930 static void output_quoted_string(FILE *out, const char *z){
9931   int i;
9932   char c;
9933   setBinaryMode(out, 1);
9934   for(i=0; (c = z[i])!=0 && c!='\''; i++){}
9935   if( c==0 ){
9936     utf8_printf(out,"'%s'",z);
9937   }else{
9938     raw_printf(out, "'");
9939     while( *z ){
9940       for(i=0; (c = z[i])!=0 && c!='\''; i++){}
9941       if( c=='\'' ) i++;
9942       if( i ){
9943         utf8_printf(out, "%.*s", i, z);
9944         z += i;
9945       }
9946       if( c=='\'' ){
9947         raw_printf(out, "'");
9948         continue;
9949       }
9950       if( c==0 ){
9951         break;
9952       }
9953       z++;
9954     }
9955     raw_printf(out, "'");
9956   }
9957   setTextMode(out, 1);
9958 }
9959 
9960 /*
9961 ** Output the given string as a quoted string using SQL quoting conventions.
9962 ** Additionallly , escape the "\n" and "\r" characters so that they do not
9963 ** get corrupted by end-of-line translation facilities in some operating
9964 ** systems.
9965 **
9966 ** This is like output_quoted_string() but with the addition of the \r\n
9967 ** escape mechanism.
9968 */
9969 static void output_quoted_escaped_string(FILE *out, const char *z){
9970   int i;
9971   char c;
9972   setBinaryMode(out, 1);
9973   for(i=0; (c = z[i])!=0 && c!='\'' && c!='\n' && c!='\r'; i++){}
9974   if( c==0 ){
9975     utf8_printf(out,"'%s'",z);
9976   }else{
9977     const char *zNL = 0;
9978     const char *zCR = 0;
9979     int nNL = 0;
9980     int nCR = 0;
9981     char zBuf1[20], zBuf2[20];
9982     for(i=0; z[i]; i++){
9983       if( z[i]=='\n' ) nNL++;
9984       if( z[i]=='\r' ) nCR++;
9985     }
9986     if( nNL ){
9987       raw_printf(out, "replace(");
9988       zNL = unused_string(z, "\\n", "\\012", zBuf1);
9989     }
9990     if( nCR ){
9991       raw_printf(out, "replace(");
9992       zCR = unused_string(z, "\\r", "\\015", zBuf2);
9993     }
9994     raw_printf(out, "'");
9995     while( *z ){
9996       for(i=0; (c = z[i])!=0 && c!='\n' && c!='\r' && c!='\''; i++){}
9997       if( c=='\'' ) i++;
9998       if( i ){
9999         utf8_printf(out, "%.*s", i, z);
10000         z += i;
10001       }
10002       if( c=='\'' ){
10003         raw_printf(out, "'");
10004         continue;
10005       }
10006       if( c==0 ){
10007         break;
10008       }
10009       z++;
10010       if( c=='\n' ){
10011         raw_printf(out, "%s", zNL);
10012         continue;
10013       }
10014       raw_printf(out, "%s", zCR);
10015     }
10016     raw_printf(out, "'");
10017     if( nCR ){
10018       raw_printf(out, ",'%s',char(13))", zCR);
10019     }
10020     if( nNL ){
10021       raw_printf(out, ",'%s',char(10))", zNL);
10022     }
10023   }
10024   setTextMode(out, 1);
10025 }
10026 
10027 /*
10028 ** Output the given string as a quoted according to C or TCL quoting rules.
10029 */
10030 static void output_c_string(FILE *out, const char *z){
10031   unsigned int c;
10032   fputc('"', out);
10033   while( (c = *(z++))!=0 ){
10034     if( c=='\\' ){
10035       fputc(c, out);
10036       fputc(c, out);
10037     }else if( c=='"' ){
10038       fputc('\\', out);
10039       fputc('"', out);
10040     }else if( c=='\t' ){
10041       fputc('\\', out);
10042       fputc('t', out);
10043     }else if( c=='\n' ){
10044       fputc('\\', out);
10045       fputc('n', out);
10046     }else if( c=='\r' ){
10047       fputc('\\', out);
10048       fputc('r', out);
10049     }else if( !isprint(c&0xff) ){
10050       raw_printf(out, "\\%03o", c&0xff);
10051     }else{
10052       fputc(c, out);
10053     }
10054   }
10055   fputc('"', out);
10056 }
10057 
10058 /*
10059 ** Output the given string with characters that are special to
10060 ** HTML escaped.
10061 */
10062 static void output_html_string(FILE *out, const char *z){
10063   int i;
10064   if( z==0 ) z = "";
10065   while( *z ){
10066     for(i=0;   z[i]
10067             && z[i]!='<'
10068             && z[i]!='&'
10069             && z[i]!='>'
10070             && z[i]!='\"'
10071             && z[i]!='\'';
10072         i++){}
10073     if( i>0 ){
10074       utf8_printf(out,"%.*s",i,z);
10075     }
10076     if( z[i]=='<' ){
10077       raw_printf(out,"&lt;");
10078     }else if( z[i]=='&' ){
10079       raw_printf(out,"&amp;");
10080     }else if( z[i]=='>' ){
10081       raw_printf(out,"&gt;");
10082     }else if( z[i]=='\"' ){
10083       raw_printf(out,"&quot;");
10084     }else if( z[i]=='\'' ){
10085       raw_printf(out,"&#39;");
10086     }else{
10087       break;
10088     }
10089     z += i + 1;
10090   }
10091 }
10092 
10093 /*
10094 ** If a field contains any character identified by a 1 in the following
10095 ** array, then the string must be quoted for CSV.
10096 */
10097 static const char needCsvQuote[] = {
10098   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
10099   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
10100   1, 0, 1, 0, 0, 0, 0, 1,   0, 0, 0, 0, 0, 0, 0, 0,
10101   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
10102   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
10103   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
10104   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
10105   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 1,
10106   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
10107   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
10108   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
10109   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
10110   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
10111   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
10112   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
10113   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
10114 };
10115 
10116 /*
10117 ** Output a single term of CSV.  Actually, p->colSeparator is used for
10118 ** the separator, which may or may not be a comma.  p->nullValue is
10119 ** the null value.  Strings are quoted if necessary.  The separator
10120 ** is only issued if bSep is true.
10121 */
10122 static void output_csv(ShellState *p, const char *z, int bSep){
10123   FILE *out = p->out;
10124   if( z==0 ){
10125     utf8_printf(out,"%s",p->nullValue);
10126   }else{
10127     int i;
10128     int nSep = strlen30(p->colSeparator);
10129     for(i=0; z[i]; i++){
10130       if( needCsvQuote[((unsigned char*)z)[i]]
10131          || (z[i]==p->colSeparator[0] &&
10132              (nSep==1 || memcmp(z, p->colSeparator, nSep)==0)) ){
10133         i = 0;
10134         break;
10135       }
10136     }
10137     if( i==0 ){
10138       char *zQuoted = sqlite3_mprintf("\"%w\"", z);
10139       utf8_printf(out, "%s", zQuoted);
10140       sqlite3_free(zQuoted);
10141     }else{
10142       utf8_printf(out, "%s", z);
10143     }
10144   }
10145   if( bSep ){
10146     utf8_printf(p->out, "%s", p->colSeparator);
10147   }
10148 }
10149 
10150 /*
10151 ** This routine runs when the user presses Ctrl-C
10152 */
10153 static void interrupt_handler(int NotUsed){
10154   UNUSED_PARAMETER(NotUsed);
10155   seenInterrupt++;
10156   if( seenInterrupt>2 ) exit(1);
10157   if( globalDb ) sqlite3_interrupt(globalDb);
10158 }
10159 
10160 #if (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE)
10161 /*
10162 ** This routine runs for console events (e.g. Ctrl-C) on Win32
10163 */
10164 static BOOL WINAPI ConsoleCtrlHandler(
10165   DWORD dwCtrlType /* One of the CTRL_*_EVENT constants */
10166 ){
10167   if( dwCtrlType==CTRL_C_EVENT ){
10168     interrupt_handler(0);
10169     return TRUE;
10170   }
10171   return FALSE;
10172 }
10173 #endif
10174 
10175 #ifndef SQLITE_OMIT_AUTHORIZATION
10176 /*
10177 ** When the ".auth ON" is set, the following authorizer callback is
10178 ** invoked.  It always returns SQLITE_OK.
10179 */
10180 static int shellAuth(
10181   void *pClientData,
10182   int op,
10183   const char *zA1,
10184   const char *zA2,
10185   const char *zA3,
10186   const char *zA4
10187 ){
10188   ShellState *p = (ShellState*)pClientData;
10189   static const char *azAction[] = { 0,
10190      "CREATE_INDEX",         "CREATE_TABLE",         "CREATE_TEMP_INDEX",
10191      "CREATE_TEMP_TABLE",    "CREATE_TEMP_TRIGGER",  "CREATE_TEMP_VIEW",
10192      "CREATE_TRIGGER",       "CREATE_VIEW",          "DELETE",
10193      "DROP_INDEX",           "DROP_TABLE",           "DROP_TEMP_INDEX",
10194      "DROP_TEMP_TABLE",      "DROP_TEMP_TRIGGER",    "DROP_TEMP_VIEW",
10195      "DROP_TRIGGER",         "DROP_VIEW",            "INSERT",
10196      "PRAGMA",               "READ",                 "SELECT",
10197      "TRANSACTION",          "UPDATE",               "ATTACH",
10198      "DETACH",               "ALTER_TABLE",          "REINDEX",
10199      "ANALYZE",              "CREATE_VTABLE",        "DROP_VTABLE",
10200      "FUNCTION",             "SAVEPOINT",            "RECURSIVE"
10201   };
10202   int i;
10203   const char *az[4];
10204   az[0] = zA1;
10205   az[1] = zA2;
10206   az[2] = zA3;
10207   az[3] = zA4;
10208   utf8_printf(p->out, "authorizer: %s", azAction[op]);
10209   for(i=0; i<4; i++){
10210     raw_printf(p->out, " ");
10211     if( az[i] ){
10212       output_c_string(p->out, az[i]);
10213     }else{
10214       raw_printf(p->out, "NULL");
10215     }
10216   }
10217   raw_printf(p->out, "\n");
10218   return SQLITE_OK;
10219 }
10220 #endif
10221 
10222 /*
10223 ** Print a schema statement.  Part of MODE_Semi and MODE_Pretty output.
10224 **
10225 ** This routine converts some CREATE TABLE statements for shadow tables
10226 ** in FTS3/4/5 into CREATE TABLE IF NOT EXISTS statements.
10227 */
10228 static void printSchemaLine(FILE *out, const char *z, const char *zTail){
10229   if( z==0 ) return;
10230   if( zTail==0 ) return;
10231   if( sqlite3_strglob("CREATE TABLE ['\"]*", z)==0 ){
10232     utf8_printf(out, "CREATE TABLE IF NOT EXISTS %s%s", z+13, zTail);
10233   }else{
10234     utf8_printf(out, "%s%s", z, zTail);
10235   }
10236 }
10237 static void printSchemaLineN(FILE *out, char *z, int n, const char *zTail){
10238   char c = z[n];
10239   z[n] = 0;
10240   printSchemaLine(out, z, zTail);
10241   z[n] = c;
10242 }
10243 
10244 /*
10245 ** Return true if string z[] has nothing but whitespace and comments to the
10246 ** end of the first line.
10247 */
10248 static int wsToEol(const char *z){
10249   int i;
10250   for(i=0; z[i]; i++){
10251     if( z[i]=='\n' ) return 1;
10252     if( IsSpace(z[i]) ) continue;
10253     if( z[i]=='-' && z[i+1]=='-' ) return 1;
10254     return 0;
10255   }
10256   return 1;
10257 }
10258 
10259 /*
10260 ** Add a new entry to the EXPLAIN QUERY PLAN data
10261 */
10262 static void eqp_append(ShellState *p, int iEqpId, int p2, const char *zText){
10263   EQPGraphRow *pNew;
10264   int nText = strlen30(zText);
10265   if( p->autoEQPtest ){
10266     utf8_printf(p->out, "%d,%d,%s\n", iEqpId, p2, zText);
10267   }
10268   pNew = sqlite3_malloc64( sizeof(*pNew) + nText );
10269   if( pNew==0 ) shell_out_of_memory();
10270   pNew->iEqpId = iEqpId;
10271   pNew->iParentId = p2;
10272   memcpy(pNew->zText, zText, nText+1);
10273   pNew->pNext = 0;
10274   if( p->sGraph.pLast ){
10275     p->sGraph.pLast->pNext = pNew;
10276   }else{
10277     p->sGraph.pRow = pNew;
10278   }
10279   p->sGraph.pLast = pNew;
10280 }
10281 
10282 /*
10283 ** Free and reset the EXPLAIN QUERY PLAN data that has been collected
10284 ** in p->sGraph.
10285 */
10286 static void eqp_reset(ShellState *p){
10287   EQPGraphRow *pRow, *pNext;
10288   for(pRow = p->sGraph.pRow; pRow; pRow = pNext){
10289     pNext = pRow->pNext;
10290     sqlite3_free(pRow);
10291   }
10292   memset(&p->sGraph, 0, sizeof(p->sGraph));
10293 }
10294 
10295 /* Return the next EXPLAIN QUERY PLAN line with iEqpId that occurs after
10296 ** pOld, or return the first such line if pOld is NULL
10297 */
10298 static EQPGraphRow *eqp_next_row(ShellState *p, int iEqpId, EQPGraphRow *pOld){
10299   EQPGraphRow *pRow = pOld ? pOld->pNext : p->sGraph.pRow;
10300   while( pRow && pRow->iParentId!=iEqpId ) pRow = pRow->pNext;
10301   return pRow;
10302 }
10303 
10304 /* Render a single level of the graph that has iEqpId as its parent.  Called
10305 ** recursively to render sublevels.
10306 */
10307 static void eqp_render_level(ShellState *p, int iEqpId){
10308   EQPGraphRow *pRow, *pNext;
10309   int n = strlen30(p->sGraph.zPrefix);
10310   char *z;
10311   for(pRow = eqp_next_row(p, iEqpId, 0); pRow; pRow = pNext){
10312     pNext = eqp_next_row(p, iEqpId, pRow);
10313     z = pRow->zText;
10314     utf8_printf(p->out, "%s%s%s\n", p->sGraph.zPrefix,
10315                 pNext ? "|--" : "`--", z);
10316     if( n<(int)sizeof(p->sGraph.zPrefix)-7 ){
10317       memcpy(&p->sGraph.zPrefix[n], pNext ? "|  " : "   ", 4);
10318       eqp_render_level(p, pRow->iEqpId);
10319       p->sGraph.zPrefix[n] = 0;
10320     }
10321   }
10322 }
10323 
10324 /*
10325 ** Display and reset the EXPLAIN QUERY PLAN data
10326 */
10327 static void eqp_render(ShellState *p){
10328   EQPGraphRow *pRow = p->sGraph.pRow;
10329   if( pRow ){
10330     if( pRow->zText[0]=='-' ){
10331       if( pRow->pNext==0 ){
10332         eqp_reset(p);
10333         return;
10334       }
10335       utf8_printf(p->out, "%s\n", pRow->zText+3);
10336       p->sGraph.pRow = pRow->pNext;
10337       sqlite3_free(pRow);
10338     }else{
10339       utf8_printf(p->out, "QUERY PLAN\n");
10340     }
10341     p->sGraph.zPrefix[0] = 0;
10342     eqp_render_level(p, 0);
10343     eqp_reset(p);
10344   }
10345 }
10346 
10347 #ifndef SQLITE_OMIT_PROGRESS_CALLBACK
10348 /*
10349 ** Progress handler callback.
10350 */
10351 static int progress_handler(void *pClientData) {
10352   ShellState *p = (ShellState*)pClientData;
10353   p->nProgress++;
10354   if( p->nProgress>=p->mxProgress && p->mxProgress>0 ){
10355     raw_printf(p->out, "Progress limit reached (%u)\n", p->nProgress);
10356     if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0;
10357     if( p->flgProgress & SHELL_PROGRESS_ONCE ) p->mxProgress = 0;
10358     return 1;
10359   }
10360   if( (p->flgProgress & SHELL_PROGRESS_QUIET)==0 ){
10361     raw_printf(p->out, "Progress %u\n", p->nProgress);
10362   }
10363   return 0;
10364 }
10365 #endif /* SQLITE_OMIT_PROGRESS_CALLBACK */
10366 
10367 /*
10368 ** This is the callback routine that the shell
10369 ** invokes for each row of a query result.
10370 */
10371 static int shell_callback(
10372   void *pArg,
10373   int nArg,        /* Number of result columns */
10374   char **azArg,    /* Text of each result column */
10375   char **azCol,    /* Column names */
10376   int *aiType      /* Column types */
10377 ){
10378   int i;
10379   ShellState *p = (ShellState*)pArg;
10380 
10381   if( azArg==0 ) return 0;
10382   switch( p->cMode ){
10383     case MODE_Line: {
10384       int w = 5;
10385       if( azArg==0 ) break;
10386       for(i=0; i<nArg; i++){
10387         int len = strlen30(azCol[i] ? azCol[i] : "");
10388         if( len>w ) w = len;
10389       }
10390       if( p->cnt++>0 ) utf8_printf(p->out, "%s", p->rowSeparator);
10391       for(i=0; i<nArg; i++){
10392         utf8_printf(p->out,"%*s = %s%s", w, azCol[i],
10393                 azArg[i] ? azArg[i] : p->nullValue, p->rowSeparator);
10394       }
10395       break;
10396     }
10397     case MODE_Explain:
10398     case MODE_Column: {
10399       static const int aExplainWidths[] = {4, 13, 4, 4, 4, 13, 2, 13};
10400       const int *colWidth;
10401       int showHdr;
10402       char *rowSep;
10403       if( p->cMode==MODE_Column ){
10404         colWidth = p->colWidth;
10405         showHdr = p->showHeader;
10406         rowSep = p->rowSeparator;
10407       }else{
10408         colWidth = aExplainWidths;
10409         showHdr = 1;
10410         rowSep = SEP_Row;
10411       }
10412       if( p->cnt++==0 ){
10413         for(i=0; i<nArg; i++){
10414           int w, n;
10415           if( i<ArraySize(p->colWidth) ){
10416             w = colWidth[i];
10417           }else{
10418             w = 0;
10419           }
10420           if( w==0 ){
10421             w = strlenChar(azCol[i] ? azCol[i] : "");
10422             if( w<10 ) w = 10;
10423             n = strlenChar(azArg && azArg[i] ? azArg[i] : p->nullValue);
10424             if( w<n ) w = n;
10425           }
10426           if( i<ArraySize(p->actualWidth) ){
10427             p->actualWidth[i] = w;
10428           }
10429           if( showHdr ){
10430             utf8_width_print(p->out, w, azCol[i]);
10431             utf8_printf(p->out, "%s", i==nArg-1 ? rowSep : "  ");
10432           }
10433         }
10434         if( showHdr ){
10435           for(i=0; i<nArg; i++){
10436             int w;
10437             if( i<ArraySize(p->actualWidth) ){
10438                w = p->actualWidth[i];
10439                if( w<0 ) w = -w;
10440             }else{
10441                w = 10;
10442             }
10443             utf8_printf(p->out,"%-*.*s%s",w,w,
10444                    "----------------------------------------------------------"
10445                    "----------------------------------------------------------",
10446                     i==nArg-1 ? rowSep : "  ");
10447           }
10448         }
10449       }
10450       if( azArg==0 ) break;
10451       for(i=0; i<nArg; i++){
10452         int w;
10453         if( i<ArraySize(p->actualWidth) ){
10454            w = p->actualWidth[i];
10455         }else{
10456            w = 10;
10457         }
10458         if( p->cMode==MODE_Explain && azArg[i] && strlenChar(azArg[i])>w ){
10459           w = strlenChar(azArg[i]);
10460         }
10461         if( i==1 && p->aiIndent && p->pStmt ){
10462           if( p->iIndent<p->nIndent ){
10463             utf8_printf(p->out, "%*.s", p->aiIndent[p->iIndent], "");
10464           }
10465           p->iIndent++;
10466         }
10467         utf8_width_print(p->out, w, azArg[i] ? azArg[i] : p->nullValue);
10468         utf8_printf(p->out, "%s", i==nArg-1 ? rowSep : "  ");
10469       }
10470       break;
10471     }
10472     case MODE_Semi: {   /* .schema and .fullschema output */
10473       printSchemaLine(p->out, azArg[0], ";\n");
10474       break;
10475     }
10476     case MODE_Pretty: {  /* .schema and .fullschema with --indent */
10477       char *z;
10478       int j;
10479       int nParen = 0;
10480       char cEnd = 0;
10481       char c;
10482       int nLine = 0;
10483       assert( nArg==1 );
10484       if( azArg[0]==0 ) break;
10485       if( sqlite3_strlike("CREATE VIEW%", azArg[0], 0)==0
10486        || sqlite3_strlike("CREATE TRIG%", azArg[0], 0)==0
10487       ){
10488         utf8_printf(p->out, "%s;\n", azArg[0]);
10489         break;
10490       }
10491       z = sqlite3_mprintf("%s", azArg[0]);
10492       j = 0;
10493       for(i=0; IsSpace(z[i]); i++){}
10494       for(; (c = z[i])!=0; i++){
10495         if( IsSpace(c) ){
10496           if( z[j-1]=='\r' ) z[j-1] = '\n';
10497           if( IsSpace(z[j-1]) || z[j-1]=='(' ) continue;
10498         }else if( (c=='(' || c==')') && j>0 && IsSpace(z[j-1]) ){
10499           j--;
10500         }
10501         z[j++] = c;
10502       }
10503       while( j>0 && IsSpace(z[j-1]) ){ j--; }
10504       z[j] = 0;
10505       if( strlen30(z)>=79 ){
10506         for(i=j=0; (c = z[i])!=0; i++){ /* Copy from z[i] back to z[j] */
10507           if( c==cEnd ){
10508             cEnd = 0;
10509           }else if( c=='"' || c=='\'' || c=='`' ){
10510             cEnd = c;
10511           }else if( c=='[' ){
10512             cEnd = ']';
10513           }else if( c=='-' && z[i+1]=='-' ){
10514             cEnd = '\n';
10515           }else if( c=='(' ){
10516             nParen++;
10517           }else if( c==')' ){
10518             nParen--;
10519             if( nLine>0 && nParen==0 && j>0 ){
10520               printSchemaLineN(p->out, z, j, "\n");
10521               j = 0;
10522             }
10523           }
10524           z[j++] = c;
10525           if( nParen==1 && cEnd==0
10526            && (c=='(' || c=='\n' || (c==',' && !wsToEol(z+i+1)))
10527           ){
10528             if( c=='\n' ) j--;
10529             printSchemaLineN(p->out, z, j, "\n  ");
10530             j = 0;
10531             nLine++;
10532             while( IsSpace(z[i+1]) ){ i++; }
10533           }
10534         }
10535         z[j] = 0;
10536       }
10537       printSchemaLine(p->out, z, ";\n");
10538       sqlite3_free(z);
10539       break;
10540     }
10541     case MODE_List: {
10542       if( p->cnt++==0 && p->showHeader ){
10543         for(i=0; i<nArg; i++){
10544           utf8_printf(p->out,"%s%s",azCol[i],
10545                   i==nArg-1 ? p->rowSeparator : p->colSeparator);
10546         }
10547       }
10548       if( azArg==0 ) break;
10549       for(i=0; i<nArg; i++){
10550         char *z = azArg[i];
10551         if( z==0 ) z = p->nullValue;
10552         utf8_printf(p->out, "%s", z);
10553         if( i<nArg-1 ){
10554           utf8_printf(p->out, "%s", p->colSeparator);
10555         }else{
10556           utf8_printf(p->out, "%s", p->rowSeparator);
10557         }
10558       }
10559       break;
10560     }
10561     case MODE_Html: {
10562       if( p->cnt++==0 && p->showHeader ){
10563         raw_printf(p->out,"<TR>");
10564         for(i=0; i<nArg; i++){
10565           raw_printf(p->out,"<TH>");
10566           output_html_string(p->out, azCol[i]);
10567           raw_printf(p->out,"</TH>\n");
10568         }
10569         raw_printf(p->out,"</TR>\n");
10570       }
10571       if( azArg==0 ) break;
10572       raw_printf(p->out,"<TR>");
10573       for(i=0; i<nArg; i++){
10574         raw_printf(p->out,"<TD>");
10575         output_html_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
10576         raw_printf(p->out,"</TD>\n");
10577       }
10578       raw_printf(p->out,"</TR>\n");
10579       break;
10580     }
10581     case MODE_Tcl: {
10582       if( p->cnt++==0 && p->showHeader ){
10583         for(i=0; i<nArg; i++){
10584           output_c_string(p->out,azCol[i] ? azCol[i] : "");
10585           if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
10586         }
10587         utf8_printf(p->out, "%s", p->rowSeparator);
10588       }
10589       if( azArg==0 ) break;
10590       for(i=0; i<nArg; i++){
10591         output_c_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
10592         if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
10593       }
10594       utf8_printf(p->out, "%s", p->rowSeparator);
10595       break;
10596     }
10597     case MODE_Csv: {
10598       setBinaryMode(p->out, 1);
10599       if( p->cnt++==0 && p->showHeader ){
10600         for(i=0; i<nArg; i++){
10601           output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
10602         }
10603         utf8_printf(p->out, "%s", p->rowSeparator);
10604       }
10605       if( nArg>0 ){
10606         for(i=0; i<nArg; i++){
10607           output_csv(p, azArg[i], i<nArg-1);
10608         }
10609         utf8_printf(p->out, "%s", p->rowSeparator);
10610       }
10611       setTextMode(p->out, 1);
10612       break;
10613     }
10614     case MODE_Insert: {
10615       if( azArg==0 ) break;
10616       utf8_printf(p->out,"INSERT INTO %s",p->zDestTable);
10617       if( p->showHeader ){
10618         raw_printf(p->out,"(");
10619         for(i=0; i<nArg; i++){
10620           if( i>0 ) raw_printf(p->out, ",");
10621           if( quoteChar(azCol[i]) ){
10622             char *z = sqlite3_mprintf("\"%w\"", azCol[i]);
10623             utf8_printf(p->out, "%s", z);
10624             sqlite3_free(z);
10625           }else{
10626             raw_printf(p->out, "%s", azCol[i]);
10627           }
10628         }
10629         raw_printf(p->out,")");
10630       }
10631       p->cnt++;
10632       for(i=0; i<nArg; i++){
10633         raw_printf(p->out, i>0 ? "," : " VALUES(");
10634         if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
10635           utf8_printf(p->out,"NULL");
10636         }else if( aiType && aiType[i]==SQLITE_TEXT ){
10637           if( ShellHasFlag(p, SHFLG_Newlines) ){
10638             output_quoted_string(p->out, azArg[i]);
10639           }else{
10640             output_quoted_escaped_string(p->out, azArg[i]);
10641           }
10642         }else if( aiType && aiType[i]==SQLITE_INTEGER ){
10643           utf8_printf(p->out,"%s", azArg[i]);
10644         }else if( aiType && aiType[i]==SQLITE_FLOAT ){
10645           char z[50];
10646           double r = sqlite3_column_double(p->pStmt, i);
10647           sqlite3_uint64 ur;
10648           memcpy(&ur,&r,sizeof(r));
10649           if( ur==0x7ff0000000000000LL ){
10650             raw_printf(p->out, "1e999");
10651           }else if( ur==0xfff0000000000000LL ){
10652             raw_printf(p->out, "-1e999");
10653           }else{
10654             sqlite3_snprintf(50,z,"%!.20g", r);
10655             raw_printf(p->out, "%s", z);
10656           }
10657         }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
10658           const void *pBlob = sqlite3_column_blob(p->pStmt, i);
10659           int nBlob = sqlite3_column_bytes(p->pStmt, i);
10660           output_hex_blob(p->out, pBlob, nBlob);
10661         }else if( isNumber(azArg[i], 0) ){
10662           utf8_printf(p->out,"%s", azArg[i]);
10663         }else if( ShellHasFlag(p, SHFLG_Newlines) ){
10664           output_quoted_string(p->out, azArg[i]);
10665         }else{
10666           output_quoted_escaped_string(p->out, azArg[i]);
10667         }
10668       }
10669       raw_printf(p->out,");\n");
10670       break;
10671     }
10672     case MODE_Quote: {
10673       if( azArg==0 ) break;
10674       if( p->cnt==0 && p->showHeader ){
10675         for(i=0; i<nArg; i++){
10676           if( i>0 ) raw_printf(p->out, ",");
10677           output_quoted_string(p->out, azCol[i]);
10678         }
10679         raw_printf(p->out,"\n");
10680       }
10681       p->cnt++;
10682       for(i=0; i<nArg; i++){
10683         if( i>0 ) raw_printf(p->out, ",");
10684         if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
10685           utf8_printf(p->out,"NULL");
10686         }else if( aiType && aiType[i]==SQLITE_TEXT ){
10687           output_quoted_string(p->out, azArg[i]);
10688         }else if( aiType && aiType[i]==SQLITE_INTEGER ){
10689           utf8_printf(p->out,"%s", azArg[i]);
10690         }else if( aiType && aiType[i]==SQLITE_FLOAT ){
10691           char z[50];
10692           double r = sqlite3_column_double(p->pStmt, i);
10693           sqlite3_snprintf(50,z,"%!.20g", r);
10694           raw_printf(p->out, "%s", z);
10695         }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
10696           const void *pBlob = sqlite3_column_blob(p->pStmt, i);
10697           int nBlob = sqlite3_column_bytes(p->pStmt, i);
10698           output_hex_blob(p->out, pBlob, nBlob);
10699         }else if( isNumber(azArg[i], 0) ){
10700           utf8_printf(p->out,"%s", azArg[i]);
10701         }else{
10702           output_quoted_string(p->out, azArg[i]);
10703         }
10704       }
10705       raw_printf(p->out,"\n");
10706       break;
10707     }
10708     case MODE_Ascii: {
10709       if( p->cnt++==0 && p->showHeader ){
10710         for(i=0; i<nArg; i++){
10711           if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
10712           utf8_printf(p->out,"%s",azCol[i] ? azCol[i] : "");
10713         }
10714         utf8_printf(p->out, "%s", p->rowSeparator);
10715       }
10716       if( azArg==0 ) break;
10717       for(i=0; i<nArg; i++){
10718         if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
10719         utf8_printf(p->out,"%s",azArg[i] ? azArg[i] : p->nullValue);
10720       }
10721       utf8_printf(p->out, "%s", p->rowSeparator);
10722       break;
10723     }
10724     case MODE_EQP: {
10725       eqp_append(p, atoi(azArg[0]), atoi(azArg[1]), azArg[3]);
10726       break;
10727     }
10728   }
10729   return 0;
10730 }
10731 
10732 /*
10733 ** This is the callback routine that the SQLite library
10734 ** invokes for each row of a query result.
10735 */
10736 static int callback(void *pArg, int nArg, char **azArg, char **azCol){
10737   /* since we don't have type info, call the shell_callback with a NULL value */
10738   return shell_callback(pArg, nArg, azArg, azCol, NULL);
10739 }
10740 
10741 /*
10742 ** This is the callback routine from sqlite3_exec() that appends all
10743 ** output onto the end of a ShellText object.
10744 */
10745 static int captureOutputCallback(void *pArg, int nArg, char **azArg, char **az){
10746   ShellText *p = (ShellText*)pArg;
10747   int i;
10748   UNUSED_PARAMETER(az);
10749   if( azArg==0 ) return 0;
10750   if( p->n ) appendText(p, "|", 0);
10751   for(i=0; i<nArg; i++){
10752     if( i ) appendText(p, ",", 0);
10753     if( azArg[i] ) appendText(p, azArg[i], 0);
10754   }
10755   return 0;
10756 }
10757 
10758 /*
10759 ** Generate an appropriate SELFTEST table in the main database.
10760 */
10761 static void createSelftestTable(ShellState *p){
10762   char *zErrMsg = 0;
10763   sqlite3_exec(p->db,
10764     "SAVEPOINT selftest_init;\n"
10765     "CREATE TABLE IF NOT EXISTS selftest(\n"
10766     "  tno INTEGER PRIMARY KEY,\n"   /* Test number */
10767     "  op TEXT,\n"                   /* Operator:  memo run */
10768     "  cmd TEXT,\n"                  /* Command text */
10769     "  ans TEXT\n"                   /* Desired answer */
10770     ");"
10771     "CREATE TEMP TABLE [_shell$self](op,cmd,ans);\n"
10772     "INSERT INTO [_shell$self](rowid,op,cmd)\n"
10773     "  VALUES(coalesce((SELECT (max(tno)+100)/10 FROM selftest),10),\n"
10774     "         'memo','Tests generated by --init');\n"
10775     "INSERT INTO [_shell$self]\n"
10776     "  SELECT 'run',\n"
10777     "    'SELECT hex(sha3_query(''SELECT type,name,tbl_name,sql "
10778                                  "FROM sqlite_master ORDER BY 2'',224))',\n"
10779     "    hex(sha3_query('SELECT type,name,tbl_name,sql "
10780                           "FROM sqlite_master ORDER BY 2',224));\n"
10781     "INSERT INTO [_shell$self]\n"
10782     "  SELECT 'run',"
10783     "    'SELECT hex(sha3_query(''SELECT * FROM \"' ||"
10784     "        printf('%w',name) || '\" NOT INDEXED'',224))',\n"
10785     "    hex(sha3_query(printf('SELECT * FROM \"%w\" NOT INDEXED',name),224))\n"
10786     "  FROM (\n"
10787     "    SELECT name FROM sqlite_master\n"
10788     "     WHERE type='table'\n"
10789     "       AND name<>'selftest'\n"
10790     "       AND coalesce(rootpage,0)>0\n"
10791     "  )\n"
10792     " ORDER BY name;\n"
10793     "INSERT INTO [_shell$self]\n"
10794     "  VALUES('run','PRAGMA integrity_check','ok');\n"
10795     "INSERT INTO selftest(tno,op,cmd,ans)"
10796     "  SELECT rowid*10,op,cmd,ans FROM [_shell$self];\n"
10797     "DROP TABLE [_shell$self];"
10798     ,0,0,&zErrMsg);
10799   if( zErrMsg ){
10800     utf8_printf(stderr, "SELFTEST initialization failure: %s\n", zErrMsg);
10801     sqlite3_free(zErrMsg);
10802   }
10803   sqlite3_exec(p->db, "RELEASE selftest_init",0,0,0);
10804 }
10805 
10806 
10807 /*
10808 ** Set the destination table field of the ShellState structure to
10809 ** the name of the table given.  Escape any quote characters in the
10810 ** table name.
10811 */
10812 static void set_table_name(ShellState *p, const char *zName){
10813   int i, n;
10814   char cQuote;
10815   char *z;
10816 
10817   if( p->zDestTable ){
10818     free(p->zDestTable);
10819     p->zDestTable = 0;
10820   }
10821   if( zName==0 ) return;
10822   cQuote = quoteChar(zName);
10823   n = strlen30(zName);
10824   if( cQuote ) n += n+2;
10825   z = p->zDestTable = malloc( n+1 );
10826   if( z==0 ) shell_out_of_memory();
10827   n = 0;
10828   if( cQuote ) z[n++] = cQuote;
10829   for(i=0; zName[i]; i++){
10830     z[n++] = zName[i];
10831     if( zName[i]==cQuote ) z[n++] = cQuote;
10832   }
10833   if( cQuote ) z[n++] = cQuote;
10834   z[n] = 0;
10835 }
10836 
10837 
10838 /*
10839 ** Execute a query statement that will generate SQL output.  Print
10840 ** the result columns, comma-separated, on a line and then add a
10841 ** semicolon terminator to the end of that line.
10842 **
10843 ** If the number of columns is 1 and that column contains text "--"
10844 ** then write the semicolon on a separate line.  That way, if a
10845 ** "--" comment occurs at the end of the statement, the comment
10846 ** won't consume the semicolon terminator.
10847 */
10848 static int run_table_dump_query(
10849   ShellState *p,           /* Query context */
10850   const char *zSelect,     /* SELECT statement to extract content */
10851   const char *zFirstRow    /* Print before first row, if not NULL */
10852 ){
10853   sqlite3_stmt *pSelect;
10854   int rc;
10855   int nResult;
10856   int i;
10857   const char *z;
10858   rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0);
10859   if( rc!=SQLITE_OK || !pSelect ){
10860     utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc,
10861                 sqlite3_errmsg(p->db));
10862     if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
10863     return rc;
10864   }
10865   rc = sqlite3_step(pSelect);
10866   nResult = sqlite3_column_count(pSelect);
10867   while( rc==SQLITE_ROW ){
10868     if( zFirstRow ){
10869       utf8_printf(p->out, "%s", zFirstRow);
10870       zFirstRow = 0;
10871     }
10872     z = (const char*)sqlite3_column_text(pSelect, 0);
10873     utf8_printf(p->out, "%s", z);
10874     for(i=1; i<nResult; i++){
10875       utf8_printf(p->out, ",%s", sqlite3_column_text(pSelect, i));
10876     }
10877     if( z==0 ) z = "";
10878     while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
10879     if( z[0] ){
10880       raw_printf(p->out, "\n;\n");
10881     }else{
10882       raw_printf(p->out, ";\n");
10883     }
10884     rc = sqlite3_step(pSelect);
10885   }
10886   rc = sqlite3_finalize(pSelect);
10887   if( rc!=SQLITE_OK ){
10888     utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc,
10889                 sqlite3_errmsg(p->db));
10890     if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
10891   }
10892   return rc;
10893 }
10894 
10895 /*
10896 ** Allocate space and save off current error string.
10897 */
10898 static char *save_err_msg(
10899   sqlite3 *db            /* Database to query */
10900 ){
10901   int nErrMsg = 1+strlen30(sqlite3_errmsg(db));
10902   char *zErrMsg = sqlite3_malloc64(nErrMsg);
10903   if( zErrMsg ){
10904     memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg);
10905   }
10906   return zErrMsg;
10907 }
10908 
10909 #ifdef __linux__
10910 /*
10911 ** Attempt to display I/O stats on Linux using /proc/PID/io
10912 */
10913 static void displayLinuxIoStats(FILE *out){
10914   FILE *in;
10915   char z[200];
10916   sqlite3_snprintf(sizeof(z), z, "/proc/%d/io", getpid());
10917   in = fopen(z, "rb");
10918   if( in==0 ) return;
10919   while( fgets(z, sizeof(z), in)!=0 ){
10920     static const struct {
10921       const char *zPattern;
10922       const char *zDesc;
10923     } aTrans[] = {
10924       { "rchar: ",                  "Bytes received by read():" },
10925       { "wchar: ",                  "Bytes sent to write():"    },
10926       { "syscr: ",                  "Read() system calls:"      },
10927       { "syscw: ",                  "Write() system calls:"     },
10928       { "read_bytes: ",             "Bytes read from storage:"  },
10929       { "write_bytes: ",            "Bytes written to storage:" },
10930       { "cancelled_write_bytes: ",  "Cancelled write bytes:"    },
10931     };
10932     int i;
10933     for(i=0; i<ArraySize(aTrans); i++){
10934       int n = strlen30(aTrans[i].zPattern);
10935       if( strncmp(aTrans[i].zPattern, z, n)==0 ){
10936         utf8_printf(out, "%-36s %s", aTrans[i].zDesc, &z[n]);
10937         break;
10938       }
10939     }
10940   }
10941   fclose(in);
10942 }
10943 #endif
10944 
10945 /*
10946 ** Display a single line of status using 64-bit values.
10947 */
10948 static void displayStatLine(
10949   ShellState *p,            /* The shell context */
10950   char *zLabel,             /* Label for this one line */
10951   char *zFormat,            /* Format for the result */
10952   int iStatusCtrl,          /* Which status to display */
10953   int bReset                /* True to reset the stats */
10954 ){
10955   sqlite3_int64 iCur = -1;
10956   sqlite3_int64 iHiwtr = -1;
10957   int i, nPercent;
10958   char zLine[200];
10959   sqlite3_status64(iStatusCtrl, &iCur, &iHiwtr, bReset);
10960   for(i=0, nPercent=0; zFormat[i]; i++){
10961     if( zFormat[i]=='%' ) nPercent++;
10962   }
10963   if( nPercent>1 ){
10964     sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iCur, iHiwtr);
10965   }else{
10966     sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iHiwtr);
10967   }
10968   raw_printf(p->out, "%-36s %s\n", zLabel, zLine);
10969 }
10970 
10971 /*
10972 ** Display memory stats.
10973 */
10974 static int display_stats(
10975   sqlite3 *db,                /* Database to query */
10976   ShellState *pArg,           /* Pointer to ShellState */
10977   int bReset                  /* True to reset the stats */
10978 ){
10979   int iCur;
10980   int iHiwtr;
10981   FILE *out;
10982   if( pArg==0 || pArg->out==0 ) return 0;
10983   out = pArg->out;
10984 
10985   if( pArg->pStmt && (pArg->statsOn & 2) ){
10986     int nCol, i, x;
10987     sqlite3_stmt *pStmt = pArg->pStmt;
10988     char z[100];
10989     nCol = sqlite3_column_count(pStmt);
10990     raw_printf(out, "%-36s %d\n", "Number of output columns:", nCol);
10991     for(i=0; i<nCol; i++){
10992       sqlite3_snprintf(sizeof(z),z,"Column %d %nname:", i, &x);
10993       utf8_printf(out, "%-36s %s\n", z, sqlite3_column_name(pStmt,i));
10994 #ifndef SQLITE_OMIT_DECLTYPE
10995       sqlite3_snprintf(30, z+x, "declared type:");
10996       utf8_printf(out, "%-36s %s\n", z, sqlite3_column_decltype(pStmt, i));
10997 #endif
10998 #ifdef SQLITE_ENABLE_COLUMN_METADATA
10999       sqlite3_snprintf(30, z+x, "database name:");
11000       utf8_printf(out, "%-36s %s\n", z, sqlite3_column_database_name(pStmt,i));
11001       sqlite3_snprintf(30, z+x, "table name:");
11002       utf8_printf(out, "%-36s %s\n", z, sqlite3_column_table_name(pStmt,i));
11003       sqlite3_snprintf(30, z+x, "origin name:");
11004       utf8_printf(out, "%-36s %s\n", z, sqlite3_column_origin_name(pStmt,i));
11005 #endif
11006     }
11007   }
11008 
11009   displayStatLine(pArg, "Memory Used:",
11010      "%lld (max %lld) bytes", SQLITE_STATUS_MEMORY_USED, bReset);
11011   displayStatLine(pArg, "Number of Outstanding Allocations:",
11012      "%lld (max %lld)", SQLITE_STATUS_MALLOC_COUNT, bReset);
11013   if( pArg->shellFlgs & SHFLG_Pagecache ){
11014     displayStatLine(pArg, "Number of Pcache Pages Used:",
11015        "%lld (max %lld) pages", SQLITE_STATUS_PAGECACHE_USED, bReset);
11016   }
11017   displayStatLine(pArg, "Number of Pcache Overflow Bytes:",
11018      "%lld (max %lld) bytes", SQLITE_STATUS_PAGECACHE_OVERFLOW, bReset);
11019   displayStatLine(pArg, "Largest Allocation:",
11020      "%lld bytes", SQLITE_STATUS_MALLOC_SIZE, bReset);
11021   displayStatLine(pArg, "Largest Pcache Allocation:",
11022      "%lld bytes", SQLITE_STATUS_PAGECACHE_SIZE, bReset);
11023 #ifdef YYTRACKMAXSTACKDEPTH
11024   displayStatLine(pArg, "Deepest Parser Stack:",
11025      "%lld (max %lld)", SQLITE_STATUS_PARSER_STACK, bReset);
11026 #endif
11027 
11028   if( db ){
11029     if( pArg->shellFlgs & SHFLG_Lookaside ){
11030       iHiwtr = iCur = -1;
11031       sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED,
11032                         &iCur, &iHiwtr, bReset);
11033       raw_printf(pArg->out,
11034               "Lookaside Slots Used:                %d (max %d)\n",
11035               iCur, iHiwtr);
11036       sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT,
11037                         &iCur, &iHiwtr, bReset);
11038       raw_printf(pArg->out, "Successful lookaside attempts:       %d\n",
11039               iHiwtr);
11040       sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE,
11041                         &iCur, &iHiwtr, bReset);
11042       raw_printf(pArg->out, "Lookaside failures due to size:      %d\n",
11043               iHiwtr);
11044       sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL,
11045                         &iCur, &iHiwtr, bReset);
11046       raw_printf(pArg->out, "Lookaside failures due to OOM:       %d\n",
11047               iHiwtr);
11048     }
11049     iHiwtr = iCur = -1;
11050     sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
11051     raw_printf(pArg->out, "Pager Heap Usage:                    %d bytes\n",
11052             iCur);
11053     iHiwtr = iCur = -1;
11054     sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
11055     raw_printf(pArg->out, "Page cache hits:                     %d\n", iCur);
11056     iHiwtr = iCur = -1;
11057     sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
11058     raw_printf(pArg->out, "Page cache misses:                   %d\n", iCur);
11059     iHiwtr = iCur = -1;
11060     sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
11061     raw_printf(pArg->out, "Page cache writes:                   %d\n", iCur);
11062     iHiwtr = iCur = -1;
11063     sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_SPILL, &iCur, &iHiwtr, 1);
11064     raw_printf(pArg->out, "Page cache spills:                   %d\n", iCur);
11065     iHiwtr = iCur = -1;
11066     sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
11067     raw_printf(pArg->out, "Schema Heap Usage:                   %d bytes\n",
11068             iCur);
11069     iHiwtr = iCur = -1;
11070     sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
11071     raw_printf(pArg->out, "Statement Heap/Lookaside Usage:      %d bytes\n",
11072             iCur);
11073   }
11074 
11075   if( pArg->pStmt ){
11076     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP,
11077                                bReset);
11078     raw_printf(pArg->out, "Fullscan Steps:                      %d\n", iCur);
11079     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
11080     raw_printf(pArg->out, "Sort Operations:                     %d\n", iCur);
11081     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX,bReset);
11082     raw_printf(pArg->out, "Autoindex Inserts:                   %d\n", iCur);
11083     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
11084     raw_printf(pArg->out, "Virtual Machine Steps:               %d\n", iCur);
11085     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_REPREPARE,bReset);
11086     raw_printf(pArg->out, "Reprepare operations:                %d\n", iCur);
11087     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_RUN, bReset);
11088     raw_printf(pArg->out, "Number of times run:                 %d\n", iCur);
11089     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_MEMUSED, bReset);
11090     raw_printf(pArg->out, "Memory used by prepared stmt:        %d\n", iCur);
11091   }
11092 
11093 #ifdef __linux__
11094   displayLinuxIoStats(pArg->out);
11095 #endif
11096 
11097   /* Do not remove this machine readable comment: extra-stats-output-here */
11098 
11099   return 0;
11100 }
11101 
11102 /*
11103 ** Display scan stats.
11104 */
11105 static void display_scanstats(
11106   sqlite3 *db,                    /* Database to query */
11107   ShellState *pArg                /* Pointer to ShellState */
11108 ){
11109 #ifndef SQLITE_ENABLE_STMT_SCANSTATUS
11110   UNUSED_PARAMETER(db);
11111   UNUSED_PARAMETER(pArg);
11112 #else
11113   int i, k, n, mx;
11114   raw_printf(pArg->out, "-------- scanstats --------\n");
11115   mx = 0;
11116   for(k=0; k<=mx; k++){
11117     double rEstLoop = 1.0;
11118     for(i=n=0; 1; i++){
11119       sqlite3_stmt *p = pArg->pStmt;
11120       sqlite3_int64 nLoop, nVisit;
11121       double rEst;
11122       int iSid;
11123       const char *zExplain;
11124       if( sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NLOOP, (void*)&nLoop) ){
11125         break;
11126       }
11127       sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_SELECTID, (void*)&iSid);
11128       if( iSid>mx ) mx = iSid;
11129       if( iSid!=k ) continue;
11130       if( n==0 ){
11131         rEstLoop = (double)nLoop;
11132         if( k>0 ) raw_printf(pArg->out, "-------- subquery %d -------\n", k);
11133       }
11134       n++;
11135       sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NVISIT, (void*)&nVisit);
11136       sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EST, (void*)&rEst);
11137       sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EXPLAIN, (void*)&zExplain);
11138       utf8_printf(pArg->out, "Loop %2d: %s\n", n, zExplain);
11139       rEstLoop *= rEst;
11140       raw_printf(pArg->out,
11141           "         nLoop=%-8lld nRow=%-8lld estRow=%-8lld estRow/Loop=%-8g\n",
11142           nLoop, nVisit, (sqlite3_int64)(rEstLoop+0.5), rEst
11143       );
11144     }
11145   }
11146   raw_printf(pArg->out, "---------------------------\n");
11147 #endif
11148 }
11149 
11150 /*
11151 ** Parameter azArray points to a zero-terminated array of strings. zStr
11152 ** points to a single nul-terminated string. Return non-zero if zStr
11153 ** is equal, according to strcmp(), to any of the strings in the array.
11154 ** Otherwise, return zero.
11155 */
11156 static int str_in_array(const char *zStr, const char **azArray){
11157   int i;
11158   for(i=0; azArray[i]; i++){
11159     if( 0==strcmp(zStr, azArray[i]) ) return 1;
11160   }
11161   return 0;
11162 }
11163 
11164 /*
11165 ** If compiled statement pSql appears to be an EXPLAIN statement, allocate
11166 ** and populate the ShellState.aiIndent[] array with the number of
11167 ** spaces each opcode should be indented before it is output.
11168 **
11169 ** The indenting rules are:
11170 **
11171 **     * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
11172 **       all opcodes that occur between the p2 jump destination and the opcode
11173 **       itself by 2 spaces.
11174 **
11175 **     * For each "Goto", if the jump destination is earlier in the program
11176 **       and ends on one of:
11177 **          Yield  SeekGt  SeekLt  RowSetRead  Rewind
11178 **       or if the P1 parameter is one instead of zero,
11179 **       then indent all opcodes between the earlier instruction
11180 **       and "Goto" by 2 spaces.
11181 */
11182 static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){
11183   const char *zSql;               /* The text of the SQL statement */
11184   const char *z;                  /* Used to check if this is an EXPLAIN */
11185   int *abYield = 0;               /* True if op is an OP_Yield */
11186   int nAlloc = 0;                 /* Allocated size of p->aiIndent[], abYield */
11187   int iOp;                        /* Index of operation in p->aiIndent[] */
11188 
11189   const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext", 0 };
11190   const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead",
11191                             "Rewind", 0 };
11192   const char *azGoto[] = { "Goto", 0 };
11193 
11194   /* Try to figure out if this is really an EXPLAIN statement. If this
11195   ** cannot be verified, return early.  */
11196   if( sqlite3_column_count(pSql)!=8 ){
11197     p->cMode = p->mode;
11198     return;
11199   }
11200   zSql = sqlite3_sql(pSql);
11201   if( zSql==0 ) return;
11202   for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++);
11203   if( sqlite3_strnicmp(z, "explain", 7) ){
11204     p->cMode = p->mode;
11205     return;
11206   }
11207 
11208   for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
11209     int i;
11210     int iAddr = sqlite3_column_int(pSql, 0);
11211     const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
11212 
11213     /* Set p2 to the P2 field of the current opcode. Then, assuming that
11214     ** p2 is an instruction address, set variable p2op to the index of that
11215     ** instruction in the aiIndent[] array. p2 and p2op may be different if
11216     ** the current instruction is part of a sub-program generated by an
11217     ** SQL trigger or foreign key.  */
11218     int p2 = sqlite3_column_int(pSql, 3);
11219     int p2op = (p2 + (iOp-iAddr));
11220 
11221     /* Grow the p->aiIndent array as required */
11222     if( iOp>=nAlloc ){
11223       if( iOp==0 ){
11224         /* Do further verfication that this is explain output.  Abort if
11225         ** it is not */
11226         static const char *explainCols[] = {
11227            "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment" };
11228         int jj;
11229         for(jj=0; jj<ArraySize(explainCols); jj++){
11230           if( strcmp(sqlite3_column_name(pSql,jj),explainCols[jj])!=0 ){
11231             p->cMode = p->mode;
11232             sqlite3_reset(pSql);
11233             return;
11234           }
11235         }
11236       }
11237       nAlloc += 100;
11238       p->aiIndent = (int*)sqlite3_realloc64(p->aiIndent, nAlloc*sizeof(int));
11239       if( p->aiIndent==0 ) shell_out_of_memory();
11240       abYield = (int*)sqlite3_realloc64(abYield, nAlloc*sizeof(int));
11241       if( abYield==0 ) shell_out_of_memory();
11242     }
11243     abYield[iOp] = str_in_array(zOp, azYield);
11244     p->aiIndent[iOp] = 0;
11245     p->nIndent = iOp+1;
11246 
11247     if( str_in_array(zOp, azNext) ){
11248       for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
11249     }
11250     if( str_in_array(zOp, azGoto) && p2op<p->nIndent
11251      && (abYield[p2op] || sqlite3_column_int(pSql, 2))
11252     ){
11253       for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
11254     }
11255   }
11256 
11257   p->iIndent = 0;
11258   sqlite3_free(abYield);
11259   sqlite3_reset(pSql);
11260 }
11261 
11262 /*
11263 ** Free the array allocated by explain_data_prepare().
11264 */
11265 static void explain_data_delete(ShellState *p){
11266   sqlite3_free(p->aiIndent);
11267   p->aiIndent = 0;
11268   p->nIndent = 0;
11269   p->iIndent = 0;
11270 }
11271 
11272 /*
11273 ** Disable and restore .wheretrace and .selecttrace settings.
11274 */
11275 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
11276 extern int sqlite3SelectTrace;
11277 static int savedSelectTrace;
11278 #endif
11279 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
11280 extern int sqlite3WhereTrace;
11281 static int savedWhereTrace;
11282 #endif
11283 static void disable_debug_trace_modes(void){
11284 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
11285   savedSelectTrace = sqlite3SelectTrace;
11286   sqlite3SelectTrace = 0;
11287 #endif
11288 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
11289   savedWhereTrace = sqlite3WhereTrace;
11290   sqlite3WhereTrace = 0;
11291 #endif
11292 }
11293 static void restore_debug_trace_modes(void){
11294 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
11295   sqlite3SelectTrace = savedSelectTrace;
11296 #endif
11297 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
11298   sqlite3WhereTrace = savedWhereTrace;
11299 #endif
11300 }
11301 
11302 /* Create the TEMP table used to store parameter bindings */
11303 static void bind_table_init(ShellState *p){
11304   int wrSchema = 0;
11305   sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, -1, &wrSchema);
11306   sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, 1, 0);
11307   sqlite3_exec(p->db,
11308     "CREATE TABLE IF NOT EXISTS temp.sqlite_parameters(\n"
11309     "  key TEXT PRIMARY KEY,\n"
11310     "  value ANY\n"
11311     ") WITHOUT ROWID;",
11312     0, 0, 0);
11313   sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, wrSchema, 0);
11314 }
11315 
11316 /*
11317 ** Bind parameters on a prepared statement.
11318 **
11319 ** Parameter bindings are taken from a TEMP table of the form:
11320 **
11321 **    CREATE TEMP TABLE sqlite_parameters(key TEXT PRIMARY KEY, value)
11322 **    WITHOUT ROWID;
11323 **
11324 ** No bindings occur if this table does not exist.  The special character '$'
11325 ** is included in the table name to help prevent collisions with actual tables.
11326 ** The table must be in the TEMP schema.
11327 */
11328 static void bind_prepared_stmt(ShellState *pArg, sqlite3_stmt *pStmt){
11329   int nVar;
11330   int i;
11331   int rc;
11332   sqlite3_stmt *pQ = 0;
11333 
11334   nVar = sqlite3_bind_parameter_count(pStmt);
11335   if( nVar==0 ) return;  /* Nothing to do */
11336   if( sqlite3_table_column_metadata(pArg->db, "TEMP", "sqlite_parameters",
11337                                     "key", 0, 0, 0, 0, 0)!=SQLITE_OK ){
11338     return; /* Parameter table does not exist */
11339   }
11340   rc = sqlite3_prepare_v2(pArg->db,
11341           "SELECT value FROM temp.sqlite_parameters"
11342           " WHERE key=?1", -1, &pQ, 0);
11343   if( rc || pQ==0 ) return;
11344   for(i=1; i<=nVar; i++){
11345     char zNum[30];
11346     const char *zVar = sqlite3_bind_parameter_name(pStmt, i);
11347     if( zVar==0 ){
11348       sqlite3_snprintf(sizeof(zNum),zNum,"?%d",i);
11349       zVar = zNum;
11350     }
11351     sqlite3_bind_text(pQ, 1, zVar, -1, SQLITE_STATIC);
11352     if( sqlite3_step(pQ)==SQLITE_ROW ){
11353       sqlite3_bind_value(pStmt, i, sqlite3_column_value(pQ, 0));
11354     }else{
11355       sqlite3_bind_null(pStmt, i);
11356     }
11357     sqlite3_reset(pQ);
11358   }
11359   sqlite3_finalize(pQ);
11360 }
11361 
11362 /*
11363 ** Run a prepared statement
11364 */
11365 static void exec_prepared_stmt(
11366   ShellState *pArg,                                /* Pointer to ShellState */
11367   sqlite3_stmt *pStmt                              /* Statment to run */
11368 ){
11369   int rc;
11370 
11371   /* perform the first step.  this will tell us if we
11372   ** have a result set or not and how wide it is.
11373   */
11374   rc = sqlite3_step(pStmt);
11375   /* if we have a result set... */
11376   if( SQLITE_ROW == rc ){
11377     /* allocate space for col name ptr, value ptr, and type */
11378     int nCol = sqlite3_column_count(pStmt);
11379     void *pData = sqlite3_malloc64(3*nCol*sizeof(const char*) + 1);
11380     if( !pData ){
11381       rc = SQLITE_NOMEM;
11382     }else{
11383       char **azCols = (char **)pData;      /* Names of result columns */
11384       char **azVals = &azCols[nCol];       /* Results */
11385       int *aiTypes = (int *)&azVals[nCol]; /* Result types */
11386       int i, x;
11387       assert(sizeof(int) <= sizeof(char *));
11388       /* save off ptrs to column names */
11389       for(i=0; i<nCol; i++){
11390         azCols[i] = (char *)sqlite3_column_name(pStmt, i);
11391       }
11392       do{
11393         /* extract the data and data types */
11394         for(i=0; i<nCol; i++){
11395           aiTypes[i] = x = sqlite3_column_type(pStmt, i);
11396           if( x==SQLITE_BLOB && pArg && pArg->cMode==MODE_Insert ){
11397             azVals[i] = "";
11398           }else{
11399             azVals[i] = (char*)sqlite3_column_text(pStmt, i);
11400           }
11401           if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
11402             rc = SQLITE_NOMEM;
11403             break; /* from for */
11404           }
11405         } /* end for */
11406 
11407         /* if data and types extracted successfully... */
11408         if( SQLITE_ROW == rc ){
11409           /* call the supplied callback with the result row data */
11410           if( shell_callback(pArg, nCol, azVals, azCols, aiTypes) ){
11411             rc = SQLITE_ABORT;
11412           }else{
11413             rc = sqlite3_step(pStmt);
11414           }
11415         }
11416       } while( SQLITE_ROW == rc );
11417       sqlite3_free(pData);
11418     }
11419   }
11420 }
11421 
11422 #ifndef SQLITE_OMIT_VIRTUALTABLE
11423 /*
11424 ** This function is called to process SQL if the previous shell command
11425 ** was ".expert". It passes the SQL in the second argument directly to
11426 ** the sqlite3expert object.
11427 **
11428 ** If successful, SQLITE_OK is returned. Otherwise, an SQLite error
11429 ** code. In this case, (*pzErr) may be set to point to a buffer containing
11430 ** an English language error message. It is the responsibility of the
11431 ** caller to eventually free this buffer using sqlite3_free().
11432 */
11433 static int expertHandleSQL(
11434   ShellState *pState,
11435   const char *zSql,
11436   char **pzErr
11437 ){
11438   assert( pState->expert.pExpert );
11439   assert( pzErr==0 || *pzErr==0 );
11440   return sqlite3_expert_sql(pState->expert.pExpert, zSql, pzErr);
11441 }
11442 
11443 /*
11444 ** This function is called either to silently clean up the object
11445 ** created by the ".expert" command (if bCancel==1), or to generate a
11446 ** report from it and then clean it up (if bCancel==0).
11447 **
11448 ** If successful, SQLITE_OK is returned. Otherwise, an SQLite error
11449 ** code. In this case, (*pzErr) may be set to point to a buffer containing
11450 ** an English language error message. It is the responsibility of the
11451 ** caller to eventually free this buffer using sqlite3_free().
11452 */
11453 static int expertFinish(
11454   ShellState *pState,
11455   int bCancel,
11456   char **pzErr
11457 ){
11458   int rc = SQLITE_OK;
11459   sqlite3expert *p = pState->expert.pExpert;
11460   assert( p );
11461   assert( bCancel || pzErr==0 || *pzErr==0 );
11462   if( bCancel==0 ){
11463     FILE *out = pState->out;
11464     int bVerbose = pState->expert.bVerbose;
11465 
11466     rc = sqlite3_expert_analyze(p, pzErr);
11467     if( rc==SQLITE_OK ){
11468       int nQuery = sqlite3_expert_count(p);
11469       int i;
11470 
11471       if( bVerbose ){
11472         const char *zCand = sqlite3_expert_report(p,0,EXPERT_REPORT_CANDIDATES);
11473         raw_printf(out, "-- Candidates -----------------------------\n");
11474         raw_printf(out, "%s\n", zCand);
11475       }
11476       for(i=0; i<nQuery; i++){
11477         const char *zSql = sqlite3_expert_report(p, i, EXPERT_REPORT_SQL);
11478         const char *zIdx = sqlite3_expert_report(p, i, EXPERT_REPORT_INDEXES);
11479         const char *zEQP = sqlite3_expert_report(p, i, EXPERT_REPORT_PLAN);
11480         if( zIdx==0 ) zIdx = "(no new indexes)\n";
11481         if( bVerbose ){
11482           raw_printf(out, "-- Query %d --------------------------------\n",i+1);
11483           raw_printf(out, "%s\n\n", zSql);
11484         }
11485         raw_printf(out, "%s\n", zIdx);
11486         raw_printf(out, "%s\n", zEQP);
11487       }
11488     }
11489   }
11490   sqlite3_expert_destroy(p);
11491   pState->expert.pExpert = 0;
11492   return rc;
11493 }
11494 
11495 /*
11496 ** Implementation of ".expert" dot command.
11497 */
11498 static int expertDotCommand(
11499   ShellState *pState,             /* Current shell tool state */
11500   char **azArg,                   /* Array of arguments passed to dot command */
11501   int nArg                        /* Number of entries in azArg[] */
11502 ){
11503   int rc = SQLITE_OK;
11504   char *zErr = 0;
11505   int i;
11506   int iSample = 0;
11507 
11508   assert( pState->expert.pExpert==0 );
11509   memset(&pState->expert, 0, sizeof(ExpertInfo));
11510 
11511   for(i=1; rc==SQLITE_OK && i<nArg; i++){
11512     char *z = azArg[i];
11513     int n;
11514     if( z[0]=='-' && z[1]=='-' ) z++;
11515     n = strlen30(z);
11516     if( n>=2 && 0==strncmp(z, "-verbose", n) ){
11517       pState->expert.bVerbose = 1;
11518     }
11519     else if( n>=2 && 0==strncmp(z, "-sample", n) ){
11520       if( i==(nArg-1) ){
11521         raw_printf(stderr, "option requires an argument: %s\n", z);
11522         rc = SQLITE_ERROR;
11523       }else{
11524         iSample = (int)integerValue(azArg[++i]);
11525         if( iSample<0 || iSample>100 ){
11526           raw_printf(stderr, "value out of range: %s\n", azArg[i]);
11527           rc = SQLITE_ERROR;
11528         }
11529       }
11530     }
11531     else{
11532       raw_printf(stderr, "unknown option: %s\n", z);
11533       rc = SQLITE_ERROR;
11534     }
11535   }
11536 
11537   if( rc==SQLITE_OK ){
11538     pState->expert.pExpert = sqlite3_expert_new(pState->db, &zErr);
11539     if( pState->expert.pExpert==0 ){
11540       raw_printf(stderr, "sqlite3_expert_new: %s\n", zErr);
11541       rc = SQLITE_ERROR;
11542     }else{
11543       sqlite3_expert_config(
11544           pState->expert.pExpert, EXPERT_CONFIG_SAMPLE, iSample
11545       );
11546     }
11547   }
11548 
11549   return rc;
11550 }
11551 #endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
11552 
11553 /*
11554 ** Execute a statement or set of statements.  Print
11555 ** any result rows/columns depending on the current mode
11556 ** set via the supplied callback.
11557 **
11558 ** This is very similar to SQLite's built-in sqlite3_exec()
11559 ** function except it takes a slightly different callback
11560 ** and callback data argument.
11561 */
11562 static int shell_exec(
11563   ShellState *pArg,                         /* Pointer to ShellState */
11564   const char *zSql,                         /* SQL to be evaluated */
11565   char **pzErrMsg                           /* Error msg written here */
11566 ){
11567   sqlite3_stmt *pStmt = NULL;     /* Statement to execute. */
11568   int rc = SQLITE_OK;             /* Return Code */
11569   int rc2;
11570   const char *zLeftover;          /* Tail of unprocessed SQL */
11571   sqlite3 *db = pArg->db;
11572 
11573   if( pzErrMsg ){
11574     *pzErrMsg = NULL;
11575   }
11576 
11577 #ifndef SQLITE_OMIT_VIRTUALTABLE
11578   if( pArg->expert.pExpert ){
11579     rc = expertHandleSQL(pArg, zSql, pzErrMsg);
11580     return expertFinish(pArg, (rc!=SQLITE_OK), pzErrMsg);
11581   }
11582 #endif
11583 
11584   while( zSql[0] && (SQLITE_OK == rc) ){
11585     static const char *zStmtSql;
11586     rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
11587     if( SQLITE_OK != rc ){
11588       if( pzErrMsg ){
11589         *pzErrMsg = save_err_msg(db);
11590       }
11591     }else{
11592       if( !pStmt ){
11593         /* this happens for a comment or white-space */
11594         zSql = zLeftover;
11595         while( IsSpace(zSql[0]) ) zSql++;
11596         continue;
11597       }
11598       zStmtSql = sqlite3_sql(pStmt);
11599       if( zStmtSql==0 ) zStmtSql = "";
11600       while( IsSpace(zStmtSql[0]) ) zStmtSql++;
11601 
11602       /* save off the prepared statment handle and reset row count */
11603       if( pArg ){
11604         pArg->pStmt = pStmt;
11605         pArg->cnt = 0;
11606       }
11607 
11608       /* echo the sql statement if echo on */
11609       if( pArg && ShellHasFlag(pArg, SHFLG_Echo) ){
11610         utf8_printf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
11611       }
11612 
11613       /* Show the EXPLAIN QUERY PLAN if .eqp is on */
11614       if( pArg && pArg->autoEQP && sqlite3_stmt_isexplain(pStmt)==0 ){
11615         sqlite3_stmt *pExplain;
11616         char *zEQP;
11617         int triggerEQP = 0;
11618         disable_debug_trace_modes();
11619         sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, -1, &triggerEQP);
11620         if( pArg->autoEQP>=AUTOEQP_trigger ){
11621           sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 1, 0);
11622         }
11623         zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s", zStmtSql);
11624         rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
11625         if( rc==SQLITE_OK ){
11626           while( sqlite3_step(pExplain)==SQLITE_ROW ){
11627             const char *zEQPLine = (const char*)sqlite3_column_text(pExplain,3);
11628             int iEqpId = sqlite3_column_int(pExplain, 0);
11629             int iParentId = sqlite3_column_int(pExplain, 1);
11630             if( zEQPLine[0]=='-' ) eqp_render(pArg);
11631             eqp_append(pArg, iEqpId, iParentId, zEQPLine);
11632           }
11633           eqp_render(pArg);
11634         }
11635         sqlite3_finalize(pExplain);
11636         sqlite3_free(zEQP);
11637         if( pArg->autoEQP>=AUTOEQP_full ){
11638           /* Also do an EXPLAIN for ".eqp full" mode */
11639           zEQP = sqlite3_mprintf("EXPLAIN %s", zStmtSql);
11640           rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
11641           if( rc==SQLITE_OK ){
11642             pArg->cMode = MODE_Explain;
11643             explain_data_prepare(pArg, pExplain);
11644             exec_prepared_stmt(pArg, pExplain);
11645             explain_data_delete(pArg);
11646           }
11647           sqlite3_finalize(pExplain);
11648           sqlite3_free(zEQP);
11649         }
11650         if( pArg->autoEQP>=AUTOEQP_trigger && triggerEQP==0 ){
11651           sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 0, 0);
11652           /* Reprepare pStmt before reactiving trace modes */
11653           sqlite3_finalize(pStmt);
11654           sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
11655           if( pArg ) pArg->pStmt = pStmt;
11656         }
11657         restore_debug_trace_modes();
11658       }
11659 
11660       if( pArg ){
11661         pArg->cMode = pArg->mode;
11662         if( pArg->autoExplain ){
11663           if( sqlite3_stmt_isexplain(pStmt)==1 ){
11664             pArg->cMode = MODE_Explain;
11665           }
11666           if( sqlite3_stmt_isexplain(pStmt)==2 ){
11667             pArg->cMode = MODE_EQP;
11668           }
11669         }
11670 
11671         /* If the shell is currently in ".explain" mode, gather the extra
11672         ** data required to add indents to the output.*/
11673         if( pArg->cMode==MODE_Explain ){
11674           explain_data_prepare(pArg, pStmt);
11675         }
11676       }
11677 
11678       bind_prepared_stmt(pArg, pStmt);
11679       exec_prepared_stmt(pArg, pStmt);
11680       explain_data_delete(pArg);
11681       eqp_render(pArg);
11682 
11683       /* print usage stats if stats on */
11684       if( pArg && pArg->statsOn ){
11685         display_stats(db, pArg, 0);
11686       }
11687 
11688       /* print loop-counters if required */
11689       if( pArg && pArg->scanstatsOn ){
11690         display_scanstats(db, pArg);
11691       }
11692 
11693       /* Finalize the statement just executed. If this fails, save a
11694       ** copy of the error message. Otherwise, set zSql to point to the
11695       ** next statement to execute. */
11696       rc2 = sqlite3_finalize(pStmt);
11697       if( rc!=SQLITE_NOMEM ) rc = rc2;
11698       if( rc==SQLITE_OK ){
11699         zSql = zLeftover;
11700         while( IsSpace(zSql[0]) ) zSql++;
11701       }else if( pzErrMsg ){
11702         *pzErrMsg = save_err_msg(db);
11703       }
11704 
11705       /* clear saved stmt handle */
11706       if( pArg ){
11707         pArg->pStmt = NULL;
11708       }
11709     }
11710   } /* end while */
11711 
11712   return rc;
11713 }
11714 
11715 /*
11716 ** Release memory previously allocated by tableColumnList().
11717 */
11718 static void freeColumnList(char **azCol){
11719   int i;
11720   for(i=1; azCol[i]; i++){
11721     sqlite3_free(azCol[i]);
11722   }
11723   /* azCol[0] is a static string */
11724   sqlite3_free(azCol);
11725 }
11726 
11727 /*
11728 ** Return a list of pointers to strings which are the names of all
11729 ** columns in table zTab.   The memory to hold the names is dynamically
11730 ** allocated and must be released by the caller using a subsequent call
11731 ** to freeColumnList().
11732 **
11733 ** The azCol[0] entry is usually NULL.  However, if zTab contains a rowid
11734 ** value that needs to be preserved, then azCol[0] is filled in with the
11735 ** name of the rowid column.
11736 **
11737 ** The first regular column in the table is azCol[1].  The list is terminated
11738 ** by an entry with azCol[i]==0.
11739 */
11740 static char **tableColumnList(ShellState *p, const char *zTab){
11741   char **azCol = 0;
11742   sqlite3_stmt *pStmt;
11743   char *zSql;
11744   int nCol = 0;
11745   int nAlloc = 0;
11746   int nPK = 0;       /* Number of PRIMARY KEY columns seen */
11747   int isIPK = 0;     /* True if one PRIMARY KEY column of type INTEGER */
11748   int preserveRowid = ShellHasFlag(p, SHFLG_PreserveRowid);
11749   int rc;
11750 
11751   zSql = sqlite3_mprintf("PRAGMA table_info=%Q", zTab);
11752   rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
11753   sqlite3_free(zSql);
11754   if( rc ) return 0;
11755   while( sqlite3_step(pStmt)==SQLITE_ROW ){
11756     if( nCol>=nAlloc-2 ){
11757       nAlloc = nAlloc*2 + nCol + 10;
11758       azCol = sqlite3_realloc(azCol, nAlloc*sizeof(azCol[0]));
11759       if( azCol==0 ) shell_out_of_memory();
11760     }
11761     azCol[++nCol] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 1));
11762     if( sqlite3_column_int(pStmt, 5) ){
11763       nPK++;
11764       if( nPK==1
11765        && sqlite3_stricmp((const char*)sqlite3_column_text(pStmt,2),
11766                           "INTEGER")==0
11767       ){
11768         isIPK = 1;
11769       }else{
11770         isIPK = 0;
11771       }
11772     }
11773   }
11774   sqlite3_finalize(pStmt);
11775   if( azCol==0 ) return 0;
11776   azCol[0] = 0;
11777   azCol[nCol+1] = 0;
11778 
11779   /* The decision of whether or not a rowid really needs to be preserved
11780   ** is tricky.  We never need to preserve a rowid for a WITHOUT ROWID table
11781   ** or a table with an INTEGER PRIMARY KEY.  We are unable to preserve
11782   ** rowids on tables where the rowid is inaccessible because there are other
11783   ** columns in the table named "rowid", "_rowid_", and "oid".
11784   */
11785   if( preserveRowid && isIPK ){
11786     /* If a single PRIMARY KEY column with type INTEGER was seen, then it
11787     ** might be an alise for the ROWID.  But it might also be a WITHOUT ROWID
11788     ** table or a INTEGER PRIMARY KEY DESC column, neither of which are
11789     ** ROWID aliases.  To distinguish these cases, check to see if
11790     ** there is a "pk" entry in "PRAGMA index_list".  There will be
11791     ** no "pk" index if the PRIMARY KEY really is an alias for the ROWID.
11792     */
11793     zSql = sqlite3_mprintf("SELECT 1 FROM pragma_index_list(%Q)"
11794                            " WHERE origin='pk'", zTab);
11795     rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
11796     sqlite3_free(zSql);
11797     if( rc ){
11798       freeColumnList(azCol);
11799       return 0;
11800     }
11801     rc = sqlite3_step(pStmt);
11802     sqlite3_finalize(pStmt);
11803     preserveRowid = rc==SQLITE_ROW;
11804   }
11805   if( preserveRowid ){
11806     /* Only preserve the rowid if we can find a name to use for the
11807     ** rowid */
11808     static char *azRowid[] = { "rowid", "_rowid_", "oid" };
11809     int i, j;
11810     for(j=0; j<3; j++){
11811       for(i=1; i<=nCol; i++){
11812         if( sqlite3_stricmp(azRowid[j],azCol[i])==0 ) break;
11813       }
11814       if( i>nCol ){
11815         /* At this point, we know that azRowid[j] is not the name of any
11816         ** ordinary column in the table.  Verify that azRowid[j] is a valid
11817         ** name for the rowid before adding it to azCol[0].  WITHOUT ROWID
11818         ** tables will fail this last check */
11819         rc = sqlite3_table_column_metadata(p->db,0,zTab,azRowid[j],0,0,0,0,0);
11820         if( rc==SQLITE_OK ) azCol[0] = azRowid[j];
11821         break;
11822       }
11823     }
11824   }
11825   return azCol;
11826 }
11827 
11828 /*
11829 ** Toggle the reverse_unordered_selects setting.
11830 */
11831 static void toggleSelectOrder(sqlite3 *db){
11832   sqlite3_stmt *pStmt = 0;
11833   int iSetting = 0;
11834   char zStmt[100];
11835   sqlite3_prepare_v2(db, "PRAGMA reverse_unordered_selects", -1, &pStmt, 0);
11836   if( sqlite3_step(pStmt)==SQLITE_ROW ){
11837     iSetting = sqlite3_column_int(pStmt, 0);
11838   }
11839   sqlite3_finalize(pStmt);
11840   sqlite3_snprintf(sizeof(zStmt), zStmt,
11841        "PRAGMA reverse_unordered_selects(%d)", !iSetting);
11842   sqlite3_exec(db, zStmt, 0, 0, 0);
11843 }
11844 
11845 /*
11846 ** This is a different callback routine used for dumping the database.
11847 ** Each row received by this callback consists of a table name,
11848 ** the table type ("index" or "table") and SQL to create the table.
11849 ** This routine should print text sufficient to recreate the table.
11850 */
11851 static int dump_callback(void *pArg, int nArg, char **azArg, char **azNotUsed){
11852   int rc;
11853   const char *zTable;
11854   const char *zType;
11855   const char *zSql;
11856   ShellState *p = (ShellState *)pArg;
11857 
11858   UNUSED_PARAMETER(azNotUsed);
11859   if( nArg!=3 || azArg==0 ) return 0;
11860   zTable = azArg[0];
11861   zType = azArg[1];
11862   zSql = azArg[2];
11863 
11864   if( strcmp(zTable, "sqlite_sequence")==0 ){
11865     raw_printf(p->out, "DELETE FROM sqlite_sequence;\n");
11866   }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 ){
11867     raw_printf(p->out, "ANALYZE sqlite_master;\n");
11868   }else if( strncmp(zTable, "sqlite_", 7)==0 ){
11869     return 0;
11870   }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
11871     char *zIns;
11872     if( !p->writableSchema ){
11873       raw_printf(p->out, "PRAGMA writable_schema=ON;\n");
11874       p->writableSchema = 1;
11875     }
11876     zIns = sqlite3_mprintf(
11877        "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"
11878        "VALUES('table','%q','%q',0,'%q');",
11879        zTable, zTable, zSql);
11880     utf8_printf(p->out, "%s\n", zIns);
11881     sqlite3_free(zIns);
11882     return 0;
11883   }else{
11884     printSchemaLine(p->out, zSql, ";\n");
11885   }
11886 
11887   if( strcmp(zType, "table")==0 ){
11888     ShellText sSelect;
11889     ShellText sTable;
11890     char **azCol;
11891     int i;
11892     char *savedDestTable;
11893     int savedMode;
11894 
11895     azCol = tableColumnList(p, zTable);
11896     if( azCol==0 ){
11897       p->nErr++;
11898       return 0;
11899     }
11900 
11901     /* Always quote the table name, even if it appears to be pure ascii,
11902     ** in case it is a keyword. Ex:  INSERT INTO "table" ... */
11903     initText(&sTable);
11904     appendText(&sTable, zTable, quoteChar(zTable));
11905     /* If preserving the rowid, add a column list after the table name.
11906     ** In other words:  "INSERT INTO tab(rowid,a,b,c,...) VALUES(...)"
11907     ** instead of the usual "INSERT INTO tab VALUES(...)".
11908     */
11909     if( azCol[0] ){
11910       appendText(&sTable, "(", 0);
11911       appendText(&sTable, azCol[0], 0);
11912       for(i=1; azCol[i]; i++){
11913         appendText(&sTable, ",", 0);
11914         appendText(&sTable, azCol[i], quoteChar(azCol[i]));
11915       }
11916       appendText(&sTable, ")", 0);
11917     }
11918 
11919     /* Build an appropriate SELECT statement */
11920     initText(&sSelect);
11921     appendText(&sSelect, "SELECT ", 0);
11922     if( azCol[0] ){
11923       appendText(&sSelect, azCol[0], 0);
11924       appendText(&sSelect, ",", 0);
11925     }
11926     for(i=1; azCol[i]; i++){
11927       appendText(&sSelect, azCol[i], quoteChar(azCol[i]));
11928       if( azCol[i+1] ){
11929         appendText(&sSelect, ",", 0);
11930       }
11931     }
11932     freeColumnList(azCol);
11933     appendText(&sSelect, " FROM ", 0);
11934     appendText(&sSelect, zTable, quoteChar(zTable));
11935 
11936     savedDestTable = p->zDestTable;
11937     savedMode = p->mode;
11938     p->zDestTable = sTable.z;
11939     p->mode = p->cMode = MODE_Insert;
11940     rc = shell_exec(p, sSelect.z, 0);
11941     if( (rc&0xff)==SQLITE_CORRUPT ){
11942       raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n");
11943       toggleSelectOrder(p->db);
11944       shell_exec(p, sSelect.z, 0);
11945       toggleSelectOrder(p->db);
11946     }
11947     p->zDestTable = savedDestTable;
11948     p->mode = savedMode;
11949     freeText(&sTable);
11950     freeText(&sSelect);
11951     if( rc ) p->nErr++;
11952   }
11953   return 0;
11954 }
11955 
11956 /*
11957 ** Run zQuery.  Use dump_callback() as the callback routine so that
11958 ** the contents of the query are output as SQL statements.
11959 **
11960 ** If we get a SQLITE_CORRUPT error, rerun the query after appending
11961 ** "ORDER BY rowid DESC" to the end.
11962 */
11963 static int run_schema_dump_query(
11964   ShellState *p,
11965   const char *zQuery
11966 ){
11967   int rc;
11968   char *zErr = 0;
11969   rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
11970   if( rc==SQLITE_CORRUPT ){
11971     char *zQ2;
11972     int len = strlen30(zQuery);
11973     raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n");
11974     if( zErr ){
11975       utf8_printf(p->out, "/****** %s ******/\n", zErr);
11976       sqlite3_free(zErr);
11977       zErr = 0;
11978     }
11979     zQ2 = malloc( len+100 );
11980     if( zQ2==0 ) return rc;
11981     sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
11982     rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
11983     if( rc ){
11984       utf8_printf(p->out, "/****** ERROR: %s ******/\n", zErr);
11985     }else{
11986       rc = SQLITE_CORRUPT;
11987     }
11988     sqlite3_free(zErr);
11989     free(zQ2);
11990   }
11991   return rc;
11992 }
11993 
11994 /*
11995 ** Text of help messages.
11996 **
11997 ** The help text for each individual command begins with a line that starts
11998 ** with ".".  Subsequent lines are supplimental information.
11999 **
12000 ** There must be two or more spaces between the end of the command and the
12001 ** start of the description of what that command does.
12002 */
12003 static const char *(azHelp[]) = {
12004 #if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE)
12005   ".archive ...             Manage SQL archives",
12006   "   Each command must have exactly one of the following options:",
12007   "     -c, --create               Create a new archive",
12008   "     -u, --update               Add or update files with changed mtime",
12009   "     -i, --insert               Like -u but always add even if unchanged",
12010   "     -t, --list                 List contents of archive",
12011   "     -x, --extract              Extract files from archive",
12012   "   Optional arguments:",
12013   "     -v, --verbose              Print each filename as it is processed",
12014   "     -f FILE, --file FILE       Use archive FILE (default is current db)",
12015   "     -a FILE, --append FILE     Open FILE using the apndvfs VFS",
12016   "     -C DIR, --directory DIR    Read/extract files from directory DIR",
12017   "     -n, --dryrun               Show the SQL that would have occurred",
12018   "   Examples:",
12019   "     .ar -cf ARCHIVE foo bar  # Create ARCHIVE from files foo and bar",
12020   "     .ar -tf ARCHIVE          # List members of ARCHIVE",
12021   "     .ar -xvf ARCHIVE         # Verbosely extract files from ARCHIVE",
12022   "   See also:",
12023   "      http://sqlite.org/cli.html#sqlar_archive_support",
12024 #endif
12025 #ifndef SQLITE_OMIT_AUTHORIZATION
12026   ".auth ON|OFF             Show authorizer callbacks",
12027 #endif
12028   ".backup ?DB? FILE        Backup DB (default \"main\") to FILE",
12029   "       --append            Use the appendvfs",
12030   "       --async             Write to FILE without journal and fsync()",
12031   ".bail on|off             Stop after hitting an error.  Default OFF",
12032   ".binary on|off           Turn binary output on or off.  Default OFF",
12033   ".cd DIRECTORY            Change the working directory to DIRECTORY",
12034   ".changes on|off          Show number of rows changed by SQL",
12035   ".check GLOB              Fail if output since .testcase does not match",
12036   ".clone NEWDB             Clone data into NEWDB from the existing database",
12037   ".databases               List names and files of attached databases",
12038   ".dbconfig ?op? ?val?     List or change sqlite3_db_config() options",
12039   ".dbinfo ?DB?             Show status information about the database",
12040   ".dump ?TABLE? ...        Render all database content as SQL",
12041   "   Options:",
12042   "     --preserve-rowids      Include ROWID values in the output",
12043   "     --newlines             Allow unescaped newline characters in output",
12044   "   TABLE is a LIKE pattern for the tables to dump",
12045   ".echo on|off             Turn command echo on or off",
12046   ".eqp on|off|full|...     Enable or disable automatic EXPLAIN QUERY PLAN",
12047   "   Other Modes:",
12048 #ifdef SQLITE_DEBUG
12049   "      test                  Show raw EXPLAIN QUERY PLAN output",
12050   "      trace                 Like \"full\" but enable \"PRAGMA vdbe_trace\"",
12051 #endif
12052   "      trigger               Like \"full\" but also show trigger bytecode",
12053   ".excel                   Display the output of next command in spreadsheet",
12054   ".exit ?CODE?             Exit this program with return-code CODE",
12055   ".expert                  EXPERIMENTAL. Suggest indexes for queries",
12056 /* Because explain mode comes on automatically now, the ".explain" mode
12057 ** is removed from the help screen. It is still supported for legacy, however */
12058 /*".explain ?on|off|auto?   Turn EXPLAIN output mode on or off",*/
12059   ".filectrl CMD ...        Run various sqlite3_file_control() operations",
12060   "                           Run \".filectrl\" with no arguments for details",
12061   ".fullschema ?--indent?   Show schema and the content of sqlite_stat tables",
12062   ".headers on|off          Turn display of headers on or off",
12063   ".help ?-all? ?PATTERN?   Show help text for PATTERN",
12064   ".import FILE TABLE       Import data from FILE into TABLE",
12065 #ifndef SQLITE_OMIT_TEST_CONTROL
12066   ".imposter INDEX TABLE    Create imposter table TABLE on index INDEX",
12067 #endif
12068   ".indexes ?TABLE?         Show names of indexes",
12069   "                           If TABLE is specified, only show indexes for",
12070   "                           tables matching TABLE using the LIKE operator.",
12071 #ifdef SQLITE_ENABLE_IOTRACE
12072   ".iotrace FILE            Enable I/O diagnostic logging to FILE",
12073 #endif
12074   ".limit ?LIMIT? ?VAL?     Display or change the value of an SQLITE_LIMIT",
12075   ".lint OPTIONS            Report potential schema issues.",
12076   "     Options:",
12077   "        fkey-indexes     Find missing foreign key indexes",
12078 #ifndef SQLITE_OMIT_LOAD_EXTENSION
12079   ".load FILE ?ENTRY?       Load an extension library",
12080 #endif
12081   ".log FILE|off            Turn logging on or off.  FILE can be stderr/stdout",
12082   ".mode MODE ?TABLE?       Set output mode",
12083   "   MODE is one of:",
12084   "     ascii    Columns/rows delimited by 0x1F and 0x1E",
12085   "     csv      Comma-separated values",
12086   "     column   Left-aligned columns.  (See .width)",
12087   "     html     HTML <table> code",
12088   "     insert   SQL insert statements for TABLE",
12089   "     line     One value per line",
12090   "     list     Values delimited by \"|\"",
12091   "     quote    Escape answers as for SQL",
12092   "     tabs     Tab-separated values",
12093   "     tcl      TCL list elements",
12094   ".nullvalue STRING        Use STRING in place of NULL values",
12095   ".once (-e|-x|FILE)       Output for the next SQL command only to FILE",
12096   "     If FILE begins with '|' then open as a pipe",
12097   "     Other options:",
12098   "       -e    Invoke system text editor",
12099   "       -x    Open in a spreadsheet",
12100   ".open ?OPTIONS? ?FILE?   Close existing database and reopen FILE",
12101   "     Options:",
12102   "        --append        Use appendvfs to append database to the end of FILE",
12103 #ifdef SQLITE_ENABLE_DESERIALIZE
12104   "        --deserialize   Load into memory useing sqlite3_deserialize()",
12105   "        --hexdb         Load the output of \"dbtotxt\" as an in-memory db",
12106   "        --maxsize N     Maximum size for --hexdb or --deserialized database",
12107 #endif
12108   "        --new           Initialize FILE to an empty database",
12109   "        --readonly      Open FILE readonly",
12110   "        --zip           FILE is a ZIP archive",
12111   ".output ?FILE?           Send output to FILE or stdout if FILE is omitted",
12112   "     If FILE begins with '|' then open it as a pipe.",
12113   ".parameter CMD ...       Manage SQL parameter bindings",
12114   "   clear                   Erase all bindings",
12115   "   init                    Initialize the TEMP table that holds bindings",
12116   "   list                    List the current parameter bindings",
12117   "   set PARAMETER VALUE     Given SQL parameter PARAMETER a value of VALUE",
12118   "                           PARAMETER should start with one of: $ : @ ?",
12119   "   unset PARAMETER         Remove PARAMETER from the binding table",
12120   ".print STRING...         Print literal STRING",
12121 #ifndef SQLITE_OMIT_PROGRESS_CALLBACK
12122   ".progress N              Invoke progress handler after every N opcodes",
12123   "   --limit N                 Interrupt after N progress callbacks",
12124   "   --once                    Do no more than one progress interrupt",
12125   "   --quiet|-q                No output except at interrupts",
12126   "   --reset                   Reset the count for each input and interrupt",
12127 #endif
12128   ".prompt MAIN CONTINUE    Replace the standard prompts",
12129   ".quit                    Exit this program",
12130   ".read FILE               Read input from FILE",
12131 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
12132   ".recover                 Recover as much data as possible from corrupt db.",
12133   "   --freelist-corrupt       Assume the freelist is corrupt",
12134   "   --recovery-db NAME       Store recovery metadata in database file NAME",
12135   "   --lost-and-found TABLE   Alternative name for the lost-and-found table",
12136   "   --no-rowids              Do not attempt to recover rowid values",
12137   "                            that are not also INTEGER PRIMARY KEYs",
12138 #endif
12139   ".restore ?DB? FILE       Restore content of DB (default \"main\") from FILE",
12140   ".save FILE               Write in-memory database into FILE",
12141   ".scanstats on|off        Turn sqlite3_stmt_scanstatus() metrics on or off",
12142   ".schema ?PATTERN?        Show the CREATE statements matching PATTERN",
12143   "     Options:",
12144   "         --indent            Try to pretty-print the schema",
12145   ".selftest ?OPTIONS?      Run tests defined in the SELFTEST table",
12146   "    Options:",
12147   "       --init               Create a new SELFTEST table",
12148   "       -v                   Verbose output",
12149   ".separator COL ?ROW?     Change the column and row separators",
12150 #if defined(SQLITE_ENABLE_SESSION)
12151   ".session ?NAME? CMD ...  Create or control sessions",
12152   "   Subcommands:",
12153   "     attach TABLE             Attach TABLE",
12154   "     changeset FILE           Write a changeset into FILE",
12155   "     close                    Close one session",
12156   "     enable ?BOOLEAN?         Set or query the enable bit",
12157   "     filter GLOB...           Reject tables matching GLOBs",
12158   "     indirect ?BOOLEAN?       Mark or query the indirect status",
12159   "     isempty                  Query whether the session is empty",
12160   "     list                     List currently open session names",
12161   "     open DB NAME             Open a new session on DB",
12162   "     patchset FILE            Write a patchset into FILE",
12163   "   If ?NAME? is omitted, the first defined session is used.",
12164 #endif
12165   ".sha3sum ...             Compute a SHA3 hash of database content",
12166   "    Options:",
12167   "      --schema              Also hash the sqlite_master table",
12168   "      --sha3-224            Use the sha3-224 algorithm",
12169   "      --sha3-256            Use the sha3-256 algorithm (default)",
12170   "      --sha3-384            Use the sha3-384 algorithm",
12171   "      --sha3-512            Use the sha3-512 algorithm",
12172   "    Any other argument is a LIKE pattern for tables to hash",
12173 #ifndef SQLITE_NOHAVE_SYSTEM
12174   ".shell CMD ARGS...       Run CMD ARGS... in a system shell",
12175 #endif
12176   ".show                    Show the current values for various settings",
12177   ".stats ?on|off?          Show stats or turn stats on or off",
12178 #ifndef SQLITE_NOHAVE_SYSTEM
12179   ".system CMD ARGS...      Run CMD ARGS... in a system shell",
12180 #endif
12181   ".tables ?TABLE?          List names of tables matching LIKE pattern TABLE",
12182   ".testcase NAME           Begin redirecting output to 'testcase-out.txt'",
12183   ".testctrl CMD ...        Run various sqlite3_test_control() operations",
12184   "                           Run \".testctrl\" with no arguments for details",
12185   ".timeout MS              Try opening locked tables for MS milliseconds",
12186   ".timer on|off            Turn SQL timer on or off",
12187 #ifndef SQLITE_OMIT_TRACE
12188   ".trace ?OPTIONS?         Output each SQL statement as it is run",
12189   "    FILE                    Send output to FILE",
12190   "    stdout                  Send output to stdout",
12191   "    stderr                  Send output to stderr",
12192   "    off                     Disable tracing",
12193   "    --expanded              Expand query parameters",
12194 #ifdef SQLITE_ENABLE_NORMALIZE
12195   "    --normalized            Normal the SQL statements",
12196 #endif
12197   "    --plain                 Show SQL as it is input",
12198   "    --stmt                  Trace statement execution (SQLITE_TRACE_STMT)",
12199   "    --profile               Profile statements (SQLITE_TRACE_PROFILE)",
12200   "    --row                   Trace each row (SQLITE_TRACE_ROW)",
12201   "    --close                 Trace connection close (SQLITE_TRACE_CLOSE)",
12202 #endif /* SQLITE_OMIT_TRACE */
12203 #ifdef SQLITE_DEBUG
12204   ".unmodule NAME ...       Unregister virtual table modules",
12205   "    --allexcept             Unregister everything except those named",
12206 #endif
12207   ".vfsinfo ?AUX?           Information about the top-level VFS",
12208   ".vfslist                 List all available VFSes",
12209   ".vfsname ?AUX?           Print the name of the VFS stack",
12210   ".width NUM1 NUM2 ...     Set column widths for \"column\" mode",
12211   "     Negative values right-justify",
12212 };
12213 
12214 /*
12215 ** Output help text.
12216 **
12217 ** zPattern describes the set of commands for which help text is provided.
12218 ** If zPattern is NULL, then show all commands, but only give a one-line
12219 ** description of each.
12220 **
12221 ** Return the number of matches.
12222 */
12223 static int showHelp(FILE *out, const char *zPattern){
12224   int i = 0;
12225   int j = 0;
12226   int n = 0;
12227   char *zPat;
12228   if( zPattern==0
12229    || zPattern[0]=='0'
12230    || strcmp(zPattern,"-a")==0
12231    || strcmp(zPattern,"-all")==0
12232   ){
12233     /* Show all commands, but only one line per command */
12234     if( zPattern==0 ) zPattern = "";
12235     for(i=0; i<ArraySize(azHelp); i++){
12236       if( azHelp[i][0]=='.' || zPattern[0] ){
12237         utf8_printf(out, "%s\n", azHelp[i]);
12238         n++;
12239       }
12240     }
12241   }else{
12242     /* Look for commands that for which zPattern is an exact prefix */
12243     zPat = sqlite3_mprintf(".%s*", zPattern);
12244     for(i=0; i<ArraySize(azHelp); i++){
12245       if( sqlite3_strglob(zPat, azHelp[i])==0 ){
12246         utf8_printf(out, "%s\n", azHelp[i]);
12247         j = i+1;
12248         n++;
12249       }
12250     }
12251     sqlite3_free(zPat);
12252     if( n ){
12253       if( n==1 ){
12254         /* when zPattern is a prefix of exactly one command, then include the
12255         ** details of that command, which should begin at offset j */
12256         while( j<ArraySize(azHelp)-1 && azHelp[j][0]!='.' ){
12257           utf8_printf(out, "%s\n", azHelp[j]);
12258           j++;
12259         }
12260       }
12261       return n;
12262     }
12263     /* Look for commands that contain zPattern anywhere.  Show the complete
12264     ** text of all commands that match. */
12265     zPat = sqlite3_mprintf("%%%s%%", zPattern);
12266     for(i=0; i<ArraySize(azHelp); i++){
12267       if( azHelp[i][0]=='.' ) j = i;
12268       if( sqlite3_strlike(zPat, azHelp[i], 0)==0 ){
12269         utf8_printf(out, "%s\n", azHelp[j]);
12270         while( j<ArraySize(azHelp)-1 && azHelp[j+1][0]!='.' ){
12271           j++;
12272           utf8_printf(out, "%s\n", azHelp[j]);
12273         }
12274         i = j;
12275         n++;
12276       }
12277     }
12278     sqlite3_free(zPat);
12279   }
12280   return n;
12281 }
12282 
12283 /* Forward reference */
12284 static int process_input(ShellState *p);
12285 
12286 /*
12287 ** Read the content of file zName into memory obtained from sqlite3_malloc64()
12288 ** and return a pointer to the buffer. The caller is responsible for freeing
12289 ** the memory.
12290 **
12291 ** If parameter pnByte is not NULL, (*pnByte) is set to the number of bytes
12292 ** read.
12293 **
12294 ** For convenience, a nul-terminator byte is always appended to the data read
12295 ** from the file before the buffer is returned. This byte is not included in
12296 ** the final value of (*pnByte), if applicable.
12297 **
12298 ** NULL is returned if any error is encountered. The final value of *pnByte
12299 ** is undefined in this case.
12300 */
12301 static char *readFile(const char *zName, int *pnByte){
12302   FILE *in = fopen(zName, "rb");
12303   long nIn;
12304   size_t nRead;
12305   char *pBuf;
12306   if( in==0 ) return 0;
12307   fseek(in, 0, SEEK_END);
12308   nIn = ftell(in);
12309   rewind(in);
12310   pBuf = sqlite3_malloc64( nIn+1 );
12311   if( pBuf==0 ){ fclose(in); return 0; }
12312   nRead = fread(pBuf, nIn, 1, in);
12313   fclose(in);
12314   if( nRead!=1 ){
12315     sqlite3_free(pBuf);
12316     return 0;
12317   }
12318   pBuf[nIn] = 0;
12319   if( pnByte ) *pnByte = nIn;
12320   return pBuf;
12321 }
12322 
12323 #if defined(SQLITE_ENABLE_SESSION)
12324 /*
12325 ** Close a single OpenSession object and release all of its associated
12326 ** resources.
12327 */
12328 static void session_close(OpenSession *pSession){
12329   int i;
12330   sqlite3session_delete(pSession->p);
12331   sqlite3_free(pSession->zName);
12332   for(i=0; i<pSession->nFilter; i++){
12333     sqlite3_free(pSession->azFilter[i]);
12334   }
12335   sqlite3_free(pSession->azFilter);
12336   memset(pSession, 0, sizeof(OpenSession));
12337 }
12338 #endif
12339 
12340 /*
12341 ** Close all OpenSession objects and release all associated resources.
12342 */
12343 #if defined(SQLITE_ENABLE_SESSION)
12344 static void session_close_all(ShellState *p){
12345   int i;
12346   for(i=0; i<p->nSession; i++){
12347     session_close(&p->aSession[i]);
12348   }
12349   p->nSession = 0;
12350 }
12351 #else
12352 # define session_close_all(X)
12353 #endif
12354 
12355 /*
12356 ** Implementation of the xFilter function for an open session.  Omit
12357 ** any tables named by ".session filter" but let all other table through.
12358 */
12359 #if defined(SQLITE_ENABLE_SESSION)
12360 static int session_filter(void *pCtx, const char *zTab){
12361   OpenSession *pSession = (OpenSession*)pCtx;
12362   int i;
12363   for(i=0; i<pSession->nFilter; i++){
12364     if( sqlite3_strglob(pSession->azFilter[i], zTab)==0 ) return 0;
12365   }
12366   return 1;
12367 }
12368 #endif
12369 
12370 /*
12371 ** Try to deduce the type of file for zName based on its content.  Return
12372 ** one of the SHELL_OPEN_* constants.
12373 **
12374 ** If the file does not exist or is empty but its name looks like a ZIP
12375 ** archive and the dfltZip flag is true, then assume it is a ZIP archive.
12376 ** Otherwise, assume an ordinary database regardless of the filename if
12377 ** the type cannot be determined from content.
12378 */
12379 int deduceDatabaseType(const char *zName, int dfltZip){
12380   FILE *f = fopen(zName, "rb");
12381   size_t n;
12382   int rc = SHELL_OPEN_UNSPEC;
12383   char zBuf[100];
12384   if( f==0 ){
12385     if( dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){
12386        return SHELL_OPEN_ZIPFILE;
12387     }else{
12388        return SHELL_OPEN_NORMAL;
12389     }
12390   }
12391   n = fread(zBuf, 16, 1, f);
12392   if( n==1 && memcmp(zBuf, "SQLite format 3", 16)==0 ){
12393     fclose(f);
12394     return SHELL_OPEN_NORMAL;
12395   }
12396   fseek(f, -25, SEEK_END);
12397   n = fread(zBuf, 25, 1, f);
12398   if( n==1 && memcmp(zBuf, "Start-Of-SQLite3-", 17)==0 ){
12399     rc = SHELL_OPEN_APPENDVFS;
12400   }else{
12401     fseek(f, -22, SEEK_END);
12402     n = fread(zBuf, 22, 1, f);
12403     if( n==1 && zBuf[0]==0x50 && zBuf[1]==0x4b && zBuf[2]==0x05
12404        && zBuf[3]==0x06 ){
12405       rc = SHELL_OPEN_ZIPFILE;
12406     }else if( n==0 && dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){
12407       rc = SHELL_OPEN_ZIPFILE;
12408     }
12409   }
12410   fclose(f);
12411   return rc;
12412 }
12413 
12414 #ifdef SQLITE_ENABLE_DESERIALIZE
12415 /*
12416 ** Reconstruct an in-memory database using the output from the "dbtotxt"
12417 ** program.  Read content from the file in p->zDbFilename.  If p->zDbFilename
12418 ** is 0, then read from standard input.
12419 */
12420 static unsigned char *readHexDb(ShellState *p, int *pnData){
12421   unsigned char *a = 0;
12422   int nLine;
12423   int n = 0;
12424   int pgsz = 0;
12425   int iOffset = 0;
12426   int j, k;
12427   int rc;
12428   FILE *in;
12429   unsigned int x[16];
12430   char zLine[1000];
12431   if( p->zDbFilename ){
12432     in = fopen(p->zDbFilename, "r");
12433     if( in==0 ){
12434       utf8_printf(stderr, "cannot open \"%s\" for reading\n", p->zDbFilename);
12435       return 0;
12436     }
12437     nLine = 0;
12438   }else{
12439     in = p->in;
12440     nLine = p->lineno;
12441     if( in==0 ) in = stdin;
12442   }
12443   *pnData = 0;
12444   nLine++;
12445   if( fgets(zLine, sizeof(zLine), in)==0 ) goto readHexDb_error;
12446   rc = sscanf(zLine, "| size %d pagesize %d", &n, &pgsz);
12447   if( rc!=2 ) goto readHexDb_error;
12448   if( n<0 ) goto readHexDb_error;
12449   if( pgsz<512 || pgsz>65536 || (pgsz&(pgsz-1))!=0 ) goto readHexDb_error;
12450   n = (n+pgsz-1)&~(pgsz-1);  /* Round n up to the next multiple of pgsz */
12451   a = sqlite3_malloc( n ? n : 1 );
12452   if( a==0 ){
12453     utf8_printf(stderr, "Out of memory!\n");
12454     goto readHexDb_error;
12455   }
12456   memset(a, 0, n);
12457   if( pgsz<512 || pgsz>65536 || (pgsz & (pgsz-1))!=0 ){
12458     utf8_printf(stderr, "invalid pagesize\n");
12459     goto readHexDb_error;
12460   }
12461   for(nLine++; fgets(zLine, sizeof(zLine), in)!=0; nLine++){
12462     rc = sscanf(zLine, "| page %d offset %d", &j, &k);
12463     if( rc==2 ){
12464       iOffset = k;
12465       continue;
12466     }
12467     if( strncmp(zLine, "| end ", 6)==0 ){
12468       break;
12469     }
12470     rc = sscanf(zLine,"| %d: %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x",
12471                 &j, &x[0], &x[1], &x[2], &x[3], &x[4], &x[5], &x[6], &x[7],
12472                 &x[8], &x[9], &x[10], &x[11], &x[12], &x[13], &x[14], &x[15]);
12473     if( rc==17 ){
12474       k = iOffset+j;
12475       if( k+16<=n ){
12476         int ii;
12477         for(ii=0; ii<16; ii++) a[k+ii] = x[ii]&0xff;
12478       }
12479     }
12480   }
12481   *pnData = n;
12482   if( in!=p->in ){
12483     fclose(in);
12484   }else{
12485     p->lineno = nLine;
12486   }
12487   return a;
12488 
12489 readHexDb_error:
12490   if( in!=p->in ){
12491     fclose(in);
12492   }else{
12493     while( fgets(zLine, sizeof(zLine), p->in)!=0 ){
12494       nLine++;
12495       if(strncmp(zLine, "| end ", 6)==0 ) break;
12496     }
12497     p->lineno = nLine;
12498   }
12499   sqlite3_free(a);
12500   utf8_printf(stderr,"Error on line %d of --hexdb input\n", nLine);
12501   return 0;
12502 }
12503 #endif /* SQLITE_ENABLE_DESERIALIZE */
12504 
12505 /*
12506 ** Scalar function "shell_int32". The first argument to this function
12507 ** must be a blob. The second a non-negative integer. This function
12508 ** reads and returns a 32-bit big-endian integer from byte
12509 ** offset (4*<arg2>) of the blob.
12510 */
12511 static void shellInt32(
12512   sqlite3_context *context,
12513   int argc,
12514   sqlite3_value **argv
12515 ){
12516   const unsigned char *pBlob;
12517   int nBlob;
12518   int iInt;
12519 
12520   UNUSED_PARAMETER(argc);
12521   nBlob = sqlite3_value_bytes(argv[0]);
12522   pBlob = (const unsigned char*)sqlite3_value_blob(argv[0]);
12523   iInt = sqlite3_value_int(argv[1]);
12524 
12525   if( iInt>=0 && (iInt+1)*4<=nBlob ){
12526     const unsigned char *a = &pBlob[iInt*4];
12527     sqlite3_int64 iVal = ((sqlite3_int64)a[0]<<24)
12528                        + ((sqlite3_int64)a[1]<<16)
12529                        + ((sqlite3_int64)a[2]<< 8)
12530                        + ((sqlite3_int64)a[3]<< 0);
12531     sqlite3_result_int64(context, iVal);
12532   }
12533 }
12534 
12535 /*
12536 ** Scalar function "shell_idquote(X)" returns string X quoted as an identifier,
12537 ** using "..." with internal double-quote characters doubled.
12538 */
12539 static void shellIdQuote(
12540   sqlite3_context *context,
12541   int argc,
12542   sqlite3_value **argv
12543 ){
12544   const char *zName = (const char*)sqlite3_value_text(argv[0]);
12545   UNUSED_PARAMETER(argc);
12546   if( zName ){
12547     char *z = sqlite3_mprintf("\"%w\"", zName);
12548     sqlite3_result_text(context, z, -1, sqlite3_free);
12549   }
12550 }
12551 
12552 /*
12553 ** Scalar function "shell_escape_crnl" used by the .recover command.
12554 ** The argument passed to this function is the output of built-in
12555 ** function quote(). If the first character of the input is "'",
12556 ** indicating that the value passed to quote() was a text value,
12557 ** then this function searches the input for "\n" and "\r" characters
12558 ** and adds a wrapper similar to the following:
12559 **
12560 **   replace(replace(<input>, '\n', char(10), '\r', char(13));
12561 **
12562 ** Or, if the first character of the input is not "'", then a copy
12563 ** of the input is returned.
12564 */
12565 static void shellEscapeCrnl(
12566   sqlite3_context *context,
12567   int argc,
12568   sqlite3_value **argv
12569 ){
12570   const char *zText = (const char*)sqlite3_value_text(argv[0]);
12571   UNUSED_PARAMETER(argc);
12572   if( zText[0]=='\'' ){
12573     int nText = sqlite3_value_bytes(argv[0]);
12574     int i;
12575     char zBuf1[20];
12576     char zBuf2[20];
12577     const char *zNL = 0;
12578     const char *zCR = 0;
12579     int nCR = 0;
12580     int nNL = 0;
12581 
12582     for(i=0; zText[i]; i++){
12583       if( zNL==0 && zText[i]=='\n' ){
12584         zNL = unused_string(zText, "\\n", "\\012", zBuf1);
12585         nNL = (int)strlen(zNL);
12586       }
12587       if( zCR==0 && zText[i]=='\r' ){
12588         zCR = unused_string(zText, "\\r", "\\015", zBuf2);
12589         nCR = (int)strlen(zCR);
12590       }
12591     }
12592 
12593     if( zNL || zCR ){
12594       int iOut = 0;
12595       i64 nMax = (nNL > nCR) ? nNL : nCR;
12596       i64 nAlloc = nMax * nText + (nMax+64)*2;
12597       char *zOut = (char*)sqlite3_malloc64(nAlloc);
12598       if( zOut==0 ){
12599         sqlite3_result_error_nomem(context);
12600         return;
12601       }
12602 
12603       if( zNL && zCR ){
12604         memcpy(&zOut[iOut], "replace(replace(", 16);
12605         iOut += 16;
12606       }else{
12607         memcpy(&zOut[iOut], "replace(", 8);
12608         iOut += 8;
12609       }
12610       for(i=0; zText[i]; i++){
12611         if( zText[i]=='\n' ){
12612           memcpy(&zOut[iOut], zNL, nNL);
12613           iOut += nNL;
12614         }else if( zText[i]=='\r' ){
12615           memcpy(&zOut[iOut], zCR, nCR);
12616           iOut += nCR;
12617         }else{
12618           zOut[iOut] = zText[i];
12619           iOut++;
12620         }
12621       }
12622 
12623       if( zNL ){
12624         memcpy(&zOut[iOut], ",'", 2); iOut += 2;
12625         memcpy(&zOut[iOut], zNL, nNL); iOut += nNL;
12626         memcpy(&zOut[iOut], "', char(10))", 12); iOut += 12;
12627       }
12628       if( zCR ){
12629         memcpy(&zOut[iOut], ",'", 2); iOut += 2;
12630         memcpy(&zOut[iOut], zCR, nCR); iOut += nCR;
12631         memcpy(&zOut[iOut], "', char(13))", 12); iOut += 12;
12632       }
12633 
12634       sqlite3_result_text(context, zOut, iOut, SQLITE_TRANSIENT);
12635       sqlite3_free(zOut);
12636       return;
12637     }
12638   }
12639 
12640   sqlite3_result_value(context, argv[0]);
12641 }
12642 
12643 /* Flags for open_db().
12644 **
12645 ** The default behavior of open_db() is to exit(1) if the database fails to
12646 ** open.  The OPEN_DB_KEEPALIVE flag changes that so that it prints an error
12647 ** but still returns without calling exit.
12648 **
12649 ** The OPEN_DB_ZIPFILE flag causes open_db() to prefer to open files as a
12650 ** ZIP archive if the file does not exist or is empty and its name matches
12651 ** the *.zip pattern.
12652 */
12653 #define OPEN_DB_KEEPALIVE   0x001   /* Return after error if true */
12654 #define OPEN_DB_ZIPFILE     0x002   /* Open as ZIP if name matches *.zip */
12655 
12656 /*
12657 ** Make sure the database is open.  If it is not, then open it.  If
12658 ** the database fails to open, print an error message and exit.
12659 */
12660 static void open_db(ShellState *p, int openFlags){
12661   if( p->db==0 ){
12662     if( p->openMode==SHELL_OPEN_UNSPEC ){
12663       if( p->zDbFilename==0 || p->zDbFilename[0]==0 ){
12664         p->openMode = SHELL_OPEN_NORMAL;
12665       }else{
12666         p->openMode = (u8)deduceDatabaseType(p->zDbFilename,
12667                              (openFlags & OPEN_DB_ZIPFILE)!=0);
12668       }
12669     }
12670     switch( p->openMode ){
12671       case SHELL_OPEN_APPENDVFS: {
12672         sqlite3_open_v2(p->zDbFilename, &p->db,
12673            SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE, "apndvfs");
12674         break;
12675       }
12676       case SHELL_OPEN_HEXDB:
12677       case SHELL_OPEN_DESERIALIZE: {
12678         sqlite3_open(0, &p->db);
12679         break;
12680       }
12681       case SHELL_OPEN_ZIPFILE: {
12682         sqlite3_open(":memory:", &p->db);
12683         break;
12684       }
12685       case SHELL_OPEN_READONLY: {
12686         sqlite3_open_v2(p->zDbFilename, &p->db, SQLITE_OPEN_READONLY, 0);
12687         break;
12688       }
12689       case SHELL_OPEN_UNSPEC:
12690       case SHELL_OPEN_NORMAL: {
12691         sqlite3_open(p->zDbFilename, &p->db);
12692         break;
12693       }
12694     }
12695     globalDb = p->db;
12696     if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){
12697       utf8_printf(stderr,"Error: unable to open database \"%s\": %s\n",
12698           p->zDbFilename, sqlite3_errmsg(p->db));
12699       if( openFlags & OPEN_DB_KEEPALIVE ){
12700         sqlite3_open(":memory:", &p->db);
12701         return;
12702       }
12703       exit(1);
12704     }
12705 #ifndef SQLITE_OMIT_LOAD_EXTENSION
12706     sqlite3_enable_load_extension(p->db, 1);
12707 #endif
12708     sqlite3_fileio_init(p->db, 0, 0);
12709     sqlite3_shathree_init(p->db, 0, 0);
12710     sqlite3_completion_init(p->db, 0, 0);
12711 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
12712     sqlite3_dbdata_init(p->db, 0, 0);
12713 #endif
12714 #ifdef SQLITE_HAVE_ZLIB
12715     sqlite3_zipfile_init(p->db, 0, 0);
12716     sqlite3_sqlar_init(p->db, 0, 0);
12717 #endif
12718     sqlite3_create_function(p->db, "shell_add_schema", 3, SQLITE_UTF8, 0,
12719                             shellAddSchemaName, 0, 0);
12720     sqlite3_create_function(p->db, "shell_module_schema", 1, SQLITE_UTF8, 0,
12721                             shellModuleSchema, 0, 0);
12722     sqlite3_create_function(p->db, "shell_putsnl", 1, SQLITE_UTF8, p,
12723                             shellPutsFunc, 0, 0);
12724     sqlite3_create_function(p->db, "shell_escape_crnl", 1, SQLITE_UTF8, 0,
12725                             shellEscapeCrnl, 0, 0);
12726     sqlite3_create_function(p->db, "shell_int32", 2, SQLITE_UTF8, 0,
12727                             shellInt32, 0, 0);
12728     sqlite3_create_function(p->db, "shell_idquote", 1, SQLITE_UTF8, 0,
12729                             shellIdQuote, 0, 0);
12730 #ifndef SQLITE_NOHAVE_SYSTEM
12731     sqlite3_create_function(p->db, "edit", 1, SQLITE_UTF8, 0,
12732                             editFunc, 0, 0);
12733     sqlite3_create_function(p->db, "edit", 2, SQLITE_UTF8, 0,
12734                             editFunc, 0, 0);
12735 #endif
12736     if( p->openMode==SHELL_OPEN_ZIPFILE ){
12737       char *zSql = sqlite3_mprintf(
12738          "CREATE VIRTUAL TABLE zip USING zipfile(%Q);", p->zDbFilename);
12739       sqlite3_exec(p->db, zSql, 0, 0, 0);
12740       sqlite3_free(zSql);
12741     }
12742 #ifdef SQLITE_ENABLE_DESERIALIZE
12743     else
12744     if( p->openMode==SHELL_OPEN_DESERIALIZE || p->openMode==SHELL_OPEN_HEXDB ){
12745       int rc;
12746       int nData = 0;
12747       unsigned char *aData;
12748       if( p->openMode==SHELL_OPEN_DESERIALIZE ){
12749         aData = (unsigned char*)readFile(p->zDbFilename, &nData);
12750       }else{
12751         aData = readHexDb(p, &nData);
12752         if( aData==0 ){
12753           return;
12754         }
12755       }
12756       rc = sqlite3_deserialize(p->db, "main", aData, nData, nData,
12757                    SQLITE_DESERIALIZE_RESIZEABLE |
12758                    SQLITE_DESERIALIZE_FREEONCLOSE);
12759       if( rc ){
12760         utf8_printf(stderr, "Error: sqlite3_deserialize() returns %d\n", rc);
12761       }
12762       if( p->szMax>0 ){
12763         sqlite3_file_control(p->db, "main", SQLITE_FCNTL_SIZE_LIMIT, &p->szMax);
12764       }
12765     }
12766 #endif
12767   }
12768 }
12769 
12770 /*
12771 ** Attempt to close the databaes connection.  Report errors.
12772 */
12773 void close_db(sqlite3 *db){
12774   int rc = sqlite3_close(db);
12775   if( rc ){
12776     utf8_printf(stderr, "Error: sqlite3_close() returns %d: %s\n",
12777         rc, sqlite3_errmsg(db));
12778   }
12779 }
12780 
12781 #if HAVE_READLINE || HAVE_EDITLINE
12782 /*
12783 ** Readline completion callbacks
12784 */
12785 static char *readline_completion_generator(const char *text, int state){
12786   static sqlite3_stmt *pStmt = 0;
12787   char *zRet;
12788   if( state==0 ){
12789     char *zSql;
12790     sqlite3_finalize(pStmt);
12791     zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
12792                            "  FROM completion(%Q) ORDER BY 1", text);
12793     sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
12794     sqlite3_free(zSql);
12795   }
12796   if( sqlite3_step(pStmt)==SQLITE_ROW ){
12797     zRet = strdup((const char*)sqlite3_column_text(pStmt, 0));
12798   }else{
12799     sqlite3_finalize(pStmt);
12800     pStmt = 0;
12801     zRet = 0;
12802   }
12803   return zRet;
12804 }
12805 static char **readline_completion(const char *zText, int iStart, int iEnd){
12806   rl_attempted_completion_over = 1;
12807   return rl_completion_matches(zText, readline_completion_generator);
12808 }
12809 
12810 #elif HAVE_LINENOISE
12811 /*
12812 ** Linenoise completion callback
12813 */
12814 static void linenoise_completion(const char *zLine, linenoiseCompletions *lc){
12815   int nLine = strlen30(zLine);
12816   int i, iStart;
12817   sqlite3_stmt *pStmt = 0;
12818   char *zSql;
12819   char zBuf[1000];
12820 
12821   if( nLine>sizeof(zBuf)-30 ) return;
12822   if( zLine[0]=='.' || zLine[0]=='#') return;
12823   for(i=nLine-1; i>=0 && (isalnum(zLine[i]) || zLine[i]=='_'); i--){}
12824   if( i==nLine-1 ) return;
12825   iStart = i+1;
12826   memcpy(zBuf, zLine, iStart);
12827   zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
12828                          "  FROM completion(%Q,%Q) ORDER BY 1",
12829                          &zLine[iStart], zLine);
12830   sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
12831   sqlite3_free(zSql);
12832   sqlite3_exec(globalDb, "PRAGMA page_count", 0, 0, 0); /* Load the schema */
12833   while( sqlite3_step(pStmt)==SQLITE_ROW ){
12834     const char *zCompletion = (const char*)sqlite3_column_text(pStmt, 0);
12835     int nCompletion = sqlite3_column_bytes(pStmt, 0);
12836     if( iStart+nCompletion < sizeof(zBuf)-1 ){
12837       memcpy(zBuf+iStart, zCompletion, nCompletion+1);
12838       linenoiseAddCompletion(lc, zBuf);
12839     }
12840   }
12841   sqlite3_finalize(pStmt);
12842 }
12843 #endif
12844 
12845 /*
12846 ** Do C-language style dequoting.
12847 **
12848 **    \a    -> alarm
12849 **    \b    -> backspace
12850 **    \t    -> tab
12851 **    \n    -> newline
12852 **    \v    -> vertical tab
12853 **    \f    -> form feed
12854 **    \r    -> carriage return
12855 **    \s    -> space
12856 **    \"    -> "
12857 **    \'    -> '
12858 **    \\    -> backslash
12859 **    \NNN  -> ascii character NNN in octal
12860 */
12861 static void resolve_backslashes(char *z){
12862   int i, j;
12863   char c;
12864   while( *z && *z!='\\' ) z++;
12865   for(i=j=0; (c = z[i])!=0; i++, j++){
12866     if( c=='\\' && z[i+1]!=0 ){
12867       c = z[++i];
12868       if( c=='a' ){
12869         c = '\a';
12870       }else if( c=='b' ){
12871         c = '\b';
12872       }else if( c=='t' ){
12873         c = '\t';
12874       }else if( c=='n' ){
12875         c = '\n';
12876       }else if( c=='v' ){
12877         c = '\v';
12878       }else if( c=='f' ){
12879         c = '\f';
12880       }else if( c=='r' ){
12881         c = '\r';
12882       }else if( c=='"' ){
12883         c = '"';
12884       }else if( c=='\'' ){
12885         c = '\'';
12886       }else if( c=='\\' ){
12887         c = '\\';
12888       }else if( c>='0' && c<='7' ){
12889         c -= '0';
12890         if( z[i+1]>='0' && z[i+1]<='7' ){
12891           i++;
12892           c = (c<<3) + z[i] - '0';
12893           if( z[i+1]>='0' && z[i+1]<='7' ){
12894             i++;
12895             c = (c<<3) + z[i] - '0';
12896           }
12897         }
12898       }
12899     }
12900     z[j] = c;
12901   }
12902   if( j<i ) z[j] = 0;
12903 }
12904 
12905 /*
12906 ** Interpret zArg as either an integer or a boolean value.  Return 1 or 0
12907 ** for TRUE and FALSE.  Return the integer value if appropriate.
12908 */
12909 static int booleanValue(const char *zArg){
12910   int i;
12911   if( zArg[0]=='0' && zArg[1]=='x' ){
12912     for(i=2; hexDigitValue(zArg[i])>=0; i++){}
12913   }else{
12914     for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
12915   }
12916   if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
12917   if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
12918     return 1;
12919   }
12920   if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
12921     return 0;
12922   }
12923   utf8_printf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
12924           zArg);
12925   return 0;
12926 }
12927 
12928 /*
12929 ** Set or clear a shell flag according to a boolean value.
12930 */
12931 static void setOrClearFlag(ShellState *p, unsigned mFlag, const char *zArg){
12932   if( booleanValue(zArg) ){
12933     ShellSetFlag(p, mFlag);
12934   }else{
12935     ShellClearFlag(p, mFlag);
12936   }
12937 }
12938 
12939 /*
12940 ** Close an output file, assuming it is not stderr or stdout
12941 */
12942 static void output_file_close(FILE *f){
12943   if( f && f!=stdout && f!=stderr ) fclose(f);
12944 }
12945 
12946 /*
12947 ** Try to open an output file.   The names "stdout" and "stderr" are
12948 ** recognized and do the right thing.  NULL is returned if the output
12949 ** filename is "off".
12950 */
12951 static FILE *output_file_open(const char *zFile, int bTextMode){
12952   FILE *f;
12953   if( strcmp(zFile,"stdout")==0 ){
12954     f = stdout;
12955   }else if( strcmp(zFile, "stderr")==0 ){
12956     f = stderr;
12957   }else if( strcmp(zFile, "off")==0 ){
12958     f = 0;
12959   }else{
12960     f = fopen(zFile, bTextMode ? "w" : "wb");
12961     if( f==0 ){
12962       utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
12963     }
12964   }
12965   return f;
12966 }
12967 
12968 #ifndef SQLITE_OMIT_TRACE
12969 /*
12970 ** A routine for handling output from sqlite3_trace().
12971 */
12972 static int sql_trace_callback(
12973   unsigned mType,         /* The trace type */
12974   void *pArg,             /* The ShellState pointer */
12975   void *pP,               /* Usually a pointer to sqlite_stmt */
12976   void *pX                /* Auxiliary output */
12977 ){
12978   ShellState *p = (ShellState*)pArg;
12979   sqlite3_stmt *pStmt;
12980   const char *zSql;
12981   int nSql;
12982   if( p->traceOut==0 ) return 0;
12983   if( mType==SQLITE_TRACE_CLOSE ){
12984     utf8_printf(p->traceOut, "-- closing database connection\n");
12985     return 0;
12986   }
12987   if( mType!=SQLITE_TRACE_ROW && ((const char*)pX)[0]=='-' ){
12988     zSql = (const char*)pX;
12989   }else{
12990     pStmt = (sqlite3_stmt*)pP;
12991     switch( p->eTraceType ){
12992       case SHELL_TRACE_EXPANDED: {
12993         zSql = sqlite3_expanded_sql(pStmt);
12994         break;
12995       }
12996 #ifdef SQLITE_ENABLE_NORMALIZE
12997       case SHELL_TRACE_NORMALIZED: {
12998         zSql = sqlite3_normalized_sql(pStmt);
12999         break;
13000       }
13001 #endif
13002       default: {
13003         zSql = sqlite3_sql(pStmt);
13004         break;
13005       }
13006     }
13007   }
13008   if( zSql==0 ) return 0;
13009   nSql = strlen30(zSql);
13010   while( nSql>0 && zSql[nSql-1]==';' ){ nSql--; }
13011   switch( mType ){
13012     case SQLITE_TRACE_ROW:
13013     case SQLITE_TRACE_STMT: {
13014       utf8_printf(p->traceOut, "%.*s;\n", nSql, zSql);
13015       break;
13016     }
13017     case SQLITE_TRACE_PROFILE: {
13018       sqlite3_int64 nNanosec = *(sqlite3_int64*)pX;
13019       utf8_printf(p->traceOut, "%.*s; -- %lld ns\n", nSql, zSql, nNanosec);
13020       break;
13021     }
13022   }
13023   return 0;
13024 }
13025 #endif
13026 
13027 /*
13028 ** A no-op routine that runs with the ".breakpoint" doc-command.  This is
13029 ** a useful spot to set a debugger breakpoint.
13030 */
13031 static void test_breakpoint(void){
13032   static int nCall = 0;
13033   nCall++;
13034 }
13035 
13036 /*
13037 ** An object used to read a CSV and other files for import.
13038 */
13039 typedef struct ImportCtx ImportCtx;
13040 struct ImportCtx {
13041   const char *zFile;  /* Name of the input file */
13042   FILE *in;           /* Read the CSV text from this input stream */
13043   char *z;            /* Accumulated text for a field */
13044   int n;              /* Number of bytes in z */
13045   int nAlloc;         /* Space allocated for z[] */
13046   int nLine;          /* Current line number */
13047   int bNotFirst;      /* True if one or more bytes already read */
13048   int cTerm;          /* Character that terminated the most recent field */
13049   int cColSep;        /* The column separator character.  (Usually ",") */
13050   int cRowSep;        /* The row separator character.  (Usually "\n") */
13051 };
13052 
13053 /* Append a single byte to z[] */
13054 static void import_append_char(ImportCtx *p, int c){
13055   if( p->n+1>=p->nAlloc ){
13056     p->nAlloc += p->nAlloc + 100;
13057     p->z = sqlite3_realloc64(p->z, p->nAlloc);
13058     if( p->z==0 ) shell_out_of_memory();
13059   }
13060   p->z[p->n++] = (char)c;
13061 }
13062 
13063 /* Read a single field of CSV text.  Compatible with rfc4180 and extended
13064 ** with the option of having a separator other than ",".
13065 **
13066 **   +  Input comes from p->in.
13067 **   +  Store results in p->z of length p->n.  Space to hold p->z comes
13068 **      from sqlite3_malloc64().
13069 **   +  Use p->cSep as the column separator.  The default is ",".
13070 **   +  Use p->rSep as the row separator.  The default is "\n".
13071 **   +  Keep track of the line number in p->nLine.
13072 **   +  Store the character that terminates the field in p->cTerm.  Store
13073 **      EOF on end-of-file.
13074 **   +  Report syntax errors on stderr
13075 */
13076 static char *SQLITE_CDECL csv_read_one_field(ImportCtx *p){
13077   int c;
13078   int cSep = p->cColSep;
13079   int rSep = p->cRowSep;
13080   p->n = 0;
13081   c = fgetc(p->in);
13082   if( c==EOF || seenInterrupt ){
13083     p->cTerm = EOF;
13084     return 0;
13085   }
13086   if( c=='"' ){
13087     int pc, ppc;
13088     int startLine = p->nLine;
13089     int cQuote = c;
13090     pc = ppc = 0;
13091     while( 1 ){
13092       c = fgetc(p->in);
13093       if( c==rSep ) p->nLine++;
13094       if( c==cQuote ){
13095         if( pc==cQuote ){
13096           pc = 0;
13097           continue;
13098         }
13099       }
13100       if( (c==cSep && pc==cQuote)
13101        || (c==rSep && pc==cQuote)
13102        || (c==rSep && pc=='\r' && ppc==cQuote)
13103        || (c==EOF && pc==cQuote)
13104       ){
13105         do{ p->n--; }while( p->z[p->n]!=cQuote );
13106         p->cTerm = c;
13107         break;
13108       }
13109       if( pc==cQuote && c!='\r' ){
13110         utf8_printf(stderr, "%s:%d: unescaped %c character\n",
13111                 p->zFile, p->nLine, cQuote);
13112       }
13113       if( c==EOF ){
13114         utf8_printf(stderr, "%s:%d: unterminated %c-quoted field\n",
13115                 p->zFile, startLine, cQuote);
13116         p->cTerm = c;
13117         break;
13118       }
13119       import_append_char(p, c);
13120       ppc = pc;
13121       pc = c;
13122     }
13123   }else{
13124     /* If this is the first field being parsed and it begins with the
13125     ** UTF-8 BOM  (0xEF BB BF) then skip the BOM */
13126     if( (c&0xff)==0xef && p->bNotFirst==0 ){
13127       import_append_char(p, c);
13128       c = fgetc(p->in);
13129       if( (c&0xff)==0xbb ){
13130         import_append_char(p, c);
13131         c = fgetc(p->in);
13132         if( (c&0xff)==0xbf ){
13133           p->bNotFirst = 1;
13134           p->n = 0;
13135           return csv_read_one_field(p);
13136         }
13137       }
13138     }
13139     while( c!=EOF && c!=cSep && c!=rSep ){
13140       import_append_char(p, c);
13141       c = fgetc(p->in);
13142     }
13143     if( c==rSep ){
13144       p->nLine++;
13145       if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
13146     }
13147     p->cTerm = c;
13148   }
13149   if( p->z ) p->z[p->n] = 0;
13150   p->bNotFirst = 1;
13151   return p->z;
13152 }
13153 
13154 /* Read a single field of ASCII delimited text.
13155 **
13156 **   +  Input comes from p->in.
13157 **   +  Store results in p->z of length p->n.  Space to hold p->z comes
13158 **      from sqlite3_malloc64().
13159 **   +  Use p->cSep as the column separator.  The default is "\x1F".
13160 **   +  Use p->rSep as the row separator.  The default is "\x1E".
13161 **   +  Keep track of the row number in p->nLine.
13162 **   +  Store the character that terminates the field in p->cTerm.  Store
13163 **      EOF on end-of-file.
13164 **   +  Report syntax errors on stderr
13165 */
13166 static char *SQLITE_CDECL ascii_read_one_field(ImportCtx *p){
13167   int c;
13168   int cSep = p->cColSep;
13169   int rSep = p->cRowSep;
13170   p->n = 0;
13171   c = fgetc(p->in);
13172   if( c==EOF || seenInterrupt ){
13173     p->cTerm = EOF;
13174     return 0;
13175   }
13176   while( c!=EOF && c!=cSep && c!=rSep ){
13177     import_append_char(p, c);
13178     c = fgetc(p->in);
13179   }
13180   if( c==rSep ){
13181     p->nLine++;
13182   }
13183   p->cTerm = c;
13184   if( p->z ) p->z[p->n] = 0;
13185   return p->z;
13186 }
13187 
13188 /*
13189 ** Try to transfer data for table zTable.  If an error is seen while
13190 ** moving forward, try to go backwards.  The backwards movement won't
13191 ** work for WITHOUT ROWID tables.
13192 */
13193 static void tryToCloneData(
13194   ShellState *p,
13195   sqlite3 *newDb,
13196   const char *zTable
13197 ){
13198   sqlite3_stmt *pQuery = 0;
13199   sqlite3_stmt *pInsert = 0;
13200   char *zQuery = 0;
13201   char *zInsert = 0;
13202   int rc;
13203   int i, j, n;
13204   int nTable = strlen30(zTable);
13205   int k = 0;
13206   int cnt = 0;
13207   const int spinRate = 10000;
13208 
13209   zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
13210   rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
13211   if( rc ){
13212     utf8_printf(stderr, "Error %d: %s on [%s]\n",
13213             sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
13214             zQuery);
13215     goto end_data_xfer;
13216   }
13217   n = sqlite3_column_count(pQuery);
13218   zInsert = sqlite3_malloc64(200 + nTable + n*3);
13219   if( zInsert==0 ) shell_out_of_memory();
13220   sqlite3_snprintf(200+nTable,zInsert,
13221                    "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
13222   i = strlen30(zInsert);
13223   for(j=1; j<n; j++){
13224     memcpy(zInsert+i, ",?", 2);
13225     i += 2;
13226   }
13227   memcpy(zInsert+i, ");", 3);
13228   rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
13229   if( rc ){
13230     utf8_printf(stderr, "Error %d: %s on [%s]\n",
13231             sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
13232             zQuery);
13233     goto end_data_xfer;
13234   }
13235   for(k=0; k<2; k++){
13236     while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
13237       for(i=0; i<n; i++){
13238         switch( sqlite3_column_type(pQuery, i) ){
13239           case SQLITE_NULL: {
13240             sqlite3_bind_null(pInsert, i+1);
13241             break;
13242           }
13243           case SQLITE_INTEGER: {
13244             sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
13245             break;
13246           }
13247           case SQLITE_FLOAT: {
13248             sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
13249             break;
13250           }
13251           case SQLITE_TEXT: {
13252             sqlite3_bind_text(pInsert, i+1,
13253                              (const char*)sqlite3_column_text(pQuery,i),
13254                              -1, SQLITE_STATIC);
13255             break;
13256           }
13257           case SQLITE_BLOB: {
13258             sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
13259                                             sqlite3_column_bytes(pQuery,i),
13260                                             SQLITE_STATIC);
13261             break;
13262           }
13263         }
13264       } /* End for */
13265       rc = sqlite3_step(pInsert);
13266       if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
13267         utf8_printf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
13268                         sqlite3_errmsg(newDb));
13269       }
13270       sqlite3_reset(pInsert);
13271       cnt++;
13272       if( (cnt%spinRate)==0 ){
13273         printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
13274         fflush(stdout);
13275       }
13276     } /* End while */
13277     if( rc==SQLITE_DONE ) break;
13278     sqlite3_finalize(pQuery);
13279     sqlite3_free(zQuery);
13280     zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
13281                              zTable);
13282     rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
13283     if( rc ){
13284       utf8_printf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
13285       break;
13286     }
13287   } /* End for(k=0...) */
13288 
13289 end_data_xfer:
13290   sqlite3_finalize(pQuery);
13291   sqlite3_finalize(pInsert);
13292   sqlite3_free(zQuery);
13293   sqlite3_free(zInsert);
13294 }
13295 
13296 
13297 /*
13298 ** Try to transfer all rows of the schema that match zWhere.  For
13299 ** each row, invoke xForEach() on the object defined by that row.
13300 ** If an error is encountered while moving forward through the
13301 ** sqlite_master table, try again moving backwards.
13302 */
13303 static void tryToCloneSchema(
13304   ShellState *p,
13305   sqlite3 *newDb,
13306   const char *zWhere,
13307   void (*xForEach)(ShellState*,sqlite3*,const char*)
13308 ){
13309   sqlite3_stmt *pQuery = 0;
13310   char *zQuery = 0;
13311   int rc;
13312   const unsigned char *zName;
13313   const unsigned char *zSql;
13314   char *zErrMsg = 0;
13315 
13316   zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
13317                            " WHERE %s", zWhere);
13318   rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
13319   if( rc ){
13320     utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
13321                     sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
13322                     zQuery);
13323     goto end_schema_xfer;
13324   }
13325   while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
13326     zName = sqlite3_column_text(pQuery, 0);
13327     zSql = sqlite3_column_text(pQuery, 1);
13328     printf("%s... ", zName); fflush(stdout);
13329     sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
13330     if( zErrMsg ){
13331       utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
13332       sqlite3_free(zErrMsg);
13333       zErrMsg = 0;
13334     }
13335     if( xForEach ){
13336       xForEach(p, newDb, (const char*)zName);
13337     }
13338     printf("done\n");
13339   }
13340   if( rc!=SQLITE_DONE ){
13341     sqlite3_finalize(pQuery);
13342     sqlite3_free(zQuery);
13343     zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
13344                              " WHERE %s ORDER BY rowid DESC", zWhere);
13345     rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
13346     if( rc ){
13347       utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
13348                       sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
13349                       zQuery);
13350       goto end_schema_xfer;
13351     }
13352     while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
13353       zName = sqlite3_column_text(pQuery, 0);
13354       zSql = sqlite3_column_text(pQuery, 1);
13355       printf("%s... ", zName); fflush(stdout);
13356       sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
13357       if( zErrMsg ){
13358         utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
13359         sqlite3_free(zErrMsg);
13360         zErrMsg = 0;
13361       }
13362       if( xForEach ){
13363         xForEach(p, newDb, (const char*)zName);
13364       }
13365       printf("done\n");
13366     }
13367   }
13368 end_schema_xfer:
13369   sqlite3_finalize(pQuery);
13370   sqlite3_free(zQuery);
13371 }
13372 
13373 /*
13374 ** Open a new database file named "zNewDb".  Try to recover as much information
13375 ** as possible out of the main database (which might be corrupt) and write it
13376 ** into zNewDb.
13377 */
13378 static void tryToClone(ShellState *p, const char *zNewDb){
13379   int rc;
13380   sqlite3 *newDb = 0;
13381   if( access(zNewDb,0)==0 ){
13382     utf8_printf(stderr, "File \"%s\" already exists.\n", zNewDb);
13383     return;
13384   }
13385   rc = sqlite3_open(zNewDb, &newDb);
13386   if( rc ){
13387     utf8_printf(stderr, "Cannot create output database: %s\n",
13388             sqlite3_errmsg(newDb));
13389   }else{
13390     sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0);
13391     sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
13392     tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
13393     tryToCloneSchema(p, newDb, "type!='table'", 0);
13394     sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
13395     sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
13396   }
13397   close_db(newDb);
13398 }
13399 
13400 /*
13401 ** Change the output file back to stdout.
13402 **
13403 ** If the p->doXdgOpen flag is set, that means the output was being
13404 ** redirected to a temporary file named by p->zTempFile.  In that case,
13405 ** launch start/open/xdg-open on that temporary file.
13406 */
13407 static void output_reset(ShellState *p){
13408   if( p->outfile[0]=='|' ){
13409 #ifndef SQLITE_OMIT_POPEN
13410     pclose(p->out);
13411 #endif
13412   }else{
13413     output_file_close(p->out);
13414 #ifndef SQLITE_NOHAVE_SYSTEM
13415     if( p->doXdgOpen ){
13416       const char *zXdgOpenCmd =
13417 #if defined(_WIN32)
13418       "start";
13419 #elif defined(__APPLE__)
13420       "open";
13421 #else
13422       "xdg-open";
13423 #endif
13424       char *zCmd;
13425       zCmd = sqlite3_mprintf("%s %s", zXdgOpenCmd, p->zTempFile);
13426       if( system(zCmd) ){
13427         utf8_printf(stderr, "Failed: [%s]\n", zCmd);
13428       }
13429       sqlite3_free(zCmd);
13430       outputModePop(p);
13431       p->doXdgOpen = 0;
13432       sqlite3_sleep(100);
13433     }
13434 #endif /* !defined(SQLITE_NOHAVE_SYSTEM) */
13435   }
13436   p->outfile[0] = 0;
13437   p->out = stdout;
13438 }
13439 
13440 /*
13441 ** Run an SQL command and return the single integer result.
13442 */
13443 static int db_int(ShellState *p, const char *zSql){
13444   sqlite3_stmt *pStmt;
13445   int res = 0;
13446   sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
13447   if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){
13448     res = sqlite3_column_int(pStmt,0);
13449   }
13450   sqlite3_finalize(pStmt);
13451   return res;
13452 }
13453 
13454 /*
13455 ** Convert a 2-byte or 4-byte big-endian integer into a native integer
13456 */
13457 static unsigned int get2byteInt(unsigned char *a){
13458   return (a[0]<<8) + a[1];
13459 }
13460 static unsigned int get4byteInt(unsigned char *a){
13461   return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3];
13462 }
13463 
13464 /*
13465 ** Implementation of the ".info" command.
13466 **
13467 ** Return 1 on error, 2 to exit, and 0 otherwise.
13468 */
13469 static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){
13470   static const struct { const char *zName; int ofst; } aField[] = {
13471      { "file change counter:",  24  },
13472      { "database page count:",  28  },
13473      { "freelist page count:",  36  },
13474      { "schema cookie:",        40  },
13475      { "schema format:",        44  },
13476      { "default cache size:",   48  },
13477      { "autovacuum top root:",  52  },
13478      { "incremental vacuum:",   64  },
13479      { "text encoding:",        56  },
13480      { "user version:",         60  },
13481      { "application id:",       68  },
13482      { "software version:",     96  },
13483   };
13484   static const struct { const char *zName; const char *zSql; } aQuery[] = {
13485      { "number of tables:",
13486        "SELECT count(*) FROM %s WHERE type='table'" },
13487      { "number of indexes:",
13488        "SELECT count(*) FROM %s WHERE type='index'" },
13489      { "number of triggers:",
13490        "SELECT count(*) FROM %s WHERE type='trigger'" },
13491      { "number of views:",
13492        "SELECT count(*) FROM %s WHERE type='view'" },
13493      { "schema size:",
13494        "SELECT total(length(sql)) FROM %s" },
13495   };
13496   int i, rc;
13497   unsigned iDataVersion;
13498   char *zSchemaTab;
13499   char *zDb = nArg>=2 ? azArg[1] : "main";
13500   sqlite3_stmt *pStmt = 0;
13501   unsigned char aHdr[100];
13502   open_db(p, 0);
13503   if( p->db==0 ) return 1;
13504   rc = sqlite3_prepare_v2(p->db,
13505              "SELECT data FROM sqlite_dbpage(?1) WHERE pgno=1",
13506              -1, &pStmt, 0);
13507   if( rc ){
13508     if( !sqlite3_compileoption_used("ENABLE_DBPAGE_VTAB") ){
13509       utf8_printf(stderr, "the \".dbinfo\" command requires the "
13510                           "-DSQLITE_ENABLE_DBPAGE_VTAB compile-time options\n");
13511     }else{
13512       utf8_printf(stderr, "error: %s\n", sqlite3_errmsg(p->db));
13513     }
13514     sqlite3_finalize(pStmt);
13515     return 1;
13516   }
13517   sqlite3_bind_text(pStmt, 1, zDb, -1, SQLITE_STATIC);
13518   if( sqlite3_step(pStmt)==SQLITE_ROW
13519    && sqlite3_column_bytes(pStmt,0)>100
13520   ){
13521     memcpy(aHdr, sqlite3_column_blob(pStmt,0), 100);
13522     sqlite3_finalize(pStmt);
13523   }else{
13524     raw_printf(stderr, "unable to read database header\n");
13525     sqlite3_finalize(pStmt);
13526     return 1;
13527   }
13528   i = get2byteInt(aHdr+16);
13529   if( i==1 ) i = 65536;
13530   utf8_printf(p->out, "%-20s %d\n", "database page size:", i);
13531   utf8_printf(p->out, "%-20s %d\n", "write format:", aHdr[18]);
13532   utf8_printf(p->out, "%-20s %d\n", "read format:", aHdr[19]);
13533   utf8_printf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]);
13534   for(i=0; i<ArraySize(aField); i++){
13535     int ofst = aField[i].ofst;
13536     unsigned int val = get4byteInt(aHdr + ofst);
13537     utf8_printf(p->out, "%-20s %u", aField[i].zName, val);
13538     switch( ofst ){
13539       case 56: {
13540         if( val==1 ) raw_printf(p->out, " (utf8)");
13541         if( val==2 ) raw_printf(p->out, " (utf16le)");
13542         if( val==3 ) raw_printf(p->out, " (utf16be)");
13543       }
13544     }
13545     raw_printf(p->out, "\n");
13546   }
13547   if( zDb==0 ){
13548     zSchemaTab = sqlite3_mprintf("main.sqlite_master");
13549   }else if( strcmp(zDb,"temp")==0 ){
13550     zSchemaTab = sqlite3_mprintf("%s", "sqlite_temp_master");
13551   }else{
13552     zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_master", zDb);
13553   }
13554   for(i=0; i<ArraySize(aQuery); i++){
13555     char *zSql = sqlite3_mprintf(aQuery[i].zSql, zSchemaTab);
13556     int val = db_int(p, zSql);
13557     sqlite3_free(zSql);
13558     utf8_printf(p->out, "%-20s %d\n", aQuery[i].zName, val);
13559   }
13560   sqlite3_free(zSchemaTab);
13561   sqlite3_file_control(p->db, zDb, SQLITE_FCNTL_DATA_VERSION, &iDataVersion);
13562   utf8_printf(p->out, "%-20s %u\n", "data version", iDataVersion);
13563   return 0;
13564 }
13565 
13566 /*
13567 ** Print the current sqlite3_errmsg() value to stderr and return 1.
13568 */
13569 static int shellDatabaseError(sqlite3 *db){
13570   const char *zErr = sqlite3_errmsg(db);
13571   utf8_printf(stderr, "Error: %s\n", zErr);
13572   return 1;
13573 }
13574 
13575 /*
13576 ** Compare the pattern in zGlob[] against the text in z[].  Return TRUE
13577 ** if they match and FALSE (0) if they do not match.
13578 **
13579 ** Globbing rules:
13580 **
13581 **      '*'       Matches any sequence of zero or more characters.
13582 **
13583 **      '?'       Matches exactly one character.
13584 **
13585 **     [...]      Matches one character from the enclosed list of
13586 **                characters.
13587 **
13588 **     [^...]     Matches one character not in the enclosed list.
13589 **
13590 **      '#'       Matches any sequence of one or more digits with an
13591 **                optional + or - sign in front
13592 **
13593 **      ' '       Any span of whitespace matches any other span of
13594 **                whitespace.
13595 **
13596 ** Extra whitespace at the end of z[] is ignored.
13597 */
13598 static int testcase_glob(const char *zGlob, const char *z){
13599   int c, c2;
13600   int invert;
13601   int seen;
13602 
13603   while( (c = (*(zGlob++)))!=0 ){
13604     if( IsSpace(c) ){
13605       if( !IsSpace(*z) ) return 0;
13606       while( IsSpace(*zGlob) ) zGlob++;
13607       while( IsSpace(*z) ) z++;
13608     }else if( c=='*' ){
13609       while( (c=(*(zGlob++))) == '*' || c=='?' ){
13610         if( c=='?' && (*(z++))==0 ) return 0;
13611       }
13612       if( c==0 ){
13613         return 1;
13614       }else if( c=='[' ){
13615         while( *z && testcase_glob(zGlob-1,z)==0 ){
13616           z++;
13617         }
13618         return (*z)!=0;
13619       }
13620       while( (c2 = (*(z++)))!=0 ){
13621         while( c2!=c ){
13622           c2 = *(z++);
13623           if( c2==0 ) return 0;
13624         }
13625         if( testcase_glob(zGlob,z) ) return 1;
13626       }
13627       return 0;
13628     }else if( c=='?' ){
13629       if( (*(z++))==0 ) return 0;
13630     }else if( c=='[' ){
13631       int prior_c = 0;
13632       seen = 0;
13633       invert = 0;
13634       c = *(z++);
13635       if( c==0 ) return 0;
13636       c2 = *(zGlob++);
13637       if( c2=='^' ){
13638         invert = 1;
13639         c2 = *(zGlob++);
13640       }
13641       if( c2==']' ){
13642         if( c==']' ) seen = 1;
13643         c2 = *(zGlob++);
13644       }
13645       while( c2 && c2!=']' ){
13646         if( c2=='-' && zGlob[0]!=']' && zGlob[0]!=0 && prior_c>0 ){
13647           c2 = *(zGlob++);
13648           if( c>=prior_c && c<=c2 ) seen = 1;
13649           prior_c = 0;
13650         }else{
13651           if( c==c2 ){
13652             seen = 1;
13653           }
13654           prior_c = c2;
13655         }
13656         c2 = *(zGlob++);
13657       }
13658       if( c2==0 || (seen ^ invert)==0 ) return 0;
13659     }else if( c=='#' ){
13660       if( (z[0]=='-' || z[0]=='+') && IsDigit(z[1]) ) z++;
13661       if( !IsDigit(z[0]) ) return 0;
13662       z++;
13663       while( IsDigit(z[0]) ){ z++; }
13664     }else{
13665       if( c!=(*(z++)) ) return 0;
13666     }
13667   }
13668   while( IsSpace(*z) ){ z++; }
13669   return *z==0;
13670 }
13671 
13672 
13673 /*
13674 ** Compare the string as a command-line option with either one or two
13675 ** initial "-" characters.
13676 */
13677 static int optionMatch(const char *zStr, const char *zOpt){
13678   if( zStr[0]!='-' ) return 0;
13679   zStr++;
13680   if( zStr[0]=='-' ) zStr++;
13681   return strcmp(zStr, zOpt)==0;
13682 }
13683 
13684 /*
13685 ** Delete a file.
13686 */
13687 int shellDeleteFile(const char *zFilename){
13688   int rc;
13689 #ifdef _WIN32
13690   wchar_t *z = sqlite3_win32_utf8_to_unicode(zFilename);
13691   rc = _wunlink(z);
13692   sqlite3_free(z);
13693 #else
13694   rc = unlink(zFilename);
13695 #endif
13696   return rc;
13697 }
13698 
13699 /*
13700 ** Try to delete the temporary file (if there is one) and free the
13701 ** memory used to hold the name of the temp file.
13702 */
13703 static void clearTempFile(ShellState *p){
13704   if( p->zTempFile==0 ) return;
13705   if( p->doXdgOpen ) return;
13706   if( shellDeleteFile(p->zTempFile) ) return;
13707   sqlite3_free(p->zTempFile);
13708   p->zTempFile = 0;
13709 }
13710 
13711 /*
13712 ** Create a new temp file name with the given suffix.
13713 */
13714 static void newTempFile(ShellState *p, const char *zSuffix){
13715   clearTempFile(p);
13716   sqlite3_free(p->zTempFile);
13717   p->zTempFile = 0;
13718   if( p->db ){
13719     sqlite3_file_control(p->db, 0, SQLITE_FCNTL_TEMPFILENAME, &p->zTempFile);
13720   }
13721   if( p->zTempFile==0 ){
13722     sqlite3_uint64 r;
13723     sqlite3_randomness(sizeof(r), &r);
13724     p->zTempFile = sqlite3_mprintf("temp%llx.%s", r, zSuffix);
13725   }else{
13726     p->zTempFile = sqlite3_mprintf("%z.%s", p->zTempFile, zSuffix);
13727   }
13728   if( p->zTempFile==0 ){
13729     raw_printf(stderr, "out of memory\n");
13730     exit(1);
13731   }
13732 }
13733 
13734 
13735 /*
13736 ** The implementation of SQL scalar function fkey_collate_clause(), used
13737 ** by the ".lint fkey-indexes" command. This scalar function is always
13738 ** called with four arguments - the parent table name, the parent column name,
13739 ** the child table name and the child column name.
13740 **
13741 **   fkey_collate_clause('parent-tab', 'parent-col', 'child-tab', 'child-col')
13742 **
13743 ** If either of the named tables or columns do not exist, this function
13744 ** returns an empty string. An empty string is also returned if both tables
13745 ** and columns exist but have the same default collation sequence. Or,
13746 ** if both exist but the default collation sequences are different, this
13747 ** function returns the string " COLLATE <parent-collation>", where
13748 ** <parent-collation> is the default collation sequence of the parent column.
13749 */
13750 static void shellFkeyCollateClause(
13751   sqlite3_context *pCtx,
13752   int nVal,
13753   sqlite3_value **apVal
13754 ){
13755   sqlite3 *db = sqlite3_context_db_handle(pCtx);
13756   const char *zParent;
13757   const char *zParentCol;
13758   const char *zParentSeq;
13759   const char *zChild;
13760   const char *zChildCol;
13761   const char *zChildSeq = 0;  /* Initialize to avoid false-positive warning */
13762   int rc;
13763 
13764   assert( nVal==4 );
13765   zParent = (const char*)sqlite3_value_text(apVal[0]);
13766   zParentCol = (const char*)sqlite3_value_text(apVal[1]);
13767   zChild = (const char*)sqlite3_value_text(apVal[2]);
13768   zChildCol = (const char*)sqlite3_value_text(apVal[3]);
13769 
13770   sqlite3_result_text(pCtx, "", -1, SQLITE_STATIC);
13771   rc = sqlite3_table_column_metadata(
13772       db, "main", zParent, zParentCol, 0, &zParentSeq, 0, 0, 0
13773   );
13774   if( rc==SQLITE_OK ){
13775     rc = sqlite3_table_column_metadata(
13776         db, "main", zChild, zChildCol, 0, &zChildSeq, 0, 0, 0
13777     );
13778   }
13779 
13780   if( rc==SQLITE_OK && sqlite3_stricmp(zParentSeq, zChildSeq) ){
13781     char *z = sqlite3_mprintf(" COLLATE %s", zParentSeq);
13782     sqlite3_result_text(pCtx, z, -1, SQLITE_TRANSIENT);
13783     sqlite3_free(z);
13784   }
13785 }
13786 
13787 
13788 /*
13789 ** The implementation of dot-command ".lint fkey-indexes".
13790 */
13791 static int lintFkeyIndexes(
13792   ShellState *pState,             /* Current shell tool state */
13793   char **azArg,                   /* Array of arguments passed to dot command */
13794   int nArg                        /* Number of entries in azArg[] */
13795 ){
13796   sqlite3 *db = pState->db;       /* Database handle to query "main" db of */
13797   FILE *out = pState->out;        /* Stream to write non-error output to */
13798   int bVerbose = 0;               /* If -verbose is present */
13799   int bGroupByParent = 0;         /* If -groupbyparent is present */
13800   int i;                          /* To iterate through azArg[] */
13801   const char *zIndent = "";       /* How much to indent CREATE INDEX by */
13802   int rc;                         /* Return code */
13803   sqlite3_stmt *pSql = 0;         /* Compiled version of SQL statement below */
13804 
13805   /*
13806   ** This SELECT statement returns one row for each foreign key constraint
13807   ** in the schema of the main database. The column values are:
13808   **
13809   ** 0. The text of an SQL statement similar to:
13810   **
13811   **      "EXPLAIN QUERY PLAN SELECT 1 FROM child_table WHERE child_key=?"
13812   **
13813   **    This SELECT is similar to the one that the foreign keys implementation
13814   **    needs to run internally on child tables. If there is an index that can
13815   **    be used to optimize this query, then it can also be used by the FK
13816   **    implementation to optimize DELETE or UPDATE statements on the parent
13817   **    table.
13818   **
13819   ** 1. A GLOB pattern suitable for sqlite3_strglob(). If the plan output by
13820   **    the EXPLAIN QUERY PLAN command matches this pattern, then the schema
13821   **    contains an index that can be used to optimize the query.
13822   **
13823   ** 2. Human readable text that describes the child table and columns. e.g.
13824   **
13825   **       "child_table(child_key1, child_key2)"
13826   **
13827   ** 3. Human readable text that describes the parent table and columns. e.g.
13828   **
13829   **       "parent_table(parent_key1, parent_key2)"
13830   **
13831   ** 4. A full CREATE INDEX statement for an index that could be used to
13832   **    optimize DELETE or UPDATE statements on the parent table. e.g.
13833   **
13834   **       "CREATE INDEX child_table_child_key ON child_table(child_key)"
13835   **
13836   ** 5. The name of the parent table.
13837   **
13838   ** These six values are used by the C logic below to generate the report.
13839   */
13840   const char *zSql =
13841   "SELECT "
13842     "     'EXPLAIN QUERY PLAN SELECT 1 FROM ' || quote(s.name) || ' WHERE '"
13843     "  || group_concat(quote(s.name) || '.' || quote(f.[from]) || '=?' "
13844     "  || fkey_collate_clause("
13845     "       f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]),' AND ')"
13846     ", "
13847     "     'SEARCH TABLE ' || s.name || ' USING COVERING INDEX*('"
13848     "  || group_concat('*=?', ' AND ') || ')'"
13849     ", "
13850     "     s.name  || '(' || group_concat(f.[from],  ', ') || ')'"
13851     ", "
13852     "     f.[table] || '(' || group_concat(COALESCE(f.[to], p.[name])) || ')'"
13853     ", "
13854     "     'CREATE INDEX ' || quote(s.name ||'_'|| group_concat(f.[from], '_'))"
13855     "  || ' ON ' || quote(s.name) || '('"
13856     "  || group_concat(quote(f.[from]) ||"
13857     "        fkey_collate_clause("
13858     "          f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]), ', ')"
13859     "  || ');'"
13860     ", "
13861     "     f.[table] "
13862     "FROM sqlite_master AS s, pragma_foreign_key_list(s.name) AS f "
13863     "LEFT JOIN pragma_table_info AS p ON (pk-1=seq AND p.arg=f.[table]) "
13864     "GROUP BY s.name, f.id "
13865     "ORDER BY (CASE WHEN ? THEN f.[table] ELSE s.name END)"
13866   ;
13867   const char *zGlobIPK = "SEARCH TABLE * USING INTEGER PRIMARY KEY (rowid=?)";
13868 
13869   for(i=2; i<nArg; i++){
13870     int n = strlen30(azArg[i]);
13871     if( n>1 && sqlite3_strnicmp("-verbose", azArg[i], n)==0 ){
13872       bVerbose = 1;
13873     }
13874     else if( n>1 && sqlite3_strnicmp("-groupbyparent", azArg[i], n)==0 ){
13875       bGroupByParent = 1;
13876       zIndent = "    ";
13877     }
13878     else{
13879       raw_printf(stderr, "Usage: %s %s ?-verbose? ?-groupbyparent?\n",
13880           azArg[0], azArg[1]
13881       );
13882       return SQLITE_ERROR;
13883     }
13884   }
13885 
13886   /* Register the fkey_collate_clause() SQL function */
13887   rc = sqlite3_create_function(db, "fkey_collate_clause", 4, SQLITE_UTF8,
13888       0, shellFkeyCollateClause, 0, 0
13889   );
13890 
13891 
13892   if( rc==SQLITE_OK ){
13893     rc = sqlite3_prepare_v2(db, zSql, -1, &pSql, 0);
13894   }
13895   if( rc==SQLITE_OK ){
13896     sqlite3_bind_int(pSql, 1, bGroupByParent);
13897   }
13898 
13899   if( rc==SQLITE_OK ){
13900     int rc2;
13901     char *zPrev = 0;
13902     while( SQLITE_ROW==sqlite3_step(pSql) ){
13903       int res = -1;
13904       sqlite3_stmt *pExplain = 0;
13905       const char *zEQP = (const char*)sqlite3_column_text(pSql, 0);
13906       const char *zGlob = (const char*)sqlite3_column_text(pSql, 1);
13907       const char *zFrom = (const char*)sqlite3_column_text(pSql, 2);
13908       const char *zTarget = (const char*)sqlite3_column_text(pSql, 3);
13909       const char *zCI = (const char*)sqlite3_column_text(pSql, 4);
13910       const char *zParent = (const char*)sqlite3_column_text(pSql, 5);
13911 
13912       rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
13913       if( rc!=SQLITE_OK ) break;
13914       if( SQLITE_ROW==sqlite3_step(pExplain) ){
13915         const char *zPlan = (const char*)sqlite3_column_text(pExplain, 3);
13916         res = (
13917               0==sqlite3_strglob(zGlob, zPlan)
13918            || 0==sqlite3_strglob(zGlobIPK, zPlan)
13919         );
13920       }
13921       rc = sqlite3_finalize(pExplain);
13922       if( rc!=SQLITE_OK ) break;
13923 
13924       if( res<0 ){
13925         raw_printf(stderr, "Error: internal error");
13926         break;
13927       }else{
13928         if( bGroupByParent
13929         && (bVerbose || res==0)
13930         && (zPrev==0 || sqlite3_stricmp(zParent, zPrev))
13931         ){
13932           raw_printf(out, "-- Parent table %s\n", zParent);
13933           sqlite3_free(zPrev);
13934           zPrev = sqlite3_mprintf("%s", zParent);
13935         }
13936 
13937         if( res==0 ){
13938           raw_printf(out, "%s%s --> %s\n", zIndent, zCI, zTarget);
13939         }else if( bVerbose ){
13940           raw_printf(out, "%s/* no extra indexes required for %s -> %s */\n",
13941               zIndent, zFrom, zTarget
13942           );
13943         }
13944       }
13945     }
13946     sqlite3_free(zPrev);
13947 
13948     if( rc!=SQLITE_OK ){
13949       raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
13950     }
13951 
13952     rc2 = sqlite3_finalize(pSql);
13953     if( rc==SQLITE_OK && rc2!=SQLITE_OK ){
13954       rc = rc2;
13955       raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
13956     }
13957   }else{
13958     raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
13959   }
13960 
13961   return rc;
13962 }
13963 
13964 /*
13965 ** Implementation of ".lint" dot command.
13966 */
13967 static int lintDotCommand(
13968   ShellState *pState,             /* Current shell tool state */
13969   char **azArg,                   /* Array of arguments passed to dot command */
13970   int nArg                        /* Number of entries in azArg[] */
13971 ){
13972   int n;
13973   n = (nArg>=2 ? strlen30(azArg[1]) : 0);
13974   if( n<1 || sqlite3_strnicmp(azArg[1], "fkey-indexes", n) ) goto usage;
13975   return lintFkeyIndexes(pState, azArg, nArg);
13976 
13977  usage:
13978   raw_printf(stderr, "Usage %s sub-command ?switches...?\n", azArg[0]);
13979   raw_printf(stderr, "Where sub-commands are:\n");
13980   raw_printf(stderr, "    fkey-indexes\n");
13981   return SQLITE_ERROR;
13982 }
13983 
13984 #if !defined SQLITE_OMIT_VIRTUALTABLE
13985 static void shellPrepare(
13986   sqlite3 *db,
13987   int *pRc,
13988   const char *zSql,
13989   sqlite3_stmt **ppStmt
13990 ){
13991   *ppStmt = 0;
13992   if( *pRc==SQLITE_OK ){
13993     int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0);
13994     if( rc!=SQLITE_OK ){
13995       raw_printf(stderr, "sql error: %s (%d)\n",
13996           sqlite3_errmsg(db), sqlite3_errcode(db)
13997       );
13998       *pRc = rc;
13999     }
14000   }
14001 }
14002 
14003 /*
14004 ** Create a prepared statement using printf-style arguments for the SQL.
14005 **
14006 ** This routine is could be marked "static".  But it is not always used,
14007 ** depending on compile-time options.  By omitting the "static", we avoid
14008 ** nuisance compiler warnings about "defined but not used".
14009 */
14010 void shellPreparePrintf(
14011   sqlite3 *db,
14012   int *pRc,
14013   sqlite3_stmt **ppStmt,
14014   const char *zFmt,
14015   ...
14016 ){
14017   *ppStmt = 0;
14018   if( *pRc==SQLITE_OK ){
14019     va_list ap;
14020     char *z;
14021     va_start(ap, zFmt);
14022     z = sqlite3_vmprintf(zFmt, ap);
14023     va_end(ap);
14024     if( z==0 ){
14025       *pRc = SQLITE_NOMEM;
14026     }else{
14027       shellPrepare(db, pRc, z, ppStmt);
14028       sqlite3_free(z);
14029     }
14030   }
14031 }
14032 
14033 /* Finalize the prepared statement created using shellPreparePrintf().
14034 **
14035 ** This routine is could be marked "static".  But it is not always used,
14036 ** depending on compile-time options.  By omitting the "static", we avoid
14037 ** nuisance compiler warnings about "defined but not used".
14038 */
14039 void shellFinalize(
14040   int *pRc,
14041   sqlite3_stmt *pStmt
14042 ){
14043   if( pStmt ){
14044     sqlite3 *db = sqlite3_db_handle(pStmt);
14045     int rc = sqlite3_finalize(pStmt);
14046     if( *pRc==SQLITE_OK ){
14047       if( rc!=SQLITE_OK ){
14048         raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));
14049       }
14050       *pRc = rc;
14051     }
14052   }
14053 }
14054 
14055 /* Reset the prepared statement created using shellPreparePrintf().
14056 **
14057 ** This routine is could be marked "static".  But it is not always used,
14058 ** depending on compile-time options.  By omitting the "static", we avoid
14059 ** nuisance compiler warnings about "defined but not used".
14060 */
14061 void shellReset(
14062   int *pRc,
14063   sqlite3_stmt *pStmt
14064 ){
14065   int rc = sqlite3_reset(pStmt);
14066   if( *pRc==SQLITE_OK ){
14067     if( rc!=SQLITE_OK ){
14068       sqlite3 *db = sqlite3_db_handle(pStmt);
14069       raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));
14070     }
14071     *pRc = rc;
14072   }
14073 }
14074 #endif /* !defined SQLITE_OMIT_VIRTUALTABLE */
14075 
14076 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
14077 /******************************************************************************
14078 ** The ".archive" or ".ar" command.
14079 */
14080 /*
14081 ** Structure representing a single ".ar" command.
14082 */
14083 typedef struct ArCommand ArCommand;
14084 struct ArCommand {
14085   u8 eCmd;                        /* An AR_CMD_* value */
14086   u8 bVerbose;                    /* True if --verbose */
14087   u8 bZip;                        /* True if the archive is a ZIP */
14088   u8 bDryRun;                     /* True if --dry-run */
14089   u8 bAppend;                     /* True if --append */
14090   u8 fromCmdLine;                 /* Run from -A instead of .archive */
14091   int nArg;                       /* Number of command arguments */
14092   char *zSrcTable;                /* "sqlar", "zipfile($file)" or "zip" */
14093   const char *zFile;              /* --file argument, or NULL */
14094   const char *zDir;               /* --directory argument, or NULL */
14095   char **azArg;                   /* Array of command arguments */
14096   ShellState *p;                  /* Shell state */
14097   sqlite3 *db;                    /* Database containing the archive */
14098 };
14099 
14100 /*
14101 ** Print a usage message for the .ar command to stderr and return SQLITE_ERROR.
14102 */
14103 static int arUsage(FILE *f){
14104   showHelp(f,"archive");
14105   return SQLITE_ERROR;
14106 }
14107 
14108 /*
14109 ** Print an error message for the .ar command to stderr and return
14110 ** SQLITE_ERROR.
14111 */
14112 static int arErrorMsg(ArCommand *pAr, const char *zFmt, ...){
14113   va_list ap;
14114   char *z;
14115   va_start(ap, zFmt);
14116   z = sqlite3_vmprintf(zFmt, ap);
14117   va_end(ap);
14118   utf8_printf(stderr, "Error: %s\n", z);
14119   if( pAr->fromCmdLine ){
14120     utf8_printf(stderr, "Use \"-A\" for more help\n");
14121   }else{
14122     utf8_printf(stderr, "Use \".archive --help\" for more help\n");
14123   }
14124   sqlite3_free(z);
14125   return SQLITE_ERROR;
14126 }
14127 
14128 /*
14129 ** Values for ArCommand.eCmd.
14130 */
14131 #define AR_CMD_CREATE       1
14132 #define AR_CMD_UPDATE       2
14133 #define AR_CMD_INSERT       3
14134 #define AR_CMD_EXTRACT      4
14135 #define AR_CMD_LIST         5
14136 #define AR_CMD_HELP         6
14137 
14138 /*
14139 ** Other (non-command) switches.
14140 */
14141 #define AR_SWITCH_VERBOSE     7
14142 #define AR_SWITCH_FILE        8
14143 #define AR_SWITCH_DIRECTORY   9
14144 #define AR_SWITCH_APPEND     10
14145 #define AR_SWITCH_DRYRUN     11
14146 
14147 static int arProcessSwitch(ArCommand *pAr, int eSwitch, const char *zArg){
14148   switch( eSwitch ){
14149     case AR_CMD_CREATE:
14150     case AR_CMD_EXTRACT:
14151     case AR_CMD_LIST:
14152     case AR_CMD_UPDATE:
14153     case AR_CMD_INSERT:
14154     case AR_CMD_HELP:
14155       if( pAr->eCmd ){
14156         return arErrorMsg(pAr, "multiple command options");
14157       }
14158       pAr->eCmd = eSwitch;
14159       break;
14160 
14161     case AR_SWITCH_DRYRUN:
14162       pAr->bDryRun = 1;
14163       break;
14164     case AR_SWITCH_VERBOSE:
14165       pAr->bVerbose = 1;
14166       break;
14167     case AR_SWITCH_APPEND:
14168       pAr->bAppend = 1;
14169       /* Fall thru into --file */
14170     case AR_SWITCH_FILE:
14171       pAr->zFile = zArg;
14172       break;
14173     case AR_SWITCH_DIRECTORY:
14174       pAr->zDir = zArg;
14175       break;
14176   }
14177 
14178   return SQLITE_OK;
14179 }
14180 
14181 /*
14182 ** Parse the command line for an ".ar" command. The results are written into
14183 ** structure (*pAr). SQLITE_OK is returned if the command line is parsed
14184 ** successfully, otherwise an error message is written to stderr and
14185 ** SQLITE_ERROR returned.
14186 */
14187 static int arParseCommand(
14188   char **azArg,                   /* Array of arguments passed to dot command */
14189   int nArg,                       /* Number of entries in azArg[] */
14190   ArCommand *pAr                  /* Populate this object */
14191 ){
14192   struct ArSwitch {
14193     const char *zLong;
14194     char cShort;
14195     u8 eSwitch;
14196     u8 bArg;
14197   } aSwitch[] = {
14198     { "create",    'c', AR_CMD_CREATE,       0 },
14199     { "extract",   'x', AR_CMD_EXTRACT,      0 },
14200     { "insert",    'i', AR_CMD_INSERT,       0 },
14201     { "list",      't', AR_CMD_LIST,         0 },
14202     { "update",    'u', AR_CMD_UPDATE,       0 },
14203     { "help",      'h', AR_CMD_HELP,         0 },
14204     { "verbose",   'v', AR_SWITCH_VERBOSE,   0 },
14205     { "file",      'f', AR_SWITCH_FILE,      1 },
14206     { "append",    'a', AR_SWITCH_APPEND,    1 },
14207     { "directory", 'C', AR_SWITCH_DIRECTORY, 1 },
14208     { "dryrun",    'n', AR_SWITCH_DRYRUN,    0 },
14209   };
14210   int nSwitch = sizeof(aSwitch) / sizeof(struct ArSwitch);
14211   struct ArSwitch *pEnd = &aSwitch[nSwitch];
14212 
14213   if( nArg<=1 ){
14214     utf8_printf(stderr, "Wrong number of arguments.  Usage:\n");
14215     return arUsage(stderr);
14216   }else{
14217     char *z = azArg[1];
14218     if( z[0]!='-' ){
14219       /* Traditional style [tar] invocation */
14220       int i;
14221       int iArg = 2;
14222       for(i=0; z[i]; i++){
14223         const char *zArg = 0;
14224         struct ArSwitch *pOpt;
14225         for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
14226           if( z[i]==pOpt->cShort ) break;
14227         }
14228         if( pOpt==pEnd ){
14229           return arErrorMsg(pAr, "unrecognized option: %c", z[i]);
14230         }
14231         if( pOpt->bArg ){
14232           if( iArg>=nArg ){
14233             return arErrorMsg(pAr, "option requires an argument: %c",z[i]);
14234           }
14235           zArg = azArg[iArg++];
14236         }
14237         if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR;
14238       }
14239       pAr->nArg = nArg-iArg;
14240       if( pAr->nArg>0 ){
14241         pAr->azArg = &azArg[iArg];
14242       }
14243     }else{
14244       /* Non-traditional invocation */
14245       int iArg;
14246       for(iArg=1; iArg<nArg; iArg++){
14247         int n;
14248         z = azArg[iArg];
14249         if( z[0]!='-' ){
14250           /* All remaining command line words are command arguments. */
14251           pAr->azArg = &azArg[iArg];
14252           pAr->nArg = nArg-iArg;
14253           break;
14254         }
14255         n = strlen30(z);
14256 
14257         if( z[1]!='-' ){
14258           int i;
14259           /* One or more short options */
14260           for(i=1; i<n; i++){
14261             const char *zArg = 0;
14262             struct ArSwitch *pOpt;
14263             for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
14264               if( z[i]==pOpt->cShort ) break;
14265             }
14266             if( pOpt==pEnd ){
14267               return arErrorMsg(pAr, "unrecognized option: %c", z[i]);
14268             }
14269             if( pOpt->bArg ){
14270               if( i<(n-1) ){
14271                 zArg = &z[i+1];
14272                 i = n;
14273               }else{
14274                 if( iArg>=(nArg-1) ){
14275                   return arErrorMsg(pAr, "option requires an argument: %c",
14276                                     z[i]);
14277                 }
14278                 zArg = azArg[++iArg];
14279               }
14280             }
14281             if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR;
14282           }
14283         }else if( z[2]=='\0' ){
14284           /* A -- option, indicating that all remaining command line words
14285           ** are command arguments.  */
14286           pAr->azArg = &azArg[iArg+1];
14287           pAr->nArg = nArg-iArg-1;
14288           break;
14289         }else{
14290           /* A long option */
14291           const char *zArg = 0;             /* Argument for option, if any */
14292           struct ArSwitch *pMatch = 0;      /* Matching option */
14293           struct ArSwitch *pOpt;            /* Iterator */
14294           for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
14295             const char *zLong = pOpt->zLong;
14296             if( (n-2)<=strlen30(zLong) && 0==memcmp(&z[2], zLong, n-2) ){
14297               if( pMatch ){
14298                 return arErrorMsg(pAr, "ambiguous option: %s",z);
14299               }else{
14300                 pMatch = pOpt;
14301               }
14302             }
14303           }
14304 
14305           if( pMatch==0 ){
14306             return arErrorMsg(pAr, "unrecognized option: %s", z);
14307           }
14308           if( pMatch->bArg ){
14309             if( iArg>=(nArg-1) ){
14310               return arErrorMsg(pAr, "option requires an argument: %s", z);
14311             }
14312             zArg = azArg[++iArg];
14313           }
14314           if( arProcessSwitch(pAr, pMatch->eSwitch, zArg) ) return SQLITE_ERROR;
14315         }
14316       }
14317     }
14318   }
14319 
14320   return SQLITE_OK;
14321 }
14322 
14323 /*
14324 ** This function assumes that all arguments within the ArCommand.azArg[]
14325 ** array refer to archive members, as for the --extract or --list commands.
14326 ** It checks that each of them are present. If any specified file is not
14327 ** present in the archive, an error is printed to stderr and an error
14328 ** code returned. Otherwise, if all specified arguments are present in
14329 ** the archive, SQLITE_OK is returned.
14330 **
14331 ** This function strips any trailing '/' characters from each argument.
14332 ** This is consistent with the way the [tar] command seems to work on
14333 ** Linux.
14334 */
14335 static int arCheckEntries(ArCommand *pAr){
14336   int rc = SQLITE_OK;
14337   if( pAr->nArg ){
14338     int i, j;
14339     sqlite3_stmt *pTest = 0;
14340 
14341     shellPreparePrintf(pAr->db, &rc, &pTest,
14342         "SELECT name FROM %s WHERE name=$name",
14343         pAr->zSrcTable
14344     );
14345     j = sqlite3_bind_parameter_index(pTest, "$name");
14346     for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){
14347       char *z = pAr->azArg[i];
14348       int n = strlen30(z);
14349       int bOk = 0;
14350       while( n>0 && z[n-1]=='/' ) n--;
14351       z[n] = '\0';
14352       sqlite3_bind_text(pTest, j, z, -1, SQLITE_STATIC);
14353       if( SQLITE_ROW==sqlite3_step(pTest) ){
14354         bOk = 1;
14355       }
14356       shellReset(&rc, pTest);
14357       if( rc==SQLITE_OK && bOk==0 ){
14358         utf8_printf(stderr, "not found in archive: %s\n", z);
14359         rc = SQLITE_ERROR;
14360       }
14361     }
14362     shellFinalize(&rc, pTest);
14363   }
14364   return rc;
14365 }
14366 
14367 /*
14368 ** Format a WHERE clause that can be used against the "sqlar" table to
14369 ** identify all archive members that match the command arguments held
14370 ** in (*pAr). Leave this WHERE clause in (*pzWhere) before returning.
14371 ** The caller is responsible for eventually calling sqlite3_free() on
14372 ** any non-NULL (*pzWhere) value.
14373 */
14374 static void arWhereClause(
14375   int *pRc,
14376   ArCommand *pAr,
14377   char **pzWhere                  /* OUT: New WHERE clause */
14378 ){
14379   char *zWhere = 0;
14380   if( *pRc==SQLITE_OK ){
14381     if( pAr->nArg==0 ){
14382       zWhere = sqlite3_mprintf("1");
14383     }else{
14384       int i;
14385       const char *zSep = "";
14386       for(i=0; i<pAr->nArg; i++){
14387         const char *z = pAr->azArg[i];
14388         zWhere = sqlite3_mprintf(
14389           "%z%s name = '%q' OR substr(name,1,%d) = '%q/'",
14390           zWhere, zSep, z, strlen30(z)+1, z
14391         );
14392         if( zWhere==0 ){
14393           *pRc = SQLITE_NOMEM;
14394           break;
14395         }
14396         zSep = " OR ";
14397       }
14398     }
14399   }
14400   *pzWhere = zWhere;
14401 }
14402 
14403 /*
14404 ** Implementation of .ar "lisT" command.
14405 */
14406 static int arListCommand(ArCommand *pAr){
14407   const char *zSql = "SELECT %s FROM %s WHERE %s";
14408   const char *azCols[] = {
14409     "name",
14410     "lsmode(mode), sz, datetime(mtime, 'unixepoch'), name"
14411   };
14412 
14413   char *zWhere = 0;
14414   sqlite3_stmt *pSql = 0;
14415   int rc;
14416 
14417   rc = arCheckEntries(pAr);
14418   arWhereClause(&rc, pAr, &zWhere);
14419 
14420   shellPreparePrintf(pAr->db, &rc, &pSql, zSql, azCols[pAr->bVerbose],
14421                      pAr->zSrcTable, zWhere);
14422   if( pAr->bDryRun ){
14423     utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql));
14424   }else{
14425     while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
14426       if( pAr->bVerbose ){
14427         utf8_printf(pAr->p->out, "%s % 10d  %s  %s\n",
14428             sqlite3_column_text(pSql, 0),
14429             sqlite3_column_int(pSql, 1),
14430             sqlite3_column_text(pSql, 2),
14431             sqlite3_column_text(pSql, 3)
14432         );
14433       }else{
14434         utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0));
14435       }
14436     }
14437   }
14438   shellFinalize(&rc, pSql);
14439   sqlite3_free(zWhere);
14440   return rc;
14441 }
14442 
14443 
14444 /*
14445 ** Implementation of .ar "eXtract" command.
14446 */
14447 static int arExtractCommand(ArCommand *pAr){
14448   const char *zSql1 =
14449     "SELECT "
14450     " ($dir || name),"
14451     " writefile(($dir || name), %s, mode, mtime) "
14452     "FROM %s WHERE (%s) AND (data IS NULL OR $dirOnly = 0)"
14453     " AND name NOT GLOB '*..[/\\]*'";
14454 
14455   const char *azExtraArg[] = {
14456     "sqlar_uncompress(data, sz)",
14457     "data"
14458   };
14459 
14460   sqlite3_stmt *pSql = 0;
14461   int rc = SQLITE_OK;
14462   char *zDir = 0;
14463   char *zWhere = 0;
14464   int i, j;
14465 
14466   /* If arguments are specified, check that they actually exist within
14467   ** the archive before proceeding. And formulate a WHERE clause to
14468   ** match them.  */
14469   rc = arCheckEntries(pAr);
14470   arWhereClause(&rc, pAr, &zWhere);
14471 
14472   if( rc==SQLITE_OK ){
14473     if( pAr->zDir ){
14474       zDir = sqlite3_mprintf("%s/", pAr->zDir);
14475     }else{
14476       zDir = sqlite3_mprintf("");
14477     }
14478     if( zDir==0 ) rc = SQLITE_NOMEM;
14479   }
14480 
14481   shellPreparePrintf(pAr->db, &rc, &pSql, zSql1,
14482       azExtraArg[pAr->bZip], pAr->zSrcTable, zWhere
14483   );
14484 
14485   if( rc==SQLITE_OK ){
14486     j = sqlite3_bind_parameter_index(pSql, "$dir");
14487     sqlite3_bind_text(pSql, j, zDir, -1, SQLITE_STATIC);
14488 
14489     /* Run the SELECT statement twice. The first time, writefile() is called
14490     ** for all archive members that should be extracted. The second time,
14491     ** only for the directories. This is because the timestamps for
14492     ** extracted directories must be reset after they are populated (as
14493     ** populating them changes the timestamp).  */
14494     for(i=0; i<2; i++){
14495       j = sqlite3_bind_parameter_index(pSql, "$dirOnly");
14496       sqlite3_bind_int(pSql, j, i);
14497       if( pAr->bDryRun ){
14498         utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql));
14499       }else{
14500         while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
14501           if( i==0 && pAr->bVerbose ){
14502             utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0));
14503           }
14504         }
14505       }
14506       shellReset(&rc, pSql);
14507     }
14508     shellFinalize(&rc, pSql);
14509   }
14510 
14511   sqlite3_free(zDir);
14512   sqlite3_free(zWhere);
14513   return rc;
14514 }
14515 
14516 /*
14517 ** Run the SQL statement in zSql.  Or if doing a --dryrun, merely print it out.
14518 */
14519 static int arExecSql(ArCommand *pAr, const char *zSql){
14520   int rc;
14521   if( pAr->bDryRun ){
14522     utf8_printf(pAr->p->out, "%s\n", zSql);
14523     rc = SQLITE_OK;
14524   }else{
14525     char *zErr = 0;
14526     rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr);
14527     if( zErr ){
14528       utf8_printf(stdout, "ERROR: %s\n", zErr);
14529       sqlite3_free(zErr);
14530     }
14531   }
14532   return rc;
14533 }
14534 
14535 
14536 /*
14537 ** Implementation of .ar "create", "insert", and "update" commands.
14538 **
14539 **     create    ->     Create a new SQL archive
14540 **     insert    ->     Insert or reinsert all files listed
14541 **     update    ->     Insert files that have changed or that were not
14542 **                      previously in the archive
14543 **
14544 ** Create the "sqlar" table in the database if it does not already exist.
14545 ** Then add each file in the azFile[] array to the archive. Directories
14546 ** are added recursively. If argument bVerbose is non-zero, a message is
14547 ** printed on stdout for each file archived.
14548 **
14549 ** The create command is the same as update, except that it drops
14550 ** any existing "sqlar" table before beginning.  The "insert" command
14551 ** always overwrites every file named on the command-line, where as
14552 ** "update" only overwrites if the size or mtime or mode has changed.
14553 */
14554 static int arCreateOrUpdateCommand(
14555   ArCommand *pAr,                 /* Command arguments and options */
14556   int bUpdate,                    /* true for a --create. */
14557   int bOnlyIfChanged              /* Only update if file has changed */
14558 ){
14559   const char *zCreate =
14560       "CREATE TABLE IF NOT EXISTS sqlar(\n"
14561       "  name TEXT PRIMARY KEY,  -- name of the file\n"
14562       "  mode INT,               -- access permissions\n"
14563       "  mtime INT,              -- last modification time\n"
14564       "  sz INT,                 -- original file size\n"
14565       "  data BLOB               -- compressed content\n"
14566       ")";
14567   const char *zDrop = "DROP TABLE IF EXISTS sqlar";
14568   const char *zInsertFmt[2] = {
14569      "REPLACE INTO %s(name,mode,mtime,sz,data)\n"
14570      "  SELECT\n"
14571      "    %s,\n"
14572      "    mode,\n"
14573      "    mtime,\n"
14574      "    CASE substr(lsmode(mode),1,1)\n"
14575      "      WHEN '-' THEN length(data)\n"
14576      "      WHEN 'd' THEN 0\n"
14577      "      ELSE -1 END,\n"
14578      "    sqlar_compress(data)\n"
14579      "  FROM fsdir(%Q,%Q) AS disk\n"
14580      "  WHERE lsmode(mode) NOT LIKE '?%%'%s;"
14581      ,
14582      "REPLACE INTO %s(name,mode,mtime,data)\n"
14583      "  SELECT\n"
14584      "    %s,\n"
14585      "    mode,\n"
14586      "    mtime,\n"
14587      "    data\n"
14588      "  FROM fsdir(%Q,%Q) AS disk\n"
14589      "  WHERE lsmode(mode) NOT LIKE '?%%'%s;"
14590   };
14591   int i;                          /* For iterating through azFile[] */
14592   int rc;                         /* Return code */
14593   const char *zTab = 0;           /* SQL table into which to insert */
14594   char *zSql;
14595   char zTemp[50];
14596   char *zExists = 0;
14597 
14598   arExecSql(pAr, "PRAGMA page_size=512");
14599   rc = arExecSql(pAr, "SAVEPOINT ar;");
14600   if( rc!=SQLITE_OK ) return rc;
14601   zTemp[0] = 0;
14602   if( pAr->bZip ){
14603     /* Initialize the zipfile virtual table, if necessary */
14604     if( pAr->zFile ){
14605       sqlite3_uint64 r;
14606       sqlite3_randomness(sizeof(r),&r);
14607       sqlite3_snprintf(sizeof(zTemp),zTemp,"zip%016llx",r);
14608       zTab = zTemp;
14609       zSql = sqlite3_mprintf(
14610          "CREATE VIRTUAL TABLE temp.%s USING zipfile(%Q)",
14611          zTab, pAr->zFile
14612       );
14613       rc = arExecSql(pAr, zSql);
14614       sqlite3_free(zSql);
14615     }else{
14616       zTab = "zip";
14617     }
14618   }else{
14619     /* Initialize the table for an SQLAR */
14620     zTab = "sqlar";
14621     if( bUpdate==0 ){
14622       rc = arExecSql(pAr, zDrop);
14623       if( rc!=SQLITE_OK ) goto end_ar_transaction;
14624     }
14625     rc = arExecSql(pAr, zCreate);
14626   }
14627   if( bOnlyIfChanged ){
14628     zExists = sqlite3_mprintf(
14629       " AND NOT EXISTS("
14630           "SELECT 1 FROM %s AS mem"
14631           " WHERE mem.name=disk.name"
14632           " AND mem.mtime=disk.mtime"
14633           " AND mem.mode=disk.mode)", zTab);
14634   }else{
14635     zExists = sqlite3_mprintf("");
14636   }
14637   if( zExists==0 ) rc = SQLITE_NOMEM;
14638   for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){
14639     char *zSql2 = sqlite3_mprintf(zInsertFmt[pAr->bZip], zTab,
14640         pAr->bVerbose ? "shell_putsnl(name)" : "name",
14641         pAr->azArg[i], pAr->zDir, zExists);
14642     rc = arExecSql(pAr, zSql2);
14643     sqlite3_free(zSql2);
14644   }
14645 end_ar_transaction:
14646   if( rc!=SQLITE_OK ){
14647     sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0);
14648   }else{
14649     rc = arExecSql(pAr, "RELEASE ar;");
14650     if( pAr->bZip && pAr->zFile ){
14651       zSql = sqlite3_mprintf("DROP TABLE %s", zTemp);
14652       arExecSql(pAr, zSql);
14653       sqlite3_free(zSql);
14654     }
14655   }
14656   sqlite3_free(zExists);
14657   return rc;
14658 }
14659 
14660 /*
14661 ** Implementation of ".ar" dot command.
14662 */
14663 static int arDotCommand(
14664   ShellState *pState,          /* Current shell tool state */
14665   int fromCmdLine,             /* True if -A command-line option, not .ar cmd */
14666   char **azArg,                /* Array of arguments passed to dot command */
14667   int nArg                     /* Number of entries in azArg[] */
14668 ){
14669   ArCommand cmd;
14670   int rc;
14671   memset(&cmd, 0, sizeof(cmd));
14672   cmd.fromCmdLine = fromCmdLine;
14673   rc = arParseCommand(azArg, nArg, &cmd);
14674   if( rc==SQLITE_OK ){
14675     int eDbType = SHELL_OPEN_UNSPEC;
14676     cmd.p = pState;
14677     cmd.db = pState->db;
14678     if( cmd.zFile ){
14679       eDbType = deduceDatabaseType(cmd.zFile, 1);
14680     }else{
14681       eDbType = pState->openMode;
14682     }
14683     if( eDbType==SHELL_OPEN_ZIPFILE ){
14684       if( cmd.eCmd==AR_CMD_EXTRACT || cmd.eCmd==AR_CMD_LIST ){
14685         if( cmd.zFile==0 ){
14686           cmd.zSrcTable = sqlite3_mprintf("zip");
14687         }else{
14688           cmd.zSrcTable = sqlite3_mprintf("zipfile(%Q)", cmd.zFile);
14689         }
14690       }
14691       cmd.bZip = 1;
14692     }else if( cmd.zFile ){
14693       int flags;
14694       if( cmd.bAppend ) eDbType = SHELL_OPEN_APPENDVFS;
14695       if( cmd.eCmd==AR_CMD_CREATE || cmd.eCmd==AR_CMD_INSERT
14696            || cmd.eCmd==AR_CMD_UPDATE ){
14697         flags = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE;
14698       }else{
14699         flags = SQLITE_OPEN_READONLY;
14700       }
14701       cmd.db = 0;
14702       if( cmd.bDryRun ){
14703         utf8_printf(pState->out, "-- open database '%s'%s\n", cmd.zFile,
14704              eDbType==SHELL_OPEN_APPENDVFS ? " using 'apndvfs'" : "");
14705       }
14706       rc = sqlite3_open_v2(cmd.zFile, &cmd.db, flags,
14707              eDbType==SHELL_OPEN_APPENDVFS ? "apndvfs" : 0);
14708       if( rc!=SQLITE_OK ){
14709         utf8_printf(stderr, "cannot open file: %s (%s)\n",
14710             cmd.zFile, sqlite3_errmsg(cmd.db)
14711         );
14712         goto end_ar_command;
14713       }
14714       sqlite3_fileio_init(cmd.db, 0, 0);
14715       sqlite3_sqlar_init(cmd.db, 0, 0);
14716       sqlite3_create_function(cmd.db, "shell_putsnl", 1, SQLITE_UTF8, cmd.p,
14717                               shellPutsFunc, 0, 0);
14718 
14719     }
14720     if( cmd.zSrcTable==0 && cmd.bZip==0 && cmd.eCmd!=AR_CMD_HELP ){
14721       if( cmd.eCmd!=AR_CMD_CREATE
14722        && sqlite3_table_column_metadata(cmd.db,0,"sqlar","name",0,0,0,0,0)
14723       ){
14724         utf8_printf(stderr, "database does not contain an 'sqlar' table\n");
14725         rc = SQLITE_ERROR;
14726         goto end_ar_command;
14727       }
14728       cmd.zSrcTable = sqlite3_mprintf("sqlar");
14729     }
14730 
14731     switch( cmd.eCmd ){
14732       case AR_CMD_CREATE:
14733         rc = arCreateOrUpdateCommand(&cmd, 0, 0);
14734         break;
14735 
14736       case AR_CMD_EXTRACT:
14737         rc = arExtractCommand(&cmd);
14738         break;
14739 
14740       case AR_CMD_LIST:
14741         rc = arListCommand(&cmd);
14742         break;
14743 
14744       case AR_CMD_HELP:
14745         arUsage(pState->out);
14746         break;
14747 
14748       case AR_CMD_INSERT:
14749         rc = arCreateOrUpdateCommand(&cmd, 1, 0);
14750         break;
14751 
14752       default:
14753         assert( cmd.eCmd==AR_CMD_UPDATE );
14754         rc = arCreateOrUpdateCommand(&cmd, 1, 1);
14755         break;
14756     }
14757   }
14758 end_ar_command:
14759   if( cmd.db!=pState->db ){
14760     close_db(cmd.db);
14761   }
14762   sqlite3_free(cmd.zSrcTable);
14763 
14764   return rc;
14765 }
14766 /* End of the ".archive" or ".ar" command logic
14767 *******************************************************************************/
14768 #endif /* !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) */
14769 
14770 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
14771 /*
14772 ** If (*pRc) is not SQLITE_OK when this function is called, it is a no-op.
14773 ** Otherwise, the SQL statement or statements in zSql are executed using
14774 ** database connection db and the error code written to *pRc before
14775 ** this function returns.
14776 */
14777 static void shellExec(sqlite3 *db, int *pRc, const char *zSql){
14778   int rc = *pRc;
14779   if( rc==SQLITE_OK ){
14780     char *zErr = 0;
14781     rc = sqlite3_exec(db, zSql, 0, 0, &zErr);
14782     if( rc!=SQLITE_OK ){
14783       raw_printf(stderr, "SQL error: %s\n", zErr);
14784     }
14785     *pRc = rc;
14786   }
14787 }
14788 
14789 /*
14790 ** Like shellExec(), except that zFmt is a printf() style format string.
14791 */
14792 static void shellExecPrintf(sqlite3 *db, int *pRc, const char *zFmt, ...){
14793   char *z = 0;
14794   if( *pRc==SQLITE_OK ){
14795     va_list ap;
14796     va_start(ap, zFmt);
14797     z = sqlite3_vmprintf(zFmt, ap);
14798     va_end(ap);
14799     if( z==0 ){
14800       *pRc = SQLITE_NOMEM;
14801     }else{
14802       shellExec(db, pRc, z);
14803     }
14804     sqlite3_free(z);
14805   }
14806 }
14807 
14808 /*
14809 ** If *pRc is not SQLITE_OK when this function is called, it is a no-op.
14810 ** Otherwise, an attempt is made to allocate, zero and return a pointer
14811 ** to a buffer nByte bytes in size. If an OOM error occurs, *pRc is set
14812 ** to SQLITE_NOMEM and NULL returned.
14813 */
14814 static void *shellMalloc(int *pRc, sqlite3_int64 nByte){
14815   void *pRet = 0;
14816   if( *pRc==SQLITE_OK ){
14817     pRet = sqlite3_malloc64(nByte);
14818     if( pRet==0 ){
14819       *pRc = SQLITE_NOMEM;
14820     }else{
14821       memset(pRet, 0, nByte);
14822     }
14823   }
14824   return pRet;
14825 }
14826 
14827 /*
14828 ** If *pRc is not SQLITE_OK when this function is called, it is a no-op.
14829 ** Otherwise, zFmt is treated as a printf() style string. The result of
14830 ** formatting it along with any trailing arguments is written into a
14831 ** buffer obtained from sqlite3_malloc(), and pointer to which is returned.
14832 ** It is the responsibility of the caller to eventually free this buffer
14833 ** using a call to sqlite3_free().
14834 **
14835 ** If an OOM error occurs, (*pRc) is set to SQLITE_NOMEM and a NULL
14836 ** pointer returned.
14837 */
14838 static char *shellMPrintf(int *pRc, const char *zFmt, ...){
14839   char *z = 0;
14840   if( *pRc==SQLITE_OK ){
14841     va_list ap;
14842     va_start(ap, zFmt);
14843     z = sqlite3_vmprintf(zFmt, ap);
14844     va_end(ap);
14845     if( z==0 ){
14846       *pRc = SQLITE_NOMEM;
14847     }
14848   }
14849   return z;
14850 }
14851 
14852 /*
14853 ** When running the ".recover" command, each output table, and the special
14854 ** orphaned row table if it is required, is represented by an instance
14855 ** of the following struct.
14856 */
14857 typedef struct RecoverTable RecoverTable;
14858 struct RecoverTable {
14859   char *zQuoted;                  /* Quoted version of table name */
14860   int nCol;                       /* Number of columns in table */
14861   char **azlCol;                  /* Array of column lists */
14862   int iPk;                        /* Index of IPK column */
14863 };
14864 
14865 /*
14866 ** Free a RecoverTable object allocated by recoverFindTable() or
14867 ** recoverOrphanTable().
14868 */
14869 static void recoverFreeTable(RecoverTable *pTab){
14870   if( pTab ){
14871     sqlite3_free(pTab->zQuoted);
14872     if( pTab->azlCol ){
14873       int i;
14874       for(i=0; i<=pTab->nCol; i++){
14875         sqlite3_free(pTab->azlCol[i]);
14876       }
14877       sqlite3_free(pTab->azlCol);
14878     }
14879     sqlite3_free(pTab);
14880   }
14881 }
14882 
14883 /*
14884 ** This function is a no-op if (*pRc) is not SQLITE_OK when it is called.
14885 ** Otherwise, it allocates and returns a RecoverTable object based on the
14886 ** final four arguments passed to this function. It is the responsibility
14887 ** of the caller to eventually free the returned object using
14888 ** recoverFreeTable().
14889 */
14890 static RecoverTable *recoverNewTable(
14891   int *pRc,                       /* IN/OUT: Error code */
14892   const char *zName,              /* Name of table */
14893   const char *zSql,               /* CREATE TABLE statement */
14894   int bIntkey,
14895   int nCol
14896 ){
14897   sqlite3 *dbtmp = 0;             /* sqlite3 handle for testing CREATE TABLE */
14898   int rc = *pRc;
14899   RecoverTable *pTab = 0;
14900 
14901   pTab = (RecoverTable*)shellMalloc(&rc, sizeof(RecoverTable));
14902   if( rc==SQLITE_OK ){
14903     int nSqlCol = 0;
14904     int bSqlIntkey = 0;
14905     sqlite3_stmt *pStmt = 0;
14906 
14907     rc = sqlite3_open("", &dbtmp);
14908     if( rc==SQLITE_OK ){
14909       sqlite3_create_function(dbtmp, "shell_idquote", 1, SQLITE_UTF8, 0,
14910                               shellIdQuote, 0, 0);
14911     }
14912     if( rc==SQLITE_OK ){
14913       rc = sqlite3_exec(dbtmp, "PRAGMA writable_schema = on", 0, 0, 0);
14914     }
14915     if( rc==SQLITE_OK ){
14916       rc = sqlite3_exec(dbtmp, zSql, 0, 0, 0);
14917       if( rc==SQLITE_ERROR ){
14918         rc = SQLITE_OK;
14919         goto finished;
14920       }
14921     }
14922     shellPreparePrintf(dbtmp, &rc, &pStmt,
14923         "SELECT count(*) FROM pragma_table_info(%Q)", zName
14924     );
14925     if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
14926       nSqlCol = sqlite3_column_int(pStmt, 0);
14927     }
14928     shellFinalize(&rc, pStmt);
14929 
14930     if( rc!=SQLITE_OK || nSqlCol<nCol ){
14931       goto finished;
14932     }
14933 
14934     shellPreparePrintf(dbtmp, &rc, &pStmt,
14935       "SELECT ("
14936       "  SELECT substr(data,1,1)==X'0D' FROM sqlite_dbpage WHERE pgno=rootpage"
14937       ") FROM sqlite_master WHERE name = %Q", zName
14938     );
14939     if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
14940       bSqlIntkey = sqlite3_column_int(pStmt, 0);
14941     }
14942     shellFinalize(&rc, pStmt);
14943 
14944     if( bIntkey==bSqlIntkey ){
14945       int i;
14946       const char *zPk = "_rowid_";
14947       sqlite3_stmt *pPkFinder = 0;
14948 
14949       /* If this is an intkey table and there is an INTEGER PRIMARY KEY,
14950       ** set zPk to the name of the PK column, and pTab->iPk to the index
14951       ** of the column, where columns are 0-numbered from left to right.
14952       ** Or, if this is a WITHOUT ROWID table or if there is no IPK column,
14953       ** leave zPk as "_rowid_" and pTab->iPk at -2.  */
14954       pTab->iPk = -2;
14955       if( bIntkey ){
14956         shellPreparePrintf(dbtmp, &rc, &pPkFinder,
14957           "SELECT cid, name FROM pragma_table_info(%Q) "
14958           "  WHERE pk=1 AND type='integer' COLLATE nocase"
14959           "  AND NOT EXISTS (SELECT cid FROM pragma_table_info(%Q) WHERE pk=2)"
14960           , zName, zName
14961         );
14962         if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pPkFinder) ){
14963           pTab->iPk = sqlite3_column_int(pPkFinder, 0);
14964           zPk = (const char*)sqlite3_column_text(pPkFinder, 1);
14965         }
14966       }
14967 
14968       pTab->zQuoted = shellMPrintf(&rc, "\"%w\"", zName);
14969       pTab->azlCol = (char**)shellMalloc(&rc, sizeof(char*) * (nSqlCol+1));
14970       pTab->nCol = nSqlCol;
14971 
14972       if( bIntkey ){
14973         pTab->azlCol[0] = shellMPrintf(&rc, "\"%w\"", zPk);
14974       }else{
14975         pTab->azlCol[0] = shellMPrintf(&rc, "");
14976       }
14977       i = 1;
14978       shellPreparePrintf(dbtmp, &rc, &pStmt,
14979           "SELECT %Q || group_concat(shell_idquote(name), ', ') "
14980           "  FILTER (WHERE cid!=%d) OVER (ORDER BY %s cid) "
14981           "FROM pragma_table_info(%Q)",
14982           bIntkey ? ", " : "", pTab->iPk,
14983           bIntkey ? "" : "(CASE WHEN pk=0 THEN 1000000 ELSE pk END), ",
14984           zName
14985       );
14986       while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
14987         const char *zText = (const char*)sqlite3_column_text(pStmt, 0);
14988         pTab->azlCol[i] = shellMPrintf(&rc, "%s%s", pTab->azlCol[0], zText);
14989         i++;
14990       }
14991       shellFinalize(&rc, pStmt);
14992 
14993       shellFinalize(&rc, pPkFinder);
14994     }
14995   }
14996 
14997  finished:
14998   sqlite3_close(dbtmp);
14999   *pRc = rc;
15000   if( rc!=SQLITE_OK || (pTab && pTab->zQuoted==0) ){
15001     recoverFreeTable(pTab);
15002     pTab = 0;
15003   }
15004   return pTab;
15005 }
15006 
15007 /*
15008 ** This function is called to search the schema recovered from the
15009 ** sqlite_master table of the (possibly) corrupt database as part
15010 ** of a ".recover" command. Specifically, for a table with root page
15011 ** iRoot and at least nCol columns. Additionally, if bIntkey is 0, the
15012 ** table must be a WITHOUT ROWID table, or if non-zero, not one of
15013 ** those.
15014 **
15015 ** If a table is found, a (RecoverTable*) object is returned. Or, if
15016 ** no such table is found, but bIntkey is false and iRoot is the
15017 ** root page of an index in the recovered schema, then (*pbNoop) is
15018 ** set to true and NULL returned. Or, if there is no such table or
15019 ** index, NULL is returned and (*pbNoop) set to 0, indicating that
15020 ** the caller should write data to the orphans table.
15021 */
15022 static RecoverTable *recoverFindTable(
15023   ShellState *pState,             /* Shell state object */
15024   int *pRc,                       /* IN/OUT: Error code */
15025   int iRoot,                      /* Root page of table */
15026   int bIntkey,                    /* True for an intkey table */
15027   int nCol,                       /* Number of columns in table */
15028   int *pbNoop                     /* OUT: True if iRoot is root of index */
15029 ){
15030   sqlite3_stmt *pStmt = 0;
15031   RecoverTable *pRet = 0;
15032   int bNoop = 0;
15033   const char *zSql = 0;
15034   const char *zName = 0;
15035 
15036   /* Search the recovered schema for an object with root page iRoot. */
15037   shellPreparePrintf(pState->db, pRc, &pStmt,
15038       "SELECT type, name, sql FROM recovery.schema WHERE rootpage=%d", iRoot
15039   );
15040   while( *pRc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
15041     const char *zType = (const char*)sqlite3_column_text(pStmt, 0);
15042     if( bIntkey==0 && sqlite3_stricmp(zType, "index")==0 ){
15043       bNoop = 1;
15044       break;
15045     }
15046     if( sqlite3_stricmp(zType, "table")==0 ){
15047       zName = (const char*)sqlite3_column_text(pStmt, 1);
15048       zSql = (const char*)sqlite3_column_text(pStmt, 2);
15049       pRet = recoverNewTable(pRc, zName, zSql, bIntkey, nCol);
15050       break;
15051     }
15052   }
15053 
15054   shellFinalize(pRc, pStmt);
15055   *pbNoop = bNoop;
15056   return pRet;
15057 }
15058 
15059 /*
15060 ** Return a RecoverTable object representing the orphans table.
15061 */
15062 static RecoverTable *recoverOrphanTable(
15063   ShellState *pState,             /* Shell state object */
15064   int *pRc,                       /* IN/OUT: Error code */
15065   const char *zLostAndFound,      /* Base name for orphans table */
15066   int nCol                        /* Number of user data columns */
15067 ){
15068   RecoverTable *pTab = 0;
15069   if( nCol>=0 && *pRc==SQLITE_OK ){
15070     int i;
15071 
15072     /* This block determines the name of the orphan table. The prefered
15073     ** name is zLostAndFound. But if that clashes with another name
15074     ** in the recovered schema, try zLostAndFound_0, zLostAndFound_1
15075     ** and so on until a non-clashing name is found.  */
15076     int iTab = 0;
15077     char *zTab = shellMPrintf(pRc, "%s", zLostAndFound);
15078     sqlite3_stmt *pTest = 0;
15079     shellPrepare(pState->db, pRc,
15080         "SELECT 1 FROM recovery.schema WHERE name=?", &pTest
15081     );
15082     if( pTest ) sqlite3_bind_text(pTest, 1, zTab, -1, SQLITE_TRANSIENT);
15083     while( *pRc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pTest) ){
15084       shellReset(pRc, pTest);
15085       sqlite3_free(zTab);
15086       zTab = shellMPrintf(pRc, "%s_%d", zLostAndFound, iTab++);
15087       sqlite3_bind_text(pTest, 1, zTab, -1, SQLITE_TRANSIENT);
15088     }
15089     shellFinalize(pRc, pTest);
15090 
15091     pTab = (RecoverTable*)shellMalloc(pRc, sizeof(RecoverTable));
15092     if( pTab ){
15093       pTab->zQuoted = shellMPrintf(pRc, "\"%w\"", zTab);
15094       pTab->nCol = nCol;
15095       pTab->iPk = -2;
15096       if( nCol>0 ){
15097         pTab->azlCol = (char**)shellMalloc(pRc, sizeof(char*) * (nCol+1));
15098         if( pTab->azlCol ){
15099           pTab->azlCol[nCol] = shellMPrintf(pRc, "");
15100           for(i=nCol-1; i>=0; i--){
15101             pTab->azlCol[i] = shellMPrintf(pRc, "%s, NULL", pTab->azlCol[i+1]);
15102           }
15103         }
15104       }
15105 
15106       if( *pRc!=SQLITE_OK ){
15107         recoverFreeTable(pTab);
15108         pTab = 0;
15109       }else{
15110         raw_printf(pState->out,
15111             "CREATE TABLE %s(rootpgno INTEGER, "
15112             "pgno INTEGER, nfield INTEGER, id INTEGER", pTab->zQuoted
15113         );
15114         for(i=0; i<nCol; i++){
15115           raw_printf(pState->out, ", c%d", i);
15116         }
15117         raw_printf(pState->out, ");\n");
15118       }
15119     }
15120     sqlite3_free(zTab);
15121   }
15122   return pTab;
15123 }
15124 
15125 /*
15126 ** This function is called to recover data from the database. A script
15127 ** to construct a new database containing all recovered data is output
15128 ** on stream pState->out.
15129 */
15130 static int recoverDatabaseCmd(ShellState *pState, int nArg, char **azArg){
15131   int rc = SQLITE_OK;
15132   sqlite3_stmt *pLoop = 0;        /* Loop through all root pages */
15133   sqlite3_stmt *pPages = 0;       /* Loop through all pages in a group */
15134   sqlite3_stmt *pCells = 0;       /* Loop through all cells in a page */
15135   const char *zRecoveryDb = "";   /* Name of "recovery" database */
15136   const char *zLostAndFound = "lost_and_found";
15137   int i;
15138   int nOrphan = -1;
15139   RecoverTable *pOrphan = 0;
15140 
15141   int bFreelist = 1;              /* 0 if --freelist-corrupt is specified */
15142   int bRowids = 1;                /* 0 if --no-rowids */
15143   for(i=1; i<nArg; i++){
15144     char *z = azArg[i];
15145     int n;
15146     if( z[0]=='-' && z[1]=='-' ) z++;
15147     n = strlen30(z);
15148     if( n<=17 && memcmp("-freelist-corrupt", z, n)==0 ){
15149       bFreelist = 0;
15150     }else
15151     if( n<=12 && memcmp("-recovery-db", z, n)==0 && i<(nArg-1) ){
15152       i++;
15153       zRecoveryDb = azArg[i];
15154     }else
15155     if( n<=15 && memcmp("-lost-and-found", z, n)==0 && i<(nArg-1) ){
15156       i++;
15157       zLostAndFound = azArg[i];
15158     }else
15159     if( n<=10 && memcmp("-no-rowids", z, n)==0 ){
15160       bRowids = 0;
15161     }
15162     else{
15163       utf8_printf(stderr, "unexpected option: %s\n", azArg[i]);
15164       showHelp(pState->out, azArg[0]);
15165       return 1;
15166     }
15167   }
15168 
15169   shellExecPrintf(pState->db, &rc,
15170     /* Attach an in-memory database named 'recovery'. Create an indexed
15171     ** cache of the sqlite_dbptr virtual table. */
15172     "PRAGMA writable_schema = on;"
15173     "ATTACH %Q AS recovery;"
15174     "DROP TABLE IF EXISTS recovery.dbptr;"
15175     "DROP TABLE IF EXISTS recovery.freelist;"
15176     "DROP TABLE IF EXISTS recovery.map;"
15177     "DROP TABLE IF EXISTS recovery.schema;"
15178     "CREATE TABLE recovery.freelist(pgno INTEGER PRIMARY KEY);", zRecoveryDb
15179   );
15180 
15181   if( bFreelist ){
15182     shellExec(pState->db, &rc,
15183       "WITH trunk(pgno) AS ("
15184       "  SELECT shell_int32("
15185       "      (SELECT data FROM sqlite_dbpage WHERE pgno=1), 8) AS x "
15186       "      WHERE x>0"
15187       "    UNION"
15188       "  SELECT shell_int32("
15189       "      (SELECT data FROM sqlite_dbpage WHERE pgno=trunk.pgno), 0) AS x "
15190       "      FROM trunk WHERE x>0"
15191       "),"
15192       "freelist(data, n, freepgno) AS ("
15193       "  SELECT data, min(16384, shell_int32(data, 1)-1), t.pgno "
15194       "      FROM trunk t, sqlite_dbpage s WHERE s.pgno=t.pgno"
15195       "    UNION ALL"
15196       "  SELECT data, n-1, shell_int32(data, 2+n) "
15197       "      FROM freelist WHERE n>=0"
15198       ")"
15199       "REPLACE INTO recovery.freelist SELECT freepgno FROM freelist;"
15200     );
15201   }
15202 
15203   /* If this is an auto-vacuum database, add all pointer-map pages to
15204   ** the freelist table. Do this regardless of whether or not
15205   ** --freelist-corrupt was specified.  */
15206   shellExec(pState->db, &rc,
15207     "WITH ptrmap(pgno) AS ("
15208     "  SELECT 2 WHERE shell_int32("
15209     "    (SELECT data FROM sqlite_dbpage WHERE pgno=1), 13"
15210     "  )"
15211     "    UNION ALL "
15212     "  SELECT pgno+1+(SELECT page_size FROM pragma_page_size)/5 AS pp "
15213     "  FROM ptrmap WHERE pp<=(SELECT page_count FROM pragma_page_count)"
15214     ")"
15215     "REPLACE INTO recovery.freelist SELECT pgno FROM ptrmap"
15216   );
15217 
15218   shellExec(pState->db, &rc,
15219     "CREATE TABLE recovery.dbptr("
15220     "      pgno, child, PRIMARY KEY(child, pgno)"
15221     ") WITHOUT ROWID;"
15222     "INSERT OR IGNORE INTO recovery.dbptr(pgno, child) "
15223     "    SELECT * FROM sqlite_dbptr"
15224     "      WHERE pgno NOT IN freelist AND child NOT IN freelist;"
15225 
15226     /* Delete any pointer to page 1. This ensures that page 1 is considered
15227     ** a root page, regardless of how corrupt the db is. */
15228     "DELETE FROM recovery.dbptr WHERE child = 1;"
15229 
15230     /* Delete all pointers to any pages that have more than one pointer
15231     ** to them. Such pages will be treated as root pages when recovering
15232     ** data.  */
15233     "DELETE FROM recovery.dbptr WHERE child IN ("
15234     "  SELECT child FROM recovery.dbptr GROUP BY child HAVING count(*)>1"
15235     ");"
15236 
15237     /* Create the "map" table that will (eventually) contain instructions
15238     ** for dealing with each page in the db that contains one or more
15239     ** records. */
15240     "CREATE TABLE recovery.map("
15241       "pgno INTEGER PRIMARY KEY, maxlen INT, intkey, root INT"
15242     ");"
15243 
15244     /* Populate table [map]. If there are circular loops of pages in the
15245     ** database, the following adds all pages in such a loop to the map
15246     ** as individual root pages. This could be handled better.  */
15247     "WITH pages(i, maxlen) AS ("
15248     "  SELECT page_count, ("
15249     "    SELECT max(field+1) FROM sqlite_dbdata WHERE pgno=page_count"
15250     "  ) FROM pragma_page_count WHERE page_count>0"
15251     "    UNION ALL"
15252     "  SELECT i-1, ("
15253     "    SELECT max(field+1) FROM sqlite_dbdata WHERE pgno=i-1"
15254     "  ) FROM pages WHERE i>=2"
15255     ")"
15256     "INSERT INTO recovery.map(pgno, maxlen, intkey, root) "
15257     "  SELECT i, maxlen, NULL, ("
15258     "    WITH p(orig, pgno, parent) AS ("
15259     "      SELECT 0, i, (SELECT pgno FROM recovery.dbptr WHERE child=i)"
15260     "        UNION "
15261     "      SELECT i, p.parent, "
15262     "        (SELECT pgno FROM recovery.dbptr WHERE child=p.parent) FROM p"
15263     "    )"
15264     "    SELECT pgno FROM p WHERE (parent IS NULL OR pgno = orig)"
15265     ") "
15266     "FROM pages WHERE maxlen IS NOT NULL AND i NOT IN freelist;"
15267     "UPDATE recovery.map AS o SET intkey = ("
15268     "  SELECT substr(data, 1, 1)==X'0D' FROM sqlite_dbpage WHERE pgno=o.pgno"
15269     ");"
15270 
15271     /* Extract data from page 1 and any linked pages into table
15272     ** recovery.schema. With the same schema as an sqlite_master table.  */
15273     "CREATE TABLE recovery.schema(type, name, tbl_name, rootpage, sql);"
15274     "INSERT INTO recovery.schema SELECT "
15275     "  max(CASE WHEN field=0 THEN value ELSE NULL END),"
15276     "  max(CASE WHEN field=1 THEN value ELSE NULL END),"
15277     "  max(CASE WHEN field=2 THEN value ELSE NULL END),"
15278     "  max(CASE WHEN field=3 THEN value ELSE NULL END),"
15279     "  max(CASE WHEN field=4 THEN value ELSE NULL END)"
15280     "FROM sqlite_dbdata WHERE pgno IN ("
15281     "  SELECT pgno FROM recovery.map WHERE root=1"
15282     ")"
15283     "GROUP BY pgno, cell;"
15284     "CREATE INDEX recovery.schema_rootpage ON schema(rootpage);"
15285   );
15286 
15287   /* Open a transaction, then print out all non-virtual, non-"sqlite_%"
15288   ** CREATE TABLE statements that extracted from the existing schema.  */
15289   if( rc==SQLITE_OK ){
15290     sqlite3_stmt *pStmt = 0;
15291     /* ".recover" might output content in an order which causes immediate
15292     ** foreign key constraints to be violated. So disable foreign-key
15293     ** constraint enforcement to prevent problems when running the output
15294     ** script. */
15295     raw_printf(pState->out, "PRAGMA foreign_keys=OFF;\n");
15296     raw_printf(pState->out, "BEGIN;\n");
15297     raw_printf(pState->out, "PRAGMA writable_schema = on;\n");
15298     shellPrepare(pState->db, &rc,
15299         "SELECT sql FROM recovery.schema "
15300         "WHERE type='table' AND sql LIKE 'create table%'", &pStmt
15301     );
15302     while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
15303       const char *zCreateTable = (const char*)sqlite3_column_text(pStmt, 0);
15304       raw_printf(pState->out, "CREATE TABLE IF NOT EXISTS %s;\n",
15305           &zCreateTable[12]
15306       );
15307     }
15308     shellFinalize(&rc, pStmt);
15309   }
15310 
15311   /* Figure out if an orphan table will be required. And if so, how many
15312   ** user columns it should contain */
15313   shellPrepare(pState->db, &rc,
15314       "SELECT coalesce(max(maxlen), -2) FROM recovery.map WHERE root>1"
15315       , &pLoop
15316   );
15317   if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pLoop) ){
15318     nOrphan = sqlite3_column_int(pLoop, 0);
15319   }
15320   shellFinalize(&rc, pLoop);
15321   pLoop = 0;
15322 
15323   shellPrepare(pState->db, &rc,
15324       "SELECT pgno FROM recovery.map WHERE root=?", &pPages
15325   );
15326 
15327   shellPrepare(pState->db, &rc,
15328       "SELECT max(field), group_concat(shell_escape_crnl(quote"
15329       "(case when (? AND field<0) then NULL else value end)"
15330       "), ', ')"
15331       ", min(field) "
15332       "FROM sqlite_dbdata WHERE pgno = ? AND field != ?"
15333       "GROUP BY cell", &pCells
15334   );
15335 
15336   /* Loop through each root page. */
15337   shellPrepare(pState->db, &rc,
15338       "SELECT root, intkey, max(maxlen) FROM recovery.map"
15339       " WHERE root>1 GROUP BY root, intkey ORDER BY root=("
15340       "  SELECT rootpage FROM recovery.schema WHERE name='sqlite_sequence'"
15341       ")", &pLoop
15342   );
15343   while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pLoop) ){
15344     int iRoot = sqlite3_column_int(pLoop, 0);
15345     int bIntkey = sqlite3_column_int(pLoop, 1);
15346     int nCol = sqlite3_column_int(pLoop, 2);
15347     int bNoop = 0;
15348     RecoverTable *pTab;
15349 
15350     assert( bIntkey==0 || bIntkey==1 );
15351     pTab = recoverFindTable(pState, &rc, iRoot, bIntkey, nCol, &bNoop);
15352     if( bNoop || rc ) continue;
15353     if( pTab==0 ){
15354       if( pOrphan==0 ){
15355         pOrphan = recoverOrphanTable(pState, &rc, zLostAndFound, nOrphan);
15356       }
15357       pTab = pOrphan;
15358       if( pTab==0 ) break;
15359     }
15360 
15361     if( 0==sqlite3_stricmp(pTab->zQuoted, "\"sqlite_sequence\"") ){
15362       raw_printf(pState->out, "DELETE FROM sqlite_sequence;\n");
15363     }
15364     sqlite3_bind_int(pPages, 1, iRoot);
15365     if( bRowids==0 && pTab->iPk<0 ){
15366       sqlite3_bind_int(pCells, 1, 1);
15367     }else{
15368       sqlite3_bind_int(pCells, 1, 0);
15369     }
15370     sqlite3_bind_int(pCells, 3, pTab->iPk);
15371 
15372     while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pPages) ){
15373       int iPgno = sqlite3_column_int(pPages, 0);
15374       sqlite3_bind_int(pCells, 2, iPgno);
15375       while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pCells) ){
15376         int nField = sqlite3_column_int(pCells, 0);
15377         int iMin = sqlite3_column_int(pCells, 2);
15378         const char *zVal = (const char*)sqlite3_column_text(pCells, 1);
15379 
15380         RecoverTable *pTab2 = pTab;
15381         if( pTab!=pOrphan && (iMin<0)!=bIntkey ){
15382           if( pOrphan==0 ){
15383             pOrphan = recoverOrphanTable(pState, &rc, zLostAndFound, nOrphan);
15384           }
15385           pTab2 = pOrphan;
15386           if( pTab2==0 ) break;
15387         }
15388 
15389         nField = nField+1;
15390         if( pTab2==pOrphan ){
15391           raw_printf(pState->out,
15392               "INSERT INTO %s VALUES(%d, %d, %d, %s%s%s);\n",
15393               pTab2->zQuoted, iRoot, iPgno, nField,
15394               iMin<0 ? "" : "NULL, ", zVal, pTab2->azlCol[nField]
15395           );
15396         }else{
15397           raw_printf(pState->out, "INSERT INTO %s(%s) VALUES( %s );\n",
15398               pTab2->zQuoted, pTab2->azlCol[nField], zVal
15399           );
15400         }
15401       }
15402       shellReset(&rc, pCells);
15403     }
15404     shellReset(&rc, pPages);
15405     if( pTab!=pOrphan ) recoverFreeTable(pTab);
15406   }
15407   shellFinalize(&rc, pLoop);
15408   shellFinalize(&rc, pPages);
15409   shellFinalize(&rc, pCells);
15410   recoverFreeTable(pOrphan);
15411 
15412   /* The rest of the schema */
15413   if( rc==SQLITE_OK ){
15414     sqlite3_stmt *pStmt = 0;
15415     shellPrepare(pState->db, &rc,
15416         "SELECT sql, name FROM recovery.schema "
15417         "WHERE sql NOT LIKE 'create table%'", &pStmt
15418     );
15419     while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
15420       const char *zSql = (const char*)sqlite3_column_text(pStmt, 0);
15421       if( sqlite3_strnicmp(zSql, "create virt", 11)==0 ){
15422         const char *zName = (const char*)sqlite3_column_text(pStmt, 1);
15423         char *zPrint = shellMPrintf(&rc,
15424           "INSERT INTO sqlite_master VALUES('table', %Q, %Q, 0, %Q)",
15425           zName, zName, zSql
15426         );
15427         raw_printf(pState->out, "%s;\n", zPrint);
15428         sqlite3_free(zPrint);
15429       }else{
15430         raw_printf(pState->out, "%s;\n", zSql);
15431       }
15432     }
15433     shellFinalize(&rc, pStmt);
15434   }
15435 
15436   if( rc==SQLITE_OK ){
15437     raw_printf(pState->out, "PRAGMA writable_schema = off;\n");
15438     raw_printf(pState->out, "COMMIT;\n");
15439   }
15440   sqlite3_exec(pState->db, "DETACH recovery", 0, 0, 0);
15441   return rc;
15442 }
15443 #endif /* !(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) */
15444 
15445 
15446 /*
15447 ** If an input line begins with "." then invoke this routine to
15448 ** process that line.
15449 **
15450 ** Return 1 on error, 2 to exit, and 0 otherwise.
15451 */
15452 static int do_meta_command(char *zLine, ShellState *p){
15453   int h = 1;
15454   int nArg = 0;
15455   int n, c;
15456   int rc = 0;
15457   char *azArg[52];
15458 
15459 #ifndef SQLITE_OMIT_VIRTUALTABLE
15460   if( p->expert.pExpert ){
15461     expertFinish(p, 1, 0);
15462   }
15463 #endif
15464 
15465   /* Parse the input line into tokens.
15466   */
15467   while( zLine[h] && nArg<ArraySize(azArg)-1 ){
15468     while( IsSpace(zLine[h]) ){ h++; }
15469     if( zLine[h]==0 ) break;
15470     if( zLine[h]=='\'' || zLine[h]=='"' ){
15471       int delim = zLine[h++];
15472       azArg[nArg++] = &zLine[h];
15473       while( zLine[h] && zLine[h]!=delim ){
15474         if( zLine[h]=='\\' && delim=='"' && zLine[h+1]!=0 ) h++;
15475         h++;
15476       }
15477       if( zLine[h]==delim ){
15478         zLine[h++] = 0;
15479       }
15480       if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
15481     }else{
15482       azArg[nArg++] = &zLine[h];
15483       while( zLine[h] && !IsSpace(zLine[h]) ){ h++; }
15484       if( zLine[h] ) zLine[h++] = 0;
15485       resolve_backslashes(azArg[nArg-1]);
15486     }
15487   }
15488   azArg[nArg] = 0;
15489 
15490   /* Process the input line.
15491   */
15492   if( nArg==0 ) return 0; /* no tokens, no error */
15493   n = strlen30(azArg[0]);
15494   c = azArg[0][0];
15495   clearTempFile(p);
15496 
15497 #ifndef SQLITE_OMIT_AUTHORIZATION
15498   if( c=='a' && strncmp(azArg[0], "auth", n)==0 ){
15499     if( nArg!=2 ){
15500       raw_printf(stderr, "Usage: .auth ON|OFF\n");
15501       rc = 1;
15502       goto meta_command_exit;
15503     }
15504     open_db(p, 0);
15505     if( booleanValue(azArg[1]) ){
15506       sqlite3_set_authorizer(p->db, shellAuth, p);
15507     }else{
15508       sqlite3_set_authorizer(p->db, 0, 0);
15509     }
15510   }else
15511 #endif
15512 
15513 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
15514   if( c=='a' && strncmp(azArg[0], "archive", n)==0 ){
15515     open_db(p, 0);
15516     rc = arDotCommand(p, 0, azArg, nArg);
15517   }else
15518 #endif
15519 
15520   if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0)
15521    || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0)
15522   ){
15523     const char *zDestFile = 0;
15524     const char *zDb = 0;
15525     sqlite3 *pDest;
15526     sqlite3_backup *pBackup;
15527     int j;
15528     int bAsync = 0;
15529     const char *zVfs = 0;
15530     for(j=1; j<nArg; j++){
15531       const char *z = azArg[j];
15532       if( z[0]=='-' ){
15533         if( z[1]=='-' ) z++;
15534         if( strcmp(z, "-append")==0 ){
15535           zVfs = "apndvfs";
15536         }else
15537         if( strcmp(z, "-async")==0 ){
15538           bAsync = 1;
15539         }else
15540         {
15541           utf8_printf(stderr, "unknown option: %s\n", azArg[j]);
15542           return 1;
15543         }
15544       }else if( zDestFile==0 ){
15545         zDestFile = azArg[j];
15546       }else if( zDb==0 ){
15547         zDb = zDestFile;
15548         zDestFile = azArg[j];
15549       }else{
15550         raw_printf(stderr, "Usage: .backup ?DB? ?OPTIONS? FILENAME\n");
15551         return 1;
15552       }
15553     }
15554     if( zDestFile==0 ){
15555       raw_printf(stderr, "missing FILENAME argument on .backup\n");
15556       return 1;
15557     }
15558     if( zDb==0 ) zDb = "main";
15559     rc = sqlite3_open_v2(zDestFile, &pDest,
15560                   SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE, zVfs);
15561     if( rc!=SQLITE_OK ){
15562       utf8_printf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
15563       close_db(pDest);
15564       return 1;
15565     }
15566     if( bAsync ){
15567       sqlite3_exec(pDest, "PRAGMA synchronous=OFF; PRAGMA journal_mode=OFF;",
15568                    0, 0, 0);
15569     }
15570     open_db(p, 0);
15571     pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
15572     if( pBackup==0 ){
15573       utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
15574       close_db(pDest);
15575       return 1;
15576     }
15577     while(  (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
15578     sqlite3_backup_finish(pBackup);
15579     if( rc==SQLITE_DONE ){
15580       rc = 0;
15581     }else{
15582       utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
15583       rc = 1;
15584     }
15585     close_db(pDest);
15586   }else
15587 
15588   if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 ){
15589     if( nArg==2 ){
15590       bail_on_error = booleanValue(azArg[1]);
15591     }else{
15592       raw_printf(stderr, "Usage: .bail on|off\n");
15593       rc = 1;
15594     }
15595   }else
15596 
15597   if( c=='b' && n>=3 && strncmp(azArg[0], "binary", n)==0 ){
15598     if( nArg==2 ){
15599       if( booleanValue(azArg[1]) ){
15600         setBinaryMode(p->out, 1);
15601       }else{
15602         setTextMode(p->out, 1);
15603       }
15604     }else{
15605       raw_printf(stderr, "Usage: .binary on|off\n");
15606       rc = 1;
15607     }
15608   }else
15609 
15610   if( c=='c' && strcmp(azArg[0],"cd")==0 ){
15611     if( nArg==2 ){
15612 #if defined(_WIN32) || defined(WIN32)
15613       wchar_t *z = sqlite3_win32_utf8_to_unicode(azArg[1]);
15614       rc = !SetCurrentDirectoryW(z);
15615       sqlite3_free(z);
15616 #else
15617       rc = chdir(azArg[1]);
15618 #endif
15619       if( rc ){
15620         utf8_printf(stderr, "Cannot change to directory \"%s\"\n", azArg[1]);
15621         rc = 1;
15622       }
15623     }else{
15624       raw_printf(stderr, "Usage: .cd DIRECTORY\n");
15625       rc = 1;
15626     }
15627   }else
15628 
15629   /* The undocumented ".breakpoint" command causes a call to the no-op
15630   ** routine named test_breakpoint().
15631   */
15632   if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
15633     test_breakpoint();
15634   }else
15635 
15636   if( c=='c' && n>=3 && strncmp(azArg[0], "changes", n)==0 ){
15637     if( nArg==2 ){
15638       setOrClearFlag(p, SHFLG_CountChanges, azArg[1]);
15639     }else{
15640       raw_printf(stderr, "Usage: .changes on|off\n");
15641       rc = 1;
15642     }
15643   }else
15644 
15645   /* Cancel output redirection, if it is currently set (by .testcase)
15646   ** Then read the content of the testcase-out.txt file and compare against
15647   ** azArg[1].  If there are differences, report an error and exit.
15648   */
15649   if( c=='c' && n>=3 && strncmp(azArg[0], "check", n)==0 ){
15650     char *zRes = 0;
15651     output_reset(p);
15652     if( nArg!=2 ){
15653       raw_printf(stderr, "Usage: .check GLOB-PATTERN\n");
15654       rc = 2;
15655     }else if( (zRes = readFile("testcase-out.txt", 0))==0 ){
15656       raw_printf(stderr, "Error: cannot read 'testcase-out.txt'\n");
15657       rc = 2;
15658     }else if( testcase_glob(azArg[1],zRes)==0 ){
15659       utf8_printf(stderr,
15660                  "testcase-%s FAILED\n Expected: [%s]\n      Got: [%s]\n",
15661                  p->zTestcase, azArg[1], zRes);
15662       rc = 1;
15663     }else{
15664       utf8_printf(stdout, "testcase-%s ok\n", p->zTestcase);
15665       p->nCheck++;
15666     }
15667     sqlite3_free(zRes);
15668   }else
15669 
15670   if( c=='c' && strncmp(azArg[0], "clone", n)==0 ){
15671     if( nArg==2 ){
15672       tryToClone(p, azArg[1]);
15673     }else{
15674       raw_printf(stderr, "Usage: .clone FILENAME\n");
15675       rc = 1;
15676     }
15677   }else
15678 
15679   if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){
15680     ShellState data;
15681     char *zErrMsg = 0;
15682     open_db(p, 0);
15683     memcpy(&data, p, sizeof(data));
15684     data.showHeader = 0;
15685     data.cMode = data.mode = MODE_List;
15686     sqlite3_snprintf(sizeof(data.colSeparator),data.colSeparator,": ");
15687     data.cnt = 0;
15688     sqlite3_exec(p->db, "SELECT name, file FROM pragma_database_list",
15689                  callback, &data, &zErrMsg);
15690     if( zErrMsg ){
15691       utf8_printf(stderr,"Error: %s\n", zErrMsg);
15692       sqlite3_free(zErrMsg);
15693       rc = 1;
15694     }
15695   }else
15696 
15697   if( c=='d' && n>=3 && strncmp(azArg[0], "dbconfig", n)==0 ){
15698     static const struct DbConfigChoices {
15699       const char *zName;
15700       int op;
15701     } aDbConfig[] = {
15702         { "enable_fkey",        SQLITE_DBCONFIG_ENABLE_FKEY           },
15703         { "enable_trigger",     SQLITE_DBCONFIG_ENABLE_TRIGGER        },
15704         { "enable_view",        SQLITE_DBCONFIG_ENABLE_VIEW           },
15705         { "fts3_tokenizer",     SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER },
15706         { "load_extension",     SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION },
15707         { "no_ckpt_on_close",   SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE      },
15708         { "enable_qpsg",        SQLITE_DBCONFIG_ENABLE_QPSG           },
15709         { "trigger_eqp",        SQLITE_DBCONFIG_TRIGGER_EQP           },
15710         { "reset_database",     SQLITE_DBCONFIG_RESET_DATABASE        },
15711         { "defensive",          SQLITE_DBCONFIG_DEFENSIVE             },
15712         { "writable_schema",    SQLITE_DBCONFIG_WRITABLE_SCHEMA       },
15713         { "legacy_alter_table", SQLITE_DBCONFIG_LEGACY_ALTER_TABLE    },
15714         { "dqs_dml",            SQLITE_DBCONFIG_DQS_DML               },
15715         { "dqs_ddl",            SQLITE_DBCONFIG_DQS_DDL               },
15716     };
15717     int ii, v;
15718     open_db(p, 0);
15719     for(ii=0; ii<ArraySize(aDbConfig); ii++){
15720       if( nArg>1 && strcmp(azArg[1], aDbConfig[ii].zName)!=0 ) continue;
15721       if( nArg>=3 ){
15722         sqlite3_db_config(p->db, aDbConfig[ii].op, booleanValue(azArg[2]), 0);
15723       }
15724       sqlite3_db_config(p->db, aDbConfig[ii].op, -1, &v);
15725       utf8_printf(p->out, "%18s %s\n", aDbConfig[ii].zName, v ? "on" : "off");
15726       if( nArg>1 ) break;
15727     }
15728     if( nArg>1 && ii==ArraySize(aDbConfig) ){
15729       utf8_printf(stderr, "Error: unknown dbconfig \"%s\"\n", azArg[1]);
15730       utf8_printf(stderr, "Enter \".dbconfig\" with no arguments for a list\n");
15731     }
15732   }else
15733 
15734   if( c=='d' && n>=3 && strncmp(azArg[0], "dbinfo", n)==0 ){
15735     rc = shell_dbinfo_command(p, nArg, azArg);
15736   }else
15737 
15738 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
15739   if( c=='r' && strncmp(azArg[0], "recover", n)==0 ){
15740     open_db(p, 0);
15741     rc = recoverDatabaseCmd(p, nArg, azArg);
15742   }else
15743 #endif /* !(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) */
15744 
15745   if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){
15746     const char *zLike = 0;
15747     int i;
15748     int savedShowHeader = p->showHeader;
15749     int savedShellFlags = p->shellFlgs;
15750     ShellClearFlag(p, SHFLG_PreserveRowid|SHFLG_Newlines|SHFLG_Echo);
15751     for(i=1; i<nArg; i++){
15752       if( azArg[i][0]=='-' ){
15753         const char *z = azArg[i]+1;
15754         if( z[0]=='-' ) z++;
15755         if( strcmp(z,"preserve-rowids")==0 ){
15756 #ifdef SQLITE_OMIT_VIRTUALTABLE
15757           raw_printf(stderr, "The --preserve-rowids option is not compatible"
15758                              " with SQLITE_OMIT_VIRTUALTABLE\n");
15759           rc = 1;
15760           goto meta_command_exit;
15761 #else
15762           ShellSetFlag(p, SHFLG_PreserveRowid);
15763 #endif
15764         }else
15765         if( strcmp(z,"newlines")==0 ){
15766           ShellSetFlag(p, SHFLG_Newlines);
15767         }else
15768         {
15769           raw_printf(stderr, "Unknown option \"%s\" on \".dump\"\n", azArg[i]);
15770           rc = 1;
15771           goto meta_command_exit;
15772         }
15773       }else if( zLike ){
15774         raw_printf(stderr, "Usage: .dump ?--preserve-rowids? "
15775                            "?--newlines? ?LIKE-PATTERN?\n");
15776         rc = 1;
15777         goto meta_command_exit;
15778       }else{
15779         zLike = azArg[i];
15780       }
15781     }
15782 
15783     open_db(p, 0);
15784 
15785     /* When playing back a "dump", the content might appear in an order
15786     ** which causes immediate foreign key constraints to be violated.
15787     ** So disable foreign-key constraint enforcement to prevent problems. */
15788     raw_printf(p->out, "PRAGMA foreign_keys=OFF;\n");
15789     raw_printf(p->out, "BEGIN TRANSACTION;\n");
15790     p->writableSchema = 0;
15791     p->showHeader = 0;
15792     /* Set writable_schema=ON since doing so forces SQLite to initialize
15793     ** as much of the schema as it can even if the sqlite_master table is
15794     ** corrupt. */
15795     sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
15796     p->nErr = 0;
15797     if( zLike==0 ){
15798       run_schema_dump_query(p,
15799         "SELECT name, type, sql FROM sqlite_master "
15800         "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'"
15801       );
15802       run_schema_dump_query(p,
15803         "SELECT name, type, sql FROM sqlite_master "
15804         "WHERE name=='sqlite_sequence'"
15805       );
15806       run_table_dump_query(p,
15807         "SELECT sql FROM sqlite_master "
15808         "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
15809       );
15810     }else{
15811       char *zSql;
15812       zSql = sqlite3_mprintf(
15813         "SELECT name, type, sql FROM sqlite_master "
15814         "WHERE tbl_name LIKE %Q AND type=='table'"
15815         "  AND sql NOT NULL", zLike);
15816       run_schema_dump_query(p,zSql);
15817       sqlite3_free(zSql);
15818       zSql = sqlite3_mprintf(
15819         "SELECT sql FROM sqlite_master "
15820         "WHERE sql NOT NULL"
15821         "  AND type IN ('index','trigger','view')"
15822         "  AND tbl_name LIKE %Q", zLike);
15823       run_table_dump_query(p, zSql, 0);
15824       sqlite3_free(zSql);
15825     }
15826     if( p->writableSchema ){
15827       raw_printf(p->out, "PRAGMA writable_schema=OFF;\n");
15828       p->writableSchema = 0;
15829     }
15830     sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
15831     sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
15832     raw_printf(p->out, p->nErr?"ROLLBACK; -- due to errors\n":"COMMIT;\n");
15833     p->showHeader = savedShowHeader;
15834     p->shellFlgs = savedShellFlags;
15835   }else
15836 
15837   if( c=='e' && strncmp(azArg[0], "echo", n)==0 ){
15838     if( nArg==2 ){
15839       setOrClearFlag(p, SHFLG_Echo, azArg[1]);
15840     }else{
15841       raw_printf(stderr, "Usage: .echo on|off\n");
15842       rc = 1;
15843     }
15844   }else
15845 
15846   if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){
15847     if( nArg==2 ){
15848       p->autoEQPtest = 0;
15849       if( p->autoEQPtrace ){
15850         if( p->db ) sqlite3_exec(p->db, "PRAGMA vdbe_trace=OFF;", 0, 0, 0);
15851         p->autoEQPtrace = 0;
15852       }
15853       if( strcmp(azArg[1],"full")==0 ){
15854         p->autoEQP = AUTOEQP_full;
15855       }else if( strcmp(azArg[1],"trigger")==0 ){
15856         p->autoEQP = AUTOEQP_trigger;
15857 #ifdef SQLITE_DEBUG
15858       }else if( strcmp(azArg[1],"test")==0 ){
15859         p->autoEQP = AUTOEQP_on;
15860         p->autoEQPtest = 1;
15861       }else if( strcmp(azArg[1],"trace")==0 ){
15862         p->autoEQP = AUTOEQP_full;
15863         p->autoEQPtrace = 1;
15864         open_db(p, 0);
15865         sqlite3_exec(p->db, "SELECT name FROM sqlite_master LIMIT 1", 0, 0, 0);
15866         sqlite3_exec(p->db, "PRAGMA vdbe_trace=ON;", 0, 0, 0);
15867 #endif
15868       }else{
15869         p->autoEQP = (u8)booleanValue(azArg[1]);
15870       }
15871     }else{
15872       raw_printf(stderr, "Usage: .eqp off|on|trace|trigger|full\n");
15873       rc = 1;
15874     }
15875   }else
15876 
15877   if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
15878     if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
15879     rc = 2;
15880   }else
15881 
15882   /* The ".explain" command is automatic now.  It is largely pointless.  It
15883   ** retained purely for backwards compatibility */
15884   if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){
15885     int val = 1;
15886     if( nArg>=2 ){
15887       if( strcmp(azArg[1],"auto")==0 ){
15888         val = 99;
15889       }else{
15890         val =  booleanValue(azArg[1]);
15891       }
15892     }
15893     if( val==1 && p->mode!=MODE_Explain ){
15894       p->normalMode = p->mode;
15895       p->mode = MODE_Explain;
15896       p->autoExplain = 0;
15897     }else if( val==0 ){
15898       if( p->mode==MODE_Explain ) p->mode = p->normalMode;
15899       p->autoExplain = 0;
15900     }else if( val==99 ){
15901       if( p->mode==MODE_Explain ) p->mode = p->normalMode;
15902       p->autoExplain = 1;
15903     }
15904   }else
15905 
15906 #ifndef SQLITE_OMIT_VIRTUALTABLE
15907   if( c=='e' && strncmp(azArg[0], "expert", n)==0 ){
15908     open_db(p, 0);
15909     expertDotCommand(p, azArg, nArg);
15910   }else
15911 #endif
15912 
15913   if( c=='f' && strncmp(azArg[0], "filectrl", n)==0 ){
15914     static const struct {
15915        const char *zCtrlName;   /* Name of a test-control option */
15916        int ctrlCode;            /* Integer code for that option */
15917        const char *zUsage;      /* Usage notes */
15918     } aCtrl[] = {
15919       { "size_limit",     SQLITE_FCNTL_SIZE_LIMIT,      "[LIMIT]"        },
15920       { "chunk_size",     SQLITE_FCNTL_CHUNK_SIZE,      "SIZE"           },
15921    /* { "win32_av_retry", SQLITE_FCNTL_WIN32_AV_RETRY,  "COUNT DELAY"    },*/
15922       { "persist_wal",    SQLITE_FCNTL_PERSIST_WAL,     "[BOOLEAN]"      },
15923       { "psow",       SQLITE_FCNTL_POWERSAFE_OVERWRITE, "[BOOLEAN]"      },
15924    /* { "pragma",         SQLITE_FCNTL_PRAGMA,          "NAME ARG"       },*/
15925       { "tempfilename",   SQLITE_FCNTL_TEMPFILENAME,    ""               },
15926       { "has_moved",      SQLITE_FCNTL_HAS_MOVED,       ""               },
15927       { "lock_timeout",   SQLITE_FCNTL_LOCK_TIMEOUT,    "MILLISEC"       },
15928     };
15929     int filectrl = -1;
15930     int iCtrl = -1;
15931     sqlite3_int64 iRes = 0;  /* Integer result to display if rc2==1 */
15932     int isOk = 0;            /* 0: usage  1: %lld  2: no-result */
15933     int n2, i;
15934     const char *zCmd = 0;
15935 
15936     open_db(p, 0);
15937     zCmd = nArg>=2 ? azArg[1] : "help";
15938 
15939     /* The argument can optionally begin with "-" or "--" */
15940     if( zCmd[0]=='-' && zCmd[1] ){
15941       zCmd++;
15942       if( zCmd[0]=='-' && zCmd[1] ) zCmd++;
15943     }
15944 
15945     /* --help lists all file-controls */
15946     if( strcmp(zCmd,"help")==0 ){
15947       utf8_printf(p->out, "Available file-controls:\n");
15948       for(i=0; i<ArraySize(aCtrl); i++){
15949         utf8_printf(p->out, "  .filectrl %s %s\n",
15950                     aCtrl[i].zCtrlName, aCtrl[i].zUsage);
15951       }
15952       rc = 1;
15953       goto meta_command_exit;
15954     }
15955 
15956     /* convert filectrl text option to value. allow any unique prefix
15957     ** of the option name, or a numerical value. */
15958     n2 = strlen30(zCmd);
15959     for(i=0; i<ArraySize(aCtrl); i++){
15960       if( strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){
15961         if( filectrl<0 ){
15962           filectrl = aCtrl[i].ctrlCode;
15963           iCtrl = i;
15964         }else{
15965           utf8_printf(stderr, "Error: ambiguous file-control: \"%s\"\n"
15966                               "Use \".filectrl --help\" for help\n", zCmd);
15967           rc = 1;
15968           goto meta_command_exit;
15969         }
15970       }
15971     }
15972     if( filectrl<0 ){
15973       utf8_printf(stderr,"Error: unknown file-control: %s\n"
15974                          "Use \".filectrl --help\" for help\n", zCmd);
15975     }else{
15976       switch(filectrl){
15977         case SQLITE_FCNTL_SIZE_LIMIT: {
15978           if( nArg!=2 && nArg!=3 ) break;
15979           iRes = nArg==3 ? integerValue(azArg[2]) : -1;
15980           sqlite3_file_control(p->db, 0, SQLITE_FCNTL_SIZE_LIMIT, &iRes);
15981           isOk = 1;
15982           break;
15983         }
15984         case SQLITE_FCNTL_LOCK_TIMEOUT:
15985         case SQLITE_FCNTL_CHUNK_SIZE: {
15986           int x;
15987           if( nArg!=3 ) break;
15988           x = (int)integerValue(azArg[2]);
15989           sqlite3_file_control(p->db, 0, filectrl, &x);
15990           isOk = 2;
15991           break;
15992         }
15993         case SQLITE_FCNTL_PERSIST_WAL:
15994         case SQLITE_FCNTL_POWERSAFE_OVERWRITE: {
15995           int x;
15996           if( nArg!=2 && nArg!=3 ) break;
15997           x = nArg==3 ? booleanValue(azArg[2]) : -1;
15998           sqlite3_file_control(p->db, 0, filectrl, &x);
15999           iRes = x;
16000           isOk = 1;
16001           break;
16002         }
16003         case SQLITE_FCNTL_HAS_MOVED: {
16004           int x;
16005           if( nArg!=2 ) break;
16006           sqlite3_file_control(p->db, 0, filectrl, &x);
16007           iRes = x;
16008           isOk = 1;
16009           break;
16010         }
16011         case SQLITE_FCNTL_TEMPFILENAME: {
16012           char *z = 0;
16013           if( nArg!=2 ) break;
16014           sqlite3_file_control(p->db, 0, filectrl, &z);
16015           if( z ){
16016             utf8_printf(p->out, "%s\n", z);
16017             sqlite3_free(z);
16018           }
16019           isOk = 2;
16020           break;
16021         }
16022       }
16023     }
16024     if( isOk==0 && iCtrl>=0 ){
16025       utf8_printf(p->out, "Usage: .filectrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage);
16026       rc = 1;
16027     }else if( isOk==1 ){
16028       char zBuf[100];
16029       sqlite3_snprintf(sizeof(zBuf), zBuf, "%lld", iRes);
16030       raw_printf(p->out, "%s\n", zBuf);
16031     }
16032   }else
16033 
16034   if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){
16035     ShellState data;
16036     char *zErrMsg = 0;
16037     int doStats = 0;
16038     memcpy(&data, p, sizeof(data));
16039     data.showHeader = 0;
16040     data.cMode = data.mode = MODE_Semi;
16041     if( nArg==2 && optionMatch(azArg[1], "indent") ){
16042       data.cMode = data.mode = MODE_Pretty;
16043       nArg = 1;
16044     }
16045     if( nArg!=1 ){
16046       raw_printf(stderr, "Usage: .fullschema ?--indent?\n");
16047       rc = 1;
16048       goto meta_command_exit;
16049     }
16050     open_db(p, 0);
16051     rc = sqlite3_exec(p->db,
16052        "SELECT sql FROM"
16053        "  (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
16054        "     FROM sqlite_master UNION ALL"
16055        "   SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
16056        "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
16057        "ORDER BY rowid",
16058        callback, &data, &zErrMsg
16059     );
16060     if( rc==SQLITE_OK ){
16061       sqlite3_stmt *pStmt;
16062       rc = sqlite3_prepare_v2(p->db,
16063                "SELECT rowid FROM sqlite_master"
16064                " WHERE name GLOB 'sqlite_stat[134]'",
16065                -1, &pStmt, 0);
16066       doStats = sqlite3_step(pStmt)==SQLITE_ROW;
16067       sqlite3_finalize(pStmt);
16068     }
16069     if( doStats==0 ){
16070       raw_printf(p->out, "/* No STAT tables available */\n");
16071     }else{
16072       raw_printf(p->out, "ANALYZE sqlite_master;\n");
16073       sqlite3_exec(p->db, "SELECT 'ANALYZE sqlite_master'",
16074                    callback, &data, &zErrMsg);
16075       data.cMode = data.mode = MODE_Insert;
16076       data.zDestTable = "sqlite_stat1";
16077       shell_exec(&data, "SELECT * FROM sqlite_stat1", &zErrMsg);
16078       data.zDestTable = "sqlite_stat4";
16079       shell_exec(&data, "SELECT * FROM sqlite_stat4", &zErrMsg);
16080       raw_printf(p->out, "ANALYZE sqlite_master;\n");
16081     }
16082   }else
16083 
16084   if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){
16085     if( nArg==2 ){
16086       p->showHeader = booleanValue(azArg[1]);
16087     }else{
16088       raw_printf(stderr, "Usage: .headers on|off\n");
16089       rc = 1;
16090     }
16091   }else
16092 
16093   if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
16094     if( nArg>=2 ){
16095       n = showHelp(p->out, azArg[1]);
16096       if( n==0 ){
16097         utf8_printf(p->out, "Nothing matches '%s'\n", azArg[1]);
16098       }
16099     }else{
16100       showHelp(p->out, 0);
16101     }
16102   }else
16103 
16104   if( c=='i' && strncmp(azArg[0], "import", n)==0 ){
16105     char *zTable;               /* Insert data into this table */
16106     char *zFile;                /* Name of file to extra content from */
16107     sqlite3_stmt *pStmt = NULL; /* A statement */
16108     int nCol;                   /* Number of columns in the table */
16109     int nByte;                  /* Number of bytes in an SQL string */
16110     int i, j;                   /* Loop counters */
16111     int needCommit;             /* True to COMMIT or ROLLBACK at end */
16112     int nSep;                   /* Number of bytes in p->colSeparator[] */
16113     char *zSql;                 /* An SQL statement */
16114     ImportCtx sCtx;             /* Reader context */
16115     char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */
16116     int (SQLITE_CDECL *xCloser)(FILE*);      /* Func to close file */
16117 
16118     if( nArg!=3 ){
16119       raw_printf(stderr, "Usage: .import FILE TABLE\n");
16120       goto meta_command_exit;
16121     }
16122     zFile = azArg[1];
16123     zTable = azArg[2];
16124     seenInterrupt = 0;
16125     memset(&sCtx, 0, sizeof(sCtx));
16126     open_db(p, 0);
16127     nSep = strlen30(p->colSeparator);
16128     if( nSep==0 ){
16129       raw_printf(stderr,
16130                  "Error: non-null column separator required for import\n");
16131       return 1;
16132     }
16133     if( nSep>1 ){
16134       raw_printf(stderr, "Error: multi-character column separators not allowed"
16135                       " for import\n");
16136       return 1;
16137     }
16138     nSep = strlen30(p->rowSeparator);
16139     if( nSep==0 ){
16140       raw_printf(stderr, "Error: non-null row separator required for import\n");
16141       return 1;
16142     }
16143     if( nSep==2 && p->mode==MODE_Csv && strcmp(p->rowSeparator, SEP_CrLf)==0 ){
16144       /* When importing CSV (only), if the row separator is set to the
16145       ** default output row separator, change it to the default input
16146       ** row separator.  This avoids having to maintain different input
16147       ** and output row separators. */
16148       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
16149       nSep = strlen30(p->rowSeparator);
16150     }
16151     if( nSep>1 ){
16152       raw_printf(stderr, "Error: multi-character row separators not allowed"
16153                       " for import\n");
16154       return 1;
16155     }
16156     sCtx.zFile = zFile;
16157     sCtx.nLine = 1;
16158     if( sCtx.zFile[0]=='|' ){
16159 #ifdef SQLITE_OMIT_POPEN
16160       raw_printf(stderr, "Error: pipes are not supported in this OS\n");
16161       return 1;
16162 #else
16163       sCtx.in = popen(sCtx.zFile+1, "r");
16164       sCtx.zFile = "<pipe>";
16165       xCloser = pclose;
16166 #endif
16167     }else{
16168       sCtx.in = fopen(sCtx.zFile, "rb");
16169       xCloser = fclose;
16170     }
16171     if( p->mode==MODE_Ascii ){
16172       xRead = ascii_read_one_field;
16173     }else{
16174       xRead = csv_read_one_field;
16175     }
16176     if( sCtx.in==0 ){
16177       utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
16178       return 1;
16179     }
16180     sCtx.cColSep = p->colSeparator[0];
16181     sCtx.cRowSep = p->rowSeparator[0];
16182     zSql = sqlite3_mprintf("SELECT * FROM %s", zTable);
16183     if( zSql==0 ){
16184       xCloser(sCtx.in);
16185       shell_out_of_memory();
16186     }
16187     nByte = strlen30(zSql);
16188     rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
16189     import_append_char(&sCtx, 0);    /* To ensure sCtx.z is allocated */
16190     if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(p->db))==0 ){
16191       char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable);
16192       char cSep = '(';
16193       while( xRead(&sCtx) ){
16194         zCreate = sqlite3_mprintf("%z%c\n  \"%w\" TEXT", zCreate, cSep, sCtx.z);
16195         cSep = ',';
16196         if( sCtx.cTerm!=sCtx.cColSep ) break;
16197       }
16198       if( cSep=='(' ){
16199         sqlite3_free(zCreate);
16200         sqlite3_free(sCtx.z);
16201         xCloser(sCtx.in);
16202         utf8_printf(stderr,"%s: empty file\n", sCtx.zFile);
16203         return 1;
16204       }
16205       zCreate = sqlite3_mprintf("%z\n)", zCreate);
16206       rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
16207       sqlite3_free(zCreate);
16208       if( rc ){
16209         utf8_printf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable,
16210                 sqlite3_errmsg(p->db));
16211         sqlite3_free(sCtx.z);
16212         xCloser(sCtx.in);
16213         return 1;
16214       }
16215       rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
16216     }
16217     sqlite3_free(zSql);
16218     if( rc ){
16219       if (pStmt) sqlite3_finalize(pStmt);
16220       utf8_printf(stderr,"Error: %s\n", sqlite3_errmsg(p->db));
16221       xCloser(sCtx.in);
16222       return 1;
16223     }
16224     nCol = sqlite3_column_count(pStmt);
16225     sqlite3_finalize(pStmt);
16226     pStmt = 0;
16227     if( nCol==0 ) return 0; /* no columns, no error */
16228     zSql = sqlite3_malloc64( nByte*2 + 20 + nCol*2 );
16229     if( zSql==0 ){
16230       xCloser(sCtx.in);
16231       shell_out_of_memory();
16232     }
16233     sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
16234     j = strlen30(zSql);
16235     for(i=1; i<nCol; i++){
16236       zSql[j++] = ',';
16237       zSql[j++] = '?';
16238     }
16239     zSql[j++] = ')';
16240     zSql[j] = 0;
16241     rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
16242     sqlite3_free(zSql);
16243     if( rc ){
16244       utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
16245       if (pStmt) sqlite3_finalize(pStmt);
16246       xCloser(sCtx.in);
16247       return 1;
16248     }
16249     needCommit = sqlite3_get_autocommit(p->db);
16250     if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
16251     do{
16252       int startLine = sCtx.nLine;
16253       for(i=0; i<nCol; i++){
16254         char *z = xRead(&sCtx);
16255         /*
16256         ** Did we reach end-of-file before finding any columns?
16257         ** If so, stop instead of NULL filling the remaining columns.
16258         */
16259         if( z==0 && i==0 ) break;
16260         /*
16261         ** Did we reach end-of-file OR end-of-line before finding any
16262         ** columns in ASCII mode?  If so, stop instead of NULL filling
16263         ** the remaining columns.
16264         */
16265         if( p->mode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break;
16266         sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
16267         if( i<nCol-1 && sCtx.cTerm!=sCtx.cColSep ){
16268           utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
16269                           "filling the rest with NULL\n",
16270                           sCtx.zFile, startLine, nCol, i+1);
16271           i += 2;
16272           while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; }
16273         }
16274       }
16275       if( sCtx.cTerm==sCtx.cColSep ){
16276         do{
16277           xRead(&sCtx);
16278           i++;
16279         }while( sCtx.cTerm==sCtx.cColSep );
16280         utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
16281                         "extras ignored\n",
16282                         sCtx.zFile, startLine, nCol, i);
16283       }
16284       if( i>=nCol ){
16285         sqlite3_step(pStmt);
16286         rc = sqlite3_reset(pStmt);
16287         if( rc!=SQLITE_OK ){
16288           utf8_printf(stderr, "%s:%d: INSERT failed: %s\n", sCtx.zFile,
16289                       startLine, sqlite3_errmsg(p->db));
16290         }
16291       }
16292     }while( sCtx.cTerm!=EOF );
16293 
16294     xCloser(sCtx.in);
16295     sqlite3_free(sCtx.z);
16296     sqlite3_finalize(pStmt);
16297     if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0);
16298   }else
16299 
16300 #ifndef SQLITE_UNTESTABLE
16301   if( c=='i' && strncmp(azArg[0], "imposter", n)==0 ){
16302     char *zSql;
16303     char *zCollist = 0;
16304     sqlite3_stmt *pStmt;
16305     int tnum = 0;
16306     int i;
16307     if( !(nArg==3 || (nArg==2 && sqlite3_stricmp(azArg[1],"off")==0)) ){
16308       utf8_printf(stderr, "Usage: .imposter INDEX IMPOSTER\n"
16309                           "       .imposter off\n");
16310       rc = 1;
16311       goto meta_command_exit;
16312     }
16313     open_db(p, 0);
16314     if( nArg==2 ){
16315       sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 1);
16316       goto meta_command_exit;
16317     }
16318     zSql = sqlite3_mprintf("SELECT rootpage FROM sqlite_master"
16319                            " WHERE name='%q' AND type='index'", azArg[1]);
16320     sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
16321     sqlite3_free(zSql);
16322     if( sqlite3_step(pStmt)==SQLITE_ROW ){
16323       tnum = sqlite3_column_int(pStmt, 0);
16324     }
16325     sqlite3_finalize(pStmt);
16326     if( tnum==0 ){
16327       utf8_printf(stderr, "no such index: \"%s\"\n", azArg[1]);
16328       rc = 1;
16329       goto meta_command_exit;
16330     }
16331     zSql = sqlite3_mprintf("PRAGMA index_xinfo='%q'", azArg[1]);
16332     rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
16333     sqlite3_free(zSql);
16334     i = 0;
16335     while( sqlite3_step(pStmt)==SQLITE_ROW ){
16336       char zLabel[20];
16337       const char *zCol = (const char*)sqlite3_column_text(pStmt,2);
16338       i++;
16339       if( zCol==0 ){
16340         if( sqlite3_column_int(pStmt,1)==-1 ){
16341           zCol = "_ROWID_";
16342         }else{
16343           sqlite3_snprintf(sizeof(zLabel),zLabel,"expr%d",i);
16344           zCol = zLabel;
16345         }
16346       }
16347       if( zCollist==0 ){
16348         zCollist = sqlite3_mprintf("\"%w\"", zCol);
16349       }else{
16350         zCollist = sqlite3_mprintf("%z,\"%w\"", zCollist, zCol);
16351       }
16352     }
16353     sqlite3_finalize(pStmt);
16354     zSql = sqlite3_mprintf(
16355           "CREATE TABLE \"%w\"(%s,PRIMARY KEY(%s))WITHOUT ROWID",
16356           azArg[2], zCollist, zCollist);
16357     sqlite3_free(zCollist);
16358     rc = sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 1, tnum);
16359     if( rc==SQLITE_OK ){
16360       rc = sqlite3_exec(p->db, zSql, 0, 0, 0);
16361       sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 0);
16362       if( rc ){
16363         utf8_printf(stderr, "Error in [%s]: %s\n", zSql, sqlite3_errmsg(p->db));
16364       }else{
16365         utf8_printf(stdout, "%s;\n", zSql);
16366         raw_printf(stdout,
16367            "WARNING: writing to an imposter table will corrupt the index!\n"
16368         );
16369       }
16370     }else{
16371       raw_printf(stderr, "SQLITE_TESTCTRL_IMPOSTER returns %d\n", rc);
16372       rc = 1;
16373     }
16374     sqlite3_free(zSql);
16375   }else
16376 #endif /* !defined(SQLITE_OMIT_TEST_CONTROL) */
16377 
16378 #ifdef SQLITE_ENABLE_IOTRACE
16379   if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
16380     SQLITE_API extern void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...);
16381     if( iotrace && iotrace!=stdout ) fclose(iotrace);
16382     iotrace = 0;
16383     if( nArg<2 ){
16384       sqlite3IoTrace = 0;
16385     }else if( strcmp(azArg[1], "-")==0 ){
16386       sqlite3IoTrace = iotracePrintf;
16387       iotrace = stdout;
16388     }else{
16389       iotrace = fopen(azArg[1], "w");
16390       if( iotrace==0 ){
16391         utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
16392         sqlite3IoTrace = 0;
16393         rc = 1;
16394       }else{
16395         sqlite3IoTrace = iotracePrintf;
16396       }
16397     }
16398   }else
16399 #endif
16400 
16401   if( c=='l' && n>=5 && strncmp(azArg[0], "limits", n)==0 ){
16402     static const struct {
16403        const char *zLimitName;   /* Name of a limit */
16404        int limitCode;            /* Integer code for that limit */
16405     } aLimit[] = {
16406       { "length",                SQLITE_LIMIT_LENGTH                    },
16407       { "sql_length",            SQLITE_LIMIT_SQL_LENGTH                },
16408       { "column",                SQLITE_LIMIT_COLUMN                    },
16409       { "expr_depth",            SQLITE_LIMIT_EXPR_DEPTH                },
16410       { "compound_select",       SQLITE_LIMIT_COMPOUND_SELECT           },
16411       { "vdbe_op",               SQLITE_LIMIT_VDBE_OP                   },
16412       { "function_arg",          SQLITE_LIMIT_FUNCTION_ARG              },
16413       { "attached",              SQLITE_LIMIT_ATTACHED                  },
16414       { "like_pattern_length",   SQLITE_LIMIT_LIKE_PATTERN_LENGTH       },
16415       { "variable_number",       SQLITE_LIMIT_VARIABLE_NUMBER           },
16416       { "trigger_depth",         SQLITE_LIMIT_TRIGGER_DEPTH             },
16417       { "worker_threads",        SQLITE_LIMIT_WORKER_THREADS            },
16418     };
16419     int i, n2;
16420     open_db(p, 0);
16421     if( nArg==1 ){
16422       for(i=0; i<ArraySize(aLimit); i++){
16423         printf("%20s %d\n", aLimit[i].zLimitName,
16424                sqlite3_limit(p->db, aLimit[i].limitCode, -1));
16425       }
16426     }else if( nArg>3 ){
16427       raw_printf(stderr, "Usage: .limit NAME ?NEW-VALUE?\n");
16428       rc = 1;
16429       goto meta_command_exit;
16430     }else{
16431       int iLimit = -1;
16432       n2 = strlen30(azArg[1]);
16433       for(i=0; i<ArraySize(aLimit); i++){
16434         if( sqlite3_strnicmp(aLimit[i].zLimitName, azArg[1], n2)==0 ){
16435           if( iLimit<0 ){
16436             iLimit = i;
16437           }else{
16438             utf8_printf(stderr, "ambiguous limit: \"%s\"\n", azArg[1]);
16439             rc = 1;
16440             goto meta_command_exit;
16441           }
16442         }
16443       }
16444       if( iLimit<0 ){
16445         utf8_printf(stderr, "unknown limit: \"%s\"\n"
16446                         "enter \".limits\" with no arguments for a list.\n",
16447                          azArg[1]);
16448         rc = 1;
16449         goto meta_command_exit;
16450       }
16451       if( nArg==3 ){
16452         sqlite3_limit(p->db, aLimit[iLimit].limitCode,
16453                       (int)integerValue(azArg[2]));
16454       }
16455       printf("%20s %d\n", aLimit[iLimit].zLimitName,
16456              sqlite3_limit(p->db, aLimit[iLimit].limitCode, -1));
16457     }
16458   }else
16459 
16460   if( c=='l' && n>2 && strncmp(azArg[0], "lint", n)==0 ){
16461     open_db(p, 0);
16462     lintDotCommand(p, azArg, nArg);
16463   }else
16464 
16465 #ifndef SQLITE_OMIT_LOAD_EXTENSION
16466   if( c=='l' && strncmp(azArg[0], "load", n)==0 ){
16467     const char *zFile, *zProc;
16468     char *zErrMsg = 0;
16469     if( nArg<2 ){
16470       raw_printf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n");
16471       rc = 1;
16472       goto meta_command_exit;
16473     }
16474     zFile = azArg[1];
16475     zProc = nArg>=3 ? azArg[2] : 0;
16476     open_db(p, 0);
16477     rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
16478     if( rc!=SQLITE_OK ){
16479       utf8_printf(stderr, "Error: %s\n", zErrMsg);
16480       sqlite3_free(zErrMsg);
16481       rc = 1;
16482     }
16483   }else
16484 #endif
16485 
16486   if( c=='l' && strncmp(azArg[0], "log", n)==0 ){
16487     if( nArg!=2 ){
16488       raw_printf(stderr, "Usage: .log FILENAME\n");
16489       rc = 1;
16490     }else{
16491       const char *zFile = azArg[1];
16492       output_file_close(p->pLog);
16493       p->pLog = output_file_open(zFile, 0);
16494     }
16495   }else
16496 
16497   if( c=='m' && strncmp(azArg[0], "mode", n)==0 ){
16498     const char *zMode = nArg>=2 ? azArg[1] : "";
16499     int n2 = strlen30(zMode);
16500     int c2 = zMode[0];
16501     if( c2=='l' && n2>2 && strncmp(azArg[1],"lines",n2)==0 ){
16502       p->mode = MODE_Line;
16503       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
16504     }else if( c2=='c' && strncmp(azArg[1],"columns",n2)==0 ){
16505       p->mode = MODE_Column;
16506       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
16507     }else if( c2=='l' && n2>2 && strncmp(azArg[1],"list",n2)==0 ){
16508       p->mode = MODE_List;
16509       sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Column);
16510       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
16511     }else if( c2=='h' && strncmp(azArg[1],"html",n2)==0 ){
16512       p->mode = MODE_Html;
16513     }else if( c2=='t' && strncmp(azArg[1],"tcl",n2)==0 ){
16514       p->mode = MODE_Tcl;
16515       sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Space);
16516       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
16517     }else if( c2=='c' && strncmp(azArg[1],"csv",n2)==0 ){
16518       p->mode = MODE_Csv;
16519       sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
16520       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
16521     }else if( c2=='t' && strncmp(azArg[1],"tabs",n2)==0 ){
16522       p->mode = MODE_List;
16523       sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Tab);
16524     }else if( c2=='i' && strncmp(azArg[1],"insert",n2)==0 ){
16525       p->mode = MODE_Insert;
16526       set_table_name(p, nArg>=3 ? azArg[2] : "table");
16527     }else if( c2=='q' && strncmp(azArg[1],"quote",n2)==0 ){
16528       p->mode = MODE_Quote;
16529     }else if( c2=='a' && strncmp(azArg[1],"ascii",n2)==0 ){
16530       p->mode = MODE_Ascii;
16531       sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit);
16532       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record);
16533     }else if( nArg==1 ){
16534       raw_printf(p->out, "current output mode: %s\n", modeDescr[p->mode]);
16535     }else{
16536       raw_printf(stderr, "Error: mode should be one of: "
16537          "ascii column csv html insert line list quote tabs tcl\n");
16538       rc = 1;
16539     }
16540     p->cMode = p->mode;
16541   }else
16542 
16543   if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){
16544     if( nArg==2 ){
16545       sqlite3_snprintf(sizeof(p->nullValue), p->nullValue,
16546                        "%.*s", (int)ArraySize(p->nullValue)-1, azArg[1]);
16547     }else{
16548       raw_printf(stderr, "Usage: .nullvalue STRING\n");
16549       rc = 1;
16550     }
16551   }else
16552 
16553   if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
16554     char *zNewFilename;  /* Name of the database file to open */
16555     int iName = 1;       /* Index in azArg[] of the filename */
16556     int newFlag = 0;     /* True to delete file before opening */
16557     /* Close the existing database */
16558     session_close_all(p);
16559     close_db(p->db);
16560     p->db = 0;
16561     p->zDbFilename = 0;
16562     sqlite3_free(p->zFreeOnClose);
16563     p->zFreeOnClose = 0;
16564     p->openMode = SHELL_OPEN_UNSPEC;
16565     p->szMax = 0;
16566     /* Check for command-line arguments */
16567     for(iName=1; iName<nArg && azArg[iName][0]=='-'; iName++){
16568       const char *z = azArg[iName];
16569       if( optionMatch(z,"new") ){
16570         newFlag = 1;
16571 #ifdef SQLITE_HAVE_ZLIB
16572       }else if( optionMatch(z, "zip") ){
16573         p->openMode = SHELL_OPEN_ZIPFILE;
16574 #endif
16575       }else if( optionMatch(z, "append") ){
16576         p->openMode = SHELL_OPEN_APPENDVFS;
16577       }else if( optionMatch(z, "readonly") ){
16578         p->openMode = SHELL_OPEN_READONLY;
16579 #ifdef SQLITE_ENABLE_DESERIALIZE
16580       }else if( optionMatch(z, "deserialize") ){
16581         p->openMode = SHELL_OPEN_DESERIALIZE;
16582       }else if( optionMatch(z, "hexdb") ){
16583         p->openMode = SHELL_OPEN_HEXDB;
16584       }else if( optionMatch(z, "maxsize") && iName+1<nArg ){
16585         p->szMax = integerValue(azArg[++iName]);
16586 #endif /* SQLITE_ENABLE_DESERIALIZE */
16587       }else if( z[0]=='-' ){
16588         utf8_printf(stderr, "unknown option: %s\n", z);
16589         rc = 1;
16590         goto meta_command_exit;
16591       }
16592     }
16593     /* If a filename is specified, try to open it first */
16594     zNewFilename = nArg>iName ? sqlite3_mprintf("%s", azArg[iName]) : 0;
16595     if( zNewFilename || p->openMode==SHELL_OPEN_HEXDB ){
16596       if( newFlag ) shellDeleteFile(zNewFilename);
16597       p->zDbFilename = zNewFilename;
16598       open_db(p, OPEN_DB_KEEPALIVE);
16599       if( p->db==0 ){
16600         utf8_printf(stderr, "Error: cannot open '%s'\n", zNewFilename);
16601         sqlite3_free(zNewFilename);
16602       }else{
16603         p->zFreeOnClose = zNewFilename;
16604       }
16605     }
16606     if( p->db==0 ){
16607       /* As a fall-back open a TEMP database */
16608       p->zDbFilename = 0;
16609       open_db(p, 0);
16610     }
16611   }else
16612 
16613   if( (c=='o'
16614         && (strncmp(azArg[0], "output", n)==0||strncmp(azArg[0], "once", n)==0))
16615    || (c=='e' && n==5 && strcmp(azArg[0],"excel")==0)
16616   ){
16617     const char *zFile = nArg>=2 ? azArg[1] : "stdout";
16618     int bTxtMode = 0;
16619     if( azArg[0][0]=='e' ){
16620       /* Transform the ".excel" command into ".once -x" */
16621       nArg = 2;
16622       azArg[0] = "once";
16623       zFile = azArg[1] = "-x";
16624       n = 4;
16625     }
16626     if( nArg>2 ){
16627       utf8_printf(stderr, "Usage: .%s [-e|-x|FILE]\n", azArg[0]);
16628       rc = 1;
16629       goto meta_command_exit;
16630     }
16631     if( n>1 && strncmp(azArg[0], "once", n)==0 ){
16632       if( nArg<2 ){
16633         raw_printf(stderr, "Usage: .once (-e|-x|FILE)\n");
16634         rc = 1;
16635         goto meta_command_exit;
16636       }
16637       p->outCount = 2;
16638     }else{
16639       p->outCount = 0;
16640     }
16641     output_reset(p);
16642     if( zFile[0]=='-' && zFile[1]=='-' ) zFile++;
16643 #ifndef SQLITE_NOHAVE_SYSTEM
16644     if( strcmp(zFile, "-e")==0 || strcmp(zFile, "-x")==0 ){
16645       p->doXdgOpen = 1;
16646       outputModePush(p);
16647       if( zFile[1]=='x' ){
16648         newTempFile(p, "csv");
16649         p->mode = MODE_Csv;
16650         sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
16651         sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
16652       }else{
16653         newTempFile(p, "txt");
16654         bTxtMode = 1;
16655       }
16656       zFile = p->zTempFile;
16657     }
16658 #endif /* SQLITE_NOHAVE_SYSTEM */
16659     if( zFile[0]=='|' ){
16660 #ifdef SQLITE_OMIT_POPEN
16661       raw_printf(stderr, "Error: pipes are not supported in this OS\n");
16662       rc = 1;
16663       p->out = stdout;
16664 #else
16665       p->out = popen(zFile + 1, "w");
16666       if( p->out==0 ){
16667         utf8_printf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1);
16668         p->out = stdout;
16669         rc = 1;
16670       }else{
16671         sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
16672       }
16673 #endif
16674     }else{
16675       p->out = output_file_open(zFile, bTxtMode);
16676       if( p->out==0 ){
16677         if( strcmp(zFile,"off")!=0 ){
16678           utf8_printf(stderr,"Error: cannot write to \"%s\"\n", zFile);
16679         }
16680         p->out = stdout;
16681         rc = 1;
16682       } else {
16683         sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
16684       }
16685     }
16686   }else
16687 
16688   if( c=='p' && n>=3 && strncmp(azArg[0], "parameter", n)==0 ){
16689     open_db(p,0);
16690     if( nArg<=1 ) goto parameter_syntax_error;
16691 
16692     /* .parameter clear
16693     ** Clear all bind parameters by dropping the TEMP table that holds them.
16694     */
16695     if( nArg==2 && strcmp(azArg[1],"clear")==0 ){
16696       sqlite3_exec(p->db, "DROP TABLE IF EXISTS temp.sqlite_parameters;",
16697                    0, 0, 0);
16698     }else
16699 
16700     /* .parameter list
16701     ** List all bind parameters.
16702     */
16703     if( nArg==2 && strcmp(azArg[1],"list")==0 ){
16704       sqlite3_stmt *pStmt = 0;
16705       int rx;
16706       int len = 0;
16707       rx = sqlite3_prepare_v2(p->db,
16708              "SELECT max(length(key)) "
16709              "FROM temp.sqlite_parameters;", -1, &pStmt, 0);
16710       if( rx==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
16711         len = sqlite3_column_int(pStmt, 0);
16712         if( len>40 ) len = 40;
16713       }
16714       sqlite3_finalize(pStmt);
16715       pStmt = 0;
16716       if( len ){
16717         rx = sqlite3_prepare_v2(p->db,
16718              "SELECT key, quote(value) "
16719              "FROM temp.sqlite_parameters;", -1, &pStmt, 0);
16720         while( sqlite3_step(pStmt)==SQLITE_ROW ){
16721           utf8_printf(p->out, "%-*s %s\n", len, sqlite3_column_text(pStmt,0),
16722                       sqlite3_column_text(pStmt,1));
16723         }
16724         sqlite3_finalize(pStmt);
16725       }
16726     }else
16727 
16728     /* .parameter init
16729     ** Make sure the TEMP table used to hold bind parameters exists.
16730     ** Create it if necessary.
16731     */
16732     if( nArg==2 && strcmp(azArg[1],"init")==0 ){
16733       bind_table_init(p);
16734     }else
16735 
16736     /* .parameter set NAME VALUE
16737     ** Set or reset a bind parameter.  NAME should be the full parameter
16738     ** name exactly as it appears in the query.  (ex: $abc, @def).  The
16739     ** VALUE can be in either SQL literal notation, or if not it will be
16740     ** understood to be a text string.
16741     */
16742     if( nArg==4 && strcmp(azArg[1],"set")==0 ){
16743       int rx;
16744       char *zSql;
16745       sqlite3_stmt *pStmt;
16746       const char *zKey = azArg[2];
16747       const char *zValue = azArg[3];
16748       bind_table_init(p);
16749       zSql = sqlite3_mprintf(
16750                   "REPLACE INTO temp.sqlite_parameters(key,value)"
16751                   "VALUES(%Q,%s);", zKey, zValue);
16752       if( zSql==0 ) shell_out_of_memory();
16753       pStmt = 0;
16754       rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
16755       sqlite3_free(zSql);
16756       if( rx!=SQLITE_OK ){
16757         sqlite3_finalize(pStmt);
16758         pStmt = 0;
16759         zSql = sqlite3_mprintf(
16760                    "REPLACE INTO temp.sqlite_parameters(key,value)"
16761                    "VALUES(%Q,%Q);", zKey, zValue);
16762         if( zSql==0 ) shell_out_of_memory();
16763         rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
16764         sqlite3_free(zSql);
16765         if( rx!=SQLITE_OK ){
16766           utf8_printf(p->out, "Error: %s\n", sqlite3_errmsg(p->db));
16767           sqlite3_finalize(pStmt);
16768           pStmt = 0;
16769           rc = 1;
16770         }
16771       }
16772       sqlite3_step(pStmt);
16773       sqlite3_finalize(pStmt);
16774     }else
16775 
16776     /* .parameter unset NAME
16777     ** Remove the NAME binding from the parameter binding table, if it
16778     ** exists.
16779     */
16780     if( nArg==3 && strcmp(azArg[1],"unset")==0 ){
16781       char *zSql = sqlite3_mprintf(
16782           "DELETE FROM temp.sqlite_parameters WHERE key=%Q", azArg[2]);
16783       if( zSql==0 ) shell_out_of_memory();
16784       sqlite3_exec(p->db, zSql, 0, 0, 0);
16785       sqlite3_free(zSql);
16786     }else
16787     /* If no command name matches, show a syntax error */
16788     parameter_syntax_error:
16789     showHelp(p->out, "parameter");
16790   }else
16791 
16792   if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
16793     int i;
16794     for(i=1; i<nArg; i++){
16795       if( i>1 ) raw_printf(p->out, " ");
16796       utf8_printf(p->out, "%s", azArg[i]);
16797     }
16798     raw_printf(p->out, "\n");
16799   }else
16800 
16801 #ifndef SQLITE_OMIT_PROGRESS_CALLBACK
16802   if( c=='p' && n>=3 && strncmp(azArg[0], "progress", n)==0 ){
16803     int i;
16804     int nn = 0;
16805     p->flgProgress = 0;
16806     p->mxProgress = 0;
16807     p->nProgress = 0;
16808     for(i=1; i<nArg; i++){
16809       const char *z = azArg[i];
16810       if( z[0]=='-' ){
16811         z++;
16812         if( z[0]=='-' ) z++;
16813         if( strcmp(z,"quiet")==0 || strcmp(z,"q")==0 ){
16814           p->flgProgress |= SHELL_PROGRESS_QUIET;
16815           continue;
16816         }
16817         if( strcmp(z,"reset")==0 ){
16818           p->flgProgress |= SHELL_PROGRESS_RESET;
16819           continue;
16820         }
16821         if( strcmp(z,"once")==0 ){
16822           p->flgProgress |= SHELL_PROGRESS_ONCE;
16823           continue;
16824         }
16825         if( strcmp(z,"limit")==0 ){
16826           if( i+1>=nArg ){
16827             utf8_printf(stderr, "Error: missing argument on --limit\n");
16828             rc = 1;
16829             goto meta_command_exit;
16830           }else{
16831             p->mxProgress = (int)integerValue(azArg[++i]);
16832           }
16833           continue;
16834         }
16835         utf8_printf(stderr, "Error: unknown option: \"%s\"\n", azArg[i]);
16836         rc = 1;
16837         goto meta_command_exit;
16838       }else{
16839         nn = (int)integerValue(z);
16840       }
16841     }
16842     open_db(p, 0);
16843     sqlite3_progress_handler(p->db, nn, progress_handler, p);
16844   }else
16845 #endif /* SQLITE_OMIT_PROGRESS_CALLBACK */
16846 
16847   if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){
16848     if( nArg >= 2) {
16849       strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
16850     }
16851     if( nArg >= 3) {
16852       strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
16853     }
16854   }else
16855 
16856   if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){
16857     rc = 2;
16858   }else
16859 
16860   if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){
16861     FILE *inSaved = p->in;
16862     int savedLineno = p->lineno;
16863     if( nArg!=2 ){
16864       raw_printf(stderr, "Usage: .read FILE\n");
16865       rc = 1;
16866       goto meta_command_exit;
16867     }
16868     p->in = fopen(azArg[1], "rb");
16869     if( p->in==0 ){
16870       utf8_printf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
16871       rc = 1;
16872     }else{
16873       rc = process_input(p);
16874       fclose(p->in);
16875     }
16876     p->in = inSaved;
16877     p->lineno = savedLineno;
16878   }else
16879 
16880   if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){
16881     const char *zSrcFile;
16882     const char *zDb;
16883     sqlite3 *pSrc;
16884     sqlite3_backup *pBackup;
16885     int nTimeout = 0;
16886 
16887     if( nArg==2 ){
16888       zSrcFile = azArg[1];
16889       zDb = "main";
16890     }else if( nArg==3 ){
16891       zSrcFile = azArg[2];
16892       zDb = azArg[1];
16893     }else{
16894       raw_printf(stderr, "Usage: .restore ?DB? FILE\n");
16895       rc = 1;
16896       goto meta_command_exit;
16897     }
16898     rc = sqlite3_open(zSrcFile, &pSrc);
16899     if( rc!=SQLITE_OK ){
16900       utf8_printf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
16901       close_db(pSrc);
16902       return 1;
16903     }
16904     open_db(p, 0);
16905     pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
16906     if( pBackup==0 ){
16907       utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
16908       close_db(pSrc);
16909       return 1;
16910     }
16911     while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
16912           || rc==SQLITE_BUSY  ){
16913       if( rc==SQLITE_BUSY ){
16914         if( nTimeout++ >= 3 ) break;
16915         sqlite3_sleep(100);
16916       }
16917     }
16918     sqlite3_backup_finish(pBackup);
16919     if( rc==SQLITE_DONE ){
16920       rc = 0;
16921     }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
16922       raw_printf(stderr, "Error: source database is busy\n");
16923       rc = 1;
16924     }else{
16925       utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
16926       rc = 1;
16927     }
16928     close_db(pSrc);
16929   }else
16930 
16931   if( c=='s' && strncmp(azArg[0], "scanstats", n)==0 ){
16932     if( nArg==2 ){
16933       p->scanstatsOn = (u8)booleanValue(azArg[1]);
16934 #ifndef SQLITE_ENABLE_STMT_SCANSTATUS
16935       raw_printf(stderr, "Warning: .scanstats not available in this build.\n");
16936 #endif
16937     }else{
16938       raw_printf(stderr, "Usage: .scanstats on|off\n");
16939       rc = 1;
16940     }
16941   }else
16942 
16943   if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){
16944     ShellText sSelect;
16945     ShellState data;
16946     char *zErrMsg = 0;
16947     const char *zDiv = "(";
16948     const char *zName = 0;
16949     int iSchema = 0;
16950     int bDebug = 0;
16951     int ii;
16952 
16953     open_db(p, 0);
16954     memcpy(&data, p, sizeof(data));
16955     data.showHeader = 0;
16956     data.cMode = data.mode = MODE_Semi;
16957     initText(&sSelect);
16958     for(ii=1; ii<nArg; ii++){
16959       if( optionMatch(azArg[ii],"indent") ){
16960         data.cMode = data.mode = MODE_Pretty;
16961       }else if( optionMatch(azArg[ii],"debug") ){
16962         bDebug = 1;
16963       }else if( zName==0 ){
16964         zName = azArg[ii];
16965       }else{
16966         raw_printf(stderr, "Usage: .schema ?--indent? ?LIKE-PATTERN?\n");
16967         rc = 1;
16968         goto meta_command_exit;
16969       }
16970     }
16971     if( zName!=0 ){
16972       int isMaster = sqlite3_strlike(zName, "sqlite_master", '\\')==0;
16973       if( isMaster || sqlite3_strlike(zName,"sqlite_temp_master", '\\')==0 ){
16974         char *new_argv[2], *new_colv[2];
16975         new_argv[0] = sqlite3_mprintf(
16976                       "CREATE TABLE %s (\n"
16977                       "  type text,\n"
16978                       "  name text,\n"
16979                       "  tbl_name text,\n"
16980                       "  rootpage integer,\n"
16981                       "  sql text\n"
16982                       ")", isMaster ? "sqlite_master" : "sqlite_temp_master");
16983         new_argv[1] = 0;
16984         new_colv[0] = "sql";
16985         new_colv[1] = 0;
16986         callback(&data, 1, new_argv, new_colv);
16987         sqlite3_free(new_argv[0]);
16988       }
16989     }
16990     if( zDiv ){
16991       sqlite3_stmt *pStmt = 0;
16992       rc = sqlite3_prepare_v2(p->db, "SELECT name FROM pragma_database_list",
16993                               -1, &pStmt, 0);
16994       if( rc ){
16995         utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
16996         sqlite3_finalize(pStmt);
16997         rc = 1;
16998         goto meta_command_exit;
16999       }
17000       appendText(&sSelect, "SELECT sql FROM", 0);
17001       iSchema = 0;
17002       while( sqlite3_step(pStmt)==SQLITE_ROW ){
17003         const char *zDb = (const char*)sqlite3_column_text(pStmt, 0);
17004         char zScNum[30];
17005         sqlite3_snprintf(sizeof(zScNum), zScNum, "%d", ++iSchema);
17006         appendText(&sSelect, zDiv, 0);
17007         zDiv = " UNION ALL ";
17008         appendText(&sSelect, "SELECT shell_add_schema(sql,", 0);
17009         if( sqlite3_stricmp(zDb, "main")!=0 ){
17010           appendText(&sSelect, zDb, '\'');
17011         }else{
17012           appendText(&sSelect, "NULL", 0);
17013         }
17014         appendText(&sSelect, ",name) AS sql, type, tbl_name, name, rowid,", 0);
17015         appendText(&sSelect, zScNum, 0);
17016         appendText(&sSelect, " AS snum, ", 0);
17017         appendText(&sSelect, zDb, '\'');
17018         appendText(&sSelect, " AS sname FROM ", 0);
17019         appendText(&sSelect, zDb, quoteChar(zDb));
17020         appendText(&sSelect, ".sqlite_master", 0);
17021       }
17022       sqlite3_finalize(pStmt);
17023 #ifndef SQLITE_OMIT_INTROSPECTION_PRAGMAS
17024       if( zName ){
17025         appendText(&sSelect,
17026            " UNION ALL SELECT shell_module_schema(name),"
17027            " 'table', name, name, name, 9e+99, 'main' FROM pragma_module_list",
17028         0);
17029       }
17030 #endif
17031       appendText(&sSelect, ") WHERE ", 0);
17032       if( zName ){
17033         char *zQarg = sqlite3_mprintf("%Q", zName);
17034         int bGlob = strchr(zName, '*') != 0 || strchr(zName, '?') != 0 ||
17035                     strchr(zName, '[') != 0;
17036         if( strchr(zName, '.') ){
17037           appendText(&sSelect, "lower(printf('%s.%s',sname,tbl_name))", 0);
17038         }else{
17039           appendText(&sSelect, "lower(tbl_name)", 0);
17040         }
17041         appendText(&sSelect, bGlob ? " GLOB " : " LIKE ", 0);
17042         appendText(&sSelect, zQarg, 0);
17043         if( !bGlob ){
17044           appendText(&sSelect, " ESCAPE '\\' ", 0);
17045         }
17046         appendText(&sSelect, " AND ", 0);
17047         sqlite3_free(zQarg);
17048       }
17049       appendText(&sSelect, "type!='meta' AND sql IS NOT NULL"
17050                            " ORDER BY snum, rowid", 0);
17051       if( bDebug ){
17052         utf8_printf(p->out, "SQL: %s;\n", sSelect.z);
17053       }else{
17054         rc = sqlite3_exec(p->db, sSelect.z, callback, &data, &zErrMsg);
17055       }
17056       freeText(&sSelect);
17057     }
17058     if( zErrMsg ){
17059       utf8_printf(stderr,"Error: %s\n", zErrMsg);
17060       sqlite3_free(zErrMsg);
17061       rc = 1;
17062     }else if( rc != SQLITE_OK ){
17063       raw_printf(stderr,"Error: querying schema information\n");
17064       rc = 1;
17065     }else{
17066       rc = 0;
17067     }
17068   }else
17069 
17070 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
17071   if( c=='s' && n==11 && strncmp(azArg[0], "selecttrace", n)==0 ){
17072     sqlite3SelectTrace = (int)integerValue(azArg[1]);
17073   }else
17074 #endif
17075 
17076 #if defined(SQLITE_ENABLE_SESSION)
17077   if( c=='s' && strncmp(azArg[0],"session",n)==0 && n>=3 ){
17078     OpenSession *pSession = &p->aSession[0];
17079     char **azCmd = &azArg[1];
17080     int iSes = 0;
17081     int nCmd = nArg - 1;
17082     int i;
17083     if( nArg<=1 ) goto session_syntax_error;
17084     open_db(p, 0);
17085     if( nArg>=3 ){
17086       for(iSes=0; iSes<p->nSession; iSes++){
17087         if( strcmp(p->aSession[iSes].zName, azArg[1])==0 ) break;
17088       }
17089       if( iSes<p->nSession ){
17090         pSession = &p->aSession[iSes];
17091         azCmd++;
17092         nCmd--;
17093       }else{
17094         pSession = &p->aSession[0];
17095         iSes = 0;
17096       }
17097     }
17098 
17099     /* .session attach TABLE
17100     ** Invoke the sqlite3session_attach() interface to attach a particular
17101     ** table so that it is never filtered.
17102     */
17103     if( strcmp(azCmd[0],"attach")==0 ){
17104       if( nCmd!=2 ) goto session_syntax_error;
17105       if( pSession->p==0 ){
17106         session_not_open:
17107         raw_printf(stderr, "ERROR: No sessions are open\n");
17108       }else{
17109         rc = sqlite3session_attach(pSession->p, azCmd[1]);
17110         if( rc ){
17111           raw_printf(stderr, "ERROR: sqlite3session_attach() returns %d\n", rc);
17112           rc = 0;
17113         }
17114       }
17115     }else
17116 
17117     /* .session changeset FILE
17118     ** .session patchset FILE
17119     ** Write a changeset or patchset into a file.  The file is overwritten.
17120     */
17121     if( strcmp(azCmd[0],"changeset")==0 || strcmp(azCmd[0],"patchset")==0 ){
17122       FILE *out = 0;
17123       if( nCmd!=2 ) goto session_syntax_error;
17124       if( pSession->p==0 ) goto session_not_open;
17125       out = fopen(azCmd[1], "wb");
17126       if( out==0 ){
17127         utf8_printf(stderr, "ERROR: cannot open \"%s\" for writing\n",
17128                     azCmd[1]);
17129       }else{
17130         int szChng;
17131         void *pChng;
17132         if( azCmd[0][0]=='c' ){
17133           rc = sqlite3session_changeset(pSession->p, &szChng, &pChng);
17134         }else{
17135           rc = sqlite3session_patchset(pSession->p, &szChng, &pChng);
17136         }
17137         if( rc ){
17138           printf("Error: error code %d\n", rc);
17139           rc = 0;
17140         }
17141         if( pChng
17142           && fwrite(pChng, szChng, 1, out)!=1 ){
17143           raw_printf(stderr, "ERROR: Failed to write entire %d-byte output\n",
17144                   szChng);
17145         }
17146         sqlite3_free(pChng);
17147         fclose(out);
17148       }
17149     }else
17150 
17151     /* .session close
17152     ** Close the identified session
17153     */
17154     if( strcmp(azCmd[0], "close")==0 ){
17155       if( nCmd!=1 ) goto session_syntax_error;
17156       if( p->nSession ){
17157         session_close(pSession);
17158         p->aSession[iSes] = p->aSession[--p->nSession];
17159       }
17160     }else
17161 
17162     /* .session enable ?BOOLEAN?
17163     ** Query or set the enable flag
17164     */
17165     if( strcmp(azCmd[0], "enable")==0 ){
17166       int ii;
17167       if( nCmd>2 ) goto session_syntax_error;
17168       ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
17169       if( p->nSession ){
17170         ii = sqlite3session_enable(pSession->p, ii);
17171         utf8_printf(p->out, "session %s enable flag = %d\n",
17172                     pSession->zName, ii);
17173       }
17174     }else
17175 
17176     /* .session filter GLOB ....
17177     ** Set a list of GLOB patterns of table names to be excluded.
17178     */
17179     if( strcmp(azCmd[0], "filter")==0 ){
17180       int ii, nByte;
17181       if( nCmd<2 ) goto session_syntax_error;
17182       if( p->nSession ){
17183         for(ii=0; ii<pSession->nFilter; ii++){
17184           sqlite3_free(pSession->azFilter[ii]);
17185         }
17186         sqlite3_free(pSession->azFilter);
17187         nByte = sizeof(pSession->azFilter[0])*(nCmd-1);
17188         pSession->azFilter = sqlite3_malloc( nByte );
17189         if( pSession->azFilter==0 ){
17190           raw_printf(stderr, "Error: out or memory\n");
17191           exit(1);
17192         }
17193         for(ii=1; ii<nCmd; ii++){
17194           pSession->azFilter[ii-1] = sqlite3_mprintf("%s", azCmd[ii]);
17195         }
17196         pSession->nFilter = ii-1;
17197       }
17198     }else
17199 
17200     /* .session indirect ?BOOLEAN?
17201     ** Query or set the indirect flag
17202     */
17203     if( strcmp(azCmd[0], "indirect")==0 ){
17204       int ii;
17205       if( nCmd>2 ) goto session_syntax_error;
17206       ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
17207       if( p->nSession ){
17208         ii = sqlite3session_indirect(pSession->p, ii);
17209         utf8_printf(p->out, "session %s indirect flag = %d\n",
17210                     pSession->zName, ii);
17211       }
17212     }else
17213 
17214     /* .session isempty
17215     ** Determine if the session is empty
17216     */
17217     if( strcmp(azCmd[0], "isempty")==0 ){
17218       int ii;
17219       if( nCmd!=1 ) goto session_syntax_error;
17220       if( p->nSession ){
17221         ii = sqlite3session_isempty(pSession->p);
17222         utf8_printf(p->out, "session %s isempty flag = %d\n",
17223                     pSession->zName, ii);
17224       }
17225     }else
17226 
17227     /* .session list
17228     ** List all currently open sessions
17229     */
17230     if( strcmp(azCmd[0],"list")==0 ){
17231       for(i=0; i<p->nSession; i++){
17232         utf8_printf(p->out, "%d %s\n", i, p->aSession[i].zName);
17233       }
17234     }else
17235 
17236     /* .session open DB NAME
17237     ** Open a new session called NAME on the attached database DB.
17238     ** DB is normally "main".
17239     */
17240     if( strcmp(azCmd[0],"open")==0 ){
17241       char *zName;
17242       if( nCmd!=3 ) goto session_syntax_error;
17243       zName = azCmd[2];
17244       if( zName[0]==0 ) goto session_syntax_error;
17245       for(i=0; i<p->nSession; i++){
17246         if( strcmp(p->aSession[i].zName,zName)==0 ){
17247           utf8_printf(stderr, "Session \"%s\" already exists\n", zName);
17248           goto meta_command_exit;
17249         }
17250       }
17251       if( p->nSession>=ArraySize(p->aSession) ){
17252         raw_printf(stderr, "Maximum of %d sessions\n", ArraySize(p->aSession));
17253         goto meta_command_exit;
17254       }
17255       pSession = &p->aSession[p->nSession];
17256       rc = sqlite3session_create(p->db, azCmd[1], &pSession->p);
17257       if( rc ){
17258         raw_printf(stderr, "Cannot open session: error code=%d\n", rc);
17259         rc = 0;
17260         goto meta_command_exit;
17261       }
17262       pSession->nFilter = 0;
17263       sqlite3session_table_filter(pSession->p, session_filter, pSession);
17264       p->nSession++;
17265       pSession->zName = sqlite3_mprintf("%s", zName);
17266     }else
17267     /* If no command name matches, show a syntax error */
17268     session_syntax_error:
17269     showHelp(p->out, "session");
17270   }else
17271 #endif
17272 
17273 #ifdef SQLITE_DEBUG
17274   /* Undocumented commands for internal testing.  Subject to change
17275   ** without notice. */
17276   if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
17277     if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
17278       int i, v;
17279       for(i=1; i<nArg; i++){
17280         v = booleanValue(azArg[i]);
17281         utf8_printf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
17282       }
17283     }
17284     if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
17285       int i; sqlite3_int64 v;
17286       for(i=1; i<nArg; i++){
17287         char zBuf[200];
17288         v = integerValue(azArg[i]);
17289         sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v);
17290         utf8_printf(p->out, "%s", zBuf);
17291       }
17292     }
17293   }else
17294 #endif
17295 
17296   if( c=='s' && n>=4 && strncmp(azArg[0],"selftest",n)==0 ){
17297     int bIsInit = 0;         /* True to initialize the SELFTEST table */
17298     int bVerbose = 0;        /* Verbose output */
17299     int bSelftestExists;     /* True if SELFTEST already exists */
17300     int i, k;                /* Loop counters */
17301     int nTest = 0;           /* Number of tests runs */
17302     int nErr = 0;            /* Number of errors seen */
17303     ShellText str;           /* Answer for a query */
17304     sqlite3_stmt *pStmt = 0; /* Query against the SELFTEST table */
17305 
17306     open_db(p,0);
17307     for(i=1; i<nArg; i++){
17308       const char *z = azArg[i];
17309       if( z[0]=='-' && z[1]=='-' ) z++;
17310       if( strcmp(z,"-init")==0 ){
17311         bIsInit = 1;
17312       }else
17313       if( strcmp(z,"-v")==0 ){
17314         bVerbose++;
17315       }else
17316       {
17317         utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n",
17318                     azArg[i], azArg[0]);
17319         raw_printf(stderr, "Should be one of: --init -v\n");
17320         rc = 1;
17321         goto meta_command_exit;
17322       }
17323     }
17324     if( sqlite3_table_column_metadata(p->db,"main","selftest",0,0,0,0,0,0)
17325            != SQLITE_OK ){
17326       bSelftestExists = 0;
17327     }else{
17328       bSelftestExists = 1;
17329     }
17330     if( bIsInit ){
17331       createSelftestTable(p);
17332       bSelftestExists = 1;
17333     }
17334     initText(&str);
17335     appendText(&str, "x", 0);
17336     for(k=bSelftestExists; k>=0; k--){
17337       if( k==1 ){
17338         rc = sqlite3_prepare_v2(p->db,
17339             "SELECT tno,op,cmd,ans FROM selftest ORDER BY tno",
17340             -1, &pStmt, 0);
17341       }else{
17342         rc = sqlite3_prepare_v2(p->db,
17343           "VALUES(0,'memo','Missing SELFTEST table - default checks only',''),"
17344           "      (1,'run','PRAGMA integrity_check','ok')",
17345           -1, &pStmt, 0);
17346       }
17347       if( rc ){
17348         raw_printf(stderr, "Error querying the selftest table\n");
17349         rc = 1;
17350         sqlite3_finalize(pStmt);
17351         goto meta_command_exit;
17352       }
17353       for(i=1; sqlite3_step(pStmt)==SQLITE_ROW; i++){
17354         int tno = sqlite3_column_int(pStmt, 0);
17355         const char *zOp = (const char*)sqlite3_column_text(pStmt, 1);
17356         const char *zSql = (const char*)sqlite3_column_text(pStmt, 2);
17357         const char *zAns = (const char*)sqlite3_column_text(pStmt, 3);
17358 
17359         k = 0;
17360         if( bVerbose>0 ){
17361           char *zQuote = sqlite3_mprintf("%q", zSql);
17362           printf("%d: %s %s\n", tno, zOp, zSql);
17363           sqlite3_free(zQuote);
17364         }
17365         if( strcmp(zOp,"memo")==0 ){
17366           utf8_printf(p->out, "%s\n", zSql);
17367         }else
17368         if( strcmp(zOp,"run")==0 ){
17369           char *zErrMsg = 0;
17370           str.n = 0;
17371           str.z[0] = 0;
17372           rc = sqlite3_exec(p->db, zSql, captureOutputCallback, &str, &zErrMsg);
17373           nTest++;
17374           if( bVerbose ){
17375             utf8_printf(p->out, "Result: %s\n", str.z);
17376           }
17377           if( rc || zErrMsg ){
17378             nErr++;
17379             rc = 1;
17380             utf8_printf(p->out, "%d: error-code-%d: %s\n", tno, rc, zErrMsg);
17381             sqlite3_free(zErrMsg);
17382           }else if( strcmp(zAns,str.z)!=0 ){
17383             nErr++;
17384             rc = 1;
17385             utf8_printf(p->out, "%d: Expected: [%s]\n", tno, zAns);
17386             utf8_printf(p->out, "%d:      Got: [%s]\n", tno, str.z);
17387           }
17388         }else
17389         {
17390           utf8_printf(stderr,
17391             "Unknown operation \"%s\" on selftest line %d\n", zOp, tno);
17392           rc = 1;
17393           break;
17394         }
17395       } /* End loop over rows of content from SELFTEST */
17396       sqlite3_finalize(pStmt);
17397     } /* End loop over k */
17398     freeText(&str);
17399     utf8_printf(p->out, "%d errors out of %d tests\n", nErr, nTest);
17400   }else
17401 
17402   if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){
17403     if( nArg<2 || nArg>3 ){
17404       raw_printf(stderr, "Usage: .separator COL ?ROW?\n");
17405       rc = 1;
17406     }
17407     if( nArg>=2 ){
17408       sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator,
17409                        "%.*s", (int)ArraySize(p->colSeparator)-1, azArg[1]);
17410     }
17411     if( nArg>=3 ){
17412       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator,
17413                        "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]);
17414     }
17415   }else
17416 
17417   if( c=='s' && n>=4 && strncmp(azArg[0],"sha3sum",n)==0 ){
17418     const char *zLike = 0;   /* Which table to checksum. 0 means everything */
17419     int i;                   /* Loop counter */
17420     int bSchema = 0;         /* Also hash the schema */
17421     int bSeparate = 0;       /* Hash each table separately */
17422     int iSize = 224;         /* Hash algorithm to use */
17423     int bDebug = 0;          /* Only show the query that would have run */
17424     sqlite3_stmt *pStmt;     /* For querying tables names */
17425     char *zSql;              /* SQL to be run */
17426     char *zSep;              /* Separator */
17427     ShellText sSql;          /* Complete SQL for the query to run the hash */
17428     ShellText sQuery;        /* Set of queries used to read all content */
17429     open_db(p, 0);
17430     for(i=1; i<nArg; i++){
17431       const char *z = azArg[i];
17432       if( z[0]=='-' ){
17433         z++;
17434         if( z[0]=='-' ) z++;
17435         if( strcmp(z,"schema")==0 ){
17436           bSchema = 1;
17437         }else
17438         if( strcmp(z,"sha3-224")==0 || strcmp(z,"sha3-256")==0
17439          || strcmp(z,"sha3-384")==0 || strcmp(z,"sha3-512")==0
17440         ){
17441           iSize = atoi(&z[5]);
17442         }else
17443         if( strcmp(z,"debug")==0 ){
17444           bDebug = 1;
17445         }else
17446         {
17447           utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n",
17448                       azArg[i], azArg[0]);
17449           showHelp(p->out, azArg[0]);
17450           rc = 1;
17451           goto meta_command_exit;
17452         }
17453       }else if( zLike ){
17454         raw_printf(stderr, "Usage: .sha3sum ?OPTIONS? ?LIKE-PATTERN?\n");
17455         rc = 1;
17456         goto meta_command_exit;
17457       }else{
17458         zLike = z;
17459         bSeparate = 1;
17460         if( sqlite3_strlike("sqlite\\_%", zLike, '\\')==0 ) bSchema = 1;
17461       }
17462     }
17463     if( bSchema ){
17464       zSql = "SELECT lower(name) FROM sqlite_master"
17465              " WHERE type='table' AND coalesce(rootpage,0)>1"
17466              " UNION ALL SELECT 'sqlite_master'"
17467              " ORDER BY 1 collate nocase";
17468     }else{
17469       zSql = "SELECT lower(name) FROM sqlite_master"
17470              " WHERE type='table' AND coalesce(rootpage,0)>1"
17471              " AND name NOT LIKE 'sqlite_%'"
17472              " ORDER BY 1 collate nocase";
17473     }
17474     sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
17475     initText(&sQuery);
17476     initText(&sSql);
17477     appendText(&sSql, "WITH [sha3sum$query](a,b) AS(",0);
17478     zSep = "VALUES(";
17479     while( SQLITE_ROW==sqlite3_step(pStmt) ){
17480       const char *zTab = (const char*)sqlite3_column_text(pStmt,0);
17481       if( zLike && sqlite3_strlike(zLike, zTab, 0)!=0 ) continue;
17482       if( strncmp(zTab, "sqlite_",7)!=0 ){
17483         appendText(&sQuery,"SELECT * FROM ", 0);
17484         appendText(&sQuery,zTab,'"');
17485         appendText(&sQuery," NOT INDEXED;", 0);
17486       }else if( strcmp(zTab, "sqlite_master")==0 ){
17487         appendText(&sQuery,"SELECT type,name,tbl_name,sql FROM sqlite_master"
17488                            " ORDER BY name;", 0);
17489       }else if( strcmp(zTab, "sqlite_sequence")==0 ){
17490         appendText(&sQuery,"SELECT name,seq FROM sqlite_sequence"
17491                            " ORDER BY name;", 0);
17492       }else if( strcmp(zTab, "sqlite_stat1")==0 ){
17493         appendText(&sQuery,"SELECT tbl,idx,stat FROM sqlite_stat1"
17494                            " ORDER BY tbl,idx;", 0);
17495       }else if( strcmp(zTab, "sqlite_stat4")==0 ){
17496         appendText(&sQuery, "SELECT * FROM ", 0);
17497         appendText(&sQuery, zTab, 0);
17498         appendText(&sQuery, " ORDER BY tbl, idx, rowid;\n", 0);
17499       }
17500       appendText(&sSql, zSep, 0);
17501       appendText(&sSql, sQuery.z, '\'');
17502       sQuery.n = 0;
17503       appendText(&sSql, ",", 0);
17504       appendText(&sSql, zTab, '\'');
17505       zSep = "),(";
17506     }
17507     sqlite3_finalize(pStmt);
17508     if( bSeparate ){
17509       zSql = sqlite3_mprintf(
17510           "%s))"
17511           " SELECT lower(hex(sha3_query(a,%d))) AS hash, b AS label"
17512           "   FROM [sha3sum$query]",
17513           sSql.z, iSize);
17514     }else{
17515       zSql = sqlite3_mprintf(
17516           "%s))"
17517           " SELECT lower(hex(sha3_query(group_concat(a,''),%d))) AS hash"
17518           "   FROM [sha3sum$query]",
17519           sSql.z, iSize);
17520     }
17521     freeText(&sQuery);
17522     freeText(&sSql);
17523     if( bDebug ){
17524       utf8_printf(p->out, "%s\n", zSql);
17525     }else{
17526       shell_exec(p, zSql, 0);
17527     }
17528     sqlite3_free(zSql);
17529   }else
17530 
17531 #ifndef SQLITE_NOHAVE_SYSTEM
17532   if( c=='s'
17533    && (strncmp(azArg[0], "shell", n)==0 || strncmp(azArg[0],"system",n)==0)
17534   ){
17535     char *zCmd;
17536     int i, x;
17537     if( nArg<2 ){
17538       raw_printf(stderr, "Usage: .system COMMAND\n");
17539       rc = 1;
17540       goto meta_command_exit;
17541     }
17542     zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]);
17543     for(i=2; i<nArg; i++){
17544       zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"",
17545                              zCmd, azArg[i]);
17546     }
17547     x = system(zCmd);
17548     sqlite3_free(zCmd);
17549     if( x ) raw_printf(stderr, "System command returns %d\n", x);
17550   }else
17551 #endif /* !defined(SQLITE_NOHAVE_SYSTEM) */
17552 
17553   if( c=='s' && strncmp(azArg[0], "show", n)==0 ){
17554     static const char *azBool[] = { "off", "on", "trigger", "full"};
17555     int i;
17556     if( nArg!=1 ){
17557       raw_printf(stderr, "Usage: .show\n");
17558       rc = 1;
17559       goto meta_command_exit;
17560     }
17561     utf8_printf(p->out, "%12.12s: %s\n","echo",
17562                                   azBool[ShellHasFlag(p, SHFLG_Echo)]);
17563     utf8_printf(p->out, "%12.12s: %s\n","eqp", azBool[p->autoEQP&3]);
17564     utf8_printf(p->out, "%12.12s: %s\n","explain",
17565          p->mode==MODE_Explain ? "on" : p->autoExplain ? "auto" : "off");
17566     utf8_printf(p->out,"%12.12s: %s\n","headers", azBool[p->showHeader!=0]);
17567     utf8_printf(p->out, "%12.12s: %s\n","mode", modeDescr[p->mode]);
17568     utf8_printf(p->out, "%12.12s: ", "nullvalue");
17569       output_c_string(p->out, p->nullValue);
17570       raw_printf(p->out, "\n");
17571     utf8_printf(p->out,"%12.12s: %s\n","output",
17572             strlen30(p->outfile) ? p->outfile : "stdout");
17573     utf8_printf(p->out,"%12.12s: ", "colseparator");
17574       output_c_string(p->out, p->colSeparator);
17575       raw_printf(p->out, "\n");
17576     utf8_printf(p->out,"%12.12s: ", "rowseparator");
17577       output_c_string(p->out, p->rowSeparator);
17578       raw_printf(p->out, "\n");
17579     utf8_printf(p->out, "%12.12s: %s\n","stats", azBool[p->statsOn!=0]);
17580     utf8_printf(p->out, "%12.12s: ", "width");
17581     for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
17582       raw_printf(p->out, "%d ", p->colWidth[i]);
17583     }
17584     raw_printf(p->out, "\n");
17585     utf8_printf(p->out, "%12.12s: %s\n", "filename",
17586                 p->zDbFilename ? p->zDbFilename : "");
17587   }else
17588 
17589   if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){
17590     if( nArg==2 ){
17591       p->statsOn = (u8)booleanValue(azArg[1]);
17592     }else if( nArg==1 ){
17593       display_stats(p->db, p, 0);
17594     }else{
17595       raw_printf(stderr, "Usage: .stats ?on|off?\n");
17596       rc = 1;
17597     }
17598   }else
17599 
17600   if( (c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0)
17601    || (c=='i' && (strncmp(azArg[0], "indices", n)==0
17602                  || strncmp(azArg[0], "indexes", n)==0) )
17603   ){
17604     sqlite3_stmt *pStmt;
17605     char **azResult;
17606     int nRow, nAlloc;
17607     int ii;
17608     ShellText s;
17609     initText(&s);
17610     open_db(p, 0);
17611     rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
17612     if( rc ){
17613       sqlite3_finalize(pStmt);
17614       return shellDatabaseError(p->db);
17615     }
17616 
17617     if( nArg>2 && c=='i' ){
17618       /* It is an historical accident that the .indexes command shows an error
17619       ** when called with the wrong number of arguments whereas the .tables
17620       ** command does not. */
17621       raw_printf(stderr, "Usage: .indexes ?LIKE-PATTERN?\n");
17622       rc = 1;
17623       sqlite3_finalize(pStmt);
17624       goto meta_command_exit;
17625     }
17626     for(ii=0; sqlite3_step(pStmt)==SQLITE_ROW; ii++){
17627       const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
17628       if( zDbName==0 ) continue;
17629       if( s.z && s.z[0] ) appendText(&s, " UNION ALL ", 0);
17630       if( sqlite3_stricmp(zDbName, "main")==0 ){
17631         appendText(&s, "SELECT name FROM ", 0);
17632       }else{
17633         appendText(&s, "SELECT ", 0);
17634         appendText(&s, zDbName, '\'');
17635         appendText(&s, "||'.'||name FROM ", 0);
17636       }
17637       appendText(&s, zDbName, '"');
17638       appendText(&s, ".sqlite_master ", 0);
17639       if( c=='t' ){
17640         appendText(&s," WHERE type IN ('table','view')"
17641                       "   AND name NOT LIKE 'sqlite_%'"
17642                       "   AND name LIKE ?1", 0);
17643       }else{
17644         appendText(&s," WHERE type='index'"
17645                       "   AND tbl_name LIKE ?1", 0);
17646       }
17647     }
17648     rc = sqlite3_finalize(pStmt);
17649     appendText(&s, " ORDER BY 1", 0);
17650     rc = sqlite3_prepare_v2(p->db, s.z, -1, &pStmt, 0);
17651     freeText(&s);
17652     if( rc ) return shellDatabaseError(p->db);
17653 
17654     /* Run the SQL statement prepared by the above block. Store the results
17655     ** as an array of nul-terminated strings in azResult[].  */
17656     nRow = nAlloc = 0;
17657     azResult = 0;
17658     if( nArg>1 ){
17659       sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
17660     }else{
17661       sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
17662     }
17663     while( sqlite3_step(pStmt)==SQLITE_ROW ){
17664       if( nRow>=nAlloc ){
17665         char **azNew;
17666         int n2 = nAlloc*2 + 10;
17667         azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2);
17668         if( azNew==0 ) shell_out_of_memory();
17669         nAlloc = n2;
17670         azResult = azNew;
17671       }
17672       azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
17673       if( 0==azResult[nRow] ) shell_out_of_memory();
17674       nRow++;
17675     }
17676     if( sqlite3_finalize(pStmt)!=SQLITE_OK ){
17677       rc = shellDatabaseError(p->db);
17678     }
17679 
17680     /* Pretty-print the contents of array azResult[] to the output */
17681     if( rc==0 && nRow>0 ){
17682       int len, maxlen = 0;
17683       int i, j;
17684       int nPrintCol, nPrintRow;
17685       for(i=0; i<nRow; i++){
17686         len = strlen30(azResult[i]);
17687         if( len>maxlen ) maxlen = len;
17688       }
17689       nPrintCol = 80/(maxlen+2);
17690       if( nPrintCol<1 ) nPrintCol = 1;
17691       nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
17692       for(i=0; i<nPrintRow; i++){
17693         for(j=i; j<nRow; j+=nPrintRow){
17694           char *zSp = j<nPrintRow ? "" : "  ";
17695           utf8_printf(p->out, "%s%-*s", zSp, maxlen,
17696                       azResult[j] ? azResult[j]:"");
17697         }
17698         raw_printf(p->out, "\n");
17699       }
17700     }
17701 
17702     for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
17703     sqlite3_free(azResult);
17704   }else
17705 
17706   /* Begin redirecting output to the file "testcase-out.txt" */
17707   if( c=='t' && strcmp(azArg[0],"testcase")==0 ){
17708     output_reset(p);
17709     p->out = output_file_open("testcase-out.txt", 0);
17710     if( p->out==0 ){
17711       raw_printf(stderr, "Error: cannot open 'testcase-out.txt'\n");
17712     }
17713     if( nArg>=2 ){
17714       sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "%s", azArg[1]);
17715     }else{
17716       sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "?");
17717     }
17718   }else
17719 
17720 #ifndef SQLITE_UNTESTABLE
17721   if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 ){
17722     static const struct {
17723        const char *zCtrlName;   /* Name of a test-control option */
17724        int ctrlCode;            /* Integer code for that option */
17725        const char *zUsage;      /* Usage notes */
17726     } aCtrl[] = {
17727       { "always",             SQLITE_TESTCTRL_ALWAYS,        "BOOLEAN"        },
17728       { "assert",             SQLITE_TESTCTRL_ASSERT,        "BOOLEAN"        },
17729     /*{ "benign_malloc_hooks",SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS, ""       },*/
17730     /*{ "bitvec_test",        SQLITE_TESTCTRL_BITVEC_TEST,   ""             },*/
17731       { "byteorder",          SQLITE_TESTCTRL_BYTEORDER,     ""               },
17732       { "extra_schema_checks",SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS,"BOOLEAN"   },
17733     /*{ "fault_install",      SQLITE_TESTCTRL_FAULT_INSTALL, ""             },*/
17734       { "imposter",         SQLITE_TESTCTRL_IMPOSTER, "SCHEMA ON/OFF ROOTPAGE"},
17735       { "internal_functions", SQLITE_TESTCTRL_INTERNAL_FUNCTIONS, "BOOLEAN"   },
17736       { "localtime_fault",    SQLITE_TESTCTRL_LOCALTIME_FAULT,"BOOLEAN"       },
17737       { "never_corrupt",      SQLITE_TESTCTRL_NEVER_CORRUPT, "BOOLEAN"        },
17738       { "optimizations",      SQLITE_TESTCTRL_OPTIMIZATIONS, "DISABLE-MASK"   },
17739 #ifdef YYCOVERAGE
17740       { "parser_coverage",    SQLITE_TESTCTRL_PARSER_COVERAGE, ""             },
17741 #endif
17742       { "pending_byte",       SQLITE_TESTCTRL_PENDING_BYTE,  "OFFSET  "       },
17743       { "prng_restore",       SQLITE_TESTCTRL_PRNG_RESTORE,  ""               },
17744       { "prng_save",          SQLITE_TESTCTRL_PRNG_SAVE,     ""               },
17745       { "prng_seed",          SQLITE_TESTCTRL_PRNG_SEED,     "SEED ?db?"      },
17746       { "reserve",            SQLITE_TESTCTRL_RESERVE,      "BYTES-OF-RESERVE"},
17747     };
17748     int testctrl = -1;
17749     int iCtrl = -1;
17750     int rc2 = 0;    /* 0: usage.  1: %d  2: %x  3: no-output */
17751     int isOk = 0;
17752     int i, n2;
17753     const char *zCmd = 0;
17754 
17755     open_db(p, 0);
17756     zCmd = nArg>=2 ? azArg[1] : "help";
17757 
17758     /* The argument can optionally begin with "-" or "--" */
17759     if( zCmd[0]=='-' && zCmd[1] ){
17760       zCmd++;
17761       if( zCmd[0]=='-' && zCmd[1] ) zCmd++;
17762     }
17763 
17764     /* --help lists all test-controls */
17765     if( strcmp(zCmd,"help")==0 ){
17766       utf8_printf(p->out, "Available test-controls:\n");
17767       for(i=0; i<ArraySize(aCtrl); i++){
17768         utf8_printf(p->out, "  .testctrl %s %s\n",
17769                     aCtrl[i].zCtrlName, aCtrl[i].zUsage);
17770       }
17771       rc = 1;
17772       goto meta_command_exit;
17773     }
17774 
17775     /* convert testctrl text option to value. allow any unique prefix
17776     ** of the option name, or a numerical value. */
17777     n2 = strlen30(zCmd);
17778     for(i=0; i<ArraySize(aCtrl); i++){
17779       if( strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){
17780         if( testctrl<0 ){
17781           testctrl = aCtrl[i].ctrlCode;
17782           iCtrl = i;
17783         }else{
17784           utf8_printf(stderr, "Error: ambiguous test-control: \"%s\"\n"
17785                               "Use \".testctrl --help\" for help\n", zCmd);
17786           rc = 1;
17787           goto meta_command_exit;
17788         }
17789       }
17790     }
17791     if( testctrl<0 ){
17792       utf8_printf(stderr,"Error: unknown test-control: %s\n"
17793                          "Use \".testctrl --help\" for help\n", zCmd);
17794     }else{
17795       switch(testctrl){
17796 
17797         /* sqlite3_test_control(int, db, int) */
17798         case SQLITE_TESTCTRL_OPTIMIZATIONS:
17799         case SQLITE_TESTCTRL_RESERVE:
17800           if( nArg==3 ){
17801             int opt = (int)strtol(azArg[2], 0, 0);
17802             rc2 = sqlite3_test_control(testctrl, p->db, opt);
17803             isOk = 3;
17804           }
17805           break;
17806 
17807         /* sqlite3_test_control(int) */
17808         case SQLITE_TESTCTRL_PRNG_SAVE:
17809         case SQLITE_TESTCTRL_PRNG_RESTORE:
17810         case SQLITE_TESTCTRL_PRNG_RESET:
17811         case SQLITE_TESTCTRL_BYTEORDER:
17812           if( nArg==2 ){
17813             rc2 = sqlite3_test_control(testctrl);
17814             isOk = testctrl==SQLITE_TESTCTRL_BYTEORDER ? 1 : 3;
17815           }
17816           break;
17817 
17818         /* sqlite3_test_control(int, uint) */
17819         case SQLITE_TESTCTRL_PENDING_BYTE:
17820           if( nArg==3 ){
17821             unsigned int opt = (unsigned int)integerValue(azArg[2]);
17822             rc2 = sqlite3_test_control(testctrl, opt);
17823             isOk = 3;
17824           }
17825           break;
17826 
17827         /* sqlite3_test_control(int, int, sqlite3*) */
17828         case SQLITE_TESTCTRL_PRNG_SEED:
17829           if( nArg==3 || nArg==4 ){
17830             int ii = (int)integerValue(azArg[2]);
17831             sqlite3 *db;
17832             if( ii==0 && strcmp(azArg[2],"random")==0 ){
17833               sqlite3_randomness(sizeof(ii),&ii);
17834               printf("-- random seed: %d\n", ii);
17835             }
17836             if( nArg==3 ){
17837               db = 0;
17838             }else{
17839               db = p->db;
17840               /* Make sure the schema has been loaded */
17841               sqlite3_table_column_metadata(db, 0, "x", 0, 0, 0, 0, 0, 0);
17842             }
17843             rc2 = sqlite3_test_control(testctrl, ii, db);
17844             isOk = 3;
17845           }
17846           break;
17847 
17848         /* sqlite3_test_control(int, int) */
17849         case SQLITE_TESTCTRL_ASSERT:
17850         case SQLITE_TESTCTRL_ALWAYS:
17851         case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS:
17852           if( nArg==3 ){
17853             int opt = booleanValue(azArg[2]);
17854             rc2 = sqlite3_test_control(testctrl, opt);
17855             isOk = 1;
17856           }
17857           break;
17858 
17859         /* sqlite3_test_control(int, int) */
17860         case SQLITE_TESTCTRL_LOCALTIME_FAULT:
17861         case SQLITE_TESTCTRL_NEVER_CORRUPT:
17862           if( nArg==3 ){
17863             int opt = booleanValue(azArg[2]);
17864             rc2 = sqlite3_test_control(testctrl, opt);
17865             isOk = 3;
17866           }
17867           break;
17868 
17869         case SQLITE_TESTCTRL_IMPOSTER:
17870           if( nArg==5 ){
17871             rc2 = sqlite3_test_control(testctrl, p->db,
17872                           azArg[2],
17873                           integerValue(azArg[3]),
17874                           integerValue(azArg[4]));
17875             isOk = 3;
17876           }
17877           break;
17878 
17879 #ifdef YYCOVERAGE
17880         case SQLITE_TESTCTRL_PARSER_COVERAGE:
17881           if( nArg==2 ){
17882             sqlite3_test_control(testctrl, p->out);
17883             isOk = 3;
17884           }
17885 #endif
17886       }
17887     }
17888     if( isOk==0 && iCtrl>=0 ){
17889       utf8_printf(p->out, "Usage: .testctrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage);
17890       rc = 1;
17891     }else if( isOk==1 ){
17892       raw_printf(p->out, "%d\n", rc2);
17893     }else if( isOk==2 ){
17894       raw_printf(p->out, "0x%08x\n", rc2);
17895     }
17896   }else
17897 #endif /* !defined(SQLITE_UNTESTABLE) */
17898 
17899   if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 ){
17900     open_db(p, 0);
17901     sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0);
17902   }else
17903 
17904   if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 ){
17905     if( nArg==2 ){
17906       enableTimer = booleanValue(azArg[1]);
17907       if( enableTimer && !HAS_TIMER ){
17908         raw_printf(stderr, "Error: timer not available on this system.\n");
17909         enableTimer = 0;
17910       }
17911     }else{
17912       raw_printf(stderr, "Usage: .timer on|off\n");
17913       rc = 1;
17914     }
17915   }else
17916 
17917 #ifndef SQLITE_OMIT_TRACE
17918   if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){
17919     int mType = 0;
17920     int jj;
17921     open_db(p, 0);
17922     for(jj=1; jj<nArg; jj++){
17923       const char *z = azArg[jj];
17924       if( z[0]=='-' ){
17925         if( optionMatch(z, "expanded") ){
17926           p->eTraceType = SHELL_TRACE_EXPANDED;
17927         }
17928 #ifdef SQLITE_ENABLE_NORMALIZE
17929         else if( optionMatch(z, "normalized") ){
17930           p->eTraceType = SHELL_TRACE_NORMALIZED;
17931         }
17932 #endif
17933         else if( optionMatch(z, "plain") ){
17934           p->eTraceType = SHELL_TRACE_PLAIN;
17935         }
17936         else if( optionMatch(z, "profile") ){
17937           mType |= SQLITE_TRACE_PROFILE;
17938         }
17939         else if( optionMatch(z, "row") ){
17940           mType |= SQLITE_TRACE_ROW;
17941         }
17942         else if( optionMatch(z, "stmt") ){
17943           mType |= SQLITE_TRACE_STMT;
17944         }
17945         else if( optionMatch(z, "close") ){
17946           mType |= SQLITE_TRACE_CLOSE;
17947         }
17948         else {
17949           raw_printf(stderr, "Unknown option \"%s\" on \".trace\"\n", z);
17950           rc = 1;
17951           goto meta_command_exit;
17952         }
17953       }else{
17954         output_file_close(p->traceOut);
17955         p->traceOut = output_file_open(azArg[1], 0);
17956       }
17957     }
17958     if( p->traceOut==0 ){
17959       sqlite3_trace_v2(p->db, 0, 0, 0);
17960     }else{
17961       if( mType==0 ) mType = SQLITE_TRACE_STMT;
17962       sqlite3_trace_v2(p->db, mType, sql_trace_callback, p);
17963     }
17964   }else
17965 #endif /* !defined(SQLITE_OMIT_TRACE) */
17966 
17967 #if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_VIRTUALTABLE)
17968   if( c=='u' && strncmp(azArg[0], "unmodule", n)==0 ){
17969     int ii;
17970     int lenOpt;
17971     char *zOpt;
17972     if( nArg<2 ){
17973       raw_printf(stderr, "Usage: .unmodule [--allexcept] NAME ...\n");
17974       rc = 1;
17975       goto meta_command_exit;
17976     }
17977     open_db(p, 0);
17978     zOpt = azArg[1];
17979     if( zOpt[0]=='-' && zOpt[1]=='-' && zOpt[2]!=0 ) zOpt++;
17980     lenOpt = (int)strlen(zOpt);
17981     if( lenOpt>=3 && strncmp(zOpt, "-allexcept",lenOpt)==0 ){
17982       assert( azArg[nArg]==0 );
17983       sqlite3_drop_modules(p->db, nArg>2 ? (const char**)(azArg+2) : 0);
17984     }else{
17985       for(ii=1; ii<nArg; ii++){
17986         sqlite3_create_module(p->db, azArg[ii], 0, 0);
17987       }
17988     }
17989   }else
17990 #endif
17991 
17992 #if SQLITE_USER_AUTHENTICATION
17993   if( c=='u' && strncmp(azArg[0], "user", n)==0 ){
17994     if( nArg<2 ){
17995       raw_printf(stderr, "Usage: .user SUBCOMMAND ...\n");
17996       rc = 1;
17997       goto meta_command_exit;
17998     }
17999     open_db(p, 0);
18000     if( strcmp(azArg[1],"login")==0 ){
18001       if( nArg!=4 ){
18002         raw_printf(stderr, "Usage: .user login USER PASSWORD\n");
18003         rc = 1;
18004         goto meta_command_exit;
18005       }
18006       rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3],
18007                                      strlen30(azArg[3]));
18008       if( rc ){
18009         utf8_printf(stderr, "Authentication failed for user %s\n", azArg[2]);
18010         rc = 1;
18011       }
18012     }else if( strcmp(azArg[1],"add")==0 ){
18013       if( nArg!=5 ){
18014         raw_printf(stderr, "Usage: .user add USER PASSWORD ISADMIN\n");
18015         rc = 1;
18016         goto meta_command_exit;
18017       }
18018       rc = sqlite3_user_add(p->db, azArg[2], azArg[3], strlen30(azArg[3]),
18019                             booleanValue(azArg[4]));
18020       if( rc ){
18021         raw_printf(stderr, "User-Add failed: %d\n", rc);
18022         rc = 1;
18023       }
18024     }else if( strcmp(azArg[1],"edit")==0 ){
18025       if( nArg!=5 ){
18026         raw_printf(stderr, "Usage: .user edit USER PASSWORD ISADMIN\n");
18027         rc = 1;
18028         goto meta_command_exit;
18029       }
18030       rc = sqlite3_user_change(p->db, azArg[2], azArg[3], strlen30(azArg[3]),
18031                               booleanValue(azArg[4]));
18032       if( rc ){
18033         raw_printf(stderr, "User-Edit failed: %d\n", rc);
18034         rc = 1;
18035       }
18036     }else if( strcmp(azArg[1],"delete")==0 ){
18037       if( nArg!=3 ){
18038         raw_printf(stderr, "Usage: .user delete USER\n");
18039         rc = 1;
18040         goto meta_command_exit;
18041       }
18042       rc = sqlite3_user_delete(p->db, azArg[2]);
18043       if( rc ){
18044         raw_printf(stderr, "User-Delete failed: %d\n", rc);
18045         rc = 1;
18046       }
18047     }else{
18048       raw_printf(stderr, "Usage: .user login|add|edit|delete ...\n");
18049       rc = 1;
18050       goto meta_command_exit;
18051     }
18052   }else
18053 #endif /* SQLITE_USER_AUTHENTICATION */
18054 
18055   if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
18056     utf8_printf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
18057         sqlite3_libversion(), sqlite3_sourceid());
18058 #if SQLITE_HAVE_ZLIB
18059     utf8_printf(p->out, "zlib version %s\n", zlibVersion());
18060 #endif
18061 #define CTIMEOPT_VAL_(opt) #opt
18062 #define CTIMEOPT_VAL(opt) CTIMEOPT_VAL_(opt)
18063 #if defined(__clang__) && defined(__clang_major__)
18064     utf8_printf(p->out, "clang-" CTIMEOPT_VAL(__clang_major__) "."
18065                     CTIMEOPT_VAL(__clang_minor__) "."
18066                     CTIMEOPT_VAL(__clang_patchlevel__) "\n");
18067 #elif defined(_MSC_VER)
18068     utf8_printf(p->out, "msvc-" CTIMEOPT_VAL(_MSC_VER) "\n");
18069 #elif defined(__GNUC__) && defined(__VERSION__)
18070     utf8_printf(p->out, "gcc-" __VERSION__ "\n");
18071 #endif
18072   }else
18073 
18074   if( c=='v' && strncmp(azArg[0], "vfsinfo", n)==0 ){
18075     const char *zDbName = nArg==2 ? azArg[1] : "main";
18076     sqlite3_vfs *pVfs = 0;
18077     if( p->db ){
18078       sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFS_POINTER, &pVfs);
18079       if( pVfs ){
18080         utf8_printf(p->out, "vfs.zName      = \"%s\"\n", pVfs->zName);
18081         raw_printf(p->out, "vfs.iVersion   = %d\n", pVfs->iVersion);
18082         raw_printf(p->out, "vfs.szOsFile   = %d\n", pVfs->szOsFile);
18083         raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
18084       }
18085     }
18086   }else
18087 
18088   if( c=='v' && strncmp(azArg[0], "vfslist", n)==0 ){
18089     sqlite3_vfs *pVfs;
18090     sqlite3_vfs *pCurrent = 0;
18091     if( p->db ){
18092       sqlite3_file_control(p->db, "main", SQLITE_FCNTL_VFS_POINTER, &pCurrent);
18093     }
18094     for(pVfs=sqlite3_vfs_find(0); pVfs; pVfs=pVfs->pNext){
18095       utf8_printf(p->out, "vfs.zName      = \"%s\"%s\n", pVfs->zName,
18096            pVfs==pCurrent ? "  <--- CURRENT" : "");
18097       raw_printf(p->out, "vfs.iVersion   = %d\n", pVfs->iVersion);
18098       raw_printf(p->out, "vfs.szOsFile   = %d\n", pVfs->szOsFile);
18099       raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
18100       if( pVfs->pNext ){
18101         raw_printf(p->out, "-----------------------------------\n");
18102       }
18103     }
18104   }else
18105 
18106   if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
18107     const char *zDbName = nArg==2 ? azArg[1] : "main";
18108     char *zVfsName = 0;
18109     if( p->db ){
18110       sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
18111       if( zVfsName ){
18112         utf8_printf(p->out, "%s\n", zVfsName);
18113         sqlite3_free(zVfsName);
18114       }
18115     }
18116   }else
18117 
18118 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
18119   if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
18120     sqlite3WhereTrace = nArg>=2 ? booleanValue(azArg[1]) : 0xff;
18121   }else
18122 #endif
18123 
18124   if( c=='w' && strncmp(azArg[0], "width", n)==0 ){
18125     int j;
18126     assert( nArg<=ArraySize(azArg) );
18127     for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
18128       p->colWidth[j-1] = (int)integerValue(azArg[j]);
18129     }
18130   }else
18131 
18132   {
18133     utf8_printf(stderr, "Error: unknown command or invalid arguments: "
18134       " \"%s\". Enter \".help\" for help\n", azArg[0]);
18135     rc = 1;
18136   }
18137 
18138 meta_command_exit:
18139   if( p->outCount ){
18140     p->outCount--;
18141     if( p->outCount==0 ) output_reset(p);
18142   }
18143   return rc;
18144 }
18145 
18146 /*
18147 ** Return TRUE if a semicolon occurs anywhere in the first N characters
18148 ** of string z[].
18149 */
18150 static int line_contains_semicolon(const char *z, int N){
18151   int i;
18152   for(i=0; i<N; i++){  if( z[i]==';' ) return 1; }
18153   return 0;
18154 }
18155 
18156 /*
18157 ** Test to see if a line consists entirely of whitespace.
18158 */
18159 static int _all_whitespace(const char *z){
18160   for(; *z; z++){
18161     if( IsSpace(z[0]) ) continue;
18162     if( *z=='/' && z[1]=='*' ){
18163       z += 2;
18164       while( *z && (*z!='*' || z[1]!='/') ){ z++; }
18165       if( *z==0 ) return 0;
18166       z++;
18167       continue;
18168     }
18169     if( *z=='-' && z[1]=='-' ){
18170       z += 2;
18171       while( *z && *z!='\n' ){ z++; }
18172       if( *z==0 ) return 1;
18173       continue;
18174     }
18175     return 0;
18176   }
18177   return 1;
18178 }
18179 
18180 /*
18181 ** Return TRUE if the line typed in is an SQL command terminator other
18182 ** than a semi-colon.  The SQL Server style "go" command is understood
18183 ** as is the Oracle "/".
18184 */
18185 static int line_is_command_terminator(const char *zLine){
18186   while( IsSpace(zLine[0]) ){ zLine++; };
18187   if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){
18188     return 1;  /* Oracle */
18189   }
18190   if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o'
18191          && _all_whitespace(&zLine[2]) ){
18192     return 1;  /* SQL Server */
18193   }
18194   return 0;
18195 }
18196 
18197 /*
18198 ** We need a default sqlite3_complete() implementation to use in case
18199 ** the shell is compiled with SQLITE_OMIT_COMPLETE.  The default assumes
18200 ** any arbitrary text is a complete SQL statement.  This is not very
18201 ** user-friendly, but it does seem to work.
18202 */
18203 #ifdef SQLITE_OMIT_COMPLETE
18204 #define sqlite3_complete(x) 1
18205 #endif
18206 
18207 /*
18208 ** Return true if zSql is a complete SQL statement.  Return false if it
18209 ** ends in the middle of a string literal or C-style comment.
18210 */
18211 static int line_is_complete(char *zSql, int nSql){
18212   int rc;
18213   if( zSql==0 ) return 1;
18214   zSql[nSql] = ';';
18215   zSql[nSql+1] = 0;
18216   rc = sqlite3_complete(zSql);
18217   zSql[nSql] = 0;
18218   return rc;
18219 }
18220 
18221 /*
18222 ** Run a single line of SQL.  Return the number of errors.
18223 */
18224 static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){
18225   int rc;
18226   char *zErrMsg = 0;
18227 
18228   open_db(p, 0);
18229   if( ShellHasFlag(p,SHFLG_Backslash) ) resolve_backslashes(zSql);
18230   if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0;
18231   BEGIN_TIMER;
18232   rc = shell_exec(p, zSql, &zErrMsg);
18233   END_TIMER;
18234   if( rc || zErrMsg ){
18235     char zPrefix[100];
18236     if( in!=0 || !stdin_is_interactive ){
18237       sqlite3_snprintf(sizeof(zPrefix), zPrefix,
18238                        "Error: near line %d:", startline);
18239     }else{
18240       sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
18241     }
18242     if( zErrMsg!=0 ){
18243       utf8_printf(stderr, "%s %s\n", zPrefix, zErrMsg);
18244       sqlite3_free(zErrMsg);
18245       zErrMsg = 0;
18246     }else{
18247       utf8_printf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
18248     }
18249     return 1;
18250   }else if( ShellHasFlag(p, SHFLG_CountChanges) ){
18251     raw_printf(p->out, "changes: %3d   total_changes: %d\n",
18252             sqlite3_changes(p->db), sqlite3_total_changes(p->db));
18253   }
18254   return 0;
18255 }
18256 
18257 
18258 /*
18259 ** Read input from *in and process it.  If *in==0 then input
18260 ** is interactive - the user is typing it it.  Otherwise, input
18261 ** is coming from a file or device.  A prompt is issued and history
18262 ** is saved only if input is interactive.  An interrupt signal will
18263 ** cause this routine to exit immediately, unless input is interactive.
18264 **
18265 ** Return the number of errors.
18266 */
18267 static int process_input(ShellState *p){
18268   char *zLine = 0;          /* A single input line */
18269   char *zSql = 0;           /* Accumulated SQL text */
18270   int nLine;                /* Length of current line */
18271   int nSql = 0;             /* Bytes of zSql[] used */
18272   int nAlloc = 0;           /* Allocated zSql[] space */
18273   int nSqlPrior = 0;        /* Bytes of zSql[] used by prior line */
18274   int rc;                   /* Error code */
18275   int errCnt = 0;           /* Number of errors seen */
18276   int startline = 0;        /* Line number for start of current input */
18277 
18278   p->lineno = 0;
18279   while( errCnt==0 || !bail_on_error || (p->in==0 && stdin_is_interactive) ){
18280     fflush(p->out);
18281     zLine = one_input_line(p->in, zLine, nSql>0);
18282     if( zLine==0 ){
18283       /* End of input */
18284       if( p->in==0 && stdin_is_interactive ) printf("\n");
18285       break;
18286     }
18287     if( seenInterrupt ){
18288       if( p->in!=0 ) break;
18289       seenInterrupt = 0;
18290     }
18291     p->lineno++;
18292     if( nSql==0 && _all_whitespace(zLine) ){
18293       if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine);
18294       continue;
18295     }
18296     if( zLine && (zLine[0]=='.' || zLine[0]=='#') && nSql==0 ){
18297       if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine);
18298       if( zLine[0]=='.' ){
18299         rc = do_meta_command(zLine, p);
18300         if( rc==2 ){ /* exit requested */
18301           break;
18302         }else if( rc ){
18303           errCnt++;
18304         }
18305       }
18306       continue;
18307     }
18308     if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){
18309       memcpy(zLine,";",2);
18310     }
18311     nLine = strlen30(zLine);
18312     if( nSql+nLine+2>=nAlloc ){
18313       nAlloc = nSql+nLine+100;
18314       zSql = realloc(zSql, nAlloc);
18315       if( zSql==0 ) shell_out_of_memory();
18316     }
18317     nSqlPrior = nSql;
18318     if( nSql==0 ){
18319       int i;
18320       for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
18321       assert( nAlloc>0 && zSql!=0 );
18322       memcpy(zSql, zLine+i, nLine+1-i);
18323       startline = p->lineno;
18324       nSql = nLine-i;
18325     }else{
18326       zSql[nSql++] = '\n';
18327       memcpy(zSql+nSql, zLine, nLine+1);
18328       nSql += nLine;
18329     }
18330     if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
18331                 && sqlite3_complete(zSql) ){
18332       errCnt += runOneSqlLine(p, zSql, p->in, startline);
18333       nSql = 0;
18334       if( p->outCount ){
18335         output_reset(p);
18336         p->outCount = 0;
18337       }else{
18338         clearTempFile(p);
18339       }
18340     }else if( nSql && _all_whitespace(zSql) ){
18341       if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zSql);
18342       nSql = 0;
18343     }
18344   }
18345   if( nSql && !_all_whitespace(zSql) ){
18346     errCnt += runOneSqlLine(p, zSql, p->in, startline);
18347   }
18348   free(zSql);
18349   free(zLine);
18350   return errCnt>0;
18351 }
18352 
18353 /*
18354 ** Return a pathname which is the user's home directory.  A
18355 ** 0 return indicates an error of some kind.
18356 */
18357 static char *find_home_dir(int clearFlag){
18358   static char *home_dir = NULL;
18359   if( clearFlag ){
18360     free(home_dir);
18361     home_dir = 0;
18362     return 0;
18363   }
18364   if( home_dir ) return home_dir;
18365 
18366 #if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) \
18367      && !defined(__RTP__) && !defined(_WRS_KERNEL)
18368   {
18369     struct passwd *pwent;
18370     uid_t uid = getuid();
18371     if( (pwent=getpwuid(uid)) != NULL) {
18372       home_dir = pwent->pw_dir;
18373     }
18374   }
18375 #endif
18376 
18377 #if defined(_WIN32_WCE)
18378   /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
18379    */
18380   home_dir = "/";
18381 #else
18382 
18383 #if defined(_WIN32) || defined(WIN32)
18384   if (!home_dir) {
18385     home_dir = getenv("USERPROFILE");
18386   }
18387 #endif
18388 
18389   if (!home_dir) {
18390     home_dir = getenv("HOME");
18391   }
18392 
18393 #if defined(_WIN32) || defined(WIN32)
18394   if (!home_dir) {
18395     char *zDrive, *zPath;
18396     int n;
18397     zDrive = getenv("HOMEDRIVE");
18398     zPath = getenv("HOMEPATH");
18399     if( zDrive && zPath ){
18400       n = strlen30(zDrive) + strlen30(zPath) + 1;
18401       home_dir = malloc( n );
18402       if( home_dir==0 ) return 0;
18403       sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
18404       return home_dir;
18405     }
18406     home_dir = "c:\\";
18407   }
18408 #endif
18409 
18410 #endif /* !_WIN32_WCE */
18411 
18412   if( home_dir ){
18413     int n = strlen30(home_dir) + 1;
18414     char *z = malloc( n );
18415     if( z ) memcpy(z, home_dir, n);
18416     home_dir = z;
18417   }
18418 
18419   return home_dir;
18420 }
18421 
18422 /*
18423 ** Read input from the file given by sqliterc_override.  Or if that
18424 ** parameter is NULL, take input from ~/.sqliterc
18425 **
18426 ** Returns the number of errors.
18427 */
18428 static void process_sqliterc(
18429   ShellState *p,                  /* Configuration data */
18430   const char *sqliterc_override   /* Name of config file. NULL to use default */
18431 ){
18432   char *home_dir = NULL;
18433   const char *sqliterc = sqliterc_override;
18434   char *zBuf = 0;
18435   FILE *inSaved = p->in;
18436   int savedLineno = p->lineno;
18437 
18438   if (sqliterc == NULL) {
18439     home_dir = find_home_dir(0);
18440     if( home_dir==0 ){
18441       raw_printf(stderr, "-- warning: cannot find home directory;"
18442                       " cannot read ~/.sqliterc\n");
18443       return;
18444     }
18445     zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
18446     sqliterc = zBuf;
18447   }
18448   p->in = fopen(sqliterc,"rb");
18449   if( p->in ){
18450     if( stdin_is_interactive ){
18451       utf8_printf(stderr,"-- Loading resources from %s\n",sqliterc);
18452     }
18453     process_input(p);
18454     fclose(p->in);
18455   }
18456   p->in = inSaved;
18457   p->lineno = savedLineno;
18458   sqlite3_free(zBuf);
18459 }
18460 
18461 /*
18462 ** Show available command line options
18463 */
18464 static const char zOptions[] =
18465 #if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE)
18466   "   -A ARGS...           run \".archive ARGS\" and exit\n"
18467 #endif
18468   "   -append              append the database to the end of the file\n"
18469   "   -ascii               set output mode to 'ascii'\n"
18470   "   -bail                stop after hitting an error\n"
18471   "   -batch               force batch I/O\n"
18472   "   -column              set output mode to 'column'\n"
18473   "   -cmd COMMAND         run \"COMMAND\" before reading stdin\n"
18474   "   -csv                 set output mode to 'csv'\n"
18475 #if defined(SQLITE_ENABLE_DESERIALIZE)
18476   "   -deserialize         open the database using sqlite3_deserialize()\n"
18477 #endif
18478   "   -echo                print commands before execution\n"
18479   "   -init FILENAME       read/process named file\n"
18480   "   -[no]header          turn headers on or off\n"
18481 #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
18482   "   -heap SIZE           Size of heap for memsys3 or memsys5\n"
18483 #endif
18484   "   -help                show this message\n"
18485   "   -html                set output mode to HTML\n"
18486   "   -interactive         force interactive I/O\n"
18487   "   -line                set output mode to 'line'\n"
18488   "   -list                set output mode to 'list'\n"
18489   "   -lookaside SIZE N    use N entries of SZ bytes for lookaside memory\n"
18490 #if defined(SQLITE_ENABLE_DESERIALIZE)
18491   "   -maxsize N           maximum size for a --deserialize database\n"
18492 #endif
18493   "   -memtrace            trace all memory allocations and deallocations\n"
18494   "   -mmap N              default mmap size set to N\n"
18495 #ifdef SQLITE_ENABLE_MULTIPLEX
18496   "   -multiplex           enable the multiplexor VFS\n"
18497 #endif
18498   "   -newline SEP         set output row separator. Default: '\\n'\n"
18499   "   -nullvalue TEXT      set text string for NULL values. Default ''\n"
18500   "   -pagecache SIZE N    use N slots of SZ bytes each for page cache memory\n"
18501   "   -quote               set output mode to 'quote'\n"
18502   "   -readonly            open the database read-only\n"
18503   "   -separator SEP       set output column separator. Default: '|'\n"
18504 #ifdef SQLITE_ENABLE_SORTER_REFERENCES
18505   "   -sorterref SIZE      sorter references threshold size\n"
18506 #endif
18507   "   -stats               print memory stats before each finalize\n"
18508   "   -version             show SQLite version\n"
18509   "   -vfs NAME            use NAME as the default VFS\n"
18510 #ifdef SQLITE_ENABLE_VFSTRACE
18511   "   -vfstrace            enable tracing of all VFS calls\n"
18512 #endif
18513 #ifdef SQLITE_HAVE_ZLIB
18514   "   -zip                 open the file as a ZIP Archive\n"
18515 #endif
18516 ;
18517 static void usage(int showDetail){
18518   utf8_printf(stderr,
18519       "Usage: %s [OPTIONS] FILENAME [SQL]\n"
18520       "FILENAME is the name of an SQLite database. A new database is created\n"
18521       "if the file does not previously exist.\n", Argv0);
18522   if( showDetail ){
18523     utf8_printf(stderr, "OPTIONS include:\n%s", zOptions);
18524   }else{
18525     raw_printf(stderr, "Use the -help option for additional information\n");
18526   }
18527   exit(1);
18528 }
18529 
18530 /*
18531 ** Internal check:  Verify that the SQLite is uninitialized.  Print a
18532 ** error message if it is initialized.
18533 */
18534 static void verify_uninitialized(void){
18535   if( sqlite3_config(-1)==SQLITE_MISUSE ){
18536     utf8_printf(stdout, "WARNING: attempt to configure SQLite after"
18537                         " initialization.\n");
18538   }
18539 }
18540 
18541 /*
18542 ** Initialize the state information in data
18543 */
18544 static void main_init(ShellState *data) {
18545   memset(data, 0, sizeof(*data));
18546   data->normalMode = data->cMode = data->mode = MODE_List;
18547   data->autoExplain = 1;
18548   memcpy(data->colSeparator,SEP_Column, 2);
18549   memcpy(data->rowSeparator,SEP_Row, 2);
18550   data->showHeader = 0;
18551   data->shellFlgs = SHFLG_Lookaside;
18552   verify_uninitialized();
18553   sqlite3_config(SQLITE_CONFIG_URI, 1);
18554   sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
18555   sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
18556   sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
18557   sqlite3_snprintf(sizeof(continuePrompt), continuePrompt,"   ...> ");
18558 }
18559 
18560 /*
18561 ** Output text to the console in a font that attracts extra attention.
18562 */
18563 #ifdef _WIN32
18564 static void printBold(const char *zText){
18565   HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
18566   CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
18567   GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
18568   SetConsoleTextAttribute(out,
18569          FOREGROUND_RED|FOREGROUND_INTENSITY
18570   );
18571   printf("%s", zText);
18572   SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
18573 }
18574 #else
18575 static void printBold(const char *zText){
18576   printf("\033[1m%s\033[0m", zText);
18577 }
18578 #endif
18579 
18580 /*
18581 ** Get the argument to an --option.  Throw an error and die if no argument
18582 ** is available.
18583 */
18584 static char *cmdline_option_value(int argc, char **argv, int i){
18585   if( i==argc ){
18586     utf8_printf(stderr, "%s: Error: missing argument to %s\n",
18587             argv[0], argv[argc-1]);
18588     exit(1);
18589   }
18590   return argv[i];
18591 }
18592 
18593 #ifndef SQLITE_SHELL_IS_UTF8
18594 #  if (defined(_WIN32) || defined(WIN32)) && defined(_MSC_VER)
18595 #    define SQLITE_SHELL_IS_UTF8          (0)
18596 #  else
18597 #    define SQLITE_SHELL_IS_UTF8          (1)
18598 #  endif
18599 #endif
18600 
18601 #if SQLITE_SHELL_IS_UTF8
18602 int SQLITE_CDECL main(int argc, char **argv){
18603 #else
18604 int SQLITE_CDECL wmain(int argc, wchar_t **wargv){
18605   char **argv;
18606 #endif
18607   char *zErrMsg = 0;
18608   ShellState data;
18609   const char *zInitFile = 0;
18610   int i;
18611   int rc = 0;
18612   int warnInmemoryDb = 0;
18613   int readStdin = 1;
18614   int nCmd = 0;
18615   char **azCmd = 0;
18616   const char *zVfs = 0;           /* Value of -vfs command-line option */
18617 #if !SQLITE_SHELL_IS_UTF8
18618   char **argvToFree = 0;
18619   int argcToFree = 0;
18620 #endif
18621 
18622   setBinaryMode(stdin, 0);
18623   setvbuf(stderr, 0, _IONBF, 0); /* Make sure stderr is unbuffered */
18624   stdin_is_interactive = isatty(0);
18625   stdout_is_console = isatty(1);
18626 
18627 #if !defined(_WIN32_WCE)
18628   if( getenv("SQLITE_DEBUG_BREAK") ){
18629     if( isatty(0) && isatty(2) ){
18630       fprintf(stderr,
18631           "attach debugger to process %d and press any key to continue.\n",
18632           GETPID());
18633       fgetc(stdin);
18634     }else{
18635 #if defined(_WIN32) || defined(WIN32)
18636       DebugBreak();
18637 #elif defined(SIGTRAP)
18638       raise(SIGTRAP);
18639 #endif
18640     }
18641   }
18642 #endif
18643 
18644 #if USE_SYSTEM_SQLITE+0!=1
18645   if( strncmp(sqlite3_sourceid(),SQLITE_SOURCE_ID,60)!=0 ){
18646     utf8_printf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
18647             sqlite3_sourceid(), SQLITE_SOURCE_ID);
18648     exit(1);
18649   }
18650 #endif
18651   main_init(&data);
18652 
18653   /* On Windows, we must translate command-line arguments into UTF-8.
18654   ** The SQLite memory allocator subsystem has to be enabled in order to
18655   ** do this.  But we want to run an sqlite3_shutdown() afterwards so that
18656   ** subsequent sqlite3_config() calls will work.  So copy all results into
18657   ** memory that does not come from the SQLite memory allocator.
18658   */
18659 #if !SQLITE_SHELL_IS_UTF8
18660   sqlite3_initialize();
18661   argvToFree = malloc(sizeof(argv[0])*argc*2);
18662   argcToFree = argc;
18663   argv = argvToFree + argc;
18664   if( argv==0 ) shell_out_of_memory();
18665   for(i=0; i<argc; i++){
18666     char *z = sqlite3_win32_unicode_to_utf8(wargv[i]);
18667     int n;
18668     if( z==0 ) shell_out_of_memory();
18669     n = (int)strlen(z);
18670     argv[i] = malloc( n+1 );
18671     if( argv[i]==0 ) shell_out_of_memory();
18672     memcpy(argv[i], z, n+1);
18673     argvToFree[i] = argv[i];
18674     sqlite3_free(z);
18675   }
18676   sqlite3_shutdown();
18677 #endif
18678 
18679   assert( argc>=1 && argv && argv[0] );
18680   Argv0 = argv[0];
18681 
18682   /* Make sure we have a valid signal handler early, before anything
18683   ** else is done.
18684   */
18685 #ifdef SIGINT
18686   signal(SIGINT, interrupt_handler);
18687 #elif (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE)
18688   SetConsoleCtrlHandler(ConsoleCtrlHandler, TRUE);
18689 #endif
18690 
18691 #ifdef SQLITE_SHELL_DBNAME_PROC
18692   {
18693     /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name
18694     ** of a C-function that will provide the name of the database file.  Use
18695     ** this compile-time option to embed this shell program in larger
18696     ** applications. */
18697     extern void SQLITE_SHELL_DBNAME_PROC(const char**);
18698     SQLITE_SHELL_DBNAME_PROC(&data.zDbFilename);
18699     warnInmemoryDb = 0;
18700   }
18701 #endif
18702 
18703   /* Do an initial pass through the command-line argument to locate
18704   ** the name of the database file, the name of the initialization file,
18705   ** the size of the alternative malloc heap,
18706   ** and the first command to execute.
18707   */
18708   verify_uninitialized();
18709   for(i=1; i<argc; i++){
18710     char *z;
18711     z = argv[i];
18712     if( z[0]!='-' ){
18713       if( data.zDbFilename==0 ){
18714         data.zDbFilename = z;
18715       }else{
18716         /* Excesss arguments are interpreted as SQL (or dot-commands) and
18717         ** mean that nothing is read from stdin */
18718         readStdin = 0;
18719         nCmd++;
18720         azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd);
18721         if( azCmd==0 ) shell_out_of_memory();
18722         azCmd[nCmd-1] = z;
18723       }
18724     }
18725     if( z[1]=='-' ) z++;
18726     if( strcmp(z,"-separator")==0
18727      || strcmp(z,"-nullvalue")==0
18728      || strcmp(z,"-newline")==0
18729      || strcmp(z,"-cmd")==0
18730     ){
18731       (void)cmdline_option_value(argc, argv, ++i);
18732     }else if( strcmp(z,"-init")==0 ){
18733       zInitFile = cmdline_option_value(argc, argv, ++i);
18734     }else if( strcmp(z,"-batch")==0 ){
18735       /* Need to check for batch mode here to so we can avoid printing
18736       ** informational messages (like from process_sqliterc) before
18737       ** we do the actual processing of arguments later in a second pass.
18738       */
18739       stdin_is_interactive = 0;
18740     }else if( strcmp(z,"-heap")==0 ){
18741 #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
18742       const char *zSize;
18743       sqlite3_int64 szHeap;
18744 
18745       zSize = cmdline_option_value(argc, argv, ++i);
18746       szHeap = integerValue(zSize);
18747       if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
18748       sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
18749 #else
18750       (void)cmdline_option_value(argc, argv, ++i);
18751 #endif
18752     }else if( strcmp(z,"-pagecache")==0 ){
18753       int n, sz;
18754       sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
18755       if( sz>70000 ) sz = 70000;
18756       if( sz<0 ) sz = 0;
18757       n = (int)integerValue(cmdline_option_value(argc,argv,++i));
18758       sqlite3_config(SQLITE_CONFIG_PAGECACHE,
18759                     (n>0 && sz>0) ? malloc(n*sz) : 0, sz, n);
18760       data.shellFlgs |= SHFLG_Pagecache;
18761     }else if( strcmp(z,"-lookaside")==0 ){
18762       int n, sz;
18763       sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
18764       if( sz<0 ) sz = 0;
18765       n = (int)integerValue(cmdline_option_value(argc,argv,++i));
18766       if( n<0 ) n = 0;
18767       sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n);
18768       if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside;
18769 #ifdef SQLITE_ENABLE_VFSTRACE
18770     }else if( strcmp(z,"-vfstrace")==0 ){
18771       extern int vfstrace_register(
18772          const char *zTraceName,
18773          const char *zOldVfsName,
18774          int (*xOut)(const char*,void*),
18775          void *pOutArg,
18776          int makeDefault
18777       );
18778       vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
18779 #endif
18780 #ifdef SQLITE_ENABLE_MULTIPLEX
18781     }else if( strcmp(z,"-multiplex")==0 ){
18782       extern int sqlite3_multiple_initialize(const char*,int);
18783       sqlite3_multiplex_initialize(0, 1);
18784 #endif
18785     }else if( strcmp(z,"-mmap")==0 ){
18786       sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
18787       sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
18788 #ifdef SQLITE_ENABLE_SORTER_REFERENCES
18789     }else if( strcmp(z,"-sorterref")==0 ){
18790       sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
18791       sqlite3_config(SQLITE_CONFIG_SORTERREF_SIZE, (int)sz);
18792 #endif
18793     }else if( strcmp(z,"-vfs")==0 ){
18794       zVfs = cmdline_option_value(argc, argv, ++i);
18795 #ifdef SQLITE_HAVE_ZLIB
18796     }else if( strcmp(z,"-zip")==0 ){
18797       data.openMode = SHELL_OPEN_ZIPFILE;
18798 #endif
18799     }else if( strcmp(z,"-append")==0 ){
18800       data.openMode = SHELL_OPEN_APPENDVFS;
18801 #ifdef SQLITE_ENABLE_DESERIALIZE
18802     }else if( strcmp(z,"-deserialize")==0 ){
18803       data.openMode = SHELL_OPEN_DESERIALIZE;
18804     }else if( strcmp(z,"-maxsize")==0 && i+1<argc ){
18805       data.szMax = integerValue(argv[++i]);
18806 #endif
18807     }else if( strcmp(z,"-readonly")==0 ){
18808       data.openMode = SHELL_OPEN_READONLY;
18809 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
18810     }else if( strncmp(z, "-A",2)==0 ){
18811       /* All remaining command-line arguments are passed to the ".archive"
18812       ** command, so ignore them */
18813       break;
18814 #endif
18815     }else if( strcmp(z, "-memtrace")==0 ){
18816       sqlite3MemTraceActivate(stderr);
18817     }
18818   }
18819   verify_uninitialized();
18820 
18821 
18822 #ifdef SQLITE_SHELL_INIT_PROC
18823   {
18824     /* If the SQLITE_SHELL_INIT_PROC macro is defined, then it is the name
18825     ** of a C-function that will perform initialization actions on SQLite that
18826     ** occur just before or after sqlite3_initialize(). Use this compile-time
18827     ** option to embed this shell program in larger applications. */
18828     extern void SQLITE_SHELL_INIT_PROC(void);
18829     SQLITE_SHELL_INIT_PROC();
18830   }
18831 #else
18832   /* All the sqlite3_config() calls have now been made. So it is safe
18833   ** to call sqlite3_initialize() and process any command line -vfs option. */
18834   sqlite3_initialize();
18835 #endif
18836 
18837   if( zVfs ){
18838     sqlite3_vfs *pVfs = sqlite3_vfs_find(zVfs);
18839     if( pVfs ){
18840       sqlite3_vfs_register(pVfs, 1);
18841     }else{
18842       utf8_printf(stderr, "no such VFS: \"%s\"\n", argv[i]);
18843       exit(1);
18844     }
18845   }
18846 
18847   if( data.zDbFilename==0 ){
18848 #ifndef SQLITE_OMIT_MEMORYDB
18849     data.zDbFilename = ":memory:";
18850     warnInmemoryDb = argc==1;
18851 #else
18852     utf8_printf(stderr,"%s: Error: no database filename specified\n", Argv0);
18853     return 1;
18854 #endif
18855   }
18856   data.out = stdout;
18857   sqlite3_appendvfs_init(0,0,0);
18858 
18859   /* Go ahead and open the database file if it already exists.  If the
18860   ** file does not exist, delay opening it.  This prevents empty database
18861   ** files from being created if a user mistypes the database name argument
18862   ** to the sqlite command-line tool.
18863   */
18864   if( access(data.zDbFilename, 0)==0 ){
18865     open_db(&data, 0);
18866   }
18867 
18868   /* Process the initialization file if there is one.  If no -init option
18869   ** is given on the command line, look for a file named ~/.sqliterc and
18870   ** try to process it.
18871   */
18872   process_sqliterc(&data,zInitFile);
18873 
18874   /* Make a second pass through the command-line argument and set
18875   ** options.  This second pass is delayed until after the initialization
18876   ** file is processed so that the command-line arguments will override
18877   ** settings in the initialization file.
18878   */
18879   for(i=1; i<argc; i++){
18880     char *z = argv[i];
18881     if( z[0]!='-' ) continue;
18882     if( z[1]=='-' ){ z++; }
18883     if( strcmp(z,"-init")==0 ){
18884       i++;
18885     }else if( strcmp(z,"-html")==0 ){
18886       data.mode = MODE_Html;
18887     }else if( strcmp(z,"-list")==0 ){
18888       data.mode = MODE_List;
18889     }else if( strcmp(z,"-quote")==0 ){
18890       data.mode = MODE_Quote;
18891     }else if( strcmp(z,"-line")==0 ){
18892       data.mode = MODE_Line;
18893     }else if( strcmp(z,"-column")==0 ){
18894       data.mode = MODE_Column;
18895     }else if( strcmp(z,"-csv")==0 ){
18896       data.mode = MODE_Csv;
18897       memcpy(data.colSeparator,",",2);
18898 #ifdef SQLITE_HAVE_ZLIB
18899     }else if( strcmp(z,"-zip")==0 ){
18900       data.openMode = SHELL_OPEN_ZIPFILE;
18901 #endif
18902     }else if( strcmp(z,"-append")==0 ){
18903       data.openMode = SHELL_OPEN_APPENDVFS;
18904 #ifdef SQLITE_ENABLE_DESERIALIZE
18905     }else if( strcmp(z,"-deserialize")==0 ){
18906       data.openMode = SHELL_OPEN_DESERIALIZE;
18907     }else if( strcmp(z,"-maxsize")==0 && i+1<argc ){
18908       data.szMax = integerValue(argv[++i]);
18909 #endif
18910     }else if( strcmp(z,"-readonly")==0 ){
18911       data.openMode = SHELL_OPEN_READONLY;
18912     }else if( strcmp(z,"-ascii")==0 ){
18913       data.mode = MODE_Ascii;
18914       sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
18915                        SEP_Unit);
18916       sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
18917                        SEP_Record);
18918     }else if( strcmp(z,"-separator")==0 ){
18919       sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
18920                        "%s",cmdline_option_value(argc,argv,++i));
18921     }else if( strcmp(z,"-newline")==0 ){
18922       sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
18923                        "%s",cmdline_option_value(argc,argv,++i));
18924     }else if( strcmp(z,"-nullvalue")==0 ){
18925       sqlite3_snprintf(sizeof(data.nullValue), data.nullValue,
18926                        "%s",cmdline_option_value(argc,argv,++i));
18927     }else if( strcmp(z,"-header")==0 ){
18928       data.showHeader = 1;
18929     }else if( strcmp(z,"-noheader")==0 ){
18930       data.showHeader = 0;
18931     }else if( strcmp(z,"-echo")==0 ){
18932       ShellSetFlag(&data, SHFLG_Echo);
18933     }else if( strcmp(z,"-eqp")==0 ){
18934       data.autoEQP = AUTOEQP_on;
18935     }else if( strcmp(z,"-eqpfull")==0 ){
18936       data.autoEQP = AUTOEQP_full;
18937     }else if( strcmp(z,"-stats")==0 ){
18938       data.statsOn = 1;
18939     }else if( strcmp(z,"-scanstats")==0 ){
18940       data.scanstatsOn = 1;
18941     }else if( strcmp(z,"-backslash")==0 ){
18942       /* Undocumented command-line option: -backslash
18943       ** Causes C-style backslash escapes to be evaluated in SQL statements
18944       ** prior to sending the SQL into SQLite.  Useful for injecting
18945       ** crazy bytes in the middle of SQL statements for testing and debugging.
18946       */
18947       ShellSetFlag(&data, SHFLG_Backslash);
18948     }else if( strcmp(z,"-bail")==0 ){
18949       bail_on_error = 1;
18950     }else if( strcmp(z,"-version")==0 ){
18951       printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
18952       return 0;
18953     }else if( strcmp(z,"-interactive")==0 ){
18954       stdin_is_interactive = 1;
18955     }else if( strcmp(z,"-batch")==0 ){
18956       stdin_is_interactive = 0;
18957     }else if( strcmp(z,"-heap")==0 ){
18958       i++;
18959     }else if( strcmp(z,"-pagecache")==0 ){
18960       i+=2;
18961     }else if( strcmp(z,"-lookaside")==0 ){
18962       i+=2;
18963     }else if( strcmp(z,"-mmap")==0 ){
18964       i++;
18965     }else if( strcmp(z,"-memtrace")==0 ){
18966       i++;
18967 #ifdef SQLITE_ENABLE_SORTER_REFERENCES
18968     }else if( strcmp(z,"-sorterref")==0 ){
18969       i++;
18970 #endif
18971     }else if( strcmp(z,"-vfs")==0 ){
18972       i++;
18973 #ifdef SQLITE_ENABLE_VFSTRACE
18974     }else if( strcmp(z,"-vfstrace")==0 ){
18975       i++;
18976 #endif
18977 #ifdef SQLITE_ENABLE_MULTIPLEX
18978     }else if( strcmp(z,"-multiplex")==0 ){
18979       i++;
18980 #endif
18981     }else if( strcmp(z,"-help")==0 ){
18982       usage(1);
18983     }else if( strcmp(z,"-cmd")==0 ){
18984       /* Run commands that follow -cmd first and separately from commands
18985       ** that simply appear on the command-line.  This seems goofy.  It would
18986       ** be better if all commands ran in the order that they appear.  But
18987       ** we retain the goofy behavior for historical compatibility. */
18988       if( i==argc-1 ) break;
18989       z = cmdline_option_value(argc,argv,++i);
18990       if( z[0]=='.' ){
18991         rc = do_meta_command(z, &data);
18992         if( rc && bail_on_error ) return rc==2 ? 0 : rc;
18993       }else{
18994         open_db(&data, 0);
18995         rc = shell_exec(&data, z, &zErrMsg);
18996         if( zErrMsg!=0 ){
18997           utf8_printf(stderr,"Error: %s\n", zErrMsg);
18998           if( bail_on_error ) return rc!=0 ? rc : 1;
18999         }else if( rc!=0 ){
19000           utf8_printf(stderr,"Error: unable to process SQL \"%s\"\n", z);
19001           if( bail_on_error ) return rc;
19002         }
19003       }
19004 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
19005     }else if( strncmp(z, "-A", 2)==0 ){
19006       if( nCmd>0 ){
19007         utf8_printf(stderr, "Error: cannot mix regular SQL or dot-commands"
19008                             " with \"%s\"\n", z);
19009         return 1;
19010       }
19011       open_db(&data, OPEN_DB_ZIPFILE);
19012       if( z[2] ){
19013         argv[i] = &z[2];
19014         arDotCommand(&data, 1, argv+(i-1), argc-(i-1));
19015       }else{
19016         arDotCommand(&data, 1, argv+i, argc-i);
19017       }
19018       readStdin = 0;
19019       break;
19020 #endif
19021     }else{
19022       utf8_printf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
19023       raw_printf(stderr,"Use -help for a list of options.\n");
19024       return 1;
19025     }
19026     data.cMode = data.mode;
19027   }
19028 
19029   if( !readStdin ){
19030     /* Run all arguments that do not begin with '-' as if they were separate
19031     ** command-line inputs, except for the argToSkip argument which contains
19032     ** the database filename.
19033     */
19034     for(i=0; i<nCmd; i++){
19035       if( azCmd[i][0]=='.' ){
19036         rc = do_meta_command(azCmd[i], &data);
19037         if( rc ) return rc==2 ? 0 : rc;
19038       }else{
19039         open_db(&data, 0);
19040         rc = shell_exec(&data, azCmd[i], &zErrMsg);
19041         if( zErrMsg!=0 ){
19042           utf8_printf(stderr,"Error: %s\n", zErrMsg);
19043           return rc!=0 ? rc : 1;
19044         }else if( rc!=0 ){
19045           utf8_printf(stderr,"Error: unable to process SQL: %s\n", azCmd[i]);
19046           return rc;
19047         }
19048       }
19049     }
19050     free(azCmd);
19051   }else{
19052     /* Run commands received from standard input
19053     */
19054     if( stdin_is_interactive ){
19055       char *zHome;
19056       char *zHistory;
19057       int nHistory;
19058       printf(
19059         "SQLite version %s %.19s\n" /*extra-version-info*/
19060         "Enter \".help\" for usage hints.\n",
19061         sqlite3_libversion(), sqlite3_sourceid()
19062       );
19063       if( warnInmemoryDb ){
19064         printf("Connected to a ");
19065         printBold("transient in-memory database");
19066         printf(".\nUse \".open FILENAME\" to reopen on a "
19067                "persistent database.\n");
19068       }
19069       zHistory = getenv("SQLITE_HISTORY");
19070       if( zHistory ){
19071         zHistory = strdup(zHistory);
19072       }else if( (zHome = find_home_dir(0))!=0 ){
19073         nHistory = strlen30(zHome) + 20;
19074         if( (zHistory = malloc(nHistory))!=0 ){
19075           sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
19076         }
19077       }
19078       if( zHistory ){ shell_read_history(zHistory); }
19079 #if HAVE_READLINE || HAVE_EDITLINE
19080       rl_attempted_completion_function = readline_completion;
19081 #elif HAVE_LINENOISE
19082       linenoiseSetCompletionCallback(linenoise_completion);
19083 #endif
19084       data.in = 0;
19085       rc = process_input(&data);
19086       if( zHistory ){
19087         shell_stifle_history(2000);
19088         shell_write_history(zHistory);
19089         free(zHistory);
19090       }
19091     }else{
19092       data.in = stdin;
19093       rc = process_input(&data);
19094     }
19095   }
19096   set_table_name(&data, 0);
19097   if( data.db ){
19098     session_close_all(&data);
19099     close_db(data.db);
19100   }
19101   sqlite3_free(data.zFreeOnClose);
19102   find_home_dir(1);
19103   output_reset(&data);
19104   data.doXdgOpen = 0;
19105   clearTempFile(&data);
19106 #if !SQLITE_SHELL_IS_UTF8
19107   for(i=0; i<argcToFree; i++) free(argvToFree[i]);
19108   free(argvToFree);
19109 #endif
19110   /* Clear the global data structure so that valgrind will detect memory
19111   ** leaks */
19112   memset(&data, 0, sizeof(data));
19113   return rc;
19114 }
19115