xref: /freebsd/contrib/sqlite3/shell.c (revision c7046f76)
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 ** Optionally #include a user-defined header, whereby compilation options
40 ** may be set prior to where they take effect, but after platform setup.
41 ** If SQLITE_CUSTOM_INCLUDE=? is defined, its value names the #include
42 ** file. Note that this macro has a like effect on sqlite3.c compilation.
43 */
44 # define SHELL_STRINGIFY_(f) #f
45 # define SHELL_STRINGIFY(f) SHELL_STRINGIFY_(f)
46 #ifdef SQLITE_CUSTOM_INCLUDE
47 # include SHELL_STRINGIFY(SQLITE_CUSTOM_INCLUDE)
48 #endif
49 
50 /*
51 ** Determine if we are dealing with WinRT, which provides only a subset of
52 ** the full Win32 API.
53 */
54 #if !defined(SQLITE_OS_WINRT)
55 # define SQLITE_OS_WINRT 0
56 #endif
57 
58 /*
59 ** Warning pragmas copied from msvc.h in the core.
60 */
61 #if defined(_MSC_VER)
62 #pragma warning(disable : 4054)
63 #pragma warning(disable : 4055)
64 #pragma warning(disable : 4100)
65 #pragma warning(disable : 4127)
66 #pragma warning(disable : 4130)
67 #pragma warning(disable : 4152)
68 #pragma warning(disable : 4189)
69 #pragma warning(disable : 4206)
70 #pragma warning(disable : 4210)
71 #pragma warning(disable : 4232)
72 #pragma warning(disable : 4244)
73 #pragma warning(disable : 4305)
74 #pragma warning(disable : 4306)
75 #pragma warning(disable : 4702)
76 #pragma warning(disable : 4706)
77 #endif /* defined(_MSC_VER) */
78 
79 /*
80 ** No support for loadable extensions in VxWorks.
81 */
82 #if (defined(__RTP__) || defined(_WRS_KERNEL)) && !SQLITE_OMIT_LOAD_EXTENSION
83 # define SQLITE_OMIT_LOAD_EXTENSION 1
84 #endif
85 
86 /*
87 ** Enable large-file support for fopen() and friends on unix.
88 */
89 #ifndef SQLITE_DISABLE_LFS
90 # define _LARGE_FILE       1
91 # ifndef _FILE_OFFSET_BITS
92 #   define _FILE_OFFSET_BITS 64
93 # endif
94 # define _LARGEFILE_SOURCE 1
95 #endif
96 
97 #include <stdlib.h>
98 #include <string.h>
99 #include <stdio.h>
100 #include <assert.h>
101 #include "sqlite3.h"
102 typedef sqlite3_int64 i64;
103 typedef sqlite3_uint64 u64;
104 typedef unsigned char u8;
105 #if SQLITE_USER_AUTHENTICATION
106 # include "sqlite3userauth.h"
107 #endif
108 #include <ctype.h>
109 #include <stdarg.h>
110 
111 #if !defined(_WIN32) && !defined(WIN32)
112 # include <signal.h>
113 # if !defined(__RTP__) && !defined(_WRS_KERNEL)
114 #  include <pwd.h>
115 # endif
116 #endif
117 #if (!defined(_WIN32) && !defined(WIN32)) || defined(__MINGW32__)
118 # include <unistd.h>
119 # include <dirent.h>
120 # define GETPID getpid
121 # if defined(__MINGW32__)
122 #  define DIRENT dirent
123 #  ifndef S_ISLNK
124 #   define S_ISLNK(mode) (0)
125 #  endif
126 # endif
127 #else
128 # define GETPID (int)GetCurrentProcessId
129 #endif
130 #include <sys/types.h>
131 #include <sys/stat.h>
132 
133 #if HAVE_READLINE
134 # include <readline/readline.h>
135 # include <readline/history.h>
136 #endif
137 
138 #if HAVE_EDITLINE
139 # include <editline/readline.h>
140 #endif
141 
142 #if HAVE_EDITLINE || HAVE_READLINE
143 
144 # define shell_add_history(X) add_history(X)
145 # define shell_read_history(X) read_history(X)
146 # define shell_write_history(X) write_history(X)
147 # define shell_stifle_history(X) stifle_history(X)
148 # define shell_readline(X) readline(X)
149 
150 #elif HAVE_LINENOISE
151 
152 # include "linenoise.h"
153 # define shell_add_history(X) linenoiseHistoryAdd(X)
154 # define shell_read_history(X) linenoiseHistoryLoad(X)
155 # define shell_write_history(X) linenoiseHistorySave(X)
156 # define shell_stifle_history(X) linenoiseHistorySetMaxLen(X)
157 # define shell_readline(X) linenoise(X)
158 
159 #else
160 
161 # define shell_read_history(X)
162 # define shell_write_history(X)
163 # define shell_stifle_history(X)
164 
165 # define SHELL_USE_LOCAL_GETLINE 1
166 #endif
167 
168 
169 #if defined(_WIN32) || defined(WIN32)
170 # if SQLITE_OS_WINRT
171 #  define SQLITE_OMIT_POPEN 1
172 # else
173 #  include <io.h>
174 #  include <fcntl.h>
175 #  define isatty(h) _isatty(h)
176 #  ifndef access
177 #   define access(f,m) _access((f),(m))
178 #  endif
179 #  ifndef unlink
180 #   define unlink _unlink
181 #  endif
182 #  ifndef strdup
183 #   define strdup _strdup
184 #  endif
185 #  undef popen
186 #  define popen _popen
187 #  undef pclose
188 #  define pclose _pclose
189 # endif
190 #else
191  /* Make sure isatty() has a prototype. */
192  extern int isatty(int);
193 
194 # if !defined(__RTP__) && !defined(_WRS_KERNEL)
195   /* popen and pclose are not C89 functions and so are
196   ** sometimes omitted from the <stdio.h> header */
197    extern FILE *popen(const char*,const char*);
198    extern int pclose(FILE*);
199 # else
200 #  define SQLITE_OMIT_POPEN 1
201 # endif
202 #endif
203 
204 #if defined(_WIN32_WCE)
205 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
206  * thus we always assume that we have a console. That can be
207  * overridden with the -batch command line option.
208  */
209 #define isatty(x) 1
210 #endif
211 
212 /* ctype macros that work with signed characters */
213 #define IsSpace(X)  isspace((unsigned char)X)
214 #define IsDigit(X)  isdigit((unsigned char)X)
215 #define ToLower(X)  (char)tolower((unsigned char)X)
216 
217 #if defined(_WIN32) || defined(WIN32)
218 #if SQLITE_OS_WINRT
219 #include <intrin.h>
220 #endif
221 #include <windows.h>
222 
223 /* string conversion routines only needed on Win32 */
224 extern char *sqlite3_win32_unicode_to_utf8(LPCWSTR);
225 extern char *sqlite3_win32_mbcs_to_utf8_v2(const char *, int);
226 extern char *sqlite3_win32_utf8_to_mbcs_v2(const char *, int);
227 extern LPWSTR sqlite3_win32_utf8_to_unicode(const char *zText);
228 #endif
229 
230 /* On Windows, we normally run with output mode of TEXT so that \n characters
231 ** are automatically translated into \r\n.  However, this behavior needs
232 ** to be disabled in some cases (ex: when generating CSV output and when
233 ** rendering quoted strings that contain \n characters).  The following
234 ** routines take care of that.
235 */
236 #if (defined(_WIN32) || defined(WIN32)) && !SQLITE_OS_WINRT
237 static void setBinaryMode(FILE *file, int isOutput){
238   if( isOutput ) fflush(file);
239   _setmode(_fileno(file), _O_BINARY);
240 }
241 static void setTextMode(FILE *file, int isOutput){
242   if( isOutput ) fflush(file);
243   _setmode(_fileno(file), _O_TEXT);
244 }
245 #else
246 # define setBinaryMode(X,Y)
247 # define setTextMode(X,Y)
248 #endif
249 
250 /*
251 ** When compiling with emcc (a.k.a. emscripten), we're building a
252 ** WebAssembly (WASM) bundle and need to disable and rewire a few
253 ** things.
254 */
255 #ifdef __EMSCRIPTEN__
256 #define SQLITE_SHELL_WASM_MODE
257 #else
258 #undef SQLITE_SHELL_WASM_MODE
259 #endif
260 
261 /* True if the timer is enabled */
262 static int enableTimer = 0;
263 
264 /* Return the current wall-clock time */
265 static sqlite3_int64 timeOfDay(void){
266   static sqlite3_vfs *clockVfs = 0;
267   sqlite3_int64 t;
268   if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0);
269   if( clockVfs==0 ) return 0;  /* Never actually happens */
270   if( clockVfs->iVersion>=2 && clockVfs->xCurrentTimeInt64!=0 ){
271     clockVfs->xCurrentTimeInt64(clockVfs, &t);
272   }else{
273     double r;
274     clockVfs->xCurrentTime(clockVfs, &r);
275     t = (sqlite3_int64)(r*86400000.0);
276   }
277   return t;
278 }
279 
280 #if !defined(_WIN32) && !defined(WIN32) && !defined(__minux)
281 #include <sys/time.h>
282 #include <sys/resource.h>
283 
284 /* VxWorks does not support getrusage() as far as we can determine */
285 #if defined(_WRS_KERNEL) || defined(__RTP__)
286 struct rusage {
287   struct timeval ru_utime; /* user CPU time used */
288   struct timeval ru_stime; /* system CPU time used */
289 };
290 #define getrusage(A,B) memset(B,0,sizeof(*B))
291 #endif
292 
293 /* Saved resource information for the beginning of an operation */
294 static struct rusage sBegin;  /* CPU time at start */
295 static sqlite3_int64 iBegin;  /* Wall-clock time at start */
296 
297 /*
298 ** Begin timing an operation
299 */
300 static void beginTimer(void){
301   if( enableTimer ){
302     getrusage(RUSAGE_SELF, &sBegin);
303     iBegin = timeOfDay();
304   }
305 }
306 
307 /* Return the difference of two time_structs in seconds */
308 static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
309   return (pEnd->tv_usec - pStart->tv_usec)*0.000001 +
310          (double)(pEnd->tv_sec - pStart->tv_sec);
311 }
312 
313 /*
314 ** Print the timing results.
315 */
316 static void endTimer(void){
317   if( enableTimer ){
318     sqlite3_int64 iEnd = timeOfDay();
319     struct rusage sEnd;
320     getrusage(RUSAGE_SELF, &sEnd);
321     printf("Run Time: real %.3f user %f sys %f\n",
322        (iEnd - iBegin)*0.001,
323        timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
324        timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
325   }
326 }
327 
328 #define BEGIN_TIMER beginTimer()
329 #define END_TIMER endTimer()
330 #define HAS_TIMER 1
331 
332 #elif (defined(_WIN32) || defined(WIN32))
333 
334 /* Saved resource information for the beginning of an operation */
335 static HANDLE hProcess;
336 static FILETIME ftKernelBegin;
337 static FILETIME ftUserBegin;
338 static sqlite3_int64 ftWallBegin;
339 typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME,
340                                     LPFILETIME, LPFILETIME);
341 static GETPROCTIMES getProcessTimesAddr = NULL;
342 
343 /*
344 ** Check to see if we have timer support.  Return 1 if necessary
345 ** support found (or found previously).
346 */
347 static int hasTimer(void){
348   if( getProcessTimesAddr ){
349     return 1;
350   } else {
351 #if !SQLITE_OS_WINRT
352     /* GetProcessTimes() isn't supported in WIN95 and some other Windows
353     ** versions. See if the version we are running on has it, and if it
354     ** does, save off a pointer to it and the current process handle.
355     */
356     hProcess = GetCurrentProcess();
357     if( hProcess ){
358       HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll"));
359       if( NULL != hinstLib ){
360         getProcessTimesAddr =
361             (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes");
362         if( NULL != getProcessTimesAddr ){
363           return 1;
364         }
365         FreeLibrary(hinstLib);
366       }
367     }
368 #endif
369   }
370   return 0;
371 }
372 
373 /*
374 ** Begin timing an operation
375 */
376 static void beginTimer(void){
377   if( enableTimer && getProcessTimesAddr ){
378     FILETIME ftCreation, ftExit;
379     getProcessTimesAddr(hProcess,&ftCreation,&ftExit,
380                         &ftKernelBegin,&ftUserBegin);
381     ftWallBegin = timeOfDay();
382   }
383 }
384 
385 /* Return the difference of two FILETIME structs in seconds */
386 static double timeDiff(FILETIME *pStart, FILETIME *pEnd){
387   sqlite_int64 i64Start = *((sqlite_int64 *) pStart);
388   sqlite_int64 i64End = *((sqlite_int64 *) pEnd);
389   return (double) ((i64End - i64Start) / 10000000.0);
390 }
391 
392 /*
393 ** Print the timing results.
394 */
395 static void endTimer(void){
396   if( enableTimer && getProcessTimesAddr){
397     FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
398     sqlite3_int64 ftWallEnd = timeOfDay();
399     getProcessTimesAddr(hProcess,&ftCreation,&ftExit,&ftKernelEnd,&ftUserEnd);
400     printf("Run Time: real %.3f user %f sys %f\n",
401        (ftWallEnd - ftWallBegin)*0.001,
402        timeDiff(&ftUserBegin, &ftUserEnd),
403        timeDiff(&ftKernelBegin, &ftKernelEnd));
404   }
405 }
406 
407 #define BEGIN_TIMER beginTimer()
408 #define END_TIMER endTimer()
409 #define HAS_TIMER hasTimer()
410 
411 #else
412 #define BEGIN_TIMER
413 #define END_TIMER
414 #define HAS_TIMER 0
415 #endif
416 
417 /*
418 ** Used to prevent warnings about unused parameters
419 */
420 #define UNUSED_PARAMETER(x) (void)(x)
421 
422 /*
423 ** Number of elements in an array
424 */
425 #define ArraySize(X)  (int)(sizeof(X)/sizeof(X[0]))
426 
427 /*
428 ** If the following flag is set, then command execution stops
429 ** at an error if we are not interactive.
430 */
431 static int bail_on_error = 0;
432 
433 /*
434 ** Threat stdin as an interactive input if the following variable
435 ** is true.  Otherwise, assume stdin is connected to a file or pipe.
436 */
437 static int stdin_is_interactive = 1;
438 
439 /*
440 ** On Windows systems we have to know if standard output is a console
441 ** in order to translate UTF-8 into MBCS.  The following variable is
442 ** true if translation is required.
443 */
444 static int stdout_is_console = 1;
445 
446 /*
447 ** The following is the open SQLite database.  We make a pointer
448 ** to this database a static variable so that it can be accessed
449 ** by the SIGINT handler to interrupt database processing.
450 */
451 static sqlite3 *globalDb = 0;
452 
453 /*
454 ** True if an interrupt (Control-C) has been received.
455 */
456 static volatile int seenInterrupt = 0;
457 
458 /*
459 ** This is the name of our program. It is set in main(), used
460 ** in a number of other places, mostly for error messages.
461 */
462 static char *Argv0;
463 
464 /*
465 ** Prompt strings. Initialized in main. Settable with
466 **   .prompt main continue
467 */
468 static char mainPrompt[20];     /* First line prompt. default: "sqlite> "*/
469 static char continuePrompt[20]; /* Continuation prompt. default: "   ...> " */
470 
471 /*
472 ** Render output like fprintf().  Except, if the output is going to the
473 ** console and if this is running on a Windows machine, translate the
474 ** output from UTF-8 into MBCS.
475 */
476 #if defined(_WIN32) || defined(WIN32)
477 void utf8_printf(FILE *out, const char *zFormat, ...){
478   va_list ap;
479   va_start(ap, zFormat);
480   if( stdout_is_console && (out==stdout || out==stderr) ){
481     char *z1 = sqlite3_vmprintf(zFormat, ap);
482     char *z2 = sqlite3_win32_utf8_to_mbcs_v2(z1, 0);
483     sqlite3_free(z1);
484     fputs(z2, out);
485     sqlite3_free(z2);
486   }else{
487     vfprintf(out, zFormat, ap);
488   }
489   va_end(ap);
490 }
491 #elif !defined(utf8_printf)
492 # define utf8_printf fprintf
493 #endif
494 
495 /*
496 ** Render output like fprintf().  This should not be used on anything that
497 ** includes string formatting (e.g. "%s").
498 */
499 #if !defined(raw_printf)
500 # define raw_printf fprintf
501 #endif
502 
503 /* Indicate out-of-memory and exit. */
504 static void shell_out_of_memory(void){
505   raw_printf(stderr,"Error: out of memory\n");
506   exit(1);
507 }
508 
509 /* Check a pointer to see if it is NULL.  If it is NULL, exit with an
510 ** out-of-memory error.
511 */
512 static void shell_check_oom(void *p){
513   if( p==0 ) shell_out_of_memory();
514 }
515 
516 /*
517 ** Write I/O traces to the following stream.
518 */
519 #ifdef SQLITE_ENABLE_IOTRACE
520 static FILE *iotrace = 0;
521 #endif
522 
523 /*
524 ** This routine works like printf in that its first argument is a
525 ** format string and subsequent arguments are values to be substituted
526 ** in place of % fields.  The result of formatting this string
527 ** is written to iotrace.
528 */
529 #ifdef SQLITE_ENABLE_IOTRACE
530 static void SQLITE_CDECL iotracePrintf(const char *zFormat, ...){
531   va_list ap;
532   char *z;
533   if( iotrace==0 ) return;
534   va_start(ap, zFormat);
535   z = sqlite3_vmprintf(zFormat, ap);
536   va_end(ap);
537   utf8_printf(iotrace, "%s", z);
538   sqlite3_free(z);
539 }
540 #endif
541 
542 /*
543 ** Output string zUtf to stream pOut as w characters.  If w is negative,
544 ** then right-justify the text.  W is the width in UTF-8 characters, not
545 ** in bytes.  This is different from the %*.*s specification in printf
546 ** since with %*.*s the width is measured in bytes, not characters.
547 */
548 static void utf8_width_print(FILE *pOut, int w, const char *zUtf){
549   int i;
550   int n;
551   int aw = w<0 ? -w : w;
552   for(i=n=0; zUtf[i]; i++){
553     if( (zUtf[i]&0xc0)!=0x80 ){
554       n++;
555       if( n==aw ){
556         do{ i++; }while( (zUtf[i]&0xc0)==0x80 );
557         break;
558       }
559     }
560   }
561   if( n>=aw ){
562     utf8_printf(pOut, "%.*s", i, zUtf);
563   }else if( w<0 ){
564     utf8_printf(pOut, "%*s%s", aw-n, "", zUtf);
565   }else{
566     utf8_printf(pOut, "%s%*s", zUtf, aw-n, "");
567   }
568 }
569 
570 
571 /*
572 ** Determines if a string is a number of not.
573 */
574 static int isNumber(const char *z, int *realnum){
575   if( *z=='-' || *z=='+' ) z++;
576   if( !IsDigit(*z) ){
577     return 0;
578   }
579   z++;
580   if( realnum ) *realnum = 0;
581   while( IsDigit(*z) ){ z++; }
582   if( *z=='.' ){
583     z++;
584     if( !IsDigit(*z) ) return 0;
585     while( IsDigit(*z) ){ z++; }
586     if( realnum ) *realnum = 1;
587   }
588   if( *z=='e' || *z=='E' ){
589     z++;
590     if( *z=='+' || *z=='-' ) z++;
591     if( !IsDigit(*z) ) return 0;
592     while( IsDigit(*z) ){ z++; }
593     if( realnum ) *realnum = 1;
594   }
595   return *z==0;
596 }
597 
598 /*
599 ** Compute a string length that is limited to what can be stored in
600 ** lower 30 bits of a 32-bit signed integer.
601 */
602 static int strlen30(const char *z){
603   const char *z2 = z;
604   while( *z2 ){ z2++; }
605   return 0x3fffffff & (int)(z2 - z);
606 }
607 
608 /*
609 ** Return the length of a string in characters.  Multibyte UTF8 characters
610 ** count as a single character.
611 */
612 static int strlenChar(const char *z){
613   int n = 0;
614   while( *z ){
615     if( (0xc0&*(z++))!=0x80 ) n++;
616   }
617   return n;
618 }
619 
620 /*
621 ** Return open FILE * if zFile exists, can be opened for read
622 ** and is an ordinary file or a character stream source.
623 ** Otherwise return 0.
624 */
625 static FILE * openChrSource(const char *zFile){
626 #ifdef _WIN32
627   struct _stat x = {0};
628 # define STAT_CHR_SRC(mode) ((mode & (_S_IFCHR|_S_IFIFO|_S_IFREG))!=0)
629   /* On Windows, open first, then check the stream nature. This order
630   ** is necessary because _stat() and sibs, when checking a named pipe,
631   ** effectively break the pipe as its supplier sees it. */
632   FILE *rv = fopen(zFile, "rb");
633   if( rv==0 ) return 0;
634   if( _fstat(_fileno(rv), &x) != 0
635       || !STAT_CHR_SRC(x.st_mode)){
636     fclose(rv);
637     rv = 0;
638   }
639   return rv;
640 #else
641   struct stat x = {0};
642   int rc = stat(zFile, &x);
643 # define STAT_CHR_SRC(mode) (S_ISREG(mode)||S_ISFIFO(mode)||S_ISCHR(mode))
644   if( rc!=0 ) return 0;
645   if( STAT_CHR_SRC(x.st_mode) ){
646     return fopen(zFile, "rb");
647   }else{
648     return 0;
649   }
650 #endif
651 #undef STAT_CHR_SRC
652 }
653 
654 /*
655 ** This routine reads a line of text from FILE in, stores
656 ** the text in memory obtained from malloc() and returns a pointer
657 ** to the text.  NULL is returned at end of file, or if malloc()
658 ** fails.
659 **
660 ** If zLine is not NULL then it is a malloced buffer returned from
661 ** a previous call to this routine that may be reused.
662 */
663 static char *local_getline(char *zLine, FILE *in){
664   int nLine = zLine==0 ? 0 : 100;
665   int n = 0;
666 
667   while( 1 ){
668     if( n+100>nLine ){
669       nLine = nLine*2 + 100;
670       zLine = realloc(zLine, nLine);
671       shell_check_oom(zLine);
672     }
673     if( fgets(&zLine[n], nLine - n, in)==0 ){
674       if( n==0 ){
675         free(zLine);
676         return 0;
677       }
678       zLine[n] = 0;
679       break;
680     }
681     while( zLine[n] ) n++;
682     if( n>0 && zLine[n-1]=='\n' ){
683       n--;
684       if( n>0 && zLine[n-1]=='\r' ) n--;
685       zLine[n] = 0;
686       break;
687     }
688   }
689 #if defined(_WIN32) || defined(WIN32)
690   /* For interactive input on Windows systems, translate the
691   ** multi-byte characterset characters into UTF-8. */
692   if( stdin_is_interactive && in==stdin ){
693     char *zTrans = sqlite3_win32_mbcs_to_utf8_v2(zLine, 0);
694     if( zTrans ){
695       int nTrans = strlen30(zTrans)+1;
696       if( nTrans>nLine ){
697         zLine = realloc(zLine, nTrans);
698         shell_check_oom(zLine);
699       }
700       memcpy(zLine, zTrans, nTrans);
701       sqlite3_free(zTrans);
702     }
703   }
704 #endif /* defined(_WIN32) || defined(WIN32) */
705   return zLine;
706 }
707 
708 /*
709 ** Retrieve a single line of input text.
710 **
711 ** If in==0 then read from standard input and prompt before each line.
712 ** If isContinuation is true, then a continuation prompt is appropriate.
713 ** If isContinuation is zero, then the main prompt should be used.
714 **
715 ** If zPrior is not NULL then it is a buffer from a prior call to this
716 ** routine that can be reused.
717 **
718 ** The result is stored in space obtained from malloc() and must either
719 ** be freed by the caller or else passed back into this routine via the
720 ** zPrior argument for reuse.
721 */
722 #ifndef SQLITE_SHELL_WASM_MODE
723 static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
724   char *zPrompt;
725   char *zResult;
726   if( in!=0 ){
727     zResult = local_getline(zPrior, in);
728   }else{
729     zPrompt = isContinuation ? continuePrompt : mainPrompt;
730 #if SHELL_USE_LOCAL_GETLINE
731     printf("%s", zPrompt);
732     fflush(stdout);
733     zResult = local_getline(zPrior, stdin);
734 #else
735     free(zPrior);
736     zResult = shell_readline(zPrompt);
737     if( zResult && *zResult ) shell_add_history(zResult);
738 #endif
739   }
740   return zResult;
741 }
742 #endif /* !SQLITE_SHELL_WASM_MODE */
743 
744 /*
745 ** Return the value of a hexadecimal digit.  Return -1 if the input
746 ** is not a hex digit.
747 */
748 static int hexDigitValue(char c){
749   if( c>='0' && c<='9' ) return c - '0';
750   if( c>='a' && c<='f' ) return c - 'a' + 10;
751   if( c>='A' && c<='F' ) return c - 'A' + 10;
752   return -1;
753 }
754 
755 /*
756 ** Interpret zArg as an integer value, possibly with suffixes.
757 */
758 static sqlite3_int64 integerValue(const char *zArg){
759   sqlite3_int64 v = 0;
760   static const struct { char *zSuffix; int iMult; } aMult[] = {
761     { "KiB", 1024 },
762     { "MiB", 1024*1024 },
763     { "GiB", 1024*1024*1024 },
764     { "KB",  1000 },
765     { "MB",  1000000 },
766     { "GB",  1000000000 },
767     { "K",   1000 },
768     { "M",   1000000 },
769     { "G",   1000000000 },
770   };
771   int i;
772   int isNeg = 0;
773   if( zArg[0]=='-' ){
774     isNeg = 1;
775     zArg++;
776   }else if( zArg[0]=='+' ){
777     zArg++;
778   }
779   if( zArg[0]=='0' && zArg[1]=='x' ){
780     int x;
781     zArg += 2;
782     while( (x = hexDigitValue(zArg[0]))>=0 ){
783       v = (v<<4) + x;
784       zArg++;
785     }
786   }else{
787     while( IsDigit(zArg[0]) ){
788       v = v*10 + zArg[0] - '0';
789       zArg++;
790     }
791   }
792   for(i=0; i<ArraySize(aMult); i++){
793     if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
794       v *= aMult[i].iMult;
795       break;
796     }
797   }
798   return isNeg? -v : v;
799 }
800 
801 /*
802 ** A variable length string to which one can append text.
803 */
804 typedef struct ShellText ShellText;
805 struct ShellText {
806   char *z;
807   int n;
808   int nAlloc;
809 };
810 
811 /*
812 ** Initialize and destroy a ShellText object
813 */
814 static void initText(ShellText *p){
815   memset(p, 0, sizeof(*p));
816 }
817 static void freeText(ShellText *p){
818   free(p->z);
819   initText(p);
820 }
821 
822 /* zIn is either a pointer to a NULL-terminated string in memory obtained
823 ** from malloc(), or a NULL pointer. The string pointed to by zAppend is
824 ** added to zIn, and the result returned in memory obtained from malloc().
825 ** zIn, if it was not NULL, is freed.
826 **
827 ** If the third argument, quote, is not '\0', then it is used as a
828 ** quote character for zAppend.
829 */
830 static void appendText(ShellText *p, const char *zAppend, char quote){
831   int len;
832   int i;
833   int nAppend = strlen30(zAppend);
834 
835   len = nAppend+p->n+1;
836   if( quote ){
837     len += 2;
838     for(i=0; i<nAppend; i++){
839       if( zAppend[i]==quote ) len++;
840     }
841   }
842 
843   if( p->z==0 || p->n+len>=p->nAlloc ){
844     p->nAlloc = p->nAlloc*2 + len + 20;
845     p->z = realloc(p->z, p->nAlloc);
846     shell_check_oom(p->z);
847   }
848 
849   if( quote ){
850     char *zCsr = p->z+p->n;
851     *zCsr++ = quote;
852     for(i=0; i<nAppend; i++){
853       *zCsr++ = zAppend[i];
854       if( zAppend[i]==quote ) *zCsr++ = quote;
855     }
856     *zCsr++ = quote;
857     p->n = (int)(zCsr - p->z);
858     *zCsr = '\0';
859   }else{
860     memcpy(p->z+p->n, zAppend, nAppend);
861     p->n += nAppend;
862     p->z[p->n] = '\0';
863   }
864 }
865 
866 /*
867 ** Attempt to determine if identifier zName needs to be quoted, either
868 ** because it contains non-alphanumeric characters, or because it is an
869 ** SQLite keyword.  Be conservative in this estimate:  When in doubt assume
870 ** that quoting is required.
871 **
872 ** Return '"' if quoting is required.  Return 0 if no quoting is required.
873 */
874 static char quoteChar(const char *zName){
875   int i;
876   if( !isalpha((unsigned char)zName[0]) && zName[0]!='_' ) return '"';
877   for(i=0; zName[i]; i++){
878     if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ) return '"';
879   }
880   return sqlite3_keyword_check(zName, i) ? '"' : 0;
881 }
882 
883 /*
884 ** Construct a fake object name and column list to describe the structure
885 ** of the view, virtual table, or table valued function zSchema.zName.
886 */
887 static char *shellFakeSchema(
888   sqlite3 *db,            /* The database connection containing the vtab */
889   const char *zSchema,    /* Schema of the database holding the vtab */
890   const char *zName       /* The name of the virtual table */
891 ){
892   sqlite3_stmt *pStmt = 0;
893   char *zSql;
894   ShellText s;
895   char cQuote;
896   char *zDiv = "(";
897   int nRow = 0;
898 
899   zSql = sqlite3_mprintf("PRAGMA \"%w\".table_info=%Q;",
900                          zSchema ? zSchema : "main", zName);
901   shell_check_oom(zSql);
902   sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
903   sqlite3_free(zSql);
904   initText(&s);
905   if( zSchema ){
906     cQuote = quoteChar(zSchema);
907     if( cQuote && sqlite3_stricmp(zSchema,"temp")==0 ) cQuote = 0;
908     appendText(&s, zSchema, cQuote);
909     appendText(&s, ".", 0);
910   }
911   cQuote = quoteChar(zName);
912   appendText(&s, zName, cQuote);
913   while( sqlite3_step(pStmt)==SQLITE_ROW ){
914     const char *zCol = (const char*)sqlite3_column_text(pStmt, 1);
915     nRow++;
916     appendText(&s, zDiv, 0);
917     zDiv = ",";
918     if( zCol==0 ) zCol = "";
919     cQuote = quoteChar(zCol);
920     appendText(&s, zCol, cQuote);
921   }
922   appendText(&s, ")", 0);
923   sqlite3_finalize(pStmt);
924   if( nRow==0 ){
925     freeText(&s);
926     s.z = 0;
927   }
928   return s.z;
929 }
930 
931 /*
932 ** SQL function:  shell_module_schema(X)
933 **
934 ** Return a fake schema for the table-valued function or eponymous virtual
935 ** table X.
936 */
937 static void shellModuleSchema(
938   sqlite3_context *pCtx,
939   int nVal,
940   sqlite3_value **apVal
941 ){
942   const char *zName;
943   char *zFake;
944   UNUSED_PARAMETER(nVal);
945   zName = (const char*)sqlite3_value_text(apVal[0]);
946   zFake = zName ? shellFakeSchema(sqlite3_context_db_handle(pCtx), 0, zName) : 0;
947   if( zFake ){
948     sqlite3_result_text(pCtx, sqlite3_mprintf("/* %s */", zFake),
949                         -1, sqlite3_free);
950     free(zFake);
951   }
952 }
953 
954 /*
955 ** SQL function:  shell_add_schema(S,X)
956 **
957 ** Add the schema name X to the CREATE statement in S and return the result.
958 ** Examples:
959 **
960 **    CREATE TABLE t1(x)   ->   CREATE TABLE xyz.t1(x);
961 **
962 ** Also works on
963 **
964 **    CREATE INDEX
965 **    CREATE UNIQUE INDEX
966 **    CREATE VIEW
967 **    CREATE TRIGGER
968 **    CREATE VIRTUAL TABLE
969 **
970 ** This UDF is used by the .schema command to insert the schema name of
971 ** attached databases into the middle of the sqlite_schema.sql field.
972 */
973 static void shellAddSchemaName(
974   sqlite3_context *pCtx,
975   int nVal,
976   sqlite3_value **apVal
977 ){
978   static const char *aPrefix[] = {
979      "TABLE",
980      "INDEX",
981      "UNIQUE INDEX",
982      "VIEW",
983      "TRIGGER",
984      "VIRTUAL TABLE"
985   };
986   int i = 0;
987   const char *zIn = (const char*)sqlite3_value_text(apVal[0]);
988   const char *zSchema = (const char*)sqlite3_value_text(apVal[1]);
989   const char *zName = (const char*)sqlite3_value_text(apVal[2]);
990   sqlite3 *db = sqlite3_context_db_handle(pCtx);
991   UNUSED_PARAMETER(nVal);
992   if( zIn!=0 && strncmp(zIn, "CREATE ", 7)==0 ){
993     for(i=0; i<ArraySize(aPrefix); i++){
994       int n = strlen30(aPrefix[i]);
995       if( strncmp(zIn+7, aPrefix[i], n)==0 && zIn[n+7]==' ' ){
996         char *z = 0;
997         char *zFake = 0;
998         if( zSchema ){
999           char cQuote = quoteChar(zSchema);
1000           if( cQuote && sqlite3_stricmp(zSchema,"temp")!=0 ){
1001             z = sqlite3_mprintf("%.*s \"%w\".%s", n+7, zIn, zSchema, zIn+n+8);
1002           }else{
1003             z = sqlite3_mprintf("%.*s %s.%s", n+7, zIn, zSchema, zIn+n+8);
1004           }
1005         }
1006         if( zName
1007          && aPrefix[i][0]=='V'
1008          && (zFake = shellFakeSchema(db, zSchema, zName))!=0
1009         ){
1010           if( z==0 ){
1011             z = sqlite3_mprintf("%s\n/* %s */", zIn, zFake);
1012           }else{
1013             z = sqlite3_mprintf("%z\n/* %s */", z, zFake);
1014           }
1015           free(zFake);
1016         }
1017         if( z ){
1018           sqlite3_result_text(pCtx, z, -1, sqlite3_free);
1019           return;
1020         }
1021       }
1022     }
1023   }
1024   sqlite3_result_value(pCtx, apVal[0]);
1025 }
1026 
1027 /*
1028 ** The source code for several run-time loadable extensions is inserted
1029 ** below by the ../tool/mkshellc.tcl script.  Before processing that included
1030 ** code, we need to override some macros to make the included program code
1031 ** work here in the middle of this regular program.
1032 */
1033 #define SQLITE_EXTENSION_INIT1
1034 #define SQLITE_EXTENSION_INIT2(X) (void)(X)
1035 
1036 #if defined(_WIN32) && defined(_MSC_VER)
1037 /************************* Begin test_windirent.h ******************/
1038 /*
1039 ** 2015 November 30
1040 **
1041 ** The author disclaims copyright to this source code.  In place of
1042 ** a legal notice, here is a blessing:
1043 **
1044 **    May you do good and not evil.
1045 **    May you find forgiveness for yourself and forgive others.
1046 **    May you share freely, never taking more than you give.
1047 **
1048 *************************************************************************
1049 ** This file contains declarations for most of the opendir() family of
1050 ** POSIX functions on Win32 using the MSVCRT.
1051 */
1052 
1053 #if defined(_WIN32) && defined(_MSC_VER) && !defined(SQLITE_WINDIRENT_H)
1054 #define SQLITE_WINDIRENT_H
1055 
1056 /*
1057 ** We need several data types from the Windows SDK header.
1058 */
1059 
1060 #ifndef WIN32_LEAN_AND_MEAN
1061 #define WIN32_LEAN_AND_MEAN
1062 #endif
1063 
1064 #include "windows.h"
1065 
1066 /*
1067 ** We need several support functions from the SQLite core.
1068 */
1069 
1070 /* #include "sqlite3.h" */
1071 
1072 /*
1073 ** We need several things from the ANSI and MSVCRT headers.
1074 */
1075 
1076 #include <stdio.h>
1077 #include <stdlib.h>
1078 #include <errno.h>
1079 #include <io.h>
1080 #include <limits.h>
1081 #include <sys/types.h>
1082 #include <sys/stat.h>
1083 
1084 /*
1085 ** We may need several defines that should have been in "sys/stat.h".
1086 */
1087 
1088 #ifndef S_ISREG
1089 #define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG)
1090 #endif
1091 
1092 #ifndef S_ISDIR
1093 #define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
1094 #endif
1095 
1096 #ifndef S_ISLNK
1097 #define S_ISLNK(mode) (0)
1098 #endif
1099 
1100 /*
1101 ** We may need to provide the "mode_t" type.
1102 */
1103 
1104 #ifndef MODE_T_DEFINED
1105   #define MODE_T_DEFINED
1106   typedef unsigned short mode_t;
1107 #endif
1108 
1109 /*
1110 ** We may need to provide the "ino_t" type.
1111 */
1112 
1113 #ifndef INO_T_DEFINED
1114   #define INO_T_DEFINED
1115   typedef unsigned short ino_t;
1116 #endif
1117 
1118 /*
1119 ** We need to define "NAME_MAX" if it was not present in "limits.h".
1120 */
1121 
1122 #ifndef NAME_MAX
1123 #  ifdef FILENAME_MAX
1124 #    define NAME_MAX (FILENAME_MAX)
1125 #  else
1126 #    define NAME_MAX (260)
1127 #  endif
1128 #endif
1129 
1130 /*
1131 ** We need to define "NULL_INTPTR_T" and "BAD_INTPTR_T".
1132 */
1133 
1134 #ifndef NULL_INTPTR_T
1135 #  define NULL_INTPTR_T ((intptr_t)(0))
1136 #endif
1137 
1138 #ifndef BAD_INTPTR_T
1139 #  define BAD_INTPTR_T ((intptr_t)(-1))
1140 #endif
1141 
1142 /*
1143 ** We need to provide the necessary structures and related types.
1144 */
1145 
1146 #ifndef DIRENT_DEFINED
1147 #define DIRENT_DEFINED
1148 typedef struct DIRENT DIRENT;
1149 typedef DIRENT *LPDIRENT;
1150 struct DIRENT {
1151   ino_t d_ino;               /* Sequence number, do not use. */
1152   unsigned d_attributes;     /* Win32 file attributes. */
1153   char d_name[NAME_MAX + 1]; /* Name within the directory. */
1154 };
1155 #endif
1156 
1157 #ifndef DIR_DEFINED
1158 #define DIR_DEFINED
1159 typedef struct DIR DIR;
1160 typedef DIR *LPDIR;
1161 struct DIR {
1162   intptr_t d_handle; /* Value returned by "_findfirst". */
1163   DIRENT d_first;    /* DIRENT constructed based on "_findfirst". */
1164   DIRENT d_next;     /* DIRENT constructed based on "_findnext". */
1165 };
1166 #endif
1167 
1168 /*
1169 ** Provide a macro, for use by the implementation, to determine if a
1170 ** particular directory entry should be skipped over when searching for
1171 ** the next directory entry that should be returned by the readdir() or
1172 ** readdir_r() functions.
1173 */
1174 
1175 #ifndef is_filtered
1176 #  define is_filtered(a) ((((a).attrib)&_A_HIDDEN) || (((a).attrib)&_A_SYSTEM))
1177 #endif
1178 
1179 /*
1180 ** Provide the function prototype for the POSIX compatiable getenv()
1181 ** function.  This function is not thread-safe.
1182 */
1183 
1184 extern const char *windirent_getenv(const char *name);
1185 
1186 /*
1187 ** Finally, we can provide the function prototypes for the opendir(),
1188 ** readdir(), readdir_r(), and closedir() POSIX functions.
1189 */
1190 
1191 extern LPDIR opendir(const char *dirname);
1192 extern LPDIRENT readdir(LPDIR dirp);
1193 extern INT readdir_r(LPDIR dirp, LPDIRENT entry, LPDIRENT *result);
1194 extern INT closedir(LPDIR dirp);
1195 
1196 #endif /* defined(WIN32) && defined(_MSC_VER) */
1197 
1198 /************************* End test_windirent.h ********************/
1199 /************************* Begin test_windirent.c ******************/
1200 /*
1201 ** 2015 November 30
1202 **
1203 ** The author disclaims copyright to this source code.  In place of
1204 ** a legal notice, here is a blessing:
1205 **
1206 **    May you do good and not evil.
1207 **    May you find forgiveness for yourself and forgive others.
1208 **    May you share freely, never taking more than you give.
1209 **
1210 *************************************************************************
1211 ** This file contains code to implement most of the opendir() family of
1212 ** POSIX functions on Win32 using the MSVCRT.
1213 */
1214 
1215 #if defined(_WIN32) && defined(_MSC_VER)
1216 /* #include "test_windirent.h" */
1217 
1218 /*
1219 ** Implementation of the POSIX getenv() function using the Win32 API.
1220 ** This function is not thread-safe.
1221 */
1222 const char *windirent_getenv(
1223   const char *name
1224 ){
1225   static char value[32768]; /* Maximum length, per MSDN */
1226   DWORD dwSize = sizeof(value) / sizeof(char); /* Size in chars */
1227   DWORD dwRet; /* Value returned by GetEnvironmentVariableA() */
1228 
1229   memset(value, 0, sizeof(value));
1230   dwRet = GetEnvironmentVariableA(name, value, dwSize);
1231   if( dwRet==0 || dwRet>dwSize ){
1232     /*
1233     ** The function call to GetEnvironmentVariableA() failed -OR-
1234     ** the buffer is not large enough.  Either way, return NULL.
1235     */
1236     return 0;
1237   }else{
1238     /*
1239     ** The function call to GetEnvironmentVariableA() succeeded
1240     ** -AND- the buffer contains the entire value.
1241     */
1242     return value;
1243   }
1244 }
1245 
1246 /*
1247 ** Implementation of the POSIX opendir() function using the MSVCRT.
1248 */
1249 LPDIR opendir(
1250   const char *dirname
1251 ){
1252   struct _finddata_t data;
1253   LPDIR dirp = (LPDIR)sqlite3_malloc(sizeof(DIR));
1254   SIZE_T namesize = sizeof(data.name) / sizeof(data.name[0]);
1255 
1256   if( dirp==NULL ) return NULL;
1257   memset(dirp, 0, sizeof(DIR));
1258 
1259   /* TODO: Remove this if Unix-style root paths are not used. */
1260   if( sqlite3_stricmp(dirname, "/")==0 ){
1261     dirname = windirent_getenv("SystemDrive");
1262   }
1263 
1264   memset(&data, 0, sizeof(struct _finddata_t));
1265   _snprintf(data.name, namesize, "%s\\*", dirname);
1266   dirp->d_handle = _findfirst(data.name, &data);
1267 
1268   if( dirp->d_handle==BAD_INTPTR_T ){
1269     closedir(dirp);
1270     return NULL;
1271   }
1272 
1273   /* TODO: Remove this block to allow hidden and/or system files. */
1274   if( is_filtered(data) ){
1275 next:
1276 
1277     memset(&data, 0, sizeof(struct _finddata_t));
1278     if( _findnext(dirp->d_handle, &data)==-1 ){
1279       closedir(dirp);
1280       return NULL;
1281     }
1282 
1283     /* TODO: Remove this block to allow hidden and/or system files. */
1284     if( is_filtered(data) ) goto next;
1285   }
1286 
1287   dirp->d_first.d_attributes = data.attrib;
1288   strncpy(dirp->d_first.d_name, data.name, NAME_MAX);
1289   dirp->d_first.d_name[NAME_MAX] = '\0';
1290 
1291   return dirp;
1292 }
1293 
1294 /*
1295 ** Implementation of the POSIX readdir() function using the MSVCRT.
1296 */
1297 LPDIRENT readdir(
1298   LPDIR dirp
1299 ){
1300   struct _finddata_t data;
1301 
1302   if( dirp==NULL ) return NULL;
1303 
1304   if( dirp->d_first.d_ino==0 ){
1305     dirp->d_first.d_ino++;
1306     dirp->d_next.d_ino++;
1307 
1308     return &dirp->d_first;
1309   }
1310 
1311 next:
1312 
1313   memset(&data, 0, sizeof(struct _finddata_t));
1314   if( _findnext(dirp->d_handle, &data)==-1 ) return NULL;
1315 
1316   /* TODO: Remove this block to allow hidden and/or system files. */
1317   if( is_filtered(data) ) goto next;
1318 
1319   dirp->d_next.d_ino++;
1320   dirp->d_next.d_attributes = data.attrib;
1321   strncpy(dirp->d_next.d_name, data.name, NAME_MAX);
1322   dirp->d_next.d_name[NAME_MAX] = '\0';
1323 
1324   return &dirp->d_next;
1325 }
1326 
1327 /*
1328 ** Implementation of the POSIX readdir_r() function using the MSVCRT.
1329 */
1330 INT readdir_r(
1331   LPDIR dirp,
1332   LPDIRENT entry,
1333   LPDIRENT *result
1334 ){
1335   struct _finddata_t data;
1336 
1337   if( dirp==NULL ) return EBADF;
1338 
1339   if( dirp->d_first.d_ino==0 ){
1340     dirp->d_first.d_ino++;
1341     dirp->d_next.d_ino++;
1342 
1343     entry->d_ino = dirp->d_first.d_ino;
1344     entry->d_attributes = dirp->d_first.d_attributes;
1345     strncpy(entry->d_name, dirp->d_first.d_name, NAME_MAX);
1346     entry->d_name[NAME_MAX] = '\0';
1347 
1348     *result = entry;
1349     return 0;
1350   }
1351 
1352 next:
1353 
1354   memset(&data, 0, sizeof(struct _finddata_t));
1355   if( _findnext(dirp->d_handle, &data)==-1 ){
1356     *result = NULL;
1357     return ENOENT;
1358   }
1359 
1360   /* TODO: Remove this block to allow hidden and/or system files. */
1361   if( is_filtered(data) ) goto next;
1362 
1363   entry->d_ino = (ino_t)-1; /* not available */
1364   entry->d_attributes = data.attrib;
1365   strncpy(entry->d_name, data.name, NAME_MAX);
1366   entry->d_name[NAME_MAX] = '\0';
1367 
1368   *result = entry;
1369   return 0;
1370 }
1371 
1372 /*
1373 ** Implementation of the POSIX closedir() function using the MSVCRT.
1374 */
1375 INT closedir(
1376   LPDIR dirp
1377 ){
1378   INT result = 0;
1379 
1380   if( dirp==NULL ) return EINVAL;
1381 
1382   if( dirp->d_handle!=NULL_INTPTR_T && dirp->d_handle!=BAD_INTPTR_T ){
1383     result = _findclose(dirp->d_handle);
1384   }
1385 
1386   sqlite3_free(dirp);
1387   return result;
1388 }
1389 
1390 #endif /* defined(WIN32) && defined(_MSC_VER) */
1391 
1392 /************************* End test_windirent.c ********************/
1393 #define dirent DIRENT
1394 #endif
1395 /************************* Begin ../ext/misc/memtrace.c ******************/
1396 /*
1397 ** 2019-01-21
1398 **
1399 ** The author disclaims copyright to this source code.  In place of
1400 ** a legal notice, here is a blessing:
1401 **
1402 **    May you do good and not evil.
1403 **    May you find forgiveness for yourself and forgive others.
1404 **    May you share freely, never taking more than you give.
1405 **
1406 *************************************************************************
1407 **
1408 ** This file implements an extension that uses the SQLITE_CONFIG_MALLOC
1409 ** mechanism to add a tracing layer on top of SQLite.  If this extension
1410 ** is registered prior to sqlite3_initialize(), it will cause all memory
1411 ** allocation activities to be logged on standard output, or to some other
1412 ** FILE specified by the initializer.
1413 **
1414 ** This file needs to be compiled into the application that uses it.
1415 **
1416 ** This extension is used to implement the --memtrace option of the
1417 ** command-line shell.
1418 */
1419 #include <assert.h>
1420 #include <string.h>
1421 #include <stdio.h>
1422 
1423 /* The original memory allocation routines */
1424 static sqlite3_mem_methods memtraceBase;
1425 static FILE *memtraceOut;
1426 
1427 /* Methods that trace memory allocations */
1428 static void *memtraceMalloc(int n){
1429   if( memtraceOut ){
1430     fprintf(memtraceOut, "MEMTRACE: allocate %d bytes\n",
1431             memtraceBase.xRoundup(n));
1432   }
1433   return memtraceBase.xMalloc(n);
1434 }
1435 static void memtraceFree(void *p){
1436   if( p==0 ) return;
1437   if( memtraceOut ){
1438     fprintf(memtraceOut, "MEMTRACE: free %d bytes\n", memtraceBase.xSize(p));
1439   }
1440   memtraceBase.xFree(p);
1441 }
1442 static void *memtraceRealloc(void *p, int n){
1443   if( p==0 ) return memtraceMalloc(n);
1444   if( n==0 ){
1445     memtraceFree(p);
1446     return 0;
1447   }
1448   if( memtraceOut ){
1449     fprintf(memtraceOut, "MEMTRACE: resize %d -> %d bytes\n",
1450             memtraceBase.xSize(p), memtraceBase.xRoundup(n));
1451   }
1452   return memtraceBase.xRealloc(p, n);
1453 }
1454 static int memtraceSize(void *p){
1455   return memtraceBase.xSize(p);
1456 }
1457 static int memtraceRoundup(int n){
1458   return memtraceBase.xRoundup(n);
1459 }
1460 static int memtraceInit(void *p){
1461   return memtraceBase.xInit(p);
1462 }
1463 static void memtraceShutdown(void *p){
1464   memtraceBase.xShutdown(p);
1465 }
1466 
1467 /* The substitute memory allocator */
1468 static sqlite3_mem_methods ersaztMethods = {
1469   memtraceMalloc,
1470   memtraceFree,
1471   memtraceRealloc,
1472   memtraceSize,
1473   memtraceRoundup,
1474   memtraceInit,
1475   memtraceShutdown,
1476   0
1477 };
1478 
1479 /* Begin tracing memory allocations to out. */
1480 int sqlite3MemTraceActivate(FILE *out){
1481   int rc = SQLITE_OK;
1482   if( memtraceBase.xMalloc==0 ){
1483     rc = sqlite3_config(SQLITE_CONFIG_GETMALLOC, &memtraceBase);
1484     if( rc==SQLITE_OK ){
1485       rc = sqlite3_config(SQLITE_CONFIG_MALLOC, &ersaztMethods);
1486     }
1487   }
1488   memtraceOut = out;
1489   return rc;
1490 }
1491 
1492 /* Deactivate memory tracing */
1493 int sqlite3MemTraceDeactivate(void){
1494   int rc = SQLITE_OK;
1495   if( memtraceBase.xMalloc!=0 ){
1496     rc = sqlite3_config(SQLITE_CONFIG_MALLOC, &memtraceBase);
1497     if( rc==SQLITE_OK ){
1498       memset(&memtraceBase, 0, sizeof(memtraceBase));
1499     }
1500   }
1501   memtraceOut = 0;
1502   return rc;
1503 }
1504 
1505 /************************* End ../ext/misc/memtrace.c ********************/
1506 /************************* Begin ../ext/misc/shathree.c ******************/
1507 /*
1508 ** 2017-03-08
1509 **
1510 ** The author disclaims copyright to this source code.  In place of
1511 ** a legal notice, here is a blessing:
1512 **
1513 **    May you do good and not evil.
1514 **    May you find forgiveness for yourself and forgive others.
1515 **    May you share freely, never taking more than you give.
1516 **
1517 ******************************************************************************
1518 **
1519 ** This SQLite extension implements functions that compute SHA3 hashes.
1520 ** Two SQL functions are implemented:
1521 **
1522 **     sha3(X,SIZE)
1523 **     sha3_query(Y,SIZE)
1524 **
1525 ** The sha3(X) function computes the SHA3 hash of the input X, or NULL if
1526 ** X is NULL.
1527 **
1528 ** The sha3_query(Y) function evaluates all queries in the SQL statements of Y
1529 ** and returns a hash of their results.
1530 **
1531 ** The SIZE argument is optional.  If omitted, the SHA3-256 hash algorithm
1532 ** is used.  If SIZE is included it must be one of the integers 224, 256,
1533 ** 384, or 512, to determine SHA3 hash variant that is computed.
1534 */
1535 /* #include "sqlite3ext.h" */
1536 SQLITE_EXTENSION_INIT1
1537 #include <assert.h>
1538 #include <string.h>
1539 #include <stdarg.h>
1540 
1541 #ifndef SQLITE_AMALGAMATION
1542 /* typedef sqlite3_uint64 u64; */
1543 #endif /* SQLITE_AMALGAMATION */
1544 
1545 /******************************************************************************
1546 ** The Hash Engine
1547 */
1548 /*
1549 ** Macros to determine whether the machine is big or little endian,
1550 ** and whether or not that determination is run-time or compile-time.
1551 **
1552 ** For best performance, an attempt is made to guess at the byte-order
1553 ** using C-preprocessor macros.  If that is unsuccessful, or if
1554 ** -DSHA3_BYTEORDER=0 is set, then byte-order is determined
1555 ** at run-time.
1556 */
1557 #ifndef SHA3_BYTEORDER
1558 # if defined(i386)     || defined(__i386__)   || defined(_M_IX86) ||    \
1559      defined(__x86_64) || defined(__x86_64__) || defined(_M_X64)  ||    \
1560      defined(_M_AMD64) || defined(_M_ARM)     || defined(__x86)   ||    \
1561      defined(__arm__)
1562 #   define SHA3_BYTEORDER    1234
1563 # elif defined(sparc)    || defined(__ppc__)
1564 #   define SHA3_BYTEORDER    4321
1565 # else
1566 #   define SHA3_BYTEORDER 0
1567 # endif
1568 #endif
1569 
1570 
1571 /*
1572 ** State structure for a SHA3 hash in progress
1573 */
1574 typedef struct SHA3Context SHA3Context;
1575 struct SHA3Context {
1576   union {
1577     u64 s[25];                /* Keccak state. 5x5 lines of 64 bits each */
1578     unsigned char x[1600];    /* ... or 1600 bytes */
1579   } u;
1580   unsigned nRate;        /* Bytes of input accepted per Keccak iteration */
1581   unsigned nLoaded;      /* Input bytes loaded into u.x[] so far this cycle */
1582   unsigned ixMask;       /* Insert next input into u.x[nLoaded^ixMask]. */
1583 };
1584 
1585 /*
1586 ** A single step of the Keccak mixing function for a 1600-bit state
1587 */
1588 static void KeccakF1600Step(SHA3Context *p){
1589   int i;
1590   u64 b0, b1, b2, b3, b4;
1591   u64 c0, c1, c2, c3, c4;
1592   u64 d0, d1, d2, d3, d4;
1593   static const u64 RC[] = {
1594     0x0000000000000001ULL,  0x0000000000008082ULL,
1595     0x800000000000808aULL,  0x8000000080008000ULL,
1596     0x000000000000808bULL,  0x0000000080000001ULL,
1597     0x8000000080008081ULL,  0x8000000000008009ULL,
1598     0x000000000000008aULL,  0x0000000000000088ULL,
1599     0x0000000080008009ULL,  0x000000008000000aULL,
1600     0x000000008000808bULL,  0x800000000000008bULL,
1601     0x8000000000008089ULL,  0x8000000000008003ULL,
1602     0x8000000000008002ULL,  0x8000000000000080ULL,
1603     0x000000000000800aULL,  0x800000008000000aULL,
1604     0x8000000080008081ULL,  0x8000000000008080ULL,
1605     0x0000000080000001ULL,  0x8000000080008008ULL
1606   };
1607 # define a00 (p->u.s[0])
1608 # define a01 (p->u.s[1])
1609 # define a02 (p->u.s[2])
1610 # define a03 (p->u.s[3])
1611 # define a04 (p->u.s[4])
1612 # define a10 (p->u.s[5])
1613 # define a11 (p->u.s[6])
1614 # define a12 (p->u.s[7])
1615 # define a13 (p->u.s[8])
1616 # define a14 (p->u.s[9])
1617 # define a20 (p->u.s[10])
1618 # define a21 (p->u.s[11])
1619 # define a22 (p->u.s[12])
1620 # define a23 (p->u.s[13])
1621 # define a24 (p->u.s[14])
1622 # define a30 (p->u.s[15])
1623 # define a31 (p->u.s[16])
1624 # define a32 (p->u.s[17])
1625 # define a33 (p->u.s[18])
1626 # define a34 (p->u.s[19])
1627 # define a40 (p->u.s[20])
1628 # define a41 (p->u.s[21])
1629 # define a42 (p->u.s[22])
1630 # define a43 (p->u.s[23])
1631 # define a44 (p->u.s[24])
1632 # define ROL64(a,x) ((a<<x)|(a>>(64-x)))
1633 
1634   for(i=0; i<24; i+=4){
1635     c0 = a00^a10^a20^a30^a40;
1636     c1 = a01^a11^a21^a31^a41;
1637     c2 = a02^a12^a22^a32^a42;
1638     c3 = a03^a13^a23^a33^a43;
1639     c4 = a04^a14^a24^a34^a44;
1640     d0 = c4^ROL64(c1, 1);
1641     d1 = c0^ROL64(c2, 1);
1642     d2 = c1^ROL64(c3, 1);
1643     d3 = c2^ROL64(c4, 1);
1644     d4 = c3^ROL64(c0, 1);
1645 
1646     b0 = (a00^d0);
1647     b1 = ROL64((a11^d1), 44);
1648     b2 = ROL64((a22^d2), 43);
1649     b3 = ROL64((a33^d3), 21);
1650     b4 = ROL64((a44^d4), 14);
1651     a00 =   b0 ^((~b1)&  b2 );
1652     a00 ^= RC[i];
1653     a11 =   b1 ^((~b2)&  b3 );
1654     a22 =   b2 ^((~b3)&  b4 );
1655     a33 =   b3 ^((~b4)&  b0 );
1656     a44 =   b4 ^((~b0)&  b1 );
1657 
1658     b2 = ROL64((a20^d0), 3);
1659     b3 = ROL64((a31^d1), 45);
1660     b4 = ROL64((a42^d2), 61);
1661     b0 = ROL64((a03^d3), 28);
1662     b1 = ROL64((a14^d4), 20);
1663     a20 =   b0 ^((~b1)&  b2 );
1664     a31 =   b1 ^((~b2)&  b3 );
1665     a42 =   b2 ^((~b3)&  b4 );
1666     a03 =   b3 ^((~b4)&  b0 );
1667     a14 =   b4 ^((~b0)&  b1 );
1668 
1669     b4 = ROL64((a40^d0), 18);
1670     b0 = ROL64((a01^d1), 1);
1671     b1 = ROL64((a12^d2), 6);
1672     b2 = ROL64((a23^d3), 25);
1673     b3 = ROL64((a34^d4), 8);
1674     a40 =   b0 ^((~b1)&  b2 );
1675     a01 =   b1 ^((~b2)&  b3 );
1676     a12 =   b2 ^((~b3)&  b4 );
1677     a23 =   b3 ^((~b4)&  b0 );
1678     a34 =   b4 ^((~b0)&  b1 );
1679 
1680     b1 = ROL64((a10^d0), 36);
1681     b2 = ROL64((a21^d1), 10);
1682     b3 = ROL64((a32^d2), 15);
1683     b4 = ROL64((a43^d3), 56);
1684     b0 = ROL64((a04^d4), 27);
1685     a10 =   b0 ^((~b1)&  b2 );
1686     a21 =   b1 ^((~b2)&  b3 );
1687     a32 =   b2 ^((~b3)&  b4 );
1688     a43 =   b3 ^((~b4)&  b0 );
1689     a04 =   b4 ^((~b0)&  b1 );
1690 
1691     b3 = ROL64((a30^d0), 41);
1692     b4 = ROL64((a41^d1), 2);
1693     b0 = ROL64((a02^d2), 62);
1694     b1 = ROL64((a13^d3), 55);
1695     b2 = ROL64((a24^d4), 39);
1696     a30 =   b0 ^((~b1)&  b2 );
1697     a41 =   b1 ^((~b2)&  b3 );
1698     a02 =   b2 ^((~b3)&  b4 );
1699     a13 =   b3 ^((~b4)&  b0 );
1700     a24 =   b4 ^((~b0)&  b1 );
1701 
1702     c0 = a00^a20^a40^a10^a30;
1703     c1 = a11^a31^a01^a21^a41;
1704     c2 = a22^a42^a12^a32^a02;
1705     c3 = a33^a03^a23^a43^a13;
1706     c4 = a44^a14^a34^a04^a24;
1707     d0 = c4^ROL64(c1, 1);
1708     d1 = c0^ROL64(c2, 1);
1709     d2 = c1^ROL64(c3, 1);
1710     d3 = c2^ROL64(c4, 1);
1711     d4 = c3^ROL64(c0, 1);
1712 
1713     b0 = (a00^d0);
1714     b1 = ROL64((a31^d1), 44);
1715     b2 = ROL64((a12^d2), 43);
1716     b3 = ROL64((a43^d3), 21);
1717     b4 = ROL64((a24^d4), 14);
1718     a00 =   b0 ^((~b1)&  b2 );
1719     a00 ^= RC[i+1];
1720     a31 =   b1 ^((~b2)&  b3 );
1721     a12 =   b2 ^((~b3)&  b4 );
1722     a43 =   b3 ^((~b4)&  b0 );
1723     a24 =   b4 ^((~b0)&  b1 );
1724 
1725     b2 = ROL64((a40^d0), 3);
1726     b3 = ROL64((a21^d1), 45);
1727     b4 = ROL64((a02^d2), 61);
1728     b0 = ROL64((a33^d3), 28);
1729     b1 = ROL64((a14^d4), 20);
1730     a40 =   b0 ^((~b1)&  b2 );
1731     a21 =   b1 ^((~b2)&  b3 );
1732     a02 =   b2 ^((~b3)&  b4 );
1733     a33 =   b3 ^((~b4)&  b0 );
1734     a14 =   b4 ^((~b0)&  b1 );
1735 
1736     b4 = ROL64((a30^d0), 18);
1737     b0 = ROL64((a11^d1), 1);
1738     b1 = ROL64((a42^d2), 6);
1739     b2 = ROL64((a23^d3), 25);
1740     b3 = ROL64((a04^d4), 8);
1741     a30 =   b0 ^((~b1)&  b2 );
1742     a11 =   b1 ^((~b2)&  b3 );
1743     a42 =   b2 ^((~b3)&  b4 );
1744     a23 =   b3 ^((~b4)&  b0 );
1745     a04 =   b4 ^((~b0)&  b1 );
1746 
1747     b1 = ROL64((a20^d0), 36);
1748     b2 = ROL64((a01^d1), 10);
1749     b3 = ROL64((a32^d2), 15);
1750     b4 = ROL64((a13^d3), 56);
1751     b0 = ROL64((a44^d4), 27);
1752     a20 =   b0 ^((~b1)&  b2 );
1753     a01 =   b1 ^((~b2)&  b3 );
1754     a32 =   b2 ^((~b3)&  b4 );
1755     a13 =   b3 ^((~b4)&  b0 );
1756     a44 =   b4 ^((~b0)&  b1 );
1757 
1758     b3 = ROL64((a10^d0), 41);
1759     b4 = ROL64((a41^d1), 2);
1760     b0 = ROL64((a22^d2), 62);
1761     b1 = ROL64((a03^d3), 55);
1762     b2 = ROL64((a34^d4), 39);
1763     a10 =   b0 ^((~b1)&  b2 );
1764     a41 =   b1 ^((~b2)&  b3 );
1765     a22 =   b2 ^((~b3)&  b4 );
1766     a03 =   b3 ^((~b4)&  b0 );
1767     a34 =   b4 ^((~b0)&  b1 );
1768 
1769     c0 = a00^a40^a30^a20^a10;
1770     c1 = a31^a21^a11^a01^a41;
1771     c2 = a12^a02^a42^a32^a22;
1772     c3 = a43^a33^a23^a13^a03;
1773     c4 = a24^a14^a04^a44^a34;
1774     d0 = c4^ROL64(c1, 1);
1775     d1 = c0^ROL64(c2, 1);
1776     d2 = c1^ROL64(c3, 1);
1777     d3 = c2^ROL64(c4, 1);
1778     d4 = c3^ROL64(c0, 1);
1779 
1780     b0 = (a00^d0);
1781     b1 = ROL64((a21^d1), 44);
1782     b2 = ROL64((a42^d2), 43);
1783     b3 = ROL64((a13^d3), 21);
1784     b4 = ROL64((a34^d4), 14);
1785     a00 =   b0 ^((~b1)&  b2 );
1786     a00 ^= RC[i+2];
1787     a21 =   b1 ^((~b2)&  b3 );
1788     a42 =   b2 ^((~b3)&  b4 );
1789     a13 =   b3 ^((~b4)&  b0 );
1790     a34 =   b4 ^((~b0)&  b1 );
1791 
1792     b2 = ROL64((a30^d0), 3);
1793     b3 = ROL64((a01^d1), 45);
1794     b4 = ROL64((a22^d2), 61);
1795     b0 = ROL64((a43^d3), 28);
1796     b1 = ROL64((a14^d4), 20);
1797     a30 =   b0 ^((~b1)&  b2 );
1798     a01 =   b1 ^((~b2)&  b3 );
1799     a22 =   b2 ^((~b3)&  b4 );
1800     a43 =   b3 ^((~b4)&  b0 );
1801     a14 =   b4 ^((~b0)&  b1 );
1802 
1803     b4 = ROL64((a10^d0), 18);
1804     b0 = ROL64((a31^d1), 1);
1805     b1 = ROL64((a02^d2), 6);
1806     b2 = ROL64((a23^d3), 25);
1807     b3 = ROL64((a44^d4), 8);
1808     a10 =   b0 ^((~b1)&  b2 );
1809     a31 =   b1 ^((~b2)&  b3 );
1810     a02 =   b2 ^((~b3)&  b4 );
1811     a23 =   b3 ^((~b4)&  b0 );
1812     a44 =   b4 ^((~b0)&  b1 );
1813 
1814     b1 = ROL64((a40^d0), 36);
1815     b2 = ROL64((a11^d1), 10);
1816     b3 = ROL64((a32^d2), 15);
1817     b4 = ROL64((a03^d3), 56);
1818     b0 = ROL64((a24^d4), 27);
1819     a40 =   b0 ^((~b1)&  b2 );
1820     a11 =   b1 ^((~b2)&  b3 );
1821     a32 =   b2 ^((~b3)&  b4 );
1822     a03 =   b3 ^((~b4)&  b0 );
1823     a24 =   b4 ^((~b0)&  b1 );
1824 
1825     b3 = ROL64((a20^d0), 41);
1826     b4 = ROL64((a41^d1), 2);
1827     b0 = ROL64((a12^d2), 62);
1828     b1 = ROL64((a33^d3), 55);
1829     b2 = ROL64((a04^d4), 39);
1830     a20 =   b0 ^((~b1)&  b2 );
1831     a41 =   b1 ^((~b2)&  b3 );
1832     a12 =   b2 ^((~b3)&  b4 );
1833     a33 =   b3 ^((~b4)&  b0 );
1834     a04 =   b4 ^((~b0)&  b1 );
1835 
1836     c0 = a00^a30^a10^a40^a20;
1837     c1 = a21^a01^a31^a11^a41;
1838     c2 = a42^a22^a02^a32^a12;
1839     c3 = a13^a43^a23^a03^a33;
1840     c4 = a34^a14^a44^a24^a04;
1841     d0 = c4^ROL64(c1, 1);
1842     d1 = c0^ROL64(c2, 1);
1843     d2 = c1^ROL64(c3, 1);
1844     d3 = c2^ROL64(c4, 1);
1845     d4 = c3^ROL64(c0, 1);
1846 
1847     b0 = (a00^d0);
1848     b1 = ROL64((a01^d1), 44);
1849     b2 = ROL64((a02^d2), 43);
1850     b3 = ROL64((a03^d3), 21);
1851     b4 = ROL64((a04^d4), 14);
1852     a00 =   b0 ^((~b1)&  b2 );
1853     a00 ^= RC[i+3];
1854     a01 =   b1 ^((~b2)&  b3 );
1855     a02 =   b2 ^((~b3)&  b4 );
1856     a03 =   b3 ^((~b4)&  b0 );
1857     a04 =   b4 ^((~b0)&  b1 );
1858 
1859     b2 = ROL64((a10^d0), 3);
1860     b3 = ROL64((a11^d1), 45);
1861     b4 = ROL64((a12^d2), 61);
1862     b0 = ROL64((a13^d3), 28);
1863     b1 = ROL64((a14^d4), 20);
1864     a10 =   b0 ^((~b1)&  b2 );
1865     a11 =   b1 ^((~b2)&  b3 );
1866     a12 =   b2 ^((~b3)&  b4 );
1867     a13 =   b3 ^((~b4)&  b0 );
1868     a14 =   b4 ^((~b0)&  b1 );
1869 
1870     b4 = ROL64((a20^d0), 18);
1871     b0 = ROL64((a21^d1), 1);
1872     b1 = ROL64((a22^d2), 6);
1873     b2 = ROL64((a23^d3), 25);
1874     b3 = ROL64((a24^d4), 8);
1875     a20 =   b0 ^((~b1)&  b2 );
1876     a21 =   b1 ^((~b2)&  b3 );
1877     a22 =   b2 ^((~b3)&  b4 );
1878     a23 =   b3 ^((~b4)&  b0 );
1879     a24 =   b4 ^((~b0)&  b1 );
1880 
1881     b1 = ROL64((a30^d0), 36);
1882     b2 = ROL64((a31^d1), 10);
1883     b3 = ROL64((a32^d2), 15);
1884     b4 = ROL64((a33^d3), 56);
1885     b0 = ROL64((a34^d4), 27);
1886     a30 =   b0 ^((~b1)&  b2 );
1887     a31 =   b1 ^((~b2)&  b3 );
1888     a32 =   b2 ^((~b3)&  b4 );
1889     a33 =   b3 ^((~b4)&  b0 );
1890     a34 =   b4 ^((~b0)&  b1 );
1891 
1892     b3 = ROL64((a40^d0), 41);
1893     b4 = ROL64((a41^d1), 2);
1894     b0 = ROL64((a42^d2), 62);
1895     b1 = ROL64((a43^d3), 55);
1896     b2 = ROL64((a44^d4), 39);
1897     a40 =   b0 ^((~b1)&  b2 );
1898     a41 =   b1 ^((~b2)&  b3 );
1899     a42 =   b2 ^((~b3)&  b4 );
1900     a43 =   b3 ^((~b4)&  b0 );
1901     a44 =   b4 ^((~b0)&  b1 );
1902   }
1903 }
1904 
1905 /*
1906 ** Initialize a new hash.  iSize determines the size of the hash
1907 ** in bits and should be one of 224, 256, 384, or 512.  Or iSize
1908 ** can be zero to use the default hash size of 256 bits.
1909 */
1910 static void SHA3Init(SHA3Context *p, int iSize){
1911   memset(p, 0, sizeof(*p));
1912   if( iSize>=128 && iSize<=512 ){
1913     p->nRate = (1600 - ((iSize + 31)&~31)*2)/8;
1914   }else{
1915     p->nRate = (1600 - 2*256)/8;
1916   }
1917 #if SHA3_BYTEORDER==1234
1918   /* Known to be little-endian at compile-time. No-op */
1919 #elif SHA3_BYTEORDER==4321
1920   p->ixMask = 7;  /* Big-endian */
1921 #else
1922   {
1923     static unsigned int one = 1;
1924     if( 1==*(unsigned char*)&one ){
1925       /* Little endian.  No byte swapping. */
1926       p->ixMask = 0;
1927     }else{
1928       /* Big endian.  Byte swap. */
1929       p->ixMask = 7;
1930     }
1931   }
1932 #endif
1933 }
1934 
1935 /*
1936 ** Make consecutive calls to the SHA3Update function to add new content
1937 ** to the hash
1938 */
1939 static void SHA3Update(
1940   SHA3Context *p,
1941   const unsigned char *aData,
1942   unsigned int nData
1943 ){
1944   unsigned int i = 0;
1945   if( aData==0 ) return;
1946 #if SHA3_BYTEORDER==1234
1947   if( (p->nLoaded % 8)==0 && ((aData - (const unsigned char*)0)&7)==0 ){
1948     for(; i+7<nData; i+=8){
1949       p->u.s[p->nLoaded/8] ^= *(u64*)&aData[i];
1950       p->nLoaded += 8;
1951       if( p->nLoaded>=p->nRate ){
1952         KeccakF1600Step(p);
1953         p->nLoaded = 0;
1954       }
1955     }
1956   }
1957 #endif
1958   for(; i<nData; i++){
1959 #if SHA3_BYTEORDER==1234
1960     p->u.x[p->nLoaded] ^= aData[i];
1961 #elif SHA3_BYTEORDER==4321
1962     p->u.x[p->nLoaded^0x07] ^= aData[i];
1963 #else
1964     p->u.x[p->nLoaded^p->ixMask] ^= aData[i];
1965 #endif
1966     p->nLoaded++;
1967     if( p->nLoaded==p->nRate ){
1968       KeccakF1600Step(p);
1969       p->nLoaded = 0;
1970     }
1971   }
1972 }
1973 
1974 /*
1975 ** After all content has been added, invoke SHA3Final() to compute
1976 ** the final hash.  The function returns a pointer to the binary
1977 ** hash value.
1978 */
1979 static unsigned char *SHA3Final(SHA3Context *p){
1980   unsigned int i;
1981   if( p->nLoaded==p->nRate-1 ){
1982     const unsigned char c1 = 0x86;
1983     SHA3Update(p, &c1, 1);
1984   }else{
1985     const unsigned char c2 = 0x06;
1986     const unsigned char c3 = 0x80;
1987     SHA3Update(p, &c2, 1);
1988     p->nLoaded = p->nRate - 1;
1989     SHA3Update(p, &c3, 1);
1990   }
1991   for(i=0; i<p->nRate; i++){
1992     p->u.x[i+p->nRate] = p->u.x[i^p->ixMask];
1993   }
1994   return &p->u.x[p->nRate];
1995 }
1996 /* End of the hashing logic
1997 *****************************************************************************/
1998 
1999 /*
2000 ** Implementation of the sha3(X,SIZE) function.
2001 **
2002 ** Return a BLOB which is the SIZE-bit SHA3 hash of X.  The default
2003 ** size is 256.  If X is a BLOB, it is hashed as is.
2004 ** For all other non-NULL types of input, X is converted into a UTF-8 string
2005 ** and the string is hashed without the trailing 0x00 terminator.  The hash
2006 ** of a NULL value is NULL.
2007 */
2008 static void sha3Func(
2009   sqlite3_context *context,
2010   int argc,
2011   sqlite3_value **argv
2012 ){
2013   SHA3Context cx;
2014   int eType = sqlite3_value_type(argv[0]);
2015   int nByte = sqlite3_value_bytes(argv[0]);
2016   int iSize;
2017   if( argc==1 ){
2018     iSize = 256;
2019   }else{
2020     iSize = sqlite3_value_int(argv[1]);
2021     if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){
2022       sqlite3_result_error(context, "SHA3 size should be one of: 224 256 "
2023                                     "384 512", -1);
2024       return;
2025     }
2026   }
2027   if( eType==SQLITE_NULL ) return;
2028   SHA3Init(&cx, iSize);
2029   if( eType==SQLITE_BLOB ){
2030     SHA3Update(&cx, sqlite3_value_blob(argv[0]), nByte);
2031   }else{
2032     SHA3Update(&cx, sqlite3_value_text(argv[0]), nByte);
2033   }
2034   sqlite3_result_blob(context, SHA3Final(&cx), iSize/8, SQLITE_TRANSIENT);
2035 }
2036 
2037 /* Compute a string using sqlite3_vsnprintf() with a maximum length
2038 ** of 50 bytes and add it to the hash.
2039 */
2040 static void hash_step_vformat(
2041   SHA3Context *p,                 /* Add content to this context */
2042   const char *zFormat,
2043   ...
2044 ){
2045   va_list ap;
2046   int n;
2047   char zBuf[50];
2048   va_start(ap, zFormat);
2049   sqlite3_vsnprintf(sizeof(zBuf),zBuf,zFormat,ap);
2050   va_end(ap);
2051   n = (int)strlen(zBuf);
2052   SHA3Update(p, (unsigned char*)zBuf, n);
2053 }
2054 
2055 /*
2056 ** Implementation of the sha3_query(SQL,SIZE) function.
2057 **
2058 ** This function compiles and runs the SQL statement(s) given in the
2059 ** argument. The results are hashed using a SIZE-bit SHA3.  The default
2060 ** size is 256.
2061 **
2062 ** The format of the byte stream that is hashed is summarized as follows:
2063 **
2064 **       S<n>:<sql>
2065 **       R
2066 **       N
2067 **       I<int>
2068 **       F<ieee-float>
2069 **       B<size>:<bytes>
2070 **       T<size>:<text>
2071 **
2072 ** <sql> is the original SQL text for each statement run and <n> is
2073 ** the size of that text.  The SQL text is UTF-8.  A single R character
2074 ** occurs before the start of each row.  N means a NULL value.
2075 ** I mean an 8-byte little-endian integer <int>.  F is a floating point
2076 ** number with an 8-byte little-endian IEEE floating point value <ieee-float>.
2077 ** B means blobs of <size> bytes.  T means text rendered as <size>
2078 ** bytes of UTF-8.  The <n> and <size> values are expressed as an ASCII
2079 ** text integers.
2080 **
2081 ** For each SQL statement in the X input, there is one S segment.  Each
2082 ** S segment is followed by zero or more R segments, one for each row in the
2083 ** result set.  After each R, there are one or more N, I, F, B, or T segments,
2084 ** one for each column in the result set.  Segments are concatentated directly
2085 ** with no delimiters of any kind.
2086 */
2087 static void sha3QueryFunc(
2088   sqlite3_context *context,
2089   int argc,
2090   sqlite3_value **argv
2091 ){
2092   sqlite3 *db = sqlite3_context_db_handle(context);
2093   const char *zSql = (const char*)sqlite3_value_text(argv[0]);
2094   sqlite3_stmt *pStmt = 0;
2095   int nCol;                   /* Number of columns in the result set */
2096   int i;                      /* Loop counter */
2097   int rc;
2098   int n;
2099   const char *z;
2100   SHA3Context cx;
2101   int iSize;
2102 
2103   if( argc==1 ){
2104     iSize = 256;
2105   }else{
2106     iSize = sqlite3_value_int(argv[1]);
2107     if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){
2108       sqlite3_result_error(context, "SHA3 size should be one of: 224 256 "
2109                                     "384 512", -1);
2110       return;
2111     }
2112   }
2113   if( zSql==0 ) return;
2114   SHA3Init(&cx, iSize);
2115   while( zSql[0] ){
2116     rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zSql);
2117     if( rc ){
2118       char *zMsg = sqlite3_mprintf("error SQL statement [%s]: %s",
2119                                    zSql, sqlite3_errmsg(db));
2120       sqlite3_finalize(pStmt);
2121       sqlite3_result_error(context, zMsg, -1);
2122       sqlite3_free(zMsg);
2123       return;
2124     }
2125     if( !sqlite3_stmt_readonly(pStmt) ){
2126       char *zMsg = sqlite3_mprintf("non-query: [%s]", sqlite3_sql(pStmt));
2127       sqlite3_finalize(pStmt);
2128       sqlite3_result_error(context, zMsg, -1);
2129       sqlite3_free(zMsg);
2130       return;
2131     }
2132     nCol = sqlite3_column_count(pStmt);
2133     z = sqlite3_sql(pStmt);
2134     if( z ){
2135       n = (int)strlen(z);
2136       hash_step_vformat(&cx,"S%d:",n);
2137       SHA3Update(&cx,(unsigned char*)z,n);
2138     }
2139 
2140     /* Compute a hash over the result of the query */
2141     while( SQLITE_ROW==sqlite3_step(pStmt) ){
2142       SHA3Update(&cx,(const unsigned char*)"R",1);
2143       for(i=0; i<nCol; i++){
2144         switch( sqlite3_column_type(pStmt,i) ){
2145           case SQLITE_NULL: {
2146             SHA3Update(&cx, (const unsigned char*)"N",1);
2147             break;
2148           }
2149           case SQLITE_INTEGER: {
2150             sqlite3_uint64 u;
2151             int j;
2152             unsigned char x[9];
2153             sqlite3_int64 v = sqlite3_column_int64(pStmt,i);
2154             memcpy(&u, &v, 8);
2155             for(j=8; j>=1; j--){
2156               x[j] = u & 0xff;
2157               u >>= 8;
2158             }
2159             x[0] = 'I';
2160             SHA3Update(&cx, x, 9);
2161             break;
2162           }
2163           case SQLITE_FLOAT: {
2164             sqlite3_uint64 u;
2165             int j;
2166             unsigned char x[9];
2167             double r = sqlite3_column_double(pStmt,i);
2168             memcpy(&u, &r, 8);
2169             for(j=8; j>=1; j--){
2170               x[j] = u & 0xff;
2171               u >>= 8;
2172             }
2173             x[0] = 'F';
2174             SHA3Update(&cx,x,9);
2175             break;
2176           }
2177           case SQLITE_TEXT: {
2178             int n2 = sqlite3_column_bytes(pStmt, i);
2179             const unsigned char *z2 = sqlite3_column_text(pStmt, i);
2180             hash_step_vformat(&cx,"T%d:",n2);
2181             SHA3Update(&cx, z2, n2);
2182             break;
2183           }
2184           case SQLITE_BLOB: {
2185             int n2 = sqlite3_column_bytes(pStmt, i);
2186             const unsigned char *z2 = sqlite3_column_blob(pStmt, i);
2187             hash_step_vformat(&cx,"B%d:",n2);
2188             SHA3Update(&cx, z2, n2);
2189             break;
2190           }
2191         }
2192       }
2193     }
2194     sqlite3_finalize(pStmt);
2195   }
2196   sqlite3_result_blob(context, SHA3Final(&cx), iSize/8, SQLITE_TRANSIENT);
2197 }
2198 
2199 
2200 #ifdef _WIN32
2201 
2202 #endif
2203 int sqlite3_shathree_init(
2204   sqlite3 *db,
2205   char **pzErrMsg,
2206   const sqlite3_api_routines *pApi
2207 ){
2208   int rc = SQLITE_OK;
2209   SQLITE_EXTENSION_INIT2(pApi);
2210   (void)pzErrMsg;  /* Unused parameter */
2211   rc = sqlite3_create_function(db, "sha3", 1,
2212                       SQLITE_UTF8 | SQLITE_INNOCUOUS | SQLITE_DETERMINISTIC,
2213                       0, sha3Func, 0, 0);
2214   if( rc==SQLITE_OK ){
2215     rc = sqlite3_create_function(db, "sha3", 2,
2216                       SQLITE_UTF8 | SQLITE_INNOCUOUS | SQLITE_DETERMINISTIC,
2217                       0, sha3Func, 0, 0);
2218   }
2219   if( rc==SQLITE_OK ){
2220     rc = sqlite3_create_function(db, "sha3_query", 1,
2221                       SQLITE_UTF8 | SQLITE_DIRECTONLY,
2222                       0, sha3QueryFunc, 0, 0);
2223   }
2224   if( rc==SQLITE_OK ){
2225     rc = sqlite3_create_function(db, "sha3_query", 2,
2226                       SQLITE_UTF8 | SQLITE_DIRECTONLY,
2227                       0, sha3QueryFunc, 0, 0);
2228   }
2229   return rc;
2230 }
2231 
2232 /************************* End ../ext/misc/shathree.c ********************/
2233 /************************* Begin ../ext/misc/uint.c ******************/
2234 /*
2235 ** 2020-04-14
2236 **
2237 ** The author disclaims copyright to this source code.  In place of
2238 ** a legal notice, here is a blessing:
2239 **
2240 **    May you do good and not evil.
2241 **    May you find forgiveness for yourself and forgive others.
2242 **    May you share freely, never taking more than you give.
2243 **
2244 ******************************************************************************
2245 **
2246 ** This SQLite extension implements the UINT collating sequence.
2247 **
2248 ** UINT works like BINARY for text, except that embedded strings
2249 ** of digits compare in numeric order.
2250 **
2251 **     *   Leading zeros are handled properly, in the sense that
2252 **         they do not mess of the maginitude comparison of embedded
2253 **         strings of digits.  "x00123y" is equal to "x123y".
2254 **
2255 **     *   Only unsigned integers are recognized.  Plus and minus
2256 **         signs are ignored.  Decimal points and exponential notation
2257 **         are ignored.
2258 **
2259 **     *   Embedded integers can be of arbitrary length.  Comparison
2260 **         is *not* limited integers that can be expressed as a
2261 **         64-bit machine integer.
2262 */
2263 /* #include "sqlite3ext.h" */
2264 SQLITE_EXTENSION_INIT1
2265 #include <assert.h>
2266 #include <string.h>
2267 #include <ctype.h>
2268 
2269 /*
2270 ** Compare text in lexicographic order, except strings of digits
2271 ** compare in numeric order.
2272 */
2273 static int uintCollFunc(
2274   void *notUsed,
2275   int nKey1, const void *pKey1,
2276   int nKey2, const void *pKey2
2277 ){
2278   const unsigned char *zA = (const unsigned char*)pKey1;
2279   const unsigned char *zB = (const unsigned char*)pKey2;
2280   int i=0, j=0, x;
2281   (void)notUsed;
2282   while( i<nKey1 && j<nKey2 ){
2283     x = zA[i] - zB[j];
2284     if( isdigit(zA[i]) ){
2285       int k;
2286       if( !isdigit(zB[j]) ) return x;
2287       while( i<nKey1 && zA[i]=='0' ){ i++; }
2288       while( j<nKey2 && zB[j]=='0' ){ j++; }
2289       k = 0;
2290       while( i+k<nKey1 && isdigit(zA[i+k])
2291              && j+k<nKey2 && isdigit(zB[j+k]) ){
2292         k++;
2293       }
2294       if( i+k<nKey1 && isdigit(zA[i+k]) ){
2295         return +1;
2296       }else if( j+k<nKey2 && isdigit(zB[j+k]) ){
2297         return -1;
2298       }else{
2299         x = memcmp(zA+i, zB+j, k);
2300         if( x ) return x;
2301         i += k;
2302         j += k;
2303       }
2304     }else if( x ){
2305       return x;
2306     }else{
2307       i++;
2308       j++;
2309     }
2310   }
2311   return (nKey1 - i) - (nKey2 - j);
2312 }
2313 
2314 #ifdef _WIN32
2315 
2316 #endif
2317 int sqlite3_uint_init(
2318   sqlite3 *db,
2319   char **pzErrMsg,
2320   const sqlite3_api_routines *pApi
2321 ){
2322   SQLITE_EXTENSION_INIT2(pApi);
2323   (void)pzErrMsg;  /* Unused parameter */
2324   return sqlite3_create_collation(db, "uint", SQLITE_UTF8, 0, uintCollFunc);
2325 }
2326 
2327 /************************* End ../ext/misc/uint.c ********************/
2328 /************************* Begin ../ext/misc/decimal.c ******************/
2329 /*
2330 ** 2020-06-22
2331 **
2332 ** The author disclaims copyright to this source code.  In place of
2333 ** a legal notice, here is a blessing:
2334 **
2335 **    May you do good and not evil.
2336 **    May you find forgiveness for yourself and forgive others.
2337 **    May you share freely, never taking more than you give.
2338 **
2339 ******************************************************************************
2340 **
2341 ** Routines to implement arbitrary-precision decimal math.
2342 **
2343 ** The focus here is on simplicity and correctness, not performance.
2344 */
2345 /* #include "sqlite3ext.h" */
2346 SQLITE_EXTENSION_INIT1
2347 #include <assert.h>
2348 #include <string.h>
2349 #include <ctype.h>
2350 #include <stdlib.h>
2351 
2352 /* Mark a function parameter as unused, to suppress nuisance compiler
2353 ** warnings. */
2354 #ifndef UNUSED_PARAMETER
2355 # define UNUSED_PARAMETER(X)  (void)(X)
2356 #endif
2357 
2358 
2359 /* A decimal object */
2360 typedef struct Decimal Decimal;
2361 struct Decimal {
2362   char sign;        /* 0 for positive, 1 for negative */
2363   char oom;         /* True if an OOM is encountered */
2364   char isNull;      /* True if holds a NULL rather than a number */
2365   char isInit;      /* True upon initialization */
2366   int nDigit;       /* Total number of digits */
2367   int nFrac;        /* Number of digits to the right of the decimal point */
2368   signed char *a;   /* Array of digits.  Most significant first. */
2369 };
2370 
2371 /*
2372 ** Release memory held by a Decimal, but do not free the object itself.
2373 */
2374 static void decimal_clear(Decimal *p){
2375   sqlite3_free(p->a);
2376 }
2377 
2378 /*
2379 ** Destroy a Decimal object
2380 */
2381 static void decimal_free(Decimal *p){
2382   if( p ){
2383     decimal_clear(p);
2384     sqlite3_free(p);
2385   }
2386 }
2387 
2388 /*
2389 ** Allocate a new Decimal object.  Initialize it to the number given
2390 ** by the input string.
2391 */
2392 static Decimal *decimal_new(
2393   sqlite3_context *pCtx,
2394   sqlite3_value *pIn,
2395   int nAlt,
2396   const unsigned char *zAlt
2397 ){
2398   Decimal *p;
2399   int n, i;
2400   const unsigned char *zIn;
2401   int iExp = 0;
2402   p = sqlite3_malloc( sizeof(*p) );
2403   if( p==0 ) goto new_no_mem;
2404   p->sign = 0;
2405   p->oom = 0;
2406   p->isInit = 1;
2407   p->isNull = 0;
2408   p->nDigit = 0;
2409   p->nFrac = 0;
2410   if( zAlt ){
2411     n = nAlt,
2412     zIn = zAlt;
2413   }else{
2414     if( sqlite3_value_type(pIn)==SQLITE_NULL ){
2415       p->a = 0;
2416       p->isNull = 1;
2417       return p;
2418     }
2419     n = sqlite3_value_bytes(pIn);
2420     zIn = sqlite3_value_text(pIn);
2421   }
2422   p->a = sqlite3_malloc64( n+1 );
2423   if( p->a==0 ) goto new_no_mem;
2424   for(i=0; isspace(zIn[i]); i++){}
2425   if( zIn[i]=='-' ){
2426     p->sign = 1;
2427     i++;
2428   }else if( zIn[i]=='+' ){
2429     i++;
2430   }
2431   while( i<n && zIn[i]=='0' ) i++;
2432   while( i<n ){
2433     char c = zIn[i];
2434     if( c>='0' && c<='9' ){
2435       p->a[p->nDigit++] = c - '0';
2436     }else if( c=='.' ){
2437       p->nFrac = p->nDigit + 1;
2438     }else if( c=='e' || c=='E' ){
2439       int j = i+1;
2440       int neg = 0;
2441       if( j>=n ) break;
2442       if( zIn[j]=='-' ){
2443         neg = 1;
2444         j++;
2445       }else if( zIn[j]=='+' ){
2446         j++;
2447       }
2448       while( j<n && iExp<1000000 ){
2449         if( zIn[j]>='0' && zIn[j]<='9' ){
2450           iExp = iExp*10 + zIn[j] - '0';
2451         }
2452         j++;
2453       }
2454       if( neg ) iExp = -iExp;
2455       break;
2456     }
2457     i++;
2458   }
2459   if( p->nFrac ){
2460     p->nFrac = p->nDigit - (p->nFrac - 1);
2461   }
2462   if( iExp>0 ){
2463     if( p->nFrac>0 ){
2464       if( iExp<=p->nFrac ){
2465         p->nFrac -= iExp;
2466         iExp = 0;
2467       }else{
2468         iExp -= p->nFrac;
2469         p->nFrac = 0;
2470       }
2471     }
2472     if( iExp>0 ){
2473       p->a = sqlite3_realloc64(p->a, p->nDigit + iExp + 1 );
2474       if( p->a==0 ) goto new_no_mem;
2475       memset(p->a+p->nDigit, 0, iExp);
2476       p->nDigit += iExp;
2477     }
2478   }else if( iExp<0 ){
2479     int nExtra;
2480     iExp = -iExp;
2481     nExtra = p->nDigit - p->nFrac - 1;
2482     if( nExtra ){
2483       if( nExtra>=iExp ){
2484         p->nFrac += iExp;
2485         iExp  = 0;
2486       }else{
2487         iExp -= nExtra;
2488         p->nFrac = p->nDigit - 1;
2489       }
2490     }
2491     if( iExp>0 ){
2492       p->a = sqlite3_realloc64(p->a, p->nDigit + iExp + 1 );
2493       if( p->a==0 ) goto new_no_mem;
2494       memmove(p->a+iExp, p->a, p->nDigit);
2495       memset(p->a, 0, iExp);
2496       p->nDigit += iExp;
2497       p->nFrac += iExp;
2498     }
2499   }
2500   return p;
2501 
2502 new_no_mem:
2503   if( pCtx ) sqlite3_result_error_nomem(pCtx);
2504   sqlite3_free(p);
2505   return 0;
2506 }
2507 
2508 /*
2509 ** Make the given Decimal the result.
2510 */
2511 static void decimal_result(sqlite3_context *pCtx, Decimal *p){
2512   char *z;
2513   int i, j;
2514   int n;
2515   if( p==0 || p->oom ){
2516     sqlite3_result_error_nomem(pCtx);
2517     return;
2518   }
2519   if( p->isNull ){
2520     sqlite3_result_null(pCtx);
2521     return;
2522   }
2523   z = sqlite3_malloc( p->nDigit+4 );
2524   if( z==0 ){
2525     sqlite3_result_error_nomem(pCtx);
2526     return;
2527   }
2528   i = 0;
2529   if( p->nDigit==0 || (p->nDigit==1 && p->a[0]==0) ){
2530     p->sign = 0;
2531   }
2532   if( p->sign ){
2533     z[0] = '-';
2534     i = 1;
2535   }
2536   n = p->nDigit - p->nFrac;
2537   if( n<=0 ){
2538     z[i++] = '0';
2539   }
2540   j = 0;
2541   while( n>1 && p->a[j]==0 ){
2542     j++;
2543     n--;
2544   }
2545   while( n>0  ){
2546     z[i++] = p->a[j] + '0';
2547     j++;
2548     n--;
2549   }
2550   if( p->nFrac ){
2551     z[i++] = '.';
2552     do{
2553       z[i++] = p->a[j] + '0';
2554       j++;
2555     }while( j<p->nDigit );
2556   }
2557   z[i] = 0;
2558   sqlite3_result_text(pCtx, z, i, sqlite3_free);
2559 }
2560 
2561 /*
2562 ** SQL Function:   decimal(X)
2563 **
2564 ** Convert input X into decimal and then back into text
2565 */
2566 static void decimalFunc(
2567   sqlite3_context *context,
2568   int argc,
2569   sqlite3_value **argv
2570 ){
2571   Decimal *p = decimal_new(context, argv[0], 0, 0);
2572   UNUSED_PARAMETER(argc);
2573   decimal_result(context, p);
2574   decimal_free(p);
2575 }
2576 
2577 /*
2578 ** Compare to Decimal objects.  Return negative, 0, or positive if the
2579 ** first object is less than, equal to, or greater than the second.
2580 **
2581 ** Preconditions for this routine:
2582 **
2583 **    pA!=0
2584 **    pA->isNull==0
2585 **    pB!=0
2586 **    pB->isNull==0
2587 */
2588 static int decimal_cmp(const Decimal *pA, const Decimal *pB){
2589   int nASig, nBSig, rc, n;
2590   if( pA->sign!=pB->sign ){
2591     return pA->sign ? -1 : +1;
2592   }
2593   if( pA->sign ){
2594     const Decimal *pTemp = pA;
2595     pA = pB;
2596     pB = pTemp;
2597   }
2598   nASig = pA->nDigit - pA->nFrac;
2599   nBSig = pB->nDigit - pB->nFrac;
2600   if( nASig!=nBSig ){
2601     return nASig - nBSig;
2602   }
2603   n = pA->nDigit;
2604   if( n>pB->nDigit ) n = pB->nDigit;
2605   rc = memcmp(pA->a, pB->a, n);
2606   if( rc==0 ){
2607     rc = pA->nDigit - pB->nDigit;
2608   }
2609   return rc;
2610 }
2611 
2612 /*
2613 ** SQL Function:   decimal_cmp(X, Y)
2614 **
2615 ** Return negative, zero, or positive if X is less then, equal to, or
2616 ** greater than Y.
2617 */
2618 static void decimalCmpFunc(
2619   sqlite3_context *context,
2620   int argc,
2621   sqlite3_value **argv
2622 ){
2623   Decimal *pA = 0, *pB = 0;
2624   int rc;
2625 
2626   UNUSED_PARAMETER(argc);
2627   pA = decimal_new(context, argv[0], 0, 0);
2628   if( pA==0 || pA->isNull ) goto cmp_done;
2629   pB = decimal_new(context, argv[1], 0, 0);
2630   if( pB==0 || pB->isNull ) goto cmp_done;
2631   rc = decimal_cmp(pA, pB);
2632   if( rc<0 ) rc = -1;
2633   else if( rc>0 ) rc = +1;
2634   sqlite3_result_int(context, rc);
2635 cmp_done:
2636   decimal_free(pA);
2637   decimal_free(pB);
2638 }
2639 
2640 /*
2641 ** Expand the Decimal so that it has a least nDigit digits and nFrac
2642 ** digits to the right of the decimal point.
2643 */
2644 static void decimal_expand(Decimal *p, int nDigit, int nFrac){
2645   int nAddSig;
2646   int nAddFrac;
2647   if( p==0 ) return;
2648   nAddFrac = nFrac - p->nFrac;
2649   nAddSig = (nDigit - p->nDigit) - nAddFrac;
2650   if( nAddFrac==0 && nAddSig==0 ) return;
2651   p->a = sqlite3_realloc64(p->a, nDigit+1);
2652   if( p->a==0 ){
2653     p->oom = 1;
2654     return;
2655   }
2656   if( nAddSig ){
2657     memmove(p->a+nAddSig, p->a, p->nDigit);
2658     memset(p->a, 0, nAddSig);
2659     p->nDigit += nAddSig;
2660   }
2661   if( nAddFrac ){
2662     memset(p->a+p->nDigit, 0, nAddFrac);
2663     p->nDigit += nAddFrac;
2664     p->nFrac += nAddFrac;
2665   }
2666 }
2667 
2668 /*
2669 ** Add the value pB into pA.
2670 **
2671 ** Both pA and pB might become denormalized by this routine.
2672 */
2673 static void decimal_add(Decimal *pA, Decimal *pB){
2674   int nSig, nFrac, nDigit;
2675   int i, rc;
2676   if( pA==0 ){
2677     return;
2678   }
2679   if( pA->oom || pB==0 || pB->oom ){
2680     pA->oom = 1;
2681     return;
2682   }
2683   if( pA->isNull || pB->isNull ){
2684     pA->isNull = 1;
2685     return;
2686   }
2687   nSig = pA->nDigit - pA->nFrac;
2688   if( nSig && pA->a[0]==0 ) nSig--;
2689   if( nSig<pB->nDigit-pB->nFrac ){
2690     nSig = pB->nDigit - pB->nFrac;
2691   }
2692   nFrac = pA->nFrac;
2693   if( nFrac<pB->nFrac ) nFrac = pB->nFrac;
2694   nDigit = nSig + nFrac + 1;
2695   decimal_expand(pA, nDigit, nFrac);
2696   decimal_expand(pB, nDigit, nFrac);
2697   if( pA->oom || pB->oom ){
2698     pA->oom = 1;
2699   }else{
2700     if( pA->sign==pB->sign ){
2701       int carry = 0;
2702       for(i=nDigit-1; i>=0; i--){
2703         int x = pA->a[i] + pB->a[i] + carry;
2704         if( x>=10 ){
2705           carry = 1;
2706           pA->a[i] = x - 10;
2707         }else{
2708           carry = 0;
2709           pA->a[i] = x;
2710         }
2711       }
2712     }else{
2713       signed char *aA, *aB;
2714       int borrow = 0;
2715       rc = memcmp(pA->a, pB->a, nDigit);
2716       if( rc<0 ){
2717         aA = pB->a;
2718         aB = pA->a;
2719         pA->sign = !pA->sign;
2720       }else{
2721         aA = pA->a;
2722         aB = pB->a;
2723       }
2724       for(i=nDigit-1; i>=0; i--){
2725         int x = aA[i] - aB[i] - borrow;
2726         if( x<0 ){
2727           pA->a[i] = x+10;
2728           borrow = 1;
2729         }else{
2730           pA->a[i] = x;
2731           borrow = 0;
2732         }
2733       }
2734     }
2735   }
2736 }
2737 
2738 /*
2739 ** Compare text in decimal order.
2740 */
2741 static int decimalCollFunc(
2742   void *notUsed,
2743   int nKey1, const void *pKey1,
2744   int nKey2, const void *pKey2
2745 ){
2746   const unsigned char *zA = (const unsigned char*)pKey1;
2747   const unsigned char *zB = (const unsigned char*)pKey2;
2748   Decimal *pA = decimal_new(0, 0, nKey1, zA);
2749   Decimal *pB = decimal_new(0, 0, nKey2, zB);
2750   int rc;
2751   UNUSED_PARAMETER(notUsed);
2752   if( pA==0 || pB==0 ){
2753     rc = 0;
2754   }else{
2755     rc = decimal_cmp(pA, pB);
2756   }
2757   decimal_free(pA);
2758   decimal_free(pB);
2759   return rc;
2760 }
2761 
2762 
2763 /*
2764 ** SQL Function:   decimal_add(X, Y)
2765 **                 decimal_sub(X, Y)
2766 **
2767 ** Return the sum or difference of X and Y.
2768 */
2769 static void decimalAddFunc(
2770   sqlite3_context *context,
2771   int argc,
2772   sqlite3_value **argv
2773 ){
2774   Decimal *pA = decimal_new(context, argv[0], 0, 0);
2775   Decimal *pB = decimal_new(context, argv[1], 0, 0);
2776   UNUSED_PARAMETER(argc);
2777   decimal_add(pA, pB);
2778   decimal_result(context, pA);
2779   decimal_free(pA);
2780   decimal_free(pB);
2781 }
2782 static void decimalSubFunc(
2783   sqlite3_context *context,
2784   int argc,
2785   sqlite3_value **argv
2786 ){
2787   Decimal *pA = decimal_new(context, argv[0], 0, 0);
2788   Decimal *pB = decimal_new(context, argv[1], 0, 0);
2789   UNUSED_PARAMETER(argc);
2790   if( pB ){
2791     pB->sign = !pB->sign;
2792     decimal_add(pA, pB);
2793     decimal_result(context, pA);
2794   }
2795   decimal_free(pA);
2796   decimal_free(pB);
2797 }
2798 
2799 /* Aggregate funcion:   decimal_sum(X)
2800 **
2801 ** Works like sum() except that it uses decimal arithmetic for unlimited
2802 ** precision.
2803 */
2804 static void decimalSumStep(
2805   sqlite3_context *context,
2806   int argc,
2807   sqlite3_value **argv
2808 ){
2809   Decimal *p;
2810   Decimal *pArg;
2811   UNUSED_PARAMETER(argc);
2812   p = sqlite3_aggregate_context(context, sizeof(*p));
2813   if( p==0 ) return;
2814   if( !p->isInit ){
2815     p->isInit = 1;
2816     p->a = sqlite3_malloc(2);
2817     if( p->a==0 ){
2818       p->oom = 1;
2819     }else{
2820       p->a[0] = 0;
2821     }
2822     p->nDigit = 1;
2823     p->nFrac = 0;
2824   }
2825   if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
2826   pArg = decimal_new(context, argv[0], 0, 0);
2827   decimal_add(p, pArg);
2828   decimal_free(pArg);
2829 }
2830 static void decimalSumInverse(
2831   sqlite3_context *context,
2832   int argc,
2833   sqlite3_value **argv
2834 ){
2835   Decimal *p;
2836   Decimal *pArg;
2837   UNUSED_PARAMETER(argc);
2838   p = sqlite3_aggregate_context(context, sizeof(*p));
2839   if( p==0 ) return;
2840   if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
2841   pArg = decimal_new(context, argv[0], 0, 0);
2842   if( pArg ) pArg->sign = !pArg->sign;
2843   decimal_add(p, pArg);
2844   decimal_free(pArg);
2845 }
2846 static void decimalSumValue(sqlite3_context *context){
2847   Decimal *p = sqlite3_aggregate_context(context, 0);
2848   if( p==0 ) return;
2849   decimal_result(context, p);
2850 }
2851 static void decimalSumFinalize(sqlite3_context *context){
2852   Decimal *p = sqlite3_aggregate_context(context, 0);
2853   if( p==0 ) return;
2854   decimal_result(context, p);
2855   decimal_clear(p);
2856 }
2857 
2858 /*
2859 ** SQL Function:   decimal_mul(X, Y)
2860 **
2861 ** Return the product of X and Y.
2862 **
2863 ** All significant digits after the decimal point are retained.
2864 ** Trailing zeros after the decimal point are omitted as long as
2865 ** the number of digits after the decimal point is no less than
2866 ** either the number of digits in either input.
2867 */
2868 static void decimalMulFunc(
2869   sqlite3_context *context,
2870   int argc,
2871   sqlite3_value **argv
2872 ){
2873   Decimal *pA = decimal_new(context, argv[0], 0, 0);
2874   Decimal *pB = decimal_new(context, argv[1], 0, 0);
2875   signed char *acc = 0;
2876   int i, j, k;
2877   int minFrac;
2878   UNUSED_PARAMETER(argc);
2879   if( pA==0 || pA->oom || pA->isNull
2880    || pB==0 || pB->oom || pB->isNull
2881   ){
2882     goto mul_end;
2883   }
2884   acc = sqlite3_malloc64( pA->nDigit + pB->nDigit + 2 );
2885   if( acc==0 ){
2886     sqlite3_result_error_nomem(context);
2887     goto mul_end;
2888   }
2889   memset(acc, 0, pA->nDigit + pB->nDigit + 2);
2890   minFrac = pA->nFrac;
2891   if( pB->nFrac<minFrac ) minFrac = pB->nFrac;
2892   for(i=pA->nDigit-1; i>=0; i--){
2893     signed char f = pA->a[i];
2894     int carry = 0, x;
2895     for(j=pB->nDigit-1, k=i+j+3; j>=0; j--, k--){
2896       x = acc[k] + f*pB->a[j] + carry;
2897       acc[k] = x%10;
2898       carry = x/10;
2899     }
2900     x = acc[k] + carry;
2901     acc[k] = x%10;
2902     acc[k-1] += x/10;
2903   }
2904   sqlite3_free(pA->a);
2905   pA->a = acc;
2906   acc = 0;
2907   pA->nDigit += pB->nDigit + 2;
2908   pA->nFrac += pB->nFrac;
2909   pA->sign ^= pB->sign;
2910   while( pA->nFrac>minFrac && pA->a[pA->nDigit-1]==0 ){
2911     pA->nFrac--;
2912     pA->nDigit--;
2913   }
2914   decimal_result(context, pA);
2915 
2916 mul_end:
2917   sqlite3_free(acc);
2918   decimal_free(pA);
2919   decimal_free(pB);
2920 }
2921 
2922 #ifdef _WIN32
2923 
2924 #endif
2925 int sqlite3_decimal_init(
2926   sqlite3 *db,
2927   char **pzErrMsg,
2928   const sqlite3_api_routines *pApi
2929 ){
2930   int rc = SQLITE_OK;
2931   static const struct {
2932     const char *zFuncName;
2933     int nArg;
2934     void (*xFunc)(sqlite3_context*,int,sqlite3_value**);
2935   } aFunc[] = {
2936     { "decimal",       1,   decimalFunc        },
2937     { "decimal_cmp",   2,   decimalCmpFunc     },
2938     { "decimal_add",   2,   decimalAddFunc     },
2939     { "decimal_sub",   2,   decimalSubFunc     },
2940     { "decimal_mul",   2,   decimalMulFunc     },
2941   };
2942   unsigned int i;
2943   (void)pzErrMsg;  /* Unused parameter */
2944 
2945   SQLITE_EXTENSION_INIT2(pApi);
2946 
2947   for(i=0; i<sizeof(aFunc)/sizeof(aFunc[0]) && rc==SQLITE_OK; i++){
2948     rc = sqlite3_create_function(db, aFunc[i].zFuncName, aFunc[i].nArg,
2949                    SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC,
2950                    0, aFunc[i].xFunc, 0, 0);
2951   }
2952   if( rc==SQLITE_OK ){
2953     rc = sqlite3_create_window_function(db, "decimal_sum", 1,
2954                    SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC, 0,
2955                    decimalSumStep, decimalSumFinalize,
2956                    decimalSumValue, decimalSumInverse, 0);
2957   }
2958   if( rc==SQLITE_OK ){
2959     rc = sqlite3_create_collation(db, "decimal", SQLITE_UTF8,
2960                                   0, decimalCollFunc);
2961   }
2962   return rc;
2963 }
2964 
2965 /************************* End ../ext/misc/decimal.c ********************/
2966 /************************* Begin ../ext/misc/ieee754.c ******************/
2967 /*
2968 ** 2013-04-17
2969 **
2970 ** The author disclaims copyright to this source code.  In place of
2971 ** a legal notice, here is a blessing:
2972 **
2973 **    May you do good and not evil.
2974 **    May you find forgiveness for yourself and forgive others.
2975 **    May you share freely, never taking more than you give.
2976 **
2977 ******************************************************************************
2978 **
2979 ** This SQLite extension implements functions for the exact display
2980 ** and input of IEEE754 Binary64 floating-point numbers.
2981 **
2982 **   ieee754(X)
2983 **   ieee754(Y,Z)
2984 **
2985 ** In the first form, the value X should be a floating-point number.
2986 ** The function will return a string of the form 'ieee754(Y,Z)' where
2987 ** Y and Z are integers such that X==Y*pow(2,Z).
2988 **
2989 ** In the second form, Y and Z are integers which are the mantissa and
2990 ** base-2 exponent of a new floating point number.  The function returns
2991 ** a floating-point value equal to Y*pow(2,Z).
2992 **
2993 ** Examples:
2994 **
2995 **     ieee754(2.0)             ->     'ieee754(2,0)'
2996 **     ieee754(45.25)           ->     'ieee754(181,-2)'
2997 **     ieee754(2, 0)            ->     2.0
2998 **     ieee754(181, -2)         ->     45.25
2999 **
3000 ** Two additional functions break apart the one-argument ieee754()
3001 ** result into separate integer values:
3002 **
3003 **     ieee754_mantissa(45.25)  ->     181
3004 **     ieee754_exponent(45.25)  ->     -2
3005 **
3006 ** These functions convert binary64 numbers into blobs and back again.
3007 **
3008 **     ieee754_from_blob(x'3ff0000000000000')  ->  1.0
3009 **     ieee754_to_blob(1.0)                    ->  x'3ff0000000000000'
3010 **
3011 ** In all single-argument functions, if the argument is an 8-byte blob
3012 ** then that blob is interpreted as a big-endian binary64 value.
3013 **
3014 **
3015 ** EXACT DECIMAL REPRESENTATION OF BINARY64 VALUES
3016 ** -----------------------------------------------
3017 **
3018 ** This extension in combination with the separate 'decimal' extension
3019 ** can be used to compute the exact decimal representation of binary64
3020 ** values.  To begin, first compute a table of exponent values:
3021 **
3022 **    CREATE TABLE pow2(x INTEGER PRIMARY KEY, v TEXT);
3023 **    WITH RECURSIVE c(x,v) AS (
3024 **      VALUES(0,'1')
3025 **      UNION ALL
3026 **      SELECT x+1, decimal_mul(v,'2') FROM c WHERE x+1<=971
3027 **    ) INSERT INTO pow2(x,v) SELECT x, v FROM c;
3028 **    WITH RECURSIVE c(x,v) AS (
3029 **      VALUES(-1,'0.5')
3030 **      UNION ALL
3031 **      SELECT x-1, decimal_mul(v,'0.5') FROM c WHERE x-1>=-1075
3032 **    ) INSERT INTO pow2(x,v) SELECT x, v FROM c;
3033 **
3034 ** Then, to compute the exact decimal representation of a floating
3035 ** point value (the value 47.49 is used in the example) do:
3036 **
3037 **    WITH c(n) AS (VALUES(47.49))
3038 **          ---------------^^^^^---- Replace with whatever you want
3039 **    SELECT decimal_mul(ieee754_mantissa(c.n),pow2.v)
3040 **      FROM pow2, c WHERE pow2.x=ieee754_exponent(c.n);
3041 **
3042 ** Here is a query to show various boundry values for the binary64
3043 ** number format:
3044 **
3045 **    WITH c(name,bin) AS (VALUES
3046 **       ('minimum positive value',        x'0000000000000001'),
3047 **       ('maximum subnormal value',       x'000fffffffffffff'),
3048 **       ('mininum positive nornal value', x'0010000000000000'),
3049 **       ('maximum value',                 x'7fefffffffffffff'))
3050 **    SELECT c.name, decimal_mul(ieee754_mantissa(c.bin),pow2.v)
3051 **      FROM pow2, c WHERE pow2.x=ieee754_exponent(c.bin);
3052 **
3053 */
3054 /* #include "sqlite3ext.h" */
3055 SQLITE_EXTENSION_INIT1
3056 #include <assert.h>
3057 #include <string.h>
3058 
3059 /* Mark a function parameter as unused, to suppress nuisance compiler
3060 ** warnings. */
3061 #ifndef UNUSED_PARAMETER
3062 # define UNUSED_PARAMETER(X)  (void)(X)
3063 #endif
3064 
3065 /*
3066 ** Implementation of the ieee754() function
3067 */
3068 static void ieee754func(
3069   sqlite3_context *context,
3070   int argc,
3071   sqlite3_value **argv
3072 ){
3073   if( argc==1 ){
3074     sqlite3_int64 m, a;
3075     double r;
3076     int e;
3077     int isNeg;
3078     char zResult[100];
3079     assert( sizeof(m)==sizeof(r) );
3080     if( sqlite3_value_type(argv[0])==SQLITE_BLOB
3081      && sqlite3_value_bytes(argv[0])==sizeof(r)
3082     ){
3083       const unsigned char *x = sqlite3_value_blob(argv[0]);
3084       unsigned int i;
3085       sqlite3_uint64 v = 0;
3086       for(i=0; i<sizeof(r); i++){
3087         v = (v<<8) | x[i];
3088       }
3089       memcpy(&r, &v, sizeof(r));
3090     }else{
3091       r = sqlite3_value_double(argv[0]);
3092     }
3093     if( r<0.0 ){
3094       isNeg = 1;
3095       r = -r;
3096     }else{
3097       isNeg = 0;
3098     }
3099     memcpy(&a,&r,sizeof(a));
3100     if( a==0 ){
3101       e = 0;
3102       m = 0;
3103     }else{
3104       e = a>>52;
3105       m = a & ((((sqlite3_int64)1)<<52)-1);
3106       if( e==0 ){
3107         m <<= 1;
3108       }else{
3109         m |= ((sqlite3_int64)1)<<52;
3110       }
3111       while( e<1075 && m>0 && (m&1)==0 ){
3112         m >>= 1;
3113         e++;
3114       }
3115       if( isNeg ) m = -m;
3116     }
3117     switch( *(int*)sqlite3_user_data(context) ){
3118       case 0:
3119         sqlite3_snprintf(sizeof(zResult), zResult, "ieee754(%lld,%d)",
3120                          m, e-1075);
3121         sqlite3_result_text(context, zResult, -1, SQLITE_TRANSIENT);
3122         break;
3123       case 1:
3124         sqlite3_result_int64(context, m);
3125         break;
3126       case 2:
3127         sqlite3_result_int(context, e-1075);
3128         break;
3129     }
3130   }else{
3131     sqlite3_int64 m, e, a;
3132     double r;
3133     int isNeg = 0;
3134     m = sqlite3_value_int64(argv[0]);
3135     e = sqlite3_value_int64(argv[1]);
3136 
3137     /* Limit the range of e.  Ticket 22dea1cfdb9151e4 2021-03-02 */
3138     if( e>10000 ){
3139       e = 10000;
3140     }else if( e<-10000 ){
3141       e = -10000;
3142     }
3143 
3144     if( m<0 ){
3145       isNeg = 1;
3146       m = -m;
3147       if( m<0 ) return;
3148     }else if( m==0 && e>-1000 && e<1000 ){
3149       sqlite3_result_double(context, 0.0);
3150       return;
3151     }
3152     while( (m>>32)&0xffe00000 ){
3153       m >>= 1;
3154       e++;
3155     }
3156     while( m!=0 && ((m>>32)&0xfff00000)==0 ){
3157       m <<= 1;
3158       e--;
3159     }
3160     e += 1075;
3161     if( e<=0 ){
3162       /* Subnormal */
3163       if( 1-e >= 64 ){
3164         m = 0;
3165       }else{
3166         m >>= 1-e;
3167       }
3168       e = 0;
3169     }else if( e>0x7ff ){
3170       e = 0x7ff;
3171     }
3172     a = m & ((((sqlite3_int64)1)<<52)-1);
3173     a |= e<<52;
3174     if( isNeg ) a |= ((sqlite3_uint64)1)<<63;
3175     memcpy(&r, &a, sizeof(r));
3176     sqlite3_result_double(context, r);
3177   }
3178 }
3179 
3180 /*
3181 ** Functions to convert between blobs and floats.
3182 */
3183 static void ieee754func_from_blob(
3184   sqlite3_context *context,
3185   int argc,
3186   sqlite3_value **argv
3187 ){
3188   UNUSED_PARAMETER(argc);
3189   if( sqlite3_value_type(argv[0])==SQLITE_BLOB
3190    && sqlite3_value_bytes(argv[0])==sizeof(double)
3191   ){
3192     double r;
3193     const unsigned char *x = sqlite3_value_blob(argv[0]);
3194     unsigned int i;
3195     sqlite3_uint64 v = 0;
3196     for(i=0; i<sizeof(r); i++){
3197       v = (v<<8) | x[i];
3198     }
3199     memcpy(&r, &v, sizeof(r));
3200     sqlite3_result_double(context, r);
3201   }
3202 }
3203 static void ieee754func_to_blob(
3204   sqlite3_context *context,
3205   int argc,
3206   sqlite3_value **argv
3207 ){
3208   UNUSED_PARAMETER(argc);
3209   if( sqlite3_value_type(argv[0])==SQLITE_FLOAT
3210    || sqlite3_value_type(argv[0])==SQLITE_INTEGER
3211   ){
3212     double r = sqlite3_value_double(argv[0]);
3213     sqlite3_uint64 v;
3214     unsigned char a[sizeof(r)];
3215     unsigned int i;
3216     memcpy(&v, &r, sizeof(r));
3217     for(i=1; i<=sizeof(r); i++){
3218       a[sizeof(r)-i] = v&0xff;
3219       v >>= 8;
3220     }
3221     sqlite3_result_blob(context, a, sizeof(r), SQLITE_TRANSIENT);
3222   }
3223 }
3224 
3225 
3226 #ifdef _WIN32
3227 
3228 #endif
3229 int sqlite3_ieee_init(
3230   sqlite3 *db,
3231   char **pzErrMsg,
3232   const sqlite3_api_routines *pApi
3233 ){
3234   static const struct {
3235     char *zFName;
3236     int nArg;
3237     int iAux;
3238     void (*xFunc)(sqlite3_context*,int,sqlite3_value**);
3239   } aFunc[] = {
3240     { "ieee754",           1,   0, ieee754func },
3241     { "ieee754",           2,   0, ieee754func },
3242     { "ieee754_mantissa",  1,   1, ieee754func },
3243     { "ieee754_exponent",  1,   2, ieee754func },
3244     { "ieee754_to_blob",   1,   0, ieee754func_to_blob },
3245     { "ieee754_from_blob", 1,   0, ieee754func_from_blob },
3246 
3247   };
3248   unsigned int i;
3249   int rc = SQLITE_OK;
3250   SQLITE_EXTENSION_INIT2(pApi);
3251   (void)pzErrMsg;  /* Unused parameter */
3252   for(i=0; i<sizeof(aFunc)/sizeof(aFunc[0]) && rc==SQLITE_OK; i++){
3253     rc = sqlite3_create_function(db, aFunc[i].zFName, aFunc[i].nArg,
3254                                SQLITE_UTF8|SQLITE_INNOCUOUS,
3255                                (void*)&aFunc[i].iAux,
3256                                aFunc[i].xFunc, 0, 0);
3257   }
3258   return rc;
3259 }
3260 
3261 /************************* End ../ext/misc/ieee754.c ********************/
3262 /************************* Begin ../ext/misc/series.c ******************/
3263 /*
3264 ** 2015-08-18
3265 **
3266 ** The author disclaims copyright to this source code.  In place of
3267 ** a legal notice, here is a blessing:
3268 **
3269 **    May you do good and not evil.
3270 **    May you find forgiveness for yourself and forgive others.
3271 **    May you share freely, never taking more than you give.
3272 **
3273 *************************************************************************
3274 **
3275 ** This file demonstrates how to create a table-valued-function using
3276 ** a virtual table.  This demo implements the generate_series() function
3277 ** which gives similar results to the eponymous function in PostgreSQL.
3278 ** Examples:
3279 **
3280 **      SELECT * FROM generate_series(0,100,5);
3281 **
3282 ** The query above returns integers from 0 through 100 counting by steps
3283 ** of 5.
3284 **
3285 **      SELECT * FROM generate_series(0,100);
3286 **
3287 ** Integers from 0 through 100 with a step size of 1.
3288 **
3289 **      SELECT * FROM generate_series(20) LIMIT 10;
3290 **
3291 ** Integers 20 through 29.
3292 **
3293 ** HOW IT WORKS
3294 **
3295 ** The generate_series "function" is really a virtual table with the
3296 ** following schema:
3297 **
3298 **     CREATE TABLE generate_series(
3299 **       value,
3300 **       start HIDDEN,
3301 **       stop HIDDEN,
3302 **       step HIDDEN
3303 **     );
3304 **
3305 ** Function arguments in queries against this virtual table are translated
3306 ** into equality constraints against successive hidden columns.  In other
3307 ** words, the following pairs of queries are equivalent to each other:
3308 **
3309 **    SELECT * FROM generate_series(0,100,5);
3310 **    SELECT * FROM generate_series WHERE start=0 AND stop=100 AND step=5;
3311 **
3312 **    SELECT * FROM generate_series(0,100);
3313 **    SELECT * FROM generate_series WHERE start=0 AND stop=100;
3314 **
3315 **    SELECT * FROM generate_series(20) LIMIT 10;
3316 **    SELECT * FROM generate_series WHERE start=20 LIMIT 10;
3317 **
3318 ** The generate_series virtual table implementation leaves the xCreate method
3319 ** set to NULL.  This means that it is not possible to do a CREATE VIRTUAL
3320 ** TABLE command with "generate_series" as the USING argument.  Instead, there
3321 ** is a single generate_series virtual table that is always available without
3322 ** having to be created first.
3323 **
3324 ** The xBestIndex method looks for equality constraints against the hidden
3325 ** start, stop, and step columns, and if present, it uses those constraints
3326 ** to bound the sequence of generated values.  If the equality constraints
3327 ** are missing, it uses 0 for start, 4294967295 for stop, and 1 for step.
3328 ** xBestIndex returns a small cost when both start and stop are available,
3329 ** and a very large cost if either start or stop are unavailable.  This
3330 ** encourages the query planner to order joins such that the bounds of the
3331 ** series are well-defined.
3332 */
3333 /* #include "sqlite3ext.h" */
3334 SQLITE_EXTENSION_INIT1
3335 #include <assert.h>
3336 #include <string.h>
3337 
3338 #ifndef SQLITE_OMIT_VIRTUALTABLE
3339 
3340 
3341 /* series_cursor is a subclass of sqlite3_vtab_cursor which will
3342 ** serve as the underlying representation of a cursor that scans
3343 ** over rows of the result
3344 */
3345 typedef struct series_cursor series_cursor;
3346 struct series_cursor {
3347   sqlite3_vtab_cursor base;  /* Base class - must be first */
3348   int isDesc;                /* True to count down rather than up */
3349   sqlite3_int64 iRowid;      /* The rowid */
3350   sqlite3_int64 iValue;      /* Current value ("value") */
3351   sqlite3_int64 mnValue;     /* Mimimum value ("start") */
3352   sqlite3_int64 mxValue;     /* Maximum value ("stop") */
3353   sqlite3_int64 iStep;       /* Increment ("step") */
3354 };
3355 
3356 /*
3357 ** The seriesConnect() method is invoked to create a new
3358 ** series_vtab that describes the generate_series virtual table.
3359 **
3360 ** Think of this routine as the constructor for series_vtab objects.
3361 **
3362 ** All this routine needs to do is:
3363 **
3364 **    (1) Allocate the series_vtab object and initialize all fields.
3365 **
3366 **    (2) Tell SQLite (via the sqlite3_declare_vtab() interface) what the
3367 **        result set of queries against generate_series will look like.
3368 */
3369 static int seriesConnect(
3370   sqlite3 *db,
3371   void *pUnused,
3372   int argcUnused, const char *const*argvUnused,
3373   sqlite3_vtab **ppVtab,
3374   char **pzErrUnused
3375 ){
3376   sqlite3_vtab *pNew;
3377   int rc;
3378 
3379 /* Column numbers */
3380 #define SERIES_COLUMN_VALUE 0
3381 #define SERIES_COLUMN_START 1
3382 #define SERIES_COLUMN_STOP  2
3383 #define SERIES_COLUMN_STEP  3
3384 
3385   (void)pUnused;
3386   (void)argcUnused;
3387   (void)argvUnused;
3388   (void)pzErrUnused;
3389   rc = sqlite3_declare_vtab(db,
3390      "CREATE TABLE x(value,start hidden,stop hidden,step hidden)");
3391   if( rc==SQLITE_OK ){
3392     pNew = *ppVtab = sqlite3_malloc( sizeof(*pNew) );
3393     if( pNew==0 ) return SQLITE_NOMEM;
3394     memset(pNew, 0, sizeof(*pNew));
3395     sqlite3_vtab_config(db, SQLITE_VTAB_INNOCUOUS);
3396   }
3397   return rc;
3398 }
3399 
3400 /*
3401 ** This method is the destructor for series_cursor objects.
3402 */
3403 static int seriesDisconnect(sqlite3_vtab *pVtab){
3404   sqlite3_free(pVtab);
3405   return SQLITE_OK;
3406 }
3407 
3408 /*
3409 ** Constructor for a new series_cursor object.
3410 */
3411 static int seriesOpen(sqlite3_vtab *pUnused, sqlite3_vtab_cursor **ppCursor){
3412   series_cursor *pCur;
3413   (void)pUnused;
3414   pCur = sqlite3_malloc( sizeof(*pCur) );
3415   if( pCur==0 ) return SQLITE_NOMEM;
3416   memset(pCur, 0, sizeof(*pCur));
3417   *ppCursor = &pCur->base;
3418   return SQLITE_OK;
3419 }
3420 
3421 /*
3422 ** Destructor for a series_cursor.
3423 */
3424 static int seriesClose(sqlite3_vtab_cursor *cur){
3425   sqlite3_free(cur);
3426   return SQLITE_OK;
3427 }
3428 
3429 
3430 /*
3431 ** Advance a series_cursor to its next row of output.
3432 */
3433 static int seriesNext(sqlite3_vtab_cursor *cur){
3434   series_cursor *pCur = (series_cursor*)cur;
3435   if( pCur->isDesc ){
3436     pCur->iValue -= pCur->iStep;
3437   }else{
3438     pCur->iValue += pCur->iStep;
3439   }
3440   pCur->iRowid++;
3441   return SQLITE_OK;
3442 }
3443 
3444 /*
3445 ** Return values of columns for the row at which the series_cursor
3446 ** is currently pointing.
3447 */
3448 static int seriesColumn(
3449   sqlite3_vtab_cursor *cur,   /* The cursor */
3450   sqlite3_context *ctx,       /* First argument to sqlite3_result_...() */
3451   int i                       /* Which column to return */
3452 ){
3453   series_cursor *pCur = (series_cursor*)cur;
3454   sqlite3_int64 x = 0;
3455   switch( i ){
3456     case SERIES_COLUMN_START:  x = pCur->mnValue; break;
3457     case SERIES_COLUMN_STOP:   x = pCur->mxValue; break;
3458     case SERIES_COLUMN_STEP:   x = pCur->iStep;   break;
3459     default:                   x = pCur->iValue;  break;
3460   }
3461   sqlite3_result_int64(ctx, x);
3462   return SQLITE_OK;
3463 }
3464 
3465 /*
3466 ** Return the rowid for the current row. In this implementation, the
3467 ** first row returned is assigned rowid value 1, and each subsequent
3468 ** row a value 1 more than that of the previous.
3469 */
3470 static int seriesRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
3471   series_cursor *pCur = (series_cursor*)cur;
3472   *pRowid = pCur->iRowid;
3473   return SQLITE_OK;
3474 }
3475 
3476 /*
3477 ** Return TRUE if the cursor has been moved off of the last
3478 ** row of output.
3479 */
3480 static int seriesEof(sqlite3_vtab_cursor *cur){
3481   series_cursor *pCur = (series_cursor*)cur;
3482   if( pCur->isDesc ){
3483     return pCur->iValue < pCur->mnValue;
3484   }else{
3485     return pCur->iValue > pCur->mxValue;
3486   }
3487 }
3488 
3489 /* True to cause run-time checking of the start=, stop=, and/or step=
3490 ** parameters.  The only reason to do this is for testing the
3491 ** constraint checking logic for virtual tables in the SQLite core.
3492 */
3493 #ifndef SQLITE_SERIES_CONSTRAINT_VERIFY
3494 # define SQLITE_SERIES_CONSTRAINT_VERIFY 0
3495 #endif
3496 
3497 /*
3498 ** This method is called to "rewind" the series_cursor object back
3499 ** to the first row of output.  This method is always called at least
3500 ** once prior to any call to seriesColumn() or seriesRowid() or
3501 ** seriesEof().
3502 **
3503 ** The query plan selected by seriesBestIndex is passed in the idxNum
3504 ** parameter.  (idxStr is not used in this implementation.)  idxNum
3505 ** is a bitmask showing which constraints are available:
3506 **
3507 **    1:    start=VALUE
3508 **    2:    stop=VALUE
3509 **    4:    step=VALUE
3510 **
3511 ** Also, if bit 8 is set, that means that the series should be output
3512 ** in descending order rather than in ascending order.  If bit 16 is
3513 ** set, then output must appear in ascending order.
3514 **
3515 ** This routine should initialize the cursor and position it so that it
3516 ** is pointing at the first row, or pointing off the end of the table
3517 ** (so that seriesEof() will return true) if the table is empty.
3518 */
3519 static int seriesFilter(
3520   sqlite3_vtab_cursor *pVtabCursor,
3521   int idxNum, const char *idxStrUnused,
3522   int argc, sqlite3_value **argv
3523 ){
3524   series_cursor *pCur = (series_cursor *)pVtabCursor;
3525   int i = 0;
3526   (void)idxStrUnused;
3527   if( idxNum & 1 ){
3528     pCur->mnValue = sqlite3_value_int64(argv[i++]);
3529   }else{
3530     pCur->mnValue = 0;
3531   }
3532   if( idxNum & 2 ){
3533     pCur->mxValue = sqlite3_value_int64(argv[i++]);
3534   }else{
3535     pCur->mxValue = 0xffffffff;
3536   }
3537   if( idxNum & 4 ){
3538     pCur->iStep = sqlite3_value_int64(argv[i++]);
3539     if( pCur->iStep==0 ){
3540       pCur->iStep = 1;
3541     }else if( pCur->iStep<0 ){
3542       pCur->iStep = -pCur->iStep;
3543       if( (idxNum & 16)==0 ) idxNum |= 8;
3544     }
3545   }else{
3546     pCur->iStep = 1;
3547   }
3548   for(i=0; i<argc; i++){
3549     if( sqlite3_value_type(argv[i])==SQLITE_NULL ){
3550       /* If any of the constraints have a NULL value, then return no rows.
3551       ** See ticket https://www.sqlite.org/src/info/fac496b61722daf2 */
3552       pCur->mnValue = 1;
3553       pCur->mxValue = 0;
3554       break;
3555     }
3556   }
3557   if( idxNum & 8 ){
3558     pCur->isDesc = 1;
3559     pCur->iValue = pCur->mxValue;
3560     if( pCur->iStep>0 ){
3561       pCur->iValue -= (pCur->mxValue - pCur->mnValue)%pCur->iStep;
3562     }
3563   }else{
3564     pCur->isDesc = 0;
3565     pCur->iValue = pCur->mnValue;
3566   }
3567   pCur->iRowid = 1;
3568   return SQLITE_OK;
3569 }
3570 
3571 /*
3572 ** SQLite will invoke this method one or more times while planning a query
3573 ** that uses the generate_series virtual table.  This routine needs to create
3574 ** a query plan for each invocation and compute an estimated cost for that
3575 ** plan.
3576 **
3577 ** In this implementation idxNum is used to represent the
3578 ** query plan.  idxStr is unused.
3579 **
3580 ** The query plan is represented by bits in idxNum:
3581 **
3582 **  (1)  start = $value  -- constraint exists
3583 **  (2)  stop = $value   -- constraint exists
3584 **  (4)  step = $value   -- constraint exists
3585 **  (8)  output in descending order
3586 */
3587 static int seriesBestIndex(
3588   sqlite3_vtab *pVTab,
3589   sqlite3_index_info *pIdxInfo
3590 ){
3591   int i, j;              /* Loop over constraints */
3592   int idxNum = 0;        /* The query plan bitmask */
3593   int bStartSeen = 0;    /* EQ constraint seen on the START column */
3594   int unusableMask = 0;  /* Mask of unusable constraints */
3595   int nArg = 0;          /* Number of arguments that seriesFilter() expects */
3596   int aIdx[3];           /* Constraints on start, stop, and step */
3597   const struct sqlite3_index_constraint *pConstraint;
3598 
3599   /* This implementation assumes that the start, stop, and step columns
3600   ** are the last three columns in the virtual table. */
3601   assert( SERIES_COLUMN_STOP == SERIES_COLUMN_START+1 );
3602   assert( SERIES_COLUMN_STEP == SERIES_COLUMN_START+2 );
3603 
3604   aIdx[0] = aIdx[1] = aIdx[2] = -1;
3605   pConstraint = pIdxInfo->aConstraint;
3606   for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){
3607     int iCol;    /* 0 for start, 1 for stop, 2 for step */
3608     int iMask;   /* bitmask for those column */
3609     if( pConstraint->iColumn<SERIES_COLUMN_START ) continue;
3610     iCol = pConstraint->iColumn - SERIES_COLUMN_START;
3611     assert( iCol>=0 && iCol<=2 );
3612     iMask = 1 << iCol;
3613     if( iCol==0 ) bStartSeen = 1;
3614     if( pConstraint->usable==0 ){
3615       unusableMask |=  iMask;
3616       continue;
3617     }else if( pConstraint->op==SQLITE_INDEX_CONSTRAINT_EQ ){
3618       idxNum |= iMask;
3619       aIdx[iCol] = i;
3620     }
3621   }
3622   for(i=0; i<3; i++){
3623     if( (j = aIdx[i])>=0 ){
3624       pIdxInfo->aConstraintUsage[j].argvIndex = ++nArg;
3625       pIdxInfo->aConstraintUsage[j].omit = !SQLITE_SERIES_CONSTRAINT_VERIFY;
3626     }
3627   }
3628   /* The current generate_column() implementation requires at least one
3629   ** argument (the START value).  Legacy versions assumed START=0 if the
3630   ** first argument was omitted.  Compile with -DZERO_ARGUMENT_GENERATE_SERIES
3631   ** to obtain the legacy behavior */
3632 #ifndef ZERO_ARGUMENT_GENERATE_SERIES
3633   if( !bStartSeen ){
3634     sqlite3_free(pVTab->zErrMsg);
3635     pVTab->zErrMsg = sqlite3_mprintf(
3636         "first argument to \"generate_series()\" missing or unusable");
3637     return SQLITE_ERROR;
3638   }
3639 #endif
3640   if( (unusableMask & ~idxNum)!=0 ){
3641     /* The start, stop, and step columns are inputs.  Therefore if there
3642     ** are unusable constraints on any of start, stop, or step then
3643     ** this plan is unusable */
3644     return SQLITE_CONSTRAINT;
3645   }
3646   if( (idxNum & 3)==3 ){
3647     /* Both start= and stop= boundaries are available.  This is the
3648     ** the preferred case */
3649     pIdxInfo->estimatedCost = (double)(2 - ((idxNum&4)!=0));
3650     pIdxInfo->estimatedRows = 1000;
3651     if( pIdxInfo->nOrderBy>=1 && pIdxInfo->aOrderBy[0].iColumn==0 ){
3652       if( pIdxInfo->aOrderBy[0].desc ){
3653         idxNum |= 8;
3654       }else{
3655         idxNum |= 16;
3656       }
3657       pIdxInfo->orderByConsumed = 1;
3658     }
3659   }else{
3660     /* If either boundary is missing, we have to generate a huge span
3661     ** of numbers.  Make this case very expensive so that the query
3662     ** planner will work hard to avoid it. */
3663     pIdxInfo->estimatedRows = 2147483647;
3664   }
3665   pIdxInfo->idxNum = idxNum;
3666   return SQLITE_OK;
3667 }
3668 
3669 /*
3670 ** This following structure defines all the methods for the
3671 ** generate_series virtual table.
3672 */
3673 static sqlite3_module seriesModule = {
3674   0,                         /* iVersion */
3675   0,                         /* xCreate */
3676   seriesConnect,             /* xConnect */
3677   seriesBestIndex,           /* xBestIndex */
3678   seriesDisconnect,          /* xDisconnect */
3679   0,                         /* xDestroy */
3680   seriesOpen,                /* xOpen - open a cursor */
3681   seriesClose,               /* xClose - close a cursor */
3682   seriesFilter,              /* xFilter - configure scan constraints */
3683   seriesNext,                /* xNext - advance a cursor */
3684   seriesEof,                 /* xEof - check for end of scan */
3685   seriesColumn,              /* xColumn - read data */
3686   seriesRowid,               /* xRowid - read data */
3687   0,                         /* xUpdate */
3688   0,                         /* xBegin */
3689   0,                         /* xSync */
3690   0,                         /* xCommit */
3691   0,                         /* xRollback */
3692   0,                         /* xFindMethod */
3693   0,                         /* xRename */
3694   0,                         /* xSavepoint */
3695   0,                         /* xRelease */
3696   0,                         /* xRollbackTo */
3697   0                          /* xShadowName */
3698 };
3699 
3700 #endif /* SQLITE_OMIT_VIRTUALTABLE */
3701 
3702 #ifdef _WIN32
3703 
3704 #endif
3705 int sqlite3_series_init(
3706   sqlite3 *db,
3707   char **pzErrMsg,
3708   const sqlite3_api_routines *pApi
3709 ){
3710   int rc = SQLITE_OK;
3711   SQLITE_EXTENSION_INIT2(pApi);
3712 #ifndef SQLITE_OMIT_VIRTUALTABLE
3713   if( sqlite3_libversion_number()<3008012 && pzErrMsg!=0 ){
3714     *pzErrMsg = sqlite3_mprintf(
3715         "generate_series() requires SQLite 3.8.12 or later");
3716     return SQLITE_ERROR;
3717   }
3718   rc = sqlite3_create_module(db, "generate_series", &seriesModule, 0);
3719 #endif
3720   return rc;
3721 }
3722 
3723 /************************* End ../ext/misc/series.c ********************/
3724 /************************* Begin ../ext/misc/regexp.c ******************/
3725 /*
3726 ** 2012-11-13
3727 **
3728 ** The author disclaims copyright to this source code.  In place of
3729 ** a legal notice, here is a blessing:
3730 **
3731 **    May you do good and not evil.
3732 **    May you find forgiveness for yourself and forgive others.
3733 **    May you share freely, never taking more than you give.
3734 **
3735 ******************************************************************************
3736 **
3737 ** The code in this file implements a compact but reasonably
3738 ** efficient regular-expression matcher for posix extended regular
3739 ** expressions against UTF8 text.
3740 **
3741 ** This file is an SQLite extension.  It registers a single function
3742 ** named "regexp(A,B)" where A is the regular expression and B is the
3743 ** string to be matched.  By registering this function, SQLite will also
3744 ** then implement the "B regexp A" operator.  Note that with the function
3745 ** the regular expression comes first, but with the operator it comes
3746 ** second.
3747 **
3748 **  The following regular expression syntax is supported:
3749 **
3750 **     X*      zero or more occurrences of X
3751 **     X+      one or more occurrences of X
3752 **     X?      zero or one occurrences of X
3753 **     X{p,q}  between p and q occurrences of X
3754 **     (X)     match X
3755 **     X|Y     X or Y
3756 **     ^X      X occurring at the beginning of the string
3757 **     X$      X occurring at the end of the string
3758 **     .       Match any single character
3759 **     \c      Character c where c is one of \{}()[]|*+?.
3760 **     \c      C-language escapes for c in afnrtv.  ex: \t or \n
3761 **     \uXXXX  Where XXXX is exactly 4 hex digits, unicode value XXXX
3762 **     \xXX    Where XX is exactly 2 hex digits, unicode value XX
3763 **     [abc]   Any single character from the set abc
3764 **     [^abc]  Any single character not in the set abc
3765 **     [a-z]   Any single character in the range a-z
3766 **     [^a-z]  Any single character not in the range a-z
3767 **     \b      Word boundary
3768 **     \w      Word character.  [A-Za-z0-9_]
3769 **     \W      Non-word character
3770 **     \d      Digit
3771 **     \D      Non-digit
3772 **     \s      Whitespace character
3773 **     \S      Non-whitespace character
3774 **
3775 ** A nondeterministic finite automaton (NFA) is used for matching, so the
3776 ** performance is bounded by O(N*M) where N is the size of the regular
3777 ** expression and M is the size of the input string.  The matcher never
3778 ** exhibits exponential behavior.  Note that the X{p,q} operator expands
3779 ** to p copies of X following by q-p copies of X? and that the size of the
3780 ** regular expression in the O(N*M) performance bound is computed after
3781 ** this expansion.
3782 */
3783 #include <string.h>
3784 #include <stdlib.h>
3785 /* #include "sqlite3ext.h" */
3786 SQLITE_EXTENSION_INIT1
3787 
3788 /*
3789 ** The following #defines change the names of some functions implemented in
3790 ** this file to prevent name collisions with C-library functions of the
3791 ** same name.
3792 */
3793 #define re_match   sqlite3re_match
3794 #define re_compile sqlite3re_compile
3795 #define re_free    sqlite3re_free
3796 
3797 /* The end-of-input character */
3798 #define RE_EOF            0    /* End of input */
3799 
3800 /* The NFA is implemented as sequence of opcodes taken from the following
3801 ** set.  Each opcode has a single integer argument.
3802 */
3803 #define RE_OP_MATCH       1    /* Match the one character in the argument */
3804 #define RE_OP_ANY         2    /* Match any one character.  (Implements ".") */
3805 #define RE_OP_ANYSTAR     3    /* Special optimized version of .* */
3806 #define RE_OP_FORK        4    /* Continue to both next and opcode at iArg */
3807 #define RE_OP_GOTO        5    /* Jump to opcode at iArg */
3808 #define RE_OP_ACCEPT      6    /* Halt and indicate a successful match */
3809 #define RE_OP_CC_INC      7    /* Beginning of a [...] character class */
3810 #define RE_OP_CC_EXC      8    /* Beginning of a [^...] character class */
3811 #define RE_OP_CC_VALUE    9    /* Single value in a character class */
3812 #define RE_OP_CC_RANGE   10    /* Range of values in a character class */
3813 #define RE_OP_WORD       11    /* Perl word character [A-Za-z0-9_] */
3814 #define RE_OP_NOTWORD    12    /* Not a perl word character */
3815 #define RE_OP_DIGIT      13    /* digit:  [0-9] */
3816 #define RE_OP_NOTDIGIT   14    /* Not a digit */
3817 #define RE_OP_SPACE      15    /* space:  [ \t\n\r\v\f] */
3818 #define RE_OP_NOTSPACE   16    /* Not a digit */
3819 #define RE_OP_BOUNDARY   17    /* Boundary between word and non-word */
3820 
3821 /* Each opcode is a "state" in the NFA */
3822 typedef unsigned short ReStateNumber;
3823 
3824 /* Because this is an NFA and not a DFA, multiple states can be active at
3825 ** once.  An instance of the following object records all active states in
3826 ** the NFA.  The implementation is optimized for the common case where the
3827 ** number of actives states is small.
3828 */
3829 typedef struct ReStateSet {
3830   unsigned nState;            /* Number of current states */
3831   ReStateNumber *aState;      /* Current states */
3832 } ReStateSet;
3833 
3834 /* An input string read one character at a time.
3835 */
3836 typedef struct ReInput ReInput;
3837 struct ReInput {
3838   const unsigned char *z;  /* All text */
3839   int i;                   /* Next byte to read */
3840   int mx;                  /* EOF when i>=mx */
3841 };
3842 
3843 /* A compiled NFA (or an NFA that is in the process of being compiled) is
3844 ** an instance of the following object.
3845 */
3846 typedef struct ReCompiled ReCompiled;
3847 struct ReCompiled {
3848   ReInput sIn;                /* Regular expression text */
3849   const char *zErr;           /* Error message to return */
3850   char *aOp;                  /* Operators for the virtual machine */
3851   int *aArg;                  /* Arguments to each operator */
3852   unsigned (*xNextChar)(ReInput*);  /* Next character function */
3853   unsigned char zInit[12];    /* Initial text to match */
3854   int nInit;                  /* Number of characters in zInit */
3855   unsigned nState;            /* Number of entries in aOp[] and aArg[] */
3856   unsigned nAlloc;            /* Slots allocated for aOp[] and aArg[] */
3857 };
3858 
3859 /* Add a state to the given state set if it is not already there */
3860 static void re_add_state(ReStateSet *pSet, int newState){
3861   unsigned i;
3862   for(i=0; i<pSet->nState; i++) if( pSet->aState[i]==newState ) return;
3863   pSet->aState[pSet->nState++] = (ReStateNumber)newState;
3864 }
3865 
3866 /* Extract the next unicode character from *pzIn and return it.  Advance
3867 ** *pzIn to the first byte past the end of the character returned.  To
3868 ** be clear:  this routine converts utf8 to unicode.  This routine is
3869 ** optimized for the common case where the next character is a single byte.
3870 */
3871 static unsigned re_next_char(ReInput *p){
3872   unsigned c;
3873   if( p->i>=p->mx ) return 0;
3874   c = p->z[p->i++];
3875   if( c>=0x80 ){
3876     if( (c&0xe0)==0xc0 && p->i<p->mx && (p->z[p->i]&0xc0)==0x80 ){
3877       c = (c&0x1f)<<6 | (p->z[p->i++]&0x3f);
3878       if( c<0x80 ) c = 0xfffd;
3879     }else if( (c&0xf0)==0xe0 && p->i+1<p->mx && (p->z[p->i]&0xc0)==0x80
3880            && (p->z[p->i+1]&0xc0)==0x80 ){
3881       c = (c&0x0f)<<12 | ((p->z[p->i]&0x3f)<<6) | (p->z[p->i+1]&0x3f);
3882       p->i += 2;
3883       if( c<=0x7ff || (c>=0xd800 && c<=0xdfff) ) c = 0xfffd;
3884     }else if( (c&0xf8)==0xf0 && p->i+3<p->mx && (p->z[p->i]&0xc0)==0x80
3885            && (p->z[p->i+1]&0xc0)==0x80 && (p->z[p->i+2]&0xc0)==0x80 ){
3886       c = (c&0x07)<<18 | ((p->z[p->i]&0x3f)<<12) | ((p->z[p->i+1]&0x3f)<<6)
3887                        | (p->z[p->i+2]&0x3f);
3888       p->i += 3;
3889       if( c<=0xffff || c>0x10ffff ) c = 0xfffd;
3890     }else{
3891       c = 0xfffd;
3892     }
3893   }
3894   return c;
3895 }
3896 static unsigned re_next_char_nocase(ReInput *p){
3897   unsigned c = re_next_char(p);
3898   if( c>='A' && c<='Z' ) c += 'a' - 'A';
3899   return c;
3900 }
3901 
3902 /* Return true if c is a perl "word" character:  [A-Za-z0-9_] */
3903 static int re_word_char(int c){
3904   return (c>='0' && c<='9') || (c>='a' && c<='z')
3905       || (c>='A' && c<='Z') || c=='_';
3906 }
3907 
3908 /* Return true if c is a "digit" character:  [0-9] */
3909 static int re_digit_char(int c){
3910   return (c>='0' && c<='9');
3911 }
3912 
3913 /* Return true if c is a perl "space" character:  [ \t\r\n\v\f] */
3914 static int re_space_char(int c){
3915   return c==' ' || c=='\t' || c=='\n' || c=='\r' || c=='\v' || c=='\f';
3916 }
3917 
3918 /* Run a compiled regular expression on the zero-terminated input
3919 ** string zIn[].  Return true on a match and false if there is no match.
3920 */
3921 static int re_match(ReCompiled *pRe, const unsigned char *zIn, int nIn){
3922   ReStateSet aStateSet[2], *pThis, *pNext;
3923   ReStateNumber aSpace[100];
3924   ReStateNumber *pToFree;
3925   unsigned int i = 0;
3926   unsigned int iSwap = 0;
3927   int c = RE_EOF+1;
3928   int cPrev = 0;
3929   int rc = 0;
3930   ReInput in;
3931 
3932   in.z = zIn;
3933   in.i = 0;
3934   in.mx = nIn>=0 ? nIn : (int)strlen((char const*)zIn);
3935 
3936   /* Look for the initial prefix match, if there is one. */
3937   if( pRe->nInit ){
3938     unsigned char x = pRe->zInit[0];
3939     while( in.i+pRe->nInit<=in.mx
3940      && (zIn[in.i]!=x ||
3941          strncmp((const char*)zIn+in.i, (const char*)pRe->zInit, pRe->nInit)!=0)
3942     ){
3943       in.i++;
3944     }
3945     if( in.i+pRe->nInit>in.mx ) return 0;
3946   }
3947 
3948   if( pRe->nState<=(sizeof(aSpace)/(sizeof(aSpace[0])*2)) ){
3949     pToFree = 0;
3950     aStateSet[0].aState = aSpace;
3951   }else{
3952     pToFree = sqlite3_malloc64( sizeof(ReStateNumber)*2*pRe->nState );
3953     if( pToFree==0 ) return -1;
3954     aStateSet[0].aState = pToFree;
3955   }
3956   aStateSet[1].aState = &aStateSet[0].aState[pRe->nState];
3957   pNext = &aStateSet[1];
3958   pNext->nState = 0;
3959   re_add_state(pNext, 0);
3960   while( c!=RE_EOF && pNext->nState>0 ){
3961     cPrev = c;
3962     c = pRe->xNextChar(&in);
3963     pThis = pNext;
3964     pNext = &aStateSet[iSwap];
3965     iSwap = 1 - iSwap;
3966     pNext->nState = 0;
3967     for(i=0; i<pThis->nState; i++){
3968       int x = pThis->aState[i];
3969       switch( pRe->aOp[x] ){
3970         case RE_OP_MATCH: {
3971           if( pRe->aArg[x]==c ) re_add_state(pNext, x+1);
3972           break;
3973         }
3974         case RE_OP_ANY: {
3975           if( c!=0 ) re_add_state(pNext, x+1);
3976           break;
3977         }
3978         case RE_OP_WORD: {
3979           if( re_word_char(c) ) re_add_state(pNext, x+1);
3980           break;
3981         }
3982         case RE_OP_NOTWORD: {
3983           if( !re_word_char(c) && c!=0 ) re_add_state(pNext, x+1);
3984           break;
3985         }
3986         case RE_OP_DIGIT: {
3987           if( re_digit_char(c) ) re_add_state(pNext, x+1);
3988           break;
3989         }
3990         case RE_OP_NOTDIGIT: {
3991           if( !re_digit_char(c) && c!=0 ) re_add_state(pNext, x+1);
3992           break;
3993         }
3994         case RE_OP_SPACE: {
3995           if( re_space_char(c) ) re_add_state(pNext, x+1);
3996           break;
3997         }
3998         case RE_OP_NOTSPACE: {
3999           if( !re_space_char(c) && c!=0 ) re_add_state(pNext, x+1);
4000           break;
4001         }
4002         case RE_OP_BOUNDARY: {
4003           if( re_word_char(c)!=re_word_char(cPrev) ) re_add_state(pThis, x+1);
4004           break;
4005         }
4006         case RE_OP_ANYSTAR: {
4007           re_add_state(pNext, x);
4008           re_add_state(pThis, x+1);
4009           break;
4010         }
4011         case RE_OP_FORK: {
4012           re_add_state(pThis, x+pRe->aArg[x]);
4013           re_add_state(pThis, x+1);
4014           break;
4015         }
4016         case RE_OP_GOTO: {
4017           re_add_state(pThis, x+pRe->aArg[x]);
4018           break;
4019         }
4020         case RE_OP_ACCEPT: {
4021           rc = 1;
4022           goto re_match_end;
4023         }
4024         case RE_OP_CC_EXC: {
4025           if( c==0 ) break;
4026           /* fall-through */ goto re_op_cc_inc;
4027         }
4028         case RE_OP_CC_INC: re_op_cc_inc: {
4029           int j = 1;
4030           int n = pRe->aArg[x];
4031           int hit = 0;
4032           for(j=1; j>0 && j<n; j++){
4033             if( pRe->aOp[x+j]==RE_OP_CC_VALUE ){
4034               if( pRe->aArg[x+j]==c ){
4035                 hit = 1;
4036                 j = -1;
4037               }
4038             }else{
4039               if( pRe->aArg[x+j]<=c && pRe->aArg[x+j+1]>=c ){
4040                 hit = 1;
4041                 j = -1;
4042               }else{
4043                 j++;
4044               }
4045             }
4046           }
4047           if( pRe->aOp[x]==RE_OP_CC_EXC ) hit = !hit;
4048           if( hit ) re_add_state(pNext, x+n);
4049           break;
4050         }
4051       }
4052     }
4053   }
4054   for(i=0; i<pNext->nState; i++){
4055     if( pRe->aOp[pNext->aState[i]]==RE_OP_ACCEPT ){ rc = 1; break; }
4056   }
4057 re_match_end:
4058   sqlite3_free(pToFree);
4059   return rc;
4060 }
4061 
4062 /* Resize the opcode and argument arrays for an RE under construction.
4063 */
4064 static int re_resize(ReCompiled *p, int N){
4065   char *aOp;
4066   int *aArg;
4067   aOp = sqlite3_realloc64(p->aOp, N*sizeof(p->aOp[0]));
4068   if( aOp==0 ) return 1;
4069   p->aOp = aOp;
4070   aArg = sqlite3_realloc64(p->aArg, N*sizeof(p->aArg[0]));
4071   if( aArg==0 ) return 1;
4072   p->aArg = aArg;
4073   p->nAlloc = N;
4074   return 0;
4075 }
4076 
4077 /* Insert a new opcode and argument into an RE under construction.  The
4078 ** insertion point is just prior to existing opcode iBefore.
4079 */
4080 static int re_insert(ReCompiled *p, int iBefore, int op, int arg){
4081   int i;
4082   if( p->nAlloc<=p->nState && re_resize(p, p->nAlloc*2) ) return 0;
4083   for(i=p->nState; i>iBefore; i--){
4084     p->aOp[i] = p->aOp[i-1];
4085     p->aArg[i] = p->aArg[i-1];
4086   }
4087   p->nState++;
4088   p->aOp[iBefore] = (char)op;
4089   p->aArg[iBefore] = arg;
4090   return iBefore;
4091 }
4092 
4093 /* Append a new opcode and argument to the end of the RE under construction.
4094 */
4095 static int re_append(ReCompiled *p, int op, int arg){
4096   return re_insert(p, p->nState, op, arg);
4097 }
4098 
4099 /* Make a copy of N opcodes starting at iStart onto the end of the RE
4100 ** under construction.
4101 */
4102 static void re_copy(ReCompiled *p, int iStart, int N){
4103   if( p->nState+N>=p->nAlloc && re_resize(p, p->nAlloc*2+N) ) return;
4104   memcpy(&p->aOp[p->nState], &p->aOp[iStart], N*sizeof(p->aOp[0]));
4105   memcpy(&p->aArg[p->nState], &p->aArg[iStart], N*sizeof(p->aArg[0]));
4106   p->nState += N;
4107 }
4108 
4109 /* Return true if c is a hexadecimal digit character:  [0-9a-fA-F]
4110 ** If c is a hex digit, also set *pV = (*pV)*16 + valueof(c).  If
4111 ** c is not a hex digit *pV is unchanged.
4112 */
4113 static int re_hex(int c, int *pV){
4114   if( c>='0' && c<='9' ){
4115     c -= '0';
4116   }else if( c>='a' && c<='f' ){
4117     c -= 'a' - 10;
4118   }else if( c>='A' && c<='F' ){
4119     c -= 'A' - 10;
4120   }else{
4121     return 0;
4122   }
4123   *pV = (*pV)*16 + (c & 0xff);
4124   return 1;
4125 }
4126 
4127 /* A backslash character has been seen, read the next character and
4128 ** return its interpretation.
4129 */
4130 static unsigned re_esc_char(ReCompiled *p){
4131   static const char zEsc[] = "afnrtv\\()*.+?[$^{|}]";
4132   static const char zTrans[] = "\a\f\n\r\t\v";
4133   int i, v = 0;
4134   char c;
4135   if( p->sIn.i>=p->sIn.mx ) return 0;
4136   c = p->sIn.z[p->sIn.i];
4137   if( c=='u' && p->sIn.i+4<p->sIn.mx ){
4138     const unsigned char *zIn = p->sIn.z + p->sIn.i;
4139     if( re_hex(zIn[1],&v)
4140      && re_hex(zIn[2],&v)
4141      && re_hex(zIn[3],&v)
4142      && re_hex(zIn[4],&v)
4143     ){
4144       p->sIn.i += 5;
4145       return v;
4146     }
4147   }
4148   if( c=='x' && p->sIn.i+2<p->sIn.mx ){
4149     const unsigned char *zIn = p->sIn.z + p->sIn.i;
4150     if( re_hex(zIn[1],&v)
4151      && re_hex(zIn[2],&v)
4152     ){
4153       p->sIn.i += 3;
4154       return v;
4155     }
4156   }
4157   for(i=0; zEsc[i] && zEsc[i]!=c; i++){}
4158   if( zEsc[i] ){
4159     if( i<6 ) c = zTrans[i];
4160     p->sIn.i++;
4161   }else{
4162     p->zErr = "unknown \\ escape";
4163   }
4164   return c;
4165 }
4166 
4167 /* Forward declaration */
4168 static const char *re_subcompile_string(ReCompiled*);
4169 
4170 /* Peek at the next byte of input */
4171 static unsigned char rePeek(ReCompiled *p){
4172   return p->sIn.i<p->sIn.mx ? p->sIn.z[p->sIn.i] : 0;
4173 }
4174 
4175 /* Compile RE text into a sequence of opcodes.  Continue up to the
4176 ** first unmatched ")" character, then return.  If an error is found,
4177 ** return a pointer to the error message string.
4178 */
4179 static const char *re_subcompile_re(ReCompiled *p){
4180   const char *zErr;
4181   int iStart, iEnd, iGoto;
4182   iStart = p->nState;
4183   zErr = re_subcompile_string(p);
4184   if( zErr ) return zErr;
4185   while( rePeek(p)=='|' ){
4186     iEnd = p->nState;
4187     re_insert(p, iStart, RE_OP_FORK, iEnd + 2 - iStart);
4188     iGoto = re_append(p, RE_OP_GOTO, 0);
4189     p->sIn.i++;
4190     zErr = re_subcompile_string(p);
4191     if( zErr ) return zErr;
4192     p->aArg[iGoto] = p->nState - iGoto;
4193   }
4194   return 0;
4195 }
4196 
4197 /* Compile an element of regular expression text (anything that can be
4198 ** an operand to the "|" operator).  Return NULL on success or a pointer
4199 ** to the error message if there is a problem.
4200 */
4201 static const char *re_subcompile_string(ReCompiled *p){
4202   int iPrev = -1;
4203   int iStart;
4204   unsigned c;
4205   const char *zErr;
4206   while( (c = p->xNextChar(&p->sIn))!=0 ){
4207     iStart = p->nState;
4208     switch( c ){
4209       case '|':
4210       case '$':
4211       case ')': {
4212         p->sIn.i--;
4213         return 0;
4214       }
4215       case '(': {
4216         zErr = re_subcompile_re(p);
4217         if( zErr ) return zErr;
4218         if( rePeek(p)!=')' ) return "unmatched '('";
4219         p->sIn.i++;
4220         break;
4221       }
4222       case '.': {
4223         if( rePeek(p)=='*' ){
4224           re_append(p, RE_OP_ANYSTAR, 0);
4225           p->sIn.i++;
4226         }else{
4227           re_append(p, RE_OP_ANY, 0);
4228         }
4229         break;
4230       }
4231       case '*': {
4232         if( iPrev<0 ) return "'*' without operand";
4233         re_insert(p, iPrev, RE_OP_GOTO, p->nState - iPrev + 1);
4234         re_append(p, RE_OP_FORK, iPrev - p->nState + 1);
4235         break;
4236       }
4237       case '+': {
4238         if( iPrev<0 ) return "'+' without operand";
4239         re_append(p, RE_OP_FORK, iPrev - p->nState);
4240         break;
4241       }
4242       case '?': {
4243         if( iPrev<0 ) return "'?' without operand";
4244         re_insert(p, iPrev, RE_OP_FORK, p->nState - iPrev+1);
4245         break;
4246       }
4247       case '{': {
4248         int m = 0, n = 0;
4249         int sz, j;
4250         if( iPrev<0 ) return "'{m,n}' without operand";
4251         while( (c=rePeek(p))>='0' && c<='9' ){ m = m*10 + c - '0'; p->sIn.i++; }
4252         n = m;
4253         if( c==',' ){
4254           p->sIn.i++;
4255           n = 0;
4256           while( (c=rePeek(p))>='0' && c<='9' ){ n = n*10 + c-'0'; p->sIn.i++; }
4257         }
4258         if( c!='}' ) return "unmatched '{'";
4259         if( n>0 && n<m ) return "n less than m in '{m,n}'";
4260         p->sIn.i++;
4261         sz = p->nState - iPrev;
4262         if( m==0 ){
4263           if( n==0 ) return "both m and n are zero in '{m,n}'";
4264           re_insert(p, iPrev, RE_OP_FORK, sz+1);
4265           n--;
4266         }else{
4267           for(j=1; j<m; j++) re_copy(p, iPrev, sz);
4268         }
4269         for(j=m; j<n; j++){
4270           re_append(p, RE_OP_FORK, sz+1);
4271           re_copy(p, iPrev, sz);
4272         }
4273         if( n==0 && m>0 ){
4274           re_append(p, RE_OP_FORK, -sz);
4275         }
4276         break;
4277       }
4278       case '[': {
4279         int iFirst = p->nState;
4280         if( rePeek(p)=='^' ){
4281           re_append(p, RE_OP_CC_EXC, 0);
4282           p->sIn.i++;
4283         }else{
4284           re_append(p, RE_OP_CC_INC, 0);
4285         }
4286         while( (c = p->xNextChar(&p->sIn))!=0 ){
4287           if( c=='[' && rePeek(p)==':' ){
4288             return "POSIX character classes not supported";
4289           }
4290           if( c=='\\' ) c = re_esc_char(p);
4291           if( rePeek(p)=='-' ){
4292             re_append(p, RE_OP_CC_RANGE, c);
4293             p->sIn.i++;
4294             c = p->xNextChar(&p->sIn);
4295             if( c=='\\' ) c = re_esc_char(p);
4296             re_append(p, RE_OP_CC_RANGE, c);
4297           }else{
4298             re_append(p, RE_OP_CC_VALUE, c);
4299           }
4300           if( rePeek(p)==']' ){ p->sIn.i++; break; }
4301         }
4302         if( c==0 ) return "unclosed '['";
4303         p->aArg[iFirst] = p->nState - iFirst;
4304         break;
4305       }
4306       case '\\': {
4307         int specialOp = 0;
4308         switch( rePeek(p) ){
4309           case 'b': specialOp = RE_OP_BOUNDARY;   break;
4310           case 'd': specialOp = RE_OP_DIGIT;      break;
4311           case 'D': specialOp = RE_OP_NOTDIGIT;   break;
4312           case 's': specialOp = RE_OP_SPACE;      break;
4313           case 'S': specialOp = RE_OP_NOTSPACE;   break;
4314           case 'w': specialOp = RE_OP_WORD;       break;
4315           case 'W': specialOp = RE_OP_NOTWORD;    break;
4316         }
4317         if( specialOp ){
4318           p->sIn.i++;
4319           re_append(p, specialOp, 0);
4320         }else{
4321           c = re_esc_char(p);
4322           re_append(p, RE_OP_MATCH, c);
4323         }
4324         break;
4325       }
4326       default: {
4327         re_append(p, RE_OP_MATCH, c);
4328         break;
4329       }
4330     }
4331     iPrev = iStart;
4332   }
4333   return 0;
4334 }
4335 
4336 /* Free and reclaim all the memory used by a previously compiled
4337 ** regular expression.  Applications should invoke this routine once
4338 ** for every call to re_compile() to avoid memory leaks.
4339 */
4340 static void re_free(ReCompiled *pRe){
4341   if( pRe ){
4342     sqlite3_free(pRe->aOp);
4343     sqlite3_free(pRe->aArg);
4344     sqlite3_free(pRe);
4345   }
4346 }
4347 
4348 /*
4349 ** Compile a textual regular expression in zIn[] into a compiled regular
4350 ** expression suitable for us by re_match() and return a pointer to the
4351 ** compiled regular expression in *ppRe.  Return NULL on success or an
4352 ** error message if something goes wrong.
4353 */
4354 static const char *re_compile(ReCompiled **ppRe, const char *zIn, int noCase){
4355   ReCompiled *pRe;
4356   const char *zErr;
4357   int i, j;
4358 
4359   *ppRe = 0;
4360   pRe = sqlite3_malloc( sizeof(*pRe) );
4361   if( pRe==0 ){
4362     return "out of memory";
4363   }
4364   memset(pRe, 0, sizeof(*pRe));
4365   pRe->xNextChar = noCase ? re_next_char_nocase : re_next_char;
4366   if( re_resize(pRe, 30) ){
4367     re_free(pRe);
4368     return "out of memory";
4369   }
4370   if( zIn[0]=='^' ){
4371     zIn++;
4372   }else{
4373     re_append(pRe, RE_OP_ANYSTAR, 0);
4374   }
4375   pRe->sIn.z = (unsigned char*)zIn;
4376   pRe->sIn.i = 0;
4377   pRe->sIn.mx = (int)strlen(zIn);
4378   zErr = re_subcompile_re(pRe);
4379   if( zErr ){
4380     re_free(pRe);
4381     return zErr;
4382   }
4383   if( rePeek(pRe)=='$' && pRe->sIn.i+1>=pRe->sIn.mx ){
4384     re_append(pRe, RE_OP_MATCH, RE_EOF);
4385     re_append(pRe, RE_OP_ACCEPT, 0);
4386     *ppRe = pRe;
4387   }else if( pRe->sIn.i>=pRe->sIn.mx ){
4388     re_append(pRe, RE_OP_ACCEPT, 0);
4389     *ppRe = pRe;
4390   }else{
4391     re_free(pRe);
4392     return "unrecognized character";
4393   }
4394 
4395   /* The following is a performance optimization.  If the regex begins with
4396   ** ".*" (if the input regex lacks an initial "^") and afterwards there are
4397   ** one or more matching characters, enter those matching characters into
4398   ** zInit[].  The re_match() routine can then search ahead in the input
4399   ** string looking for the initial match without having to run the whole
4400   ** regex engine over the string.  Do not worry able trying to match
4401   ** unicode characters beyond plane 0 - those are very rare and this is
4402   ** just an optimization. */
4403   if( pRe->aOp[0]==RE_OP_ANYSTAR && !noCase ){
4404     for(j=0, i=1; j<(int)sizeof(pRe->zInit)-2 && pRe->aOp[i]==RE_OP_MATCH; i++){
4405       unsigned x = pRe->aArg[i];
4406       if( x<=127 ){
4407         pRe->zInit[j++] = (unsigned char)x;
4408       }else if( x<=0xfff ){
4409         pRe->zInit[j++] = (unsigned char)(0xc0 | (x>>6));
4410         pRe->zInit[j++] = 0x80 | (x&0x3f);
4411       }else if( x<=0xffff ){
4412         pRe->zInit[j++] = (unsigned char)(0xe0 | (x>>12));
4413         pRe->zInit[j++] = 0x80 | ((x>>6)&0x3f);
4414         pRe->zInit[j++] = 0x80 | (x&0x3f);
4415       }else{
4416         break;
4417       }
4418     }
4419     if( j>0 && pRe->zInit[j-1]==0 ) j--;
4420     pRe->nInit = j;
4421   }
4422   return pRe->zErr;
4423 }
4424 
4425 /*
4426 ** Implementation of the regexp() SQL function.  This function implements
4427 ** the build-in REGEXP operator.  The first argument to the function is the
4428 ** pattern and the second argument is the string.  So, the SQL statements:
4429 **
4430 **       A REGEXP B
4431 **
4432 ** is implemented as regexp(B,A).
4433 */
4434 static void re_sql_func(
4435   sqlite3_context *context,
4436   int argc,
4437   sqlite3_value **argv
4438 ){
4439   ReCompiled *pRe;          /* Compiled regular expression */
4440   const char *zPattern;     /* The regular expression */
4441   const unsigned char *zStr;/* String being searched */
4442   const char *zErr;         /* Compile error message */
4443   int setAux = 0;           /* True to invoke sqlite3_set_auxdata() */
4444 
4445   (void)argc;  /* Unused */
4446   pRe = sqlite3_get_auxdata(context, 0);
4447   if( pRe==0 ){
4448     zPattern = (const char*)sqlite3_value_text(argv[0]);
4449     if( zPattern==0 ) return;
4450     zErr = re_compile(&pRe, zPattern, sqlite3_user_data(context)!=0);
4451     if( zErr ){
4452       re_free(pRe);
4453       sqlite3_result_error(context, zErr, -1);
4454       return;
4455     }
4456     if( pRe==0 ){
4457       sqlite3_result_error_nomem(context);
4458       return;
4459     }
4460     setAux = 1;
4461   }
4462   zStr = (const unsigned char*)sqlite3_value_text(argv[1]);
4463   if( zStr!=0 ){
4464     sqlite3_result_int(context, re_match(pRe, zStr, -1));
4465   }
4466   if( setAux ){
4467     sqlite3_set_auxdata(context, 0, pRe, (void(*)(void*))re_free);
4468   }
4469 }
4470 
4471 /*
4472 ** Invoke this routine to register the regexp() function with the
4473 ** SQLite database connection.
4474 */
4475 #ifdef _WIN32
4476 
4477 #endif
4478 int sqlite3_regexp_init(
4479   sqlite3 *db,
4480   char **pzErrMsg,
4481   const sqlite3_api_routines *pApi
4482 ){
4483   int rc = SQLITE_OK;
4484   SQLITE_EXTENSION_INIT2(pApi);
4485   (void)pzErrMsg;  /* Unused */
4486   rc = sqlite3_create_function(db, "regexp", 2,
4487                             SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC,
4488                             0, re_sql_func, 0, 0);
4489   if( rc==SQLITE_OK ){
4490     /* The regexpi(PATTERN,STRING) function is a case-insensitive version
4491     ** of regexp(PATTERN,STRING). */
4492     rc = sqlite3_create_function(db, "regexpi", 2,
4493                             SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC,
4494                             (void*)db, re_sql_func, 0, 0);
4495   }
4496   return rc;
4497 }
4498 
4499 /************************* End ../ext/misc/regexp.c ********************/
4500 #ifndef SQLITE_SHELL_WASM_MODE
4501 /************************* Begin ../ext/misc/fileio.c ******************/
4502 /*
4503 ** 2014-06-13
4504 **
4505 ** The author disclaims copyright to this source code.  In place of
4506 ** a legal notice, here is a blessing:
4507 **
4508 **    May you do good and not evil.
4509 **    May you find forgiveness for yourself and forgive others.
4510 **    May you share freely, never taking more than you give.
4511 **
4512 ******************************************************************************
4513 **
4514 ** This SQLite extension implements SQL functions readfile() and
4515 ** writefile(), and eponymous virtual type "fsdir".
4516 **
4517 ** WRITEFILE(FILE, DATA [, MODE [, MTIME]]):
4518 **
4519 **   If neither of the optional arguments is present, then this UDF
4520 **   function writes blob DATA to file FILE. If successful, the number
4521 **   of bytes written is returned. If an error occurs, NULL is returned.
4522 **
4523 **   If the first option argument - MODE - is present, then it must
4524 **   be passed an integer value that corresponds to a POSIX mode
4525 **   value (file type + permissions, as returned in the stat.st_mode
4526 **   field by the stat() system call). Three types of files may
4527 **   be written/created:
4528 **
4529 **     regular files:  (mode & 0170000)==0100000
4530 **     symbolic links: (mode & 0170000)==0120000
4531 **     directories:    (mode & 0170000)==0040000
4532 **
4533 **   For a directory, the DATA is ignored. For a symbolic link, it is
4534 **   interpreted as text and used as the target of the link. For a
4535 **   regular file, it is interpreted as a blob and written into the
4536 **   named file. Regardless of the type of file, its permissions are
4537 **   set to (mode & 0777) before returning.
4538 **
4539 **   If the optional MTIME argument is present, then it is interpreted
4540 **   as an integer - the number of seconds since the unix epoch. The
4541 **   modification-time of the target file is set to this value before
4542 **   returning.
4543 **
4544 **   If three or more arguments are passed to this function and an
4545 **   error is encountered, an exception is raised.
4546 **
4547 ** READFILE(FILE):
4548 **
4549 **   Read and return the contents of file FILE (type blob) from disk.
4550 **
4551 ** FSDIR:
4552 **
4553 **   Used as follows:
4554 **
4555 **     SELECT * FROM fsdir($path [, $dir]);
4556 **
4557 **   Parameter $path is an absolute or relative pathname. If the file that it
4558 **   refers to does not exist, it is an error. If the path refers to a regular
4559 **   file or symbolic link, it returns a single row. Or, if the path refers
4560 **   to a directory, it returns one row for the directory, and one row for each
4561 **   file within the hierarchy rooted at $path.
4562 **
4563 **   Each row has the following columns:
4564 **
4565 **     name:  Path to file or directory (text value).
4566 **     mode:  Value of stat.st_mode for directory entry (an integer).
4567 **     mtime: Value of stat.st_mtime for directory entry (an integer).
4568 **     data:  For a regular file, a blob containing the file data. For a
4569 **            symlink, a text value containing the text of the link. For a
4570 **            directory, NULL.
4571 **
4572 **   If a non-NULL value is specified for the optional $dir parameter and
4573 **   $path is a relative path, then $path is interpreted relative to $dir.
4574 **   And the paths returned in the "name" column of the table are also
4575 **   relative to directory $dir.
4576 **
4577 ** Notes on building this extension for Windows:
4578 **   Unless linked statically with the SQLite library, a preprocessor
4579 **   symbol, FILEIO_WIN32_DLL, must be #define'd to create a stand-alone
4580 **   DLL form of this extension for WIN32. See its use below for details.
4581 */
4582 /* #include "sqlite3ext.h" */
4583 SQLITE_EXTENSION_INIT1
4584 #include <stdio.h>
4585 #include <string.h>
4586 #include <assert.h>
4587 
4588 #include <sys/types.h>
4589 #include <sys/stat.h>
4590 #include <fcntl.h>
4591 #if !defined(_WIN32) && !defined(WIN32)
4592 #  include <unistd.h>
4593 #  include <dirent.h>
4594 #  include <utime.h>
4595 #  include <sys/time.h>
4596 #else
4597 #  include "windows.h"
4598 #  include <io.h>
4599 #  include <direct.h>
4600 /* #  include "test_windirent.h" */
4601 #  define dirent DIRENT
4602 #  ifndef chmod
4603 #    define chmod _chmod
4604 #  endif
4605 #  ifndef stat
4606 #    define stat _stat
4607 #  endif
4608 #  define mkdir(path,mode) _mkdir(path)
4609 #  define lstat(path,buf) stat(path,buf)
4610 #endif
4611 #include <time.h>
4612 #include <errno.h>
4613 
4614 
4615 /*
4616 ** Structure of the fsdir() table-valued function
4617 */
4618                  /*    0    1    2     3    4           5             */
4619 #define FSDIR_SCHEMA "(name,mode,mtime,data,path HIDDEN,dir HIDDEN)"
4620 #define FSDIR_COLUMN_NAME     0     /* Name of the file */
4621 #define FSDIR_COLUMN_MODE     1     /* Access mode */
4622 #define FSDIR_COLUMN_MTIME    2     /* Last modification time */
4623 #define FSDIR_COLUMN_DATA     3     /* File content */
4624 #define FSDIR_COLUMN_PATH     4     /* Path to top of search */
4625 #define FSDIR_COLUMN_DIR      5     /* Path is relative to this directory */
4626 
4627 
4628 /*
4629 ** Set the result stored by context ctx to a blob containing the
4630 ** contents of file zName.  Or, leave the result unchanged (NULL)
4631 ** if the file does not exist or is unreadable.
4632 **
4633 ** If the file exceeds the SQLite blob size limit, through an
4634 ** SQLITE_TOOBIG error.
4635 **
4636 ** Throw an SQLITE_IOERR if there are difficulties pulling the file
4637 ** off of disk.
4638 */
4639 static void readFileContents(sqlite3_context *ctx, const char *zName){
4640   FILE *in;
4641   sqlite3_int64 nIn;
4642   void *pBuf;
4643   sqlite3 *db;
4644   int mxBlob;
4645 
4646   in = fopen(zName, "rb");
4647   if( in==0 ){
4648     /* File does not exist or is unreadable. Leave the result set to NULL. */
4649     return;
4650   }
4651   fseek(in, 0, SEEK_END);
4652   nIn = ftell(in);
4653   rewind(in);
4654   db = sqlite3_context_db_handle(ctx);
4655   mxBlob = sqlite3_limit(db, SQLITE_LIMIT_LENGTH, -1);
4656   if( nIn>mxBlob ){
4657     sqlite3_result_error_code(ctx, SQLITE_TOOBIG);
4658     fclose(in);
4659     return;
4660   }
4661   pBuf = sqlite3_malloc64( nIn ? nIn : 1 );
4662   if( pBuf==0 ){
4663     sqlite3_result_error_nomem(ctx);
4664     fclose(in);
4665     return;
4666   }
4667   if( nIn==(sqlite3_int64)fread(pBuf, 1, (size_t)nIn, in) ){
4668     sqlite3_result_blob64(ctx, pBuf, nIn, sqlite3_free);
4669   }else{
4670     sqlite3_result_error_code(ctx, SQLITE_IOERR);
4671     sqlite3_free(pBuf);
4672   }
4673   fclose(in);
4674 }
4675 
4676 /*
4677 ** Implementation of the "readfile(X)" SQL function.  The entire content
4678 ** of the file named X is read and returned as a BLOB.  NULL is returned
4679 ** if the file does not exist or is unreadable.
4680 */
4681 static void readfileFunc(
4682   sqlite3_context *context,
4683   int argc,
4684   sqlite3_value **argv
4685 ){
4686   const char *zName;
4687   (void)(argc);  /* Unused parameter */
4688   zName = (const char*)sqlite3_value_text(argv[0]);
4689   if( zName==0 ) return;
4690   readFileContents(context, zName);
4691 }
4692 
4693 /*
4694 ** Set the error message contained in context ctx to the results of
4695 ** vprintf(zFmt, ...).
4696 */
4697 static void ctxErrorMsg(sqlite3_context *ctx, const char *zFmt, ...){
4698   char *zMsg = 0;
4699   va_list ap;
4700   va_start(ap, zFmt);
4701   zMsg = sqlite3_vmprintf(zFmt, ap);
4702   sqlite3_result_error(ctx, zMsg, -1);
4703   sqlite3_free(zMsg);
4704   va_end(ap);
4705 }
4706 
4707 #if defined(_WIN32)
4708 /*
4709 ** This function is designed to convert a Win32 FILETIME structure into the
4710 ** number of seconds since the Unix Epoch (1970-01-01 00:00:00 UTC).
4711 */
4712 static sqlite3_uint64 fileTimeToUnixTime(
4713   LPFILETIME pFileTime
4714 ){
4715   SYSTEMTIME epochSystemTime;
4716   ULARGE_INTEGER epochIntervals;
4717   FILETIME epochFileTime;
4718   ULARGE_INTEGER fileIntervals;
4719 
4720   memset(&epochSystemTime, 0, sizeof(SYSTEMTIME));
4721   epochSystemTime.wYear = 1970;
4722   epochSystemTime.wMonth = 1;
4723   epochSystemTime.wDay = 1;
4724   SystemTimeToFileTime(&epochSystemTime, &epochFileTime);
4725   epochIntervals.LowPart = epochFileTime.dwLowDateTime;
4726   epochIntervals.HighPart = epochFileTime.dwHighDateTime;
4727 
4728   fileIntervals.LowPart = pFileTime->dwLowDateTime;
4729   fileIntervals.HighPart = pFileTime->dwHighDateTime;
4730 
4731   return (fileIntervals.QuadPart - epochIntervals.QuadPart) / 10000000;
4732 }
4733 
4734 
4735 #if defined(FILEIO_WIN32_DLL) && (defined(_WIN32) || defined(WIN32))
4736 #  /* To allow a standalone DLL, use this next replacement function: */
4737 #  undef sqlite3_win32_utf8_to_unicode
4738 #  define sqlite3_win32_utf8_to_unicode utf8_to_utf16
4739 #
4740 LPWSTR utf8_to_utf16(const char *z){
4741   int nAllot = MultiByteToWideChar(CP_UTF8, 0, z, -1, NULL, 0);
4742   LPWSTR rv = sqlite3_malloc(nAllot * sizeof(WCHAR));
4743   if( rv!=0 && 0 < MultiByteToWideChar(CP_UTF8, 0, z, -1, rv, nAllot) )
4744     return rv;
4745   sqlite3_free(rv);
4746   return 0;
4747 }
4748 #endif
4749 
4750 /*
4751 ** This function attempts to normalize the time values found in the stat()
4752 ** buffer to UTC.  This is necessary on Win32, where the runtime library
4753 ** appears to return these values as local times.
4754 */
4755 static void statTimesToUtc(
4756   const char *zPath,
4757   struct stat *pStatBuf
4758 ){
4759   HANDLE hFindFile;
4760   WIN32_FIND_DATAW fd;
4761   LPWSTR zUnicodeName;
4762   extern LPWSTR sqlite3_win32_utf8_to_unicode(const char*);
4763   zUnicodeName = sqlite3_win32_utf8_to_unicode(zPath);
4764   if( zUnicodeName ){
4765     memset(&fd, 0, sizeof(WIN32_FIND_DATAW));
4766     hFindFile = FindFirstFileW(zUnicodeName, &fd);
4767     if( hFindFile!=NULL ){
4768       pStatBuf->st_ctime = (time_t)fileTimeToUnixTime(&fd.ftCreationTime);
4769       pStatBuf->st_atime = (time_t)fileTimeToUnixTime(&fd.ftLastAccessTime);
4770       pStatBuf->st_mtime = (time_t)fileTimeToUnixTime(&fd.ftLastWriteTime);
4771       FindClose(hFindFile);
4772     }
4773     sqlite3_free(zUnicodeName);
4774   }
4775 }
4776 #endif
4777 
4778 /*
4779 ** This function is used in place of stat().  On Windows, special handling
4780 ** is required in order for the included time to be returned as UTC.  On all
4781 ** other systems, this function simply calls stat().
4782 */
4783 static int fileStat(
4784   const char *zPath,
4785   struct stat *pStatBuf
4786 ){
4787 #if defined(_WIN32)
4788   int rc = stat(zPath, pStatBuf);
4789   if( rc==0 ) statTimesToUtc(zPath, pStatBuf);
4790   return rc;
4791 #else
4792   return stat(zPath, pStatBuf);
4793 #endif
4794 }
4795 
4796 /*
4797 ** This function is used in place of lstat().  On Windows, special handling
4798 ** is required in order for the included time to be returned as UTC.  On all
4799 ** other systems, this function simply calls lstat().
4800 */
4801 static int fileLinkStat(
4802   const char *zPath,
4803   struct stat *pStatBuf
4804 ){
4805 #if defined(_WIN32)
4806   int rc = lstat(zPath, pStatBuf);
4807   if( rc==0 ) statTimesToUtc(zPath, pStatBuf);
4808   return rc;
4809 #else
4810   return lstat(zPath, pStatBuf);
4811 #endif
4812 }
4813 
4814 /*
4815 ** Argument zFile is the name of a file that will be created and/or written
4816 ** by SQL function writefile(). This function ensures that the directory
4817 ** zFile will be written to exists, creating it if required. The permissions
4818 ** for any path components created by this function are set in accordance
4819 ** with the current umask.
4820 **
4821 ** If an OOM condition is encountered, SQLITE_NOMEM is returned. Otherwise,
4822 ** SQLITE_OK is returned if the directory is successfully created, or
4823 ** SQLITE_ERROR otherwise.
4824 */
4825 static int makeDirectory(
4826   const char *zFile
4827 ){
4828   char *zCopy = sqlite3_mprintf("%s", zFile);
4829   int rc = SQLITE_OK;
4830 
4831   if( zCopy==0 ){
4832     rc = SQLITE_NOMEM;
4833   }else{
4834     int nCopy = (int)strlen(zCopy);
4835     int i = 1;
4836 
4837     while( rc==SQLITE_OK ){
4838       struct stat sStat;
4839       int rc2;
4840 
4841       for(; zCopy[i]!='/' && i<nCopy; i++);
4842       if( i==nCopy ) break;
4843       zCopy[i] = '\0';
4844 
4845       rc2 = fileStat(zCopy, &sStat);
4846       if( rc2!=0 ){
4847         if( mkdir(zCopy, 0777) ) rc = SQLITE_ERROR;
4848       }else{
4849         if( !S_ISDIR(sStat.st_mode) ) rc = SQLITE_ERROR;
4850       }
4851       zCopy[i] = '/';
4852       i++;
4853     }
4854 
4855     sqlite3_free(zCopy);
4856   }
4857 
4858   return rc;
4859 }
4860 
4861 /*
4862 ** This function does the work for the writefile() UDF. Refer to
4863 ** header comments at the top of this file for details.
4864 */
4865 static int writeFile(
4866   sqlite3_context *pCtx,          /* Context to return bytes written in */
4867   const char *zFile,              /* File to write */
4868   sqlite3_value *pData,           /* Data to write */
4869   mode_t mode,                    /* MODE parameter passed to writefile() */
4870   sqlite3_int64 mtime             /* MTIME parameter (or -1 to not set time) */
4871 ){
4872   if( zFile==0 ) return 1;
4873 #if !defined(_WIN32) && !defined(WIN32)
4874   if( S_ISLNK(mode) ){
4875     const char *zTo = (const char*)sqlite3_value_text(pData);
4876     if( zTo==0 || symlink(zTo, zFile)<0 ) return 1;
4877   }else
4878 #endif
4879   {
4880     if( S_ISDIR(mode) ){
4881       if( mkdir(zFile, mode) ){
4882         /* The mkdir() call to create the directory failed. This might not
4883         ** be an error though - if there is already a directory at the same
4884         ** path and either the permissions already match or can be changed
4885         ** to do so using chmod(), it is not an error.  */
4886         struct stat sStat;
4887         if( errno!=EEXIST
4888          || 0!=fileStat(zFile, &sStat)
4889          || !S_ISDIR(sStat.st_mode)
4890          || ((sStat.st_mode&0777)!=(mode&0777) && 0!=chmod(zFile, mode&0777))
4891         ){
4892           return 1;
4893         }
4894       }
4895     }else{
4896       sqlite3_int64 nWrite = 0;
4897       const char *z;
4898       int rc = 0;
4899       FILE *out = fopen(zFile, "wb");
4900       if( out==0 ) return 1;
4901       z = (const char*)sqlite3_value_blob(pData);
4902       if( z ){
4903         sqlite3_int64 n = fwrite(z, 1, sqlite3_value_bytes(pData), out);
4904         nWrite = sqlite3_value_bytes(pData);
4905         if( nWrite!=n ){
4906           rc = 1;
4907         }
4908       }
4909       fclose(out);
4910       if( rc==0 && mode && chmod(zFile, mode & 0777) ){
4911         rc = 1;
4912       }
4913       if( rc ) return 2;
4914       sqlite3_result_int64(pCtx, nWrite);
4915     }
4916   }
4917 
4918   if( mtime>=0 ){
4919 #if defined(_WIN32)
4920 #if !SQLITE_OS_WINRT
4921     /* Windows */
4922     FILETIME lastAccess;
4923     FILETIME lastWrite;
4924     SYSTEMTIME currentTime;
4925     LONGLONG intervals;
4926     HANDLE hFile;
4927     LPWSTR zUnicodeName;
4928     extern LPWSTR sqlite3_win32_utf8_to_unicode(const char*);
4929 
4930     GetSystemTime(&currentTime);
4931     SystemTimeToFileTime(&currentTime, &lastAccess);
4932     intervals = Int32x32To64(mtime, 10000000) + 116444736000000000;
4933     lastWrite.dwLowDateTime = (DWORD)intervals;
4934     lastWrite.dwHighDateTime = intervals >> 32;
4935     zUnicodeName = sqlite3_win32_utf8_to_unicode(zFile);
4936     if( zUnicodeName==0 ){
4937       return 1;
4938     }
4939     hFile = CreateFileW(
4940       zUnicodeName, FILE_WRITE_ATTRIBUTES, 0, NULL, OPEN_EXISTING,
4941       FILE_FLAG_BACKUP_SEMANTICS, NULL
4942     );
4943     sqlite3_free(zUnicodeName);
4944     if( hFile!=INVALID_HANDLE_VALUE ){
4945       BOOL bResult = SetFileTime(hFile, NULL, &lastAccess, &lastWrite);
4946       CloseHandle(hFile);
4947       return !bResult;
4948     }else{
4949       return 1;
4950     }
4951 #endif
4952 #elif defined(AT_FDCWD) && 0 /* utimensat() is not universally available */
4953     /* Recent unix */
4954     struct timespec times[2];
4955     times[0].tv_nsec = times[1].tv_nsec = 0;
4956     times[0].tv_sec = time(0);
4957     times[1].tv_sec = mtime;
4958     if( utimensat(AT_FDCWD, zFile, times, AT_SYMLINK_NOFOLLOW) ){
4959       return 1;
4960     }
4961 #else
4962     /* Legacy unix */
4963     struct timeval times[2];
4964     times[0].tv_usec = times[1].tv_usec = 0;
4965     times[0].tv_sec = time(0);
4966     times[1].tv_sec = mtime;
4967     if( utimes(zFile, times) ){
4968       return 1;
4969     }
4970 #endif
4971   }
4972 
4973   return 0;
4974 }
4975 
4976 /*
4977 ** Implementation of the "writefile(W,X[,Y[,Z]]])" SQL function.
4978 ** Refer to header comments at the top of this file for details.
4979 */
4980 static void writefileFunc(
4981   sqlite3_context *context,
4982   int argc,
4983   sqlite3_value **argv
4984 ){
4985   const char *zFile;
4986   mode_t mode = 0;
4987   int res;
4988   sqlite3_int64 mtime = -1;
4989 
4990   if( argc<2 || argc>4 ){
4991     sqlite3_result_error(context,
4992         "wrong number of arguments to function writefile()", -1
4993     );
4994     return;
4995   }
4996 
4997   zFile = (const char*)sqlite3_value_text(argv[0]);
4998   if( zFile==0 ) return;
4999   if( argc>=3 ){
5000     mode = (mode_t)sqlite3_value_int(argv[2]);
5001   }
5002   if( argc==4 ){
5003     mtime = sqlite3_value_int64(argv[3]);
5004   }
5005 
5006   res = writeFile(context, zFile, argv[1], mode, mtime);
5007   if( res==1 && errno==ENOENT ){
5008     if( makeDirectory(zFile)==SQLITE_OK ){
5009       res = writeFile(context, zFile, argv[1], mode, mtime);
5010     }
5011   }
5012 
5013   if( argc>2 && res!=0 ){
5014     if( S_ISLNK(mode) ){
5015       ctxErrorMsg(context, "failed to create symlink: %s", zFile);
5016     }else if( S_ISDIR(mode) ){
5017       ctxErrorMsg(context, "failed to create directory: %s", zFile);
5018     }else{
5019       ctxErrorMsg(context, "failed to write file: %s", zFile);
5020     }
5021   }
5022 }
5023 
5024 /*
5025 ** SQL function:   lsmode(MODE)
5026 **
5027 ** Given a numberic st_mode from stat(), convert it into a human-readable
5028 ** text string in the style of "ls -l".
5029 */
5030 static void lsModeFunc(
5031   sqlite3_context *context,
5032   int argc,
5033   sqlite3_value **argv
5034 ){
5035   int i;
5036   int iMode = sqlite3_value_int(argv[0]);
5037   char z[16];
5038   (void)argc;
5039   if( S_ISLNK(iMode) ){
5040     z[0] = 'l';
5041   }else if( S_ISREG(iMode) ){
5042     z[0] = '-';
5043   }else if( S_ISDIR(iMode) ){
5044     z[0] = 'd';
5045   }else{
5046     z[0] = '?';
5047   }
5048   for(i=0; i<3; i++){
5049     int m = (iMode >> ((2-i)*3));
5050     char *a = &z[1 + i*3];
5051     a[0] = (m & 0x4) ? 'r' : '-';
5052     a[1] = (m & 0x2) ? 'w' : '-';
5053     a[2] = (m & 0x1) ? 'x' : '-';
5054   }
5055   z[10] = '\0';
5056   sqlite3_result_text(context, z, -1, SQLITE_TRANSIENT);
5057 }
5058 
5059 #ifndef SQLITE_OMIT_VIRTUALTABLE
5060 
5061 /*
5062 ** Cursor type for recursively iterating through a directory structure.
5063 */
5064 typedef struct fsdir_cursor fsdir_cursor;
5065 typedef struct FsdirLevel FsdirLevel;
5066 
5067 struct FsdirLevel {
5068   DIR *pDir;                 /* From opendir() */
5069   char *zDir;                /* Name of directory (nul-terminated) */
5070 };
5071 
5072 struct fsdir_cursor {
5073   sqlite3_vtab_cursor base;  /* Base class - must be first */
5074 
5075   int nLvl;                  /* Number of entries in aLvl[] array */
5076   int iLvl;                  /* Index of current entry */
5077   FsdirLevel *aLvl;          /* Hierarchy of directories being traversed */
5078 
5079   const char *zBase;
5080   int nBase;
5081 
5082   struct stat sStat;         /* Current lstat() results */
5083   char *zPath;               /* Path to current entry */
5084   sqlite3_int64 iRowid;      /* Current rowid */
5085 };
5086 
5087 typedef struct fsdir_tab fsdir_tab;
5088 struct fsdir_tab {
5089   sqlite3_vtab base;         /* Base class - must be first */
5090 };
5091 
5092 /*
5093 ** Construct a new fsdir virtual table object.
5094 */
5095 static int fsdirConnect(
5096   sqlite3 *db,
5097   void *pAux,
5098   int argc, const char *const*argv,
5099   sqlite3_vtab **ppVtab,
5100   char **pzErr
5101 ){
5102   fsdir_tab *pNew = 0;
5103   int rc;
5104   (void)pAux;
5105   (void)argc;
5106   (void)argv;
5107   (void)pzErr;
5108   rc = sqlite3_declare_vtab(db, "CREATE TABLE x" FSDIR_SCHEMA);
5109   if( rc==SQLITE_OK ){
5110     pNew = (fsdir_tab*)sqlite3_malloc( sizeof(*pNew) );
5111     if( pNew==0 ) return SQLITE_NOMEM;
5112     memset(pNew, 0, sizeof(*pNew));
5113     sqlite3_vtab_config(db, SQLITE_VTAB_DIRECTONLY);
5114   }
5115   *ppVtab = (sqlite3_vtab*)pNew;
5116   return rc;
5117 }
5118 
5119 /*
5120 ** This method is the destructor for fsdir vtab objects.
5121 */
5122 static int fsdirDisconnect(sqlite3_vtab *pVtab){
5123   sqlite3_free(pVtab);
5124   return SQLITE_OK;
5125 }
5126 
5127 /*
5128 ** Constructor for a new fsdir_cursor object.
5129 */
5130 static int fsdirOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){
5131   fsdir_cursor *pCur;
5132   (void)p;
5133   pCur = sqlite3_malloc( sizeof(*pCur) );
5134   if( pCur==0 ) return SQLITE_NOMEM;
5135   memset(pCur, 0, sizeof(*pCur));
5136   pCur->iLvl = -1;
5137   *ppCursor = &pCur->base;
5138   return SQLITE_OK;
5139 }
5140 
5141 /*
5142 ** Reset a cursor back to the state it was in when first returned
5143 ** by fsdirOpen().
5144 */
5145 static void fsdirResetCursor(fsdir_cursor *pCur){
5146   int i;
5147   for(i=0; i<=pCur->iLvl; i++){
5148     FsdirLevel *pLvl = &pCur->aLvl[i];
5149     if( pLvl->pDir ) closedir(pLvl->pDir);
5150     sqlite3_free(pLvl->zDir);
5151   }
5152   sqlite3_free(pCur->zPath);
5153   sqlite3_free(pCur->aLvl);
5154   pCur->aLvl = 0;
5155   pCur->zPath = 0;
5156   pCur->zBase = 0;
5157   pCur->nBase = 0;
5158   pCur->nLvl = 0;
5159   pCur->iLvl = -1;
5160   pCur->iRowid = 1;
5161 }
5162 
5163 /*
5164 ** Destructor for an fsdir_cursor.
5165 */
5166 static int fsdirClose(sqlite3_vtab_cursor *cur){
5167   fsdir_cursor *pCur = (fsdir_cursor*)cur;
5168 
5169   fsdirResetCursor(pCur);
5170   sqlite3_free(pCur);
5171   return SQLITE_OK;
5172 }
5173 
5174 /*
5175 ** Set the error message for the virtual table associated with cursor
5176 ** pCur to the results of vprintf(zFmt, ...).
5177 */
5178 static void fsdirSetErrmsg(fsdir_cursor *pCur, const char *zFmt, ...){
5179   va_list ap;
5180   va_start(ap, zFmt);
5181   pCur->base.pVtab->zErrMsg = sqlite3_vmprintf(zFmt, ap);
5182   va_end(ap);
5183 }
5184 
5185 
5186 /*
5187 ** Advance an fsdir_cursor to its next row of output.
5188 */
5189 static int fsdirNext(sqlite3_vtab_cursor *cur){
5190   fsdir_cursor *pCur = (fsdir_cursor*)cur;
5191   mode_t m = pCur->sStat.st_mode;
5192 
5193   pCur->iRowid++;
5194   if( S_ISDIR(m) ){
5195     /* Descend into this directory */
5196     int iNew = pCur->iLvl + 1;
5197     FsdirLevel *pLvl;
5198     if( iNew>=pCur->nLvl ){
5199       int nNew = iNew+1;
5200       sqlite3_int64 nByte = nNew*sizeof(FsdirLevel);
5201       FsdirLevel *aNew = (FsdirLevel*)sqlite3_realloc64(pCur->aLvl, nByte);
5202       if( aNew==0 ) return SQLITE_NOMEM;
5203       memset(&aNew[pCur->nLvl], 0, sizeof(FsdirLevel)*(nNew-pCur->nLvl));
5204       pCur->aLvl = aNew;
5205       pCur->nLvl = nNew;
5206     }
5207     pCur->iLvl = iNew;
5208     pLvl = &pCur->aLvl[iNew];
5209 
5210     pLvl->zDir = pCur->zPath;
5211     pCur->zPath = 0;
5212     pLvl->pDir = opendir(pLvl->zDir);
5213     if( pLvl->pDir==0 ){
5214       fsdirSetErrmsg(pCur, "cannot read directory: %s", pCur->zPath);
5215       return SQLITE_ERROR;
5216     }
5217   }
5218 
5219   while( pCur->iLvl>=0 ){
5220     FsdirLevel *pLvl = &pCur->aLvl[pCur->iLvl];
5221     struct dirent *pEntry = readdir(pLvl->pDir);
5222     if( pEntry ){
5223       if( pEntry->d_name[0]=='.' ){
5224        if( pEntry->d_name[1]=='.' && pEntry->d_name[2]=='\0' ) continue;
5225        if( pEntry->d_name[1]=='\0' ) continue;
5226       }
5227       sqlite3_free(pCur->zPath);
5228       pCur->zPath = sqlite3_mprintf("%s/%s", pLvl->zDir, pEntry->d_name);
5229       if( pCur->zPath==0 ) return SQLITE_NOMEM;
5230       if( fileLinkStat(pCur->zPath, &pCur->sStat) ){
5231         fsdirSetErrmsg(pCur, "cannot stat file: %s", pCur->zPath);
5232         return SQLITE_ERROR;
5233       }
5234       return SQLITE_OK;
5235     }
5236     closedir(pLvl->pDir);
5237     sqlite3_free(pLvl->zDir);
5238     pLvl->pDir = 0;
5239     pLvl->zDir = 0;
5240     pCur->iLvl--;
5241   }
5242 
5243   /* EOF */
5244   sqlite3_free(pCur->zPath);
5245   pCur->zPath = 0;
5246   return SQLITE_OK;
5247 }
5248 
5249 /*
5250 ** Return values of columns for the row at which the series_cursor
5251 ** is currently pointing.
5252 */
5253 static int fsdirColumn(
5254   sqlite3_vtab_cursor *cur,   /* The cursor */
5255   sqlite3_context *ctx,       /* First argument to sqlite3_result_...() */
5256   int i                       /* Which column to return */
5257 ){
5258   fsdir_cursor *pCur = (fsdir_cursor*)cur;
5259   switch( i ){
5260     case FSDIR_COLUMN_NAME: {
5261       sqlite3_result_text(ctx, &pCur->zPath[pCur->nBase], -1, SQLITE_TRANSIENT);
5262       break;
5263     }
5264 
5265     case FSDIR_COLUMN_MODE:
5266       sqlite3_result_int64(ctx, pCur->sStat.st_mode);
5267       break;
5268 
5269     case FSDIR_COLUMN_MTIME:
5270       sqlite3_result_int64(ctx, pCur->sStat.st_mtime);
5271       break;
5272 
5273     case FSDIR_COLUMN_DATA: {
5274       mode_t m = pCur->sStat.st_mode;
5275       if( S_ISDIR(m) ){
5276         sqlite3_result_null(ctx);
5277 #if !defined(_WIN32) && !defined(WIN32)
5278       }else if( S_ISLNK(m) ){
5279         char aStatic[64];
5280         char *aBuf = aStatic;
5281         sqlite3_int64 nBuf = 64;
5282         int n;
5283 
5284         while( 1 ){
5285           n = readlink(pCur->zPath, aBuf, nBuf);
5286           if( n<nBuf ) break;
5287           if( aBuf!=aStatic ) sqlite3_free(aBuf);
5288           nBuf = nBuf*2;
5289           aBuf = sqlite3_malloc64(nBuf);
5290           if( aBuf==0 ){
5291             sqlite3_result_error_nomem(ctx);
5292             return SQLITE_NOMEM;
5293           }
5294         }
5295 
5296         sqlite3_result_text(ctx, aBuf, n, SQLITE_TRANSIENT);
5297         if( aBuf!=aStatic ) sqlite3_free(aBuf);
5298 #endif
5299       }else{
5300         readFileContents(ctx, pCur->zPath);
5301       }
5302     }
5303     case FSDIR_COLUMN_PATH:
5304     default: {
5305       /* The FSDIR_COLUMN_PATH and FSDIR_COLUMN_DIR are input parameters.
5306       ** always return their values as NULL */
5307       break;
5308     }
5309   }
5310   return SQLITE_OK;
5311 }
5312 
5313 /*
5314 ** Return the rowid for the current row. In this implementation, the
5315 ** first row returned is assigned rowid value 1, and each subsequent
5316 ** row a value 1 more than that of the previous.
5317 */
5318 static int fsdirRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
5319   fsdir_cursor *pCur = (fsdir_cursor*)cur;
5320   *pRowid = pCur->iRowid;
5321   return SQLITE_OK;
5322 }
5323 
5324 /*
5325 ** Return TRUE if the cursor has been moved off of the last
5326 ** row of output.
5327 */
5328 static int fsdirEof(sqlite3_vtab_cursor *cur){
5329   fsdir_cursor *pCur = (fsdir_cursor*)cur;
5330   return (pCur->zPath==0);
5331 }
5332 
5333 /*
5334 ** xFilter callback.
5335 **
5336 ** idxNum==1   PATH parameter only
5337 ** idxNum==2   Both PATH and DIR supplied
5338 */
5339 static int fsdirFilter(
5340   sqlite3_vtab_cursor *cur,
5341   int idxNum, const char *idxStr,
5342   int argc, sqlite3_value **argv
5343 ){
5344   const char *zDir = 0;
5345   fsdir_cursor *pCur = (fsdir_cursor*)cur;
5346   (void)idxStr;
5347   fsdirResetCursor(pCur);
5348 
5349   if( idxNum==0 ){
5350     fsdirSetErrmsg(pCur, "table function fsdir requires an argument");
5351     return SQLITE_ERROR;
5352   }
5353 
5354   assert( argc==idxNum && (argc==1 || argc==2) );
5355   zDir = (const char*)sqlite3_value_text(argv[0]);
5356   if( zDir==0 ){
5357     fsdirSetErrmsg(pCur, "table function fsdir requires a non-NULL argument");
5358     return SQLITE_ERROR;
5359   }
5360   if( argc==2 ){
5361     pCur->zBase = (const char*)sqlite3_value_text(argv[1]);
5362   }
5363   if( pCur->zBase ){
5364     pCur->nBase = (int)strlen(pCur->zBase)+1;
5365     pCur->zPath = sqlite3_mprintf("%s/%s", pCur->zBase, zDir);
5366   }else{
5367     pCur->zPath = sqlite3_mprintf("%s", zDir);
5368   }
5369 
5370   if( pCur->zPath==0 ){
5371     return SQLITE_NOMEM;
5372   }
5373   if( fileLinkStat(pCur->zPath, &pCur->sStat) ){
5374     fsdirSetErrmsg(pCur, "cannot stat file: %s", pCur->zPath);
5375     return SQLITE_ERROR;
5376   }
5377 
5378   return SQLITE_OK;
5379 }
5380 
5381 /*
5382 ** SQLite will invoke this method one or more times while planning a query
5383 ** that uses the generate_series virtual table.  This routine needs to create
5384 ** a query plan for each invocation and compute an estimated cost for that
5385 ** plan.
5386 **
5387 ** In this implementation idxNum is used to represent the
5388 ** query plan.  idxStr is unused.
5389 **
5390 ** The query plan is represented by values of idxNum:
5391 **
5392 **  (1)  The path value is supplied by argv[0]
5393 **  (2)  Path is in argv[0] and dir is in argv[1]
5394 */
5395 static int fsdirBestIndex(
5396   sqlite3_vtab *tab,
5397   sqlite3_index_info *pIdxInfo
5398 ){
5399   int i;                 /* Loop over constraints */
5400   int idxPath = -1;      /* Index in pIdxInfo->aConstraint of PATH= */
5401   int idxDir = -1;       /* Index in pIdxInfo->aConstraint of DIR= */
5402   int seenPath = 0;      /* True if an unusable PATH= constraint is seen */
5403   int seenDir = 0;       /* True if an unusable DIR= constraint is seen */
5404   const struct sqlite3_index_constraint *pConstraint;
5405 
5406   (void)tab;
5407   pConstraint = pIdxInfo->aConstraint;
5408   for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){
5409     if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue;
5410     switch( pConstraint->iColumn ){
5411       case FSDIR_COLUMN_PATH: {
5412         if( pConstraint->usable ){
5413           idxPath = i;
5414           seenPath = 0;
5415         }else if( idxPath<0 ){
5416           seenPath = 1;
5417         }
5418         break;
5419       }
5420       case FSDIR_COLUMN_DIR: {
5421         if( pConstraint->usable ){
5422           idxDir = i;
5423           seenDir = 0;
5424         }else if( idxDir<0 ){
5425           seenDir = 1;
5426         }
5427         break;
5428       }
5429     }
5430   }
5431   if( seenPath || seenDir ){
5432     /* If input parameters are unusable, disallow this plan */
5433     return SQLITE_CONSTRAINT;
5434   }
5435 
5436   if( idxPath<0 ){
5437     pIdxInfo->idxNum = 0;
5438     /* The pIdxInfo->estimatedCost should have been initialized to a huge
5439     ** number.  Leave it unchanged. */
5440     pIdxInfo->estimatedRows = 0x7fffffff;
5441   }else{
5442     pIdxInfo->aConstraintUsage[idxPath].omit = 1;
5443     pIdxInfo->aConstraintUsage[idxPath].argvIndex = 1;
5444     if( idxDir>=0 ){
5445       pIdxInfo->aConstraintUsage[idxDir].omit = 1;
5446       pIdxInfo->aConstraintUsage[idxDir].argvIndex = 2;
5447       pIdxInfo->idxNum = 2;
5448       pIdxInfo->estimatedCost = 10.0;
5449     }else{
5450       pIdxInfo->idxNum = 1;
5451       pIdxInfo->estimatedCost = 100.0;
5452     }
5453   }
5454 
5455   return SQLITE_OK;
5456 }
5457 
5458 /*
5459 ** Register the "fsdir" virtual table.
5460 */
5461 static int fsdirRegister(sqlite3 *db){
5462   static sqlite3_module fsdirModule = {
5463     0,                         /* iVersion */
5464     0,                         /* xCreate */
5465     fsdirConnect,              /* xConnect */
5466     fsdirBestIndex,            /* xBestIndex */
5467     fsdirDisconnect,           /* xDisconnect */
5468     0,                         /* xDestroy */
5469     fsdirOpen,                 /* xOpen - open a cursor */
5470     fsdirClose,                /* xClose - close a cursor */
5471     fsdirFilter,               /* xFilter - configure scan constraints */
5472     fsdirNext,                 /* xNext - advance a cursor */
5473     fsdirEof,                  /* xEof - check for end of scan */
5474     fsdirColumn,               /* xColumn - read data */
5475     fsdirRowid,                /* xRowid - read data */
5476     0,                         /* xUpdate */
5477     0,                         /* xBegin */
5478     0,                         /* xSync */
5479     0,                         /* xCommit */
5480     0,                         /* xRollback */
5481     0,                         /* xFindMethod */
5482     0,                         /* xRename */
5483     0,                         /* xSavepoint */
5484     0,                         /* xRelease */
5485     0,                         /* xRollbackTo */
5486     0,                         /* xShadowName */
5487   };
5488 
5489   int rc = sqlite3_create_module(db, "fsdir", &fsdirModule, 0);
5490   return rc;
5491 }
5492 #else         /* SQLITE_OMIT_VIRTUALTABLE */
5493 # define fsdirRegister(x) SQLITE_OK
5494 #endif
5495 
5496 #ifdef _WIN32
5497 
5498 #endif
5499 int sqlite3_fileio_init(
5500   sqlite3 *db,
5501   char **pzErrMsg,
5502   const sqlite3_api_routines *pApi
5503 ){
5504   int rc = SQLITE_OK;
5505   SQLITE_EXTENSION_INIT2(pApi);
5506   (void)pzErrMsg;  /* Unused parameter */
5507   rc = sqlite3_create_function(db, "readfile", 1,
5508                                SQLITE_UTF8|SQLITE_DIRECTONLY, 0,
5509                                readfileFunc, 0, 0);
5510   if( rc==SQLITE_OK ){
5511     rc = sqlite3_create_function(db, "writefile", -1,
5512                                  SQLITE_UTF8|SQLITE_DIRECTONLY, 0,
5513                                  writefileFunc, 0, 0);
5514   }
5515   if( rc==SQLITE_OK ){
5516     rc = sqlite3_create_function(db, "lsmode", 1, SQLITE_UTF8, 0,
5517                                  lsModeFunc, 0, 0);
5518   }
5519   if( rc==SQLITE_OK ){
5520     rc = fsdirRegister(db);
5521   }
5522   return rc;
5523 }
5524 
5525 #if defined(FILEIO_WIN32_DLL) && (defined(_WIN32) || defined(WIN32))
5526 /* To allow a standalone DLL, make test_windirent.c use the same
5527  * redefined SQLite API calls as the above extension code does.
5528  * Just pull in this .c to accomplish this. As a beneficial side
5529  * effect, this extension becomes a single translation unit. */
5530 #  include "test_windirent.c"
5531 #endif
5532 
5533 /************************* End ../ext/misc/fileio.c ********************/
5534 /************************* Begin ../ext/misc/completion.c ******************/
5535 /*
5536 ** 2017-07-10
5537 **
5538 ** The author disclaims copyright to this source code.  In place of
5539 ** a legal notice, here is a blessing:
5540 **
5541 **    May you do good and not evil.
5542 **    May you find forgiveness for yourself and forgive others.
5543 **    May you share freely, never taking more than you give.
5544 **
5545 *************************************************************************
5546 **
5547 ** This file implements an eponymous virtual table that returns suggested
5548 ** completions for a partial SQL input.
5549 **
5550 ** Suggested usage:
5551 **
5552 **     SELECT DISTINCT candidate COLLATE nocase
5553 **       FROM completion($prefix,$wholeline)
5554 **      ORDER BY 1;
5555 **
5556 ** The two query parameters are optional.  $prefix is the text of the
5557 ** current word being typed and that is to be completed.  $wholeline is
5558 ** the complete input line, used for context.
5559 **
5560 ** The raw completion() table might return the same candidate multiple
5561 ** times, for example if the same column name is used to two or more
5562 ** tables.  And the candidates are returned in an arbitrary order.  Hence,
5563 ** the DISTINCT and ORDER BY are recommended.
5564 **
5565 ** This virtual table operates at the speed of human typing, and so there
5566 ** is no attempt to make it fast.  Even a slow implementation will be much
5567 ** faster than any human can type.
5568 **
5569 */
5570 /* #include "sqlite3ext.h" */
5571 SQLITE_EXTENSION_INIT1
5572 #include <assert.h>
5573 #include <string.h>
5574 #include <ctype.h>
5575 
5576 #ifndef SQLITE_OMIT_VIRTUALTABLE
5577 
5578 /* completion_vtab is a subclass of sqlite3_vtab which will
5579 ** serve as the underlying representation of a completion virtual table
5580 */
5581 typedef struct completion_vtab completion_vtab;
5582 struct completion_vtab {
5583   sqlite3_vtab base;  /* Base class - must be first */
5584   sqlite3 *db;        /* Database connection for this completion vtab */
5585 };
5586 
5587 /* completion_cursor is a subclass of sqlite3_vtab_cursor which will
5588 ** serve as the underlying representation of a cursor that scans
5589 ** over rows of the result
5590 */
5591 typedef struct completion_cursor completion_cursor;
5592 struct completion_cursor {
5593   sqlite3_vtab_cursor base;  /* Base class - must be first */
5594   sqlite3 *db;               /* Database connection for this cursor */
5595   int nPrefix, nLine;        /* Number of bytes in zPrefix and zLine */
5596   char *zPrefix;             /* The prefix for the word we want to complete */
5597   char *zLine;               /* The whole that we want to complete */
5598   const char *zCurrentRow;   /* Current output row */
5599   int szRow;                 /* Length of the zCurrentRow string */
5600   sqlite3_stmt *pStmt;       /* Current statement */
5601   sqlite3_int64 iRowid;      /* The rowid */
5602   int ePhase;                /* Current phase */
5603   int j;                     /* inter-phase counter */
5604 };
5605 
5606 /* Values for ePhase:
5607 */
5608 #define COMPLETION_FIRST_PHASE   1
5609 #define COMPLETION_KEYWORDS      1
5610 #define COMPLETION_PRAGMAS       2
5611 #define COMPLETION_FUNCTIONS     3
5612 #define COMPLETION_COLLATIONS    4
5613 #define COMPLETION_INDEXES       5
5614 #define COMPLETION_TRIGGERS      6
5615 #define COMPLETION_DATABASES     7
5616 #define COMPLETION_TABLES        8    /* Also VIEWs and TRIGGERs */
5617 #define COMPLETION_COLUMNS       9
5618 #define COMPLETION_MODULES       10
5619 #define COMPLETION_EOF           11
5620 
5621 /*
5622 ** The completionConnect() method is invoked to create a new
5623 ** completion_vtab that describes the completion virtual table.
5624 **
5625 ** Think of this routine as the constructor for completion_vtab objects.
5626 **
5627 ** All this routine needs to do is:
5628 **
5629 **    (1) Allocate the completion_vtab object and initialize all fields.
5630 **
5631 **    (2) Tell SQLite (via the sqlite3_declare_vtab() interface) what the
5632 **        result set of queries against completion will look like.
5633 */
5634 static int completionConnect(
5635   sqlite3 *db,
5636   void *pAux,
5637   int argc, const char *const*argv,
5638   sqlite3_vtab **ppVtab,
5639   char **pzErr
5640 ){
5641   completion_vtab *pNew;
5642   int rc;
5643 
5644   (void)(pAux);    /* Unused parameter */
5645   (void)(argc);    /* Unused parameter */
5646   (void)(argv);    /* Unused parameter */
5647   (void)(pzErr);   /* Unused parameter */
5648 
5649 /* Column numbers */
5650 #define COMPLETION_COLUMN_CANDIDATE 0  /* Suggested completion of the input */
5651 #define COMPLETION_COLUMN_PREFIX    1  /* Prefix of the word to be completed */
5652 #define COMPLETION_COLUMN_WHOLELINE 2  /* Entire line seen so far */
5653 #define COMPLETION_COLUMN_PHASE     3  /* ePhase - used for debugging only */
5654 
5655   sqlite3_vtab_config(db, SQLITE_VTAB_INNOCUOUS);
5656   rc = sqlite3_declare_vtab(db,
5657       "CREATE TABLE x("
5658       "  candidate TEXT,"
5659       "  prefix TEXT HIDDEN,"
5660       "  wholeline TEXT HIDDEN,"
5661       "  phase INT HIDDEN"        /* Used for debugging only */
5662       ")");
5663   if( rc==SQLITE_OK ){
5664     pNew = sqlite3_malloc( sizeof(*pNew) );
5665     *ppVtab = (sqlite3_vtab*)pNew;
5666     if( pNew==0 ) return SQLITE_NOMEM;
5667     memset(pNew, 0, sizeof(*pNew));
5668     pNew->db = db;
5669   }
5670   return rc;
5671 }
5672 
5673 /*
5674 ** This method is the destructor for completion_cursor objects.
5675 */
5676 static int completionDisconnect(sqlite3_vtab *pVtab){
5677   sqlite3_free(pVtab);
5678   return SQLITE_OK;
5679 }
5680 
5681 /*
5682 ** Constructor for a new completion_cursor object.
5683 */
5684 static int completionOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){
5685   completion_cursor *pCur;
5686   pCur = sqlite3_malloc( sizeof(*pCur) );
5687   if( pCur==0 ) return SQLITE_NOMEM;
5688   memset(pCur, 0, sizeof(*pCur));
5689   pCur->db = ((completion_vtab*)p)->db;
5690   *ppCursor = &pCur->base;
5691   return SQLITE_OK;
5692 }
5693 
5694 /*
5695 ** Reset the completion_cursor.
5696 */
5697 static void completionCursorReset(completion_cursor *pCur){
5698   sqlite3_free(pCur->zPrefix);   pCur->zPrefix = 0;  pCur->nPrefix = 0;
5699   sqlite3_free(pCur->zLine);     pCur->zLine = 0;    pCur->nLine = 0;
5700   sqlite3_finalize(pCur->pStmt); pCur->pStmt = 0;
5701   pCur->j = 0;
5702 }
5703 
5704 /*
5705 ** Destructor for a completion_cursor.
5706 */
5707 static int completionClose(sqlite3_vtab_cursor *cur){
5708   completionCursorReset((completion_cursor*)cur);
5709   sqlite3_free(cur);
5710   return SQLITE_OK;
5711 }
5712 
5713 /*
5714 ** Advance a completion_cursor to its next row of output.
5715 **
5716 ** The ->ePhase, ->j, and ->pStmt fields of the completion_cursor object
5717 ** record the current state of the scan.  This routine sets ->zCurrentRow
5718 ** to the current row of output and then returns.  If no more rows remain,
5719 ** then ->ePhase is set to COMPLETION_EOF which will signal the virtual
5720 ** table that has reached the end of its scan.
5721 **
5722 ** The current implementation just lists potential identifiers and
5723 ** keywords and filters them by zPrefix.  Future enhancements should
5724 ** take zLine into account to try to restrict the set of identifiers and
5725 ** keywords based on what would be legal at the current point of input.
5726 */
5727 static int completionNext(sqlite3_vtab_cursor *cur){
5728   completion_cursor *pCur = (completion_cursor*)cur;
5729   int eNextPhase = 0;  /* Next phase to try if current phase reaches end */
5730   int iCol = -1;       /* If >=0, step pCur->pStmt and use the i-th column */
5731   pCur->iRowid++;
5732   while( pCur->ePhase!=COMPLETION_EOF ){
5733     switch( pCur->ePhase ){
5734       case COMPLETION_KEYWORDS: {
5735         if( pCur->j >= sqlite3_keyword_count() ){
5736           pCur->zCurrentRow = 0;
5737           pCur->ePhase = COMPLETION_DATABASES;
5738         }else{
5739           sqlite3_keyword_name(pCur->j++, &pCur->zCurrentRow, &pCur->szRow);
5740         }
5741         iCol = -1;
5742         break;
5743       }
5744       case COMPLETION_DATABASES: {
5745         if( pCur->pStmt==0 ){
5746           sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1,
5747                              &pCur->pStmt, 0);
5748         }
5749         iCol = 1;
5750         eNextPhase = COMPLETION_TABLES;
5751         break;
5752       }
5753       case COMPLETION_TABLES: {
5754         if( pCur->pStmt==0 ){
5755           sqlite3_stmt *pS2;
5756           char *zSql = 0;
5757           const char *zSep = "";
5758           sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1, &pS2, 0);
5759           while( sqlite3_step(pS2)==SQLITE_ROW ){
5760             const char *zDb = (const char*)sqlite3_column_text(pS2, 1);
5761             zSql = sqlite3_mprintf(
5762                "%z%s"
5763                "SELECT name FROM \"%w\".sqlite_schema",
5764                zSql, zSep, zDb
5765             );
5766             if( zSql==0 ) return SQLITE_NOMEM;
5767             zSep = " UNION ";
5768           }
5769           sqlite3_finalize(pS2);
5770           sqlite3_prepare_v2(pCur->db, zSql, -1, &pCur->pStmt, 0);
5771           sqlite3_free(zSql);
5772         }
5773         iCol = 0;
5774         eNextPhase = COMPLETION_COLUMNS;
5775         break;
5776       }
5777       case COMPLETION_COLUMNS: {
5778         if( pCur->pStmt==0 ){
5779           sqlite3_stmt *pS2;
5780           char *zSql = 0;
5781           const char *zSep = "";
5782           sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1, &pS2, 0);
5783           while( sqlite3_step(pS2)==SQLITE_ROW ){
5784             const char *zDb = (const char*)sqlite3_column_text(pS2, 1);
5785             zSql = sqlite3_mprintf(
5786                "%z%s"
5787                "SELECT pti.name FROM \"%w\".sqlite_schema AS sm"
5788                        " JOIN pragma_table_info(sm.name,%Q) AS pti"
5789                " WHERE sm.type='table'",
5790                zSql, zSep, zDb, zDb
5791             );
5792             if( zSql==0 ) return SQLITE_NOMEM;
5793             zSep = " UNION ";
5794           }
5795           sqlite3_finalize(pS2);
5796           sqlite3_prepare_v2(pCur->db, zSql, -1, &pCur->pStmt, 0);
5797           sqlite3_free(zSql);
5798         }
5799         iCol = 0;
5800         eNextPhase = COMPLETION_EOF;
5801         break;
5802       }
5803     }
5804     if( iCol<0 ){
5805       /* This case is when the phase presets zCurrentRow */
5806       if( pCur->zCurrentRow==0 ) continue;
5807     }else{
5808       if( sqlite3_step(pCur->pStmt)==SQLITE_ROW ){
5809         /* Extract the next row of content */
5810         pCur->zCurrentRow = (const char*)sqlite3_column_text(pCur->pStmt, iCol);
5811         pCur->szRow = sqlite3_column_bytes(pCur->pStmt, iCol);
5812       }else{
5813         /* When all rows are finished, advance to the next phase */
5814         sqlite3_finalize(pCur->pStmt);
5815         pCur->pStmt = 0;
5816         pCur->ePhase = eNextPhase;
5817         continue;
5818       }
5819     }
5820     if( pCur->nPrefix==0 ) break;
5821     if( pCur->nPrefix<=pCur->szRow
5822      && sqlite3_strnicmp(pCur->zPrefix, pCur->zCurrentRow, pCur->nPrefix)==0
5823     ){
5824       break;
5825     }
5826   }
5827 
5828   return SQLITE_OK;
5829 }
5830 
5831 /*
5832 ** Return values of columns for the row at which the completion_cursor
5833 ** is currently pointing.
5834 */
5835 static int completionColumn(
5836   sqlite3_vtab_cursor *cur,   /* The cursor */
5837   sqlite3_context *ctx,       /* First argument to sqlite3_result_...() */
5838   int i                       /* Which column to return */
5839 ){
5840   completion_cursor *pCur = (completion_cursor*)cur;
5841   switch( i ){
5842     case COMPLETION_COLUMN_CANDIDATE: {
5843       sqlite3_result_text(ctx, pCur->zCurrentRow, pCur->szRow,SQLITE_TRANSIENT);
5844       break;
5845     }
5846     case COMPLETION_COLUMN_PREFIX: {
5847       sqlite3_result_text(ctx, pCur->zPrefix, -1, SQLITE_TRANSIENT);
5848       break;
5849     }
5850     case COMPLETION_COLUMN_WHOLELINE: {
5851       sqlite3_result_text(ctx, pCur->zLine, -1, SQLITE_TRANSIENT);
5852       break;
5853     }
5854     case COMPLETION_COLUMN_PHASE: {
5855       sqlite3_result_int(ctx, pCur->ePhase);
5856       break;
5857     }
5858   }
5859   return SQLITE_OK;
5860 }
5861 
5862 /*
5863 ** Return the rowid for the current row.  In this implementation, the
5864 ** rowid is the same as the output value.
5865 */
5866 static int completionRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
5867   completion_cursor *pCur = (completion_cursor*)cur;
5868   *pRowid = pCur->iRowid;
5869   return SQLITE_OK;
5870 }
5871 
5872 /*
5873 ** Return TRUE if the cursor has been moved off of the last
5874 ** row of output.
5875 */
5876 static int completionEof(sqlite3_vtab_cursor *cur){
5877   completion_cursor *pCur = (completion_cursor*)cur;
5878   return pCur->ePhase >= COMPLETION_EOF;
5879 }
5880 
5881 /*
5882 ** This method is called to "rewind" the completion_cursor object back
5883 ** to the first row of output.  This method is always called at least
5884 ** once prior to any call to completionColumn() or completionRowid() or
5885 ** completionEof().
5886 */
5887 static int completionFilter(
5888   sqlite3_vtab_cursor *pVtabCursor,
5889   int idxNum, const char *idxStr,
5890   int argc, sqlite3_value **argv
5891 ){
5892   completion_cursor *pCur = (completion_cursor *)pVtabCursor;
5893   int iArg = 0;
5894   (void)(idxStr);   /* Unused parameter */
5895   (void)(argc);     /* Unused parameter */
5896   completionCursorReset(pCur);
5897   if( idxNum & 1 ){
5898     pCur->nPrefix = sqlite3_value_bytes(argv[iArg]);
5899     if( pCur->nPrefix>0 ){
5900       pCur->zPrefix = sqlite3_mprintf("%s", sqlite3_value_text(argv[iArg]));
5901       if( pCur->zPrefix==0 ) return SQLITE_NOMEM;
5902     }
5903     iArg = 1;
5904   }
5905   if( idxNum & 2 ){
5906     pCur->nLine = sqlite3_value_bytes(argv[iArg]);
5907     if( pCur->nLine>0 ){
5908       pCur->zLine = sqlite3_mprintf("%s", sqlite3_value_text(argv[iArg]));
5909       if( pCur->zLine==0 ) return SQLITE_NOMEM;
5910     }
5911   }
5912   if( pCur->zLine!=0 && pCur->zPrefix==0 ){
5913     int i = pCur->nLine;
5914     while( i>0 && (isalnum(pCur->zLine[i-1]) || pCur->zLine[i-1]=='_') ){
5915       i--;
5916     }
5917     pCur->nPrefix = pCur->nLine - i;
5918     if( pCur->nPrefix>0 ){
5919       pCur->zPrefix = sqlite3_mprintf("%.*s", pCur->nPrefix, pCur->zLine + i);
5920       if( pCur->zPrefix==0 ) return SQLITE_NOMEM;
5921     }
5922   }
5923   pCur->iRowid = 0;
5924   pCur->ePhase = COMPLETION_FIRST_PHASE;
5925   return completionNext(pVtabCursor);
5926 }
5927 
5928 /*
5929 ** SQLite will invoke this method one or more times while planning a query
5930 ** that uses the completion virtual table.  This routine needs to create
5931 ** a query plan for each invocation and compute an estimated cost for that
5932 ** plan.
5933 **
5934 ** There are two hidden parameters that act as arguments to the table-valued
5935 ** function:  "prefix" and "wholeline".  Bit 0 of idxNum is set if "prefix"
5936 ** is available and bit 1 is set if "wholeline" is available.
5937 */
5938 static int completionBestIndex(
5939   sqlite3_vtab *tab,
5940   sqlite3_index_info *pIdxInfo
5941 ){
5942   int i;                 /* Loop over constraints */
5943   int idxNum = 0;        /* The query plan bitmask */
5944   int prefixIdx = -1;    /* Index of the start= constraint, or -1 if none */
5945   int wholelineIdx = -1; /* Index of the stop= constraint, or -1 if none */
5946   int nArg = 0;          /* Number of arguments that completeFilter() expects */
5947   const struct sqlite3_index_constraint *pConstraint;
5948 
5949   (void)(tab);    /* Unused parameter */
5950   pConstraint = pIdxInfo->aConstraint;
5951   for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){
5952     if( pConstraint->usable==0 ) continue;
5953     if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue;
5954     switch( pConstraint->iColumn ){
5955       case COMPLETION_COLUMN_PREFIX:
5956         prefixIdx = i;
5957         idxNum |= 1;
5958         break;
5959       case COMPLETION_COLUMN_WHOLELINE:
5960         wholelineIdx = i;
5961         idxNum |= 2;
5962         break;
5963     }
5964   }
5965   if( prefixIdx>=0 ){
5966     pIdxInfo->aConstraintUsage[prefixIdx].argvIndex = ++nArg;
5967     pIdxInfo->aConstraintUsage[prefixIdx].omit = 1;
5968   }
5969   if( wholelineIdx>=0 ){
5970     pIdxInfo->aConstraintUsage[wholelineIdx].argvIndex = ++nArg;
5971     pIdxInfo->aConstraintUsage[wholelineIdx].omit = 1;
5972   }
5973   pIdxInfo->idxNum = idxNum;
5974   pIdxInfo->estimatedCost = (double)5000 - 1000*nArg;
5975   pIdxInfo->estimatedRows = 500 - 100*nArg;
5976   return SQLITE_OK;
5977 }
5978 
5979 /*
5980 ** This following structure defines all the methods for the
5981 ** completion virtual table.
5982 */
5983 static sqlite3_module completionModule = {
5984   0,                         /* iVersion */
5985   0,                         /* xCreate */
5986   completionConnect,         /* xConnect */
5987   completionBestIndex,       /* xBestIndex */
5988   completionDisconnect,      /* xDisconnect */
5989   0,                         /* xDestroy */
5990   completionOpen,            /* xOpen - open a cursor */
5991   completionClose,           /* xClose - close a cursor */
5992   completionFilter,          /* xFilter - configure scan constraints */
5993   completionNext,            /* xNext - advance a cursor */
5994   completionEof,             /* xEof - check for end of scan */
5995   completionColumn,          /* xColumn - read data */
5996   completionRowid,           /* xRowid - read data */
5997   0,                         /* xUpdate */
5998   0,                         /* xBegin */
5999   0,                         /* xSync */
6000   0,                         /* xCommit */
6001   0,                         /* xRollback */
6002   0,                         /* xFindMethod */
6003   0,                         /* xRename */
6004   0,                         /* xSavepoint */
6005   0,                         /* xRelease */
6006   0,                         /* xRollbackTo */
6007   0                          /* xShadowName */
6008 };
6009 
6010 #endif /* SQLITE_OMIT_VIRTUALTABLE */
6011 
6012 int sqlite3CompletionVtabInit(sqlite3 *db){
6013   int rc = SQLITE_OK;
6014 #ifndef SQLITE_OMIT_VIRTUALTABLE
6015   rc = sqlite3_create_module(db, "completion", &completionModule, 0);
6016 #endif
6017   return rc;
6018 }
6019 
6020 #ifdef _WIN32
6021 
6022 #endif
6023 int sqlite3_completion_init(
6024   sqlite3 *db,
6025   char **pzErrMsg,
6026   const sqlite3_api_routines *pApi
6027 ){
6028   int rc = SQLITE_OK;
6029   SQLITE_EXTENSION_INIT2(pApi);
6030   (void)(pzErrMsg);  /* Unused parameter */
6031 #ifndef SQLITE_OMIT_VIRTUALTABLE
6032   rc = sqlite3CompletionVtabInit(db);
6033 #endif
6034   return rc;
6035 }
6036 
6037 /************************* End ../ext/misc/completion.c ********************/
6038 /************************* Begin ../ext/misc/appendvfs.c ******************/
6039 /*
6040 ** 2017-10-20
6041 **
6042 ** The author disclaims copyright to this source code.  In place of
6043 ** a legal notice, here is a blessing:
6044 **
6045 **    May you do good and not evil.
6046 **    May you find forgiveness for yourself and forgive others.
6047 **    May you share freely, never taking more than you give.
6048 **
6049 ******************************************************************************
6050 **
6051 ** This file implements a VFS shim that allows an SQLite database to be
6052 ** appended onto the end of some other file, such as an executable.
6053 **
6054 ** A special record must appear at the end of the file that identifies the
6055 ** file as an appended database and provides the offset to the first page
6056 ** of the exposed content. (Or, it is the length of the content prefix.)
6057 ** For best performance page 1 should be located at a disk page boundary,
6058 ** though that is not required.
6059 **
6060 ** When opening a database using this VFS, the connection might treat
6061 ** the file as an ordinary SQLite database, or it might treat it as a
6062 ** database appended onto some other file.  The decision is made by
6063 ** applying the following rules in order:
6064 **
6065 **  (1)  An empty file is an ordinary database.
6066 **
6067 **  (2)  If the file ends with the appendvfs trailer string
6068 **       "Start-Of-SQLite3-NNNNNNNN" that file is an appended database.
6069 **
6070 **  (3)  If the file begins with the standard SQLite prefix string
6071 **       "SQLite format 3", that file is an ordinary database.
6072 **
6073 **  (4)  If none of the above apply and the SQLITE_OPEN_CREATE flag is
6074 **       set, then a new database is appended to the already existing file.
6075 **
6076 **  (5)  Otherwise, SQLITE_CANTOPEN is returned.
6077 **
6078 ** To avoid unnecessary complications with the PENDING_BYTE, the size of
6079 ** the file containing the database is limited to 1GiB. (1073741824 bytes)
6080 ** This VFS will not read or write past the 1GiB mark.  This restriction
6081 ** might be lifted in future versions.  For now, if you need a larger
6082 ** database, then keep it in a separate file.
6083 **
6084 ** If the file being opened is a plain database (not an appended one), then
6085 ** this shim is a pass-through into the default underlying VFS. (rule 3)
6086 **/
6087 /* #include "sqlite3ext.h" */
6088 SQLITE_EXTENSION_INIT1
6089 #include <string.h>
6090 #include <assert.h>
6091 
6092 /* The append mark at the end of the database is:
6093 **
6094 **     Start-Of-SQLite3-NNNNNNNN
6095 **     123456789 123456789 12345
6096 **
6097 ** The NNNNNNNN represents a 64-bit big-endian unsigned integer which is
6098 ** the offset to page 1, and also the length of the prefix content.
6099 */
6100 #define APND_MARK_PREFIX     "Start-Of-SQLite3-"
6101 #define APND_MARK_PREFIX_SZ  17
6102 #define APND_MARK_FOS_SZ      8
6103 #define APND_MARK_SIZE       (APND_MARK_PREFIX_SZ+APND_MARK_FOS_SZ)
6104 
6105 /*
6106 ** Maximum size of the combined prefix + database + append-mark.  This
6107 ** must be less than 0x40000000 to avoid locking issues on Windows.
6108 */
6109 #define APND_MAX_SIZE  (0x40000000)
6110 
6111 /*
6112 ** Try to align the database to an even multiple of APND_ROUNDUP bytes.
6113 */
6114 #ifndef APND_ROUNDUP
6115 #define APND_ROUNDUP 4096
6116 #endif
6117 #define APND_ALIGN_MASK         ((sqlite3_int64)(APND_ROUNDUP-1))
6118 #define APND_START_ROUNDUP(fsz) (((fsz)+APND_ALIGN_MASK) & ~APND_ALIGN_MASK)
6119 
6120 /*
6121 ** Forward declaration of objects used by this utility
6122 */
6123 typedef struct sqlite3_vfs ApndVfs;
6124 typedef struct ApndFile ApndFile;
6125 
6126 /* Access to a lower-level VFS that (might) implement dynamic loading,
6127 ** access to randomness, etc.
6128 */
6129 #define ORIGVFS(p)  ((sqlite3_vfs*)((p)->pAppData))
6130 #define ORIGFILE(p) ((sqlite3_file*)(((ApndFile*)(p))+1))
6131 
6132 /* An open appendvfs file
6133 **
6134 ** An instance of this structure describes the appended database file.
6135 ** A separate sqlite3_file object is always appended. The appended
6136 ** sqlite3_file object (which can be accessed using ORIGFILE()) describes
6137 ** the entire file, including the prefix, the database, and the
6138 ** append-mark.
6139 **
6140 ** The structure of an AppendVFS database is like this:
6141 **
6142 **   +-------------+---------+----------+-------------+
6143 **   | prefix-file | padding | database | append-mark |
6144 **   +-------------+---------+----------+-------------+
6145 **                           ^          ^
6146 **                           |          |
6147 **                         iPgOne      iMark
6148 **
6149 **
6150 ** "prefix file" -  file onto which the database has been appended.
6151 ** "padding"     -  zero or more bytes inserted so that "database"
6152 **                  starts on an APND_ROUNDUP boundary
6153 ** "database"    -  The SQLite database file
6154 ** "append-mark" -  The 25-byte "Start-Of-SQLite3-NNNNNNNN" that indicates
6155 **                  the offset from the start of prefix-file to the start
6156 **                  of "database".
6157 **
6158 ** The size of the database is iMark - iPgOne.
6159 **
6160 ** The NNNNNNNN in the "Start-Of-SQLite3-NNNNNNNN" suffix is the value
6161 ** of iPgOne stored as a big-ending 64-bit integer.
6162 **
6163 ** iMark will be the size of the underlying file minus 25 (APND_MARKSIZE).
6164 ** Or, iMark is -1 to indicate that it has not yet been written.
6165 */
6166 struct ApndFile {
6167   sqlite3_file base;        /* Subclass.  MUST BE FIRST! */
6168   sqlite3_int64 iPgOne;     /* Offset to the start of the database */
6169   sqlite3_int64 iMark;      /* Offset of the append mark.  -1 if unwritten */
6170   /* Always followed by another sqlite3_file that describes the whole file */
6171 };
6172 
6173 /*
6174 ** Methods for ApndFile
6175 */
6176 static int apndClose(sqlite3_file*);
6177 static int apndRead(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst);
6178 static int apndWrite(sqlite3_file*,const void*,int iAmt, sqlite3_int64 iOfst);
6179 static int apndTruncate(sqlite3_file*, sqlite3_int64 size);
6180 static int apndSync(sqlite3_file*, int flags);
6181 static int apndFileSize(sqlite3_file*, sqlite3_int64 *pSize);
6182 static int apndLock(sqlite3_file*, int);
6183 static int apndUnlock(sqlite3_file*, int);
6184 static int apndCheckReservedLock(sqlite3_file*, int *pResOut);
6185 static int apndFileControl(sqlite3_file*, int op, void *pArg);
6186 static int apndSectorSize(sqlite3_file*);
6187 static int apndDeviceCharacteristics(sqlite3_file*);
6188 static int apndShmMap(sqlite3_file*, int iPg, int pgsz, int, void volatile**);
6189 static int apndShmLock(sqlite3_file*, int offset, int n, int flags);
6190 static void apndShmBarrier(sqlite3_file*);
6191 static int apndShmUnmap(sqlite3_file*, int deleteFlag);
6192 static int apndFetch(sqlite3_file*, sqlite3_int64 iOfst, int iAmt, void **pp);
6193 static int apndUnfetch(sqlite3_file*, sqlite3_int64 iOfst, void *p);
6194 
6195 /*
6196 ** Methods for ApndVfs
6197 */
6198 static int apndOpen(sqlite3_vfs*, const char *, sqlite3_file*, int , int *);
6199 static int apndDelete(sqlite3_vfs*, const char *zName, int syncDir);
6200 static int apndAccess(sqlite3_vfs*, const char *zName, int flags, int *);
6201 static int apndFullPathname(sqlite3_vfs*, const char *zName, int, char *zOut);
6202 static void *apndDlOpen(sqlite3_vfs*, const char *zFilename);
6203 static void apndDlError(sqlite3_vfs*, int nByte, char *zErrMsg);
6204 static void (*apndDlSym(sqlite3_vfs *pVfs, void *p, const char*zSym))(void);
6205 static void apndDlClose(sqlite3_vfs*, void*);
6206 static int apndRandomness(sqlite3_vfs*, int nByte, char *zOut);
6207 static int apndSleep(sqlite3_vfs*, int microseconds);
6208 static int apndCurrentTime(sqlite3_vfs*, double*);
6209 static int apndGetLastError(sqlite3_vfs*, int, char *);
6210 static int apndCurrentTimeInt64(sqlite3_vfs*, sqlite3_int64*);
6211 static int apndSetSystemCall(sqlite3_vfs*, const char*,sqlite3_syscall_ptr);
6212 static sqlite3_syscall_ptr apndGetSystemCall(sqlite3_vfs*, const char *z);
6213 static const char *apndNextSystemCall(sqlite3_vfs*, const char *zName);
6214 
6215 static sqlite3_vfs apnd_vfs = {
6216   3,                            /* iVersion (set when registered) */
6217   0,                            /* szOsFile (set when registered) */
6218   1024,                         /* mxPathname */
6219   0,                            /* pNext */
6220   "apndvfs",                    /* zName */
6221   0,                            /* pAppData (set when registered) */
6222   apndOpen,                     /* xOpen */
6223   apndDelete,                   /* xDelete */
6224   apndAccess,                   /* xAccess */
6225   apndFullPathname,             /* xFullPathname */
6226   apndDlOpen,                   /* xDlOpen */
6227   apndDlError,                  /* xDlError */
6228   apndDlSym,                    /* xDlSym */
6229   apndDlClose,                  /* xDlClose */
6230   apndRandomness,               /* xRandomness */
6231   apndSleep,                    /* xSleep */
6232   apndCurrentTime,              /* xCurrentTime */
6233   apndGetLastError,             /* xGetLastError */
6234   apndCurrentTimeInt64,         /* xCurrentTimeInt64 */
6235   apndSetSystemCall,            /* xSetSystemCall */
6236   apndGetSystemCall,            /* xGetSystemCall */
6237   apndNextSystemCall            /* xNextSystemCall */
6238 };
6239 
6240 static const sqlite3_io_methods apnd_io_methods = {
6241   3,                              /* iVersion */
6242   apndClose,                      /* xClose */
6243   apndRead,                       /* xRead */
6244   apndWrite,                      /* xWrite */
6245   apndTruncate,                   /* xTruncate */
6246   apndSync,                       /* xSync */
6247   apndFileSize,                   /* xFileSize */
6248   apndLock,                       /* xLock */
6249   apndUnlock,                     /* xUnlock */
6250   apndCheckReservedLock,          /* xCheckReservedLock */
6251   apndFileControl,                /* xFileControl */
6252   apndSectorSize,                 /* xSectorSize */
6253   apndDeviceCharacteristics,      /* xDeviceCharacteristics */
6254   apndShmMap,                     /* xShmMap */
6255   apndShmLock,                    /* xShmLock */
6256   apndShmBarrier,                 /* xShmBarrier */
6257   apndShmUnmap,                   /* xShmUnmap */
6258   apndFetch,                      /* xFetch */
6259   apndUnfetch                     /* xUnfetch */
6260 };
6261 
6262 /*
6263 ** Close an apnd-file.
6264 */
6265 static int apndClose(sqlite3_file *pFile){
6266   pFile = ORIGFILE(pFile);
6267   return pFile->pMethods->xClose(pFile);
6268 }
6269 
6270 /*
6271 ** Read data from an apnd-file.
6272 */
6273 static int apndRead(
6274   sqlite3_file *pFile,
6275   void *zBuf,
6276   int iAmt,
6277   sqlite_int64 iOfst
6278 ){
6279   ApndFile *paf = (ApndFile *)pFile;
6280   pFile = ORIGFILE(pFile);
6281   return pFile->pMethods->xRead(pFile, zBuf, iAmt, paf->iPgOne+iOfst);
6282 }
6283 
6284 /*
6285 ** Add the append-mark onto what should become the end of the file.
6286 *  If and only if this succeeds, internal ApndFile.iMark is updated.
6287 *  Parameter iWriteEnd is the appendvfs-relative offset of the new mark.
6288 */
6289 static int apndWriteMark(
6290   ApndFile *paf,
6291   sqlite3_file *pFile,
6292   sqlite_int64 iWriteEnd
6293 ){
6294   sqlite_int64 iPgOne = paf->iPgOne;
6295   unsigned char a[APND_MARK_SIZE];
6296   int i = APND_MARK_FOS_SZ;
6297   int rc;
6298   assert(pFile == ORIGFILE(paf));
6299   memcpy(a, APND_MARK_PREFIX, APND_MARK_PREFIX_SZ);
6300   while( --i >= 0 ){
6301     a[APND_MARK_PREFIX_SZ+i] = (unsigned char)(iPgOne & 0xff);
6302     iPgOne >>= 8;
6303   }
6304   iWriteEnd += paf->iPgOne;
6305   if( SQLITE_OK==(rc = pFile->pMethods->xWrite
6306                   (pFile, a, APND_MARK_SIZE, iWriteEnd)) ){
6307     paf->iMark = iWriteEnd;
6308   }
6309   return rc;
6310 }
6311 
6312 /*
6313 ** Write data to an apnd-file.
6314 */
6315 static int apndWrite(
6316   sqlite3_file *pFile,
6317   const void *zBuf,
6318   int iAmt,
6319   sqlite_int64 iOfst
6320 ){
6321   ApndFile *paf = (ApndFile *)pFile;
6322   sqlite_int64 iWriteEnd = iOfst + iAmt;
6323   if( iWriteEnd>=APND_MAX_SIZE ) return SQLITE_FULL;
6324   pFile = ORIGFILE(pFile);
6325   /* If append-mark is absent or will be overwritten, write it. */
6326   if( paf->iMark < 0 || paf->iPgOne + iWriteEnd > paf->iMark ){
6327     int rc = apndWriteMark(paf, pFile, iWriteEnd);
6328     if( SQLITE_OK!=rc ) return rc;
6329   }
6330   return pFile->pMethods->xWrite(pFile, zBuf, iAmt, paf->iPgOne+iOfst);
6331 }
6332 
6333 /*
6334 ** Truncate an apnd-file.
6335 */
6336 static int apndTruncate(sqlite3_file *pFile, sqlite_int64 size){
6337   ApndFile *paf = (ApndFile *)pFile;
6338   pFile = ORIGFILE(pFile);
6339   /* The append mark goes out first so truncate failure does not lose it. */
6340   if( SQLITE_OK!=apndWriteMark(paf, pFile, size) ) return SQLITE_IOERR;
6341   /* Truncate underlying file just past append mark */
6342   return pFile->pMethods->xTruncate(pFile, paf->iMark+APND_MARK_SIZE);
6343 }
6344 
6345 /*
6346 ** Sync an apnd-file.
6347 */
6348 static int apndSync(sqlite3_file *pFile, int flags){
6349   pFile = ORIGFILE(pFile);
6350   return pFile->pMethods->xSync(pFile, flags);
6351 }
6352 
6353 /*
6354 ** Return the current file-size of an apnd-file.
6355 ** If the append mark is not yet there, the file-size is 0.
6356 */
6357 static int apndFileSize(sqlite3_file *pFile, sqlite_int64 *pSize){
6358   ApndFile *paf = (ApndFile *)pFile;
6359   *pSize = ( paf->iMark >= 0 )? (paf->iMark - paf->iPgOne) : 0;
6360   return SQLITE_OK;
6361 }
6362 
6363 /*
6364 ** Lock an apnd-file.
6365 */
6366 static int apndLock(sqlite3_file *pFile, int eLock){
6367   pFile = ORIGFILE(pFile);
6368   return pFile->pMethods->xLock(pFile, eLock);
6369 }
6370 
6371 /*
6372 ** Unlock an apnd-file.
6373 */
6374 static int apndUnlock(sqlite3_file *pFile, int eLock){
6375   pFile = ORIGFILE(pFile);
6376   return pFile->pMethods->xUnlock(pFile, eLock);
6377 }
6378 
6379 /*
6380 ** Check if another file-handle holds a RESERVED lock on an apnd-file.
6381 */
6382 static int apndCheckReservedLock(sqlite3_file *pFile, int *pResOut){
6383   pFile = ORIGFILE(pFile);
6384   return pFile->pMethods->xCheckReservedLock(pFile, pResOut);
6385 }
6386 
6387 /*
6388 ** File control method. For custom operations on an apnd-file.
6389 */
6390 static int apndFileControl(sqlite3_file *pFile, int op, void *pArg){
6391   ApndFile *paf = (ApndFile *)pFile;
6392   int rc;
6393   pFile = ORIGFILE(pFile);
6394   if( op==SQLITE_FCNTL_SIZE_HINT ) *(sqlite3_int64*)pArg += paf->iPgOne;
6395   rc = pFile->pMethods->xFileControl(pFile, op, pArg);
6396   if( rc==SQLITE_OK && op==SQLITE_FCNTL_VFSNAME ){
6397     *(char**)pArg = sqlite3_mprintf("apnd(%lld)/%z", paf->iPgOne,*(char**)pArg);
6398   }
6399   return rc;
6400 }
6401 
6402 /*
6403 ** Return the sector-size in bytes for an apnd-file.
6404 */
6405 static int apndSectorSize(sqlite3_file *pFile){
6406   pFile = ORIGFILE(pFile);
6407   return pFile->pMethods->xSectorSize(pFile);
6408 }
6409 
6410 /*
6411 ** Return the device characteristic flags supported by an apnd-file.
6412 */
6413 static int apndDeviceCharacteristics(sqlite3_file *pFile){
6414   pFile = ORIGFILE(pFile);
6415   return pFile->pMethods->xDeviceCharacteristics(pFile);
6416 }
6417 
6418 /* Create a shared memory file mapping */
6419 static int apndShmMap(
6420   sqlite3_file *pFile,
6421   int iPg,
6422   int pgsz,
6423   int bExtend,
6424   void volatile **pp
6425 ){
6426   pFile = ORIGFILE(pFile);
6427   return pFile->pMethods->xShmMap(pFile,iPg,pgsz,bExtend,pp);
6428 }
6429 
6430 /* Perform locking on a shared-memory segment */
6431 static int apndShmLock(sqlite3_file *pFile, int offset, int n, int flags){
6432   pFile = ORIGFILE(pFile);
6433   return pFile->pMethods->xShmLock(pFile,offset,n,flags);
6434 }
6435 
6436 /* Memory barrier operation on shared memory */
6437 static void apndShmBarrier(sqlite3_file *pFile){
6438   pFile = ORIGFILE(pFile);
6439   pFile->pMethods->xShmBarrier(pFile);
6440 }
6441 
6442 /* Unmap a shared memory segment */
6443 static int apndShmUnmap(sqlite3_file *pFile, int deleteFlag){
6444   pFile = ORIGFILE(pFile);
6445   return pFile->pMethods->xShmUnmap(pFile,deleteFlag);
6446 }
6447 
6448 /* Fetch a page of a memory-mapped file */
6449 static int apndFetch(
6450   sqlite3_file *pFile,
6451   sqlite3_int64 iOfst,
6452   int iAmt,
6453   void **pp
6454 ){
6455   ApndFile *p = (ApndFile *)pFile;
6456   if( p->iMark < 0 || iOfst+iAmt > p->iMark ){
6457     return SQLITE_IOERR; /* Cannot read what is not yet there. */
6458   }
6459   pFile = ORIGFILE(pFile);
6460   return pFile->pMethods->xFetch(pFile, iOfst+p->iPgOne, iAmt, pp);
6461 }
6462 
6463 /* Release a memory-mapped page */
6464 static int apndUnfetch(sqlite3_file *pFile, sqlite3_int64 iOfst, void *pPage){
6465   ApndFile *p = (ApndFile *)pFile;
6466   pFile = ORIGFILE(pFile);
6467   return pFile->pMethods->xUnfetch(pFile, iOfst+p->iPgOne, pPage);
6468 }
6469 
6470 /*
6471 ** Try to read the append-mark off the end of a file.  Return the
6472 ** start of the appended database if the append-mark is present.
6473 ** If there is no valid append-mark, return -1;
6474 **
6475 ** An append-mark is only valid if the NNNNNNNN start-of-database offset
6476 ** indicates that the appended database contains at least one page.  The
6477 ** start-of-database value must be a multiple of 512.
6478 */
6479 static sqlite3_int64 apndReadMark(sqlite3_int64 sz, sqlite3_file *pFile){
6480   int rc, i;
6481   sqlite3_int64 iMark;
6482   int msbs = 8 * (APND_MARK_FOS_SZ-1);
6483   unsigned char a[APND_MARK_SIZE];
6484 
6485   if( APND_MARK_SIZE!=(sz & 0x1ff) ) return -1;
6486   rc = pFile->pMethods->xRead(pFile, a, APND_MARK_SIZE, sz-APND_MARK_SIZE);
6487   if( rc ) return -1;
6488   if( memcmp(a, APND_MARK_PREFIX, APND_MARK_PREFIX_SZ)!=0 ) return -1;
6489   iMark = ((sqlite3_int64)(a[APND_MARK_PREFIX_SZ] & 0x7f)) << msbs;
6490   for(i=1; i<8; i++){
6491     msbs -= 8;
6492     iMark |= (sqlite3_int64)a[APND_MARK_PREFIX_SZ+i]<<msbs;
6493   }
6494   if( iMark > (sz - APND_MARK_SIZE - 512) ) return -1;
6495   if( iMark & 0x1ff ) return -1;
6496   return iMark;
6497 }
6498 
6499 static const char apvfsSqliteHdr[] = "SQLite format 3";
6500 /*
6501 ** Check to see if the file is an appendvfs SQLite database file.
6502 ** Return true iff it is such. Parameter sz is the file's size.
6503 */
6504 static int apndIsAppendvfsDatabase(sqlite3_int64 sz, sqlite3_file *pFile){
6505   int rc;
6506   char zHdr[16];
6507   sqlite3_int64 iMark = apndReadMark(sz, pFile);
6508   if( iMark>=0 ){
6509     /* If file has the correct end-marker, the expected odd size, and the
6510     ** SQLite DB type marker where the end-marker puts it, then it
6511     ** is an appendvfs database.
6512     */
6513     rc = pFile->pMethods->xRead(pFile, zHdr, sizeof(zHdr), iMark);
6514     if( SQLITE_OK==rc
6515      && memcmp(zHdr, apvfsSqliteHdr, sizeof(zHdr))==0
6516      && (sz & 0x1ff) == APND_MARK_SIZE
6517      && sz>=512+APND_MARK_SIZE
6518     ){
6519       return 1; /* It's an appendvfs database */
6520     }
6521   }
6522   return 0;
6523 }
6524 
6525 /*
6526 ** Check to see if the file is an ordinary SQLite database file.
6527 ** Return true iff so. Parameter sz is the file's size.
6528 */
6529 static int apndIsOrdinaryDatabaseFile(sqlite3_int64 sz, sqlite3_file *pFile){
6530   char zHdr[16];
6531   if( apndIsAppendvfsDatabase(sz, pFile) /* rule 2 */
6532    || (sz & 0x1ff) != 0
6533    || SQLITE_OK!=pFile->pMethods->xRead(pFile, zHdr, sizeof(zHdr), 0)
6534    || memcmp(zHdr, apvfsSqliteHdr, sizeof(zHdr))!=0
6535   ){
6536     return 0;
6537   }else{
6538     return 1;
6539   }
6540 }
6541 
6542 /*
6543 ** Open an apnd file handle.
6544 */
6545 static int apndOpen(
6546   sqlite3_vfs *pApndVfs,
6547   const char *zName,
6548   sqlite3_file *pFile,
6549   int flags,
6550   int *pOutFlags
6551 ){
6552   ApndFile *pApndFile = (ApndFile*)pFile;
6553   sqlite3_file *pBaseFile = ORIGFILE(pFile);
6554   sqlite3_vfs *pBaseVfs = ORIGVFS(pApndVfs);
6555   int rc;
6556   sqlite3_int64 sz = 0;
6557   if( (flags & SQLITE_OPEN_MAIN_DB)==0 ){
6558     /* The appendvfs is not to be used for transient or temporary databases.
6559     ** Just use the base VFS open to initialize the given file object and
6560     ** open the underlying file. (Appendvfs is then unused for this file.)
6561     */
6562     return pBaseVfs->xOpen(pBaseVfs, zName, pFile, flags, pOutFlags);
6563   }
6564   memset(pApndFile, 0, sizeof(ApndFile));
6565   pFile->pMethods = &apnd_io_methods;
6566   pApndFile->iMark = -1;    /* Append mark not yet written */
6567 
6568   rc = pBaseVfs->xOpen(pBaseVfs, zName, pBaseFile, flags, pOutFlags);
6569   if( rc==SQLITE_OK ){
6570     rc = pBaseFile->pMethods->xFileSize(pBaseFile, &sz);
6571     if( rc ){
6572       pBaseFile->pMethods->xClose(pBaseFile);
6573     }
6574   }
6575   if( rc ){
6576     pFile->pMethods = 0;
6577     return rc;
6578   }
6579   if( apndIsOrdinaryDatabaseFile(sz, pBaseFile) ){
6580     /* The file being opened appears to be just an ordinary DB. Copy
6581     ** the base dispatch-table so this instance mimics the base VFS.
6582     */
6583     memmove(pApndFile, pBaseFile, pBaseVfs->szOsFile);
6584     return SQLITE_OK;
6585   }
6586   pApndFile->iPgOne = apndReadMark(sz, pFile);
6587   if( pApndFile->iPgOne>=0 ){
6588     pApndFile->iMark = sz - APND_MARK_SIZE; /* Append mark found */
6589     return SQLITE_OK;
6590   }
6591   if( (flags & SQLITE_OPEN_CREATE)==0 ){
6592     pBaseFile->pMethods->xClose(pBaseFile);
6593     rc = SQLITE_CANTOPEN;
6594     pFile->pMethods = 0;
6595   }else{
6596     /* Round newly added appendvfs location to #define'd page boundary.
6597     ** Note that nothing has yet been written to the underlying file.
6598     ** The append mark will be written along with first content write.
6599     ** Until then, paf->iMark value indicates it is not yet written.
6600     */
6601     pApndFile->iPgOne = APND_START_ROUNDUP(sz);
6602   }
6603   return rc;
6604 }
6605 
6606 /*
6607 ** Delete an apnd file.
6608 ** For an appendvfs, this could mean delete the appendvfs portion,
6609 ** leaving the appendee as it was before it gained an appendvfs.
6610 ** For now, this code deletes the underlying file too.
6611 */
6612 static int apndDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){
6613   return ORIGVFS(pVfs)->xDelete(ORIGVFS(pVfs), zPath, dirSync);
6614 }
6615 
6616 /*
6617 ** All other VFS methods are pass-thrus.
6618 */
6619 static int apndAccess(
6620   sqlite3_vfs *pVfs,
6621   const char *zPath,
6622   int flags,
6623   int *pResOut
6624 ){
6625   return ORIGVFS(pVfs)->xAccess(ORIGVFS(pVfs), zPath, flags, pResOut);
6626 }
6627 static int apndFullPathname(
6628   sqlite3_vfs *pVfs,
6629   const char *zPath,
6630   int nOut,
6631   char *zOut
6632 ){
6633   return ORIGVFS(pVfs)->xFullPathname(ORIGVFS(pVfs),zPath,nOut,zOut);
6634 }
6635 static void *apndDlOpen(sqlite3_vfs *pVfs, const char *zPath){
6636   return ORIGVFS(pVfs)->xDlOpen(ORIGVFS(pVfs), zPath);
6637 }
6638 static void apndDlError(sqlite3_vfs *pVfs, int nByte, char *zErrMsg){
6639   ORIGVFS(pVfs)->xDlError(ORIGVFS(pVfs), nByte, zErrMsg);
6640 }
6641 static void (*apndDlSym(sqlite3_vfs *pVfs, void *p, const char *zSym))(void){
6642   return ORIGVFS(pVfs)->xDlSym(ORIGVFS(pVfs), p, zSym);
6643 }
6644 static void apndDlClose(sqlite3_vfs *pVfs, void *pHandle){
6645   ORIGVFS(pVfs)->xDlClose(ORIGVFS(pVfs), pHandle);
6646 }
6647 static int apndRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){
6648   return ORIGVFS(pVfs)->xRandomness(ORIGVFS(pVfs), nByte, zBufOut);
6649 }
6650 static int apndSleep(sqlite3_vfs *pVfs, int nMicro){
6651   return ORIGVFS(pVfs)->xSleep(ORIGVFS(pVfs), nMicro);
6652 }
6653 static int apndCurrentTime(sqlite3_vfs *pVfs, double *pTimeOut){
6654   return ORIGVFS(pVfs)->xCurrentTime(ORIGVFS(pVfs), pTimeOut);
6655 }
6656 static int apndGetLastError(sqlite3_vfs *pVfs, int a, char *b){
6657   return ORIGVFS(pVfs)->xGetLastError(ORIGVFS(pVfs), a, b);
6658 }
6659 static int apndCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *p){
6660   return ORIGVFS(pVfs)->xCurrentTimeInt64(ORIGVFS(pVfs), p);
6661 }
6662 static int apndSetSystemCall(
6663   sqlite3_vfs *pVfs,
6664   const char *zName,
6665   sqlite3_syscall_ptr pCall
6666 ){
6667   return ORIGVFS(pVfs)->xSetSystemCall(ORIGVFS(pVfs),zName,pCall);
6668 }
6669 static sqlite3_syscall_ptr apndGetSystemCall(
6670   sqlite3_vfs *pVfs,
6671   const char *zName
6672 ){
6673   return ORIGVFS(pVfs)->xGetSystemCall(ORIGVFS(pVfs),zName);
6674 }
6675 static const char *apndNextSystemCall(sqlite3_vfs *pVfs, const char *zName){
6676   return ORIGVFS(pVfs)->xNextSystemCall(ORIGVFS(pVfs), zName);
6677 }
6678 
6679 
6680 #ifdef _WIN32
6681 
6682 #endif
6683 /*
6684 ** This routine is called when the extension is loaded.
6685 ** Register the new VFS.
6686 */
6687 int sqlite3_appendvfs_init(
6688   sqlite3 *db,
6689   char **pzErrMsg,
6690   const sqlite3_api_routines *pApi
6691 ){
6692   int rc = SQLITE_OK;
6693   sqlite3_vfs *pOrig;
6694   SQLITE_EXTENSION_INIT2(pApi);
6695   (void)pzErrMsg;
6696   (void)db;
6697   pOrig = sqlite3_vfs_find(0);
6698   if( pOrig==0 ) return SQLITE_ERROR;
6699   apnd_vfs.iVersion = pOrig->iVersion;
6700   apnd_vfs.pAppData = pOrig;
6701   apnd_vfs.szOsFile = pOrig->szOsFile + sizeof(ApndFile);
6702   rc = sqlite3_vfs_register(&apnd_vfs, 0);
6703 #ifdef APPENDVFS_TEST
6704   if( rc==SQLITE_OK ){
6705     rc = sqlite3_auto_extension((void(*)(void))apndvfsRegister);
6706   }
6707 #endif
6708   if( rc==SQLITE_OK ) rc = SQLITE_OK_LOAD_PERMANENTLY;
6709   return rc;
6710 }
6711 
6712 /************************* End ../ext/misc/appendvfs.c ********************/
6713 #endif
6714 #ifdef SQLITE_HAVE_ZLIB
6715 /************************* Begin ../ext/misc/zipfile.c ******************/
6716 /*
6717 ** 2017-12-26
6718 **
6719 ** The author disclaims copyright to this source code.  In place of
6720 ** a legal notice, here is a blessing:
6721 **
6722 **    May you do good and not evil.
6723 **    May you find forgiveness for yourself and forgive others.
6724 **    May you share freely, never taking more than you give.
6725 **
6726 ******************************************************************************
6727 **
6728 ** This file implements a virtual table for reading and writing ZIP archive
6729 ** files.
6730 **
6731 ** Usage example:
6732 **
6733 **     SELECT name, sz, datetime(mtime,'unixepoch') FROM zipfile($filename);
6734 **
6735 ** Current limitations:
6736 **
6737 **    *  No support for encryption
6738 **    *  No support for ZIP archives spanning multiple files
6739 **    *  No support for zip64 extensions
6740 **    *  Only the "inflate/deflate" (zlib) compression method is supported
6741 */
6742 /* #include "sqlite3ext.h" */
6743 SQLITE_EXTENSION_INIT1
6744 #include <stdio.h>
6745 #include <string.h>
6746 #include <assert.h>
6747 
6748 #include <zlib.h>
6749 
6750 #ifndef SQLITE_OMIT_VIRTUALTABLE
6751 
6752 #ifndef SQLITE_AMALGAMATION
6753 
6754 #ifndef UINT32_TYPE
6755 # ifdef HAVE_UINT32_T
6756 #  define UINT32_TYPE uint32_t
6757 # else
6758 #  define UINT32_TYPE unsigned int
6759 # endif
6760 #endif
6761 #ifndef UINT16_TYPE
6762 # ifdef HAVE_UINT16_T
6763 #  define UINT16_TYPE uint16_t
6764 # else
6765 #  define UINT16_TYPE unsigned short int
6766 # endif
6767 #endif
6768 /* typedef sqlite3_int64 i64; */
6769 /* typedef unsigned char u8; */
6770 typedef UINT32_TYPE u32;           /* 4-byte unsigned integer */
6771 typedef UINT16_TYPE u16;           /* 2-byte unsigned integer */
6772 #define MIN(a,b) ((a)<(b) ? (a) : (b))
6773 
6774 #if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST)
6775 # define SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS 1
6776 #endif
6777 #if defined(SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS)
6778 # define ALWAYS(X)      (1)
6779 # define NEVER(X)       (0)
6780 #elif !defined(NDEBUG)
6781 # define ALWAYS(X)      ((X)?1:(assert(0),0))
6782 # define NEVER(X)       ((X)?(assert(0),1):0)
6783 #else
6784 # define ALWAYS(X)      (X)
6785 # define NEVER(X)       (X)
6786 #endif
6787 
6788 #endif   /* SQLITE_AMALGAMATION */
6789 
6790 /*
6791 ** Definitions for mode bitmasks S_IFDIR, S_IFREG and S_IFLNK.
6792 **
6793 ** In some ways it would be better to obtain these values from system
6794 ** header files. But, the dependency is undesirable and (a) these
6795 ** have been stable for decades, (b) the values are part of POSIX and
6796 ** are also made explicit in [man stat], and (c) are part of the
6797 ** file format for zip archives.
6798 */
6799 #ifndef S_IFDIR
6800 # define S_IFDIR 0040000
6801 #endif
6802 #ifndef S_IFREG
6803 # define S_IFREG 0100000
6804 #endif
6805 #ifndef S_IFLNK
6806 # define S_IFLNK 0120000
6807 #endif
6808 
6809 static const char ZIPFILE_SCHEMA[] =
6810   "CREATE TABLE y("
6811     "name PRIMARY KEY,"  /* 0: Name of file in zip archive */
6812     "mode,"              /* 1: POSIX mode for file */
6813     "mtime,"             /* 2: Last modification time (secs since 1970)*/
6814     "sz,"                /* 3: Size of object */
6815     "rawdata,"           /* 4: Raw data */
6816     "data,"              /* 5: Uncompressed data */
6817     "method,"            /* 6: Compression method (integer) */
6818     "z HIDDEN"           /* 7: Name of zip file */
6819   ") WITHOUT ROWID;";
6820 
6821 #define ZIPFILE_F_COLUMN_IDX 7    /* Index of column "file" in the above */
6822 #define ZIPFILE_BUFFER_SIZE (64*1024)
6823 
6824 
6825 /*
6826 ** Magic numbers used to read and write zip files.
6827 **
6828 ** ZIPFILE_NEWENTRY_MADEBY:
6829 **   Use this value for the "version-made-by" field in new zip file
6830 **   entries. The upper byte indicates "unix", and the lower byte
6831 **   indicates that the zip file matches pkzip specification 3.0.
6832 **   This is what info-zip seems to do.
6833 **
6834 ** ZIPFILE_NEWENTRY_REQUIRED:
6835 **   Value for "version-required-to-extract" field of new entries.
6836 **   Version 2.0 is required to support folders and deflate compression.
6837 **
6838 ** ZIPFILE_NEWENTRY_FLAGS:
6839 **   Value for "general-purpose-bit-flags" field of new entries. Bit
6840 **   11 means "utf-8 filename and comment".
6841 **
6842 ** ZIPFILE_SIGNATURE_CDS:
6843 **   First 4 bytes of a valid CDS record.
6844 **
6845 ** ZIPFILE_SIGNATURE_LFH:
6846 **   First 4 bytes of a valid LFH record.
6847 **
6848 ** ZIPFILE_SIGNATURE_EOCD
6849 **   First 4 bytes of a valid EOCD record.
6850 */
6851 #define ZIPFILE_EXTRA_TIMESTAMP   0x5455
6852 #define ZIPFILE_NEWENTRY_MADEBY   ((3<<8) + 30)
6853 #define ZIPFILE_NEWENTRY_REQUIRED 20
6854 #define ZIPFILE_NEWENTRY_FLAGS    0x800
6855 #define ZIPFILE_SIGNATURE_CDS     0x02014b50
6856 #define ZIPFILE_SIGNATURE_LFH     0x04034b50
6857 #define ZIPFILE_SIGNATURE_EOCD    0x06054b50
6858 
6859 /*
6860 ** The sizes of the fixed-size part of each of the three main data
6861 ** structures in a zip archive.
6862 */
6863 #define ZIPFILE_LFH_FIXED_SZ      30
6864 #define ZIPFILE_EOCD_FIXED_SZ     22
6865 #define ZIPFILE_CDS_FIXED_SZ      46
6866 
6867 /*
6868 *** 4.3.16  End of central directory record:
6869 ***
6870 ***   end of central dir signature    4 bytes  (0x06054b50)
6871 ***   number of this disk             2 bytes
6872 ***   number of the disk with the
6873 ***   start of the central directory  2 bytes
6874 ***   total number of entries in the
6875 ***   central directory on this disk  2 bytes
6876 ***   total number of entries in
6877 ***   the central directory           2 bytes
6878 ***   size of the central directory   4 bytes
6879 ***   offset of start of central
6880 ***   directory with respect to
6881 ***   the starting disk number        4 bytes
6882 ***   .ZIP file comment length        2 bytes
6883 ***   .ZIP file comment       (variable size)
6884 */
6885 typedef struct ZipfileEOCD ZipfileEOCD;
6886 struct ZipfileEOCD {
6887   u16 iDisk;
6888   u16 iFirstDisk;
6889   u16 nEntry;
6890   u16 nEntryTotal;
6891   u32 nSize;
6892   u32 iOffset;
6893 };
6894 
6895 /*
6896 *** 4.3.12  Central directory structure:
6897 ***
6898 *** ...
6899 ***
6900 ***   central file header signature   4 bytes  (0x02014b50)
6901 ***   version made by                 2 bytes
6902 ***   version needed to extract       2 bytes
6903 ***   general purpose bit flag        2 bytes
6904 ***   compression method              2 bytes
6905 ***   last mod file time              2 bytes
6906 ***   last mod file date              2 bytes
6907 ***   crc-32                          4 bytes
6908 ***   compressed size                 4 bytes
6909 ***   uncompressed size               4 bytes
6910 ***   file name length                2 bytes
6911 ***   extra field length              2 bytes
6912 ***   file comment length             2 bytes
6913 ***   disk number start               2 bytes
6914 ***   internal file attributes        2 bytes
6915 ***   external file attributes        4 bytes
6916 ***   relative offset of local header 4 bytes
6917 */
6918 typedef struct ZipfileCDS ZipfileCDS;
6919 struct ZipfileCDS {
6920   u16 iVersionMadeBy;
6921   u16 iVersionExtract;
6922   u16 flags;
6923   u16 iCompression;
6924   u16 mTime;
6925   u16 mDate;
6926   u32 crc32;
6927   u32 szCompressed;
6928   u32 szUncompressed;
6929   u16 nFile;
6930   u16 nExtra;
6931   u16 nComment;
6932   u16 iDiskStart;
6933   u16 iInternalAttr;
6934   u32 iExternalAttr;
6935   u32 iOffset;
6936   char *zFile;                    /* Filename (sqlite3_malloc()) */
6937 };
6938 
6939 /*
6940 *** 4.3.7  Local file header:
6941 ***
6942 ***   local file header signature     4 bytes  (0x04034b50)
6943 ***   version needed to extract       2 bytes
6944 ***   general purpose bit flag        2 bytes
6945 ***   compression method              2 bytes
6946 ***   last mod file time              2 bytes
6947 ***   last mod file date              2 bytes
6948 ***   crc-32                          4 bytes
6949 ***   compressed size                 4 bytes
6950 ***   uncompressed size               4 bytes
6951 ***   file name length                2 bytes
6952 ***   extra field length              2 bytes
6953 ***
6954 */
6955 typedef struct ZipfileLFH ZipfileLFH;
6956 struct ZipfileLFH {
6957   u16 iVersionExtract;
6958   u16 flags;
6959   u16 iCompression;
6960   u16 mTime;
6961   u16 mDate;
6962   u32 crc32;
6963   u32 szCompressed;
6964   u32 szUncompressed;
6965   u16 nFile;
6966   u16 nExtra;
6967 };
6968 
6969 typedef struct ZipfileEntry ZipfileEntry;
6970 struct ZipfileEntry {
6971   ZipfileCDS cds;            /* Parsed CDS record */
6972   u32 mUnixTime;             /* Modification time, in UNIX format */
6973   u8 *aExtra;                /* cds.nExtra+cds.nComment bytes of extra data */
6974   i64 iDataOff;              /* Offset to data in file (if aData==0) */
6975   u8 *aData;                 /* cds.szCompressed bytes of compressed data */
6976   ZipfileEntry *pNext;       /* Next element in in-memory CDS */
6977 };
6978 
6979 /*
6980 ** Cursor type for zipfile tables.
6981 */
6982 typedef struct ZipfileCsr ZipfileCsr;
6983 struct ZipfileCsr {
6984   sqlite3_vtab_cursor base;  /* Base class - must be first */
6985   i64 iId;                   /* Cursor ID */
6986   u8 bEof;                   /* True when at EOF */
6987   u8 bNoop;                  /* If next xNext() call is no-op */
6988 
6989   /* Used outside of write transactions */
6990   FILE *pFile;               /* Zip file */
6991   i64 iNextOff;              /* Offset of next record in central directory */
6992   ZipfileEOCD eocd;          /* Parse of central directory record */
6993 
6994   ZipfileEntry *pFreeEntry;  /* Free this list when cursor is closed or reset */
6995   ZipfileEntry *pCurrent;    /* Current entry */
6996   ZipfileCsr *pCsrNext;      /* Next cursor on same virtual table */
6997 };
6998 
6999 typedef struct ZipfileTab ZipfileTab;
7000 struct ZipfileTab {
7001   sqlite3_vtab base;         /* Base class - must be first */
7002   char *zFile;               /* Zip file this table accesses (may be NULL) */
7003   sqlite3 *db;               /* Host database connection */
7004   u8 *aBuffer;               /* Temporary buffer used for various tasks */
7005 
7006   ZipfileCsr *pCsrList;      /* List of cursors */
7007   i64 iNextCsrid;
7008 
7009   /* The following are used by write transactions only */
7010   ZipfileEntry *pFirstEntry; /* Linked list of all files (if pWriteFd!=0) */
7011   ZipfileEntry *pLastEntry;  /* Last element in pFirstEntry list */
7012   FILE *pWriteFd;            /* File handle open on zip archive */
7013   i64 szCurrent;             /* Current size of zip archive */
7014   i64 szOrig;                /* Size of archive at start of transaction */
7015 };
7016 
7017 /*
7018 ** Set the error message contained in context ctx to the results of
7019 ** vprintf(zFmt, ...).
7020 */
7021 static void zipfileCtxErrorMsg(sqlite3_context *ctx, const char *zFmt, ...){
7022   char *zMsg = 0;
7023   va_list ap;
7024   va_start(ap, zFmt);
7025   zMsg = sqlite3_vmprintf(zFmt, ap);
7026   sqlite3_result_error(ctx, zMsg, -1);
7027   sqlite3_free(zMsg);
7028   va_end(ap);
7029 }
7030 
7031 /*
7032 ** If string zIn is quoted, dequote it in place. Otherwise, if the string
7033 ** is not quoted, do nothing.
7034 */
7035 static void zipfileDequote(char *zIn){
7036   char q = zIn[0];
7037   if( q=='"' || q=='\'' || q=='`' || q=='[' ){
7038     int iIn = 1;
7039     int iOut = 0;
7040     if( q=='[' ) q = ']';
7041     while( ALWAYS(zIn[iIn]) ){
7042       char c = zIn[iIn++];
7043       if( c==q && zIn[iIn++]!=q ) break;
7044       zIn[iOut++] = c;
7045     }
7046     zIn[iOut] = '\0';
7047   }
7048 }
7049 
7050 /*
7051 ** Construct a new ZipfileTab virtual table object.
7052 **
7053 **   argv[0]   -> module name  ("zipfile")
7054 **   argv[1]   -> database name
7055 **   argv[2]   -> table name
7056 **   argv[...] -> "column name" and other module argument fields.
7057 */
7058 static int zipfileConnect(
7059   sqlite3 *db,
7060   void *pAux,
7061   int argc, const char *const*argv,
7062   sqlite3_vtab **ppVtab,
7063   char **pzErr
7064 ){
7065   int nByte = sizeof(ZipfileTab) + ZIPFILE_BUFFER_SIZE;
7066   int nFile = 0;
7067   const char *zFile = 0;
7068   ZipfileTab *pNew = 0;
7069   int rc;
7070 
7071   /* If the table name is not "zipfile", require that the argument be
7072   ** specified. This stops zipfile tables from being created as:
7073   **
7074   **   CREATE VIRTUAL TABLE zzz USING zipfile();
7075   **
7076   ** It does not prevent:
7077   **
7078   **   CREATE VIRTUAL TABLE zipfile USING zipfile();
7079   */
7080   assert( 0==sqlite3_stricmp(argv[0], "zipfile") );
7081   if( (0!=sqlite3_stricmp(argv[2], "zipfile") && argc<4) || argc>4 ){
7082     *pzErr = sqlite3_mprintf("zipfile constructor requires one argument");
7083     return SQLITE_ERROR;
7084   }
7085 
7086   if( argc>3 ){
7087     zFile = argv[3];
7088     nFile = (int)strlen(zFile)+1;
7089   }
7090 
7091   rc = sqlite3_declare_vtab(db, ZIPFILE_SCHEMA);
7092   if( rc==SQLITE_OK ){
7093     pNew = (ZipfileTab*)sqlite3_malloc64((sqlite3_int64)nByte+nFile);
7094     if( pNew==0 ) return SQLITE_NOMEM;
7095     memset(pNew, 0, nByte+nFile);
7096     pNew->db = db;
7097     pNew->aBuffer = (u8*)&pNew[1];
7098     if( zFile ){
7099       pNew->zFile = (char*)&pNew->aBuffer[ZIPFILE_BUFFER_SIZE];
7100       memcpy(pNew->zFile, zFile, nFile);
7101       zipfileDequote(pNew->zFile);
7102     }
7103   }
7104   sqlite3_vtab_config(db, SQLITE_VTAB_DIRECTONLY);
7105   *ppVtab = (sqlite3_vtab*)pNew;
7106   return rc;
7107 }
7108 
7109 /*
7110 ** Free the ZipfileEntry structure indicated by the only argument.
7111 */
7112 static void zipfileEntryFree(ZipfileEntry *p){
7113   if( p ){
7114     sqlite3_free(p->cds.zFile);
7115     sqlite3_free(p);
7116   }
7117 }
7118 
7119 /*
7120 ** Release resources that should be freed at the end of a write
7121 ** transaction.
7122 */
7123 static void zipfileCleanupTransaction(ZipfileTab *pTab){
7124   ZipfileEntry *pEntry;
7125   ZipfileEntry *pNext;
7126 
7127   if( pTab->pWriteFd ){
7128     fclose(pTab->pWriteFd);
7129     pTab->pWriteFd = 0;
7130   }
7131   for(pEntry=pTab->pFirstEntry; pEntry; pEntry=pNext){
7132     pNext = pEntry->pNext;
7133     zipfileEntryFree(pEntry);
7134   }
7135   pTab->pFirstEntry = 0;
7136   pTab->pLastEntry = 0;
7137   pTab->szCurrent = 0;
7138   pTab->szOrig = 0;
7139 }
7140 
7141 /*
7142 ** This method is the destructor for zipfile vtab objects.
7143 */
7144 static int zipfileDisconnect(sqlite3_vtab *pVtab){
7145   zipfileCleanupTransaction((ZipfileTab*)pVtab);
7146   sqlite3_free(pVtab);
7147   return SQLITE_OK;
7148 }
7149 
7150 /*
7151 ** Constructor for a new ZipfileCsr object.
7152 */
7153 static int zipfileOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCsr){
7154   ZipfileTab *pTab = (ZipfileTab*)p;
7155   ZipfileCsr *pCsr;
7156   pCsr = sqlite3_malloc(sizeof(*pCsr));
7157   *ppCsr = (sqlite3_vtab_cursor*)pCsr;
7158   if( pCsr==0 ){
7159     return SQLITE_NOMEM;
7160   }
7161   memset(pCsr, 0, sizeof(*pCsr));
7162   pCsr->iId = ++pTab->iNextCsrid;
7163   pCsr->pCsrNext = pTab->pCsrList;
7164   pTab->pCsrList = pCsr;
7165   return SQLITE_OK;
7166 }
7167 
7168 /*
7169 ** Reset a cursor back to the state it was in when first returned
7170 ** by zipfileOpen().
7171 */
7172 static void zipfileResetCursor(ZipfileCsr *pCsr){
7173   ZipfileEntry *p;
7174   ZipfileEntry *pNext;
7175 
7176   pCsr->bEof = 0;
7177   if( pCsr->pFile ){
7178     fclose(pCsr->pFile);
7179     pCsr->pFile = 0;
7180     zipfileEntryFree(pCsr->pCurrent);
7181     pCsr->pCurrent = 0;
7182   }
7183 
7184   for(p=pCsr->pFreeEntry; p; p=pNext){
7185     pNext = p->pNext;
7186     zipfileEntryFree(p);
7187   }
7188 }
7189 
7190 /*
7191 ** Destructor for an ZipfileCsr.
7192 */
7193 static int zipfileClose(sqlite3_vtab_cursor *cur){
7194   ZipfileCsr *pCsr = (ZipfileCsr*)cur;
7195   ZipfileTab *pTab = (ZipfileTab*)(pCsr->base.pVtab);
7196   ZipfileCsr **pp;
7197   zipfileResetCursor(pCsr);
7198 
7199   /* Remove this cursor from the ZipfileTab.pCsrList list. */
7200   for(pp=&pTab->pCsrList; *pp!=pCsr; pp=&((*pp)->pCsrNext));
7201   *pp = pCsr->pCsrNext;
7202 
7203   sqlite3_free(pCsr);
7204   return SQLITE_OK;
7205 }
7206 
7207 /*
7208 ** Set the error message for the virtual table associated with cursor
7209 ** pCsr to the results of vprintf(zFmt, ...).
7210 */
7211 static void zipfileTableErr(ZipfileTab *pTab, const char *zFmt, ...){
7212   va_list ap;
7213   va_start(ap, zFmt);
7214   sqlite3_free(pTab->base.zErrMsg);
7215   pTab->base.zErrMsg = sqlite3_vmprintf(zFmt, ap);
7216   va_end(ap);
7217 }
7218 static void zipfileCursorErr(ZipfileCsr *pCsr, const char *zFmt, ...){
7219   va_list ap;
7220   va_start(ap, zFmt);
7221   sqlite3_free(pCsr->base.pVtab->zErrMsg);
7222   pCsr->base.pVtab->zErrMsg = sqlite3_vmprintf(zFmt, ap);
7223   va_end(ap);
7224 }
7225 
7226 /*
7227 ** Read nRead bytes of data from offset iOff of file pFile into buffer
7228 ** aRead[]. Return SQLITE_OK if successful, or an SQLite error code
7229 ** otherwise.
7230 **
7231 ** If an error does occur, output variable (*pzErrmsg) may be set to point
7232 ** to an English language error message. It is the responsibility of the
7233 ** caller to eventually free this buffer using
7234 ** sqlite3_free().
7235 */
7236 static int zipfileReadData(
7237   FILE *pFile,                    /* Read from this file */
7238   u8 *aRead,                      /* Read into this buffer */
7239   int nRead,                      /* Number of bytes to read */
7240   i64 iOff,                       /* Offset to read from */
7241   char **pzErrmsg                 /* OUT: Error message (from sqlite3_malloc) */
7242 ){
7243   size_t n;
7244   fseek(pFile, (long)iOff, SEEK_SET);
7245   n = fread(aRead, 1, nRead, pFile);
7246   if( (int)n!=nRead ){
7247     *pzErrmsg = sqlite3_mprintf("error in fread()");
7248     return SQLITE_ERROR;
7249   }
7250   return SQLITE_OK;
7251 }
7252 
7253 static int zipfileAppendData(
7254   ZipfileTab *pTab,
7255   const u8 *aWrite,
7256   int nWrite
7257 ){
7258   if( nWrite>0 ){
7259     size_t n = nWrite;
7260     fseek(pTab->pWriteFd, (long)pTab->szCurrent, SEEK_SET);
7261     n = fwrite(aWrite, 1, nWrite, pTab->pWriteFd);
7262     if( (int)n!=nWrite ){
7263       pTab->base.zErrMsg = sqlite3_mprintf("error in fwrite()");
7264       return SQLITE_ERROR;
7265     }
7266     pTab->szCurrent += nWrite;
7267   }
7268   return SQLITE_OK;
7269 }
7270 
7271 /*
7272 ** Read and return a 16-bit little-endian unsigned integer from buffer aBuf.
7273 */
7274 static u16 zipfileGetU16(const u8 *aBuf){
7275   return (aBuf[1] << 8) + aBuf[0];
7276 }
7277 
7278 /*
7279 ** Read and return a 32-bit little-endian unsigned integer from buffer aBuf.
7280 */
7281 static u32 zipfileGetU32(const u8 *aBuf){
7282   if( aBuf==0 ) return 0;
7283   return ((u32)(aBuf[3]) << 24)
7284        + ((u32)(aBuf[2]) << 16)
7285        + ((u32)(aBuf[1]) <<  8)
7286        + ((u32)(aBuf[0]) <<  0);
7287 }
7288 
7289 /*
7290 ** Write a 16-bit little endiate integer into buffer aBuf.
7291 */
7292 static void zipfilePutU16(u8 *aBuf, u16 val){
7293   aBuf[0] = val & 0xFF;
7294   aBuf[1] = (val>>8) & 0xFF;
7295 }
7296 
7297 /*
7298 ** Write a 32-bit little endiate integer into buffer aBuf.
7299 */
7300 static void zipfilePutU32(u8 *aBuf, u32 val){
7301   aBuf[0] = val & 0xFF;
7302   aBuf[1] = (val>>8) & 0xFF;
7303   aBuf[2] = (val>>16) & 0xFF;
7304   aBuf[3] = (val>>24) & 0xFF;
7305 }
7306 
7307 #define zipfileRead32(aBuf) ( aBuf+=4, zipfileGetU32(aBuf-4) )
7308 #define zipfileRead16(aBuf) ( aBuf+=2, zipfileGetU16(aBuf-2) )
7309 
7310 #define zipfileWrite32(aBuf,val) { zipfilePutU32(aBuf,val); aBuf+=4; }
7311 #define zipfileWrite16(aBuf,val) { zipfilePutU16(aBuf,val); aBuf+=2; }
7312 
7313 /*
7314 ** Magic numbers used to read CDS records.
7315 */
7316 #define ZIPFILE_CDS_NFILE_OFF        28
7317 #define ZIPFILE_CDS_SZCOMPRESSED_OFF 20
7318 
7319 /*
7320 ** Decode the CDS record in buffer aBuf into (*pCDS). Return SQLITE_ERROR
7321 ** if the record is not well-formed, or SQLITE_OK otherwise.
7322 */
7323 static int zipfileReadCDS(u8 *aBuf, ZipfileCDS *pCDS){
7324   u8 *aRead = aBuf;
7325   u32 sig = zipfileRead32(aRead);
7326   int rc = SQLITE_OK;
7327   if( sig!=ZIPFILE_SIGNATURE_CDS ){
7328     rc = SQLITE_ERROR;
7329   }else{
7330     pCDS->iVersionMadeBy = zipfileRead16(aRead);
7331     pCDS->iVersionExtract = zipfileRead16(aRead);
7332     pCDS->flags = zipfileRead16(aRead);
7333     pCDS->iCompression = zipfileRead16(aRead);
7334     pCDS->mTime = zipfileRead16(aRead);
7335     pCDS->mDate = zipfileRead16(aRead);
7336     pCDS->crc32 = zipfileRead32(aRead);
7337     pCDS->szCompressed = zipfileRead32(aRead);
7338     pCDS->szUncompressed = zipfileRead32(aRead);
7339     assert( aRead==&aBuf[ZIPFILE_CDS_NFILE_OFF] );
7340     pCDS->nFile = zipfileRead16(aRead);
7341     pCDS->nExtra = zipfileRead16(aRead);
7342     pCDS->nComment = zipfileRead16(aRead);
7343     pCDS->iDiskStart = zipfileRead16(aRead);
7344     pCDS->iInternalAttr = zipfileRead16(aRead);
7345     pCDS->iExternalAttr = zipfileRead32(aRead);
7346     pCDS->iOffset = zipfileRead32(aRead);
7347     assert( aRead==&aBuf[ZIPFILE_CDS_FIXED_SZ] );
7348   }
7349 
7350   return rc;
7351 }
7352 
7353 /*
7354 ** Decode the LFH record in buffer aBuf into (*pLFH). Return SQLITE_ERROR
7355 ** if the record is not well-formed, or SQLITE_OK otherwise.
7356 */
7357 static int zipfileReadLFH(
7358   u8 *aBuffer,
7359   ZipfileLFH *pLFH
7360 ){
7361   u8 *aRead = aBuffer;
7362   int rc = SQLITE_OK;
7363 
7364   u32 sig = zipfileRead32(aRead);
7365   if( sig!=ZIPFILE_SIGNATURE_LFH ){
7366     rc = SQLITE_ERROR;
7367   }else{
7368     pLFH->iVersionExtract = zipfileRead16(aRead);
7369     pLFH->flags = zipfileRead16(aRead);
7370     pLFH->iCompression = zipfileRead16(aRead);
7371     pLFH->mTime = zipfileRead16(aRead);
7372     pLFH->mDate = zipfileRead16(aRead);
7373     pLFH->crc32 = zipfileRead32(aRead);
7374     pLFH->szCompressed = zipfileRead32(aRead);
7375     pLFH->szUncompressed = zipfileRead32(aRead);
7376     pLFH->nFile = zipfileRead16(aRead);
7377     pLFH->nExtra = zipfileRead16(aRead);
7378   }
7379   return rc;
7380 }
7381 
7382 
7383 /*
7384 ** Buffer aExtra (size nExtra bytes) contains zip archive "extra" fields.
7385 ** Scan through this buffer to find an "extra-timestamp" field. If one
7386 ** exists, extract the 32-bit modification-timestamp from it and store
7387 ** the value in output parameter *pmTime.
7388 **
7389 ** Zero is returned if no extra-timestamp record could be found (and so
7390 ** *pmTime is left unchanged), or non-zero otherwise.
7391 **
7392 ** The general format of an extra field is:
7393 **
7394 **   Header ID    2 bytes
7395 **   Data Size    2 bytes
7396 **   Data         N bytes
7397 */
7398 static int zipfileScanExtra(u8 *aExtra, int nExtra, u32 *pmTime){
7399   int ret = 0;
7400   u8 *p = aExtra;
7401   u8 *pEnd = &aExtra[nExtra];
7402 
7403   while( p<pEnd ){
7404     u16 id = zipfileRead16(p);
7405     u16 nByte = zipfileRead16(p);
7406 
7407     switch( id ){
7408       case ZIPFILE_EXTRA_TIMESTAMP: {
7409         u8 b = p[0];
7410         if( b & 0x01 ){     /* 0x01 -> modtime is present */
7411           *pmTime = zipfileGetU32(&p[1]);
7412           ret = 1;
7413         }
7414         break;
7415       }
7416     }
7417 
7418     p += nByte;
7419   }
7420   return ret;
7421 }
7422 
7423 /*
7424 ** Convert the standard MS-DOS timestamp stored in the mTime and mDate
7425 ** fields of the CDS structure passed as the only argument to a 32-bit
7426 ** UNIX seconds-since-the-epoch timestamp. Return the result.
7427 **
7428 ** "Standard" MS-DOS time format:
7429 **
7430 **   File modification time:
7431 **     Bits 00-04: seconds divided by 2
7432 **     Bits 05-10: minute
7433 **     Bits 11-15: hour
7434 **   File modification date:
7435 **     Bits 00-04: day
7436 **     Bits 05-08: month (1-12)
7437 **     Bits 09-15: years from 1980
7438 **
7439 ** https://msdn.microsoft.com/en-us/library/9kkf9tah.aspx
7440 */
7441 static u32 zipfileMtime(ZipfileCDS *pCDS){
7442   int Y,M,D,X1,X2,A,B,sec,min,hr;
7443   i64 JDsec;
7444   Y = (1980 + ((pCDS->mDate >> 9) & 0x7F));
7445   M = ((pCDS->mDate >> 5) & 0x0F);
7446   D = (pCDS->mDate & 0x1F);
7447   sec = (pCDS->mTime & 0x1F)*2;
7448   min = (pCDS->mTime >> 5) & 0x3F;
7449   hr = (pCDS->mTime >> 11) & 0x1F;
7450   if( M<=2 ){
7451     Y--;
7452     M += 12;
7453   }
7454   X1 = 36525*(Y+4716)/100;
7455   X2 = 306001*(M+1)/10000;
7456   A = Y/100;
7457   B = 2 - A + (A/4);
7458   JDsec = (i64)((X1 + X2 + D + B - 1524.5)*86400) + hr*3600 + min*60 + sec;
7459   return (u32)(JDsec - (i64)24405875*(i64)8640);
7460 }
7461 
7462 /*
7463 ** The opposite of zipfileMtime(). This function populates the mTime and
7464 ** mDate fields of the CDS structure passed as the first argument according
7465 ** to the UNIX timestamp value passed as the second.
7466 */
7467 static void zipfileMtimeToDos(ZipfileCDS *pCds, u32 mUnixTime){
7468   /* Convert unix timestamp to JD (2440588 is noon on 1/1/1970) */
7469   i64 JD = (i64)2440588 + mUnixTime / (24*60*60);
7470 
7471   int A, B, C, D, E;
7472   int yr, mon, day;
7473   int hr, min, sec;
7474 
7475   A = (int)((JD - 1867216.25)/36524.25);
7476   A = (int)(JD + 1 + A - (A/4));
7477   B = A + 1524;
7478   C = (int)((B - 122.1)/365.25);
7479   D = (36525*(C&32767))/100;
7480   E = (int)((B-D)/30.6001);
7481 
7482   day = B - D - (int)(30.6001*E);
7483   mon = (E<14 ? E-1 : E-13);
7484   yr = mon>2 ? C-4716 : C-4715;
7485 
7486   hr = (mUnixTime % (24*60*60)) / (60*60);
7487   min = (mUnixTime % (60*60)) / 60;
7488   sec = (mUnixTime % 60);
7489 
7490   if( yr>=1980 ){
7491     pCds->mDate = (u16)(day + (mon << 5) + ((yr-1980) << 9));
7492     pCds->mTime = (u16)(sec/2 + (min<<5) + (hr<<11));
7493   }else{
7494     pCds->mDate = pCds->mTime = 0;
7495   }
7496 
7497   assert( mUnixTime<315507600
7498        || mUnixTime==zipfileMtime(pCds)
7499        || ((mUnixTime % 2) && mUnixTime-1==zipfileMtime(pCds))
7500        /* || (mUnixTime % 2) */
7501   );
7502 }
7503 
7504 /*
7505 ** If aBlob is not NULL, then it is a pointer to a buffer (nBlob bytes in
7506 ** size) containing an entire zip archive image. Or, if aBlob is NULL,
7507 ** then pFile is a file-handle open on a zip file. In either case, this
7508 ** function creates a ZipfileEntry object based on the zip archive entry
7509 ** for which the CDS record is at offset iOff.
7510 **
7511 ** If successful, SQLITE_OK is returned and (*ppEntry) set to point to
7512 ** the new object. Otherwise, an SQLite error code is returned and the
7513 ** final value of (*ppEntry) undefined.
7514 */
7515 static int zipfileGetEntry(
7516   ZipfileTab *pTab,               /* Store any error message here */
7517   const u8 *aBlob,                /* Pointer to in-memory file image */
7518   int nBlob,                      /* Size of aBlob[] in bytes */
7519   FILE *pFile,                    /* If aBlob==0, read from this file */
7520   i64 iOff,                       /* Offset of CDS record */
7521   ZipfileEntry **ppEntry          /* OUT: Pointer to new object */
7522 ){
7523   u8 *aRead;
7524   char **pzErr = &pTab->base.zErrMsg;
7525   int rc = SQLITE_OK;
7526 
7527   if( aBlob==0 ){
7528     aRead = pTab->aBuffer;
7529     rc = zipfileReadData(pFile, aRead, ZIPFILE_CDS_FIXED_SZ, iOff, pzErr);
7530   }else{
7531     aRead = (u8*)&aBlob[iOff];
7532   }
7533 
7534   if( rc==SQLITE_OK ){
7535     sqlite3_int64 nAlloc;
7536     ZipfileEntry *pNew;
7537 
7538     int nFile = zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF]);
7539     int nExtra = zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF+2]);
7540     nExtra += zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF+4]);
7541 
7542     nAlloc = sizeof(ZipfileEntry) + nExtra;
7543     if( aBlob ){
7544       nAlloc += zipfileGetU32(&aRead[ZIPFILE_CDS_SZCOMPRESSED_OFF]);
7545     }
7546 
7547     pNew = (ZipfileEntry*)sqlite3_malloc64(nAlloc);
7548     if( pNew==0 ){
7549       rc = SQLITE_NOMEM;
7550     }else{
7551       memset(pNew, 0, sizeof(ZipfileEntry));
7552       rc = zipfileReadCDS(aRead, &pNew->cds);
7553       if( rc!=SQLITE_OK ){
7554         *pzErr = sqlite3_mprintf("failed to read CDS at offset %lld", iOff);
7555       }else if( aBlob==0 ){
7556         rc = zipfileReadData(
7557             pFile, aRead, nExtra+nFile, iOff+ZIPFILE_CDS_FIXED_SZ, pzErr
7558         );
7559       }else{
7560         aRead = (u8*)&aBlob[iOff + ZIPFILE_CDS_FIXED_SZ];
7561       }
7562     }
7563 
7564     if( rc==SQLITE_OK ){
7565       u32 *pt = &pNew->mUnixTime;
7566       pNew->cds.zFile = sqlite3_mprintf("%.*s", nFile, aRead);
7567       pNew->aExtra = (u8*)&pNew[1];
7568       memcpy(pNew->aExtra, &aRead[nFile], nExtra);
7569       if( pNew->cds.zFile==0 ){
7570         rc = SQLITE_NOMEM;
7571       }else if( 0==zipfileScanExtra(&aRead[nFile], pNew->cds.nExtra, pt) ){
7572         pNew->mUnixTime = zipfileMtime(&pNew->cds);
7573       }
7574     }
7575 
7576     if( rc==SQLITE_OK ){
7577       static const int szFix = ZIPFILE_LFH_FIXED_SZ;
7578       ZipfileLFH lfh;
7579       if( pFile ){
7580         rc = zipfileReadData(pFile, aRead, szFix, pNew->cds.iOffset, pzErr);
7581       }else{
7582         aRead = (u8*)&aBlob[pNew->cds.iOffset];
7583       }
7584 
7585       if( rc==SQLITE_OK ) rc = zipfileReadLFH(aRead, &lfh);
7586       if( rc==SQLITE_OK ){
7587         pNew->iDataOff =  pNew->cds.iOffset + ZIPFILE_LFH_FIXED_SZ;
7588         pNew->iDataOff += lfh.nFile + lfh.nExtra;
7589         if( aBlob && pNew->cds.szCompressed ){
7590           pNew->aData = &pNew->aExtra[nExtra];
7591           memcpy(pNew->aData, &aBlob[pNew->iDataOff], pNew->cds.szCompressed);
7592         }
7593       }else{
7594         *pzErr = sqlite3_mprintf("failed to read LFH at offset %d",
7595             (int)pNew->cds.iOffset
7596         );
7597       }
7598     }
7599 
7600     if( rc!=SQLITE_OK ){
7601       zipfileEntryFree(pNew);
7602     }else{
7603       *ppEntry = pNew;
7604     }
7605   }
7606 
7607   return rc;
7608 }
7609 
7610 /*
7611 ** Advance an ZipfileCsr to its next row of output.
7612 */
7613 static int zipfileNext(sqlite3_vtab_cursor *cur){
7614   ZipfileCsr *pCsr = (ZipfileCsr*)cur;
7615   int rc = SQLITE_OK;
7616 
7617   if( pCsr->pFile ){
7618     i64 iEof = pCsr->eocd.iOffset + pCsr->eocd.nSize;
7619     zipfileEntryFree(pCsr->pCurrent);
7620     pCsr->pCurrent = 0;
7621     if( pCsr->iNextOff>=iEof ){
7622       pCsr->bEof = 1;
7623     }else{
7624       ZipfileEntry *p = 0;
7625       ZipfileTab *pTab = (ZipfileTab*)(cur->pVtab);
7626       rc = zipfileGetEntry(pTab, 0, 0, pCsr->pFile, pCsr->iNextOff, &p);
7627       if( rc==SQLITE_OK ){
7628         pCsr->iNextOff += ZIPFILE_CDS_FIXED_SZ;
7629         pCsr->iNextOff += (int)p->cds.nExtra + p->cds.nFile + p->cds.nComment;
7630       }
7631       pCsr->pCurrent = p;
7632     }
7633   }else{
7634     if( !pCsr->bNoop ){
7635       pCsr->pCurrent = pCsr->pCurrent->pNext;
7636     }
7637     if( pCsr->pCurrent==0 ){
7638       pCsr->bEof = 1;
7639     }
7640   }
7641 
7642   pCsr->bNoop = 0;
7643   return rc;
7644 }
7645 
7646 static void zipfileFree(void *p) {
7647   sqlite3_free(p);
7648 }
7649 
7650 /*
7651 ** Buffer aIn (size nIn bytes) contains compressed data. Uncompressed, the
7652 ** size is nOut bytes. This function uncompresses the data and sets the
7653 ** return value in context pCtx to the result (a blob).
7654 **
7655 ** If an error occurs, an error code is left in pCtx instead.
7656 */
7657 static void zipfileInflate(
7658   sqlite3_context *pCtx,          /* Store result here */
7659   const u8 *aIn,                  /* Compressed data */
7660   int nIn,                        /* Size of buffer aIn[] in bytes */
7661   int nOut                        /* Expected output size */
7662 ){
7663   u8 *aRes = sqlite3_malloc(nOut);
7664   if( aRes==0 ){
7665     sqlite3_result_error_nomem(pCtx);
7666   }else{
7667     int err;
7668     z_stream str;
7669     memset(&str, 0, sizeof(str));
7670 
7671     str.next_in = (Byte*)aIn;
7672     str.avail_in = nIn;
7673     str.next_out = (Byte*)aRes;
7674     str.avail_out = nOut;
7675 
7676     err = inflateInit2(&str, -15);
7677     if( err!=Z_OK ){
7678       zipfileCtxErrorMsg(pCtx, "inflateInit2() failed (%d)", err);
7679     }else{
7680       err = inflate(&str, Z_NO_FLUSH);
7681       if( err!=Z_STREAM_END ){
7682         zipfileCtxErrorMsg(pCtx, "inflate() failed (%d)", err);
7683       }else{
7684         sqlite3_result_blob(pCtx, aRes, nOut, zipfileFree);
7685         aRes = 0;
7686       }
7687     }
7688     sqlite3_free(aRes);
7689     inflateEnd(&str);
7690   }
7691 }
7692 
7693 /*
7694 ** Buffer aIn (size nIn bytes) contains uncompressed data. This function
7695 ** compresses it and sets (*ppOut) to point to a buffer containing the
7696 ** compressed data. The caller is responsible for eventually calling
7697 ** sqlite3_free() to release buffer (*ppOut). Before returning, (*pnOut)
7698 ** is set to the size of buffer (*ppOut) in bytes.
7699 **
7700 ** If no error occurs, SQLITE_OK is returned. Otherwise, an SQLite error
7701 ** code is returned and an error message left in virtual-table handle
7702 ** pTab. The values of (*ppOut) and (*pnOut) are left unchanged in this
7703 ** case.
7704 */
7705 static int zipfileDeflate(
7706   const u8 *aIn, int nIn,         /* Input */
7707   u8 **ppOut, int *pnOut,         /* Output */
7708   char **pzErr                    /* OUT: Error message */
7709 ){
7710   int rc = SQLITE_OK;
7711   sqlite3_int64 nAlloc;
7712   z_stream str;
7713   u8 *aOut;
7714 
7715   memset(&str, 0, sizeof(str));
7716   str.next_in = (Bytef*)aIn;
7717   str.avail_in = nIn;
7718   deflateInit2(&str, 9, Z_DEFLATED, -15, 8, Z_DEFAULT_STRATEGY);
7719 
7720   nAlloc = deflateBound(&str, nIn);
7721   aOut = (u8*)sqlite3_malloc64(nAlloc);
7722   if( aOut==0 ){
7723     rc = SQLITE_NOMEM;
7724   }else{
7725     int res;
7726     str.next_out = aOut;
7727     str.avail_out = nAlloc;
7728     res = deflate(&str, Z_FINISH);
7729     if( res==Z_STREAM_END ){
7730       *ppOut = aOut;
7731       *pnOut = (int)str.total_out;
7732     }else{
7733       sqlite3_free(aOut);
7734       *pzErr = sqlite3_mprintf("zipfile: deflate() error");
7735       rc = SQLITE_ERROR;
7736     }
7737     deflateEnd(&str);
7738   }
7739 
7740   return rc;
7741 }
7742 
7743 
7744 /*
7745 ** Return values of columns for the row at which the series_cursor
7746 ** is currently pointing.
7747 */
7748 static int zipfileColumn(
7749   sqlite3_vtab_cursor *cur,   /* The cursor */
7750   sqlite3_context *ctx,       /* First argument to sqlite3_result_...() */
7751   int i                       /* Which column to return */
7752 ){
7753   ZipfileCsr *pCsr = (ZipfileCsr*)cur;
7754   ZipfileCDS *pCDS = &pCsr->pCurrent->cds;
7755   int rc = SQLITE_OK;
7756   switch( i ){
7757     case 0:   /* name */
7758       sqlite3_result_text(ctx, pCDS->zFile, -1, SQLITE_TRANSIENT);
7759       break;
7760     case 1:   /* mode */
7761       /* TODO: Whether or not the following is correct surely depends on
7762       ** the platform on which the archive was created.  */
7763       sqlite3_result_int(ctx, pCDS->iExternalAttr >> 16);
7764       break;
7765     case 2: { /* mtime */
7766       sqlite3_result_int64(ctx, pCsr->pCurrent->mUnixTime);
7767       break;
7768     }
7769     case 3: { /* sz */
7770       if( sqlite3_vtab_nochange(ctx)==0 ){
7771         sqlite3_result_int64(ctx, pCDS->szUncompressed);
7772       }
7773       break;
7774     }
7775     case 4:   /* rawdata */
7776       if( sqlite3_vtab_nochange(ctx) ) break;
7777     case 5: { /* data */
7778       if( i==4 || pCDS->iCompression==0 || pCDS->iCompression==8 ){
7779         int sz = pCDS->szCompressed;
7780         int szFinal = pCDS->szUncompressed;
7781         if( szFinal>0 ){
7782           u8 *aBuf;
7783           u8 *aFree = 0;
7784           if( pCsr->pCurrent->aData ){
7785             aBuf = pCsr->pCurrent->aData;
7786           }else{
7787             aBuf = aFree = sqlite3_malloc64(sz);
7788             if( aBuf==0 ){
7789               rc = SQLITE_NOMEM;
7790             }else{
7791               FILE *pFile = pCsr->pFile;
7792               if( pFile==0 ){
7793                 pFile = ((ZipfileTab*)(pCsr->base.pVtab))->pWriteFd;
7794               }
7795               rc = zipfileReadData(pFile, aBuf, sz, pCsr->pCurrent->iDataOff,
7796                   &pCsr->base.pVtab->zErrMsg
7797               );
7798             }
7799           }
7800           if( rc==SQLITE_OK ){
7801             if( i==5 && pCDS->iCompression ){
7802               zipfileInflate(ctx, aBuf, sz, szFinal);
7803             }else{
7804               sqlite3_result_blob(ctx, aBuf, sz, SQLITE_TRANSIENT);
7805             }
7806           }
7807           sqlite3_free(aFree);
7808         }else{
7809           /* Figure out if this is a directory or a zero-sized file. Consider
7810           ** it to be a directory either if the mode suggests so, or if
7811           ** the final character in the name is '/'.  */
7812           u32 mode = pCDS->iExternalAttr >> 16;
7813           if( !(mode & S_IFDIR) && pCDS->zFile[pCDS->nFile-1]!='/' ){
7814             sqlite3_result_blob(ctx, "", 0, SQLITE_STATIC);
7815           }
7816         }
7817       }
7818       break;
7819     }
7820     case 6:   /* method */
7821       sqlite3_result_int(ctx, pCDS->iCompression);
7822       break;
7823     default:  /* z */
7824       assert( i==7 );
7825       sqlite3_result_int64(ctx, pCsr->iId);
7826       break;
7827   }
7828 
7829   return rc;
7830 }
7831 
7832 /*
7833 ** Return TRUE if the cursor is at EOF.
7834 */
7835 static int zipfileEof(sqlite3_vtab_cursor *cur){
7836   ZipfileCsr *pCsr = (ZipfileCsr*)cur;
7837   return pCsr->bEof;
7838 }
7839 
7840 /*
7841 ** If aBlob is not NULL, then it points to a buffer nBlob bytes in size
7842 ** containing an entire zip archive image. Or, if aBlob is NULL, then pFile
7843 ** is guaranteed to be a file-handle open on a zip file.
7844 **
7845 ** This function attempts to locate the EOCD record within the zip archive
7846 ** and populate *pEOCD with the results of decoding it. SQLITE_OK is
7847 ** returned if successful. Otherwise, an SQLite error code is returned and
7848 ** an English language error message may be left in virtual-table pTab.
7849 */
7850 static int zipfileReadEOCD(
7851   ZipfileTab *pTab,               /* Return errors here */
7852   const u8 *aBlob,                /* Pointer to in-memory file image */
7853   int nBlob,                      /* Size of aBlob[] in bytes */
7854   FILE *pFile,                    /* Read from this file if aBlob==0 */
7855   ZipfileEOCD *pEOCD              /* Object to populate */
7856 ){
7857   u8 *aRead = pTab->aBuffer;      /* Temporary buffer */
7858   int nRead;                      /* Bytes to read from file */
7859   int rc = SQLITE_OK;
7860 
7861   memset(pEOCD, 0, sizeof(ZipfileEOCD));
7862   if( aBlob==0 ){
7863     i64 iOff;                     /* Offset to read from */
7864     i64 szFile;                   /* Total size of file in bytes */
7865     fseek(pFile, 0, SEEK_END);
7866     szFile = (i64)ftell(pFile);
7867     if( szFile==0 ){
7868       return SQLITE_OK;
7869     }
7870     nRead = (int)(MIN(szFile, ZIPFILE_BUFFER_SIZE));
7871     iOff = szFile - nRead;
7872     rc = zipfileReadData(pFile, aRead, nRead, iOff, &pTab->base.zErrMsg);
7873   }else{
7874     nRead = (int)(MIN(nBlob, ZIPFILE_BUFFER_SIZE));
7875     aRead = (u8*)&aBlob[nBlob-nRead];
7876   }
7877 
7878   if( rc==SQLITE_OK ){
7879     int i;
7880 
7881     /* Scan backwards looking for the signature bytes */
7882     for(i=nRead-20; i>=0; i--){
7883       if( aRead[i]==0x50 && aRead[i+1]==0x4b
7884        && aRead[i+2]==0x05 && aRead[i+3]==0x06
7885       ){
7886         break;
7887       }
7888     }
7889     if( i<0 ){
7890       pTab->base.zErrMsg = sqlite3_mprintf(
7891           "cannot find end of central directory record"
7892       );
7893       return SQLITE_ERROR;
7894     }
7895 
7896     aRead += i+4;
7897     pEOCD->iDisk = zipfileRead16(aRead);
7898     pEOCD->iFirstDisk = zipfileRead16(aRead);
7899     pEOCD->nEntry = zipfileRead16(aRead);
7900     pEOCD->nEntryTotal = zipfileRead16(aRead);
7901     pEOCD->nSize = zipfileRead32(aRead);
7902     pEOCD->iOffset = zipfileRead32(aRead);
7903   }
7904 
7905   return rc;
7906 }
7907 
7908 /*
7909 ** Add object pNew to the linked list that begins at ZipfileTab.pFirstEntry
7910 ** and ends with pLastEntry. If argument pBefore is NULL, then pNew is added
7911 ** to the end of the list. Otherwise, it is added to the list immediately
7912 ** before pBefore (which is guaranteed to be a part of said list).
7913 */
7914 static void zipfileAddEntry(
7915   ZipfileTab *pTab,
7916   ZipfileEntry *pBefore,
7917   ZipfileEntry *pNew
7918 ){
7919   assert( (pTab->pFirstEntry==0)==(pTab->pLastEntry==0) );
7920   assert( pNew->pNext==0 );
7921   if( pBefore==0 ){
7922     if( pTab->pFirstEntry==0 ){
7923       pTab->pFirstEntry = pTab->pLastEntry = pNew;
7924     }else{
7925       assert( pTab->pLastEntry->pNext==0 );
7926       pTab->pLastEntry->pNext = pNew;
7927       pTab->pLastEntry = pNew;
7928     }
7929   }else{
7930     ZipfileEntry **pp;
7931     for(pp=&pTab->pFirstEntry; *pp!=pBefore; pp=&((*pp)->pNext));
7932     pNew->pNext = pBefore;
7933     *pp = pNew;
7934   }
7935 }
7936 
7937 static int zipfileLoadDirectory(ZipfileTab *pTab, const u8 *aBlob, int nBlob){
7938   ZipfileEOCD eocd;
7939   int rc;
7940   int i;
7941   i64 iOff;
7942 
7943   rc = zipfileReadEOCD(pTab, aBlob, nBlob, pTab->pWriteFd, &eocd);
7944   iOff = eocd.iOffset;
7945   for(i=0; rc==SQLITE_OK && i<eocd.nEntry; i++){
7946     ZipfileEntry *pNew = 0;
7947     rc = zipfileGetEntry(pTab, aBlob, nBlob, pTab->pWriteFd, iOff, &pNew);
7948 
7949     if( rc==SQLITE_OK ){
7950       zipfileAddEntry(pTab, 0, pNew);
7951       iOff += ZIPFILE_CDS_FIXED_SZ;
7952       iOff += (int)pNew->cds.nExtra + pNew->cds.nFile + pNew->cds.nComment;
7953     }
7954   }
7955   return rc;
7956 }
7957 
7958 /*
7959 ** xFilter callback.
7960 */
7961 static int zipfileFilter(
7962   sqlite3_vtab_cursor *cur,
7963   int idxNum, const char *idxStr,
7964   int argc, sqlite3_value **argv
7965 ){
7966   ZipfileTab *pTab = (ZipfileTab*)cur->pVtab;
7967   ZipfileCsr *pCsr = (ZipfileCsr*)cur;
7968   const char *zFile = 0;          /* Zip file to scan */
7969   int rc = SQLITE_OK;             /* Return Code */
7970   int bInMemory = 0;              /* True for an in-memory zipfile */
7971 
7972   zipfileResetCursor(pCsr);
7973 
7974   if( pTab->zFile ){
7975     zFile = pTab->zFile;
7976   }else if( idxNum==0 ){
7977     zipfileCursorErr(pCsr, "zipfile() function requires an argument");
7978     return SQLITE_ERROR;
7979   }else if( sqlite3_value_type(argv[0])==SQLITE_BLOB ){
7980     static const u8 aEmptyBlob = 0;
7981     const u8 *aBlob = (const u8*)sqlite3_value_blob(argv[0]);
7982     int nBlob = sqlite3_value_bytes(argv[0]);
7983     assert( pTab->pFirstEntry==0 );
7984     if( aBlob==0 ){
7985       aBlob = &aEmptyBlob;
7986       nBlob = 0;
7987     }
7988     rc = zipfileLoadDirectory(pTab, aBlob, nBlob);
7989     pCsr->pFreeEntry = pTab->pFirstEntry;
7990     pTab->pFirstEntry = pTab->pLastEntry = 0;
7991     if( rc!=SQLITE_OK ) return rc;
7992     bInMemory = 1;
7993   }else{
7994     zFile = (const char*)sqlite3_value_text(argv[0]);
7995   }
7996 
7997   if( 0==pTab->pWriteFd && 0==bInMemory ){
7998     pCsr->pFile = fopen(zFile, "rb");
7999     if( pCsr->pFile==0 ){
8000       zipfileCursorErr(pCsr, "cannot open file: %s", zFile);
8001       rc = SQLITE_ERROR;
8002     }else{
8003       rc = zipfileReadEOCD(pTab, 0, 0, pCsr->pFile, &pCsr->eocd);
8004       if( rc==SQLITE_OK ){
8005         if( pCsr->eocd.nEntry==0 ){
8006           pCsr->bEof = 1;
8007         }else{
8008           pCsr->iNextOff = pCsr->eocd.iOffset;
8009           rc = zipfileNext(cur);
8010         }
8011       }
8012     }
8013   }else{
8014     pCsr->bNoop = 1;
8015     pCsr->pCurrent = pCsr->pFreeEntry ? pCsr->pFreeEntry : pTab->pFirstEntry;
8016     rc = zipfileNext(cur);
8017   }
8018 
8019   return rc;
8020 }
8021 
8022 /*
8023 ** xBestIndex callback.
8024 */
8025 static int zipfileBestIndex(
8026   sqlite3_vtab *tab,
8027   sqlite3_index_info *pIdxInfo
8028 ){
8029   int i;
8030   int idx = -1;
8031   int unusable = 0;
8032 
8033   for(i=0; i<pIdxInfo->nConstraint; i++){
8034     const struct sqlite3_index_constraint *pCons = &pIdxInfo->aConstraint[i];
8035     if( pCons->iColumn!=ZIPFILE_F_COLUMN_IDX ) continue;
8036     if( pCons->usable==0 ){
8037       unusable = 1;
8038     }else if( pCons->op==SQLITE_INDEX_CONSTRAINT_EQ ){
8039       idx = i;
8040     }
8041   }
8042   pIdxInfo->estimatedCost = 1000.0;
8043   if( idx>=0 ){
8044     pIdxInfo->aConstraintUsage[idx].argvIndex = 1;
8045     pIdxInfo->aConstraintUsage[idx].omit = 1;
8046     pIdxInfo->idxNum = 1;
8047   }else if( unusable ){
8048     return SQLITE_CONSTRAINT;
8049   }
8050   return SQLITE_OK;
8051 }
8052 
8053 static ZipfileEntry *zipfileNewEntry(const char *zPath){
8054   ZipfileEntry *pNew;
8055   pNew = sqlite3_malloc(sizeof(ZipfileEntry));
8056   if( pNew ){
8057     memset(pNew, 0, sizeof(ZipfileEntry));
8058     pNew->cds.zFile = sqlite3_mprintf("%s", zPath);
8059     if( pNew->cds.zFile==0 ){
8060       sqlite3_free(pNew);
8061       pNew = 0;
8062     }
8063   }
8064   return pNew;
8065 }
8066 
8067 static int zipfileSerializeLFH(ZipfileEntry *pEntry, u8 *aBuf){
8068   ZipfileCDS *pCds = &pEntry->cds;
8069   u8 *a = aBuf;
8070 
8071   pCds->nExtra = 9;
8072 
8073   /* Write the LFH itself */
8074   zipfileWrite32(a, ZIPFILE_SIGNATURE_LFH);
8075   zipfileWrite16(a, pCds->iVersionExtract);
8076   zipfileWrite16(a, pCds->flags);
8077   zipfileWrite16(a, pCds->iCompression);
8078   zipfileWrite16(a, pCds->mTime);
8079   zipfileWrite16(a, pCds->mDate);
8080   zipfileWrite32(a, pCds->crc32);
8081   zipfileWrite32(a, pCds->szCompressed);
8082   zipfileWrite32(a, pCds->szUncompressed);
8083   zipfileWrite16(a, (u16)pCds->nFile);
8084   zipfileWrite16(a, pCds->nExtra);
8085   assert( a==&aBuf[ZIPFILE_LFH_FIXED_SZ] );
8086 
8087   /* Add the file name */
8088   memcpy(a, pCds->zFile, (int)pCds->nFile);
8089   a += (int)pCds->nFile;
8090 
8091   /* The "extra" data */
8092   zipfileWrite16(a, ZIPFILE_EXTRA_TIMESTAMP);
8093   zipfileWrite16(a, 5);
8094   *a++ = 0x01;
8095   zipfileWrite32(a, pEntry->mUnixTime);
8096 
8097   return a-aBuf;
8098 }
8099 
8100 static int zipfileAppendEntry(
8101   ZipfileTab *pTab,
8102   ZipfileEntry *pEntry,
8103   const u8 *pData,
8104   int nData
8105 ){
8106   u8 *aBuf = pTab->aBuffer;
8107   int nBuf;
8108   int rc;
8109 
8110   nBuf = zipfileSerializeLFH(pEntry, aBuf);
8111   rc = zipfileAppendData(pTab, aBuf, nBuf);
8112   if( rc==SQLITE_OK ){
8113     pEntry->iDataOff = pTab->szCurrent;
8114     rc = zipfileAppendData(pTab, pData, nData);
8115   }
8116 
8117   return rc;
8118 }
8119 
8120 static int zipfileGetMode(
8121   sqlite3_value *pVal,
8122   int bIsDir,                     /* If true, default to directory */
8123   u32 *pMode,                     /* OUT: Mode value */
8124   char **pzErr                    /* OUT: Error message */
8125 ){
8126   const char *z = (const char*)sqlite3_value_text(pVal);
8127   u32 mode = 0;
8128   if( z==0 ){
8129     mode = (bIsDir ? (S_IFDIR + 0755) : (S_IFREG + 0644));
8130   }else if( z[0]>='0' && z[0]<='9' ){
8131     mode = (unsigned int)sqlite3_value_int(pVal);
8132   }else{
8133     const char zTemplate[11] = "-rwxrwxrwx";
8134     int i;
8135     if( strlen(z)!=10 ) goto parse_error;
8136     switch( z[0] ){
8137       case '-': mode |= S_IFREG; break;
8138       case 'd': mode |= S_IFDIR; break;
8139       case 'l': mode |= S_IFLNK; break;
8140       default: goto parse_error;
8141     }
8142     for(i=1; i<10; i++){
8143       if( z[i]==zTemplate[i] ) mode |= 1 << (9-i);
8144       else if( z[i]!='-' ) goto parse_error;
8145     }
8146   }
8147   if( ((mode & S_IFDIR)==0)==bIsDir ){
8148     /* The "mode" attribute is a directory, but data has been specified.
8149     ** Or vice-versa - no data but "mode" is a file or symlink.  */
8150     *pzErr = sqlite3_mprintf("zipfile: mode does not match data");
8151     return SQLITE_CONSTRAINT;
8152   }
8153   *pMode = mode;
8154   return SQLITE_OK;
8155 
8156  parse_error:
8157   *pzErr = sqlite3_mprintf("zipfile: parse error in mode: %s", z);
8158   return SQLITE_ERROR;
8159 }
8160 
8161 /*
8162 ** Both (const char*) arguments point to nul-terminated strings. Argument
8163 ** nB is the value of strlen(zB). This function returns 0 if the strings are
8164 ** identical, ignoring any trailing '/' character in either path.  */
8165 static int zipfileComparePath(const char *zA, const char *zB, int nB){
8166   int nA = (int)strlen(zA);
8167   if( nA>0 && zA[nA-1]=='/' ) nA--;
8168   if( nB>0 && zB[nB-1]=='/' ) nB--;
8169   if( nA==nB && memcmp(zA, zB, nA)==0 ) return 0;
8170   return 1;
8171 }
8172 
8173 static int zipfileBegin(sqlite3_vtab *pVtab){
8174   ZipfileTab *pTab = (ZipfileTab*)pVtab;
8175   int rc = SQLITE_OK;
8176 
8177   assert( pTab->pWriteFd==0 );
8178   if( pTab->zFile==0 || pTab->zFile[0]==0 ){
8179     pTab->base.zErrMsg = sqlite3_mprintf("zipfile: missing filename");
8180     return SQLITE_ERROR;
8181   }
8182 
8183   /* Open a write fd on the file. Also load the entire central directory
8184   ** structure into memory. During the transaction any new file data is
8185   ** appended to the archive file, but the central directory is accumulated
8186   ** in main-memory until the transaction is committed.  */
8187   pTab->pWriteFd = fopen(pTab->zFile, "ab+");
8188   if( pTab->pWriteFd==0 ){
8189     pTab->base.zErrMsg = sqlite3_mprintf(
8190         "zipfile: failed to open file %s for writing", pTab->zFile
8191         );
8192     rc = SQLITE_ERROR;
8193   }else{
8194     fseek(pTab->pWriteFd, 0, SEEK_END);
8195     pTab->szCurrent = pTab->szOrig = (i64)ftell(pTab->pWriteFd);
8196     rc = zipfileLoadDirectory(pTab, 0, 0);
8197   }
8198 
8199   if( rc!=SQLITE_OK ){
8200     zipfileCleanupTransaction(pTab);
8201   }
8202 
8203   return rc;
8204 }
8205 
8206 /*
8207 ** Return the current time as a 32-bit timestamp in UNIX epoch format (like
8208 ** time(2)).
8209 */
8210 static u32 zipfileTime(void){
8211   sqlite3_vfs *pVfs = sqlite3_vfs_find(0);
8212   u32 ret;
8213   if( pVfs==0 ) return 0;
8214   if( pVfs->iVersion>=2 && pVfs->xCurrentTimeInt64 ){
8215     i64 ms;
8216     pVfs->xCurrentTimeInt64(pVfs, &ms);
8217     ret = (u32)((ms/1000) - ((i64)24405875 * 8640));
8218   }else{
8219     double day;
8220     pVfs->xCurrentTime(pVfs, &day);
8221     ret = (u32)((day - 2440587.5) * 86400);
8222   }
8223   return ret;
8224 }
8225 
8226 /*
8227 ** Return a 32-bit timestamp in UNIX epoch format.
8228 **
8229 ** If the value passed as the only argument is either NULL or an SQL NULL,
8230 ** return the current time. Otherwise, return the value stored in (*pVal)
8231 ** cast to a 32-bit unsigned integer.
8232 */
8233 static u32 zipfileGetTime(sqlite3_value *pVal){
8234   if( pVal==0 || sqlite3_value_type(pVal)==SQLITE_NULL ){
8235     return zipfileTime();
8236   }
8237   return (u32)sqlite3_value_int64(pVal);
8238 }
8239 
8240 /*
8241 ** Unless it is NULL, entry pOld is currently part of the pTab->pFirstEntry
8242 ** linked list.  Remove it from the list and free the object.
8243 */
8244 static void zipfileRemoveEntryFromList(ZipfileTab *pTab, ZipfileEntry *pOld){
8245   if( pOld ){
8246     ZipfileEntry **pp;
8247     for(pp=&pTab->pFirstEntry; (*pp)!=pOld; pp=&((*pp)->pNext));
8248     *pp = (*pp)->pNext;
8249     zipfileEntryFree(pOld);
8250   }
8251 }
8252 
8253 /*
8254 ** xUpdate method.
8255 */
8256 static int zipfileUpdate(
8257   sqlite3_vtab *pVtab,
8258   int nVal,
8259   sqlite3_value **apVal,
8260   sqlite_int64 *pRowid
8261 ){
8262   ZipfileTab *pTab = (ZipfileTab*)pVtab;
8263   int rc = SQLITE_OK;             /* Return Code */
8264   ZipfileEntry *pNew = 0;         /* New in-memory CDS entry */
8265 
8266   u32 mode = 0;                   /* Mode for new entry */
8267   u32 mTime = 0;                  /* Modification time for new entry */
8268   i64 sz = 0;                     /* Uncompressed size */
8269   const char *zPath = 0;          /* Path for new entry */
8270   int nPath = 0;                  /* strlen(zPath) */
8271   const u8 *pData = 0;            /* Pointer to buffer containing content */
8272   int nData = 0;                  /* Size of pData buffer in bytes */
8273   int iMethod = 0;                /* Compression method for new entry */
8274   u8 *pFree = 0;                  /* Free this */
8275   char *zFree = 0;                /* Also free this */
8276   ZipfileEntry *pOld = 0;
8277   ZipfileEntry *pOld2 = 0;
8278   int bUpdate = 0;                /* True for an update that modifies "name" */
8279   int bIsDir = 0;
8280   u32 iCrc32 = 0;
8281 
8282   if( pTab->pWriteFd==0 ){
8283     rc = zipfileBegin(pVtab);
8284     if( rc!=SQLITE_OK ) return rc;
8285   }
8286 
8287   /* If this is a DELETE or UPDATE, find the archive entry to delete. */
8288   if( sqlite3_value_type(apVal[0])!=SQLITE_NULL ){
8289     const char *zDelete = (const char*)sqlite3_value_text(apVal[0]);
8290     int nDelete = (int)strlen(zDelete);
8291     if( nVal>1 ){
8292       const char *zUpdate = (const char*)sqlite3_value_text(apVal[1]);
8293       if( zUpdate && zipfileComparePath(zUpdate, zDelete, nDelete)!=0 ){
8294         bUpdate = 1;
8295       }
8296     }
8297     for(pOld=pTab->pFirstEntry; 1; pOld=pOld->pNext){
8298       if( zipfileComparePath(pOld->cds.zFile, zDelete, nDelete)==0 ){
8299         break;
8300       }
8301       assert( pOld->pNext );
8302     }
8303   }
8304 
8305   if( nVal>1 ){
8306     /* Check that "sz" and "rawdata" are both NULL: */
8307     if( sqlite3_value_type(apVal[5])!=SQLITE_NULL ){
8308       zipfileTableErr(pTab, "sz must be NULL");
8309       rc = SQLITE_CONSTRAINT;
8310     }
8311     if( sqlite3_value_type(apVal[6])!=SQLITE_NULL ){
8312       zipfileTableErr(pTab, "rawdata must be NULL");
8313       rc = SQLITE_CONSTRAINT;
8314     }
8315 
8316     if( rc==SQLITE_OK ){
8317       if( sqlite3_value_type(apVal[7])==SQLITE_NULL ){
8318         /* data=NULL. A directory */
8319         bIsDir = 1;
8320       }else{
8321         /* Value specified for "data", and possibly "method". This must be
8322         ** a regular file or a symlink. */
8323         const u8 *aIn = sqlite3_value_blob(apVal[7]);
8324         int nIn = sqlite3_value_bytes(apVal[7]);
8325         int bAuto = sqlite3_value_type(apVal[8])==SQLITE_NULL;
8326 
8327         iMethod = sqlite3_value_int(apVal[8]);
8328         sz = nIn;
8329         pData = aIn;
8330         nData = nIn;
8331         if( iMethod!=0 && iMethod!=8 ){
8332           zipfileTableErr(pTab, "unknown compression method: %d", iMethod);
8333           rc = SQLITE_CONSTRAINT;
8334         }else{
8335           if( bAuto || iMethod ){
8336             int nCmp;
8337             rc = zipfileDeflate(aIn, nIn, &pFree, &nCmp, &pTab->base.zErrMsg);
8338             if( rc==SQLITE_OK ){
8339               if( iMethod || nCmp<nIn ){
8340                 iMethod = 8;
8341                 pData = pFree;
8342                 nData = nCmp;
8343               }
8344             }
8345           }
8346           iCrc32 = crc32(0, aIn, nIn);
8347         }
8348       }
8349     }
8350 
8351     if( rc==SQLITE_OK ){
8352       rc = zipfileGetMode(apVal[3], bIsDir, &mode, &pTab->base.zErrMsg);
8353     }
8354 
8355     if( rc==SQLITE_OK ){
8356       zPath = (const char*)sqlite3_value_text(apVal[2]);
8357       if( zPath==0 ) zPath = "";
8358       nPath = (int)strlen(zPath);
8359       mTime = zipfileGetTime(apVal[4]);
8360     }
8361 
8362     if( rc==SQLITE_OK && bIsDir ){
8363       /* For a directory, check that the last character in the path is a
8364       ** '/'. This appears to be required for compatibility with info-zip
8365       ** (the unzip command on unix). It does not create directories
8366       ** otherwise.  */
8367       if( nPath<=0 || zPath[nPath-1]!='/' ){
8368         zFree = sqlite3_mprintf("%s/", zPath);
8369         zPath = (const char*)zFree;
8370         if( zFree==0 ){
8371           rc = SQLITE_NOMEM;
8372           nPath = 0;
8373         }else{
8374           nPath = (int)strlen(zPath);
8375         }
8376       }
8377     }
8378 
8379     /* Check that we're not inserting a duplicate entry -OR- updating an
8380     ** entry with a path, thereby making it into a duplicate. */
8381     if( (pOld==0 || bUpdate) && rc==SQLITE_OK ){
8382       ZipfileEntry *p;
8383       for(p=pTab->pFirstEntry; p; p=p->pNext){
8384         if( zipfileComparePath(p->cds.zFile, zPath, nPath)==0 ){
8385           switch( sqlite3_vtab_on_conflict(pTab->db) ){
8386             case SQLITE_IGNORE: {
8387               goto zipfile_update_done;
8388             }
8389             case SQLITE_REPLACE: {
8390               pOld2 = p;
8391               break;
8392             }
8393             default: {
8394               zipfileTableErr(pTab, "duplicate name: \"%s\"", zPath);
8395               rc = SQLITE_CONSTRAINT;
8396               break;
8397             }
8398           }
8399           break;
8400         }
8401       }
8402     }
8403 
8404     if( rc==SQLITE_OK ){
8405       /* Create the new CDS record. */
8406       pNew = zipfileNewEntry(zPath);
8407       if( pNew==0 ){
8408         rc = SQLITE_NOMEM;
8409       }else{
8410         pNew->cds.iVersionMadeBy = ZIPFILE_NEWENTRY_MADEBY;
8411         pNew->cds.iVersionExtract = ZIPFILE_NEWENTRY_REQUIRED;
8412         pNew->cds.flags = ZIPFILE_NEWENTRY_FLAGS;
8413         pNew->cds.iCompression = (u16)iMethod;
8414         zipfileMtimeToDos(&pNew->cds, mTime);
8415         pNew->cds.crc32 = iCrc32;
8416         pNew->cds.szCompressed = nData;
8417         pNew->cds.szUncompressed = (u32)sz;
8418         pNew->cds.iExternalAttr = (mode<<16);
8419         pNew->cds.iOffset = (u32)pTab->szCurrent;
8420         pNew->cds.nFile = (u16)nPath;
8421         pNew->mUnixTime = (u32)mTime;
8422         rc = zipfileAppendEntry(pTab, pNew, pData, nData);
8423         zipfileAddEntry(pTab, pOld, pNew);
8424       }
8425     }
8426   }
8427 
8428   if( rc==SQLITE_OK && (pOld || pOld2) ){
8429     ZipfileCsr *pCsr;
8430     for(pCsr=pTab->pCsrList; pCsr; pCsr=pCsr->pCsrNext){
8431       if( pCsr->pCurrent && (pCsr->pCurrent==pOld || pCsr->pCurrent==pOld2) ){
8432         pCsr->pCurrent = pCsr->pCurrent->pNext;
8433         pCsr->bNoop = 1;
8434       }
8435     }
8436 
8437     zipfileRemoveEntryFromList(pTab, pOld);
8438     zipfileRemoveEntryFromList(pTab, pOld2);
8439   }
8440 
8441 zipfile_update_done:
8442   sqlite3_free(pFree);
8443   sqlite3_free(zFree);
8444   return rc;
8445 }
8446 
8447 static int zipfileSerializeEOCD(ZipfileEOCD *p, u8 *aBuf){
8448   u8 *a = aBuf;
8449   zipfileWrite32(a, ZIPFILE_SIGNATURE_EOCD);
8450   zipfileWrite16(a, p->iDisk);
8451   zipfileWrite16(a, p->iFirstDisk);
8452   zipfileWrite16(a, p->nEntry);
8453   zipfileWrite16(a, p->nEntryTotal);
8454   zipfileWrite32(a, p->nSize);
8455   zipfileWrite32(a, p->iOffset);
8456   zipfileWrite16(a, 0);        /* Size of trailing comment in bytes*/
8457 
8458   return a-aBuf;
8459 }
8460 
8461 static int zipfileAppendEOCD(ZipfileTab *pTab, ZipfileEOCD *p){
8462   int nBuf = zipfileSerializeEOCD(p, pTab->aBuffer);
8463   assert( nBuf==ZIPFILE_EOCD_FIXED_SZ );
8464   return zipfileAppendData(pTab, pTab->aBuffer, nBuf);
8465 }
8466 
8467 /*
8468 ** Serialize the CDS structure into buffer aBuf[]. Return the number
8469 ** of bytes written.
8470 */
8471 static int zipfileSerializeCDS(ZipfileEntry *pEntry, u8 *aBuf){
8472   u8 *a = aBuf;
8473   ZipfileCDS *pCDS = &pEntry->cds;
8474 
8475   if( pEntry->aExtra==0 ){
8476     pCDS->nExtra = 9;
8477   }
8478 
8479   zipfileWrite32(a, ZIPFILE_SIGNATURE_CDS);
8480   zipfileWrite16(a, pCDS->iVersionMadeBy);
8481   zipfileWrite16(a, pCDS->iVersionExtract);
8482   zipfileWrite16(a, pCDS->flags);
8483   zipfileWrite16(a, pCDS->iCompression);
8484   zipfileWrite16(a, pCDS->mTime);
8485   zipfileWrite16(a, pCDS->mDate);
8486   zipfileWrite32(a, pCDS->crc32);
8487   zipfileWrite32(a, pCDS->szCompressed);
8488   zipfileWrite32(a, pCDS->szUncompressed);
8489   assert( a==&aBuf[ZIPFILE_CDS_NFILE_OFF] );
8490   zipfileWrite16(a, pCDS->nFile);
8491   zipfileWrite16(a, pCDS->nExtra);
8492   zipfileWrite16(a, pCDS->nComment);
8493   zipfileWrite16(a, pCDS->iDiskStart);
8494   zipfileWrite16(a, pCDS->iInternalAttr);
8495   zipfileWrite32(a, pCDS->iExternalAttr);
8496   zipfileWrite32(a, pCDS->iOffset);
8497 
8498   memcpy(a, pCDS->zFile, pCDS->nFile);
8499   a += pCDS->nFile;
8500 
8501   if( pEntry->aExtra ){
8502     int n = (int)pCDS->nExtra + (int)pCDS->nComment;
8503     memcpy(a, pEntry->aExtra, n);
8504     a += n;
8505   }else{
8506     assert( pCDS->nExtra==9 );
8507     zipfileWrite16(a, ZIPFILE_EXTRA_TIMESTAMP);
8508     zipfileWrite16(a, 5);
8509     *a++ = 0x01;
8510     zipfileWrite32(a, pEntry->mUnixTime);
8511   }
8512 
8513   return a-aBuf;
8514 }
8515 
8516 static int zipfileCommit(sqlite3_vtab *pVtab){
8517   ZipfileTab *pTab = (ZipfileTab*)pVtab;
8518   int rc = SQLITE_OK;
8519   if( pTab->pWriteFd ){
8520     i64 iOffset = pTab->szCurrent;
8521     ZipfileEntry *p;
8522     ZipfileEOCD eocd;
8523     int nEntry = 0;
8524 
8525     /* Write out all entries */
8526     for(p=pTab->pFirstEntry; rc==SQLITE_OK && p; p=p->pNext){
8527       int n = zipfileSerializeCDS(p, pTab->aBuffer);
8528       rc = zipfileAppendData(pTab, pTab->aBuffer, n);
8529       nEntry++;
8530     }
8531 
8532     /* Write out the EOCD record */
8533     eocd.iDisk = 0;
8534     eocd.iFirstDisk = 0;
8535     eocd.nEntry = (u16)nEntry;
8536     eocd.nEntryTotal = (u16)nEntry;
8537     eocd.nSize = (u32)(pTab->szCurrent - iOffset);
8538     eocd.iOffset = (u32)iOffset;
8539     rc = zipfileAppendEOCD(pTab, &eocd);
8540 
8541     zipfileCleanupTransaction(pTab);
8542   }
8543   return rc;
8544 }
8545 
8546 static int zipfileRollback(sqlite3_vtab *pVtab){
8547   return zipfileCommit(pVtab);
8548 }
8549 
8550 static ZipfileCsr *zipfileFindCursor(ZipfileTab *pTab, i64 iId){
8551   ZipfileCsr *pCsr;
8552   for(pCsr=pTab->pCsrList; pCsr; pCsr=pCsr->pCsrNext){
8553     if( iId==pCsr->iId ) break;
8554   }
8555   return pCsr;
8556 }
8557 
8558 static void zipfileFunctionCds(
8559   sqlite3_context *context,
8560   int argc,
8561   sqlite3_value **argv
8562 ){
8563   ZipfileCsr *pCsr;
8564   ZipfileTab *pTab = (ZipfileTab*)sqlite3_user_data(context);
8565   assert( argc>0 );
8566 
8567   pCsr = zipfileFindCursor(pTab, sqlite3_value_int64(argv[0]));
8568   if( pCsr ){
8569     ZipfileCDS *p = &pCsr->pCurrent->cds;
8570     char *zRes = sqlite3_mprintf("{"
8571         "\"version-made-by\" : %u, "
8572         "\"version-to-extract\" : %u, "
8573         "\"flags\" : %u, "
8574         "\"compression\" : %u, "
8575         "\"time\" : %u, "
8576         "\"date\" : %u, "
8577         "\"crc32\" : %u, "
8578         "\"compressed-size\" : %u, "
8579         "\"uncompressed-size\" : %u, "
8580         "\"file-name-length\" : %u, "
8581         "\"extra-field-length\" : %u, "
8582         "\"file-comment-length\" : %u, "
8583         "\"disk-number-start\" : %u, "
8584         "\"internal-attr\" : %u, "
8585         "\"external-attr\" : %u, "
8586         "\"offset\" : %u }",
8587         (u32)p->iVersionMadeBy, (u32)p->iVersionExtract,
8588         (u32)p->flags, (u32)p->iCompression,
8589         (u32)p->mTime, (u32)p->mDate,
8590         (u32)p->crc32, (u32)p->szCompressed,
8591         (u32)p->szUncompressed, (u32)p->nFile,
8592         (u32)p->nExtra, (u32)p->nComment,
8593         (u32)p->iDiskStart, (u32)p->iInternalAttr,
8594         (u32)p->iExternalAttr, (u32)p->iOffset
8595     );
8596 
8597     if( zRes==0 ){
8598       sqlite3_result_error_nomem(context);
8599     }else{
8600       sqlite3_result_text(context, zRes, -1, SQLITE_TRANSIENT);
8601       sqlite3_free(zRes);
8602     }
8603   }
8604 }
8605 
8606 /*
8607 ** xFindFunction method.
8608 */
8609 static int zipfileFindFunction(
8610   sqlite3_vtab *pVtab,            /* Virtual table handle */
8611   int nArg,                       /* Number of SQL function arguments */
8612   const char *zName,              /* Name of SQL function */
8613   void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), /* OUT: Result */
8614   void **ppArg                    /* OUT: User data for *pxFunc */
8615 ){
8616   if( sqlite3_stricmp("zipfile_cds", zName)==0 ){
8617     *pxFunc = zipfileFunctionCds;
8618     *ppArg = (void*)pVtab;
8619     return 1;
8620   }
8621   return 0;
8622 }
8623 
8624 typedef struct ZipfileBuffer ZipfileBuffer;
8625 struct ZipfileBuffer {
8626   u8 *a;                          /* Pointer to buffer */
8627   int n;                          /* Size of buffer in bytes */
8628   int nAlloc;                     /* Byte allocated at a[] */
8629 };
8630 
8631 typedef struct ZipfileCtx ZipfileCtx;
8632 struct ZipfileCtx {
8633   int nEntry;
8634   ZipfileBuffer body;
8635   ZipfileBuffer cds;
8636 };
8637 
8638 static int zipfileBufferGrow(ZipfileBuffer *pBuf, int nByte){
8639   if( pBuf->n+nByte>pBuf->nAlloc ){
8640     u8 *aNew;
8641     sqlite3_int64 nNew = pBuf->n ? pBuf->n*2 : 512;
8642     int nReq = pBuf->n + nByte;
8643 
8644     while( nNew<nReq ) nNew = nNew*2;
8645     aNew = sqlite3_realloc64(pBuf->a, nNew);
8646     if( aNew==0 ) return SQLITE_NOMEM;
8647     pBuf->a = aNew;
8648     pBuf->nAlloc = (int)nNew;
8649   }
8650   return SQLITE_OK;
8651 }
8652 
8653 /*
8654 ** xStep() callback for the zipfile() aggregate. This can be called in
8655 ** any of the following ways:
8656 **
8657 **   SELECT zipfile(name,data) ...
8658 **   SELECT zipfile(name,mode,mtime,data) ...
8659 **   SELECT zipfile(name,mode,mtime,data,method) ...
8660 */
8661 static void zipfileStep(sqlite3_context *pCtx, int nVal, sqlite3_value **apVal){
8662   ZipfileCtx *p;                  /* Aggregate function context */
8663   ZipfileEntry e;                 /* New entry to add to zip archive */
8664 
8665   sqlite3_value *pName = 0;
8666   sqlite3_value *pMode = 0;
8667   sqlite3_value *pMtime = 0;
8668   sqlite3_value *pData = 0;
8669   sqlite3_value *pMethod = 0;
8670 
8671   int bIsDir = 0;
8672   u32 mode;
8673   int rc = SQLITE_OK;
8674   char *zErr = 0;
8675 
8676   int iMethod = -1;               /* Compression method to use (0 or 8) */
8677 
8678   const u8 *aData = 0;            /* Possibly compressed data for new entry */
8679   int nData = 0;                  /* Size of aData[] in bytes */
8680   int szUncompressed = 0;         /* Size of data before compression */
8681   u8 *aFree = 0;                  /* Free this before returning */
8682   u32 iCrc32 = 0;                 /* crc32 of uncompressed data */
8683 
8684   char *zName = 0;                /* Path (name) of new entry */
8685   int nName = 0;                  /* Size of zName in bytes */
8686   char *zFree = 0;                /* Free this before returning */
8687   int nByte;
8688 
8689   memset(&e, 0, sizeof(e));
8690   p = (ZipfileCtx*)sqlite3_aggregate_context(pCtx, sizeof(ZipfileCtx));
8691   if( p==0 ) return;
8692 
8693   /* Martial the arguments into stack variables */
8694   if( nVal!=2 && nVal!=4 && nVal!=5 ){
8695     zErr = sqlite3_mprintf("wrong number of arguments to function zipfile()");
8696     rc = SQLITE_ERROR;
8697     goto zipfile_step_out;
8698   }
8699   pName = apVal[0];
8700   if( nVal==2 ){
8701     pData = apVal[1];
8702   }else{
8703     pMode = apVal[1];
8704     pMtime = apVal[2];
8705     pData = apVal[3];
8706     if( nVal==5 ){
8707       pMethod = apVal[4];
8708     }
8709   }
8710 
8711   /* Check that the 'name' parameter looks ok. */
8712   zName = (char*)sqlite3_value_text(pName);
8713   nName = sqlite3_value_bytes(pName);
8714   if( zName==0 ){
8715     zErr = sqlite3_mprintf("first argument to zipfile() must be non-NULL");
8716     rc = SQLITE_ERROR;
8717     goto zipfile_step_out;
8718   }
8719 
8720   /* Inspect the 'method' parameter. This must be either 0 (store), 8 (use
8721   ** deflate compression) or NULL (choose automatically).  */
8722   if( pMethod && SQLITE_NULL!=sqlite3_value_type(pMethod) ){
8723     iMethod = (int)sqlite3_value_int64(pMethod);
8724     if( iMethod!=0 && iMethod!=8 ){
8725       zErr = sqlite3_mprintf("illegal method value: %d", iMethod);
8726       rc = SQLITE_ERROR;
8727       goto zipfile_step_out;
8728     }
8729   }
8730 
8731   /* Now inspect the data. If this is NULL, then the new entry must be a
8732   ** directory.  Otherwise, figure out whether or not the data should
8733   ** be deflated or simply stored in the zip archive. */
8734   if( sqlite3_value_type(pData)==SQLITE_NULL ){
8735     bIsDir = 1;
8736     iMethod = 0;
8737   }else{
8738     aData = sqlite3_value_blob(pData);
8739     szUncompressed = nData = sqlite3_value_bytes(pData);
8740     iCrc32 = crc32(0, aData, nData);
8741     if( iMethod<0 || iMethod==8 ){
8742       int nOut = 0;
8743       rc = zipfileDeflate(aData, nData, &aFree, &nOut, &zErr);
8744       if( rc!=SQLITE_OK ){
8745         goto zipfile_step_out;
8746       }
8747       if( iMethod==8 || nOut<nData ){
8748         aData = aFree;
8749         nData = nOut;
8750         iMethod = 8;
8751       }else{
8752         iMethod = 0;
8753       }
8754     }
8755   }
8756 
8757   /* Decode the "mode" argument. */
8758   rc = zipfileGetMode(pMode, bIsDir, &mode, &zErr);
8759   if( rc ) goto zipfile_step_out;
8760 
8761   /* Decode the "mtime" argument. */
8762   e.mUnixTime = zipfileGetTime(pMtime);
8763 
8764   /* If this is a directory entry, ensure that there is exactly one '/'
8765   ** at the end of the path. Or, if this is not a directory and the path
8766   ** ends in '/' it is an error. */
8767   if( bIsDir==0 ){
8768     if( nName>0 && zName[nName-1]=='/' ){
8769       zErr = sqlite3_mprintf("non-directory name must not end with /");
8770       rc = SQLITE_ERROR;
8771       goto zipfile_step_out;
8772     }
8773   }else{
8774     if( nName==0 || zName[nName-1]!='/' ){
8775       zName = zFree = sqlite3_mprintf("%s/", zName);
8776       if( zName==0 ){
8777         rc = SQLITE_NOMEM;
8778         goto zipfile_step_out;
8779       }
8780       nName = (int)strlen(zName);
8781     }else{
8782       while( nName>1 && zName[nName-2]=='/' ) nName--;
8783     }
8784   }
8785 
8786   /* Assemble the ZipfileEntry object for the new zip archive entry */
8787   e.cds.iVersionMadeBy = ZIPFILE_NEWENTRY_MADEBY;
8788   e.cds.iVersionExtract = ZIPFILE_NEWENTRY_REQUIRED;
8789   e.cds.flags = ZIPFILE_NEWENTRY_FLAGS;
8790   e.cds.iCompression = (u16)iMethod;
8791   zipfileMtimeToDos(&e.cds, (u32)e.mUnixTime);
8792   e.cds.crc32 = iCrc32;
8793   e.cds.szCompressed = nData;
8794   e.cds.szUncompressed = szUncompressed;
8795   e.cds.iExternalAttr = (mode<<16);
8796   e.cds.iOffset = p->body.n;
8797   e.cds.nFile = (u16)nName;
8798   e.cds.zFile = zName;
8799 
8800   /* Append the LFH to the body of the new archive */
8801   nByte = ZIPFILE_LFH_FIXED_SZ + e.cds.nFile + 9;
8802   if( (rc = zipfileBufferGrow(&p->body, nByte)) ) goto zipfile_step_out;
8803   p->body.n += zipfileSerializeLFH(&e, &p->body.a[p->body.n]);
8804 
8805   /* Append the data to the body of the new archive */
8806   if( nData>0 ){
8807     if( (rc = zipfileBufferGrow(&p->body, nData)) ) goto zipfile_step_out;
8808     memcpy(&p->body.a[p->body.n], aData, nData);
8809     p->body.n += nData;
8810   }
8811 
8812   /* Append the CDS record to the directory of the new archive */
8813   nByte = ZIPFILE_CDS_FIXED_SZ + e.cds.nFile + 9;
8814   if( (rc = zipfileBufferGrow(&p->cds, nByte)) ) goto zipfile_step_out;
8815   p->cds.n += zipfileSerializeCDS(&e, &p->cds.a[p->cds.n]);
8816 
8817   /* Increment the count of entries in the archive */
8818   p->nEntry++;
8819 
8820  zipfile_step_out:
8821   sqlite3_free(aFree);
8822   sqlite3_free(zFree);
8823   if( rc ){
8824     if( zErr ){
8825       sqlite3_result_error(pCtx, zErr, -1);
8826     }else{
8827       sqlite3_result_error_code(pCtx, rc);
8828     }
8829   }
8830   sqlite3_free(zErr);
8831 }
8832 
8833 /*
8834 ** xFinalize() callback for zipfile aggregate function.
8835 */
8836 static void zipfileFinal(sqlite3_context *pCtx){
8837   ZipfileCtx *p;
8838   ZipfileEOCD eocd;
8839   sqlite3_int64 nZip;
8840   u8 *aZip;
8841 
8842   p = (ZipfileCtx*)sqlite3_aggregate_context(pCtx, sizeof(ZipfileCtx));
8843   if( p==0 ) return;
8844   if( p->nEntry>0 ){
8845     memset(&eocd, 0, sizeof(eocd));
8846     eocd.nEntry = (u16)p->nEntry;
8847     eocd.nEntryTotal = (u16)p->nEntry;
8848     eocd.nSize = p->cds.n;
8849     eocd.iOffset = p->body.n;
8850 
8851     nZip = p->body.n + p->cds.n + ZIPFILE_EOCD_FIXED_SZ;
8852     aZip = (u8*)sqlite3_malloc64(nZip);
8853     if( aZip==0 ){
8854       sqlite3_result_error_nomem(pCtx);
8855     }else{
8856       memcpy(aZip, p->body.a, p->body.n);
8857       memcpy(&aZip[p->body.n], p->cds.a, p->cds.n);
8858       zipfileSerializeEOCD(&eocd, &aZip[p->body.n + p->cds.n]);
8859       sqlite3_result_blob(pCtx, aZip, (int)nZip, zipfileFree);
8860     }
8861   }
8862 
8863   sqlite3_free(p->body.a);
8864   sqlite3_free(p->cds.a);
8865 }
8866 
8867 
8868 /*
8869 ** Register the "zipfile" virtual table.
8870 */
8871 static int zipfileRegister(sqlite3 *db){
8872   static sqlite3_module zipfileModule = {
8873     1,                         /* iVersion */
8874     zipfileConnect,            /* xCreate */
8875     zipfileConnect,            /* xConnect */
8876     zipfileBestIndex,          /* xBestIndex */
8877     zipfileDisconnect,         /* xDisconnect */
8878     zipfileDisconnect,         /* xDestroy */
8879     zipfileOpen,               /* xOpen - open a cursor */
8880     zipfileClose,              /* xClose - close a cursor */
8881     zipfileFilter,             /* xFilter - configure scan constraints */
8882     zipfileNext,               /* xNext - advance a cursor */
8883     zipfileEof,                /* xEof - check for end of scan */
8884     zipfileColumn,             /* xColumn - read data */
8885     0,                         /* xRowid - read data */
8886     zipfileUpdate,             /* xUpdate */
8887     zipfileBegin,              /* xBegin */
8888     0,                         /* xSync */
8889     zipfileCommit,             /* xCommit */
8890     zipfileRollback,           /* xRollback */
8891     zipfileFindFunction,       /* xFindMethod */
8892     0,                         /* xRename */
8893     0,                         /* xSavepoint */
8894     0,                         /* xRelease */
8895     0,                         /* xRollback */
8896     0                          /* xShadowName */
8897   };
8898 
8899   int rc = sqlite3_create_module(db, "zipfile"  , &zipfileModule, 0);
8900   if( rc==SQLITE_OK ) rc = sqlite3_overload_function(db, "zipfile_cds", -1);
8901   if( rc==SQLITE_OK ){
8902     rc = sqlite3_create_function(db, "zipfile", -1, SQLITE_UTF8, 0, 0,
8903         zipfileStep, zipfileFinal
8904     );
8905   }
8906   assert( sizeof(i64)==8 );
8907   assert( sizeof(u32)==4 );
8908   assert( sizeof(u16)==2 );
8909   assert( sizeof(u8)==1 );
8910   return rc;
8911 }
8912 #else         /* SQLITE_OMIT_VIRTUALTABLE */
8913 # define zipfileRegister(x) SQLITE_OK
8914 #endif
8915 
8916 #ifdef _WIN32
8917 
8918 #endif
8919 int sqlite3_zipfile_init(
8920   sqlite3 *db,
8921   char **pzErrMsg,
8922   const sqlite3_api_routines *pApi
8923 ){
8924   SQLITE_EXTENSION_INIT2(pApi);
8925   (void)pzErrMsg;  /* Unused parameter */
8926   return zipfileRegister(db);
8927 }
8928 
8929 /************************* End ../ext/misc/zipfile.c ********************/
8930 /************************* Begin ../ext/misc/sqlar.c ******************/
8931 /*
8932 ** 2017-12-17
8933 **
8934 ** The author disclaims copyright to this source code.  In place of
8935 ** a legal notice, here is a blessing:
8936 **
8937 **    May you do good and not evil.
8938 **    May you find forgiveness for yourself and forgive others.
8939 **    May you share freely, never taking more than you give.
8940 **
8941 ******************************************************************************
8942 **
8943 ** Utility functions sqlar_compress() and sqlar_uncompress(). Useful
8944 ** for working with sqlar archives and used by the shell tool's built-in
8945 ** sqlar support.
8946 */
8947 /* #include "sqlite3ext.h" */
8948 SQLITE_EXTENSION_INIT1
8949 #include <zlib.h>
8950 #include <assert.h>
8951 
8952 /*
8953 ** Implementation of the "sqlar_compress(X)" SQL function.
8954 **
8955 ** If the type of X is SQLITE_BLOB, and compressing that blob using
8956 ** zlib utility function compress() yields a smaller blob, return the
8957 ** compressed blob. Otherwise, return a copy of X.
8958 **
8959 ** SQLar uses the "zlib format" for compressed content.  The zlib format
8960 ** contains a two-byte identification header and a four-byte checksum at
8961 ** the end.  This is different from ZIP which uses the raw deflate format.
8962 **
8963 ** Future enhancements to SQLar might add support for new compression formats.
8964 ** If so, those new formats will be identified by alternative headers in the
8965 ** compressed data.
8966 */
8967 static void sqlarCompressFunc(
8968   sqlite3_context *context,
8969   int argc,
8970   sqlite3_value **argv
8971 ){
8972   assert( argc==1 );
8973   if( sqlite3_value_type(argv[0])==SQLITE_BLOB ){
8974     const Bytef *pData = sqlite3_value_blob(argv[0]);
8975     uLong nData = sqlite3_value_bytes(argv[0]);
8976     uLongf nOut = compressBound(nData);
8977     Bytef *pOut;
8978 
8979     pOut = (Bytef*)sqlite3_malloc(nOut);
8980     if( pOut==0 ){
8981       sqlite3_result_error_nomem(context);
8982       return;
8983     }else{
8984       if( Z_OK!=compress(pOut, &nOut, pData, nData) ){
8985         sqlite3_result_error(context, "error in compress()", -1);
8986       }else if( nOut<nData ){
8987         sqlite3_result_blob(context, pOut, nOut, SQLITE_TRANSIENT);
8988       }else{
8989         sqlite3_result_value(context, argv[0]);
8990       }
8991       sqlite3_free(pOut);
8992     }
8993   }else{
8994     sqlite3_result_value(context, argv[0]);
8995   }
8996 }
8997 
8998 /*
8999 ** Implementation of the "sqlar_uncompress(X,SZ)" SQL function
9000 **
9001 ** Parameter SZ is interpreted as an integer. If it is less than or
9002 ** equal to zero, then this function returns a copy of X. Or, if
9003 ** SZ is equal to the size of X when interpreted as a blob, also
9004 ** return a copy of X. Otherwise, decompress blob X using zlib
9005 ** utility function uncompress() and return the results (another
9006 ** blob).
9007 */
9008 static void sqlarUncompressFunc(
9009   sqlite3_context *context,
9010   int argc,
9011   sqlite3_value **argv
9012 ){
9013   uLong nData;
9014   uLongf sz;
9015 
9016   assert( argc==2 );
9017   sz = sqlite3_value_int(argv[1]);
9018 
9019   if( sz<=0 || sz==(nData = sqlite3_value_bytes(argv[0])) ){
9020     sqlite3_result_value(context, argv[0]);
9021   }else{
9022     const Bytef *pData= sqlite3_value_blob(argv[0]);
9023     Bytef *pOut = sqlite3_malloc(sz);
9024     if( Z_OK!=uncompress(pOut, &sz, pData, nData) ){
9025       sqlite3_result_error(context, "error in uncompress()", -1);
9026     }else{
9027       sqlite3_result_blob(context, pOut, sz, SQLITE_TRANSIENT);
9028     }
9029     sqlite3_free(pOut);
9030   }
9031 }
9032 
9033 
9034 #ifdef _WIN32
9035 
9036 #endif
9037 int sqlite3_sqlar_init(
9038   sqlite3 *db,
9039   char **pzErrMsg,
9040   const sqlite3_api_routines *pApi
9041 ){
9042   int rc = SQLITE_OK;
9043   SQLITE_EXTENSION_INIT2(pApi);
9044   (void)pzErrMsg;  /* Unused parameter */
9045   rc = sqlite3_create_function(db, "sqlar_compress", 1,
9046                                SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
9047                                sqlarCompressFunc, 0, 0);
9048   if( rc==SQLITE_OK ){
9049     rc = sqlite3_create_function(db, "sqlar_uncompress", 2,
9050                                  SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
9051                                  sqlarUncompressFunc, 0, 0);
9052   }
9053   return rc;
9054 }
9055 
9056 /************************* End ../ext/misc/sqlar.c ********************/
9057 #endif
9058 /************************* Begin ../ext/expert/sqlite3expert.h ******************/
9059 /*
9060 ** 2017 April 07
9061 **
9062 ** The author disclaims copyright to this source code.  In place of
9063 ** a legal notice, here is a blessing:
9064 **
9065 **    May you do good and not evil.
9066 **    May you find forgiveness for yourself and forgive others.
9067 **    May you share freely, never taking more than you give.
9068 **
9069 *************************************************************************
9070 */
9071 #if !defined(SQLITEEXPERT_H)
9072 #define SQLITEEXPERT_H 1
9073 /* #include "sqlite3.h" */
9074 
9075 typedef struct sqlite3expert sqlite3expert;
9076 
9077 /*
9078 ** Create a new sqlite3expert object.
9079 **
9080 ** If successful, a pointer to the new object is returned and (*pzErr) set
9081 ** to NULL. Or, if an error occurs, NULL is returned and (*pzErr) set to
9082 ** an English-language error message. In this case it is the responsibility
9083 ** of the caller to eventually free the error message buffer using
9084 ** sqlite3_free().
9085 */
9086 sqlite3expert *sqlite3_expert_new(sqlite3 *db, char **pzErr);
9087 
9088 /*
9089 ** Configure an sqlite3expert object.
9090 **
9091 ** EXPERT_CONFIG_SAMPLE:
9092 **   By default, sqlite3_expert_analyze() generates sqlite_stat1 data for
9093 **   each candidate index. This involves scanning and sorting the entire
9094 **   contents of each user database table once for each candidate index
9095 **   associated with the table. For large databases, this can be
9096 **   prohibitively slow. This option allows the sqlite3expert object to
9097 **   be configured so that sqlite_stat1 data is instead generated based on a
9098 **   subset of each table, or so that no sqlite_stat1 data is used at all.
9099 **
9100 **   A single integer argument is passed to this option. If the value is less
9101 **   than or equal to zero, then no sqlite_stat1 data is generated or used by
9102 **   the analysis - indexes are recommended based on the database schema only.
9103 **   Or, if the value is 100 or greater, complete sqlite_stat1 data is
9104 **   generated for each candidate index (this is the default). Finally, if the
9105 **   value falls between 0 and 100, then it represents the percentage of user
9106 **   table rows that should be considered when generating sqlite_stat1 data.
9107 **
9108 **   Examples:
9109 **
9110 **     // Do not generate any sqlite_stat1 data
9111 **     sqlite3_expert_config(pExpert, EXPERT_CONFIG_SAMPLE, 0);
9112 **
9113 **     // Generate sqlite_stat1 data based on 10% of the rows in each table.
9114 **     sqlite3_expert_config(pExpert, EXPERT_CONFIG_SAMPLE, 10);
9115 */
9116 int sqlite3_expert_config(sqlite3expert *p, int op, ...);
9117 
9118 #define EXPERT_CONFIG_SAMPLE 1    /* int */
9119 
9120 /*
9121 ** Specify zero or more SQL statements to be included in the analysis.
9122 **
9123 ** Buffer zSql must contain zero or more complete SQL statements. This
9124 ** function parses all statements contained in the buffer and adds them
9125 ** to the internal list of statements to analyze. If successful, SQLITE_OK
9126 ** is returned and (*pzErr) set to NULL. Or, if an error occurs - for example
9127 ** due to a error in the SQL - an SQLite error code is returned and (*pzErr)
9128 ** may be set to point to an English language error message. In this case
9129 ** the caller is responsible for eventually freeing the error message buffer
9130 ** using sqlite3_free().
9131 **
9132 ** If an error does occur while processing one of the statements in the
9133 ** buffer passed as the second argument, none of the statements in the
9134 ** buffer are added to the analysis.
9135 **
9136 ** This function must be called before sqlite3_expert_analyze(). If a call
9137 ** to this function is made on an sqlite3expert object that has already
9138 ** been passed to sqlite3_expert_analyze() SQLITE_MISUSE is returned
9139 ** immediately and no statements are added to the analysis.
9140 */
9141 int sqlite3_expert_sql(
9142   sqlite3expert *p,               /* From a successful sqlite3_expert_new() */
9143   const char *zSql,               /* SQL statement(s) to add */
9144   char **pzErr                    /* OUT: Error message (if any) */
9145 );
9146 
9147 
9148 /*
9149 ** This function is called after the sqlite3expert object has been configured
9150 ** with all SQL statements using sqlite3_expert_sql() to actually perform
9151 ** the analysis. Once this function has been called, it is not possible to
9152 ** add further SQL statements to the analysis.
9153 **
9154 ** If successful, SQLITE_OK is returned and (*pzErr) is set to NULL. Or, if
9155 ** an error occurs, an SQLite error code is returned and (*pzErr) set to
9156 ** point to a buffer containing an English language error message. In this
9157 ** case it is the responsibility of the caller to eventually free the buffer
9158 ** using sqlite3_free().
9159 **
9160 ** If an error does occur within this function, the sqlite3expert object
9161 ** is no longer useful for any purpose. At that point it is no longer
9162 ** possible to add further SQL statements to the object or to re-attempt
9163 ** the analysis. The sqlite3expert object must still be freed using a call
9164 ** sqlite3_expert_destroy().
9165 */
9166 int sqlite3_expert_analyze(sqlite3expert *p, char **pzErr);
9167 
9168 /*
9169 ** Return the total number of statements loaded using sqlite3_expert_sql().
9170 ** The total number of SQL statements may be different from the total number
9171 ** to calls to sqlite3_expert_sql().
9172 */
9173 int sqlite3_expert_count(sqlite3expert*);
9174 
9175 /*
9176 ** Return a component of the report.
9177 **
9178 ** This function is called after sqlite3_expert_analyze() to extract the
9179 ** results of the analysis. Each call to this function returns either a
9180 ** NULL pointer or a pointer to a buffer containing a nul-terminated string.
9181 ** The value passed as the third argument must be one of the EXPERT_REPORT_*
9182 ** #define constants defined below.
9183 **
9184 ** For some EXPERT_REPORT_* parameters, the buffer returned contains
9185 ** information relating to a specific SQL statement. In these cases that
9186 ** SQL statement is identified by the value passed as the second argument.
9187 ** SQL statements are numbered from 0 in the order in which they are parsed.
9188 ** If an out-of-range value (less than zero or equal to or greater than the
9189 ** value returned by sqlite3_expert_count()) is passed as the second argument
9190 ** along with such an EXPERT_REPORT_* parameter, NULL is always returned.
9191 **
9192 ** EXPERT_REPORT_SQL:
9193 **   Return the text of SQL statement iStmt.
9194 **
9195 ** EXPERT_REPORT_INDEXES:
9196 **   Return a buffer containing the CREATE INDEX statements for all recommended
9197 **   indexes for statement iStmt. If there are no new recommeded indexes, NULL
9198 **   is returned.
9199 **
9200 ** EXPERT_REPORT_PLAN:
9201 **   Return a buffer containing the EXPLAIN QUERY PLAN output for SQL query
9202 **   iStmt after the proposed indexes have been added to the database schema.
9203 **
9204 ** EXPERT_REPORT_CANDIDATES:
9205 **   Return a pointer to a buffer containing the CREATE INDEX statements
9206 **   for all indexes that were tested (for all SQL statements). The iStmt
9207 **   parameter is ignored for EXPERT_REPORT_CANDIDATES calls.
9208 */
9209 const char *sqlite3_expert_report(sqlite3expert*, int iStmt, int eReport);
9210 
9211 /*
9212 ** Values for the third argument passed to sqlite3_expert_report().
9213 */
9214 #define EXPERT_REPORT_SQL        1
9215 #define EXPERT_REPORT_INDEXES    2
9216 #define EXPERT_REPORT_PLAN       3
9217 #define EXPERT_REPORT_CANDIDATES 4
9218 
9219 /*
9220 ** Free an (sqlite3expert*) handle and all associated resources. There
9221 ** should be one call to this function for each successful call to
9222 ** sqlite3-expert_new().
9223 */
9224 void sqlite3_expert_destroy(sqlite3expert*);
9225 
9226 #endif  /* !defined(SQLITEEXPERT_H) */
9227 
9228 /************************* End ../ext/expert/sqlite3expert.h ********************/
9229 /************************* Begin ../ext/expert/sqlite3expert.c ******************/
9230 /*
9231 ** 2017 April 09
9232 **
9233 ** The author disclaims copyright to this source code.  In place of
9234 ** a legal notice, here is a blessing:
9235 **
9236 **    May you do good and not evil.
9237 **    May you find forgiveness for yourself and forgive others.
9238 **    May you share freely, never taking more than you give.
9239 **
9240 *************************************************************************
9241 */
9242 /* #include "sqlite3expert.h" */
9243 #include <assert.h>
9244 #include <string.h>
9245 #include <stdio.h>
9246 
9247 #if !defined(SQLITE_AMALGAMATION)
9248 #if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST)
9249 # define SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS 1
9250 #endif
9251 #if defined(SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS)
9252 # define ALWAYS(X)      (1)
9253 # define NEVER(X)       (0)
9254 #elif !defined(NDEBUG)
9255 # define ALWAYS(X)      ((X)?1:(assert(0),0))
9256 # define NEVER(X)       ((X)?(assert(0),1):0)
9257 #else
9258 # define ALWAYS(X)      (X)
9259 # define NEVER(X)       (X)
9260 #endif
9261 #endif /* !defined(SQLITE_AMALGAMATION) */
9262 
9263 
9264 #ifndef SQLITE_OMIT_VIRTUALTABLE
9265 
9266 /* typedef sqlite3_int64 i64; */
9267 /* typedef sqlite3_uint64 u64; */
9268 
9269 typedef struct IdxColumn IdxColumn;
9270 typedef struct IdxConstraint IdxConstraint;
9271 typedef struct IdxScan IdxScan;
9272 typedef struct IdxStatement IdxStatement;
9273 typedef struct IdxTable IdxTable;
9274 typedef struct IdxWrite IdxWrite;
9275 
9276 #define STRLEN  (int)strlen
9277 
9278 /*
9279 ** A temp table name that we assume no user database will actually use.
9280 ** If this assumption proves incorrect triggers on the table with the
9281 ** conflicting name will be ignored.
9282 */
9283 #define UNIQUE_TABLE_NAME "t592690916721053953805701627921227776"
9284 
9285 /*
9286 ** A single constraint. Equivalent to either "col = ?" or "col < ?" (or
9287 ** any other type of single-ended range constraint on a column).
9288 **
9289 ** pLink:
9290 **   Used to temporarily link IdxConstraint objects into lists while
9291 **   creating candidate indexes.
9292 */
9293 struct IdxConstraint {
9294   char *zColl;                    /* Collation sequence */
9295   int bRange;                     /* True for range, false for eq */
9296   int iCol;                       /* Constrained table column */
9297   int bFlag;                      /* Used by idxFindCompatible() */
9298   int bDesc;                      /* True if ORDER BY <expr> DESC */
9299   IdxConstraint *pNext;           /* Next constraint in pEq or pRange list */
9300   IdxConstraint *pLink;           /* See above */
9301 };
9302 
9303 /*
9304 ** A single scan of a single table.
9305 */
9306 struct IdxScan {
9307   IdxTable *pTab;                 /* Associated table object */
9308   int iDb;                        /* Database containing table zTable */
9309   i64 covering;                   /* Mask of columns required for cov. index */
9310   IdxConstraint *pOrder;          /* ORDER BY columns */
9311   IdxConstraint *pEq;             /* List of == constraints */
9312   IdxConstraint *pRange;          /* List of < constraints */
9313   IdxScan *pNextScan;             /* Next IdxScan object for same analysis */
9314 };
9315 
9316 /*
9317 ** Information regarding a single database table. Extracted from
9318 ** "PRAGMA table_info" by function idxGetTableInfo().
9319 */
9320 struct IdxColumn {
9321   char *zName;
9322   char *zColl;
9323   int iPk;
9324 };
9325 struct IdxTable {
9326   int nCol;
9327   char *zName;                    /* Table name */
9328   IdxColumn *aCol;
9329   IdxTable *pNext;                /* Next table in linked list of all tables */
9330 };
9331 
9332 /*
9333 ** An object of the following type is created for each unique table/write-op
9334 ** seen. The objects are stored in a singly-linked list beginning at
9335 ** sqlite3expert.pWrite.
9336 */
9337 struct IdxWrite {
9338   IdxTable *pTab;
9339   int eOp;                        /* SQLITE_UPDATE, DELETE or INSERT */
9340   IdxWrite *pNext;
9341 };
9342 
9343 /*
9344 ** Each statement being analyzed is represented by an instance of this
9345 ** structure.
9346 */
9347 struct IdxStatement {
9348   int iId;                        /* Statement number */
9349   char *zSql;                     /* SQL statement */
9350   char *zIdx;                     /* Indexes */
9351   char *zEQP;                     /* Plan */
9352   IdxStatement *pNext;
9353 };
9354 
9355 
9356 /*
9357 ** A hash table for storing strings. With space for a payload string
9358 ** with each entry. Methods are:
9359 **
9360 **   idxHashInit()
9361 **   idxHashClear()
9362 **   idxHashAdd()
9363 **   idxHashSearch()
9364 */
9365 #define IDX_HASH_SIZE 1023
9366 typedef struct IdxHashEntry IdxHashEntry;
9367 typedef struct IdxHash IdxHash;
9368 struct IdxHashEntry {
9369   char *zKey;                     /* nul-terminated key */
9370   char *zVal;                     /* nul-terminated value string */
9371   char *zVal2;                    /* nul-terminated value string 2 */
9372   IdxHashEntry *pHashNext;        /* Next entry in same hash bucket */
9373   IdxHashEntry *pNext;            /* Next entry in hash */
9374 };
9375 struct IdxHash {
9376   IdxHashEntry *pFirst;
9377   IdxHashEntry *aHash[IDX_HASH_SIZE];
9378 };
9379 
9380 /*
9381 ** sqlite3expert object.
9382 */
9383 struct sqlite3expert {
9384   int iSample;                    /* Percentage of tables to sample for stat1 */
9385   sqlite3 *db;                    /* User database */
9386   sqlite3 *dbm;                   /* In-memory db for this analysis */
9387   sqlite3 *dbv;                   /* Vtab schema for this analysis */
9388   IdxTable *pTable;               /* List of all IdxTable objects */
9389   IdxScan *pScan;                 /* List of scan objects */
9390   IdxWrite *pWrite;               /* List of write objects */
9391   IdxStatement *pStatement;       /* List of IdxStatement objects */
9392   int bRun;                       /* True once analysis has run */
9393   char **pzErrmsg;
9394   int rc;                         /* Error code from whereinfo hook */
9395   IdxHash hIdx;                   /* Hash containing all candidate indexes */
9396   char *zCandidates;              /* For EXPERT_REPORT_CANDIDATES */
9397 };
9398 
9399 
9400 /*
9401 ** Allocate and return nByte bytes of zeroed memory using sqlite3_malloc().
9402 ** If the allocation fails, set *pRc to SQLITE_NOMEM and return NULL.
9403 */
9404 static void *idxMalloc(int *pRc, int nByte){
9405   void *pRet;
9406   assert( *pRc==SQLITE_OK );
9407   assert( nByte>0 );
9408   pRet = sqlite3_malloc(nByte);
9409   if( pRet ){
9410     memset(pRet, 0, nByte);
9411   }else{
9412     *pRc = SQLITE_NOMEM;
9413   }
9414   return pRet;
9415 }
9416 
9417 /*
9418 ** Initialize an IdxHash hash table.
9419 */
9420 static void idxHashInit(IdxHash *pHash){
9421   memset(pHash, 0, sizeof(IdxHash));
9422 }
9423 
9424 /*
9425 ** Reset an IdxHash hash table.
9426 */
9427 static void idxHashClear(IdxHash *pHash){
9428   int i;
9429   for(i=0; i<IDX_HASH_SIZE; i++){
9430     IdxHashEntry *pEntry;
9431     IdxHashEntry *pNext;
9432     for(pEntry=pHash->aHash[i]; pEntry; pEntry=pNext){
9433       pNext = pEntry->pHashNext;
9434       sqlite3_free(pEntry->zVal2);
9435       sqlite3_free(pEntry);
9436     }
9437   }
9438   memset(pHash, 0, sizeof(IdxHash));
9439 }
9440 
9441 /*
9442 ** Return the index of the hash bucket that the string specified by the
9443 ** arguments to this function belongs.
9444 */
9445 static int idxHashString(const char *z, int n){
9446   unsigned int ret = 0;
9447   int i;
9448   for(i=0; i<n; i++){
9449     ret += (ret<<3) + (unsigned char)(z[i]);
9450   }
9451   return (int)(ret % IDX_HASH_SIZE);
9452 }
9453 
9454 /*
9455 ** If zKey is already present in the hash table, return non-zero and do
9456 ** nothing. Otherwise, add an entry with key zKey and payload string zVal to
9457 ** the hash table passed as the second argument.
9458 */
9459 static int idxHashAdd(
9460   int *pRc,
9461   IdxHash *pHash,
9462   const char *zKey,
9463   const char *zVal
9464 ){
9465   int nKey = STRLEN(zKey);
9466   int iHash = idxHashString(zKey, nKey);
9467   int nVal = (zVal ? STRLEN(zVal) : 0);
9468   IdxHashEntry *pEntry;
9469   assert( iHash>=0 );
9470   for(pEntry=pHash->aHash[iHash]; pEntry; pEntry=pEntry->pHashNext){
9471     if( STRLEN(pEntry->zKey)==nKey && 0==memcmp(pEntry->zKey, zKey, nKey) ){
9472       return 1;
9473     }
9474   }
9475   pEntry = idxMalloc(pRc, sizeof(IdxHashEntry) + nKey+1 + nVal+1);
9476   if( pEntry ){
9477     pEntry->zKey = (char*)&pEntry[1];
9478     memcpy(pEntry->zKey, zKey, nKey);
9479     if( zVal ){
9480       pEntry->zVal = &pEntry->zKey[nKey+1];
9481       memcpy(pEntry->zVal, zVal, nVal);
9482     }
9483     pEntry->pHashNext = pHash->aHash[iHash];
9484     pHash->aHash[iHash] = pEntry;
9485 
9486     pEntry->pNext = pHash->pFirst;
9487     pHash->pFirst = pEntry;
9488   }
9489   return 0;
9490 }
9491 
9492 /*
9493 ** If zKey/nKey is present in the hash table, return a pointer to the
9494 ** hash-entry object.
9495 */
9496 static IdxHashEntry *idxHashFind(IdxHash *pHash, const char *zKey, int nKey){
9497   int iHash;
9498   IdxHashEntry *pEntry;
9499   if( nKey<0 ) nKey = STRLEN(zKey);
9500   iHash = idxHashString(zKey, nKey);
9501   assert( iHash>=0 );
9502   for(pEntry=pHash->aHash[iHash]; pEntry; pEntry=pEntry->pHashNext){
9503     if( STRLEN(pEntry->zKey)==nKey && 0==memcmp(pEntry->zKey, zKey, nKey) ){
9504       return pEntry;
9505     }
9506   }
9507   return 0;
9508 }
9509 
9510 /*
9511 ** If the hash table contains an entry with a key equal to the string
9512 ** passed as the final two arguments to this function, return a pointer
9513 ** to the payload string. Otherwise, if zKey/nKey is not present in the
9514 ** hash table, return NULL.
9515 */
9516 static const char *idxHashSearch(IdxHash *pHash, const char *zKey, int nKey){
9517   IdxHashEntry *pEntry = idxHashFind(pHash, zKey, nKey);
9518   if( pEntry ) return pEntry->zVal;
9519   return 0;
9520 }
9521 
9522 /*
9523 ** Allocate and return a new IdxConstraint object. Set the IdxConstraint.zColl
9524 ** variable to point to a copy of nul-terminated string zColl.
9525 */
9526 static IdxConstraint *idxNewConstraint(int *pRc, const char *zColl){
9527   IdxConstraint *pNew;
9528   int nColl = STRLEN(zColl);
9529 
9530   assert( *pRc==SQLITE_OK );
9531   pNew = (IdxConstraint*)idxMalloc(pRc, sizeof(IdxConstraint) * nColl + 1);
9532   if( pNew ){
9533     pNew->zColl = (char*)&pNew[1];
9534     memcpy(pNew->zColl, zColl, nColl+1);
9535   }
9536   return pNew;
9537 }
9538 
9539 /*
9540 ** An error associated with database handle db has just occurred. Pass
9541 ** the error message to callback function xOut.
9542 */
9543 static void idxDatabaseError(
9544   sqlite3 *db,                    /* Database handle */
9545   char **pzErrmsg                 /* Write error here */
9546 ){
9547   *pzErrmsg = sqlite3_mprintf("%s", sqlite3_errmsg(db));
9548 }
9549 
9550 /*
9551 ** Prepare an SQL statement.
9552 */
9553 static int idxPrepareStmt(
9554   sqlite3 *db,                    /* Database handle to compile against */
9555   sqlite3_stmt **ppStmt,          /* OUT: Compiled SQL statement */
9556   char **pzErrmsg,                /* OUT: sqlite3_malloc()ed error message */
9557   const char *zSql                /* SQL statement to compile */
9558 ){
9559   int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0);
9560   if( rc!=SQLITE_OK ){
9561     *ppStmt = 0;
9562     idxDatabaseError(db, pzErrmsg);
9563   }
9564   return rc;
9565 }
9566 
9567 /*
9568 ** Prepare an SQL statement using the results of a printf() formatting.
9569 */
9570 static int idxPrintfPrepareStmt(
9571   sqlite3 *db,                    /* Database handle to compile against */
9572   sqlite3_stmt **ppStmt,          /* OUT: Compiled SQL statement */
9573   char **pzErrmsg,                /* OUT: sqlite3_malloc()ed error message */
9574   const char *zFmt,               /* printf() format of SQL statement */
9575   ...                             /* Trailing printf() arguments */
9576 ){
9577   va_list ap;
9578   int rc;
9579   char *zSql;
9580   va_start(ap, zFmt);
9581   zSql = sqlite3_vmprintf(zFmt, ap);
9582   if( zSql==0 ){
9583     rc = SQLITE_NOMEM;
9584   }else{
9585     rc = idxPrepareStmt(db, ppStmt, pzErrmsg, zSql);
9586     sqlite3_free(zSql);
9587   }
9588   va_end(ap);
9589   return rc;
9590 }
9591 
9592 
9593 /*************************************************************************
9594 ** Beginning of virtual table implementation.
9595 */
9596 typedef struct ExpertVtab ExpertVtab;
9597 struct ExpertVtab {
9598   sqlite3_vtab base;
9599   IdxTable *pTab;
9600   sqlite3expert *pExpert;
9601 };
9602 
9603 typedef struct ExpertCsr ExpertCsr;
9604 struct ExpertCsr {
9605   sqlite3_vtab_cursor base;
9606   sqlite3_stmt *pData;
9607 };
9608 
9609 static char *expertDequote(const char *zIn){
9610   int n = STRLEN(zIn);
9611   char *zRet = sqlite3_malloc(n);
9612 
9613   assert( zIn[0]=='\'' );
9614   assert( zIn[n-1]=='\'' );
9615 
9616   if( zRet ){
9617     int iOut = 0;
9618     int iIn = 0;
9619     for(iIn=1; iIn<(n-1); iIn++){
9620       if( zIn[iIn]=='\'' ){
9621         assert( zIn[iIn+1]=='\'' );
9622         iIn++;
9623       }
9624       zRet[iOut++] = zIn[iIn];
9625     }
9626     zRet[iOut] = '\0';
9627   }
9628 
9629   return zRet;
9630 }
9631 
9632 /*
9633 ** This function is the implementation of both the xConnect and xCreate
9634 ** methods of the r-tree virtual table.
9635 **
9636 **   argv[0]   -> module name
9637 **   argv[1]   -> database name
9638 **   argv[2]   -> table name
9639 **   argv[...] -> column names...
9640 */
9641 static int expertConnect(
9642   sqlite3 *db,
9643   void *pAux,
9644   int argc, const char *const*argv,
9645   sqlite3_vtab **ppVtab,
9646   char **pzErr
9647 ){
9648   sqlite3expert *pExpert = (sqlite3expert*)pAux;
9649   ExpertVtab *p = 0;
9650   int rc;
9651 
9652   if( argc!=4 ){
9653     *pzErr = sqlite3_mprintf("internal error!");
9654     rc = SQLITE_ERROR;
9655   }else{
9656     char *zCreateTable = expertDequote(argv[3]);
9657     if( zCreateTable ){
9658       rc = sqlite3_declare_vtab(db, zCreateTable);
9659       if( rc==SQLITE_OK ){
9660         p = idxMalloc(&rc, sizeof(ExpertVtab));
9661       }
9662       if( rc==SQLITE_OK ){
9663         p->pExpert = pExpert;
9664         p->pTab = pExpert->pTable;
9665         assert( sqlite3_stricmp(p->pTab->zName, argv[2])==0 );
9666       }
9667       sqlite3_free(zCreateTable);
9668     }else{
9669       rc = SQLITE_NOMEM;
9670     }
9671   }
9672 
9673   *ppVtab = (sqlite3_vtab*)p;
9674   return rc;
9675 }
9676 
9677 static int expertDisconnect(sqlite3_vtab *pVtab){
9678   ExpertVtab *p = (ExpertVtab*)pVtab;
9679   sqlite3_free(p);
9680   return SQLITE_OK;
9681 }
9682 
9683 static int expertBestIndex(sqlite3_vtab *pVtab, sqlite3_index_info *pIdxInfo){
9684   ExpertVtab *p = (ExpertVtab*)pVtab;
9685   int rc = SQLITE_OK;
9686   int n = 0;
9687   IdxScan *pScan;
9688   const int opmask =
9689     SQLITE_INDEX_CONSTRAINT_EQ | SQLITE_INDEX_CONSTRAINT_GT |
9690     SQLITE_INDEX_CONSTRAINT_LT | SQLITE_INDEX_CONSTRAINT_GE |
9691     SQLITE_INDEX_CONSTRAINT_LE;
9692 
9693   pScan = idxMalloc(&rc, sizeof(IdxScan));
9694   if( pScan ){
9695     int i;
9696 
9697     /* Link the new scan object into the list */
9698     pScan->pTab = p->pTab;
9699     pScan->pNextScan = p->pExpert->pScan;
9700     p->pExpert->pScan = pScan;
9701 
9702     /* Add the constraints to the IdxScan object */
9703     for(i=0; i<pIdxInfo->nConstraint; i++){
9704       struct sqlite3_index_constraint *pCons = &pIdxInfo->aConstraint[i];
9705       if( pCons->usable
9706        && pCons->iColumn>=0
9707        && p->pTab->aCol[pCons->iColumn].iPk==0
9708        && (pCons->op & opmask)
9709       ){
9710         IdxConstraint *pNew;
9711         const char *zColl = sqlite3_vtab_collation(pIdxInfo, i);
9712         pNew = idxNewConstraint(&rc, zColl);
9713         if( pNew ){
9714           pNew->iCol = pCons->iColumn;
9715           if( pCons->op==SQLITE_INDEX_CONSTRAINT_EQ ){
9716             pNew->pNext = pScan->pEq;
9717             pScan->pEq = pNew;
9718           }else{
9719             pNew->bRange = 1;
9720             pNew->pNext = pScan->pRange;
9721             pScan->pRange = pNew;
9722           }
9723         }
9724         n++;
9725         pIdxInfo->aConstraintUsage[i].argvIndex = n;
9726       }
9727     }
9728 
9729     /* Add the ORDER BY to the IdxScan object */
9730     for(i=pIdxInfo->nOrderBy-1; i>=0; i--){
9731       int iCol = pIdxInfo->aOrderBy[i].iColumn;
9732       if( iCol>=0 ){
9733         IdxConstraint *pNew = idxNewConstraint(&rc, p->pTab->aCol[iCol].zColl);
9734         if( pNew ){
9735           pNew->iCol = iCol;
9736           pNew->bDesc = pIdxInfo->aOrderBy[i].desc;
9737           pNew->pNext = pScan->pOrder;
9738           pNew->pLink = pScan->pOrder;
9739           pScan->pOrder = pNew;
9740           n++;
9741         }
9742       }
9743     }
9744   }
9745 
9746   pIdxInfo->estimatedCost = 1000000.0 / (n+1);
9747   return rc;
9748 }
9749 
9750 static int expertUpdate(
9751   sqlite3_vtab *pVtab,
9752   int nData,
9753   sqlite3_value **azData,
9754   sqlite_int64 *pRowid
9755 ){
9756   (void)pVtab;
9757   (void)nData;
9758   (void)azData;
9759   (void)pRowid;
9760   return SQLITE_OK;
9761 }
9762 
9763 /*
9764 ** Virtual table module xOpen method.
9765 */
9766 static int expertOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){
9767   int rc = SQLITE_OK;
9768   ExpertCsr *pCsr;
9769   (void)pVTab;
9770   pCsr = idxMalloc(&rc, sizeof(ExpertCsr));
9771   *ppCursor = (sqlite3_vtab_cursor*)pCsr;
9772   return rc;
9773 }
9774 
9775 /*
9776 ** Virtual table module xClose method.
9777 */
9778 static int expertClose(sqlite3_vtab_cursor *cur){
9779   ExpertCsr *pCsr = (ExpertCsr*)cur;
9780   sqlite3_finalize(pCsr->pData);
9781   sqlite3_free(pCsr);
9782   return SQLITE_OK;
9783 }
9784 
9785 /*
9786 ** Virtual table module xEof method.
9787 **
9788 ** Return non-zero if the cursor does not currently point to a valid
9789 ** record (i.e if the scan has finished), or zero otherwise.
9790 */
9791 static int expertEof(sqlite3_vtab_cursor *cur){
9792   ExpertCsr *pCsr = (ExpertCsr*)cur;
9793   return pCsr->pData==0;
9794 }
9795 
9796 /*
9797 ** Virtual table module xNext method.
9798 */
9799 static int expertNext(sqlite3_vtab_cursor *cur){
9800   ExpertCsr *pCsr = (ExpertCsr*)cur;
9801   int rc = SQLITE_OK;
9802 
9803   assert( pCsr->pData );
9804   rc = sqlite3_step(pCsr->pData);
9805   if( rc!=SQLITE_ROW ){
9806     rc = sqlite3_finalize(pCsr->pData);
9807     pCsr->pData = 0;
9808   }else{
9809     rc = SQLITE_OK;
9810   }
9811 
9812   return rc;
9813 }
9814 
9815 /*
9816 ** Virtual table module xRowid method.
9817 */
9818 static int expertRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
9819   (void)cur;
9820   *pRowid = 0;
9821   return SQLITE_OK;
9822 }
9823 
9824 /*
9825 ** Virtual table module xColumn method.
9826 */
9827 static int expertColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){
9828   ExpertCsr *pCsr = (ExpertCsr*)cur;
9829   sqlite3_value *pVal;
9830   pVal = sqlite3_column_value(pCsr->pData, i);
9831   if( pVal ){
9832     sqlite3_result_value(ctx, pVal);
9833   }
9834   return SQLITE_OK;
9835 }
9836 
9837 /*
9838 ** Virtual table module xFilter method.
9839 */
9840 static int expertFilter(
9841   sqlite3_vtab_cursor *cur,
9842   int idxNum, const char *idxStr,
9843   int argc, sqlite3_value **argv
9844 ){
9845   ExpertCsr *pCsr = (ExpertCsr*)cur;
9846   ExpertVtab *pVtab = (ExpertVtab*)(cur->pVtab);
9847   sqlite3expert *pExpert = pVtab->pExpert;
9848   int rc;
9849 
9850   (void)idxNum;
9851   (void)idxStr;
9852   (void)argc;
9853   (void)argv;
9854   rc = sqlite3_finalize(pCsr->pData);
9855   pCsr->pData = 0;
9856   if( rc==SQLITE_OK ){
9857     rc = idxPrintfPrepareStmt(pExpert->db, &pCsr->pData, &pVtab->base.zErrMsg,
9858         "SELECT * FROM main.%Q WHERE sample()", pVtab->pTab->zName
9859     );
9860   }
9861 
9862   if( rc==SQLITE_OK ){
9863     rc = expertNext(cur);
9864   }
9865   return rc;
9866 }
9867 
9868 static int idxRegisterVtab(sqlite3expert *p){
9869   static sqlite3_module expertModule = {
9870     2,                            /* iVersion */
9871     expertConnect,                /* xCreate - create a table */
9872     expertConnect,                /* xConnect - connect to an existing table */
9873     expertBestIndex,              /* xBestIndex - Determine search strategy */
9874     expertDisconnect,             /* xDisconnect - Disconnect from a table */
9875     expertDisconnect,             /* xDestroy - Drop a table */
9876     expertOpen,                   /* xOpen - open a cursor */
9877     expertClose,                  /* xClose - close a cursor */
9878     expertFilter,                 /* xFilter - configure scan constraints */
9879     expertNext,                   /* xNext - advance a cursor */
9880     expertEof,                    /* xEof */
9881     expertColumn,                 /* xColumn - read data */
9882     expertRowid,                  /* xRowid - read data */
9883     expertUpdate,                 /* xUpdate - write data */
9884     0,                            /* xBegin - begin transaction */
9885     0,                            /* xSync - sync transaction */
9886     0,                            /* xCommit - commit transaction */
9887     0,                            /* xRollback - rollback transaction */
9888     0,                            /* xFindFunction - function overloading */
9889     0,                            /* xRename - rename the table */
9890     0,                            /* xSavepoint */
9891     0,                            /* xRelease */
9892     0,                            /* xRollbackTo */
9893     0,                            /* xShadowName */
9894   };
9895 
9896   return sqlite3_create_module(p->dbv, "expert", &expertModule, (void*)p);
9897 }
9898 /*
9899 ** End of virtual table implementation.
9900 *************************************************************************/
9901 /*
9902 ** Finalize SQL statement pStmt. If (*pRc) is SQLITE_OK when this function
9903 ** is called, set it to the return value of sqlite3_finalize() before
9904 ** returning. Otherwise, discard the sqlite3_finalize() return value.
9905 */
9906 static void idxFinalize(int *pRc, sqlite3_stmt *pStmt){
9907   int rc = sqlite3_finalize(pStmt);
9908   if( *pRc==SQLITE_OK ) *pRc = rc;
9909 }
9910 
9911 /*
9912 ** Attempt to allocate an IdxTable structure corresponding to table zTab
9913 ** in the main database of connection db. If successful, set (*ppOut) to
9914 ** point to the new object and return SQLITE_OK. Otherwise, return an
9915 ** SQLite error code and set (*ppOut) to NULL. In this case *pzErrmsg may be
9916 ** set to point to an error string.
9917 **
9918 ** It is the responsibility of the caller to eventually free either the
9919 ** IdxTable object or error message using sqlite3_free().
9920 */
9921 static int idxGetTableInfo(
9922   sqlite3 *db,                    /* Database connection to read details from */
9923   const char *zTab,               /* Table name */
9924   IdxTable **ppOut,               /* OUT: New object (if successful) */
9925   char **pzErrmsg                 /* OUT: Error message (if not) */
9926 ){
9927   sqlite3_stmt *p1 = 0;
9928   int nCol = 0;
9929   int nTab;
9930   int nByte;
9931   IdxTable *pNew = 0;
9932   int rc, rc2;
9933   char *pCsr = 0;
9934   int nPk = 0;
9935 
9936   *ppOut = 0;
9937   if( zTab==0 ) return SQLITE_ERROR;
9938   nTab = STRLEN(zTab);
9939   nByte = sizeof(IdxTable) + nTab + 1;
9940   rc = idxPrintfPrepareStmt(db, &p1, pzErrmsg, "PRAGMA table_xinfo=%Q", zTab);
9941   while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(p1) ){
9942     const char *zCol = (const char*)sqlite3_column_text(p1, 1);
9943     const char *zColSeq = 0;
9944     if( zCol==0 ){
9945       rc = SQLITE_ERROR;
9946       break;
9947     }
9948     nByte += 1 + STRLEN(zCol);
9949     rc = sqlite3_table_column_metadata(
9950         db, "main", zTab, zCol, 0, &zColSeq, 0, 0, 0
9951     );
9952     if( zColSeq==0 ) zColSeq = "binary";
9953     nByte += 1 + STRLEN(zColSeq);
9954     nCol++;
9955     nPk += (sqlite3_column_int(p1, 5)>0);
9956   }
9957   rc2 = sqlite3_reset(p1);
9958   if( rc==SQLITE_OK ) rc = rc2;
9959 
9960   nByte += sizeof(IdxColumn) * nCol;
9961   if( rc==SQLITE_OK ){
9962     pNew = idxMalloc(&rc, nByte);
9963   }
9964   if( rc==SQLITE_OK ){
9965     pNew->aCol = (IdxColumn*)&pNew[1];
9966     pNew->nCol = nCol;
9967     pCsr = (char*)&pNew->aCol[nCol];
9968   }
9969 
9970   nCol = 0;
9971   while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(p1) ){
9972     const char *zCol = (const char*)sqlite3_column_text(p1, 1);
9973     const char *zColSeq = 0;
9974     int nCopy;
9975     if( zCol==0 ) continue;
9976     nCopy = STRLEN(zCol) + 1;
9977     pNew->aCol[nCol].zName = pCsr;
9978     pNew->aCol[nCol].iPk = (sqlite3_column_int(p1, 5)==1 && nPk==1);
9979     memcpy(pCsr, zCol, nCopy);
9980     pCsr += nCopy;
9981 
9982     rc = sqlite3_table_column_metadata(
9983         db, "main", zTab, zCol, 0, &zColSeq, 0, 0, 0
9984     );
9985     if( rc==SQLITE_OK ){
9986       if( zColSeq==0 ) zColSeq = "binary";
9987       nCopy = STRLEN(zColSeq) + 1;
9988       pNew->aCol[nCol].zColl = pCsr;
9989       memcpy(pCsr, zColSeq, nCopy);
9990       pCsr += nCopy;
9991     }
9992 
9993     nCol++;
9994   }
9995   idxFinalize(&rc, p1);
9996 
9997   if( rc!=SQLITE_OK ){
9998     sqlite3_free(pNew);
9999     pNew = 0;
10000   }else if( ALWAYS(pNew!=0) ){
10001     pNew->zName = pCsr;
10002     if( ALWAYS(pNew->zName!=0) ) memcpy(pNew->zName, zTab, nTab+1);
10003   }
10004 
10005   *ppOut = pNew;
10006   return rc;
10007 }
10008 
10009 /*
10010 ** This function is a no-op if *pRc is set to anything other than
10011 ** SQLITE_OK when it is called.
10012 **
10013 ** If *pRc is initially set to SQLITE_OK, then the text specified by
10014 ** the printf() style arguments is appended to zIn and the result returned
10015 ** in a buffer allocated by sqlite3_malloc(). sqlite3_free() is called on
10016 ** zIn before returning.
10017 */
10018 static char *idxAppendText(int *pRc, char *zIn, const char *zFmt, ...){
10019   va_list ap;
10020   char *zAppend = 0;
10021   char *zRet = 0;
10022   int nIn = zIn ? STRLEN(zIn) : 0;
10023   int nAppend = 0;
10024   va_start(ap, zFmt);
10025   if( *pRc==SQLITE_OK ){
10026     zAppend = sqlite3_vmprintf(zFmt, ap);
10027     if( zAppend ){
10028       nAppend = STRLEN(zAppend);
10029       zRet = (char*)sqlite3_malloc(nIn + nAppend + 1);
10030     }
10031     if( zAppend && zRet ){
10032       if( nIn ) memcpy(zRet, zIn, nIn);
10033       memcpy(&zRet[nIn], zAppend, nAppend+1);
10034     }else{
10035       sqlite3_free(zRet);
10036       zRet = 0;
10037       *pRc = SQLITE_NOMEM;
10038     }
10039     sqlite3_free(zAppend);
10040     sqlite3_free(zIn);
10041   }
10042   va_end(ap);
10043   return zRet;
10044 }
10045 
10046 /*
10047 ** Return true if zId must be quoted in order to use it as an SQL
10048 ** identifier, or false otherwise.
10049 */
10050 static int idxIdentifierRequiresQuotes(const char *zId){
10051   int i;
10052   for(i=0; zId[i]; i++){
10053     if( !(zId[i]=='_')
10054      && !(zId[i]>='0' && zId[i]<='9')
10055      && !(zId[i]>='a' && zId[i]<='z')
10056      && !(zId[i]>='A' && zId[i]<='Z')
10057     ){
10058       return 1;
10059     }
10060   }
10061   return 0;
10062 }
10063 
10064 /*
10065 ** This function appends an index column definition suitable for constraint
10066 ** pCons to the string passed as zIn and returns the result.
10067 */
10068 static char *idxAppendColDefn(
10069   int *pRc,                       /* IN/OUT: Error code */
10070   char *zIn,                      /* Column defn accumulated so far */
10071   IdxTable *pTab,                 /* Table index will be created on */
10072   IdxConstraint *pCons
10073 ){
10074   char *zRet = zIn;
10075   IdxColumn *p = &pTab->aCol[pCons->iCol];
10076   if( zRet ) zRet = idxAppendText(pRc, zRet, ", ");
10077 
10078   if( idxIdentifierRequiresQuotes(p->zName) ){
10079     zRet = idxAppendText(pRc, zRet, "%Q", p->zName);
10080   }else{
10081     zRet = idxAppendText(pRc, zRet, "%s", p->zName);
10082   }
10083 
10084   if( sqlite3_stricmp(p->zColl, pCons->zColl) ){
10085     if( idxIdentifierRequiresQuotes(pCons->zColl) ){
10086       zRet = idxAppendText(pRc, zRet, " COLLATE %Q", pCons->zColl);
10087     }else{
10088       zRet = idxAppendText(pRc, zRet, " COLLATE %s", pCons->zColl);
10089     }
10090   }
10091 
10092   if( pCons->bDesc ){
10093     zRet = idxAppendText(pRc, zRet, " DESC");
10094   }
10095   return zRet;
10096 }
10097 
10098 /*
10099 ** Search database dbm for an index compatible with the one idxCreateFromCons()
10100 ** would create from arguments pScan, pEq and pTail. If no error occurs and
10101 ** such an index is found, return non-zero. Or, if no such index is found,
10102 ** return zero.
10103 **
10104 ** If an error occurs, set *pRc to an SQLite error code and return zero.
10105 */
10106 static int idxFindCompatible(
10107   int *pRc,                       /* OUT: Error code */
10108   sqlite3* dbm,                   /* Database to search */
10109   IdxScan *pScan,                 /* Scan for table to search for index on */
10110   IdxConstraint *pEq,             /* List of == constraints */
10111   IdxConstraint *pTail            /* List of range constraints */
10112 ){
10113   const char *zTbl = pScan->pTab->zName;
10114   sqlite3_stmt *pIdxList = 0;
10115   IdxConstraint *pIter;
10116   int nEq = 0;                    /* Number of elements in pEq */
10117   int rc;
10118 
10119   /* Count the elements in list pEq */
10120   for(pIter=pEq; pIter; pIter=pIter->pLink) nEq++;
10121 
10122   rc = idxPrintfPrepareStmt(dbm, &pIdxList, 0, "PRAGMA index_list=%Q", zTbl);
10123   while( rc==SQLITE_OK && sqlite3_step(pIdxList)==SQLITE_ROW ){
10124     int bMatch = 1;
10125     IdxConstraint *pT = pTail;
10126     sqlite3_stmt *pInfo = 0;
10127     const char *zIdx = (const char*)sqlite3_column_text(pIdxList, 1);
10128     if( zIdx==0 ) continue;
10129 
10130     /* Zero the IdxConstraint.bFlag values in the pEq list */
10131     for(pIter=pEq; pIter; pIter=pIter->pLink) pIter->bFlag = 0;
10132 
10133     rc = idxPrintfPrepareStmt(dbm, &pInfo, 0, "PRAGMA index_xInfo=%Q", zIdx);
10134     while( rc==SQLITE_OK && sqlite3_step(pInfo)==SQLITE_ROW ){
10135       int iIdx = sqlite3_column_int(pInfo, 0);
10136       int iCol = sqlite3_column_int(pInfo, 1);
10137       const char *zColl = (const char*)sqlite3_column_text(pInfo, 4);
10138 
10139       if( iIdx<nEq ){
10140         for(pIter=pEq; pIter; pIter=pIter->pLink){
10141           if( pIter->bFlag ) continue;
10142           if( pIter->iCol!=iCol ) continue;
10143           if( sqlite3_stricmp(pIter->zColl, zColl) ) continue;
10144           pIter->bFlag = 1;
10145           break;
10146         }
10147         if( pIter==0 ){
10148           bMatch = 0;
10149           break;
10150         }
10151       }else{
10152         if( pT ){
10153           if( pT->iCol!=iCol || sqlite3_stricmp(pT->zColl, zColl) ){
10154             bMatch = 0;
10155             break;
10156           }
10157           pT = pT->pLink;
10158         }
10159       }
10160     }
10161     idxFinalize(&rc, pInfo);
10162 
10163     if( rc==SQLITE_OK && bMatch ){
10164       sqlite3_finalize(pIdxList);
10165       return 1;
10166     }
10167   }
10168   idxFinalize(&rc, pIdxList);
10169 
10170   *pRc = rc;
10171   return 0;
10172 }
10173 
10174 /* Callback for sqlite3_exec() with query with leading count(*) column.
10175  * The first argument is expected to be an int*, referent to be incremented
10176  * if that leading column is not exactly '0'.
10177  */
10178 static int countNonzeros(void* pCount, int nc,
10179                          char* azResults[], char* azColumns[]){
10180   (void)azColumns;  /* Suppress unused parameter warning */
10181   if( nc>0 && (azResults[0][0]!='0' || azResults[0][1]!=0) ){
10182     *((int *)pCount) += 1;
10183   }
10184   return 0;
10185 }
10186 
10187 static int idxCreateFromCons(
10188   sqlite3expert *p,
10189   IdxScan *pScan,
10190   IdxConstraint *pEq,
10191   IdxConstraint *pTail
10192 ){
10193   sqlite3 *dbm = p->dbm;
10194   int rc = SQLITE_OK;
10195   if( (pEq || pTail) && 0==idxFindCompatible(&rc, dbm, pScan, pEq, pTail) ){
10196     IdxTable *pTab = pScan->pTab;
10197     char *zCols = 0;
10198     char *zIdx = 0;
10199     IdxConstraint *pCons;
10200     unsigned int h = 0;
10201     const char *zFmt;
10202 
10203     for(pCons=pEq; pCons; pCons=pCons->pLink){
10204       zCols = idxAppendColDefn(&rc, zCols, pTab, pCons);
10205     }
10206     for(pCons=pTail; pCons; pCons=pCons->pLink){
10207       zCols = idxAppendColDefn(&rc, zCols, pTab, pCons);
10208     }
10209 
10210     if( rc==SQLITE_OK ){
10211       /* Hash the list of columns to come up with a name for the index */
10212       const char *zTable = pScan->pTab->zName;
10213       int quoteTable = idxIdentifierRequiresQuotes(zTable);
10214       char *zName = 0;          /* Index name */
10215       int collisions = 0;
10216       do{
10217         int i;
10218         char *zFind;
10219         for(i=0; zCols[i]; i++){
10220           h += ((h<<3) + zCols[i]);
10221         }
10222         sqlite3_free(zName);
10223         zName = sqlite3_mprintf("%s_idx_%08x", zTable, h);
10224         if( zName==0 ) break;
10225         /* Is is unique among table, view and index names? */
10226         zFmt = "SELECT count(*) FROM sqlite_schema WHERE name=%Q"
10227           " AND type in ('index','table','view')";
10228         zFind = sqlite3_mprintf(zFmt, zName);
10229         i = 0;
10230         rc = sqlite3_exec(dbm, zFind, countNonzeros, &i, 0);
10231         assert(rc==SQLITE_OK);
10232         sqlite3_free(zFind);
10233         if( i==0 ){
10234           collisions = 0;
10235           break;
10236         }
10237         ++collisions;
10238       }while( collisions<50 && zName!=0 );
10239       if( collisions ){
10240         /* This return means "Gave up trying to find a unique index name." */
10241         rc = SQLITE_BUSY_TIMEOUT;
10242       }else if( zName==0 ){
10243         rc = SQLITE_NOMEM;
10244       }else{
10245         if( quoteTable ){
10246           zFmt = "CREATE INDEX \"%w\" ON \"%w\"(%s)";
10247         }else{
10248           zFmt = "CREATE INDEX %s ON %s(%s)";
10249         }
10250         zIdx = sqlite3_mprintf(zFmt, zName, zTable, zCols);
10251         if( !zIdx ){
10252           rc = SQLITE_NOMEM;
10253         }else{
10254           rc = sqlite3_exec(dbm, zIdx, 0, 0, p->pzErrmsg);
10255           if( rc!=SQLITE_OK ){
10256             rc = SQLITE_BUSY_TIMEOUT;
10257           }else{
10258             idxHashAdd(&rc, &p->hIdx, zName, zIdx);
10259           }
10260         }
10261         sqlite3_free(zName);
10262         sqlite3_free(zIdx);
10263       }
10264     }
10265 
10266     sqlite3_free(zCols);
10267   }
10268   return rc;
10269 }
10270 
10271 /*
10272 ** Return true if list pList (linked by IdxConstraint.pLink) contains
10273 ** a constraint compatible with *p. Otherwise return false.
10274 */
10275 static int idxFindConstraint(IdxConstraint *pList, IdxConstraint *p){
10276   IdxConstraint *pCmp;
10277   for(pCmp=pList; pCmp; pCmp=pCmp->pLink){
10278     if( p->iCol==pCmp->iCol ) return 1;
10279   }
10280   return 0;
10281 }
10282 
10283 static int idxCreateFromWhere(
10284   sqlite3expert *p,
10285   IdxScan *pScan,                 /* Create indexes for this scan */
10286   IdxConstraint *pTail            /* range/ORDER BY constraints for inclusion */
10287 ){
10288   IdxConstraint *p1 = 0;
10289   IdxConstraint *pCon;
10290   int rc;
10291 
10292   /* Gather up all the == constraints. */
10293   for(pCon=pScan->pEq; pCon; pCon=pCon->pNext){
10294     if( !idxFindConstraint(p1, pCon) && !idxFindConstraint(pTail, pCon) ){
10295       pCon->pLink = p1;
10296       p1 = pCon;
10297     }
10298   }
10299 
10300   /* Create an index using the == constraints collected above. And the
10301   ** range constraint/ORDER BY terms passed in by the caller, if any. */
10302   rc = idxCreateFromCons(p, pScan, p1, pTail);
10303 
10304   /* If no range/ORDER BY passed by the caller, create a version of the
10305   ** index for each range constraint.  */
10306   if( pTail==0 ){
10307     for(pCon=pScan->pRange; rc==SQLITE_OK && pCon; pCon=pCon->pNext){
10308       assert( pCon->pLink==0 );
10309       if( !idxFindConstraint(p1, pCon) && !idxFindConstraint(pTail, pCon) ){
10310         rc = idxCreateFromCons(p, pScan, p1, pCon);
10311       }
10312     }
10313   }
10314 
10315   return rc;
10316 }
10317 
10318 /*
10319 ** Create candidate indexes in database [dbm] based on the data in
10320 ** linked-list pScan.
10321 */
10322 static int idxCreateCandidates(sqlite3expert *p){
10323   int rc = SQLITE_OK;
10324   IdxScan *pIter;
10325 
10326   for(pIter=p->pScan; pIter && rc==SQLITE_OK; pIter=pIter->pNextScan){
10327     rc = idxCreateFromWhere(p, pIter, 0);
10328     if( rc==SQLITE_OK && pIter->pOrder ){
10329       rc = idxCreateFromWhere(p, pIter, pIter->pOrder);
10330     }
10331   }
10332 
10333   return rc;
10334 }
10335 
10336 /*
10337 ** Free all elements of the linked list starting at pConstraint.
10338 */
10339 static void idxConstraintFree(IdxConstraint *pConstraint){
10340   IdxConstraint *pNext;
10341   IdxConstraint *p;
10342 
10343   for(p=pConstraint; p; p=pNext){
10344     pNext = p->pNext;
10345     sqlite3_free(p);
10346   }
10347 }
10348 
10349 /*
10350 ** Free all elements of the linked list starting from pScan up until pLast
10351 ** (pLast is not freed).
10352 */
10353 static void idxScanFree(IdxScan *pScan, IdxScan *pLast){
10354   IdxScan *p;
10355   IdxScan *pNext;
10356   for(p=pScan; p!=pLast; p=pNext){
10357     pNext = p->pNextScan;
10358     idxConstraintFree(p->pOrder);
10359     idxConstraintFree(p->pEq);
10360     idxConstraintFree(p->pRange);
10361     sqlite3_free(p);
10362   }
10363 }
10364 
10365 /*
10366 ** Free all elements of the linked list starting from pStatement up
10367 ** until pLast (pLast is not freed).
10368 */
10369 static void idxStatementFree(IdxStatement *pStatement, IdxStatement *pLast){
10370   IdxStatement *p;
10371   IdxStatement *pNext;
10372   for(p=pStatement; p!=pLast; p=pNext){
10373     pNext = p->pNext;
10374     sqlite3_free(p->zEQP);
10375     sqlite3_free(p->zIdx);
10376     sqlite3_free(p);
10377   }
10378 }
10379 
10380 /*
10381 ** Free the linked list of IdxTable objects starting at pTab.
10382 */
10383 static void idxTableFree(IdxTable *pTab){
10384   IdxTable *pIter;
10385   IdxTable *pNext;
10386   for(pIter=pTab; pIter; pIter=pNext){
10387     pNext = pIter->pNext;
10388     sqlite3_free(pIter);
10389   }
10390 }
10391 
10392 /*
10393 ** Free the linked list of IdxWrite objects starting at pTab.
10394 */
10395 static void idxWriteFree(IdxWrite *pTab){
10396   IdxWrite *pIter;
10397   IdxWrite *pNext;
10398   for(pIter=pTab; pIter; pIter=pNext){
10399     pNext = pIter->pNext;
10400     sqlite3_free(pIter);
10401   }
10402 }
10403 
10404 
10405 
10406 /*
10407 ** This function is called after candidate indexes have been created. It
10408 ** runs all the queries to see which indexes they prefer, and populates
10409 ** IdxStatement.zIdx and IdxStatement.zEQP with the results.
10410 */
10411 static int idxFindIndexes(
10412   sqlite3expert *p,
10413   char **pzErr                         /* OUT: Error message (sqlite3_malloc) */
10414 ){
10415   IdxStatement *pStmt;
10416   sqlite3 *dbm = p->dbm;
10417   int rc = SQLITE_OK;
10418 
10419   IdxHash hIdx;
10420   idxHashInit(&hIdx);
10421 
10422   for(pStmt=p->pStatement; rc==SQLITE_OK && pStmt; pStmt=pStmt->pNext){
10423     IdxHashEntry *pEntry;
10424     sqlite3_stmt *pExplain = 0;
10425     idxHashClear(&hIdx);
10426     rc = idxPrintfPrepareStmt(dbm, &pExplain, pzErr,
10427         "EXPLAIN QUERY PLAN %s", pStmt->zSql
10428     );
10429     while( rc==SQLITE_OK && sqlite3_step(pExplain)==SQLITE_ROW ){
10430       /* int iId = sqlite3_column_int(pExplain, 0); */
10431       /* int iParent = sqlite3_column_int(pExplain, 1); */
10432       /* int iNotUsed = sqlite3_column_int(pExplain, 2); */
10433       const char *zDetail = (const char*)sqlite3_column_text(pExplain, 3);
10434       int nDetail;
10435       int i;
10436 
10437       if( !zDetail ) continue;
10438       nDetail = STRLEN(zDetail);
10439 
10440       for(i=0; i<nDetail; i++){
10441         const char *zIdx = 0;
10442         if( i+13<nDetail && memcmp(&zDetail[i], " USING INDEX ", 13)==0 ){
10443           zIdx = &zDetail[i+13];
10444         }else if( i+22<nDetail
10445             && memcmp(&zDetail[i], " USING COVERING INDEX ", 22)==0
10446         ){
10447           zIdx = &zDetail[i+22];
10448         }
10449         if( zIdx ){
10450           const char *zSql;
10451           int nIdx = 0;
10452           while( zIdx[nIdx]!='\0' && (zIdx[nIdx]!=' ' || zIdx[nIdx+1]!='(') ){
10453             nIdx++;
10454           }
10455           zSql = idxHashSearch(&p->hIdx, zIdx, nIdx);
10456           if( zSql ){
10457             idxHashAdd(&rc, &hIdx, zSql, 0);
10458             if( rc ) goto find_indexes_out;
10459           }
10460           break;
10461         }
10462       }
10463 
10464       if( zDetail[0]!='-' ){
10465         pStmt->zEQP = idxAppendText(&rc, pStmt->zEQP, "%s\n", zDetail);
10466       }
10467     }
10468 
10469     for(pEntry=hIdx.pFirst; pEntry; pEntry=pEntry->pNext){
10470       pStmt->zIdx = idxAppendText(&rc, pStmt->zIdx, "%s;\n", pEntry->zKey);
10471     }
10472 
10473     idxFinalize(&rc, pExplain);
10474   }
10475 
10476  find_indexes_out:
10477   idxHashClear(&hIdx);
10478   return rc;
10479 }
10480 
10481 static int idxAuthCallback(
10482   void *pCtx,
10483   int eOp,
10484   const char *z3,
10485   const char *z4,
10486   const char *zDb,
10487   const char *zTrigger
10488 ){
10489   int rc = SQLITE_OK;
10490   (void)z4;
10491   (void)zTrigger;
10492   if( eOp==SQLITE_INSERT || eOp==SQLITE_UPDATE || eOp==SQLITE_DELETE ){
10493     if( sqlite3_stricmp(zDb, "main")==0 ){
10494       sqlite3expert *p = (sqlite3expert*)pCtx;
10495       IdxTable *pTab;
10496       for(pTab=p->pTable; pTab; pTab=pTab->pNext){
10497         if( 0==sqlite3_stricmp(z3, pTab->zName) ) break;
10498       }
10499       if( pTab ){
10500         IdxWrite *pWrite;
10501         for(pWrite=p->pWrite; pWrite; pWrite=pWrite->pNext){
10502           if( pWrite->pTab==pTab && pWrite->eOp==eOp ) break;
10503         }
10504         if( pWrite==0 ){
10505           pWrite = idxMalloc(&rc, sizeof(IdxWrite));
10506           if( rc==SQLITE_OK ){
10507             pWrite->pTab = pTab;
10508             pWrite->eOp = eOp;
10509             pWrite->pNext = p->pWrite;
10510             p->pWrite = pWrite;
10511           }
10512         }
10513       }
10514     }
10515   }
10516   return rc;
10517 }
10518 
10519 static int idxProcessOneTrigger(
10520   sqlite3expert *p,
10521   IdxWrite *pWrite,
10522   char **pzErr
10523 ){
10524   static const char *zInt = UNIQUE_TABLE_NAME;
10525   static const char *zDrop = "DROP TABLE " UNIQUE_TABLE_NAME;
10526   IdxTable *pTab = pWrite->pTab;
10527   const char *zTab = pTab->zName;
10528   const char *zSql =
10529     "SELECT 'CREATE TEMP' || substr(sql, 7) FROM sqlite_schema "
10530     "WHERE tbl_name = %Q AND type IN ('table', 'trigger') "
10531     "ORDER BY type;";
10532   sqlite3_stmt *pSelect = 0;
10533   int rc = SQLITE_OK;
10534   char *zWrite = 0;
10535 
10536   /* Create the table and its triggers in the temp schema */
10537   rc = idxPrintfPrepareStmt(p->db, &pSelect, pzErr, zSql, zTab, zTab);
10538   while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSelect) ){
10539     const char *zCreate = (const char*)sqlite3_column_text(pSelect, 0);
10540     if( zCreate==0 ) continue;
10541     rc = sqlite3_exec(p->dbv, zCreate, 0, 0, pzErr);
10542   }
10543   idxFinalize(&rc, pSelect);
10544 
10545   /* Rename the table in the temp schema to zInt */
10546   if( rc==SQLITE_OK ){
10547     char *z = sqlite3_mprintf("ALTER TABLE temp.%Q RENAME TO %Q", zTab, zInt);
10548     if( z==0 ){
10549       rc = SQLITE_NOMEM;
10550     }else{
10551       rc = sqlite3_exec(p->dbv, z, 0, 0, pzErr);
10552       sqlite3_free(z);
10553     }
10554   }
10555 
10556   switch( pWrite->eOp ){
10557     case SQLITE_INSERT: {
10558       int i;
10559       zWrite = idxAppendText(&rc, zWrite, "INSERT INTO %Q VALUES(", zInt);
10560       for(i=0; i<pTab->nCol; i++){
10561         zWrite = idxAppendText(&rc, zWrite, "%s?", i==0 ? "" : ", ");
10562       }
10563       zWrite = idxAppendText(&rc, zWrite, ")");
10564       break;
10565     }
10566     case SQLITE_UPDATE: {
10567       int i;
10568       zWrite = idxAppendText(&rc, zWrite, "UPDATE %Q SET ", zInt);
10569       for(i=0; i<pTab->nCol; i++){
10570         zWrite = idxAppendText(&rc, zWrite, "%s%Q=?", i==0 ? "" : ", ",
10571             pTab->aCol[i].zName
10572         );
10573       }
10574       break;
10575     }
10576     default: {
10577       assert( pWrite->eOp==SQLITE_DELETE );
10578       if( rc==SQLITE_OK ){
10579         zWrite = sqlite3_mprintf("DELETE FROM %Q", zInt);
10580         if( zWrite==0 ) rc = SQLITE_NOMEM;
10581       }
10582     }
10583   }
10584 
10585   if( rc==SQLITE_OK ){
10586     sqlite3_stmt *pX = 0;
10587     rc = sqlite3_prepare_v2(p->dbv, zWrite, -1, &pX, 0);
10588     idxFinalize(&rc, pX);
10589     if( rc!=SQLITE_OK ){
10590       idxDatabaseError(p->dbv, pzErr);
10591     }
10592   }
10593   sqlite3_free(zWrite);
10594 
10595   if( rc==SQLITE_OK ){
10596     rc = sqlite3_exec(p->dbv, zDrop, 0, 0, pzErr);
10597   }
10598 
10599   return rc;
10600 }
10601 
10602 static int idxProcessTriggers(sqlite3expert *p, char **pzErr){
10603   int rc = SQLITE_OK;
10604   IdxWrite *pEnd = 0;
10605   IdxWrite *pFirst = p->pWrite;
10606 
10607   while( rc==SQLITE_OK && pFirst!=pEnd ){
10608     IdxWrite *pIter;
10609     for(pIter=pFirst; rc==SQLITE_OK && pIter!=pEnd; pIter=pIter->pNext){
10610       rc = idxProcessOneTrigger(p, pIter, pzErr);
10611     }
10612     pEnd = pFirst;
10613     pFirst = p->pWrite;
10614   }
10615 
10616   return rc;
10617 }
10618 
10619 
10620 static int idxCreateVtabSchema(sqlite3expert *p, char **pzErrmsg){
10621   int rc = idxRegisterVtab(p);
10622   sqlite3_stmt *pSchema = 0;
10623 
10624   /* For each table in the main db schema:
10625   **
10626   **   1) Add an entry to the p->pTable list, and
10627   **   2) Create the equivalent virtual table in dbv.
10628   */
10629   rc = idxPrepareStmt(p->db, &pSchema, pzErrmsg,
10630       "SELECT type, name, sql, 1 FROM sqlite_schema "
10631       "WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%%' "
10632       " UNION ALL "
10633       "SELECT type, name, sql, 2 FROM sqlite_schema "
10634       "WHERE type = 'trigger'"
10635       "  AND tbl_name IN(SELECT name FROM sqlite_schema WHERE type = 'view') "
10636       "ORDER BY 4, 1"
10637   );
10638   while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSchema) ){
10639     const char *zType = (const char*)sqlite3_column_text(pSchema, 0);
10640     const char *zName = (const char*)sqlite3_column_text(pSchema, 1);
10641     const char *zSql = (const char*)sqlite3_column_text(pSchema, 2);
10642 
10643     if( zType==0 || zName==0 ) continue;
10644     if( zType[0]=='v' || zType[1]=='r' ){
10645       if( zSql ) rc = sqlite3_exec(p->dbv, zSql, 0, 0, pzErrmsg);
10646     }else{
10647       IdxTable *pTab;
10648       rc = idxGetTableInfo(p->db, zName, &pTab, pzErrmsg);
10649       if( rc==SQLITE_OK ){
10650         int i;
10651         char *zInner = 0;
10652         char *zOuter = 0;
10653         pTab->pNext = p->pTable;
10654         p->pTable = pTab;
10655 
10656         /* The statement the vtab will pass to sqlite3_declare_vtab() */
10657         zInner = idxAppendText(&rc, 0, "CREATE TABLE x(");
10658         for(i=0; i<pTab->nCol; i++){
10659           zInner = idxAppendText(&rc, zInner, "%s%Q COLLATE %s",
10660               (i==0 ? "" : ", "), pTab->aCol[i].zName, pTab->aCol[i].zColl
10661           );
10662         }
10663         zInner = idxAppendText(&rc, zInner, ")");
10664 
10665         /* The CVT statement to create the vtab */
10666         zOuter = idxAppendText(&rc, 0,
10667             "CREATE VIRTUAL TABLE %Q USING expert(%Q)", zName, zInner
10668         );
10669         if( rc==SQLITE_OK ){
10670           rc = sqlite3_exec(p->dbv, zOuter, 0, 0, pzErrmsg);
10671         }
10672         sqlite3_free(zInner);
10673         sqlite3_free(zOuter);
10674       }
10675     }
10676   }
10677   idxFinalize(&rc, pSchema);
10678   return rc;
10679 }
10680 
10681 struct IdxSampleCtx {
10682   int iTarget;
10683   double target;                  /* Target nRet/nRow value */
10684   double nRow;                    /* Number of rows seen */
10685   double nRet;                    /* Number of rows returned */
10686 };
10687 
10688 static void idxSampleFunc(
10689   sqlite3_context *pCtx,
10690   int argc,
10691   sqlite3_value **argv
10692 ){
10693   struct IdxSampleCtx *p = (struct IdxSampleCtx*)sqlite3_user_data(pCtx);
10694   int bRet;
10695 
10696   (void)argv;
10697   assert( argc==0 );
10698   if( p->nRow==0.0 ){
10699     bRet = 1;
10700   }else{
10701     bRet = (p->nRet / p->nRow) <= p->target;
10702     if( bRet==0 ){
10703       unsigned short rnd;
10704       sqlite3_randomness(2, (void*)&rnd);
10705       bRet = ((int)rnd % 100) <= p->iTarget;
10706     }
10707   }
10708 
10709   sqlite3_result_int(pCtx, bRet);
10710   p->nRow += 1.0;
10711   p->nRet += (double)bRet;
10712 }
10713 
10714 struct IdxRemCtx {
10715   int nSlot;
10716   struct IdxRemSlot {
10717     int eType;                    /* SQLITE_NULL, INTEGER, REAL, TEXT, BLOB */
10718     i64 iVal;                     /* SQLITE_INTEGER value */
10719     double rVal;                  /* SQLITE_FLOAT value */
10720     int nByte;                    /* Bytes of space allocated at z */
10721     int n;                        /* Size of buffer z */
10722     char *z;                      /* SQLITE_TEXT/BLOB value */
10723   } aSlot[1];
10724 };
10725 
10726 /*
10727 ** Implementation of scalar function rem().
10728 */
10729 static void idxRemFunc(
10730   sqlite3_context *pCtx,
10731   int argc,
10732   sqlite3_value **argv
10733 ){
10734   struct IdxRemCtx *p = (struct IdxRemCtx*)sqlite3_user_data(pCtx);
10735   struct IdxRemSlot *pSlot;
10736   int iSlot;
10737   assert( argc==2 );
10738 
10739   iSlot = sqlite3_value_int(argv[0]);
10740   assert( iSlot<=p->nSlot );
10741   pSlot = &p->aSlot[iSlot];
10742 
10743   switch( pSlot->eType ){
10744     case SQLITE_NULL:
10745       /* no-op */
10746       break;
10747 
10748     case SQLITE_INTEGER:
10749       sqlite3_result_int64(pCtx, pSlot->iVal);
10750       break;
10751 
10752     case SQLITE_FLOAT:
10753       sqlite3_result_double(pCtx, pSlot->rVal);
10754       break;
10755 
10756     case SQLITE_BLOB:
10757       sqlite3_result_blob(pCtx, pSlot->z, pSlot->n, SQLITE_TRANSIENT);
10758       break;
10759 
10760     case SQLITE_TEXT:
10761       sqlite3_result_text(pCtx, pSlot->z, pSlot->n, SQLITE_TRANSIENT);
10762       break;
10763   }
10764 
10765   pSlot->eType = sqlite3_value_type(argv[1]);
10766   switch( pSlot->eType ){
10767     case SQLITE_NULL:
10768       /* no-op */
10769       break;
10770 
10771     case SQLITE_INTEGER:
10772       pSlot->iVal = sqlite3_value_int64(argv[1]);
10773       break;
10774 
10775     case SQLITE_FLOAT:
10776       pSlot->rVal = sqlite3_value_double(argv[1]);
10777       break;
10778 
10779     case SQLITE_BLOB:
10780     case SQLITE_TEXT: {
10781       int nByte = sqlite3_value_bytes(argv[1]);
10782       const void *pData = 0;
10783       if( nByte>pSlot->nByte ){
10784         char *zNew = (char*)sqlite3_realloc(pSlot->z, nByte*2);
10785         if( zNew==0 ){
10786           sqlite3_result_error_nomem(pCtx);
10787           return;
10788         }
10789         pSlot->nByte = nByte*2;
10790         pSlot->z = zNew;
10791       }
10792       pSlot->n = nByte;
10793       if( pSlot->eType==SQLITE_BLOB ){
10794         pData = sqlite3_value_blob(argv[1]);
10795         if( pData ) memcpy(pSlot->z, pData, nByte);
10796       }else{
10797         pData = sqlite3_value_text(argv[1]);
10798         memcpy(pSlot->z, pData, nByte);
10799       }
10800       break;
10801     }
10802   }
10803 }
10804 
10805 static int idxLargestIndex(sqlite3 *db, int *pnMax, char **pzErr){
10806   int rc = SQLITE_OK;
10807   const char *zMax =
10808     "SELECT max(i.seqno) FROM "
10809     "  sqlite_schema AS s, "
10810     "  pragma_index_list(s.name) AS l, "
10811     "  pragma_index_info(l.name) AS i "
10812     "WHERE s.type = 'table'";
10813   sqlite3_stmt *pMax = 0;
10814 
10815   *pnMax = 0;
10816   rc = idxPrepareStmt(db, &pMax, pzErr, zMax);
10817   if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pMax) ){
10818     *pnMax = sqlite3_column_int(pMax, 0) + 1;
10819   }
10820   idxFinalize(&rc, pMax);
10821 
10822   return rc;
10823 }
10824 
10825 static int idxPopulateOneStat1(
10826   sqlite3expert *p,
10827   sqlite3_stmt *pIndexXInfo,
10828   sqlite3_stmt *pWriteStat,
10829   const char *zTab,
10830   const char *zIdx,
10831   char **pzErr
10832 ){
10833   char *zCols = 0;
10834   char *zOrder = 0;
10835   char *zQuery = 0;
10836   int nCol = 0;
10837   int i;
10838   sqlite3_stmt *pQuery = 0;
10839   int *aStat = 0;
10840   int rc = SQLITE_OK;
10841 
10842   assert( p->iSample>0 );
10843 
10844   /* Formulate the query text */
10845   sqlite3_bind_text(pIndexXInfo, 1, zIdx, -1, SQLITE_STATIC);
10846   while( SQLITE_OK==rc && SQLITE_ROW==sqlite3_step(pIndexXInfo) ){
10847     const char *zComma = zCols==0 ? "" : ", ";
10848     const char *zName = (const char*)sqlite3_column_text(pIndexXInfo, 0);
10849     const char *zColl = (const char*)sqlite3_column_text(pIndexXInfo, 1);
10850     zCols = idxAppendText(&rc, zCols,
10851         "%sx.%Q IS rem(%d, x.%Q) COLLATE %s", zComma, zName, nCol, zName, zColl
10852     );
10853     zOrder = idxAppendText(&rc, zOrder, "%s%d", zComma, ++nCol);
10854   }
10855   sqlite3_reset(pIndexXInfo);
10856   if( rc==SQLITE_OK ){
10857     if( p->iSample==100 ){
10858       zQuery = sqlite3_mprintf(
10859           "SELECT %s FROM %Q x ORDER BY %s", zCols, zTab, zOrder
10860       );
10861     }else{
10862       zQuery = sqlite3_mprintf(
10863           "SELECT %s FROM temp."UNIQUE_TABLE_NAME" x ORDER BY %s", zCols, zOrder
10864       );
10865     }
10866   }
10867   sqlite3_free(zCols);
10868   sqlite3_free(zOrder);
10869 
10870   /* Formulate the query text */
10871   if( rc==SQLITE_OK ){
10872     sqlite3 *dbrem = (p->iSample==100 ? p->db : p->dbv);
10873     rc = idxPrepareStmt(dbrem, &pQuery, pzErr, zQuery);
10874   }
10875   sqlite3_free(zQuery);
10876 
10877   if( rc==SQLITE_OK ){
10878     aStat = (int*)idxMalloc(&rc, sizeof(int)*(nCol+1));
10879   }
10880   if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pQuery) ){
10881     IdxHashEntry *pEntry;
10882     char *zStat = 0;
10883     for(i=0; i<=nCol; i++) aStat[i] = 1;
10884     while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pQuery) ){
10885       aStat[0]++;
10886       for(i=0; i<nCol; i++){
10887         if( sqlite3_column_int(pQuery, i)==0 ) break;
10888       }
10889       for(/*no-op*/; i<nCol; i++){
10890         aStat[i+1]++;
10891       }
10892     }
10893 
10894     if( rc==SQLITE_OK ){
10895       int s0 = aStat[0];
10896       zStat = sqlite3_mprintf("%d", s0);
10897       if( zStat==0 ) rc = SQLITE_NOMEM;
10898       for(i=1; rc==SQLITE_OK && i<=nCol; i++){
10899         zStat = idxAppendText(&rc, zStat, " %d", (s0+aStat[i]/2) / aStat[i]);
10900       }
10901     }
10902 
10903     if( rc==SQLITE_OK ){
10904       sqlite3_bind_text(pWriteStat, 1, zTab, -1, SQLITE_STATIC);
10905       sqlite3_bind_text(pWriteStat, 2, zIdx, -1, SQLITE_STATIC);
10906       sqlite3_bind_text(pWriteStat, 3, zStat, -1, SQLITE_STATIC);
10907       sqlite3_step(pWriteStat);
10908       rc = sqlite3_reset(pWriteStat);
10909     }
10910 
10911     pEntry = idxHashFind(&p->hIdx, zIdx, STRLEN(zIdx));
10912     if( pEntry ){
10913       assert( pEntry->zVal2==0 );
10914       pEntry->zVal2 = zStat;
10915     }else{
10916       sqlite3_free(zStat);
10917     }
10918   }
10919   sqlite3_free(aStat);
10920   idxFinalize(&rc, pQuery);
10921 
10922   return rc;
10923 }
10924 
10925 static int idxBuildSampleTable(sqlite3expert *p, const char *zTab){
10926   int rc;
10927   char *zSql;
10928 
10929   rc = sqlite3_exec(p->dbv,"DROP TABLE IF EXISTS temp."UNIQUE_TABLE_NAME,0,0,0);
10930   if( rc!=SQLITE_OK ) return rc;
10931 
10932   zSql = sqlite3_mprintf(
10933       "CREATE TABLE temp." UNIQUE_TABLE_NAME " AS SELECT * FROM %Q", zTab
10934   );
10935   if( zSql==0 ) return SQLITE_NOMEM;
10936   rc = sqlite3_exec(p->dbv, zSql, 0, 0, 0);
10937   sqlite3_free(zSql);
10938 
10939   return rc;
10940 }
10941 
10942 /*
10943 ** This function is called as part of sqlite3_expert_analyze(). Candidate
10944 ** indexes have already been created in database sqlite3expert.dbm, this
10945 ** function populates sqlite_stat1 table in the same database.
10946 **
10947 ** The stat1 data is generated by querying the
10948 */
10949 static int idxPopulateStat1(sqlite3expert *p, char **pzErr){
10950   int rc = SQLITE_OK;
10951   int nMax =0;
10952   struct IdxRemCtx *pCtx = 0;
10953   struct IdxSampleCtx samplectx;
10954   int i;
10955   i64 iPrev = -100000;
10956   sqlite3_stmt *pAllIndex = 0;
10957   sqlite3_stmt *pIndexXInfo = 0;
10958   sqlite3_stmt *pWrite = 0;
10959 
10960   const char *zAllIndex =
10961     "SELECT s.rowid, s.name, l.name FROM "
10962     "  sqlite_schema AS s, "
10963     "  pragma_index_list(s.name) AS l "
10964     "WHERE s.type = 'table'";
10965   const char *zIndexXInfo =
10966     "SELECT name, coll FROM pragma_index_xinfo(?) WHERE key";
10967   const char *zWrite = "INSERT INTO sqlite_stat1 VALUES(?, ?, ?)";
10968 
10969   /* If iSample==0, no sqlite_stat1 data is required. */
10970   if( p->iSample==0 ) return SQLITE_OK;
10971 
10972   rc = idxLargestIndex(p->dbm, &nMax, pzErr);
10973   if( nMax<=0 || rc!=SQLITE_OK ) return rc;
10974 
10975   rc = sqlite3_exec(p->dbm, "ANALYZE; PRAGMA writable_schema=1", 0, 0, 0);
10976 
10977   if( rc==SQLITE_OK ){
10978     int nByte = sizeof(struct IdxRemCtx) + (sizeof(struct IdxRemSlot) * nMax);
10979     pCtx = (struct IdxRemCtx*)idxMalloc(&rc, nByte);
10980   }
10981 
10982   if( rc==SQLITE_OK ){
10983     sqlite3 *dbrem = (p->iSample==100 ? p->db : p->dbv);
10984     rc = sqlite3_create_function(
10985         dbrem, "rem", 2, SQLITE_UTF8, (void*)pCtx, idxRemFunc, 0, 0
10986     );
10987   }
10988   if( rc==SQLITE_OK ){
10989     rc = sqlite3_create_function(
10990         p->db, "sample", 0, SQLITE_UTF8, (void*)&samplectx, idxSampleFunc, 0, 0
10991     );
10992   }
10993 
10994   if( rc==SQLITE_OK ){
10995     pCtx->nSlot = nMax+1;
10996     rc = idxPrepareStmt(p->dbm, &pAllIndex, pzErr, zAllIndex);
10997   }
10998   if( rc==SQLITE_OK ){
10999     rc = idxPrepareStmt(p->dbm, &pIndexXInfo, pzErr, zIndexXInfo);
11000   }
11001   if( rc==SQLITE_OK ){
11002     rc = idxPrepareStmt(p->dbm, &pWrite, pzErr, zWrite);
11003   }
11004 
11005   while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pAllIndex) ){
11006     i64 iRowid = sqlite3_column_int64(pAllIndex, 0);
11007     const char *zTab = (const char*)sqlite3_column_text(pAllIndex, 1);
11008     const char *zIdx = (const char*)sqlite3_column_text(pAllIndex, 2);
11009     if( zTab==0 || zIdx==0 ) continue;
11010     if( p->iSample<100 && iPrev!=iRowid ){
11011       samplectx.target = (double)p->iSample / 100.0;
11012       samplectx.iTarget = p->iSample;
11013       samplectx.nRow = 0.0;
11014       samplectx.nRet = 0.0;
11015       rc = idxBuildSampleTable(p, zTab);
11016       if( rc!=SQLITE_OK ) break;
11017     }
11018     rc = idxPopulateOneStat1(p, pIndexXInfo, pWrite, zTab, zIdx, pzErr);
11019     iPrev = iRowid;
11020   }
11021   if( rc==SQLITE_OK && p->iSample<100 ){
11022     rc = sqlite3_exec(p->dbv,
11023         "DROP TABLE IF EXISTS temp." UNIQUE_TABLE_NAME, 0,0,0
11024     );
11025   }
11026 
11027   idxFinalize(&rc, pAllIndex);
11028   idxFinalize(&rc, pIndexXInfo);
11029   idxFinalize(&rc, pWrite);
11030 
11031   if( pCtx ){
11032     for(i=0; i<pCtx->nSlot; i++){
11033       sqlite3_free(pCtx->aSlot[i].z);
11034     }
11035     sqlite3_free(pCtx);
11036   }
11037 
11038   if( rc==SQLITE_OK ){
11039     rc = sqlite3_exec(p->dbm, "ANALYZE sqlite_schema", 0, 0, 0);
11040   }
11041 
11042   sqlite3_exec(p->db, "DROP TABLE IF EXISTS temp."UNIQUE_TABLE_NAME,0,0,0);
11043   return rc;
11044 }
11045 
11046 /*
11047 ** Allocate a new sqlite3expert object.
11048 */
11049 sqlite3expert *sqlite3_expert_new(sqlite3 *db, char **pzErrmsg){
11050   int rc = SQLITE_OK;
11051   sqlite3expert *pNew;
11052 
11053   pNew = (sqlite3expert*)idxMalloc(&rc, sizeof(sqlite3expert));
11054 
11055   /* Open two in-memory databases to work with. The "vtab database" (dbv)
11056   ** will contain a virtual table corresponding to each real table in
11057   ** the user database schema, and a copy of each view. It is used to
11058   ** collect information regarding the WHERE, ORDER BY and other clauses
11059   ** of the user's query.
11060   */
11061   if( rc==SQLITE_OK ){
11062     pNew->db = db;
11063     pNew->iSample = 100;
11064     rc = sqlite3_open(":memory:", &pNew->dbv);
11065   }
11066   if( rc==SQLITE_OK ){
11067     rc = sqlite3_open(":memory:", &pNew->dbm);
11068     if( rc==SQLITE_OK ){
11069       sqlite3_db_config(pNew->dbm, SQLITE_DBCONFIG_TRIGGER_EQP, 1, (int*)0);
11070     }
11071   }
11072 
11073 
11074   /* Copy the entire schema of database [db] into [dbm]. */
11075   if( rc==SQLITE_OK ){
11076     sqlite3_stmt *pSql = 0;
11077     rc = idxPrintfPrepareStmt(pNew->db, &pSql, pzErrmsg,
11078         "SELECT sql FROM sqlite_schema WHERE name NOT LIKE 'sqlite_%%'"
11079         " AND sql NOT LIKE 'CREATE VIRTUAL %%'"
11080     );
11081     while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
11082       const char *zSql = (const char*)sqlite3_column_text(pSql, 0);
11083       if( zSql ) rc = sqlite3_exec(pNew->dbm, zSql, 0, 0, pzErrmsg);
11084     }
11085     idxFinalize(&rc, pSql);
11086   }
11087 
11088   /* Create the vtab schema */
11089   if( rc==SQLITE_OK ){
11090     rc = idxCreateVtabSchema(pNew, pzErrmsg);
11091   }
11092 
11093   /* Register the auth callback with dbv */
11094   if( rc==SQLITE_OK ){
11095     sqlite3_set_authorizer(pNew->dbv, idxAuthCallback, (void*)pNew);
11096   }
11097 
11098   /* If an error has occurred, free the new object and reutrn NULL. Otherwise,
11099   ** return the new sqlite3expert handle.  */
11100   if( rc!=SQLITE_OK ){
11101     sqlite3_expert_destroy(pNew);
11102     pNew = 0;
11103   }
11104   return pNew;
11105 }
11106 
11107 /*
11108 ** Configure an sqlite3expert object.
11109 */
11110 int sqlite3_expert_config(sqlite3expert *p, int op, ...){
11111   int rc = SQLITE_OK;
11112   va_list ap;
11113   va_start(ap, op);
11114   switch( op ){
11115     case EXPERT_CONFIG_SAMPLE: {
11116       int iVal = va_arg(ap, int);
11117       if( iVal<0 ) iVal = 0;
11118       if( iVal>100 ) iVal = 100;
11119       p->iSample = iVal;
11120       break;
11121     }
11122     default:
11123       rc = SQLITE_NOTFOUND;
11124       break;
11125   }
11126 
11127   va_end(ap);
11128   return rc;
11129 }
11130 
11131 /*
11132 ** Add an SQL statement to the analysis.
11133 */
11134 int sqlite3_expert_sql(
11135   sqlite3expert *p,               /* From sqlite3_expert_new() */
11136   const char *zSql,               /* SQL statement to add */
11137   char **pzErr                    /* OUT: Error message (if any) */
11138 ){
11139   IdxScan *pScanOrig = p->pScan;
11140   IdxStatement *pStmtOrig = p->pStatement;
11141   int rc = SQLITE_OK;
11142   const char *zStmt = zSql;
11143 
11144   if( p->bRun ) return SQLITE_MISUSE;
11145 
11146   while( rc==SQLITE_OK && zStmt && zStmt[0] ){
11147     sqlite3_stmt *pStmt = 0;
11148     rc = sqlite3_prepare_v2(p->dbv, zStmt, -1, &pStmt, &zStmt);
11149     if( rc==SQLITE_OK ){
11150       if( pStmt ){
11151         IdxStatement *pNew;
11152         const char *z = sqlite3_sql(pStmt);
11153         int n = STRLEN(z);
11154         pNew = (IdxStatement*)idxMalloc(&rc, sizeof(IdxStatement) + n+1);
11155         if( rc==SQLITE_OK ){
11156           pNew->zSql = (char*)&pNew[1];
11157           memcpy(pNew->zSql, z, n+1);
11158           pNew->pNext = p->pStatement;
11159           if( p->pStatement ) pNew->iId = p->pStatement->iId+1;
11160           p->pStatement = pNew;
11161         }
11162         sqlite3_finalize(pStmt);
11163       }
11164     }else{
11165       idxDatabaseError(p->dbv, pzErr);
11166     }
11167   }
11168 
11169   if( rc!=SQLITE_OK ){
11170     idxScanFree(p->pScan, pScanOrig);
11171     idxStatementFree(p->pStatement, pStmtOrig);
11172     p->pScan = pScanOrig;
11173     p->pStatement = pStmtOrig;
11174   }
11175 
11176   return rc;
11177 }
11178 
11179 int sqlite3_expert_analyze(sqlite3expert *p, char **pzErr){
11180   int rc;
11181   IdxHashEntry *pEntry;
11182 
11183   /* Do trigger processing to collect any extra IdxScan structures */
11184   rc = idxProcessTriggers(p, pzErr);
11185 
11186   /* Create candidate indexes within the in-memory database file */
11187   if( rc==SQLITE_OK ){
11188     rc = idxCreateCandidates(p);
11189   }else if ( rc==SQLITE_BUSY_TIMEOUT ){
11190     if( pzErr )
11191       *pzErr = sqlite3_mprintf("Cannot find a unique index name to propose.");
11192     return rc;
11193   }
11194 
11195   /* Generate the stat1 data */
11196   if( rc==SQLITE_OK ){
11197     rc = idxPopulateStat1(p, pzErr);
11198   }
11199 
11200   /* Formulate the EXPERT_REPORT_CANDIDATES text */
11201   for(pEntry=p->hIdx.pFirst; pEntry; pEntry=pEntry->pNext){
11202     p->zCandidates = idxAppendText(&rc, p->zCandidates,
11203         "%s;%s%s\n", pEntry->zVal,
11204         pEntry->zVal2 ? " -- stat1: " : "", pEntry->zVal2
11205     );
11206   }
11207 
11208   /* Figure out which of the candidate indexes are preferred by the query
11209   ** planner and report the results to the user.  */
11210   if( rc==SQLITE_OK ){
11211     rc = idxFindIndexes(p, pzErr);
11212   }
11213 
11214   if( rc==SQLITE_OK ){
11215     p->bRun = 1;
11216   }
11217   return rc;
11218 }
11219 
11220 /*
11221 ** Return the total number of statements that have been added to this
11222 ** sqlite3expert using sqlite3_expert_sql().
11223 */
11224 int sqlite3_expert_count(sqlite3expert *p){
11225   int nRet = 0;
11226   if( p->pStatement ) nRet = p->pStatement->iId+1;
11227   return nRet;
11228 }
11229 
11230 /*
11231 ** Return a component of the report.
11232 */
11233 const char *sqlite3_expert_report(sqlite3expert *p, int iStmt, int eReport){
11234   const char *zRet = 0;
11235   IdxStatement *pStmt;
11236 
11237   if( p->bRun==0 ) return 0;
11238   for(pStmt=p->pStatement; pStmt && pStmt->iId!=iStmt; pStmt=pStmt->pNext);
11239   switch( eReport ){
11240     case EXPERT_REPORT_SQL:
11241       if( pStmt ) zRet = pStmt->zSql;
11242       break;
11243     case EXPERT_REPORT_INDEXES:
11244       if( pStmt ) zRet = pStmt->zIdx;
11245       break;
11246     case EXPERT_REPORT_PLAN:
11247       if( pStmt ) zRet = pStmt->zEQP;
11248       break;
11249     case EXPERT_REPORT_CANDIDATES:
11250       zRet = p->zCandidates;
11251       break;
11252   }
11253   return zRet;
11254 }
11255 
11256 /*
11257 ** Free an sqlite3expert object.
11258 */
11259 void sqlite3_expert_destroy(sqlite3expert *p){
11260   if( p ){
11261     sqlite3_close(p->dbm);
11262     sqlite3_close(p->dbv);
11263     idxScanFree(p->pScan, 0);
11264     idxStatementFree(p->pStatement, 0);
11265     idxTableFree(p->pTable);
11266     idxWriteFree(p->pWrite);
11267     idxHashClear(&p->hIdx);
11268     sqlite3_free(p->zCandidates);
11269     sqlite3_free(p);
11270   }
11271 }
11272 
11273 #endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
11274 
11275 /************************* End ../ext/expert/sqlite3expert.c ********************/
11276 
11277 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
11278 /************************* Begin ../ext/misc/dbdata.c ******************/
11279 /*
11280 ** 2019-04-17
11281 **
11282 ** The author disclaims copyright to this source code.  In place of
11283 ** a legal notice, here is a blessing:
11284 **
11285 **    May you do good and not evil.
11286 **    May you find forgiveness for yourself and forgive others.
11287 **    May you share freely, never taking more than you give.
11288 **
11289 ******************************************************************************
11290 **
11291 ** This file contains an implementation of two eponymous virtual tables,
11292 ** "sqlite_dbdata" and "sqlite_dbptr". Both modules require that the
11293 ** "sqlite_dbpage" eponymous virtual table be available.
11294 **
11295 ** SQLITE_DBDATA:
11296 **   sqlite_dbdata is used to extract data directly from a database b-tree
11297 **   page and its associated overflow pages, bypassing the b-tree layer.
11298 **   The table schema is equivalent to:
11299 **
11300 **     CREATE TABLE sqlite_dbdata(
11301 **       pgno INTEGER,
11302 **       cell INTEGER,
11303 **       field INTEGER,
11304 **       value ANY,
11305 **       schema TEXT HIDDEN
11306 **     );
11307 **
11308 **   IMPORTANT: THE VIRTUAL TABLE SCHEMA ABOVE IS SUBJECT TO CHANGE. IN THE
11309 **   FUTURE NEW NON-HIDDEN COLUMNS MAY BE ADDED BETWEEN "value" AND
11310 **   "schema".
11311 **
11312 **   Each page of the database is inspected. If it cannot be interpreted as
11313 **   a b-tree page, or if it is a b-tree page containing 0 entries, the
11314 **   sqlite_dbdata table contains no rows for that page.  Otherwise, the
11315 **   table contains one row for each field in the record associated with
11316 **   each cell on the page. For intkey b-trees, the key value is stored in
11317 **   field -1.
11318 **
11319 **   For example, for the database:
11320 **
11321 **     CREATE TABLE t1(a, b);     -- root page is page 2
11322 **     INSERT INTO t1(rowid, a, b) VALUES(5, 'v', 'five');
11323 **     INSERT INTO t1(rowid, a, b) VALUES(10, 'x', 'ten');
11324 **
11325 **   the sqlite_dbdata table contains, as well as from entries related to
11326 **   page 1, content equivalent to:
11327 **
11328 **     INSERT INTO sqlite_dbdata(pgno, cell, field, value) VALUES
11329 **         (2, 0, -1, 5     ),
11330 **         (2, 0,  0, 'v'   ),
11331 **         (2, 0,  1, 'five'),
11332 **         (2, 1, -1, 10    ),
11333 **         (2, 1,  0, 'x'   ),
11334 **         (2, 1,  1, 'ten' );
11335 **
11336 **   If database corruption is encountered, this module does not report an
11337 **   error. Instead, it attempts to extract as much data as possible and
11338 **   ignores the corruption.
11339 **
11340 ** SQLITE_DBPTR:
11341 **   The sqlite_dbptr table has the following schema:
11342 **
11343 **     CREATE TABLE sqlite_dbptr(
11344 **       pgno INTEGER,
11345 **       child INTEGER,
11346 **       schema TEXT HIDDEN
11347 **     );
11348 **
11349 **   It contains one entry for each b-tree pointer between a parent and
11350 **   child page in the database.
11351 */
11352 #if !defined(SQLITEINT_H)
11353 /* #include "sqlite3ext.h" */
11354 
11355 /* typedef unsigned char u8; */
11356 
11357 #endif
11358 SQLITE_EXTENSION_INIT1
11359 #include <string.h>
11360 #include <assert.h>
11361 
11362 #define DBDATA_PADDING_BYTES 100
11363 
11364 typedef struct DbdataTable DbdataTable;
11365 typedef struct DbdataCursor DbdataCursor;
11366 
11367 /* Cursor object */
11368 struct DbdataCursor {
11369   sqlite3_vtab_cursor base;       /* Base class.  Must be first */
11370   sqlite3_stmt *pStmt;            /* For fetching database pages */
11371 
11372   int iPgno;                      /* Current page number */
11373   u8 *aPage;                      /* Buffer containing page */
11374   int nPage;                      /* Size of aPage[] in bytes */
11375   int nCell;                      /* Number of cells on aPage[] */
11376   int iCell;                      /* Current cell number */
11377   int bOnePage;                   /* True to stop after one page */
11378   int szDb;
11379   sqlite3_int64 iRowid;
11380 
11381   /* Only for the sqlite_dbdata table */
11382   u8 *pRec;                       /* Buffer containing current record */
11383   int nRec;                       /* Size of pRec[] in bytes */
11384   int nHdr;                       /* Size of header in bytes */
11385   int iField;                     /* Current field number */
11386   u8 *pHdrPtr;
11387   u8 *pPtr;
11388 
11389   sqlite3_int64 iIntkey;          /* Integer key value */
11390 };
11391 
11392 /* Table object */
11393 struct DbdataTable {
11394   sqlite3_vtab base;              /* Base class.  Must be first */
11395   sqlite3 *db;                    /* The database connection */
11396   sqlite3_stmt *pStmt;            /* For fetching database pages */
11397   int bPtr;                       /* True for sqlite3_dbptr table */
11398 };
11399 
11400 /* Column and schema definitions for sqlite_dbdata */
11401 #define DBDATA_COLUMN_PGNO        0
11402 #define DBDATA_COLUMN_CELL        1
11403 #define DBDATA_COLUMN_FIELD       2
11404 #define DBDATA_COLUMN_VALUE       3
11405 #define DBDATA_COLUMN_SCHEMA      4
11406 #define DBDATA_SCHEMA             \
11407       "CREATE TABLE x("           \
11408       "  pgno INTEGER,"           \
11409       "  cell INTEGER,"           \
11410       "  field INTEGER,"          \
11411       "  value ANY,"              \
11412       "  schema TEXT HIDDEN"      \
11413       ")"
11414 
11415 /* Column and schema definitions for sqlite_dbptr */
11416 #define DBPTR_COLUMN_PGNO         0
11417 #define DBPTR_COLUMN_CHILD        1
11418 #define DBPTR_COLUMN_SCHEMA       2
11419 #define DBPTR_SCHEMA              \
11420       "CREATE TABLE x("           \
11421       "  pgno INTEGER,"           \
11422       "  child INTEGER,"          \
11423       "  schema TEXT HIDDEN"      \
11424       ")"
11425 
11426 /*
11427 ** Connect to an sqlite_dbdata (pAux==0) or sqlite_dbptr (pAux!=0) virtual
11428 ** table.
11429 */
11430 static int dbdataConnect(
11431   sqlite3 *db,
11432   void *pAux,
11433   int argc, const char *const*argv,
11434   sqlite3_vtab **ppVtab,
11435   char **pzErr
11436 ){
11437   DbdataTable *pTab = 0;
11438   int rc = sqlite3_declare_vtab(db, pAux ? DBPTR_SCHEMA : DBDATA_SCHEMA);
11439 
11440   if( rc==SQLITE_OK ){
11441     pTab = (DbdataTable*)sqlite3_malloc64(sizeof(DbdataTable));
11442     if( pTab==0 ){
11443       rc = SQLITE_NOMEM;
11444     }else{
11445       memset(pTab, 0, sizeof(DbdataTable));
11446       pTab->db = db;
11447       pTab->bPtr = (pAux!=0);
11448     }
11449   }
11450 
11451   *ppVtab = (sqlite3_vtab*)pTab;
11452   return rc;
11453 }
11454 
11455 /*
11456 ** Disconnect from or destroy a sqlite_dbdata or sqlite_dbptr virtual table.
11457 */
11458 static int dbdataDisconnect(sqlite3_vtab *pVtab){
11459   DbdataTable *pTab = (DbdataTable*)pVtab;
11460   if( pTab ){
11461     sqlite3_finalize(pTab->pStmt);
11462     sqlite3_free(pVtab);
11463   }
11464   return SQLITE_OK;
11465 }
11466 
11467 /*
11468 ** This function interprets two types of constraints:
11469 **
11470 **       schema=?
11471 **       pgno=?
11472 **
11473 ** If neither are present, idxNum is set to 0. If schema=? is present,
11474 ** the 0x01 bit in idxNum is set. If pgno=? is present, the 0x02 bit
11475 ** in idxNum is set.
11476 **
11477 ** If both parameters are present, schema is in position 0 and pgno in
11478 ** position 1.
11479 */
11480 static int dbdataBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdx){
11481   DbdataTable *pTab = (DbdataTable*)tab;
11482   int i;
11483   int iSchema = -1;
11484   int iPgno = -1;
11485   int colSchema = (pTab->bPtr ? DBPTR_COLUMN_SCHEMA : DBDATA_COLUMN_SCHEMA);
11486 
11487   for(i=0; i<pIdx->nConstraint; i++){
11488     struct sqlite3_index_constraint *p = &pIdx->aConstraint[i];
11489     if( p->op==SQLITE_INDEX_CONSTRAINT_EQ ){
11490       if( p->iColumn==colSchema ){
11491         if( p->usable==0 ) return SQLITE_CONSTRAINT;
11492         iSchema = i;
11493       }
11494       if( p->iColumn==DBDATA_COLUMN_PGNO && p->usable ){
11495         iPgno = i;
11496       }
11497     }
11498   }
11499 
11500   if( iSchema>=0 ){
11501     pIdx->aConstraintUsage[iSchema].argvIndex = 1;
11502     pIdx->aConstraintUsage[iSchema].omit = 1;
11503   }
11504   if( iPgno>=0 ){
11505     pIdx->aConstraintUsage[iPgno].argvIndex = 1 + (iSchema>=0);
11506     pIdx->aConstraintUsage[iPgno].omit = 1;
11507     pIdx->estimatedCost = 100;
11508     pIdx->estimatedRows =  50;
11509 
11510     if( pTab->bPtr==0 && pIdx->nOrderBy && pIdx->aOrderBy[0].desc==0 ){
11511       int iCol = pIdx->aOrderBy[0].iColumn;
11512       if( pIdx->nOrderBy==1 ){
11513         pIdx->orderByConsumed = (iCol==0 || iCol==1);
11514       }else if( pIdx->nOrderBy==2 && pIdx->aOrderBy[1].desc==0 && iCol==0 ){
11515         pIdx->orderByConsumed = (pIdx->aOrderBy[1].iColumn==1);
11516       }
11517     }
11518 
11519   }else{
11520     pIdx->estimatedCost = 100000000;
11521     pIdx->estimatedRows = 1000000000;
11522   }
11523   pIdx->idxNum = (iSchema>=0 ? 0x01 : 0x00) | (iPgno>=0 ? 0x02 : 0x00);
11524   return SQLITE_OK;
11525 }
11526 
11527 /*
11528 ** Open a new sqlite_dbdata or sqlite_dbptr cursor.
11529 */
11530 static int dbdataOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){
11531   DbdataCursor *pCsr;
11532 
11533   pCsr = (DbdataCursor*)sqlite3_malloc64(sizeof(DbdataCursor));
11534   if( pCsr==0 ){
11535     return SQLITE_NOMEM;
11536   }else{
11537     memset(pCsr, 0, sizeof(DbdataCursor));
11538     pCsr->base.pVtab = pVTab;
11539   }
11540 
11541   *ppCursor = (sqlite3_vtab_cursor *)pCsr;
11542   return SQLITE_OK;
11543 }
11544 
11545 /*
11546 ** Restore a cursor object to the state it was in when first allocated
11547 ** by dbdataOpen().
11548 */
11549 static void dbdataResetCursor(DbdataCursor *pCsr){
11550   DbdataTable *pTab = (DbdataTable*)(pCsr->base.pVtab);
11551   if( pTab->pStmt==0 ){
11552     pTab->pStmt = pCsr->pStmt;
11553   }else{
11554     sqlite3_finalize(pCsr->pStmt);
11555   }
11556   pCsr->pStmt = 0;
11557   pCsr->iPgno = 1;
11558   pCsr->iCell = 0;
11559   pCsr->iField = 0;
11560   pCsr->bOnePage = 0;
11561   sqlite3_free(pCsr->aPage);
11562   sqlite3_free(pCsr->pRec);
11563   pCsr->pRec = 0;
11564   pCsr->aPage = 0;
11565 }
11566 
11567 /*
11568 ** Close an sqlite_dbdata or sqlite_dbptr cursor.
11569 */
11570 static int dbdataClose(sqlite3_vtab_cursor *pCursor){
11571   DbdataCursor *pCsr = (DbdataCursor*)pCursor;
11572   dbdataResetCursor(pCsr);
11573   sqlite3_free(pCsr);
11574   return SQLITE_OK;
11575 }
11576 
11577 /*
11578 ** Utility methods to decode 16 and 32-bit big-endian unsigned integers.
11579 */
11580 static unsigned int get_uint16(unsigned char *a){
11581   return (a[0]<<8)|a[1];
11582 }
11583 static unsigned int get_uint32(unsigned char *a){
11584   return ((unsigned int)a[0]<<24)
11585        | ((unsigned int)a[1]<<16)
11586        | ((unsigned int)a[2]<<8)
11587        | ((unsigned int)a[3]);
11588 }
11589 
11590 /*
11591 ** Load page pgno from the database via the sqlite_dbpage virtual table.
11592 ** If successful, set (*ppPage) to point to a buffer containing the page
11593 ** data, (*pnPage) to the size of that buffer in bytes and return
11594 ** SQLITE_OK. In this case it is the responsibility of the caller to
11595 ** eventually free the buffer using sqlite3_free().
11596 **
11597 ** Or, if an error occurs, set both (*ppPage) and (*pnPage) to 0 and
11598 ** return an SQLite error code.
11599 */
11600 static int dbdataLoadPage(
11601   DbdataCursor *pCsr,             /* Cursor object */
11602   unsigned int pgno,              /* Page number of page to load */
11603   u8 **ppPage,                    /* OUT: pointer to page buffer */
11604   int *pnPage                     /* OUT: Size of (*ppPage) in bytes */
11605 ){
11606   int rc2;
11607   int rc = SQLITE_OK;
11608   sqlite3_stmt *pStmt = pCsr->pStmt;
11609 
11610   *ppPage = 0;
11611   *pnPage = 0;
11612   sqlite3_bind_int64(pStmt, 2, pgno);
11613   if( SQLITE_ROW==sqlite3_step(pStmt) ){
11614     int nCopy = sqlite3_column_bytes(pStmt, 0);
11615     if( nCopy>0 ){
11616       u8 *pPage;
11617       pPage = (u8*)sqlite3_malloc64(nCopy + DBDATA_PADDING_BYTES);
11618       if( pPage==0 ){
11619         rc = SQLITE_NOMEM;
11620       }else{
11621         const u8 *pCopy = sqlite3_column_blob(pStmt, 0);
11622         memcpy(pPage, pCopy, nCopy);
11623         memset(&pPage[nCopy], 0, DBDATA_PADDING_BYTES);
11624       }
11625       *ppPage = pPage;
11626       *pnPage = nCopy;
11627     }
11628   }
11629   rc2 = sqlite3_reset(pStmt);
11630   if( rc==SQLITE_OK ) rc = rc2;
11631 
11632   return rc;
11633 }
11634 
11635 /*
11636 ** Read a varint.  Put the value in *pVal and return the number of bytes.
11637 */
11638 static int dbdataGetVarint(const u8 *z, sqlite3_int64 *pVal){
11639   sqlite3_int64 v = 0;
11640   int i;
11641   for(i=0; i<8; i++){
11642     v = (v<<7) + (z[i]&0x7f);
11643     if( (z[i]&0x80)==0 ){ *pVal = v; return i+1; }
11644   }
11645   v = (v<<8) + (z[i]&0xff);
11646   *pVal = v;
11647   return 9;
11648 }
11649 
11650 /*
11651 ** Return the number of bytes of space used by an SQLite value of type
11652 ** eType.
11653 */
11654 static int dbdataValueBytes(int eType){
11655   switch( eType ){
11656     case 0: case 8: case 9:
11657     case 10: case 11:
11658       return 0;
11659     case 1:
11660       return 1;
11661     case 2:
11662       return 2;
11663     case 3:
11664       return 3;
11665     case 4:
11666       return 4;
11667     case 5:
11668       return 6;
11669     case 6:
11670     case 7:
11671       return 8;
11672     default:
11673       if( eType>0 ){
11674         return ((eType-12) / 2);
11675       }
11676       return 0;
11677   }
11678 }
11679 
11680 /*
11681 ** Load a value of type eType from buffer pData and use it to set the
11682 ** result of context object pCtx.
11683 */
11684 static void dbdataValue(
11685   sqlite3_context *pCtx,
11686   int eType,
11687   u8 *pData,
11688   int nData
11689 ){
11690   if( eType>=0 && dbdataValueBytes(eType)<=nData ){
11691     switch( eType ){
11692       case 0:
11693       case 10:
11694       case 11:
11695         sqlite3_result_null(pCtx);
11696         break;
11697 
11698       case 8:
11699         sqlite3_result_int(pCtx, 0);
11700         break;
11701       case 9:
11702         sqlite3_result_int(pCtx, 1);
11703         break;
11704 
11705       case 1: case 2: case 3: case 4: case 5: case 6: case 7: {
11706         sqlite3_uint64 v = (signed char)pData[0];
11707         pData++;
11708         switch( eType ){
11709           case 7:
11710           case 6:  v = (v<<16) + (pData[0]<<8) + pData[1];  pData += 2;
11711           case 5:  v = (v<<16) + (pData[0]<<8) + pData[1];  pData += 2;
11712           case 4:  v = (v<<8) + pData[0];  pData++;
11713           case 3:  v = (v<<8) + pData[0];  pData++;
11714           case 2:  v = (v<<8) + pData[0];  pData++;
11715         }
11716 
11717         if( eType==7 ){
11718           double r;
11719           memcpy(&r, &v, sizeof(r));
11720           sqlite3_result_double(pCtx, r);
11721         }else{
11722           sqlite3_result_int64(pCtx, (sqlite3_int64)v);
11723         }
11724         break;
11725       }
11726 
11727       default: {
11728         int n = ((eType-12) / 2);
11729         if( eType % 2 ){
11730           sqlite3_result_text(pCtx, (const char*)pData, n, SQLITE_TRANSIENT);
11731         }else{
11732           sqlite3_result_blob(pCtx, pData, n, SQLITE_TRANSIENT);
11733         }
11734       }
11735     }
11736   }
11737 }
11738 
11739 /*
11740 ** Move an sqlite_dbdata or sqlite_dbptr cursor to the next entry.
11741 */
11742 static int dbdataNext(sqlite3_vtab_cursor *pCursor){
11743   DbdataCursor *pCsr = (DbdataCursor*)pCursor;
11744   DbdataTable *pTab = (DbdataTable*)pCursor->pVtab;
11745 
11746   pCsr->iRowid++;
11747   while( 1 ){
11748     int rc;
11749     int iOff = (pCsr->iPgno==1 ? 100 : 0);
11750     int bNextPage = 0;
11751 
11752     if( pCsr->aPage==0 ){
11753       while( 1 ){
11754         if( pCsr->bOnePage==0 && pCsr->iPgno>pCsr->szDb ) return SQLITE_OK;
11755         rc = dbdataLoadPage(pCsr, pCsr->iPgno, &pCsr->aPage, &pCsr->nPage);
11756         if( rc!=SQLITE_OK ) return rc;
11757         if( pCsr->aPage ) break;
11758         pCsr->iPgno++;
11759       }
11760       pCsr->iCell = pTab->bPtr ? -2 : 0;
11761       pCsr->nCell = get_uint16(&pCsr->aPage[iOff+3]);
11762     }
11763 
11764     if( pTab->bPtr ){
11765       if( pCsr->aPage[iOff]!=0x02 && pCsr->aPage[iOff]!=0x05 ){
11766         pCsr->iCell = pCsr->nCell;
11767       }
11768       pCsr->iCell++;
11769       if( pCsr->iCell>=pCsr->nCell ){
11770         sqlite3_free(pCsr->aPage);
11771         pCsr->aPage = 0;
11772         if( pCsr->bOnePage ) return SQLITE_OK;
11773         pCsr->iPgno++;
11774       }else{
11775         return SQLITE_OK;
11776       }
11777     }else{
11778       /* If there is no record loaded, load it now. */
11779       if( pCsr->pRec==0 ){
11780         int bHasRowid = 0;
11781         int nPointer = 0;
11782         sqlite3_int64 nPayload = 0;
11783         sqlite3_int64 nHdr = 0;
11784         int iHdr;
11785         int U, X;
11786         int nLocal;
11787 
11788         switch( pCsr->aPage[iOff] ){
11789           case 0x02:
11790             nPointer = 4;
11791             break;
11792           case 0x0a:
11793             break;
11794           case 0x0d:
11795             bHasRowid = 1;
11796             break;
11797           default:
11798             /* This is not a b-tree page with records on it. Continue. */
11799             pCsr->iCell = pCsr->nCell;
11800             break;
11801         }
11802 
11803         if( pCsr->iCell>=pCsr->nCell ){
11804           bNextPage = 1;
11805         }else{
11806 
11807           iOff += 8 + nPointer + pCsr->iCell*2;
11808           if( iOff>pCsr->nPage ){
11809             bNextPage = 1;
11810           }else{
11811             iOff = get_uint16(&pCsr->aPage[iOff]);
11812           }
11813 
11814           /* For an interior node cell, skip past the child-page number */
11815           iOff += nPointer;
11816 
11817           /* Load the "byte of payload including overflow" field */
11818           if( bNextPage || iOff>pCsr->nPage ){
11819             bNextPage = 1;
11820           }else{
11821             iOff += dbdataGetVarint(&pCsr->aPage[iOff], &nPayload);
11822           }
11823 
11824           /* If this is a leaf intkey cell, load the rowid */
11825           if( bHasRowid && !bNextPage && iOff<pCsr->nPage ){
11826             iOff += dbdataGetVarint(&pCsr->aPage[iOff], &pCsr->iIntkey);
11827           }
11828 
11829           /* Figure out how much data to read from the local page */
11830           U = pCsr->nPage;
11831           if( bHasRowid ){
11832             X = U-35;
11833           }else{
11834             X = ((U-12)*64/255)-23;
11835           }
11836           if( nPayload<=X ){
11837             nLocal = nPayload;
11838           }else{
11839             int M, K;
11840             M = ((U-12)*32/255)-23;
11841             K = M+((nPayload-M)%(U-4));
11842             if( K<=X ){
11843               nLocal = K;
11844             }else{
11845               nLocal = M;
11846             }
11847           }
11848 
11849           if( bNextPage || nLocal+iOff>pCsr->nPage ){
11850             bNextPage = 1;
11851           }else{
11852 
11853             /* Allocate space for payload. And a bit more to catch small buffer
11854             ** overruns caused by attempting to read a varint or similar from
11855             ** near the end of a corrupt record.  */
11856             pCsr->pRec = (u8*)sqlite3_malloc64(nPayload+DBDATA_PADDING_BYTES);
11857             if( pCsr->pRec==0 ) return SQLITE_NOMEM;
11858             memset(pCsr->pRec, 0, nPayload+DBDATA_PADDING_BYTES);
11859             pCsr->nRec = nPayload;
11860 
11861             /* Load the nLocal bytes of payload */
11862             memcpy(pCsr->pRec, &pCsr->aPage[iOff], nLocal);
11863             iOff += nLocal;
11864 
11865             /* Load content from overflow pages */
11866             if( nPayload>nLocal ){
11867               sqlite3_int64 nRem = nPayload - nLocal;
11868               unsigned int pgnoOvfl = get_uint32(&pCsr->aPage[iOff]);
11869               while( nRem>0 ){
11870                 u8 *aOvfl = 0;
11871                 int nOvfl = 0;
11872                 int nCopy;
11873                 rc = dbdataLoadPage(pCsr, pgnoOvfl, &aOvfl, &nOvfl);
11874                 assert( rc!=SQLITE_OK || aOvfl==0 || nOvfl==pCsr->nPage );
11875                 if( rc!=SQLITE_OK ) return rc;
11876                 if( aOvfl==0 ) break;
11877 
11878                 nCopy = U-4;
11879                 if( nCopy>nRem ) nCopy = nRem;
11880                 memcpy(&pCsr->pRec[nPayload-nRem], &aOvfl[4], nCopy);
11881                 nRem -= nCopy;
11882 
11883                 pgnoOvfl = get_uint32(aOvfl);
11884                 sqlite3_free(aOvfl);
11885               }
11886             }
11887 
11888             iHdr = dbdataGetVarint(pCsr->pRec, &nHdr);
11889             pCsr->nHdr = nHdr;
11890             pCsr->pHdrPtr = &pCsr->pRec[iHdr];
11891             pCsr->pPtr = &pCsr->pRec[pCsr->nHdr];
11892             pCsr->iField = (bHasRowid ? -1 : 0);
11893           }
11894         }
11895       }else{
11896         pCsr->iField++;
11897         if( pCsr->iField>0 ){
11898           sqlite3_int64 iType;
11899           if( pCsr->pHdrPtr>&pCsr->pRec[pCsr->nRec] ){
11900             bNextPage = 1;
11901           }else{
11902             pCsr->pHdrPtr += dbdataGetVarint(pCsr->pHdrPtr, &iType);
11903             pCsr->pPtr += dbdataValueBytes(iType);
11904           }
11905         }
11906       }
11907 
11908       if( bNextPage ){
11909         sqlite3_free(pCsr->aPage);
11910         sqlite3_free(pCsr->pRec);
11911         pCsr->aPage = 0;
11912         pCsr->pRec = 0;
11913         if( pCsr->bOnePage ) return SQLITE_OK;
11914         pCsr->iPgno++;
11915       }else{
11916         if( pCsr->iField<0 || pCsr->pHdrPtr<&pCsr->pRec[pCsr->nHdr] ){
11917           return SQLITE_OK;
11918         }
11919 
11920         /* Advance to the next cell. The next iteration of the loop will load
11921         ** the record and so on. */
11922         sqlite3_free(pCsr->pRec);
11923         pCsr->pRec = 0;
11924         pCsr->iCell++;
11925       }
11926     }
11927   }
11928 
11929   assert( !"can't get here" );
11930   return SQLITE_OK;
11931 }
11932 
11933 /*
11934 ** Return true if the cursor is at EOF.
11935 */
11936 static int dbdataEof(sqlite3_vtab_cursor *pCursor){
11937   DbdataCursor *pCsr = (DbdataCursor*)pCursor;
11938   return pCsr->aPage==0;
11939 }
11940 
11941 /*
11942 ** Determine the size in pages of database zSchema (where zSchema is
11943 ** "main", "temp" or the name of an attached database) and set
11944 ** pCsr->szDb accordingly. If successful, return SQLITE_OK. Otherwise,
11945 ** an SQLite error code.
11946 */
11947 static int dbdataDbsize(DbdataCursor *pCsr, const char *zSchema){
11948   DbdataTable *pTab = (DbdataTable*)pCsr->base.pVtab;
11949   char *zSql = 0;
11950   int rc, rc2;
11951   sqlite3_stmt *pStmt = 0;
11952 
11953   zSql = sqlite3_mprintf("PRAGMA %Q.page_count", zSchema);
11954   if( zSql==0 ) return SQLITE_NOMEM;
11955   rc = sqlite3_prepare_v2(pTab->db, zSql, -1, &pStmt, 0);
11956   sqlite3_free(zSql);
11957   if( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
11958     pCsr->szDb = sqlite3_column_int(pStmt, 0);
11959   }
11960   rc2 = sqlite3_finalize(pStmt);
11961   if( rc==SQLITE_OK ) rc = rc2;
11962   return rc;
11963 }
11964 
11965 /*
11966 ** xFilter method for sqlite_dbdata and sqlite_dbptr.
11967 */
11968 static int dbdataFilter(
11969   sqlite3_vtab_cursor *pCursor,
11970   int idxNum, const char *idxStr,
11971   int argc, sqlite3_value **argv
11972 ){
11973   DbdataCursor *pCsr = (DbdataCursor*)pCursor;
11974   DbdataTable *pTab = (DbdataTable*)pCursor->pVtab;
11975   int rc = SQLITE_OK;
11976   const char *zSchema = "main";
11977 
11978   dbdataResetCursor(pCsr);
11979   assert( pCsr->iPgno==1 );
11980   if( idxNum & 0x01 ){
11981     zSchema = (const char*)sqlite3_value_text(argv[0]);
11982   }
11983   if( idxNum & 0x02 ){
11984     pCsr->iPgno = sqlite3_value_int(argv[(idxNum & 0x01)]);
11985     pCsr->bOnePage = 1;
11986   }else{
11987     pCsr->nPage = dbdataDbsize(pCsr, zSchema);
11988     rc = dbdataDbsize(pCsr, zSchema);
11989   }
11990 
11991   if( rc==SQLITE_OK ){
11992     if( pTab->pStmt ){
11993       pCsr->pStmt = pTab->pStmt;
11994       pTab->pStmt = 0;
11995     }else{
11996       rc = sqlite3_prepare_v2(pTab->db,
11997           "SELECT data FROM sqlite_dbpage(?) WHERE pgno=?", -1,
11998           &pCsr->pStmt, 0
11999       );
12000     }
12001   }
12002   if( rc==SQLITE_OK ){
12003     rc = sqlite3_bind_text(pCsr->pStmt, 1, zSchema, -1, SQLITE_TRANSIENT);
12004   }else{
12005     pTab->base.zErrMsg = sqlite3_mprintf("%s", sqlite3_errmsg(pTab->db));
12006   }
12007   if( rc==SQLITE_OK ){
12008     rc = dbdataNext(pCursor);
12009   }
12010   return rc;
12011 }
12012 
12013 /*
12014 ** Return a column for the sqlite_dbdata or sqlite_dbptr table.
12015 */
12016 static int dbdataColumn(
12017   sqlite3_vtab_cursor *pCursor,
12018   sqlite3_context *ctx,
12019   int i
12020 ){
12021   DbdataCursor *pCsr = (DbdataCursor*)pCursor;
12022   DbdataTable *pTab = (DbdataTable*)pCursor->pVtab;
12023   if( pTab->bPtr ){
12024     switch( i ){
12025       case DBPTR_COLUMN_PGNO:
12026         sqlite3_result_int64(ctx, pCsr->iPgno);
12027         break;
12028       case DBPTR_COLUMN_CHILD: {
12029         int iOff = pCsr->iPgno==1 ? 100 : 0;
12030         if( pCsr->iCell<0 ){
12031           iOff += 8;
12032         }else{
12033           iOff += 12 + pCsr->iCell*2;
12034           if( iOff>pCsr->nPage ) return SQLITE_OK;
12035           iOff = get_uint16(&pCsr->aPage[iOff]);
12036         }
12037         if( iOff<=pCsr->nPage ){
12038           sqlite3_result_int64(ctx, get_uint32(&pCsr->aPage[iOff]));
12039         }
12040         break;
12041       }
12042     }
12043   }else{
12044     switch( i ){
12045       case DBDATA_COLUMN_PGNO:
12046         sqlite3_result_int64(ctx, pCsr->iPgno);
12047         break;
12048       case DBDATA_COLUMN_CELL:
12049         sqlite3_result_int(ctx, pCsr->iCell);
12050         break;
12051       case DBDATA_COLUMN_FIELD:
12052         sqlite3_result_int(ctx, pCsr->iField);
12053         break;
12054       case DBDATA_COLUMN_VALUE: {
12055         if( pCsr->iField<0 ){
12056           sqlite3_result_int64(ctx, pCsr->iIntkey);
12057         }else{
12058           sqlite3_int64 iType;
12059           dbdataGetVarint(pCsr->pHdrPtr, &iType);
12060           dbdataValue(
12061               ctx, iType, pCsr->pPtr, &pCsr->pRec[pCsr->nRec] - pCsr->pPtr
12062           );
12063         }
12064         break;
12065       }
12066     }
12067   }
12068   return SQLITE_OK;
12069 }
12070 
12071 /*
12072 ** Return the rowid for an sqlite_dbdata or sqlite_dptr table.
12073 */
12074 static int dbdataRowid(sqlite3_vtab_cursor *pCursor, sqlite_int64 *pRowid){
12075   DbdataCursor *pCsr = (DbdataCursor*)pCursor;
12076   *pRowid = pCsr->iRowid;
12077   return SQLITE_OK;
12078 }
12079 
12080 
12081 /*
12082 ** Invoke this routine to register the "sqlite_dbdata" virtual table module
12083 */
12084 static int sqlite3DbdataRegister(sqlite3 *db){
12085   static sqlite3_module dbdata_module = {
12086     0,                            /* iVersion */
12087     0,                            /* xCreate */
12088     dbdataConnect,                /* xConnect */
12089     dbdataBestIndex,              /* xBestIndex */
12090     dbdataDisconnect,             /* xDisconnect */
12091     0,                            /* xDestroy */
12092     dbdataOpen,                   /* xOpen - open a cursor */
12093     dbdataClose,                  /* xClose - close a cursor */
12094     dbdataFilter,                 /* xFilter - configure scan constraints */
12095     dbdataNext,                   /* xNext - advance a cursor */
12096     dbdataEof,                    /* xEof - check for end of scan */
12097     dbdataColumn,                 /* xColumn - read data */
12098     dbdataRowid,                  /* xRowid - read data */
12099     0,                            /* xUpdate */
12100     0,                            /* xBegin */
12101     0,                            /* xSync */
12102     0,                            /* xCommit */
12103     0,                            /* xRollback */
12104     0,                            /* xFindMethod */
12105     0,                            /* xRename */
12106     0,                            /* xSavepoint */
12107     0,                            /* xRelease */
12108     0,                            /* xRollbackTo */
12109     0                             /* xShadowName */
12110   };
12111 
12112   int rc = sqlite3_create_module(db, "sqlite_dbdata", &dbdata_module, 0);
12113   if( rc==SQLITE_OK ){
12114     rc = sqlite3_create_module(db, "sqlite_dbptr", &dbdata_module, (void*)1);
12115   }
12116   return rc;
12117 }
12118 
12119 #ifdef _WIN32
12120 
12121 #endif
12122 int sqlite3_dbdata_init(
12123   sqlite3 *db,
12124   char **pzErrMsg,
12125   const sqlite3_api_routines *pApi
12126 ){
12127   SQLITE_EXTENSION_INIT2(pApi);
12128   return sqlite3DbdataRegister(db);
12129 }
12130 
12131 /************************* End ../ext/misc/dbdata.c ********************/
12132 #endif
12133 
12134 #if defined(SQLITE_ENABLE_SESSION)
12135 /*
12136 ** State information for a single open session
12137 */
12138 typedef struct OpenSession OpenSession;
12139 struct OpenSession {
12140   char *zName;             /* Symbolic name for this session */
12141   int nFilter;             /* Number of xFilter rejection GLOB patterns */
12142   char **azFilter;         /* Array of xFilter rejection GLOB patterns */
12143   sqlite3_session *p;      /* The open session */
12144 };
12145 #endif
12146 
12147 typedef struct ExpertInfo ExpertInfo;
12148 struct ExpertInfo {
12149   sqlite3expert *pExpert;
12150   int bVerbose;
12151 };
12152 
12153 /* A single line in the EQP output */
12154 typedef struct EQPGraphRow EQPGraphRow;
12155 struct EQPGraphRow {
12156   int iEqpId;           /* ID for this row */
12157   int iParentId;        /* ID of the parent row */
12158   EQPGraphRow *pNext;   /* Next row in sequence */
12159   char zText[1];        /* Text to display for this row */
12160 };
12161 
12162 /* All EQP output is collected into an instance of the following */
12163 typedef struct EQPGraph EQPGraph;
12164 struct EQPGraph {
12165   EQPGraphRow *pRow;    /* Linked list of all rows of the EQP output */
12166   EQPGraphRow *pLast;   /* Last element of the pRow list */
12167   char zPrefix[100];    /* Graph prefix */
12168 };
12169 
12170 /* Parameters affecting columnar mode result display (defaulting together) */
12171 typedef struct ColModeOpts {
12172   int iWrap;            /* In columnar modes, wrap lines reaching this limit */
12173   u8 bQuote;            /* Quote results for .mode box and table */
12174   u8 bWordWrap;         /* In columnar modes, wrap at word boundaries  */
12175 } ColModeOpts;
12176 #define ColModeOpts_default { 60, 0, 0 }
12177 #define ColModeOpts_default_qbox { 60, 1, 0 }
12178 
12179 /*
12180 ** State information about the database connection is contained in an
12181 ** instance of the following structure.
12182 */
12183 typedef struct ShellState ShellState;
12184 struct ShellState {
12185   sqlite3 *db;           /* The database */
12186   u8 autoExplain;        /* Automatically turn on .explain mode */
12187   u8 autoEQP;            /* Run EXPLAIN QUERY PLAN prior to seach SQL stmt */
12188   u8 autoEQPtest;        /* autoEQP is in test mode */
12189   u8 autoEQPtrace;       /* autoEQP is in trace mode */
12190   u8 scanstatsOn;        /* True to display scan stats before each finalize */
12191   u8 openMode;           /* SHELL_OPEN_NORMAL, _APPENDVFS, or _ZIPFILE */
12192   u8 doXdgOpen;          /* Invoke start/open/xdg-open in output_reset() */
12193   u8 nEqpLevel;          /* Depth of the EQP output graph */
12194   u8 eTraceType;         /* SHELL_TRACE_* value for type of trace */
12195   u8 bSafeMode;          /* True to prohibit unsafe operations */
12196   u8 bSafeModePersist;   /* The long-term value of bSafeMode */
12197   ColModeOpts cmOpts;    /* Option values affecting columnar mode output */
12198   unsigned statsOn;      /* True to display memory stats before each finalize */
12199   unsigned mEqpLines;    /* Mask of veritical lines in the EQP output graph */
12200   int inputNesting;      /* Track nesting level of .read and other redirects */
12201   int outCount;          /* Revert to stdout when reaching zero */
12202   int cnt;               /* Number of records displayed so far */
12203   int lineno;            /* Line number of last line read from in */
12204   int openFlags;         /* Additional flags to open.  (SQLITE_OPEN_NOFOLLOW) */
12205   FILE *in;              /* Read commands from this stream */
12206   FILE *out;             /* Write results here */
12207   FILE *traceOut;        /* Output for sqlite3_trace() */
12208   int nErr;              /* Number of errors seen */
12209   int mode;              /* An output mode setting */
12210   int modePrior;         /* Saved mode */
12211   int cMode;             /* temporary output mode for the current query */
12212   int normalMode;        /* Output mode before ".explain on" */
12213   int writableSchema;    /* True if PRAGMA writable_schema=ON */
12214   int showHeader;        /* True to show column names in List or Column mode */
12215   int nCheck;            /* Number of ".check" commands run */
12216   unsigned nProgress;    /* Number of progress callbacks encountered */
12217   unsigned mxProgress;   /* Maximum progress callbacks before failing */
12218   unsigned flgProgress;  /* Flags for the progress callback */
12219   unsigned shellFlgs;    /* Various flags */
12220   unsigned priorShFlgs;  /* Saved copy of flags */
12221   sqlite3_int64 szMax;   /* --maxsize argument to .open */
12222   char *zDestTable;      /* Name of destination table when MODE_Insert */
12223   char *zTempFile;       /* Temporary file that might need deleting */
12224   char zTestcase[30];    /* Name of current test case */
12225   char colSeparator[20]; /* Column separator character for several modes */
12226   char rowSeparator[20]; /* Row separator character for MODE_Ascii */
12227   char colSepPrior[20];  /* Saved column separator */
12228   char rowSepPrior[20];  /* Saved row separator */
12229   int *colWidth;         /* Requested width of each column in columnar modes */
12230   int *actualWidth;      /* Actual width of each column */
12231   int nWidth;            /* Number of slots in colWidth[] and actualWidth[] */
12232   char nullValue[20];    /* The text to print when a NULL comes back from
12233                          ** the database */
12234   char outfile[FILENAME_MAX]; /* Filename for *out */
12235   sqlite3_stmt *pStmt;   /* Current statement if any. */
12236   FILE *pLog;            /* Write log output here */
12237   struct AuxDb {         /* Storage space for auxiliary database connections */
12238     sqlite3 *db;               /* Connection pointer */
12239     const char *zDbFilename;   /* Filename used to open the connection */
12240     char *zFreeOnClose;        /* Free this memory allocation on close */
12241 #if defined(SQLITE_ENABLE_SESSION)
12242     int nSession;              /* Number of active sessions */
12243     OpenSession aSession[4];   /* Array of sessions.  [0] is in focus. */
12244 #endif
12245   } aAuxDb[5],           /* Array of all database connections */
12246     *pAuxDb;             /* Currently active database connection */
12247   int *aiIndent;         /* Array of indents used in MODE_Explain */
12248   int nIndent;           /* Size of array aiIndent[] */
12249   int iIndent;           /* Index of current op in aiIndent[] */
12250   char *zNonce;          /* Nonce for temporary safe-mode excapes */
12251   EQPGraph sGraph;       /* Information for the graphical EXPLAIN QUERY PLAN */
12252   ExpertInfo expert;     /* Valid if previous command was ".expert OPT..." */
12253 #ifdef SQLITE_SHELL_WASM_MODE
12254   struct {
12255     const char * zInput; /* Input string from wasm/JS proxy */
12256     const char * zPos;   /* Cursor pos into zInput */
12257   } wasm;
12258 #endif
12259 };
12260 
12261 #ifdef SQLITE_SHELL_WASM_MODE
12262 static ShellState shellState;
12263 #endif
12264 
12265 
12266 /* Allowed values for ShellState.autoEQP
12267 */
12268 #define AUTOEQP_off      0           /* Automatic EXPLAIN QUERY PLAN is off */
12269 #define AUTOEQP_on       1           /* Automatic EQP is on */
12270 #define AUTOEQP_trigger  2           /* On and also show plans for triggers */
12271 #define AUTOEQP_full     3           /* Show full EXPLAIN */
12272 
12273 /* Allowed values for ShellState.openMode
12274 */
12275 #define SHELL_OPEN_UNSPEC      0      /* No open-mode specified */
12276 #define SHELL_OPEN_NORMAL      1      /* Normal database file */
12277 #define SHELL_OPEN_APPENDVFS   2      /* Use appendvfs */
12278 #define SHELL_OPEN_ZIPFILE     3      /* Use the zipfile virtual table */
12279 #define SHELL_OPEN_READONLY    4      /* Open a normal database read-only */
12280 #define SHELL_OPEN_DESERIALIZE 5      /* Open using sqlite3_deserialize() */
12281 #define SHELL_OPEN_HEXDB       6      /* Use "dbtotxt" output as data source */
12282 
12283 /* Allowed values for ShellState.eTraceType
12284 */
12285 #define SHELL_TRACE_PLAIN      0      /* Show input SQL text */
12286 #define SHELL_TRACE_EXPANDED   1      /* Show expanded SQL text */
12287 #define SHELL_TRACE_NORMALIZED 2      /* Show normalized SQL text */
12288 
12289 /* Bits in the ShellState.flgProgress variable */
12290 #define SHELL_PROGRESS_QUIET 0x01  /* Omit announcing every progress callback */
12291 #define SHELL_PROGRESS_RESET 0x02  /* Reset the count when the progres
12292                                    ** callback limit is reached, and for each
12293                                    ** top-level SQL statement */
12294 #define SHELL_PROGRESS_ONCE  0x04  /* Cancel the --limit after firing once */
12295 
12296 /*
12297 ** These are the allowed shellFlgs values
12298 */
12299 #define SHFLG_Pagecache      0x00000001 /* The --pagecache option is used */
12300 #define SHFLG_Lookaside      0x00000002 /* Lookaside memory is used */
12301 #define SHFLG_Backslash      0x00000004 /* The --backslash option is used */
12302 #define SHFLG_PreserveRowid  0x00000008 /* .dump preserves rowid values */
12303 #define SHFLG_Newlines       0x00000010 /* .dump --newline flag */
12304 #define SHFLG_CountChanges   0x00000020 /* .changes setting */
12305 #define SHFLG_Echo           0x00000040 /* .echo on/off, or --echo setting */
12306 #define SHFLG_HeaderSet      0x00000080 /* showHeader has been specified */
12307 #define SHFLG_DumpDataOnly   0x00000100 /* .dump show data only */
12308 #define SHFLG_DumpNoSys      0x00000200 /* .dump omits system tables */
12309 
12310 /*
12311 ** Macros for testing and setting shellFlgs
12312 */
12313 #define ShellHasFlag(P,X)    (((P)->shellFlgs & (X))!=0)
12314 #define ShellSetFlag(P,X)    ((P)->shellFlgs|=(X))
12315 #define ShellClearFlag(P,X)  ((P)->shellFlgs&=(~(X)))
12316 
12317 /*
12318 ** These are the allowed modes.
12319 */
12320 #define MODE_Line     0  /* One column per line.  Blank line between records */
12321 #define MODE_Column   1  /* One record per line in neat columns */
12322 #define MODE_List     2  /* One record per line with a separator */
12323 #define MODE_Semi     3  /* Same as MODE_List but append ";" to each line */
12324 #define MODE_Html     4  /* Generate an XHTML table */
12325 #define MODE_Insert   5  /* Generate SQL "insert" statements */
12326 #define MODE_Quote    6  /* Quote values as for SQL */
12327 #define MODE_Tcl      7  /* Generate ANSI-C or TCL quoted elements */
12328 #define MODE_Csv      8  /* Quote strings, numbers are plain */
12329 #define MODE_Explain  9  /* Like MODE_Column, but do not truncate data */
12330 #define MODE_Ascii   10  /* Use ASCII unit and record separators (0x1F/0x1E) */
12331 #define MODE_Pretty  11  /* Pretty-print schemas */
12332 #define MODE_EQP     12  /* Converts EXPLAIN QUERY PLAN output into a graph */
12333 #define MODE_Json    13  /* Output JSON */
12334 #define MODE_Markdown 14 /* Markdown formatting */
12335 #define MODE_Table   15  /* MySQL-style table formatting */
12336 #define MODE_Box     16  /* Unicode box-drawing characters */
12337 #define MODE_Count   17  /* Output only a count of the rows of output */
12338 #define MODE_Off     18  /* No query output shown */
12339 
12340 static const char *modeDescr[] = {
12341   "line",
12342   "column",
12343   "list",
12344   "semi",
12345   "html",
12346   "insert",
12347   "quote",
12348   "tcl",
12349   "csv",
12350   "explain",
12351   "ascii",
12352   "prettyprint",
12353   "eqp",
12354   "json",
12355   "markdown",
12356   "table",
12357   "box",
12358   "count",
12359   "off"
12360 };
12361 
12362 /*
12363 ** These are the column/row/line separators used by the various
12364 ** import/export modes.
12365 */
12366 #define SEP_Column    "|"
12367 #define SEP_Row       "\n"
12368 #define SEP_Tab       "\t"
12369 #define SEP_Space     " "
12370 #define SEP_Comma     ","
12371 #define SEP_CrLf      "\r\n"
12372 #define SEP_Unit      "\x1F"
12373 #define SEP_Record    "\x1E"
12374 
12375 /*
12376 ** Limit input nesting via .read or any other input redirect.
12377 ** It's not too expensive, so a generous allowance can be made.
12378 */
12379 #define MAX_INPUT_NESTING 25
12380 
12381 /*
12382 ** A callback for the sqlite3_log() interface.
12383 */
12384 static void shellLog(void *pArg, int iErrCode, const char *zMsg){
12385   ShellState *p = (ShellState*)pArg;
12386   if( p->pLog==0 ) return;
12387   utf8_printf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
12388   fflush(p->pLog);
12389 }
12390 
12391 /*
12392 ** SQL function:  shell_putsnl(X)
12393 **
12394 ** Write the text X to the screen (or whatever output is being directed)
12395 ** adding a newline at the end, and then return X.
12396 */
12397 static void shellPutsFunc(
12398   sqlite3_context *pCtx,
12399   int nVal,
12400   sqlite3_value **apVal
12401 ){
12402   ShellState *p = (ShellState*)sqlite3_user_data(pCtx);
12403   (void)nVal;
12404   utf8_printf(p->out, "%s\n", sqlite3_value_text(apVal[0]));
12405   sqlite3_result_value(pCtx, apVal[0]);
12406 }
12407 
12408 /*
12409 ** If in safe mode, print an error message described by the arguments
12410 ** and exit immediately.
12411 */
12412 static void failIfSafeMode(
12413   ShellState *p,
12414   const char *zErrMsg,
12415   ...
12416 ){
12417   if( p->bSafeMode ){
12418     va_list ap;
12419     char *zMsg;
12420     va_start(ap, zErrMsg);
12421     zMsg = sqlite3_vmprintf(zErrMsg, ap);
12422     va_end(ap);
12423     raw_printf(stderr, "line %d: ", p->lineno);
12424     utf8_printf(stderr, "%s\n", zMsg);
12425     exit(1);
12426   }
12427 }
12428 
12429 /*
12430 ** SQL function:   edit(VALUE)
12431 **                 edit(VALUE,EDITOR)
12432 **
12433 ** These steps:
12434 **
12435 **     (1) Write VALUE into a temporary file.
12436 **     (2) Run program EDITOR on that temporary file.
12437 **     (3) Read the temporary file back and return its content as the result.
12438 **     (4) Delete the temporary file
12439 **
12440 ** If the EDITOR argument is omitted, use the value in the VISUAL
12441 ** environment variable.  If still there is no EDITOR, through an error.
12442 **
12443 ** Also throw an error if the EDITOR program returns a non-zero exit code.
12444 */
12445 #ifndef SQLITE_NOHAVE_SYSTEM
12446 static void editFunc(
12447   sqlite3_context *context,
12448   int argc,
12449   sqlite3_value **argv
12450 ){
12451   const char *zEditor;
12452   char *zTempFile = 0;
12453   sqlite3 *db;
12454   char *zCmd = 0;
12455   int bBin;
12456   int rc;
12457   int hasCRNL = 0;
12458   FILE *f = 0;
12459   sqlite3_int64 sz;
12460   sqlite3_int64 x;
12461   unsigned char *p = 0;
12462 
12463   if( argc==2 ){
12464     zEditor = (const char*)sqlite3_value_text(argv[1]);
12465   }else{
12466     zEditor = getenv("VISUAL");
12467   }
12468   if( zEditor==0 ){
12469     sqlite3_result_error(context, "no editor for edit()", -1);
12470     return;
12471   }
12472   if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
12473     sqlite3_result_error(context, "NULL input to edit()", -1);
12474     return;
12475   }
12476   db = sqlite3_context_db_handle(context);
12477   zTempFile = 0;
12478   sqlite3_file_control(db, 0, SQLITE_FCNTL_TEMPFILENAME, &zTempFile);
12479   if( zTempFile==0 ){
12480     sqlite3_uint64 r = 0;
12481     sqlite3_randomness(sizeof(r), &r);
12482     zTempFile = sqlite3_mprintf("temp%llx", r);
12483     if( zTempFile==0 ){
12484       sqlite3_result_error_nomem(context);
12485       return;
12486     }
12487   }
12488   bBin = sqlite3_value_type(argv[0])==SQLITE_BLOB;
12489   /* When writing the file to be edited, do \n to \r\n conversions on systems
12490   ** that want \r\n line endings */
12491   f = fopen(zTempFile, bBin ? "wb" : "w");
12492   if( f==0 ){
12493     sqlite3_result_error(context, "edit() cannot open temp file", -1);
12494     goto edit_func_end;
12495   }
12496   sz = sqlite3_value_bytes(argv[0]);
12497   if( bBin ){
12498     x = fwrite(sqlite3_value_blob(argv[0]), 1, (size_t)sz, f);
12499   }else{
12500     const char *z = (const char*)sqlite3_value_text(argv[0]);
12501     /* Remember whether or not the value originally contained \r\n */
12502     if( z && strstr(z,"\r\n")!=0 ) hasCRNL = 1;
12503     x = fwrite(sqlite3_value_text(argv[0]), 1, (size_t)sz, f);
12504   }
12505   fclose(f);
12506   f = 0;
12507   if( x!=sz ){
12508     sqlite3_result_error(context, "edit() could not write the whole file", -1);
12509     goto edit_func_end;
12510   }
12511   zCmd = sqlite3_mprintf("%s \"%s\"", zEditor, zTempFile);
12512   if( zCmd==0 ){
12513     sqlite3_result_error_nomem(context);
12514     goto edit_func_end;
12515   }
12516   rc = system(zCmd);
12517   sqlite3_free(zCmd);
12518   if( rc ){
12519     sqlite3_result_error(context, "EDITOR returned non-zero", -1);
12520     goto edit_func_end;
12521   }
12522   f = fopen(zTempFile, "rb");
12523   if( f==0 ){
12524     sqlite3_result_error(context,
12525       "edit() cannot reopen temp file after edit", -1);
12526     goto edit_func_end;
12527   }
12528   fseek(f, 0, SEEK_END);
12529   sz = ftell(f);
12530   rewind(f);
12531   p = sqlite3_malloc64( sz+1 );
12532   if( p==0 ){
12533     sqlite3_result_error_nomem(context);
12534     goto edit_func_end;
12535   }
12536   x = fread(p, 1, (size_t)sz, f);
12537   fclose(f);
12538   f = 0;
12539   if( x!=sz ){
12540     sqlite3_result_error(context, "could not read back the whole file", -1);
12541     goto edit_func_end;
12542   }
12543   if( bBin ){
12544     sqlite3_result_blob64(context, p, sz, sqlite3_free);
12545   }else{
12546     sqlite3_int64 i, j;
12547     if( hasCRNL ){
12548       /* If the original contains \r\n then do no conversions back to \n */
12549     }else{
12550       /* If the file did not originally contain \r\n then convert any new
12551       ** \r\n back into \n */
12552       for(i=j=0; i<sz; i++){
12553         if( p[i]=='\r' && p[i+1]=='\n' ) i++;
12554         p[j++] = p[i];
12555       }
12556       sz = j;
12557       p[sz] = 0;
12558     }
12559     sqlite3_result_text64(context, (const char*)p, sz,
12560                           sqlite3_free, SQLITE_UTF8);
12561   }
12562   p = 0;
12563 
12564 edit_func_end:
12565   if( f ) fclose(f);
12566   unlink(zTempFile);
12567   sqlite3_free(zTempFile);
12568   sqlite3_free(p);
12569 }
12570 #endif /* SQLITE_NOHAVE_SYSTEM */
12571 
12572 /*
12573 ** Save or restore the current output mode
12574 */
12575 static void outputModePush(ShellState *p){
12576   p->modePrior = p->mode;
12577   p->priorShFlgs = p->shellFlgs;
12578   memcpy(p->colSepPrior, p->colSeparator, sizeof(p->colSeparator));
12579   memcpy(p->rowSepPrior, p->rowSeparator, sizeof(p->rowSeparator));
12580 }
12581 static void outputModePop(ShellState *p){
12582   p->mode = p->modePrior;
12583   p->shellFlgs = p->priorShFlgs;
12584   memcpy(p->colSeparator, p->colSepPrior, sizeof(p->colSeparator));
12585   memcpy(p->rowSeparator, p->rowSepPrior, sizeof(p->rowSeparator));
12586 }
12587 
12588 /*
12589 ** Output the given string as a hex-encoded blob (eg. X'1234' )
12590 */
12591 static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
12592   int i;
12593   char *zBlob = (char *)pBlob;
12594   raw_printf(out,"X'");
12595   for(i=0; i<nBlob; i++){ raw_printf(out,"%02x",zBlob[i]&0xff); }
12596   raw_printf(out,"'");
12597 }
12598 
12599 /*
12600 ** Find a string that is not found anywhere in z[].  Return a pointer
12601 ** to that string.
12602 **
12603 ** Try to use zA and zB first.  If both of those are already found in z[]
12604 ** then make up some string and store it in the buffer zBuf.
12605 */
12606 static const char *unused_string(
12607   const char *z,                    /* Result must not appear anywhere in z */
12608   const char *zA, const char *zB,   /* Try these first */
12609   char *zBuf                        /* Space to store a generated string */
12610 ){
12611   unsigned i = 0;
12612   if( strstr(z, zA)==0 ) return zA;
12613   if( strstr(z, zB)==0 ) return zB;
12614   do{
12615     sqlite3_snprintf(20,zBuf,"(%s%u)", zA, i++);
12616   }while( strstr(z,zBuf)!=0 );
12617   return zBuf;
12618 }
12619 
12620 /*
12621 ** Output the given string as a quoted string using SQL quoting conventions.
12622 **
12623 ** See also: output_quoted_escaped_string()
12624 */
12625 static void output_quoted_string(FILE *out, const char *z){
12626   int i;
12627   char c;
12628   setBinaryMode(out, 1);
12629   for(i=0; (c = z[i])!=0 && c!='\''; i++){}
12630   if( c==0 ){
12631     utf8_printf(out,"'%s'",z);
12632   }else{
12633     raw_printf(out, "'");
12634     while( *z ){
12635       for(i=0; (c = z[i])!=0 && c!='\''; i++){}
12636       if( c=='\'' ) i++;
12637       if( i ){
12638         utf8_printf(out, "%.*s", i, z);
12639         z += i;
12640       }
12641       if( c=='\'' ){
12642         raw_printf(out, "'");
12643         continue;
12644       }
12645       if( c==0 ){
12646         break;
12647       }
12648       z++;
12649     }
12650     raw_printf(out, "'");
12651   }
12652   setTextMode(out, 1);
12653 }
12654 
12655 /*
12656 ** Output the given string as a quoted string using SQL quoting conventions.
12657 ** Additionallly , escape the "\n" and "\r" characters so that they do not
12658 ** get corrupted by end-of-line translation facilities in some operating
12659 ** systems.
12660 **
12661 ** This is like output_quoted_string() but with the addition of the \r\n
12662 ** escape mechanism.
12663 */
12664 static void output_quoted_escaped_string(FILE *out, const char *z){
12665   int i;
12666   char c;
12667   setBinaryMode(out, 1);
12668   for(i=0; (c = z[i])!=0 && c!='\'' && c!='\n' && c!='\r'; i++){}
12669   if( c==0 ){
12670     utf8_printf(out,"'%s'",z);
12671   }else{
12672     const char *zNL = 0;
12673     const char *zCR = 0;
12674     int nNL = 0;
12675     int nCR = 0;
12676     char zBuf1[20], zBuf2[20];
12677     for(i=0; z[i]; i++){
12678       if( z[i]=='\n' ) nNL++;
12679       if( z[i]=='\r' ) nCR++;
12680     }
12681     if( nNL ){
12682       raw_printf(out, "replace(");
12683       zNL = unused_string(z, "\\n", "\\012", zBuf1);
12684     }
12685     if( nCR ){
12686       raw_printf(out, "replace(");
12687       zCR = unused_string(z, "\\r", "\\015", zBuf2);
12688     }
12689     raw_printf(out, "'");
12690     while( *z ){
12691       for(i=0; (c = z[i])!=0 && c!='\n' && c!='\r' && c!='\''; i++){}
12692       if( c=='\'' ) i++;
12693       if( i ){
12694         utf8_printf(out, "%.*s", i, z);
12695         z += i;
12696       }
12697       if( c=='\'' ){
12698         raw_printf(out, "'");
12699         continue;
12700       }
12701       if( c==0 ){
12702         break;
12703       }
12704       z++;
12705       if( c=='\n' ){
12706         raw_printf(out, "%s", zNL);
12707         continue;
12708       }
12709       raw_printf(out, "%s", zCR);
12710     }
12711     raw_printf(out, "'");
12712     if( nCR ){
12713       raw_printf(out, ",'%s',char(13))", zCR);
12714     }
12715     if( nNL ){
12716       raw_printf(out, ",'%s',char(10))", zNL);
12717     }
12718   }
12719   setTextMode(out, 1);
12720 }
12721 
12722 /*
12723 ** Output the given string as a quoted according to C or TCL quoting rules.
12724 */
12725 static void output_c_string(FILE *out, const char *z){
12726   unsigned int c;
12727   fputc('"', out);
12728   while( (c = *(z++))!=0 ){
12729     if( c=='\\' ){
12730       fputc(c, out);
12731       fputc(c, out);
12732     }else if( c=='"' ){
12733       fputc('\\', out);
12734       fputc('"', out);
12735     }else if( c=='\t' ){
12736       fputc('\\', out);
12737       fputc('t', out);
12738     }else if( c=='\n' ){
12739       fputc('\\', out);
12740       fputc('n', out);
12741     }else if( c=='\r' ){
12742       fputc('\\', out);
12743       fputc('r', out);
12744     }else if( !isprint(c&0xff) ){
12745       raw_printf(out, "\\%03o", c&0xff);
12746     }else{
12747       fputc(c, out);
12748     }
12749   }
12750   fputc('"', out);
12751 }
12752 
12753 /*
12754 ** Output the given string as a quoted according to JSON quoting rules.
12755 */
12756 static void output_json_string(FILE *out, const char *z, int n){
12757   unsigned int c;
12758   if( n<0 ) n = (int)strlen(z);
12759   fputc('"', out);
12760   while( n-- ){
12761     c = *(z++);
12762     if( c=='\\' || c=='"' ){
12763       fputc('\\', out);
12764       fputc(c, out);
12765     }else if( c<=0x1f ){
12766       fputc('\\', out);
12767       if( c=='\b' ){
12768         fputc('b', out);
12769       }else if( c=='\f' ){
12770         fputc('f', out);
12771       }else if( c=='\n' ){
12772         fputc('n', out);
12773       }else if( c=='\r' ){
12774         fputc('r', out);
12775       }else if( c=='\t' ){
12776         fputc('t', out);
12777       }else{
12778          raw_printf(out, "u%04x",c);
12779       }
12780     }else{
12781       fputc(c, out);
12782     }
12783   }
12784   fputc('"', out);
12785 }
12786 
12787 /*
12788 ** Output the given string with characters that are special to
12789 ** HTML escaped.
12790 */
12791 static void output_html_string(FILE *out, const char *z){
12792   int i;
12793   if( z==0 ) z = "";
12794   while( *z ){
12795     for(i=0;   z[i]
12796             && z[i]!='<'
12797             && z[i]!='&'
12798             && z[i]!='>'
12799             && z[i]!='\"'
12800             && z[i]!='\'';
12801         i++){}
12802     if( i>0 ){
12803       utf8_printf(out,"%.*s",i,z);
12804     }
12805     if( z[i]=='<' ){
12806       raw_printf(out,"&lt;");
12807     }else if( z[i]=='&' ){
12808       raw_printf(out,"&amp;");
12809     }else if( z[i]=='>' ){
12810       raw_printf(out,"&gt;");
12811     }else if( z[i]=='\"' ){
12812       raw_printf(out,"&quot;");
12813     }else if( z[i]=='\'' ){
12814       raw_printf(out,"&#39;");
12815     }else{
12816       break;
12817     }
12818     z += i + 1;
12819   }
12820 }
12821 
12822 /*
12823 ** If a field contains any character identified by a 1 in the following
12824 ** array, then the string must be quoted for CSV.
12825 */
12826 static const char needCsvQuote[] = {
12827   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
12828   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
12829   1, 0, 1, 0, 0, 0, 0, 1,   0, 0, 0, 0, 0, 0, 0, 0,
12830   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
12831   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
12832   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
12833   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
12834   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 1,
12835   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
12836   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
12837   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
12838   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
12839   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
12840   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
12841   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
12842   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
12843 };
12844 
12845 /*
12846 ** Output a single term of CSV.  Actually, p->colSeparator is used for
12847 ** the separator, which may or may not be a comma.  p->nullValue is
12848 ** the null value.  Strings are quoted if necessary.  The separator
12849 ** is only issued if bSep is true.
12850 */
12851 static void output_csv(ShellState *p, const char *z, int bSep){
12852   FILE *out = p->out;
12853   if( z==0 ){
12854     utf8_printf(out,"%s",p->nullValue);
12855   }else{
12856     unsigned i;
12857     for(i=0; z[i]; i++){
12858       if( needCsvQuote[((unsigned char*)z)[i]] ){
12859         i = 0;
12860         break;
12861       }
12862     }
12863     if( i==0 || strstr(z, p->colSeparator)!=0 ){
12864       char *zQuoted = sqlite3_mprintf("\"%w\"", z);
12865       shell_check_oom(zQuoted);
12866       utf8_printf(out, "%s", zQuoted);
12867       sqlite3_free(zQuoted);
12868     }else{
12869       utf8_printf(out, "%s", z);
12870     }
12871   }
12872   if( bSep ){
12873     utf8_printf(p->out, "%s", p->colSeparator);
12874   }
12875 }
12876 
12877 /*
12878 ** This routine runs when the user presses Ctrl-C
12879 */
12880 static void interrupt_handler(int NotUsed){
12881   UNUSED_PARAMETER(NotUsed);
12882   seenInterrupt++;
12883   if( seenInterrupt>2 ) exit(1);
12884   if( globalDb ) sqlite3_interrupt(globalDb);
12885 }
12886 
12887 #if (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE)
12888 /*
12889 ** This routine runs for console events (e.g. Ctrl-C) on Win32
12890 */
12891 static BOOL WINAPI ConsoleCtrlHandler(
12892   DWORD dwCtrlType /* One of the CTRL_*_EVENT constants */
12893 ){
12894   if( dwCtrlType==CTRL_C_EVENT ){
12895     interrupt_handler(0);
12896     return TRUE;
12897   }
12898   return FALSE;
12899 }
12900 #endif
12901 
12902 #ifndef SQLITE_OMIT_AUTHORIZATION
12903 /*
12904 ** This authorizer runs in safe mode.
12905 */
12906 static int safeModeAuth(
12907   void *pClientData,
12908   int op,
12909   const char *zA1,
12910   const char *zA2,
12911   const char *zA3,
12912   const char *zA4
12913 ){
12914   ShellState *p = (ShellState*)pClientData;
12915   static const char *azProhibitedFunctions[] = {
12916     "edit",
12917     "fts3_tokenizer",
12918     "load_extension",
12919     "readfile",
12920     "writefile",
12921     "zipfile",
12922     "zipfile_cds",
12923   };
12924   UNUSED_PARAMETER(zA2);
12925   UNUSED_PARAMETER(zA3);
12926   UNUSED_PARAMETER(zA4);
12927   switch( op ){
12928     case SQLITE_ATTACH: {
12929 #ifndef SQLITE_SHELL_WASM_MODE
12930       /* In WASM builds the filesystem is a virtual sandbox, so
12931       ** there's no harm in using ATTACH. */
12932       failIfSafeMode(p, "cannot run ATTACH in safe mode");
12933 #endif
12934       break;
12935     }
12936     case SQLITE_FUNCTION: {
12937       int i;
12938       for(i=0; i<ArraySize(azProhibitedFunctions); i++){
12939         if( sqlite3_stricmp(zA1, azProhibitedFunctions[i])==0 ){
12940           failIfSafeMode(p, "cannot use the %s() function in safe mode",
12941                          azProhibitedFunctions[i]);
12942         }
12943       }
12944       break;
12945     }
12946   }
12947   return SQLITE_OK;
12948 }
12949 
12950 /*
12951 ** When the ".auth ON" is set, the following authorizer callback is
12952 ** invoked.  It always returns SQLITE_OK.
12953 */
12954 static int shellAuth(
12955   void *pClientData,
12956   int op,
12957   const char *zA1,
12958   const char *zA2,
12959   const char *zA3,
12960   const char *zA4
12961 ){
12962   ShellState *p = (ShellState*)pClientData;
12963   static const char *azAction[] = { 0,
12964      "CREATE_INDEX",         "CREATE_TABLE",         "CREATE_TEMP_INDEX",
12965      "CREATE_TEMP_TABLE",    "CREATE_TEMP_TRIGGER",  "CREATE_TEMP_VIEW",
12966      "CREATE_TRIGGER",       "CREATE_VIEW",          "DELETE",
12967      "DROP_INDEX",           "DROP_TABLE",           "DROP_TEMP_INDEX",
12968      "DROP_TEMP_TABLE",      "DROP_TEMP_TRIGGER",    "DROP_TEMP_VIEW",
12969      "DROP_TRIGGER",         "DROP_VIEW",            "INSERT",
12970      "PRAGMA",               "READ",                 "SELECT",
12971      "TRANSACTION",          "UPDATE",               "ATTACH",
12972      "DETACH",               "ALTER_TABLE",          "REINDEX",
12973      "ANALYZE",              "CREATE_VTABLE",        "DROP_VTABLE",
12974      "FUNCTION",             "SAVEPOINT",            "RECURSIVE"
12975   };
12976   int i;
12977   const char *az[4];
12978   az[0] = zA1;
12979   az[1] = zA2;
12980   az[2] = zA3;
12981   az[3] = zA4;
12982   utf8_printf(p->out, "authorizer: %s", azAction[op]);
12983   for(i=0; i<4; i++){
12984     raw_printf(p->out, " ");
12985     if( az[i] ){
12986       output_c_string(p->out, az[i]);
12987     }else{
12988       raw_printf(p->out, "NULL");
12989     }
12990   }
12991   raw_printf(p->out, "\n");
12992   if( p->bSafeMode ) (void)safeModeAuth(pClientData, op, zA1, zA2, zA3, zA4);
12993   return SQLITE_OK;
12994 }
12995 #endif
12996 
12997 /*
12998 ** Print a schema statement.  Part of MODE_Semi and MODE_Pretty output.
12999 **
13000 ** This routine converts some CREATE TABLE statements for shadow tables
13001 ** in FTS3/4/5 into CREATE TABLE IF NOT EXISTS statements.
13002 */
13003 static void printSchemaLine(FILE *out, const char *z, const char *zTail){
13004   if( z==0 ) return;
13005   if( zTail==0 ) return;
13006   if( sqlite3_strglob("CREATE TABLE ['\"]*", z)==0 ){
13007     utf8_printf(out, "CREATE TABLE IF NOT EXISTS %s%s", z+13, zTail);
13008   }else{
13009     utf8_printf(out, "%s%s", z, zTail);
13010   }
13011 }
13012 static void printSchemaLineN(FILE *out, char *z, int n, const char *zTail){
13013   char c = z[n];
13014   z[n] = 0;
13015   printSchemaLine(out, z, zTail);
13016   z[n] = c;
13017 }
13018 
13019 /*
13020 ** Return true if string z[] has nothing but whitespace and comments to the
13021 ** end of the first line.
13022 */
13023 static int wsToEol(const char *z){
13024   int i;
13025   for(i=0; z[i]; i++){
13026     if( z[i]=='\n' ) return 1;
13027     if( IsSpace(z[i]) ) continue;
13028     if( z[i]=='-' && z[i+1]=='-' ) return 1;
13029     return 0;
13030   }
13031   return 1;
13032 }
13033 
13034 /*
13035 ** Add a new entry to the EXPLAIN QUERY PLAN data
13036 */
13037 static void eqp_append(ShellState *p, int iEqpId, int p2, const char *zText){
13038   EQPGraphRow *pNew;
13039   int nText = strlen30(zText);
13040   if( p->autoEQPtest ){
13041     utf8_printf(p->out, "%d,%d,%s\n", iEqpId, p2, zText);
13042   }
13043   pNew = sqlite3_malloc64( sizeof(*pNew) + nText );
13044   shell_check_oom(pNew);
13045   pNew->iEqpId = iEqpId;
13046   pNew->iParentId = p2;
13047   memcpy(pNew->zText, zText, nText+1);
13048   pNew->pNext = 0;
13049   if( p->sGraph.pLast ){
13050     p->sGraph.pLast->pNext = pNew;
13051   }else{
13052     p->sGraph.pRow = pNew;
13053   }
13054   p->sGraph.pLast = pNew;
13055 }
13056 
13057 /*
13058 ** Free and reset the EXPLAIN QUERY PLAN data that has been collected
13059 ** in p->sGraph.
13060 */
13061 static void eqp_reset(ShellState *p){
13062   EQPGraphRow *pRow, *pNext;
13063   for(pRow = p->sGraph.pRow; pRow; pRow = pNext){
13064     pNext = pRow->pNext;
13065     sqlite3_free(pRow);
13066   }
13067   memset(&p->sGraph, 0, sizeof(p->sGraph));
13068 }
13069 
13070 /* Return the next EXPLAIN QUERY PLAN line with iEqpId that occurs after
13071 ** pOld, or return the first such line if pOld is NULL
13072 */
13073 static EQPGraphRow *eqp_next_row(ShellState *p, int iEqpId, EQPGraphRow *pOld){
13074   EQPGraphRow *pRow = pOld ? pOld->pNext : p->sGraph.pRow;
13075   while( pRow && pRow->iParentId!=iEqpId ) pRow = pRow->pNext;
13076   return pRow;
13077 }
13078 
13079 /* Render a single level of the graph that has iEqpId as its parent.  Called
13080 ** recursively to render sublevels.
13081 */
13082 static void eqp_render_level(ShellState *p, int iEqpId){
13083   EQPGraphRow *pRow, *pNext;
13084   int n = strlen30(p->sGraph.zPrefix);
13085   char *z;
13086   for(pRow = eqp_next_row(p, iEqpId, 0); pRow; pRow = pNext){
13087     pNext = eqp_next_row(p, iEqpId, pRow);
13088     z = pRow->zText;
13089     utf8_printf(p->out, "%s%s%s\n", p->sGraph.zPrefix,
13090                 pNext ? "|--" : "`--", z);
13091     if( n<(int)sizeof(p->sGraph.zPrefix)-7 ){
13092       memcpy(&p->sGraph.zPrefix[n], pNext ? "|  " : "   ", 4);
13093       eqp_render_level(p, pRow->iEqpId);
13094       p->sGraph.zPrefix[n] = 0;
13095     }
13096   }
13097 }
13098 
13099 /*
13100 ** Display and reset the EXPLAIN QUERY PLAN data
13101 */
13102 static void eqp_render(ShellState *p){
13103   EQPGraphRow *pRow = p->sGraph.pRow;
13104   if( pRow ){
13105     if( pRow->zText[0]=='-' ){
13106       if( pRow->pNext==0 ){
13107         eqp_reset(p);
13108         return;
13109       }
13110       utf8_printf(p->out, "%s\n", pRow->zText+3);
13111       p->sGraph.pRow = pRow->pNext;
13112       sqlite3_free(pRow);
13113     }else{
13114       utf8_printf(p->out, "QUERY PLAN\n");
13115     }
13116     p->sGraph.zPrefix[0] = 0;
13117     eqp_render_level(p, 0);
13118     eqp_reset(p);
13119   }
13120 }
13121 
13122 #ifndef SQLITE_OMIT_PROGRESS_CALLBACK
13123 /*
13124 ** Progress handler callback.
13125 */
13126 static int progress_handler(void *pClientData) {
13127   ShellState *p = (ShellState*)pClientData;
13128   p->nProgress++;
13129   if( p->nProgress>=p->mxProgress && p->mxProgress>0 ){
13130     raw_printf(p->out, "Progress limit reached (%u)\n", p->nProgress);
13131     if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0;
13132     if( p->flgProgress & SHELL_PROGRESS_ONCE ) p->mxProgress = 0;
13133     return 1;
13134   }
13135   if( (p->flgProgress & SHELL_PROGRESS_QUIET)==0 ){
13136     raw_printf(p->out, "Progress %u\n", p->nProgress);
13137   }
13138   return 0;
13139 }
13140 #endif /* SQLITE_OMIT_PROGRESS_CALLBACK */
13141 
13142 /*
13143 ** Print N dashes
13144 */
13145 static void print_dashes(FILE *out, int N){
13146   const char zDash[] = "--------------------------------------------------";
13147   const int nDash = sizeof(zDash) - 1;
13148   while( N>nDash ){
13149     fputs(zDash, out);
13150     N -= nDash;
13151   }
13152   raw_printf(out, "%.*s", N, zDash);
13153 }
13154 
13155 /*
13156 ** Print a markdown or table-style row separator using ascii-art
13157 */
13158 static void print_row_separator(
13159   ShellState *p,
13160   int nArg,
13161   const char *zSep
13162 ){
13163   int i;
13164   if( nArg>0 ){
13165     fputs(zSep, p->out);
13166     print_dashes(p->out, p->actualWidth[0]+2);
13167     for(i=1; i<nArg; i++){
13168       fputs(zSep, p->out);
13169       print_dashes(p->out, p->actualWidth[i]+2);
13170     }
13171     fputs(zSep, p->out);
13172   }
13173   fputs("\n", p->out);
13174 }
13175 
13176 /*
13177 ** This is the callback routine that the shell
13178 ** invokes for each row of a query result.
13179 */
13180 static int shell_callback(
13181   void *pArg,
13182   int nArg,        /* Number of result columns */
13183   char **azArg,    /* Text of each result column */
13184   char **azCol,    /* Column names */
13185   int *aiType      /* Column types.  Might be NULL */
13186 ){
13187   int i;
13188   ShellState *p = (ShellState*)pArg;
13189 
13190   if( azArg==0 ) return 0;
13191   switch( p->cMode ){
13192     case MODE_Count:
13193     case MODE_Off: {
13194       break;
13195     }
13196     case MODE_Line: {
13197       int w = 5;
13198       if( azArg==0 ) break;
13199       for(i=0; i<nArg; i++){
13200         int len = strlen30(azCol[i] ? azCol[i] : "");
13201         if( len>w ) w = len;
13202       }
13203       if( p->cnt++>0 ) utf8_printf(p->out, "%s", p->rowSeparator);
13204       for(i=0; i<nArg; i++){
13205         utf8_printf(p->out,"%*s = %s%s", w, azCol[i],
13206                 azArg[i] ? azArg[i] : p->nullValue, p->rowSeparator);
13207       }
13208       break;
13209     }
13210     case MODE_Explain: {
13211       static const int aExplainWidth[] = {4, 13, 4, 4, 4, 13, 2, 13};
13212       if( nArg>ArraySize(aExplainWidth) ){
13213         nArg = ArraySize(aExplainWidth);
13214       }
13215       if( p->cnt++==0 ){
13216         for(i=0; i<nArg; i++){
13217           int w = aExplainWidth[i];
13218           utf8_width_print(p->out, w, azCol[i]);
13219           fputs(i==nArg-1 ? "\n" : "  ", p->out);
13220         }
13221         for(i=0; i<nArg; i++){
13222           int w = aExplainWidth[i];
13223           print_dashes(p->out, w);
13224           fputs(i==nArg-1 ? "\n" : "  ", p->out);
13225         }
13226       }
13227       if( azArg==0 ) break;
13228       for(i=0; i<nArg; i++){
13229         int w = aExplainWidth[i];
13230         if( i==nArg-1 ) w = 0;
13231         if( azArg[i] && strlenChar(azArg[i])>w ){
13232           w = strlenChar(azArg[i]);
13233         }
13234         if( i==1 && p->aiIndent && p->pStmt ){
13235           if( p->iIndent<p->nIndent ){
13236             utf8_printf(p->out, "%*.s", p->aiIndent[p->iIndent], "");
13237           }
13238           p->iIndent++;
13239         }
13240         utf8_width_print(p->out, w, azArg[i] ? azArg[i] : p->nullValue);
13241         fputs(i==nArg-1 ? "\n" : "  ", p->out);
13242       }
13243       break;
13244     }
13245     case MODE_Semi: {   /* .schema and .fullschema output */
13246       printSchemaLine(p->out, azArg[0], ";\n");
13247       break;
13248     }
13249     case MODE_Pretty: {  /* .schema and .fullschema with --indent */
13250       char *z;
13251       int j;
13252       int nParen = 0;
13253       char cEnd = 0;
13254       char c;
13255       int nLine = 0;
13256       assert( nArg==1 );
13257       if( azArg[0]==0 ) break;
13258       if( sqlite3_strlike("CREATE VIEW%", azArg[0], 0)==0
13259        || sqlite3_strlike("CREATE TRIG%", azArg[0], 0)==0
13260       ){
13261         utf8_printf(p->out, "%s;\n", azArg[0]);
13262         break;
13263       }
13264       z = sqlite3_mprintf("%s", azArg[0]);
13265       shell_check_oom(z);
13266       j = 0;
13267       for(i=0; IsSpace(z[i]); i++){}
13268       for(; (c = z[i])!=0; i++){
13269         if( IsSpace(c) ){
13270           if( z[j-1]=='\r' ) z[j-1] = '\n';
13271           if( IsSpace(z[j-1]) || z[j-1]=='(' ) continue;
13272         }else if( (c=='(' || c==')') && j>0 && IsSpace(z[j-1]) ){
13273           j--;
13274         }
13275         z[j++] = c;
13276       }
13277       while( j>0 && IsSpace(z[j-1]) ){ j--; }
13278       z[j] = 0;
13279       if( strlen30(z)>=79 ){
13280         for(i=j=0; (c = z[i])!=0; i++){ /* Copy from z[i] back to z[j] */
13281           if( c==cEnd ){
13282             cEnd = 0;
13283           }else if( c=='"' || c=='\'' || c=='`' ){
13284             cEnd = c;
13285           }else if( c=='[' ){
13286             cEnd = ']';
13287           }else if( c=='-' && z[i+1]=='-' ){
13288             cEnd = '\n';
13289           }else if( c=='(' ){
13290             nParen++;
13291           }else if( c==')' ){
13292             nParen--;
13293             if( nLine>0 && nParen==0 && j>0 ){
13294               printSchemaLineN(p->out, z, j, "\n");
13295               j = 0;
13296             }
13297           }
13298           z[j++] = c;
13299           if( nParen==1 && cEnd==0
13300            && (c=='(' || c=='\n' || (c==',' && !wsToEol(z+i+1)))
13301           ){
13302             if( c=='\n' ) j--;
13303             printSchemaLineN(p->out, z, j, "\n  ");
13304             j = 0;
13305             nLine++;
13306             while( IsSpace(z[i+1]) ){ i++; }
13307           }
13308         }
13309         z[j] = 0;
13310       }
13311       printSchemaLine(p->out, z, ";\n");
13312       sqlite3_free(z);
13313       break;
13314     }
13315     case MODE_List: {
13316       if( p->cnt++==0 && p->showHeader ){
13317         for(i=0; i<nArg; i++){
13318           utf8_printf(p->out,"%s%s",azCol[i],
13319                   i==nArg-1 ? p->rowSeparator : p->colSeparator);
13320         }
13321       }
13322       if( azArg==0 ) break;
13323       for(i=0; i<nArg; i++){
13324         char *z = azArg[i];
13325         if( z==0 ) z = p->nullValue;
13326         utf8_printf(p->out, "%s", z);
13327         if( i<nArg-1 ){
13328           utf8_printf(p->out, "%s", p->colSeparator);
13329         }else{
13330           utf8_printf(p->out, "%s", p->rowSeparator);
13331         }
13332       }
13333       break;
13334     }
13335     case MODE_Html: {
13336       if( p->cnt++==0 && p->showHeader ){
13337         raw_printf(p->out,"<TR>");
13338         for(i=0; i<nArg; i++){
13339           raw_printf(p->out,"<TH>");
13340           output_html_string(p->out, azCol[i]);
13341           raw_printf(p->out,"</TH>\n");
13342         }
13343         raw_printf(p->out,"</TR>\n");
13344       }
13345       if( azArg==0 ) break;
13346       raw_printf(p->out,"<TR>");
13347       for(i=0; i<nArg; i++){
13348         raw_printf(p->out,"<TD>");
13349         output_html_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
13350         raw_printf(p->out,"</TD>\n");
13351       }
13352       raw_printf(p->out,"</TR>\n");
13353       break;
13354     }
13355     case MODE_Tcl: {
13356       if( p->cnt++==0 && p->showHeader ){
13357         for(i=0; i<nArg; i++){
13358           output_c_string(p->out,azCol[i] ? azCol[i] : "");
13359           if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
13360         }
13361         utf8_printf(p->out, "%s", p->rowSeparator);
13362       }
13363       if( azArg==0 ) break;
13364       for(i=0; i<nArg; i++){
13365         output_c_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
13366         if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
13367       }
13368       utf8_printf(p->out, "%s", p->rowSeparator);
13369       break;
13370     }
13371     case MODE_Csv: {
13372       setBinaryMode(p->out, 1);
13373       if( p->cnt++==0 && p->showHeader ){
13374         for(i=0; i<nArg; i++){
13375           output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
13376         }
13377         utf8_printf(p->out, "%s", p->rowSeparator);
13378       }
13379       if( nArg>0 ){
13380         for(i=0; i<nArg; i++){
13381           output_csv(p, azArg[i], i<nArg-1);
13382         }
13383         utf8_printf(p->out, "%s", p->rowSeparator);
13384       }
13385       setTextMode(p->out, 1);
13386       break;
13387     }
13388     case MODE_Insert: {
13389       if( azArg==0 ) break;
13390       utf8_printf(p->out,"INSERT INTO %s",p->zDestTable);
13391       if( p->showHeader ){
13392         raw_printf(p->out,"(");
13393         for(i=0; i<nArg; i++){
13394           if( i>0 ) raw_printf(p->out, ",");
13395           if( quoteChar(azCol[i]) ){
13396             char *z = sqlite3_mprintf("\"%w\"", azCol[i]);
13397             shell_check_oom(z);
13398             utf8_printf(p->out, "%s", z);
13399             sqlite3_free(z);
13400           }else{
13401             raw_printf(p->out, "%s", azCol[i]);
13402           }
13403         }
13404         raw_printf(p->out,")");
13405       }
13406       p->cnt++;
13407       for(i=0; i<nArg; i++){
13408         raw_printf(p->out, i>0 ? "," : " VALUES(");
13409         if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
13410           utf8_printf(p->out,"NULL");
13411         }else if( aiType && aiType[i]==SQLITE_TEXT ){
13412           if( ShellHasFlag(p, SHFLG_Newlines) ){
13413             output_quoted_string(p->out, azArg[i]);
13414           }else{
13415             output_quoted_escaped_string(p->out, azArg[i]);
13416           }
13417         }else if( aiType && aiType[i]==SQLITE_INTEGER ){
13418           utf8_printf(p->out,"%s", azArg[i]);
13419         }else if( aiType && aiType[i]==SQLITE_FLOAT ){
13420           char z[50];
13421           double r = sqlite3_column_double(p->pStmt, i);
13422           sqlite3_uint64 ur;
13423           memcpy(&ur,&r,sizeof(r));
13424           if( ur==0x7ff0000000000000LL ){
13425             raw_printf(p->out, "1e999");
13426           }else if( ur==0xfff0000000000000LL ){
13427             raw_printf(p->out, "-1e999");
13428           }else{
13429             sqlite3_int64 ir = (sqlite3_int64)r;
13430             if( r==(double)ir ){
13431               sqlite3_snprintf(50,z,"%lld.0", ir);
13432             }else{
13433               sqlite3_snprintf(50,z,"%!.20g", r);
13434             }
13435             raw_printf(p->out, "%s", z);
13436           }
13437         }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
13438           const void *pBlob = sqlite3_column_blob(p->pStmt, i);
13439           int nBlob = sqlite3_column_bytes(p->pStmt, i);
13440           output_hex_blob(p->out, pBlob, nBlob);
13441         }else if( isNumber(azArg[i], 0) ){
13442           utf8_printf(p->out,"%s", azArg[i]);
13443         }else if( ShellHasFlag(p, SHFLG_Newlines) ){
13444           output_quoted_string(p->out, azArg[i]);
13445         }else{
13446           output_quoted_escaped_string(p->out, azArg[i]);
13447         }
13448       }
13449       raw_printf(p->out,");\n");
13450       break;
13451     }
13452     case MODE_Json: {
13453       if( azArg==0 ) break;
13454       if( p->cnt==0 ){
13455         fputs("[{", p->out);
13456       }else{
13457         fputs(",\n{", p->out);
13458       }
13459       p->cnt++;
13460       for(i=0; i<nArg; i++){
13461         output_json_string(p->out, azCol[i], -1);
13462         putc(':', p->out);
13463         if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
13464           fputs("null",p->out);
13465         }else if( aiType && aiType[i]==SQLITE_FLOAT ){
13466           char z[50];
13467           double r = sqlite3_column_double(p->pStmt, i);
13468           sqlite3_uint64 ur;
13469           memcpy(&ur,&r,sizeof(r));
13470           if( ur==0x7ff0000000000000LL ){
13471             raw_printf(p->out, "1e999");
13472           }else if( ur==0xfff0000000000000LL ){
13473             raw_printf(p->out, "-1e999");
13474           }else{
13475             sqlite3_snprintf(50,z,"%!.20g", r);
13476             raw_printf(p->out, "%s", z);
13477           }
13478         }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
13479           const void *pBlob = sqlite3_column_blob(p->pStmt, i);
13480           int nBlob = sqlite3_column_bytes(p->pStmt, i);
13481           output_json_string(p->out, pBlob, nBlob);
13482         }else if( aiType && aiType[i]==SQLITE_TEXT ){
13483           output_json_string(p->out, azArg[i], -1);
13484         }else{
13485           utf8_printf(p->out,"%s", azArg[i]);
13486         }
13487         if( i<nArg-1 ){
13488           putc(',', p->out);
13489         }
13490       }
13491       putc('}', p->out);
13492       break;
13493     }
13494     case MODE_Quote: {
13495       if( azArg==0 ) break;
13496       if( p->cnt==0 && p->showHeader ){
13497         for(i=0; i<nArg; i++){
13498           if( i>0 ) fputs(p->colSeparator, p->out);
13499           output_quoted_string(p->out, azCol[i]);
13500         }
13501         fputs(p->rowSeparator, p->out);
13502       }
13503       p->cnt++;
13504       for(i=0; i<nArg; i++){
13505         if( i>0 ) fputs(p->colSeparator, p->out);
13506         if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
13507           utf8_printf(p->out,"NULL");
13508         }else if( aiType && aiType[i]==SQLITE_TEXT ){
13509           output_quoted_string(p->out, azArg[i]);
13510         }else if( aiType && aiType[i]==SQLITE_INTEGER ){
13511           utf8_printf(p->out,"%s", azArg[i]);
13512         }else if( aiType && aiType[i]==SQLITE_FLOAT ){
13513           char z[50];
13514           double r = sqlite3_column_double(p->pStmt, i);
13515           sqlite3_snprintf(50,z,"%!.20g", r);
13516           raw_printf(p->out, "%s", z);
13517         }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
13518           const void *pBlob = sqlite3_column_blob(p->pStmt, i);
13519           int nBlob = sqlite3_column_bytes(p->pStmt, i);
13520           output_hex_blob(p->out, pBlob, nBlob);
13521         }else if( isNumber(azArg[i], 0) ){
13522           utf8_printf(p->out,"%s", azArg[i]);
13523         }else{
13524           output_quoted_string(p->out, azArg[i]);
13525         }
13526       }
13527       fputs(p->rowSeparator, p->out);
13528       break;
13529     }
13530     case MODE_Ascii: {
13531       if( p->cnt++==0 && p->showHeader ){
13532         for(i=0; i<nArg; i++){
13533           if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
13534           utf8_printf(p->out,"%s",azCol[i] ? azCol[i] : "");
13535         }
13536         utf8_printf(p->out, "%s", p->rowSeparator);
13537       }
13538       if( azArg==0 ) break;
13539       for(i=0; i<nArg; i++){
13540         if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
13541         utf8_printf(p->out,"%s",azArg[i] ? azArg[i] : p->nullValue);
13542       }
13543       utf8_printf(p->out, "%s", p->rowSeparator);
13544       break;
13545     }
13546     case MODE_EQP: {
13547       eqp_append(p, atoi(azArg[0]), atoi(azArg[1]), azArg[3]);
13548       break;
13549     }
13550   }
13551   return 0;
13552 }
13553 
13554 /*
13555 ** This is the callback routine that the SQLite library
13556 ** invokes for each row of a query result.
13557 */
13558 static int callback(void *pArg, int nArg, char **azArg, char **azCol){
13559   /* since we don't have type info, call the shell_callback with a NULL value */
13560   return shell_callback(pArg, nArg, azArg, azCol, NULL);
13561 }
13562 
13563 /*
13564 ** This is the callback routine from sqlite3_exec() that appends all
13565 ** output onto the end of a ShellText object.
13566 */
13567 static int captureOutputCallback(void *pArg, int nArg, char **azArg, char **az){
13568   ShellText *p = (ShellText*)pArg;
13569   int i;
13570   UNUSED_PARAMETER(az);
13571   if( azArg==0 ) return 0;
13572   if( p->n ) appendText(p, "|", 0);
13573   for(i=0; i<nArg; i++){
13574     if( i ) appendText(p, ",", 0);
13575     if( azArg[i] ) appendText(p, azArg[i], 0);
13576   }
13577   return 0;
13578 }
13579 
13580 /*
13581 ** Generate an appropriate SELFTEST table in the main database.
13582 */
13583 static void createSelftestTable(ShellState *p){
13584   char *zErrMsg = 0;
13585   sqlite3_exec(p->db,
13586     "SAVEPOINT selftest_init;\n"
13587     "CREATE TABLE IF NOT EXISTS selftest(\n"
13588     "  tno INTEGER PRIMARY KEY,\n"   /* Test number */
13589     "  op TEXT,\n"                   /* Operator:  memo run */
13590     "  cmd TEXT,\n"                  /* Command text */
13591     "  ans TEXT\n"                   /* Desired answer */
13592     ");"
13593     "CREATE TEMP TABLE [_shell$self](op,cmd,ans);\n"
13594     "INSERT INTO [_shell$self](rowid,op,cmd)\n"
13595     "  VALUES(coalesce((SELECT (max(tno)+100)/10 FROM selftest),10),\n"
13596     "         'memo','Tests generated by --init');\n"
13597     "INSERT INTO [_shell$self]\n"
13598     "  SELECT 'run',\n"
13599     "    'SELECT hex(sha3_query(''SELECT type,name,tbl_name,sql "
13600                                  "FROM sqlite_schema ORDER BY 2'',224))',\n"
13601     "    hex(sha3_query('SELECT type,name,tbl_name,sql "
13602                           "FROM sqlite_schema ORDER BY 2',224));\n"
13603     "INSERT INTO [_shell$self]\n"
13604     "  SELECT 'run',"
13605     "    'SELECT hex(sha3_query(''SELECT * FROM \"' ||"
13606     "        printf('%w',name) || '\" NOT INDEXED'',224))',\n"
13607     "    hex(sha3_query(printf('SELECT * FROM \"%w\" NOT INDEXED',name),224))\n"
13608     "  FROM (\n"
13609     "    SELECT name FROM sqlite_schema\n"
13610     "     WHERE type='table'\n"
13611     "       AND name<>'selftest'\n"
13612     "       AND coalesce(rootpage,0)>0\n"
13613     "  )\n"
13614     " ORDER BY name;\n"
13615     "INSERT INTO [_shell$self]\n"
13616     "  VALUES('run','PRAGMA integrity_check','ok');\n"
13617     "INSERT INTO selftest(tno,op,cmd,ans)"
13618     "  SELECT rowid*10,op,cmd,ans FROM [_shell$self];\n"
13619     "DROP TABLE [_shell$self];"
13620     ,0,0,&zErrMsg);
13621   if( zErrMsg ){
13622     utf8_printf(stderr, "SELFTEST initialization failure: %s\n", zErrMsg);
13623     sqlite3_free(zErrMsg);
13624   }
13625   sqlite3_exec(p->db, "RELEASE selftest_init",0,0,0);
13626 }
13627 
13628 
13629 /*
13630 ** Set the destination table field of the ShellState structure to
13631 ** the name of the table given.  Escape any quote characters in the
13632 ** table name.
13633 */
13634 static void set_table_name(ShellState *p, const char *zName){
13635   int i, n;
13636   char cQuote;
13637   char *z;
13638 
13639   if( p->zDestTable ){
13640     free(p->zDestTable);
13641     p->zDestTable = 0;
13642   }
13643   if( zName==0 ) return;
13644   cQuote = quoteChar(zName);
13645   n = strlen30(zName);
13646   if( cQuote ) n += n+2;
13647   z = p->zDestTable = malloc( n+1 );
13648   shell_check_oom(z);
13649   n = 0;
13650   if( cQuote ) z[n++] = cQuote;
13651   for(i=0; zName[i]; i++){
13652     z[n++] = zName[i];
13653     if( zName[i]==cQuote ) z[n++] = cQuote;
13654   }
13655   if( cQuote ) z[n++] = cQuote;
13656   z[n] = 0;
13657 }
13658 
13659 /*
13660 ** Maybe construct two lines of text that point out the position of a
13661 ** syntax error.  Return a pointer to the text, in memory obtained from
13662 ** sqlite3_malloc().  Or, if the most recent error does not involve a
13663 ** specific token that we can point to, return an empty string.
13664 **
13665 ** In all cases, the memory returned is obtained from sqlite3_malloc64()
13666 ** and should be released by the caller invoking sqlite3_free().
13667 */
13668 static char *shell_error_context(const char *zSql, sqlite3 *db){
13669   int iOffset;
13670   size_t len;
13671   char *zCode;
13672   char *zMsg;
13673   int i;
13674   if( db==0
13675    || zSql==0
13676    || (iOffset = sqlite3_error_offset(db))<0
13677   ){
13678     return sqlite3_mprintf("");
13679   }
13680   while( iOffset>50 ){
13681     iOffset--;
13682     zSql++;
13683     while( (zSql[0]&0xc0)==0x80 ){ zSql++; iOffset--; }
13684   }
13685   len = strlen(zSql);
13686   if( len>78 ){
13687     len = 78;
13688     while( (zSql[len]&0xc0)==0x80 ) len--;
13689   }
13690   zCode = sqlite3_mprintf("%.*s", len, zSql);
13691   for(i=0; zCode[i]; i++){ if( IsSpace(zSql[i]) ) zCode[i] = ' '; }
13692   if( iOffset<25 ){
13693     zMsg = sqlite3_mprintf("\n  %z\n  %*s^--- error here", zCode, iOffset, "");
13694   }else{
13695     zMsg = sqlite3_mprintf("\n  %z\n  %*serror here ---^", zCode, iOffset-14, "");
13696   }
13697   return zMsg;
13698 }
13699 
13700 
13701 /*
13702 ** Execute a query statement that will generate SQL output.  Print
13703 ** the result columns, comma-separated, on a line and then add a
13704 ** semicolon terminator to the end of that line.
13705 **
13706 ** If the number of columns is 1 and that column contains text "--"
13707 ** then write the semicolon on a separate line.  That way, if a
13708 ** "--" comment occurs at the end of the statement, the comment
13709 ** won't consume the semicolon terminator.
13710 */
13711 static int run_table_dump_query(
13712   ShellState *p,           /* Query context */
13713   const char *zSelect      /* SELECT statement to extract content */
13714 ){
13715   sqlite3_stmt *pSelect;
13716   int rc;
13717   int nResult;
13718   int i;
13719   const char *z;
13720   rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0);
13721   if( rc!=SQLITE_OK || !pSelect ){
13722     char *zContext = shell_error_context(zSelect, p->db);
13723     utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n%s", rc,
13724                 sqlite3_errmsg(p->db), zContext);
13725     sqlite3_free(zContext);
13726     if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
13727     return rc;
13728   }
13729   rc = sqlite3_step(pSelect);
13730   nResult = sqlite3_column_count(pSelect);
13731   while( rc==SQLITE_ROW ){
13732     z = (const char*)sqlite3_column_text(pSelect, 0);
13733     utf8_printf(p->out, "%s", z);
13734     for(i=1; i<nResult; i++){
13735       utf8_printf(p->out, ",%s", sqlite3_column_text(pSelect, i));
13736     }
13737     if( z==0 ) z = "";
13738     while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
13739     if( z[0] ){
13740       raw_printf(p->out, "\n;\n");
13741     }else{
13742       raw_printf(p->out, ";\n");
13743     }
13744     rc = sqlite3_step(pSelect);
13745   }
13746   rc = sqlite3_finalize(pSelect);
13747   if( rc!=SQLITE_OK ){
13748     utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc,
13749                 sqlite3_errmsg(p->db));
13750     if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
13751   }
13752   return rc;
13753 }
13754 
13755 /*
13756 ** Allocate space and save off string indicating current error.
13757 */
13758 static char *save_err_msg(
13759   sqlite3 *db,           /* Database to query */
13760   const char *zPhase,    /* When the error occcurs */
13761   int rc,                /* Error code returned from API */
13762   const char *zSql       /* SQL string, or NULL */
13763 ){
13764   char *zErr;
13765   char *zContext;
13766   sqlite3_str *pStr = sqlite3_str_new(0);
13767   sqlite3_str_appendf(pStr, "%s, %s", zPhase, sqlite3_errmsg(db));
13768   if( rc>1 ){
13769     sqlite3_str_appendf(pStr, " (%d)", rc);
13770   }
13771   zContext = shell_error_context(zSql, db);
13772   if( zContext ){
13773     sqlite3_str_appendall(pStr, zContext);
13774     sqlite3_free(zContext);
13775   }
13776   zErr = sqlite3_str_finish(pStr);
13777   shell_check_oom(zErr);
13778   return zErr;
13779 }
13780 
13781 #ifdef __linux__
13782 /*
13783 ** Attempt to display I/O stats on Linux using /proc/PID/io
13784 */
13785 static void displayLinuxIoStats(FILE *out){
13786   FILE *in;
13787   char z[200];
13788   sqlite3_snprintf(sizeof(z), z, "/proc/%d/io", getpid());
13789   in = fopen(z, "rb");
13790   if( in==0 ) return;
13791   while( fgets(z, sizeof(z), in)!=0 ){
13792     static const struct {
13793       const char *zPattern;
13794       const char *zDesc;
13795     } aTrans[] = {
13796       { "rchar: ",                  "Bytes received by read():" },
13797       { "wchar: ",                  "Bytes sent to write():"    },
13798       { "syscr: ",                  "Read() system calls:"      },
13799       { "syscw: ",                  "Write() system calls:"     },
13800       { "read_bytes: ",             "Bytes read from storage:"  },
13801       { "write_bytes: ",            "Bytes written to storage:" },
13802       { "cancelled_write_bytes: ",  "Cancelled write bytes:"    },
13803     };
13804     int i;
13805     for(i=0; i<ArraySize(aTrans); i++){
13806       int n = strlen30(aTrans[i].zPattern);
13807       if( strncmp(aTrans[i].zPattern, z, n)==0 ){
13808         utf8_printf(out, "%-36s %s", aTrans[i].zDesc, &z[n]);
13809         break;
13810       }
13811     }
13812   }
13813   fclose(in);
13814 }
13815 #endif
13816 
13817 /*
13818 ** Display a single line of status using 64-bit values.
13819 */
13820 static void displayStatLine(
13821   ShellState *p,            /* The shell context */
13822   char *zLabel,             /* Label for this one line */
13823   char *zFormat,            /* Format for the result */
13824   int iStatusCtrl,          /* Which status to display */
13825   int bReset                /* True to reset the stats */
13826 ){
13827   sqlite3_int64 iCur = -1;
13828   sqlite3_int64 iHiwtr = -1;
13829   int i, nPercent;
13830   char zLine[200];
13831   sqlite3_status64(iStatusCtrl, &iCur, &iHiwtr, bReset);
13832   for(i=0, nPercent=0; zFormat[i]; i++){
13833     if( zFormat[i]=='%' ) nPercent++;
13834   }
13835   if( nPercent>1 ){
13836     sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iCur, iHiwtr);
13837   }else{
13838     sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iHiwtr);
13839   }
13840   raw_printf(p->out, "%-36s %s\n", zLabel, zLine);
13841 }
13842 
13843 /*
13844 ** Display memory stats.
13845 */
13846 static int display_stats(
13847   sqlite3 *db,                /* Database to query */
13848   ShellState *pArg,           /* Pointer to ShellState */
13849   int bReset                  /* True to reset the stats */
13850 ){
13851   int iCur;
13852   int iHiwtr;
13853   FILE *out;
13854   if( pArg==0 || pArg->out==0 ) return 0;
13855   out = pArg->out;
13856 
13857   if( pArg->pStmt && pArg->statsOn==2 ){
13858     int nCol, i, x;
13859     sqlite3_stmt *pStmt = pArg->pStmt;
13860     char z[100];
13861     nCol = sqlite3_column_count(pStmt);
13862     raw_printf(out, "%-36s %d\n", "Number of output columns:", nCol);
13863     for(i=0; i<nCol; i++){
13864       sqlite3_snprintf(sizeof(z),z,"Column %d %nname:", i, &x);
13865       utf8_printf(out, "%-36s %s\n", z, sqlite3_column_name(pStmt,i));
13866 #ifndef SQLITE_OMIT_DECLTYPE
13867       sqlite3_snprintf(30, z+x, "declared type:");
13868       utf8_printf(out, "%-36s %s\n", z, sqlite3_column_decltype(pStmt, i));
13869 #endif
13870 #ifdef SQLITE_ENABLE_COLUMN_METADATA
13871       sqlite3_snprintf(30, z+x, "database name:");
13872       utf8_printf(out, "%-36s %s\n", z, sqlite3_column_database_name(pStmt,i));
13873       sqlite3_snprintf(30, z+x, "table name:");
13874       utf8_printf(out, "%-36s %s\n", z, sqlite3_column_table_name(pStmt,i));
13875       sqlite3_snprintf(30, z+x, "origin name:");
13876       utf8_printf(out, "%-36s %s\n", z, sqlite3_column_origin_name(pStmt,i));
13877 #endif
13878     }
13879   }
13880 
13881   if( pArg->statsOn==3 ){
13882     if( pArg->pStmt ){
13883       iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
13884       raw_printf(pArg->out, "VM-steps: %d\n", iCur);
13885     }
13886     return 0;
13887   }
13888 
13889   displayStatLine(pArg, "Memory Used:",
13890      "%lld (max %lld) bytes", SQLITE_STATUS_MEMORY_USED, bReset);
13891   displayStatLine(pArg, "Number of Outstanding Allocations:",
13892      "%lld (max %lld)", SQLITE_STATUS_MALLOC_COUNT, bReset);
13893   if( pArg->shellFlgs & SHFLG_Pagecache ){
13894     displayStatLine(pArg, "Number of Pcache Pages Used:",
13895        "%lld (max %lld) pages", SQLITE_STATUS_PAGECACHE_USED, bReset);
13896   }
13897   displayStatLine(pArg, "Number of Pcache Overflow Bytes:",
13898      "%lld (max %lld) bytes", SQLITE_STATUS_PAGECACHE_OVERFLOW, bReset);
13899   displayStatLine(pArg, "Largest Allocation:",
13900      "%lld bytes", SQLITE_STATUS_MALLOC_SIZE, bReset);
13901   displayStatLine(pArg, "Largest Pcache Allocation:",
13902      "%lld bytes", SQLITE_STATUS_PAGECACHE_SIZE, bReset);
13903 #ifdef YYTRACKMAXSTACKDEPTH
13904   displayStatLine(pArg, "Deepest Parser Stack:",
13905      "%lld (max %lld)", SQLITE_STATUS_PARSER_STACK, bReset);
13906 #endif
13907 
13908   if( db ){
13909     if( pArg->shellFlgs & SHFLG_Lookaside ){
13910       iHiwtr = iCur = -1;
13911       sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED,
13912                         &iCur, &iHiwtr, bReset);
13913       raw_printf(pArg->out,
13914               "Lookaside Slots Used:                %d (max %d)\n",
13915               iCur, iHiwtr);
13916       sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT,
13917                         &iCur, &iHiwtr, bReset);
13918       raw_printf(pArg->out, "Successful lookaside attempts:       %d\n",
13919               iHiwtr);
13920       sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE,
13921                         &iCur, &iHiwtr, bReset);
13922       raw_printf(pArg->out, "Lookaside failures due to size:      %d\n",
13923               iHiwtr);
13924       sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL,
13925                         &iCur, &iHiwtr, bReset);
13926       raw_printf(pArg->out, "Lookaside failures due to OOM:       %d\n",
13927               iHiwtr);
13928     }
13929     iHiwtr = iCur = -1;
13930     sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
13931     raw_printf(pArg->out, "Pager Heap Usage:                    %d bytes\n",
13932             iCur);
13933     iHiwtr = iCur = -1;
13934     sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
13935     raw_printf(pArg->out, "Page cache hits:                     %d\n", iCur);
13936     iHiwtr = iCur = -1;
13937     sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
13938     raw_printf(pArg->out, "Page cache misses:                   %d\n", iCur);
13939     iHiwtr = iCur = -1;
13940     sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
13941     raw_printf(pArg->out, "Page cache writes:                   %d\n", iCur);
13942     iHiwtr = iCur = -1;
13943     sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_SPILL, &iCur, &iHiwtr, 1);
13944     raw_printf(pArg->out, "Page cache spills:                   %d\n", iCur);
13945     iHiwtr = iCur = -1;
13946     sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
13947     raw_printf(pArg->out, "Schema Heap Usage:                   %d bytes\n",
13948             iCur);
13949     iHiwtr = iCur = -1;
13950     sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
13951     raw_printf(pArg->out, "Statement Heap/Lookaside Usage:      %d bytes\n",
13952             iCur);
13953   }
13954 
13955   if( pArg->pStmt ){
13956     int iHit, iMiss;
13957     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP,
13958                                bReset);
13959     raw_printf(pArg->out, "Fullscan Steps:                      %d\n", iCur);
13960     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
13961     raw_printf(pArg->out, "Sort Operations:                     %d\n", iCur);
13962     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX,bReset);
13963     raw_printf(pArg->out, "Autoindex Inserts:                   %d\n", iCur);
13964     iHit = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FILTER_HIT, bReset);
13965     iMiss = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FILTER_MISS, bReset);
13966     if( iHit || iMiss ){
13967       raw_printf(pArg->out, "Bloom filter bypass taken:           %d/%d\n",
13968             iHit, iHit+iMiss);
13969     }
13970     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
13971     raw_printf(pArg->out, "Virtual Machine Steps:               %d\n", iCur);
13972     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_REPREPARE,bReset);
13973     raw_printf(pArg->out, "Reprepare operations:                %d\n", iCur);
13974     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_RUN, bReset);
13975     raw_printf(pArg->out, "Number of times run:                 %d\n", iCur);
13976     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_MEMUSED, bReset);
13977     raw_printf(pArg->out, "Memory used by prepared stmt:        %d\n", iCur);
13978   }
13979 
13980 #ifdef __linux__
13981   displayLinuxIoStats(pArg->out);
13982 #endif
13983 
13984   /* Do not remove this machine readable comment: extra-stats-output-here */
13985 
13986   return 0;
13987 }
13988 
13989 /*
13990 ** Display scan stats.
13991 */
13992 static void display_scanstats(
13993   sqlite3 *db,                    /* Database to query */
13994   ShellState *pArg                /* Pointer to ShellState */
13995 ){
13996 #ifndef SQLITE_ENABLE_STMT_SCANSTATUS
13997   UNUSED_PARAMETER(db);
13998   UNUSED_PARAMETER(pArg);
13999 #else
14000   int i, k, n, mx;
14001   raw_printf(pArg->out, "-------- scanstats --------\n");
14002   mx = 0;
14003   for(k=0; k<=mx; k++){
14004     double rEstLoop = 1.0;
14005     for(i=n=0; 1; i++){
14006       sqlite3_stmt *p = pArg->pStmt;
14007       sqlite3_int64 nLoop, nVisit;
14008       double rEst;
14009       int iSid;
14010       const char *zExplain;
14011       if( sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NLOOP, (void*)&nLoop) ){
14012         break;
14013       }
14014       sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_SELECTID, (void*)&iSid);
14015       if( iSid>mx ) mx = iSid;
14016       if( iSid!=k ) continue;
14017       if( n==0 ){
14018         rEstLoop = (double)nLoop;
14019         if( k>0 ) raw_printf(pArg->out, "-------- subquery %d -------\n", k);
14020       }
14021       n++;
14022       sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NVISIT, (void*)&nVisit);
14023       sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EST, (void*)&rEst);
14024       sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EXPLAIN, (void*)&zExplain);
14025       utf8_printf(pArg->out, "Loop %2d: %s\n", n, zExplain);
14026       rEstLoop *= rEst;
14027       raw_printf(pArg->out,
14028           "         nLoop=%-8lld nRow=%-8lld estRow=%-8lld estRow/Loop=%-8g\n",
14029           nLoop, nVisit, (sqlite3_int64)(rEstLoop+0.5), rEst
14030       );
14031     }
14032   }
14033   raw_printf(pArg->out, "---------------------------\n");
14034 #endif
14035 }
14036 
14037 /*
14038 ** Parameter azArray points to a zero-terminated array of strings. zStr
14039 ** points to a single nul-terminated string. Return non-zero if zStr
14040 ** is equal, according to strcmp(), to any of the strings in the array.
14041 ** Otherwise, return zero.
14042 */
14043 static int str_in_array(const char *zStr, const char **azArray){
14044   int i;
14045   for(i=0; azArray[i]; i++){
14046     if( 0==strcmp(zStr, azArray[i]) ) return 1;
14047   }
14048   return 0;
14049 }
14050 
14051 /*
14052 ** If compiled statement pSql appears to be an EXPLAIN statement, allocate
14053 ** and populate the ShellState.aiIndent[] array with the number of
14054 ** spaces each opcode should be indented before it is output.
14055 **
14056 ** The indenting rules are:
14057 **
14058 **     * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
14059 **       all opcodes that occur between the p2 jump destination and the opcode
14060 **       itself by 2 spaces.
14061 **
14062 **     * Do the previous for "Return" instructions for when P2 is positive.
14063 **       See tag-20220407a in wherecode.c and vdbe.c.
14064 **
14065 **     * For each "Goto", if the jump destination is earlier in the program
14066 **       and ends on one of:
14067 **          Yield  SeekGt  SeekLt  RowSetRead  Rewind
14068 **       or if the P1 parameter is one instead of zero,
14069 **       then indent all opcodes between the earlier instruction
14070 **       and "Goto" by 2 spaces.
14071 */
14072 static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){
14073   const char *zSql;               /* The text of the SQL statement */
14074   const char *z;                  /* Used to check if this is an EXPLAIN */
14075   int *abYield = 0;               /* True if op is an OP_Yield */
14076   int nAlloc = 0;                 /* Allocated size of p->aiIndent[], abYield */
14077   int iOp;                        /* Index of operation in p->aiIndent[] */
14078 
14079   const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext",
14080                            "Return", 0 };
14081   const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead",
14082                             "Rewind", 0 };
14083   const char *azGoto[] = { "Goto", 0 };
14084 
14085   /* Try to figure out if this is really an EXPLAIN statement. If this
14086   ** cannot be verified, return early.  */
14087   if( sqlite3_column_count(pSql)!=8 ){
14088     p->cMode = p->mode;
14089     return;
14090   }
14091   zSql = sqlite3_sql(pSql);
14092   if( zSql==0 ) return;
14093   for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++);
14094   if( sqlite3_strnicmp(z, "explain", 7) ){
14095     p->cMode = p->mode;
14096     return;
14097   }
14098 
14099   for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
14100     int i;
14101     int iAddr = sqlite3_column_int(pSql, 0);
14102     const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
14103 
14104     /* Set p2 to the P2 field of the current opcode. Then, assuming that
14105     ** p2 is an instruction address, set variable p2op to the index of that
14106     ** instruction in the aiIndent[] array. p2 and p2op may be different if
14107     ** the current instruction is part of a sub-program generated by an
14108     ** SQL trigger or foreign key.  */
14109     int p2 = sqlite3_column_int(pSql, 3);
14110     int p2op = (p2 + (iOp-iAddr));
14111 
14112     /* Grow the p->aiIndent array as required */
14113     if( iOp>=nAlloc ){
14114       if( iOp==0 ){
14115         /* Do further verfication that this is explain output.  Abort if
14116         ** it is not */
14117         static const char *explainCols[] = {
14118            "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment" };
14119         int jj;
14120         for(jj=0; jj<ArraySize(explainCols); jj++){
14121           if( strcmp(sqlite3_column_name(pSql,jj),explainCols[jj])!=0 ){
14122             p->cMode = p->mode;
14123             sqlite3_reset(pSql);
14124             return;
14125           }
14126         }
14127       }
14128       nAlloc += 100;
14129       p->aiIndent = (int*)sqlite3_realloc64(p->aiIndent, nAlloc*sizeof(int));
14130       shell_check_oom(p->aiIndent);
14131       abYield = (int*)sqlite3_realloc64(abYield, nAlloc*sizeof(int));
14132       shell_check_oom(abYield);
14133     }
14134     abYield[iOp] = str_in_array(zOp, azYield);
14135     p->aiIndent[iOp] = 0;
14136     p->nIndent = iOp+1;
14137 
14138     if( str_in_array(zOp, azNext) && p2op>0 ){
14139       for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
14140     }
14141     if( str_in_array(zOp, azGoto) && p2op<p->nIndent
14142      && (abYield[p2op] || sqlite3_column_int(pSql, 2))
14143     ){
14144       for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
14145     }
14146   }
14147 
14148   p->iIndent = 0;
14149   sqlite3_free(abYield);
14150   sqlite3_reset(pSql);
14151 }
14152 
14153 /*
14154 ** Free the array allocated by explain_data_prepare().
14155 */
14156 static void explain_data_delete(ShellState *p){
14157   sqlite3_free(p->aiIndent);
14158   p->aiIndent = 0;
14159   p->nIndent = 0;
14160   p->iIndent = 0;
14161 }
14162 
14163 /*
14164 ** Disable and restore .wheretrace and .treetrace/.selecttrace settings.
14165 */
14166 static unsigned int savedSelectTrace;
14167 static unsigned int savedWhereTrace;
14168 static void disable_debug_trace_modes(void){
14169   unsigned int zero = 0;
14170   sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 0, &savedSelectTrace);
14171   sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &zero);
14172   sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 2, &savedWhereTrace);
14173   sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &zero);
14174 }
14175 static void restore_debug_trace_modes(void){
14176   sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &savedSelectTrace);
14177   sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &savedWhereTrace);
14178 }
14179 
14180 /* Create the TEMP table used to store parameter bindings */
14181 static void bind_table_init(ShellState *p){
14182   int wrSchema = 0;
14183   int defensiveMode = 0;
14184   sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, -1, &defensiveMode);
14185   sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, 0, 0);
14186   sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, -1, &wrSchema);
14187   sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, 1, 0);
14188   sqlite3_exec(p->db,
14189     "CREATE TABLE IF NOT EXISTS temp.sqlite_parameters(\n"
14190     "  key TEXT PRIMARY KEY,\n"
14191     "  value\n"
14192     ") WITHOUT ROWID;",
14193     0, 0, 0);
14194   sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, wrSchema, 0);
14195   sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, defensiveMode, 0);
14196 }
14197 
14198 /*
14199 ** Bind parameters on a prepared statement.
14200 **
14201 ** Parameter bindings are taken from a TEMP table of the form:
14202 **
14203 **    CREATE TEMP TABLE sqlite_parameters(key TEXT PRIMARY KEY, value)
14204 **    WITHOUT ROWID;
14205 **
14206 ** No bindings occur if this table does not exist.  The name of the table
14207 ** begins with "sqlite_" so that it will not collide with ordinary application
14208 ** tables.  The table must be in the TEMP schema.
14209 */
14210 static void bind_prepared_stmt(ShellState *pArg, sqlite3_stmt *pStmt){
14211   int nVar;
14212   int i;
14213   int rc;
14214   sqlite3_stmt *pQ = 0;
14215 
14216   nVar = sqlite3_bind_parameter_count(pStmt);
14217   if( nVar==0 ) return;  /* Nothing to do */
14218   if( sqlite3_table_column_metadata(pArg->db, "TEMP", "sqlite_parameters",
14219                                     "key", 0, 0, 0, 0, 0)!=SQLITE_OK ){
14220     return; /* Parameter table does not exist */
14221   }
14222   rc = sqlite3_prepare_v2(pArg->db,
14223           "SELECT value FROM temp.sqlite_parameters"
14224           " WHERE key=?1", -1, &pQ, 0);
14225   if( rc || pQ==0 ) return;
14226   for(i=1; i<=nVar; i++){
14227     char zNum[30];
14228     const char *zVar = sqlite3_bind_parameter_name(pStmt, i);
14229     if( zVar==0 ){
14230       sqlite3_snprintf(sizeof(zNum),zNum,"?%d",i);
14231       zVar = zNum;
14232     }
14233     sqlite3_bind_text(pQ, 1, zVar, -1, SQLITE_STATIC);
14234     if( sqlite3_step(pQ)==SQLITE_ROW ){
14235       sqlite3_bind_value(pStmt, i, sqlite3_column_value(pQ, 0));
14236     }else{
14237       sqlite3_bind_null(pStmt, i);
14238     }
14239     sqlite3_reset(pQ);
14240   }
14241   sqlite3_finalize(pQ);
14242 }
14243 
14244 /*
14245 ** UTF8 box-drawing characters.  Imagine box lines like this:
14246 **
14247 **           1
14248 **           |
14249 **       4 --+-- 2
14250 **           |
14251 **           3
14252 **
14253 ** Each box characters has between 2 and 4 of the lines leading from
14254 ** the center.  The characters are here identified by the numbers of
14255 ** their corresponding lines.
14256 */
14257 #define BOX_24   "\342\224\200"  /* U+2500 --- */
14258 #define BOX_13   "\342\224\202"  /* U+2502  |  */
14259 #define BOX_23   "\342\224\214"  /* U+250c  ,- */
14260 #define BOX_34   "\342\224\220"  /* U+2510 -,  */
14261 #define BOX_12   "\342\224\224"  /* U+2514  '- */
14262 #define BOX_14   "\342\224\230"  /* U+2518 -'  */
14263 #define BOX_123  "\342\224\234"  /* U+251c  |- */
14264 #define BOX_134  "\342\224\244"  /* U+2524 -|  */
14265 #define BOX_234  "\342\224\254"  /* U+252c -,- */
14266 #define BOX_124  "\342\224\264"  /* U+2534 -'- */
14267 #define BOX_1234 "\342\224\274"  /* U+253c -|- */
14268 
14269 /* Draw horizontal line N characters long using unicode box
14270 ** characters
14271 */
14272 static void print_box_line(FILE *out, int N){
14273   const char zDash[] =
14274       BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24
14275       BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24;
14276   const int nDash = sizeof(zDash) - 1;
14277   N *= 3;
14278   while( N>nDash ){
14279     utf8_printf(out, zDash);
14280     N -= nDash;
14281   }
14282   utf8_printf(out, "%.*s", N, zDash);
14283 }
14284 
14285 /*
14286 ** Draw a horizontal separator for a MODE_Box table.
14287 */
14288 static void print_box_row_separator(
14289   ShellState *p,
14290   int nArg,
14291   const char *zSep1,
14292   const char *zSep2,
14293   const char *zSep3
14294 ){
14295   int i;
14296   if( nArg>0 ){
14297     utf8_printf(p->out, "%s", zSep1);
14298     print_box_line(p->out, p->actualWidth[0]+2);
14299     for(i=1; i<nArg; i++){
14300       utf8_printf(p->out, "%s", zSep2);
14301       print_box_line(p->out, p->actualWidth[i]+2);
14302     }
14303     utf8_printf(p->out, "%s", zSep3);
14304   }
14305   fputs("\n", p->out);
14306 }
14307 
14308 /*
14309 ** z[] is a line of text that is to be displayed the .mode box or table or
14310 ** similar tabular formats.  z[] might contain control characters such
14311 ** as \n, \t, \f, or \r.
14312 **
14313 ** Compute characters to display on the first line of z[].  Stop at the
14314 ** first \r, \n, or \f.  Expand \t into spaces.  Return a copy (obtained
14315 ** from malloc()) of that first line, which caller should free sometime.
14316 ** Write anything to display on the next line into *pzTail.  If this is
14317 ** the last line, write a NULL into *pzTail. (*pzTail is not allocated.)
14318 */
14319 static char *translateForDisplayAndDup(
14320   const unsigned char *z,            /* Input text to be transformed */
14321   const unsigned char **pzTail,      /* OUT: Tail of the input for next line */
14322   int mxWidth,                       /* Max width.  0 means no limit */
14323   u8 bWordWrap                       /* If true, avoid breaking mid-word */
14324 ){
14325   int i;                 /* Input bytes consumed */
14326   int j;                 /* Output bytes generated */
14327   int k;                 /* Input bytes to be displayed */
14328   int n;                 /* Output column number */
14329   unsigned char *zOut;   /* Output text */
14330 
14331   if( z==0 ){
14332     *pzTail = 0;
14333     return 0;
14334   }
14335   if( mxWidth<0 ) mxWidth = -mxWidth;
14336   if( mxWidth==0 ) mxWidth = 1000000;
14337   i = j = n = 0;
14338   while( n<mxWidth ){
14339     if( z[i]>=' ' ){
14340       n++;
14341       do{ i++; j++; }while( (z[i]&0xc0)==0x80 );
14342       continue;
14343     }
14344     if( z[i]=='\t' ){
14345       do{
14346         n++;
14347         j++;
14348       }while( (n&7)!=0 && n<mxWidth );
14349       i++;
14350       continue;
14351     }
14352     break;
14353   }
14354   if( n>=mxWidth && bWordWrap  ){
14355     /* Perhaps try to back up to a better place to break the line */
14356     for(k=i; k>i/2; k--){
14357       if( isspace(z[k-1]) ) break;
14358     }
14359     if( k<=i/2 ){
14360       for(k=i; k>i/2; k--){
14361         if( isalnum(z[k-1])!=isalnum(z[k]) && (z[k]&0xc0)!=0x80 ) break;
14362       }
14363     }
14364     if( k<=i/2 ){
14365       k = i;
14366     }else{
14367       i = k;
14368       while( z[i]==' ' ) i++;
14369     }
14370   }else{
14371     k = i;
14372   }
14373   if( n>=mxWidth && z[i]>=' ' ){
14374    *pzTail = &z[i];
14375   }else if( z[i]=='\r' && z[i+1]=='\n' ){
14376     *pzTail = z[i+2] ? &z[i+2] : 0;
14377   }else if( z[i]==0 || z[i+1]==0 ){
14378     *pzTail = 0;
14379   }else{
14380     *pzTail = &z[i+1];
14381   }
14382   zOut = malloc( j+1 );
14383   shell_check_oom(zOut);
14384   i = j = n = 0;
14385   while( i<k ){
14386     if( z[i]>=' ' ){
14387       n++;
14388       do{ zOut[j++] = z[i++]; }while( (z[i]&0xc0)==0x80 );
14389       continue;
14390     }
14391     if( z[i]=='\t' ){
14392       do{
14393         n++;
14394         zOut[j++] = ' ';
14395       }while( (n&7)!=0 && n<mxWidth );
14396       i++;
14397       continue;
14398     }
14399     break;
14400   }
14401   zOut[j] = 0;
14402   return (char*)zOut;
14403 }
14404 
14405 /* Extract the value of the i-th current column for pStmt as an SQL literal
14406 ** value.  Memory is obtained from sqlite3_malloc64() and must be freed by
14407 ** the caller.
14408 */
14409 static char *quoted_column(sqlite3_stmt *pStmt, int i){
14410   switch( sqlite3_column_type(pStmt, i) ){
14411     case SQLITE_NULL: {
14412       return sqlite3_mprintf("NULL");
14413     }
14414     case SQLITE_INTEGER:
14415     case SQLITE_FLOAT: {
14416       return sqlite3_mprintf("%s",sqlite3_column_text(pStmt,i));
14417     }
14418     case SQLITE_TEXT: {
14419       return sqlite3_mprintf("%Q",sqlite3_column_text(pStmt,i));
14420     }
14421     case SQLITE_BLOB: {
14422       int j;
14423       sqlite3_str *pStr = sqlite3_str_new(0);
14424       const unsigned char *a = sqlite3_column_blob(pStmt,i);
14425       int n = sqlite3_column_bytes(pStmt,i);
14426       sqlite3_str_append(pStr, "x'", 2);
14427       for(j=0; j<n; j++){
14428         sqlite3_str_appendf(pStr, "%02x", a[j]);
14429       }
14430       sqlite3_str_append(pStr, "'", 1);
14431       return sqlite3_str_finish(pStr);
14432     }
14433   }
14434   return 0; /* Not reached */
14435 }
14436 
14437 /*
14438 ** Run a prepared statement and output the result in one of the
14439 ** table-oriented formats: MODE_Column, MODE_Markdown, MODE_Table,
14440 ** or MODE_Box.
14441 **
14442 ** This is different from ordinary exec_prepared_stmt() in that
14443 ** it has to run the entire query and gather the results into memory
14444 ** first, in order to determine column widths, before providing
14445 ** any output.
14446 */
14447 static void exec_prepared_stmt_columnar(
14448   ShellState *p,                        /* Pointer to ShellState */
14449   sqlite3_stmt *pStmt                   /* Statment to run */
14450 ){
14451   sqlite3_int64 nRow = 0;
14452   int nColumn = 0;
14453   char **azData = 0;
14454   sqlite3_int64 nAlloc = 0;
14455   char *abRowDiv = 0;
14456   const unsigned char *uz;
14457   const char *z;
14458   char **azQuoted = 0;
14459   int rc;
14460   sqlite3_int64 i, nData;
14461   int j, nTotal, w, n;
14462   const char *colSep = 0;
14463   const char *rowSep = 0;
14464   const unsigned char **azNextLine = 0;
14465   int bNextLine = 0;
14466   int bMultiLineRowExists = 0;
14467   int bw = p->cmOpts.bWordWrap;
14468   const char *zEmpty = "";
14469   const char *zShowNull = p->nullValue;
14470 
14471   rc = sqlite3_step(pStmt);
14472   if( rc!=SQLITE_ROW ) return;
14473   nColumn = sqlite3_column_count(pStmt);
14474   nAlloc = nColumn*4;
14475   if( nAlloc<=0 ) nAlloc = 1;
14476   azData = sqlite3_malloc64( nAlloc*sizeof(char*) );
14477   shell_check_oom(azData);
14478   azNextLine = sqlite3_malloc64( nColumn*sizeof(char*) );
14479   shell_check_oom((void*)azNextLine);
14480   memset((void*)azNextLine, 0, nColumn*sizeof(char*) );
14481   if( p->cmOpts.bQuote ){
14482     azQuoted = sqlite3_malloc64( nColumn*sizeof(char*) );
14483     shell_check_oom(azQuoted);
14484     memset(azQuoted, 0, nColumn*sizeof(char*) );
14485   }
14486   abRowDiv = sqlite3_malloc64( nAlloc/nColumn );
14487   shell_check_oom(abRowDiv);
14488   if( nColumn>p->nWidth ){
14489     p->colWidth = realloc(p->colWidth, (nColumn+1)*2*sizeof(int));
14490     shell_check_oom(p->colWidth);
14491     for(i=p->nWidth; i<nColumn; i++) p->colWidth[i] = 0;
14492     p->nWidth = nColumn;
14493     p->actualWidth = &p->colWidth[nColumn];
14494   }
14495   memset(p->actualWidth, 0, nColumn*sizeof(int));
14496   for(i=0; i<nColumn; i++){
14497     w = p->colWidth[i];
14498     if( w<0 ) w = -w;
14499     p->actualWidth[i] = w;
14500   }
14501   for(i=0; i<nColumn; i++){
14502     const unsigned char *zNotUsed;
14503     int wx = p->colWidth[i];
14504     if( wx==0 ){
14505       wx = p->cmOpts.iWrap;
14506     }
14507     if( wx<0 ) wx = -wx;
14508     uz = (const unsigned char*)sqlite3_column_name(pStmt,i);
14509     azData[i] = translateForDisplayAndDup(uz, &zNotUsed, wx, bw);
14510   }
14511   do{
14512     int useNextLine = bNextLine;
14513     bNextLine = 0;
14514     if( (nRow+2)*nColumn >= nAlloc ){
14515       nAlloc *= 2;
14516       azData = sqlite3_realloc64(azData, nAlloc*sizeof(char*));
14517       shell_check_oom(azData);
14518       abRowDiv = sqlite3_realloc64(abRowDiv, nAlloc/nColumn);
14519       shell_check_oom(abRowDiv);
14520     }
14521     abRowDiv[nRow] = 1;
14522     nRow++;
14523     for(i=0; i<nColumn; i++){
14524       int wx = p->colWidth[i];
14525       if( wx==0 ){
14526         wx = p->cmOpts.iWrap;
14527       }
14528       if( wx<0 ) wx = -wx;
14529       if( useNextLine ){
14530         uz = azNextLine[i];
14531         if( uz==0 ) uz = (u8*)zEmpty;
14532       }else if( p->cmOpts.bQuote ){
14533         sqlite3_free(azQuoted[i]);
14534         azQuoted[i] = quoted_column(pStmt,i);
14535         uz = (const unsigned char*)azQuoted[i];
14536       }else{
14537         uz = (const unsigned char*)sqlite3_column_text(pStmt,i);
14538         if( uz==0 ) uz = (u8*)zShowNull;
14539       }
14540       azData[nRow*nColumn + i]
14541         = translateForDisplayAndDup(uz, &azNextLine[i], wx, bw);
14542       if( azNextLine[i] ){
14543         bNextLine = 1;
14544         abRowDiv[nRow-1] = 0;
14545         bMultiLineRowExists = 1;
14546       }
14547     }
14548   }while( bNextLine || sqlite3_step(pStmt)==SQLITE_ROW );
14549   nTotal = nColumn*(nRow+1);
14550   for(i=0; i<nTotal; i++){
14551     z = azData[i];
14552     if( z==0 ) z = (char*)zEmpty;
14553     n = strlenChar(z);
14554     j = i%nColumn;
14555     if( n>p->actualWidth[j] ) p->actualWidth[j] = n;
14556   }
14557   if( seenInterrupt ) goto columnar_end;
14558   if( nColumn==0 ) goto columnar_end;
14559   switch( p->cMode ){
14560     case MODE_Column: {
14561       colSep = "  ";
14562       rowSep = "\n";
14563       if( p->showHeader ){
14564         for(i=0; i<nColumn; i++){
14565           w = p->actualWidth[i];
14566           if( p->colWidth[i]<0 ) w = -w;
14567           utf8_width_print(p->out, w, azData[i]);
14568           fputs(i==nColumn-1?"\n":"  ", p->out);
14569         }
14570         for(i=0; i<nColumn; i++){
14571           print_dashes(p->out, p->actualWidth[i]);
14572           fputs(i==nColumn-1?"\n":"  ", p->out);
14573         }
14574       }
14575       break;
14576     }
14577     case MODE_Table: {
14578       colSep = " | ";
14579       rowSep = " |\n";
14580       print_row_separator(p, nColumn, "+");
14581       fputs("| ", p->out);
14582       for(i=0; i<nColumn; i++){
14583         w = p->actualWidth[i];
14584         n = strlenChar(azData[i]);
14585         utf8_printf(p->out, "%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, "");
14586         fputs(i==nColumn-1?" |\n":" | ", p->out);
14587       }
14588       print_row_separator(p, nColumn, "+");
14589       break;
14590     }
14591     case MODE_Markdown: {
14592       colSep = " | ";
14593       rowSep = " |\n";
14594       fputs("| ", p->out);
14595       for(i=0; i<nColumn; i++){
14596         w = p->actualWidth[i];
14597         n = strlenChar(azData[i]);
14598         utf8_printf(p->out, "%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, "");
14599         fputs(i==nColumn-1?" |\n":" | ", p->out);
14600       }
14601       print_row_separator(p, nColumn, "|");
14602       break;
14603     }
14604     case MODE_Box: {
14605       colSep = " " BOX_13 " ";
14606       rowSep = " " BOX_13 "\n";
14607       print_box_row_separator(p, nColumn, BOX_23, BOX_234, BOX_34);
14608       utf8_printf(p->out, BOX_13 " ");
14609       for(i=0; i<nColumn; i++){
14610         w = p->actualWidth[i];
14611         n = strlenChar(azData[i]);
14612         utf8_printf(p->out, "%*s%s%*s%s",
14613             (w-n)/2, "", azData[i], (w-n+1)/2, "",
14614             i==nColumn-1?" "BOX_13"\n":" "BOX_13" ");
14615       }
14616       print_box_row_separator(p, nColumn, BOX_123, BOX_1234, BOX_134);
14617       break;
14618     }
14619   }
14620   for(i=nColumn, j=0; i<nTotal; i++, j++){
14621     if( j==0 && p->cMode!=MODE_Column ){
14622       utf8_printf(p->out, "%s", p->cMode==MODE_Box?BOX_13" ":"| ");
14623     }
14624     z = azData[i];
14625     if( z==0 ) z = p->nullValue;
14626     w = p->actualWidth[j];
14627     if( p->colWidth[j]<0 ) w = -w;
14628     utf8_width_print(p->out, w, z);
14629     if( j==nColumn-1 ){
14630       utf8_printf(p->out, "%s", rowSep);
14631       if( bMultiLineRowExists && abRowDiv[i/nColumn-1] && i+1<nTotal ){
14632         if( p->cMode==MODE_Table ){
14633           print_row_separator(p, nColumn, "+");
14634         }else if( p->cMode==MODE_Box ){
14635           print_box_row_separator(p, nColumn, BOX_123, BOX_1234, BOX_134);
14636         }else if( p->cMode==MODE_Column ){
14637           raw_printf(p->out, "\n");
14638         }
14639       }
14640       j = -1;
14641       if( seenInterrupt ) goto columnar_end;
14642     }else{
14643       utf8_printf(p->out, "%s", colSep);
14644     }
14645   }
14646   if( p->cMode==MODE_Table ){
14647     print_row_separator(p, nColumn, "+");
14648   }else if( p->cMode==MODE_Box ){
14649     print_box_row_separator(p, nColumn, BOX_12, BOX_124, BOX_14);
14650   }
14651 columnar_end:
14652   if( seenInterrupt ){
14653     utf8_printf(p->out, "Interrupt\n");
14654   }
14655   nData = (nRow+1)*nColumn;
14656   for(i=0; i<nData; i++){
14657     z = azData[i];
14658     if( z!=zEmpty && z!=zShowNull ) free(azData[i]);
14659   }
14660   sqlite3_free(azData);
14661   sqlite3_free((void*)azNextLine);
14662   sqlite3_free(abRowDiv);
14663   if( azQuoted ){
14664     for(i=0; i<nColumn; i++) sqlite3_free(azQuoted[i]);
14665     sqlite3_free(azQuoted);
14666   }
14667 }
14668 
14669 /*
14670 ** Run a prepared statement
14671 */
14672 static void exec_prepared_stmt(
14673   ShellState *pArg,                                /* Pointer to ShellState */
14674   sqlite3_stmt *pStmt                              /* Statment to run */
14675 ){
14676   int rc;
14677   sqlite3_uint64 nRow = 0;
14678 
14679   if( pArg->cMode==MODE_Column
14680    || pArg->cMode==MODE_Table
14681    || pArg->cMode==MODE_Box
14682    || pArg->cMode==MODE_Markdown
14683   ){
14684     exec_prepared_stmt_columnar(pArg, pStmt);
14685     return;
14686   }
14687 
14688   /* perform the first step.  this will tell us if we
14689   ** have a result set or not and how wide it is.
14690   */
14691   rc = sqlite3_step(pStmt);
14692   /* if we have a result set... */
14693   if( SQLITE_ROW == rc ){
14694     /* allocate space for col name ptr, value ptr, and type */
14695     int nCol = sqlite3_column_count(pStmt);
14696     void *pData = sqlite3_malloc64(3*nCol*sizeof(const char*) + 1);
14697     if( !pData ){
14698       shell_out_of_memory();
14699     }else{
14700       char **azCols = (char **)pData;      /* Names of result columns */
14701       char **azVals = &azCols[nCol];       /* Results */
14702       int *aiTypes = (int *)&azVals[nCol]; /* Result types */
14703       int i, x;
14704       assert(sizeof(int) <= sizeof(char *));
14705       /* save off ptrs to column names */
14706       for(i=0; i<nCol; i++){
14707         azCols[i] = (char *)sqlite3_column_name(pStmt, i);
14708       }
14709       do{
14710         nRow++;
14711         /* extract the data and data types */
14712         for(i=0; i<nCol; i++){
14713           aiTypes[i] = x = sqlite3_column_type(pStmt, i);
14714           if( x==SQLITE_BLOB
14715            && pArg
14716            && (pArg->cMode==MODE_Insert || pArg->cMode==MODE_Quote)
14717           ){
14718             azVals[i] = "";
14719           }else{
14720             azVals[i] = (char*)sqlite3_column_text(pStmt, i);
14721           }
14722           if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
14723             rc = SQLITE_NOMEM;
14724             break; /* from for */
14725           }
14726         } /* end for */
14727 
14728         /* if data and types extracted successfully... */
14729         if( SQLITE_ROW == rc ){
14730           /* call the supplied callback with the result row data */
14731           if( shell_callback(pArg, nCol, azVals, azCols, aiTypes) ){
14732             rc = SQLITE_ABORT;
14733           }else{
14734             rc = sqlite3_step(pStmt);
14735           }
14736         }
14737       } while( SQLITE_ROW == rc );
14738       sqlite3_free(pData);
14739       if( pArg->cMode==MODE_Json ){
14740         fputs("]\n", pArg->out);
14741       }else if( pArg->cMode==MODE_Count ){
14742         char zBuf[200];
14743         sqlite3_snprintf(sizeof(zBuf), zBuf, "%llu row%s\n",
14744                          nRow, nRow!=1 ? "s" : "");
14745         printf("%s", zBuf);
14746       }
14747     }
14748   }
14749 }
14750 
14751 #ifndef SQLITE_OMIT_VIRTUALTABLE
14752 /*
14753 ** This function is called to process SQL if the previous shell command
14754 ** was ".expert". It passes the SQL in the second argument directly to
14755 ** the sqlite3expert object.
14756 **
14757 ** If successful, SQLITE_OK is returned. Otherwise, an SQLite error
14758 ** code. In this case, (*pzErr) may be set to point to a buffer containing
14759 ** an English language error message. It is the responsibility of the
14760 ** caller to eventually free this buffer using sqlite3_free().
14761 */
14762 static int expertHandleSQL(
14763   ShellState *pState,
14764   const char *zSql,
14765   char **pzErr
14766 ){
14767   assert( pState->expert.pExpert );
14768   assert( pzErr==0 || *pzErr==0 );
14769   return sqlite3_expert_sql(pState->expert.pExpert, zSql, pzErr);
14770 }
14771 
14772 /*
14773 ** This function is called either to silently clean up the object
14774 ** created by the ".expert" command (if bCancel==1), or to generate a
14775 ** report from it and then clean it up (if bCancel==0).
14776 **
14777 ** If successful, SQLITE_OK is returned. Otherwise, an SQLite error
14778 ** code. In this case, (*pzErr) may be set to point to a buffer containing
14779 ** an English language error message. It is the responsibility of the
14780 ** caller to eventually free this buffer using sqlite3_free().
14781 */
14782 static int expertFinish(
14783   ShellState *pState,
14784   int bCancel,
14785   char **pzErr
14786 ){
14787   int rc = SQLITE_OK;
14788   sqlite3expert *p = pState->expert.pExpert;
14789   assert( p );
14790   assert( bCancel || pzErr==0 || *pzErr==0 );
14791   if( bCancel==0 ){
14792     FILE *out = pState->out;
14793     int bVerbose = pState->expert.bVerbose;
14794 
14795     rc = sqlite3_expert_analyze(p, pzErr);
14796     if( rc==SQLITE_OK ){
14797       int nQuery = sqlite3_expert_count(p);
14798       int i;
14799 
14800       if( bVerbose ){
14801         const char *zCand = sqlite3_expert_report(p,0,EXPERT_REPORT_CANDIDATES);
14802         raw_printf(out, "-- Candidates -----------------------------\n");
14803         raw_printf(out, "%s\n", zCand);
14804       }
14805       for(i=0; i<nQuery; i++){
14806         const char *zSql = sqlite3_expert_report(p, i, EXPERT_REPORT_SQL);
14807         const char *zIdx = sqlite3_expert_report(p, i, EXPERT_REPORT_INDEXES);
14808         const char *zEQP = sqlite3_expert_report(p, i, EXPERT_REPORT_PLAN);
14809         if( zIdx==0 ) zIdx = "(no new indexes)\n";
14810         if( bVerbose ){
14811           raw_printf(out, "-- Query %d --------------------------------\n",i+1);
14812           raw_printf(out, "%s\n\n", zSql);
14813         }
14814         raw_printf(out, "%s\n", zIdx);
14815         raw_printf(out, "%s\n", zEQP);
14816       }
14817     }
14818   }
14819   sqlite3_expert_destroy(p);
14820   pState->expert.pExpert = 0;
14821   return rc;
14822 }
14823 
14824 /*
14825 ** Implementation of ".expert" dot command.
14826 */
14827 static int expertDotCommand(
14828   ShellState *pState,             /* Current shell tool state */
14829   char **azArg,                   /* Array of arguments passed to dot command */
14830   int nArg                        /* Number of entries in azArg[] */
14831 ){
14832   int rc = SQLITE_OK;
14833   char *zErr = 0;
14834   int i;
14835   int iSample = 0;
14836 
14837   assert( pState->expert.pExpert==0 );
14838   memset(&pState->expert, 0, sizeof(ExpertInfo));
14839 
14840   for(i=1; rc==SQLITE_OK && i<nArg; i++){
14841     char *z = azArg[i];
14842     int n;
14843     if( z[0]=='-' && z[1]=='-' ) z++;
14844     n = strlen30(z);
14845     if( n>=2 && 0==strncmp(z, "-verbose", n) ){
14846       pState->expert.bVerbose = 1;
14847     }
14848     else if( n>=2 && 0==strncmp(z, "-sample", n) ){
14849       if( i==(nArg-1) ){
14850         raw_printf(stderr, "option requires an argument: %s\n", z);
14851         rc = SQLITE_ERROR;
14852       }else{
14853         iSample = (int)integerValue(azArg[++i]);
14854         if( iSample<0 || iSample>100 ){
14855           raw_printf(stderr, "value out of range: %s\n", azArg[i]);
14856           rc = SQLITE_ERROR;
14857         }
14858       }
14859     }
14860     else{
14861       raw_printf(stderr, "unknown option: %s\n", z);
14862       rc = SQLITE_ERROR;
14863     }
14864   }
14865 
14866   if( rc==SQLITE_OK ){
14867     pState->expert.pExpert = sqlite3_expert_new(pState->db, &zErr);
14868     if( pState->expert.pExpert==0 ){
14869       raw_printf(stderr, "sqlite3_expert_new: %s\n", zErr ? zErr : "out of memory");
14870       rc = SQLITE_ERROR;
14871     }else{
14872       sqlite3_expert_config(
14873           pState->expert.pExpert, EXPERT_CONFIG_SAMPLE, iSample
14874       );
14875     }
14876   }
14877   sqlite3_free(zErr);
14878 
14879   return rc;
14880 }
14881 #endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
14882 
14883 /*
14884 ** Execute a statement or set of statements.  Print
14885 ** any result rows/columns depending on the current mode
14886 ** set via the supplied callback.
14887 **
14888 ** This is very similar to SQLite's built-in sqlite3_exec()
14889 ** function except it takes a slightly different callback
14890 ** and callback data argument.
14891 */
14892 static int shell_exec(
14893   ShellState *pArg,                         /* Pointer to ShellState */
14894   const char *zSql,                         /* SQL to be evaluated */
14895   char **pzErrMsg                           /* Error msg written here */
14896 ){
14897   sqlite3_stmt *pStmt = NULL;     /* Statement to execute. */
14898   int rc = SQLITE_OK;             /* Return Code */
14899   int rc2;
14900   const char *zLeftover;          /* Tail of unprocessed SQL */
14901   sqlite3 *db = pArg->db;
14902 
14903   if( pzErrMsg ){
14904     *pzErrMsg = NULL;
14905   }
14906 
14907 #ifndef SQLITE_OMIT_VIRTUALTABLE
14908   if( pArg->expert.pExpert ){
14909     rc = expertHandleSQL(pArg, zSql, pzErrMsg);
14910     return expertFinish(pArg, (rc!=SQLITE_OK), pzErrMsg);
14911   }
14912 #endif
14913 
14914   while( zSql[0] && (SQLITE_OK == rc) ){
14915     static const char *zStmtSql;
14916     rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
14917     if( SQLITE_OK != rc ){
14918       if( pzErrMsg ){
14919         *pzErrMsg = save_err_msg(db, "in prepare", rc, zSql);
14920       }
14921     }else{
14922       if( !pStmt ){
14923         /* this happens for a comment or white-space */
14924         zSql = zLeftover;
14925         while( IsSpace(zSql[0]) ) zSql++;
14926         continue;
14927       }
14928       zStmtSql = sqlite3_sql(pStmt);
14929       if( zStmtSql==0 ) zStmtSql = "";
14930       while( IsSpace(zStmtSql[0]) ) zStmtSql++;
14931 
14932       /* save off the prepared statment handle and reset row count */
14933       if( pArg ){
14934         pArg->pStmt = pStmt;
14935         pArg->cnt = 0;
14936       }
14937 
14938       /* Show the EXPLAIN QUERY PLAN if .eqp is on */
14939       if( pArg && pArg->autoEQP && sqlite3_stmt_isexplain(pStmt)==0 ){
14940         sqlite3_stmt *pExplain;
14941         char *zEQP;
14942         int triggerEQP = 0;
14943         disable_debug_trace_modes();
14944         sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, -1, &triggerEQP);
14945         if( pArg->autoEQP>=AUTOEQP_trigger ){
14946           sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 1, 0);
14947         }
14948         zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s", zStmtSql);
14949         shell_check_oom(zEQP);
14950         rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
14951         if( rc==SQLITE_OK ){
14952           while( sqlite3_step(pExplain)==SQLITE_ROW ){
14953             const char *zEQPLine = (const char*)sqlite3_column_text(pExplain,3);
14954             int iEqpId = sqlite3_column_int(pExplain, 0);
14955             int iParentId = sqlite3_column_int(pExplain, 1);
14956             if( zEQPLine==0 ) zEQPLine = "";
14957             if( zEQPLine[0]=='-' ) eqp_render(pArg);
14958             eqp_append(pArg, iEqpId, iParentId, zEQPLine);
14959           }
14960           eqp_render(pArg);
14961         }
14962         sqlite3_finalize(pExplain);
14963         sqlite3_free(zEQP);
14964         if( pArg->autoEQP>=AUTOEQP_full ){
14965           /* Also do an EXPLAIN for ".eqp full" mode */
14966           zEQP = sqlite3_mprintf("EXPLAIN %s", zStmtSql);
14967           shell_check_oom(zEQP);
14968           rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
14969           if( rc==SQLITE_OK ){
14970             pArg->cMode = MODE_Explain;
14971             explain_data_prepare(pArg, pExplain);
14972             exec_prepared_stmt(pArg, pExplain);
14973             explain_data_delete(pArg);
14974           }
14975           sqlite3_finalize(pExplain);
14976           sqlite3_free(zEQP);
14977         }
14978         if( pArg->autoEQP>=AUTOEQP_trigger && triggerEQP==0 ){
14979           sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 0, 0);
14980           /* Reprepare pStmt before reactiving trace modes */
14981           sqlite3_finalize(pStmt);
14982           sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
14983           if( pArg ) pArg->pStmt = pStmt;
14984         }
14985         restore_debug_trace_modes();
14986       }
14987 
14988       if( pArg ){
14989         pArg->cMode = pArg->mode;
14990         if( pArg->autoExplain ){
14991           if( sqlite3_stmt_isexplain(pStmt)==1 ){
14992             pArg->cMode = MODE_Explain;
14993           }
14994           if( sqlite3_stmt_isexplain(pStmt)==2 ){
14995             pArg->cMode = MODE_EQP;
14996           }
14997         }
14998 
14999         /* If the shell is currently in ".explain" mode, gather the extra
15000         ** data required to add indents to the output.*/
15001         if( pArg->cMode==MODE_Explain ){
15002           explain_data_prepare(pArg, pStmt);
15003         }
15004       }
15005 
15006       bind_prepared_stmt(pArg, pStmt);
15007       exec_prepared_stmt(pArg, pStmt);
15008       explain_data_delete(pArg);
15009       eqp_render(pArg);
15010 
15011       /* print usage stats if stats on */
15012       if( pArg && pArg->statsOn ){
15013         display_stats(db, pArg, 0);
15014       }
15015 
15016       /* print loop-counters if required */
15017       if( pArg && pArg->scanstatsOn ){
15018         display_scanstats(db, pArg);
15019       }
15020 
15021       /* Finalize the statement just executed. If this fails, save a
15022       ** copy of the error message. Otherwise, set zSql to point to the
15023       ** next statement to execute. */
15024       rc2 = sqlite3_finalize(pStmt);
15025       if( rc!=SQLITE_NOMEM ) rc = rc2;
15026       if( rc==SQLITE_OK ){
15027         zSql = zLeftover;
15028         while( IsSpace(zSql[0]) ) zSql++;
15029       }else if( pzErrMsg ){
15030         *pzErrMsg = save_err_msg(db, "stepping", rc, 0);
15031       }
15032 
15033       /* clear saved stmt handle */
15034       if( pArg ){
15035         pArg->pStmt = NULL;
15036       }
15037     }
15038   } /* end while */
15039 
15040   return rc;
15041 }
15042 
15043 /*
15044 ** Release memory previously allocated by tableColumnList().
15045 */
15046 static void freeColumnList(char **azCol){
15047   int i;
15048   for(i=1; azCol[i]; i++){
15049     sqlite3_free(azCol[i]);
15050   }
15051   /* azCol[0] is a static string */
15052   sqlite3_free(azCol);
15053 }
15054 
15055 /*
15056 ** Return a list of pointers to strings which are the names of all
15057 ** columns in table zTab.   The memory to hold the names is dynamically
15058 ** allocated and must be released by the caller using a subsequent call
15059 ** to freeColumnList().
15060 **
15061 ** The azCol[0] entry is usually NULL.  However, if zTab contains a rowid
15062 ** value that needs to be preserved, then azCol[0] is filled in with the
15063 ** name of the rowid column.
15064 **
15065 ** The first regular column in the table is azCol[1].  The list is terminated
15066 ** by an entry with azCol[i]==0.
15067 */
15068 static char **tableColumnList(ShellState *p, const char *zTab){
15069   char **azCol = 0;
15070   sqlite3_stmt *pStmt;
15071   char *zSql;
15072   int nCol = 0;
15073   int nAlloc = 0;
15074   int nPK = 0;       /* Number of PRIMARY KEY columns seen */
15075   int isIPK = 0;     /* True if one PRIMARY KEY column of type INTEGER */
15076   int preserveRowid = ShellHasFlag(p, SHFLG_PreserveRowid);
15077   int rc;
15078 
15079   zSql = sqlite3_mprintf("PRAGMA table_info=%Q", zTab);
15080   shell_check_oom(zSql);
15081   rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
15082   sqlite3_free(zSql);
15083   if( rc ) return 0;
15084   while( sqlite3_step(pStmt)==SQLITE_ROW ){
15085     if( nCol>=nAlloc-2 ){
15086       nAlloc = nAlloc*2 + nCol + 10;
15087       azCol = sqlite3_realloc(azCol, nAlloc*sizeof(azCol[0]));
15088       shell_check_oom(azCol);
15089     }
15090     azCol[++nCol] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 1));
15091     shell_check_oom(azCol[nCol]);
15092     if( sqlite3_column_int(pStmt, 5) ){
15093       nPK++;
15094       if( nPK==1
15095        && sqlite3_stricmp((const char*)sqlite3_column_text(pStmt,2),
15096                           "INTEGER")==0
15097       ){
15098         isIPK = 1;
15099       }else{
15100         isIPK = 0;
15101       }
15102     }
15103   }
15104   sqlite3_finalize(pStmt);
15105   if( azCol==0 ) return 0;
15106   azCol[0] = 0;
15107   azCol[nCol+1] = 0;
15108 
15109   /* The decision of whether or not a rowid really needs to be preserved
15110   ** is tricky.  We never need to preserve a rowid for a WITHOUT ROWID table
15111   ** or a table with an INTEGER PRIMARY KEY.  We are unable to preserve
15112   ** rowids on tables where the rowid is inaccessible because there are other
15113   ** columns in the table named "rowid", "_rowid_", and "oid".
15114   */
15115   if( preserveRowid && isIPK ){
15116     /* If a single PRIMARY KEY column with type INTEGER was seen, then it
15117     ** might be an alise for the ROWID.  But it might also be a WITHOUT ROWID
15118     ** table or a INTEGER PRIMARY KEY DESC column, neither of which are
15119     ** ROWID aliases.  To distinguish these cases, check to see if
15120     ** there is a "pk" entry in "PRAGMA index_list".  There will be
15121     ** no "pk" index if the PRIMARY KEY really is an alias for the ROWID.
15122     */
15123     zSql = sqlite3_mprintf("SELECT 1 FROM pragma_index_list(%Q)"
15124                            " WHERE origin='pk'", zTab);
15125     shell_check_oom(zSql);
15126     rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
15127     sqlite3_free(zSql);
15128     if( rc ){
15129       freeColumnList(azCol);
15130       return 0;
15131     }
15132     rc = sqlite3_step(pStmt);
15133     sqlite3_finalize(pStmt);
15134     preserveRowid = rc==SQLITE_ROW;
15135   }
15136   if( preserveRowid ){
15137     /* Only preserve the rowid if we can find a name to use for the
15138     ** rowid */
15139     static char *azRowid[] = { "rowid", "_rowid_", "oid" };
15140     int i, j;
15141     for(j=0; j<3; j++){
15142       for(i=1; i<=nCol; i++){
15143         if( sqlite3_stricmp(azRowid[j],azCol[i])==0 ) break;
15144       }
15145       if( i>nCol ){
15146         /* At this point, we know that azRowid[j] is not the name of any
15147         ** ordinary column in the table.  Verify that azRowid[j] is a valid
15148         ** name for the rowid before adding it to azCol[0].  WITHOUT ROWID
15149         ** tables will fail this last check */
15150         rc = sqlite3_table_column_metadata(p->db,0,zTab,azRowid[j],0,0,0,0,0);
15151         if( rc==SQLITE_OK ) azCol[0] = azRowid[j];
15152         break;
15153       }
15154     }
15155   }
15156   return azCol;
15157 }
15158 
15159 /*
15160 ** Toggle the reverse_unordered_selects setting.
15161 */
15162 static void toggleSelectOrder(sqlite3 *db){
15163   sqlite3_stmt *pStmt = 0;
15164   int iSetting = 0;
15165   char zStmt[100];
15166   sqlite3_prepare_v2(db, "PRAGMA reverse_unordered_selects", -1, &pStmt, 0);
15167   if( sqlite3_step(pStmt)==SQLITE_ROW ){
15168     iSetting = sqlite3_column_int(pStmt, 0);
15169   }
15170   sqlite3_finalize(pStmt);
15171   sqlite3_snprintf(sizeof(zStmt), zStmt,
15172        "PRAGMA reverse_unordered_selects(%d)", !iSetting);
15173   sqlite3_exec(db, zStmt, 0, 0, 0);
15174 }
15175 
15176 /*
15177 ** This is a different callback routine used for dumping the database.
15178 ** Each row received by this callback consists of a table name,
15179 ** the table type ("index" or "table") and SQL to create the table.
15180 ** This routine should print text sufficient to recreate the table.
15181 */
15182 static int dump_callback(void *pArg, int nArg, char **azArg, char **azNotUsed){
15183   int rc;
15184   const char *zTable;
15185   const char *zType;
15186   const char *zSql;
15187   ShellState *p = (ShellState *)pArg;
15188   int dataOnly;
15189   int noSys;
15190 
15191   UNUSED_PARAMETER(azNotUsed);
15192   if( nArg!=3 || azArg==0 ) return 0;
15193   zTable = azArg[0];
15194   zType = azArg[1];
15195   zSql = azArg[2];
15196   dataOnly = (p->shellFlgs & SHFLG_DumpDataOnly)!=0;
15197   noSys    = (p->shellFlgs & SHFLG_DumpNoSys)!=0;
15198 
15199   if( strcmp(zTable, "sqlite_sequence")==0 && !noSys ){
15200     if( !dataOnly ) raw_printf(p->out, "DELETE FROM sqlite_sequence;\n");
15201   }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 && !noSys ){
15202     if( !dataOnly ) raw_printf(p->out, "ANALYZE sqlite_schema;\n");
15203   }else if( strncmp(zTable, "sqlite_", 7)==0 ){
15204     return 0;
15205   }else if( dataOnly ){
15206     /* no-op */
15207   }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
15208     char *zIns;
15209     if( !p->writableSchema ){
15210       raw_printf(p->out, "PRAGMA writable_schema=ON;\n");
15211       p->writableSchema = 1;
15212     }
15213     zIns = sqlite3_mprintf(
15214        "INSERT INTO sqlite_schema(type,name,tbl_name,rootpage,sql)"
15215        "VALUES('table','%q','%q',0,'%q');",
15216        zTable, zTable, zSql);
15217     shell_check_oom(zIns);
15218     utf8_printf(p->out, "%s\n", zIns);
15219     sqlite3_free(zIns);
15220     return 0;
15221   }else{
15222     printSchemaLine(p->out, zSql, ";\n");
15223   }
15224 
15225   if( strcmp(zType, "table")==0 ){
15226     ShellText sSelect;
15227     ShellText sTable;
15228     char **azCol;
15229     int i;
15230     char *savedDestTable;
15231     int savedMode;
15232 
15233     azCol = tableColumnList(p, zTable);
15234     if( azCol==0 ){
15235       p->nErr++;
15236       return 0;
15237     }
15238 
15239     /* Always quote the table name, even if it appears to be pure ascii,
15240     ** in case it is a keyword. Ex:  INSERT INTO "table" ... */
15241     initText(&sTable);
15242     appendText(&sTable, zTable, quoteChar(zTable));
15243     /* If preserving the rowid, add a column list after the table name.
15244     ** In other words:  "INSERT INTO tab(rowid,a,b,c,...) VALUES(...)"
15245     ** instead of the usual "INSERT INTO tab VALUES(...)".
15246     */
15247     if( azCol[0] ){
15248       appendText(&sTable, "(", 0);
15249       appendText(&sTable, azCol[0], 0);
15250       for(i=1; azCol[i]; i++){
15251         appendText(&sTable, ",", 0);
15252         appendText(&sTable, azCol[i], quoteChar(azCol[i]));
15253       }
15254       appendText(&sTable, ")", 0);
15255     }
15256 
15257     /* Build an appropriate SELECT statement */
15258     initText(&sSelect);
15259     appendText(&sSelect, "SELECT ", 0);
15260     if( azCol[0] ){
15261       appendText(&sSelect, azCol[0], 0);
15262       appendText(&sSelect, ",", 0);
15263     }
15264     for(i=1; azCol[i]; i++){
15265       appendText(&sSelect, azCol[i], quoteChar(azCol[i]));
15266       if( azCol[i+1] ){
15267         appendText(&sSelect, ",", 0);
15268       }
15269     }
15270     freeColumnList(azCol);
15271     appendText(&sSelect, " FROM ", 0);
15272     appendText(&sSelect, zTable, quoteChar(zTable));
15273 
15274     savedDestTable = p->zDestTable;
15275     savedMode = p->mode;
15276     p->zDestTable = sTable.z;
15277     p->mode = p->cMode = MODE_Insert;
15278     rc = shell_exec(p, sSelect.z, 0);
15279     if( (rc&0xff)==SQLITE_CORRUPT ){
15280       raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n");
15281       toggleSelectOrder(p->db);
15282       shell_exec(p, sSelect.z, 0);
15283       toggleSelectOrder(p->db);
15284     }
15285     p->zDestTable = savedDestTable;
15286     p->mode = savedMode;
15287     freeText(&sTable);
15288     freeText(&sSelect);
15289     if( rc ) p->nErr++;
15290   }
15291   return 0;
15292 }
15293 
15294 /*
15295 ** Run zQuery.  Use dump_callback() as the callback routine so that
15296 ** the contents of the query are output as SQL statements.
15297 **
15298 ** If we get a SQLITE_CORRUPT error, rerun the query after appending
15299 ** "ORDER BY rowid DESC" to the end.
15300 */
15301 static int run_schema_dump_query(
15302   ShellState *p,
15303   const char *zQuery
15304 ){
15305   int rc;
15306   char *zErr = 0;
15307   rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
15308   if( rc==SQLITE_CORRUPT ){
15309     char *zQ2;
15310     int len = strlen30(zQuery);
15311     raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n");
15312     if( zErr ){
15313       utf8_printf(p->out, "/****** %s ******/\n", zErr);
15314       sqlite3_free(zErr);
15315       zErr = 0;
15316     }
15317     zQ2 = malloc( len+100 );
15318     if( zQ2==0 ) return rc;
15319     sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
15320     rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
15321     if( rc ){
15322       utf8_printf(p->out, "/****** ERROR: %s ******/\n", zErr);
15323     }else{
15324       rc = SQLITE_CORRUPT;
15325     }
15326     sqlite3_free(zErr);
15327     free(zQ2);
15328   }
15329   return rc;
15330 }
15331 
15332 /*
15333 ** Text of help messages.
15334 **
15335 ** The help text for each individual command begins with a line that starts
15336 ** with ".".  Subsequent lines are supplemental information.
15337 **
15338 ** There must be two or more spaces between the end of the command and the
15339 ** start of the description of what that command does.
15340 */
15341 static const char *(azHelp[]) = {
15342 #if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE) \
15343   && !defined(SQLITE_SHELL_WASM_MODE)
15344   ".archive ...             Manage SQL archives",
15345   "   Each command must have exactly one of the following options:",
15346   "     -c, --create               Create a new archive",
15347   "     -u, --update               Add or update files with changed mtime",
15348   "     -i, --insert               Like -u but always add even if unchanged",
15349   "     -r, --remove               Remove files from archive",
15350   "     -t, --list                 List contents of archive",
15351   "     -x, --extract              Extract files from archive",
15352   "   Optional arguments:",
15353   "     -v, --verbose              Print each filename as it is processed",
15354   "     -f FILE, --file FILE       Use archive FILE (default is current db)",
15355   "     -a FILE, --append FILE     Open FILE using the apndvfs VFS",
15356   "     -C DIR, --directory DIR    Read/extract files from directory DIR",
15357   "     -g, --glob                 Use glob matching for names in archive",
15358   "     -n, --dryrun               Show the SQL that would have occurred",
15359   "   Examples:",
15360   "     .ar -cf ARCHIVE foo bar  # Create ARCHIVE from files foo and bar",
15361   "     .ar -tf ARCHIVE          # List members of ARCHIVE",
15362   "     .ar -xvf ARCHIVE         # Verbosely extract files from ARCHIVE",
15363   "   See also:",
15364   "      http://sqlite.org/cli.html#sqlite_archive_support",
15365 #endif
15366 #ifndef SQLITE_OMIT_AUTHORIZATION
15367   ".auth ON|OFF             Show authorizer callbacks",
15368 #endif
15369 #ifndef SQLITE_SHELL_WASM_MODE
15370   ".backup ?DB? FILE        Backup DB (default \"main\") to FILE",
15371   "   Options:",
15372   "       --append            Use the appendvfs",
15373   "       --async             Write to FILE without journal and fsync()",
15374 #endif
15375   ".bail on|off             Stop after hitting an error.  Default OFF",
15376   ".binary on|off           Turn binary output on or off.  Default OFF",
15377 #ifndef SQLITE_SHELL_WASM_MODE
15378   ".cd DIRECTORY            Change the working directory to DIRECTORY",
15379 #endif
15380   ".changes on|off          Show number of rows changed by SQL",
15381 #ifndef SQLITE_SHELL_WASM_MODE
15382   ".check GLOB              Fail if output since .testcase does not match",
15383   ".clone NEWDB             Clone data into NEWDB from the existing database",
15384 #endif
15385   ".connection [close] [#]  Open or close an auxiliary database connection",
15386   ".databases               List names and files of attached databases",
15387   ".dbconfig ?op? ?val?     List or change sqlite3_db_config() options",
15388 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
15389   ".dbinfo ?DB?             Show status information about the database",
15390 #endif
15391   ".dump ?OBJECTS?          Render database content as SQL",
15392   "   Options:",
15393   "     --data-only            Output only INSERT statements",
15394   "     --newlines             Allow unescaped newline characters in output",
15395   "     --nosys                Omit system tables (ex: \"sqlite_stat1\")",
15396   "     --preserve-rowids      Include ROWID values in the output",
15397   "   OBJECTS is a LIKE pattern for tables, indexes, triggers or views to dump",
15398   "   Additional LIKE patterns can be given in subsequent arguments",
15399   ".echo on|off             Turn command echo on or off",
15400   ".eqp on|off|full|...     Enable or disable automatic EXPLAIN QUERY PLAN",
15401   "   Other Modes:",
15402 #ifdef SQLITE_DEBUG
15403   "      test                  Show raw EXPLAIN QUERY PLAN output",
15404   "      trace                 Like \"full\" but enable \"PRAGMA vdbe_trace\"",
15405 #endif
15406   "      trigger               Like \"full\" but also show trigger bytecode",
15407 #ifndef SQLITE_SHELL_WASM_MODE
15408   ".excel                   Display the output of next command in spreadsheet",
15409   "   --bom                   Put a UTF8 byte-order mark on intermediate file",
15410 #endif
15411 #ifndef SQLITE_SHELL_WASM_MODE
15412   ".exit ?CODE?             Exit this program with return-code CODE",
15413 #endif
15414   ".expert                  EXPERIMENTAL. Suggest indexes for queries",
15415   ".explain ?on|off|auto?   Change the EXPLAIN formatting mode.  Default: auto",
15416   ".filectrl CMD ...        Run various sqlite3_file_control() operations",
15417   "   --schema SCHEMA         Use SCHEMA instead of \"main\"",
15418   "   --help                  Show CMD details",
15419   ".fullschema ?--indent?   Show schema and the content of sqlite_stat tables",
15420   ".headers on|off          Turn display of headers on or off",
15421   ".help ?-all? ?PATTERN?   Show help text for PATTERN",
15422 #ifndef SQLITE_SHELL_WASM_MODE
15423   ".import FILE TABLE       Import data from FILE into TABLE",
15424   "   Options:",
15425   "     --ascii               Use \\037 and \\036 as column and row separators",
15426   "     --csv                 Use , and \\n as column and row separators",
15427   "     --skip N              Skip the first N rows of input",
15428   "     --schema S            Target table to be S.TABLE",
15429   "     -v                    \"Verbose\" - increase auxiliary output",
15430   "   Notes:",
15431   "     *  If TABLE does not exist, it is created.  The first row of input",
15432   "        determines the column names.",
15433   "     *  If neither --csv or --ascii are used, the input mode is derived",
15434   "        from the \".mode\" output mode",
15435   "     *  If FILE begins with \"|\" then it is a command that generates the",
15436   "        input text.",
15437 #endif
15438 #ifndef SQLITE_OMIT_TEST_CONTROL
15439   ".imposter INDEX TABLE    Create imposter table TABLE on index INDEX",
15440 #endif
15441   ".indexes ?TABLE?         Show names of indexes",
15442   "                           If TABLE is specified, only show indexes for",
15443   "                           tables matching TABLE using the LIKE operator.",
15444 #ifdef SQLITE_ENABLE_IOTRACE
15445   ".iotrace FILE            Enable I/O diagnostic logging to FILE",
15446 #endif
15447   ".limit ?LIMIT? ?VAL?     Display or change the value of an SQLITE_LIMIT",
15448   ".lint OPTIONS            Report potential schema issues.",
15449   "     Options:",
15450   "        fkey-indexes     Find missing foreign key indexes",
15451 #if !defined(SQLITE_OMIT_LOAD_EXTENSION) && !defined(SQLITE_SHELL_WASM_MODE)
15452   ".load FILE ?ENTRY?       Load an extension library",
15453 #endif
15454 #ifndef SQLITE_SHELL_WASM_MODE
15455   ".log FILE|off            Turn logging on or off.  FILE can be stderr/stdout",
15456 #endif
15457   ".mode MODE ?OPTIONS?     Set output mode",
15458   "   MODE is one of:",
15459   "     ascii       Columns/rows delimited by 0x1F and 0x1E",
15460   "     box         Tables using unicode box-drawing characters",
15461   "     csv         Comma-separated values",
15462   "     column      Output in columns.  (See .width)",
15463   "     html        HTML <table> code",
15464   "     insert      SQL insert statements for TABLE",
15465   "     json        Results in a JSON array",
15466   "     line        One value per line",
15467   "     list        Values delimited by \"|\"",
15468   "     markdown    Markdown table format",
15469   "     qbox        Shorthand for \"box --width 60 --quote\"",
15470   "     quote       Escape answers as for SQL",
15471   "     table       ASCII-art table",
15472   "     tabs        Tab-separated values",
15473   "     tcl         TCL list elements",
15474   "   OPTIONS: (for columnar modes or insert mode):",
15475   "     --wrap N       Wrap output lines to no longer than N characters",
15476   "     --wordwrap B   Wrap or not at word boundaries per B (on/off)",
15477   "     --ww           Shorthand for \"--wordwrap 1\"",
15478   "     --quote        Quote output text as SQL literals",
15479   "     --noquote      Do not quote output text",
15480   "     TABLE          The name of SQL table used for \"insert\" mode",
15481 #ifndef SQLITE_SHELL_WASM_MODE
15482   ".nonce STRING            Suspend safe mode for one command if nonce matches",
15483 #endif
15484   ".nullvalue STRING        Use STRING in place of NULL values",
15485 #ifndef SQLITE_SHELL_WASM_MODE
15486   ".once ?OPTIONS? ?FILE?   Output for the next SQL command only to FILE",
15487   "     If FILE begins with '|' then open as a pipe",
15488   "       --bom  Put a UTF8 byte-order mark at the beginning",
15489   "       -e     Send output to the system text editor",
15490   "       -x     Send output as CSV to a spreadsheet (same as \".excel\")",
15491   /* Note that .open is (partially) available in WASM builds but is
15492   ** currently only intended to be used by the fiddle tool, not
15493   ** end users, so is "undocumented." */
15494   ".open ?OPTIONS? ?FILE?   Close existing database and reopen FILE",
15495   "     Options:",
15496   "        --append        Use appendvfs to append database to the end of FILE",
15497 #endif
15498 #ifndef SQLITE_OMIT_DESERIALIZE
15499   "        --deserialize   Load into memory using sqlite3_deserialize()",
15500   "        --hexdb         Load the output of \"dbtotxt\" as an in-memory db",
15501   "        --maxsize N     Maximum size for --hexdb or --deserialized database",
15502 #endif
15503   "        --new           Initialize FILE to an empty database",
15504   "        --nofollow      Do not follow symbolic links",
15505   "        --readonly      Open FILE readonly",
15506   "        --zip           FILE is a ZIP archive",
15507 #ifndef SQLITE_SHELL_WASM_MODE
15508   ".output ?FILE?           Send output to FILE or stdout if FILE is omitted",
15509   "   If FILE begins with '|' then open it as a pipe.",
15510   "   Options:",
15511   "     --bom                 Prefix output with a UTF8 byte-order mark",
15512   "     -e                    Send output to the system text editor",
15513   "     -x                    Send output as CSV to a spreadsheet",
15514 #endif
15515   ".parameter CMD ...       Manage SQL parameter bindings",
15516   "   clear                   Erase all bindings",
15517   "   init                    Initialize the TEMP table that holds bindings",
15518   "   list                    List the current parameter bindings",
15519   "   set PARAMETER VALUE     Given SQL parameter PARAMETER a value of VALUE",
15520   "                           PARAMETER should start with one of: $ : @ ?",
15521   "   unset PARAMETER         Remove PARAMETER from the binding table",
15522   ".print STRING...         Print literal STRING",
15523 #ifndef SQLITE_OMIT_PROGRESS_CALLBACK
15524   ".progress N              Invoke progress handler after every N opcodes",
15525   "   --limit N                 Interrupt after N progress callbacks",
15526   "   --once                    Do no more than one progress interrupt",
15527   "   --quiet|-q                No output except at interrupts",
15528   "   --reset                   Reset the count for each input and interrupt",
15529 #endif
15530   ".prompt MAIN CONTINUE    Replace the standard prompts",
15531 #ifndef SQLITE_SHELL_WASM_MODE
15532   ".quit                    Exit this program",
15533   ".read FILE               Read input from FILE or command output",
15534   "    If FILE begins with \"|\", it is a command that generates the input.",
15535 #endif
15536 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
15537   ".recover                 Recover as much data as possible from corrupt db.",
15538   "   --freelist-corrupt       Assume the freelist is corrupt",
15539   "   --recovery-db NAME       Store recovery metadata in database file NAME",
15540   "   --lost-and-found TABLE   Alternative name for the lost-and-found table",
15541   "   --no-rowids              Do not attempt to recover rowid values",
15542   "                            that are not also INTEGER PRIMARY KEYs",
15543 #endif
15544 #ifndef SQLITE_SHELL_WASM_MODE
15545   ".restore ?DB? FILE       Restore content of DB (default \"main\") from FILE",
15546   ".save ?OPTIONS? FILE     Write database to FILE (an alias for .backup ...)",
15547 #endif
15548   ".scanstats on|off        Turn sqlite3_stmt_scanstatus() metrics on or off",
15549   ".schema ?PATTERN?        Show the CREATE statements matching PATTERN",
15550   "   Options:",
15551   "      --indent             Try to pretty-print the schema",
15552   "      --nosys              Omit objects whose names start with \"sqlite_\"",
15553   ".selftest ?OPTIONS?      Run tests defined in the SELFTEST table",
15554   "    Options:",
15555   "       --init               Create a new SELFTEST table",
15556   "       -v                   Verbose output",
15557   ".separator COL ?ROW?     Change the column and row separators",
15558 #if defined(SQLITE_ENABLE_SESSION)
15559   ".session ?NAME? CMD ...  Create or control sessions",
15560   "   Subcommands:",
15561   "     attach TABLE             Attach TABLE",
15562   "     changeset FILE           Write a changeset into FILE",
15563   "     close                    Close one session",
15564   "     enable ?BOOLEAN?         Set or query the enable bit",
15565   "     filter GLOB...           Reject tables matching GLOBs",
15566   "     indirect ?BOOLEAN?       Mark or query the indirect status",
15567   "     isempty                  Query whether the session is empty",
15568   "     list                     List currently open session names",
15569   "     open DB NAME             Open a new session on DB",
15570   "     patchset FILE            Write a patchset into FILE",
15571   "   If ?NAME? is omitted, the first defined session is used.",
15572 #endif
15573   ".sha3sum ...             Compute a SHA3 hash of database content",
15574   "    Options:",
15575   "      --schema              Also hash the sqlite_schema table",
15576   "      --sha3-224            Use the sha3-224 algorithm",
15577   "      --sha3-256            Use the sha3-256 algorithm (default)",
15578   "      --sha3-384            Use the sha3-384 algorithm",
15579   "      --sha3-512            Use the sha3-512 algorithm",
15580   "    Any other argument is a LIKE pattern for tables to hash",
15581 #if !defined(SQLITE_NOHAVE_SYSTEM) && !defined(SQLITE_SHELL_WASM_MODE)
15582   ".shell CMD ARGS...       Run CMD ARGS... in a system shell",
15583 #endif
15584   ".show                    Show the current values for various settings",
15585   ".stats ?ARG?             Show stats or turn stats on or off",
15586   "   off                      Turn off automatic stat display",
15587   "   on                       Turn on automatic stat display",
15588   "   stmt                     Show statement stats",
15589   "   vmstep                   Show the virtual machine step count only",
15590 #if !defined(SQLITE_NOHAVE_SYSTEM) && !defined(SQLITE_SHELL_WASM_MODE)
15591   ".system CMD ARGS...      Run CMD ARGS... in a system shell",
15592 #endif
15593   ".tables ?TABLE?          List names of tables matching LIKE pattern TABLE",
15594 #ifndef SQLITE_SHELL_WASM_MODE
15595   ".testcase NAME           Begin redirecting output to 'testcase-out.txt'",
15596 #endif
15597   ".testctrl CMD ...        Run various sqlite3_test_control() operations",
15598   "                           Run \".testctrl\" with no arguments for details",
15599   ".timeout MS              Try opening locked tables for MS milliseconds",
15600   ".timer on|off            Turn SQL timer on or off",
15601 #ifndef SQLITE_OMIT_TRACE
15602   ".trace ?OPTIONS?         Output each SQL statement as it is run",
15603   "    FILE                    Send output to FILE",
15604   "    stdout                  Send output to stdout",
15605   "    stderr                  Send output to stderr",
15606   "    off                     Disable tracing",
15607   "    --expanded              Expand query parameters",
15608 #ifdef SQLITE_ENABLE_NORMALIZE
15609   "    --normalized            Normal the SQL statements",
15610 #endif
15611   "    --plain                 Show SQL as it is input",
15612   "    --stmt                  Trace statement execution (SQLITE_TRACE_STMT)",
15613   "    --profile               Profile statements (SQLITE_TRACE_PROFILE)",
15614   "    --row                   Trace each row (SQLITE_TRACE_ROW)",
15615   "    --close                 Trace connection close (SQLITE_TRACE_CLOSE)",
15616 #endif /* SQLITE_OMIT_TRACE */
15617 #ifdef SQLITE_DEBUG
15618   ".unmodule NAME ...       Unregister virtual table modules",
15619   "    --allexcept             Unregister everything except those named",
15620 #endif
15621   ".vfsinfo ?AUX?           Information about the top-level VFS",
15622   ".vfslist                 List all available VFSes",
15623   ".vfsname ?AUX?           Print the name of the VFS stack",
15624   ".width NUM1 NUM2 ...     Set minimum column widths for columnar output",
15625   "     Negative values right-justify",
15626 };
15627 
15628 /*
15629 ** Output help text.
15630 **
15631 ** zPattern describes the set of commands for which help text is provided.
15632 ** If zPattern is NULL, then show all commands, but only give a one-line
15633 ** description of each.
15634 **
15635 ** Return the number of matches.
15636 */
15637 static int showHelp(FILE *out, const char *zPattern){
15638   int i = 0;
15639   int j = 0;
15640   int n = 0;
15641   char *zPat;
15642   if( zPattern==0
15643    || zPattern[0]=='0'
15644    || strcmp(zPattern,"-a")==0
15645    || strcmp(zPattern,"-all")==0
15646    || strcmp(zPattern,"--all")==0
15647   ){
15648     /* Show all commands, but only one line per command */
15649     if( zPattern==0 ) zPattern = "";
15650     for(i=0; i<ArraySize(azHelp); i++){
15651       if( azHelp[i][0]=='.' || zPattern[0] ){
15652         utf8_printf(out, "%s\n", azHelp[i]);
15653         n++;
15654       }
15655     }
15656   }else{
15657     /* Look for commands that for which zPattern is an exact prefix */
15658     zPat = sqlite3_mprintf(".%s*", zPattern);
15659     shell_check_oom(zPat);
15660     for(i=0; i<ArraySize(azHelp); i++){
15661       if( sqlite3_strglob(zPat, azHelp[i])==0 ){
15662         utf8_printf(out, "%s\n", azHelp[i]);
15663         j = i+1;
15664         n++;
15665       }
15666     }
15667     sqlite3_free(zPat);
15668     if( n ){
15669       if( n==1 ){
15670         /* when zPattern is a prefix of exactly one command, then include the
15671         ** details of that command, which should begin at offset j */
15672         while( j<ArraySize(azHelp)-1 && azHelp[j][0]!='.' ){
15673           utf8_printf(out, "%s\n", azHelp[j]);
15674           j++;
15675         }
15676       }
15677       return n;
15678     }
15679     /* Look for commands that contain zPattern anywhere.  Show the complete
15680     ** text of all commands that match. */
15681     zPat = sqlite3_mprintf("%%%s%%", zPattern);
15682     shell_check_oom(zPat);
15683     for(i=0; i<ArraySize(azHelp); i++){
15684       if( azHelp[i][0]=='.' ) j = i;
15685       if( sqlite3_strlike(zPat, azHelp[i], 0)==0 ){
15686         utf8_printf(out, "%s\n", azHelp[j]);
15687         while( j<ArraySize(azHelp)-1 && azHelp[j+1][0]!='.' ){
15688           j++;
15689           utf8_printf(out, "%s\n", azHelp[j]);
15690         }
15691         i = j;
15692         n++;
15693       }
15694     }
15695     sqlite3_free(zPat);
15696   }
15697   return n;
15698 }
15699 
15700 /* Forward reference */
15701 static int process_input(ShellState *p);
15702 
15703 /*
15704 ** Read the content of file zName into memory obtained from sqlite3_malloc64()
15705 ** and return a pointer to the buffer. The caller is responsible for freeing
15706 ** the memory.
15707 **
15708 ** If parameter pnByte is not NULL, (*pnByte) is set to the number of bytes
15709 ** read.
15710 **
15711 ** For convenience, a nul-terminator byte is always appended to the data read
15712 ** from the file before the buffer is returned. This byte is not included in
15713 ** the final value of (*pnByte), if applicable.
15714 **
15715 ** NULL is returned if any error is encountered. The final value of *pnByte
15716 ** is undefined in this case.
15717 */
15718 static char *readFile(const char *zName, int *pnByte){
15719   FILE *in = fopen(zName, "rb");
15720   long nIn;
15721   size_t nRead;
15722   char *pBuf;
15723   if( in==0 ) return 0;
15724   fseek(in, 0, SEEK_END);
15725   nIn = ftell(in);
15726   rewind(in);
15727   pBuf = sqlite3_malloc64( nIn+1 );
15728   if( pBuf==0 ){ fclose(in); return 0; }
15729   nRead = fread(pBuf, nIn, 1, in);
15730   fclose(in);
15731   if( nRead!=1 ){
15732     sqlite3_free(pBuf);
15733     return 0;
15734   }
15735   pBuf[nIn] = 0;
15736   if( pnByte ) *pnByte = nIn;
15737   return pBuf;
15738 }
15739 
15740 #if defined(SQLITE_ENABLE_SESSION)
15741 /*
15742 ** Close a single OpenSession object and release all of its associated
15743 ** resources.
15744 */
15745 static void session_close(OpenSession *pSession){
15746   int i;
15747   sqlite3session_delete(pSession->p);
15748   sqlite3_free(pSession->zName);
15749   for(i=0; i<pSession->nFilter; i++){
15750     sqlite3_free(pSession->azFilter[i]);
15751   }
15752   sqlite3_free(pSession->azFilter);
15753   memset(pSession, 0, sizeof(OpenSession));
15754 }
15755 #endif
15756 
15757 /*
15758 ** Close all OpenSession objects and release all associated resources.
15759 */
15760 #if defined(SQLITE_ENABLE_SESSION)
15761 static void session_close_all(ShellState *p, int i){
15762   int j;
15763   struct AuxDb *pAuxDb = i<0 ? p->pAuxDb : &p->aAuxDb[i];
15764   for(j=0; j<pAuxDb->nSession; j++){
15765     session_close(&pAuxDb->aSession[j]);
15766   }
15767   pAuxDb->nSession = 0;
15768 }
15769 #else
15770 # define session_close_all(X,Y)
15771 #endif
15772 
15773 /*
15774 ** Implementation of the xFilter function for an open session.  Omit
15775 ** any tables named by ".session filter" but let all other table through.
15776 */
15777 #if defined(SQLITE_ENABLE_SESSION)
15778 static int session_filter(void *pCtx, const char *zTab){
15779   OpenSession *pSession = (OpenSession*)pCtx;
15780   int i;
15781   for(i=0; i<pSession->nFilter; i++){
15782     if( sqlite3_strglob(pSession->azFilter[i], zTab)==0 ) return 0;
15783   }
15784   return 1;
15785 }
15786 #endif
15787 
15788 /*
15789 ** Try to deduce the type of file for zName based on its content.  Return
15790 ** one of the SHELL_OPEN_* constants.
15791 **
15792 ** If the file does not exist or is empty but its name looks like a ZIP
15793 ** archive and the dfltZip flag is true, then assume it is a ZIP archive.
15794 ** Otherwise, assume an ordinary database regardless of the filename if
15795 ** the type cannot be determined from content.
15796 */
15797 int deduceDatabaseType(const char *zName, int dfltZip){
15798   FILE *f = fopen(zName, "rb");
15799   size_t n;
15800   int rc = SHELL_OPEN_UNSPEC;
15801   char zBuf[100];
15802   if( f==0 ){
15803     if( dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){
15804        return SHELL_OPEN_ZIPFILE;
15805     }else{
15806        return SHELL_OPEN_NORMAL;
15807     }
15808   }
15809   n = fread(zBuf, 16, 1, f);
15810   if( n==1 && memcmp(zBuf, "SQLite format 3", 16)==0 ){
15811     fclose(f);
15812     return SHELL_OPEN_NORMAL;
15813   }
15814   fseek(f, -25, SEEK_END);
15815   n = fread(zBuf, 25, 1, f);
15816   if( n==1 && memcmp(zBuf, "Start-Of-SQLite3-", 17)==0 ){
15817     rc = SHELL_OPEN_APPENDVFS;
15818   }else{
15819     fseek(f, -22, SEEK_END);
15820     n = fread(zBuf, 22, 1, f);
15821     if( n==1 && zBuf[0]==0x50 && zBuf[1]==0x4b && zBuf[2]==0x05
15822        && zBuf[3]==0x06 ){
15823       rc = SHELL_OPEN_ZIPFILE;
15824     }else if( n==0 && dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){
15825       rc = SHELL_OPEN_ZIPFILE;
15826     }
15827   }
15828   fclose(f);
15829   return rc;
15830 }
15831 
15832 #ifndef SQLITE_OMIT_DESERIALIZE
15833 /*
15834 ** Reconstruct an in-memory database using the output from the "dbtotxt"
15835 ** program.  Read content from the file in p->aAuxDb[].zDbFilename.
15836 ** If p->aAuxDb[].zDbFilename is 0, then read from standard input.
15837 */
15838 static unsigned char *readHexDb(ShellState *p, int *pnData){
15839   unsigned char *a = 0;
15840   int nLine;
15841   int n = 0;
15842   int pgsz = 0;
15843   int iOffset = 0;
15844   int j, k;
15845   int rc;
15846   FILE *in;
15847   const char *zDbFilename = p->pAuxDb->zDbFilename;
15848   unsigned int x[16];
15849   char zLine[1000];
15850   if( zDbFilename ){
15851     in = fopen(zDbFilename, "r");
15852     if( in==0 ){
15853       utf8_printf(stderr, "cannot open \"%s\" for reading\n", zDbFilename);
15854       return 0;
15855     }
15856     nLine = 0;
15857   }else{
15858     in = p->in;
15859     nLine = p->lineno;
15860     if( in==0 ) in = stdin;
15861   }
15862   *pnData = 0;
15863   nLine++;
15864   if( fgets(zLine, sizeof(zLine), in)==0 ) goto readHexDb_error;
15865   rc = sscanf(zLine, "| size %d pagesize %d", &n, &pgsz);
15866   if( rc!=2 ) goto readHexDb_error;
15867   if( n<0 ) goto readHexDb_error;
15868   if( pgsz<512 || pgsz>65536 || (pgsz&(pgsz-1))!=0 ) goto readHexDb_error;
15869   n = (n+pgsz-1)&~(pgsz-1);  /* Round n up to the next multiple of pgsz */
15870   a = sqlite3_malloc( n ? n : 1 );
15871   shell_check_oom(a);
15872   memset(a, 0, n);
15873   if( pgsz<512 || pgsz>65536 || (pgsz & (pgsz-1))!=0 ){
15874     utf8_printf(stderr, "invalid pagesize\n");
15875     goto readHexDb_error;
15876   }
15877   for(nLine++; fgets(zLine, sizeof(zLine), in)!=0; nLine++){
15878     rc = sscanf(zLine, "| page %d offset %d", &j, &k);
15879     if( rc==2 ){
15880       iOffset = k;
15881       continue;
15882     }
15883     if( strncmp(zLine, "| end ", 6)==0 ){
15884       break;
15885     }
15886     rc = sscanf(zLine,"| %d: %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x",
15887                 &j, &x[0], &x[1], &x[2], &x[3], &x[4], &x[5], &x[6], &x[7],
15888                 &x[8], &x[9], &x[10], &x[11], &x[12], &x[13], &x[14], &x[15]);
15889     if( rc==17 ){
15890       k = iOffset+j;
15891       if( k+16<=n && k>=0 ){
15892         int ii;
15893         for(ii=0; ii<16; ii++) a[k+ii] = x[ii]&0xff;
15894       }
15895     }
15896   }
15897   *pnData = n;
15898   if( in!=p->in ){
15899     fclose(in);
15900   }else{
15901     p->lineno = nLine;
15902   }
15903   return a;
15904 
15905 readHexDb_error:
15906   if( in!=p->in ){
15907     fclose(in);
15908   }else{
15909     while( fgets(zLine, sizeof(zLine), p->in)!=0 ){
15910       nLine++;
15911       if(strncmp(zLine, "| end ", 6)==0 ) break;
15912     }
15913     p->lineno = nLine;
15914   }
15915   sqlite3_free(a);
15916   utf8_printf(stderr,"Error on line %d of --hexdb input\n", nLine);
15917   return 0;
15918 }
15919 #endif /* SQLITE_OMIT_DESERIALIZE */
15920 
15921 /*
15922 ** Scalar function "shell_int32". The first argument to this function
15923 ** must be a blob. The second a non-negative integer. This function
15924 ** reads and returns a 32-bit big-endian integer from byte
15925 ** offset (4*<arg2>) of the blob.
15926 */
15927 static void shellInt32(
15928   sqlite3_context *context,
15929   int argc,
15930   sqlite3_value **argv
15931 ){
15932   const unsigned char *pBlob;
15933   int nBlob;
15934   int iInt;
15935 
15936   UNUSED_PARAMETER(argc);
15937   nBlob = sqlite3_value_bytes(argv[0]);
15938   pBlob = (const unsigned char*)sqlite3_value_blob(argv[0]);
15939   iInt = sqlite3_value_int(argv[1]);
15940 
15941   if( iInt>=0 && (iInt+1)*4<=nBlob ){
15942     const unsigned char *a = &pBlob[iInt*4];
15943     sqlite3_int64 iVal = ((sqlite3_int64)a[0]<<24)
15944                        + ((sqlite3_int64)a[1]<<16)
15945                        + ((sqlite3_int64)a[2]<< 8)
15946                        + ((sqlite3_int64)a[3]<< 0);
15947     sqlite3_result_int64(context, iVal);
15948   }
15949 }
15950 
15951 /*
15952 ** Scalar function "shell_idquote(X)" returns string X quoted as an identifier,
15953 ** using "..." with internal double-quote characters doubled.
15954 */
15955 static void shellIdQuote(
15956   sqlite3_context *context,
15957   int argc,
15958   sqlite3_value **argv
15959 ){
15960   const char *zName = (const char*)sqlite3_value_text(argv[0]);
15961   UNUSED_PARAMETER(argc);
15962   if( zName ){
15963     char *z = sqlite3_mprintf("\"%w\"", zName);
15964     sqlite3_result_text(context, z, -1, sqlite3_free);
15965   }
15966 }
15967 
15968 /*
15969 ** Scalar function "usleep(X)" invokes sqlite3_sleep(X) and returns X.
15970 */
15971 static void shellUSleepFunc(
15972   sqlite3_context *context,
15973   int argcUnused,
15974   sqlite3_value **argv
15975 ){
15976   int sleep = sqlite3_value_int(argv[0]);
15977   (void)argcUnused;
15978   sqlite3_sleep(sleep/1000);
15979   sqlite3_result_int(context, sleep);
15980 }
15981 
15982 /*
15983 ** Scalar function "shell_escape_crnl" used by the .recover command.
15984 ** The argument passed to this function is the output of built-in
15985 ** function quote(). If the first character of the input is "'",
15986 ** indicating that the value passed to quote() was a text value,
15987 ** then this function searches the input for "\n" and "\r" characters
15988 ** and adds a wrapper similar to the following:
15989 **
15990 **   replace(replace(<input>, '\n', char(10), '\r', char(13));
15991 **
15992 ** Or, if the first character of the input is not "'", then a copy
15993 ** of the input is returned.
15994 */
15995 static void shellEscapeCrnl(
15996   sqlite3_context *context,
15997   int argc,
15998   sqlite3_value **argv
15999 ){
16000   const char *zText = (const char*)sqlite3_value_text(argv[0]);
16001   UNUSED_PARAMETER(argc);
16002   if( zText && zText[0]=='\'' ){
16003     int nText = sqlite3_value_bytes(argv[0]);
16004     int i;
16005     char zBuf1[20];
16006     char zBuf2[20];
16007     const char *zNL = 0;
16008     const char *zCR = 0;
16009     int nCR = 0;
16010     int nNL = 0;
16011 
16012     for(i=0; zText[i]; i++){
16013       if( zNL==0 && zText[i]=='\n' ){
16014         zNL = unused_string(zText, "\\n", "\\012", zBuf1);
16015         nNL = (int)strlen(zNL);
16016       }
16017       if( zCR==0 && zText[i]=='\r' ){
16018         zCR = unused_string(zText, "\\r", "\\015", zBuf2);
16019         nCR = (int)strlen(zCR);
16020       }
16021     }
16022 
16023     if( zNL || zCR ){
16024       int iOut = 0;
16025       i64 nMax = (nNL > nCR) ? nNL : nCR;
16026       i64 nAlloc = nMax * nText + (nMax+64)*2;
16027       char *zOut = (char*)sqlite3_malloc64(nAlloc);
16028       if( zOut==0 ){
16029         sqlite3_result_error_nomem(context);
16030         return;
16031       }
16032 
16033       if( zNL && zCR ){
16034         memcpy(&zOut[iOut], "replace(replace(", 16);
16035         iOut += 16;
16036       }else{
16037         memcpy(&zOut[iOut], "replace(", 8);
16038         iOut += 8;
16039       }
16040       for(i=0; zText[i]; i++){
16041         if( zText[i]=='\n' ){
16042           memcpy(&zOut[iOut], zNL, nNL);
16043           iOut += nNL;
16044         }else if( zText[i]=='\r' ){
16045           memcpy(&zOut[iOut], zCR, nCR);
16046           iOut += nCR;
16047         }else{
16048           zOut[iOut] = zText[i];
16049           iOut++;
16050         }
16051       }
16052 
16053       if( zNL ){
16054         memcpy(&zOut[iOut], ",'", 2); iOut += 2;
16055         memcpy(&zOut[iOut], zNL, nNL); iOut += nNL;
16056         memcpy(&zOut[iOut], "', char(10))", 12); iOut += 12;
16057       }
16058       if( zCR ){
16059         memcpy(&zOut[iOut], ",'", 2); iOut += 2;
16060         memcpy(&zOut[iOut], zCR, nCR); iOut += nCR;
16061         memcpy(&zOut[iOut], "', char(13))", 12); iOut += 12;
16062       }
16063 
16064       sqlite3_result_text(context, zOut, iOut, SQLITE_TRANSIENT);
16065       sqlite3_free(zOut);
16066       return;
16067     }
16068   }
16069 
16070   sqlite3_result_value(context, argv[0]);
16071 }
16072 
16073 /* Flags for open_db().
16074 **
16075 ** The default behavior of open_db() is to exit(1) if the database fails to
16076 ** open.  The OPEN_DB_KEEPALIVE flag changes that so that it prints an error
16077 ** but still returns without calling exit.
16078 **
16079 ** The OPEN_DB_ZIPFILE flag causes open_db() to prefer to open files as a
16080 ** ZIP archive if the file does not exist or is empty and its name matches
16081 ** the *.zip pattern.
16082 */
16083 #define OPEN_DB_KEEPALIVE   0x001   /* Return after error if true */
16084 #define OPEN_DB_ZIPFILE     0x002   /* Open as ZIP if name matches *.zip */
16085 
16086 /*
16087 ** Make sure the database is open.  If it is not, then open it.  If
16088 ** the database fails to open, print an error message and exit.
16089 */
16090 static void open_db(ShellState *p, int openFlags){
16091   if( p->db==0 ){
16092     const char *zDbFilename = p->pAuxDb->zDbFilename;
16093     if( p->openMode==SHELL_OPEN_UNSPEC ){
16094       if( zDbFilename==0 || zDbFilename[0]==0 ){
16095         p->openMode = SHELL_OPEN_NORMAL;
16096       }else{
16097         p->openMode = (u8)deduceDatabaseType(zDbFilename,
16098                              (openFlags & OPEN_DB_ZIPFILE)!=0);
16099       }
16100     }
16101     switch( p->openMode ){
16102       case SHELL_OPEN_APPENDVFS: {
16103         sqlite3_open_v2(zDbFilename, &p->db,
16104            SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, "apndvfs");
16105         break;
16106       }
16107       case SHELL_OPEN_HEXDB:
16108       case SHELL_OPEN_DESERIALIZE: {
16109         sqlite3_open(0, &p->db);
16110         break;
16111       }
16112       case SHELL_OPEN_ZIPFILE: {
16113         sqlite3_open(":memory:", &p->db);
16114         break;
16115       }
16116       case SHELL_OPEN_READONLY: {
16117         sqlite3_open_v2(zDbFilename, &p->db,
16118             SQLITE_OPEN_READONLY|p->openFlags, 0);
16119         break;
16120       }
16121       case SHELL_OPEN_UNSPEC:
16122       case SHELL_OPEN_NORMAL: {
16123         sqlite3_open_v2(zDbFilename, &p->db,
16124            SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, 0);
16125         break;
16126       }
16127     }
16128     globalDb = p->db;
16129     if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){
16130       utf8_printf(stderr,"Error: unable to open database \"%s\": %s\n",
16131           zDbFilename, sqlite3_errmsg(p->db));
16132       if( openFlags & OPEN_DB_KEEPALIVE ){
16133         sqlite3_open(":memory:", &p->db);
16134         return;
16135       }
16136       exit(1);
16137     }
16138 #ifndef SQLITE_OMIT_LOAD_EXTENSION
16139     sqlite3_enable_load_extension(p->db, 1);
16140 #endif
16141     sqlite3_shathree_init(p->db, 0, 0);
16142     sqlite3_uint_init(p->db, 0, 0);
16143     sqlite3_decimal_init(p->db, 0, 0);
16144     sqlite3_regexp_init(p->db, 0, 0);
16145     sqlite3_ieee_init(p->db, 0, 0);
16146     sqlite3_series_init(p->db, 0, 0);
16147 #ifndef SQLITE_SHELL_WASM_MODE
16148     sqlite3_fileio_init(p->db, 0, 0);
16149     sqlite3_completion_init(p->db, 0, 0);
16150 #endif
16151 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
16152     sqlite3_dbdata_init(p->db, 0, 0);
16153 #endif
16154 #ifdef SQLITE_HAVE_ZLIB
16155     if( !p->bSafeModePersist ){
16156       sqlite3_zipfile_init(p->db, 0, 0);
16157       sqlite3_sqlar_init(p->db, 0, 0);
16158     }
16159 #endif
16160     sqlite3_create_function(p->db, "shell_add_schema", 3, SQLITE_UTF8, 0,
16161                             shellAddSchemaName, 0, 0);
16162     sqlite3_create_function(p->db, "shell_module_schema", 1, SQLITE_UTF8, 0,
16163                             shellModuleSchema, 0, 0);
16164     sqlite3_create_function(p->db, "shell_putsnl", 1, SQLITE_UTF8, p,
16165                             shellPutsFunc, 0, 0);
16166     sqlite3_create_function(p->db, "shell_escape_crnl", 1, SQLITE_UTF8, 0,
16167                             shellEscapeCrnl, 0, 0);
16168     sqlite3_create_function(p->db, "shell_int32", 2, SQLITE_UTF8, 0,
16169                             shellInt32, 0, 0);
16170     sqlite3_create_function(p->db, "shell_idquote", 1, SQLITE_UTF8, 0,
16171                             shellIdQuote, 0, 0);
16172     sqlite3_create_function(p->db, "usleep",1,SQLITE_UTF8,0,
16173                             shellUSleepFunc, 0, 0);
16174 #ifndef SQLITE_NOHAVE_SYSTEM
16175     sqlite3_create_function(p->db, "edit", 1, SQLITE_UTF8, 0,
16176                             editFunc, 0, 0);
16177     sqlite3_create_function(p->db, "edit", 2, SQLITE_UTF8, 0,
16178                             editFunc, 0, 0);
16179 #endif
16180     if( p->openMode==SHELL_OPEN_ZIPFILE ){
16181       char *zSql = sqlite3_mprintf(
16182          "CREATE VIRTUAL TABLE zip USING zipfile(%Q);", zDbFilename);
16183       shell_check_oom(zSql);
16184       sqlite3_exec(p->db, zSql, 0, 0, 0);
16185       sqlite3_free(zSql);
16186     }
16187 #ifndef SQLITE_OMIT_DESERIALIZE
16188     else
16189     if( p->openMode==SHELL_OPEN_DESERIALIZE || p->openMode==SHELL_OPEN_HEXDB ){
16190       int rc;
16191       int nData = 0;
16192       unsigned char *aData;
16193       if( p->openMode==SHELL_OPEN_DESERIALIZE ){
16194         aData = (unsigned char*)readFile(zDbFilename, &nData);
16195       }else{
16196         aData = readHexDb(p, &nData);
16197         if( aData==0 ){
16198           return;
16199         }
16200       }
16201       rc = sqlite3_deserialize(p->db, "main", aData, nData, nData,
16202                    SQLITE_DESERIALIZE_RESIZEABLE |
16203                    SQLITE_DESERIALIZE_FREEONCLOSE);
16204       if( rc ){
16205         utf8_printf(stderr, "Error: sqlite3_deserialize() returns %d\n", rc);
16206       }
16207       if( p->szMax>0 ){
16208         sqlite3_file_control(p->db, "main", SQLITE_FCNTL_SIZE_LIMIT, &p->szMax);
16209       }
16210     }
16211 #endif
16212   }
16213   if( p->bSafeModePersist && p->db!=0 ){
16214     sqlite3_set_authorizer(p->db, safeModeAuth, p);
16215   }
16216 }
16217 
16218 /*
16219 ** Attempt to close the databaes connection.  Report errors.
16220 */
16221 void close_db(sqlite3 *db){
16222   int rc = sqlite3_close(db);
16223   if( rc ){
16224     utf8_printf(stderr, "Error: sqlite3_close() returns %d: %s\n",
16225         rc, sqlite3_errmsg(db));
16226   }
16227 }
16228 
16229 #if HAVE_READLINE || HAVE_EDITLINE
16230 /*
16231 ** Readline completion callbacks
16232 */
16233 static char *readline_completion_generator(const char *text, int state){
16234   static sqlite3_stmt *pStmt = 0;
16235   char *zRet;
16236   if( state==0 ){
16237     char *zSql;
16238     sqlite3_finalize(pStmt);
16239     zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
16240                            "  FROM completion(%Q) ORDER BY 1", text);
16241     shell_check_oom(zSql);
16242     sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
16243     sqlite3_free(zSql);
16244   }
16245   if( sqlite3_step(pStmt)==SQLITE_ROW ){
16246     const char *z = (const char*)sqlite3_column_text(pStmt,0);
16247     zRet = z ? strdup(z) : 0;
16248   }else{
16249     sqlite3_finalize(pStmt);
16250     pStmt = 0;
16251     zRet = 0;
16252   }
16253   return zRet;
16254 }
16255 static char **readline_completion(const char *zText, int iStart, int iEnd){
16256   rl_attempted_completion_over = 1;
16257   return rl_completion_matches(zText, readline_completion_generator);
16258 }
16259 
16260 #elif HAVE_LINENOISE
16261 /*
16262 ** Linenoise completion callback
16263 */
16264 static void linenoise_completion(const char *zLine, linenoiseCompletions *lc){
16265   int nLine = strlen30(zLine);
16266   int i, iStart;
16267   sqlite3_stmt *pStmt = 0;
16268   char *zSql;
16269   char zBuf[1000];
16270 
16271   if( nLine>sizeof(zBuf)-30 ) return;
16272   if( zLine[0]=='.' || zLine[0]=='#') return;
16273   for(i=nLine-1; i>=0 && (isalnum(zLine[i]) || zLine[i]=='_'); i--){}
16274   if( i==nLine-1 ) return;
16275   iStart = i+1;
16276   memcpy(zBuf, zLine, iStart);
16277   zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
16278                          "  FROM completion(%Q,%Q) ORDER BY 1",
16279                          &zLine[iStart], zLine);
16280   shell_check_oom(zSql);
16281   sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
16282   sqlite3_free(zSql);
16283   sqlite3_exec(globalDb, "PRAGMA page_count", 0, 0, 0); /* Load the schema */
16284   while( sqlite3_step(pStmt)==SQLITE_ROW ){
16285     const char *zCompletion = (const char*)sqlite3_column_text(pStmt, 0);
16286     int nCompletion = sqlite3_column_bytes(pStmt, 0);
16287     if( iStart+nCompletion < sizeof(zBuf)-1 && zCompletion ){
16288       memcpy(zBuf+iStart, zCompletion, nCompletion+1);
16289       linenoiseAddCompletion(lc, zBuf);
16290     }
16291   }
16292   sqlite3_finalize(pStmt);
16293 }
16294 #endif
16295 
16296 /*
16297 ** Do C-language style dequoting.
16298 **
16299 **    \a    -> alarm
16300 **    \b    -> backspace
16301 **    \t    -> tab
16302 **    \n    -> newline
16303 **    \v    -> vertical tab
16304 **    \f    -> form feed
16305 **    \r    -> carriage return
16306 **    \s    -> space
16307 **    \"    -> "
16308 **    \'    -> '
16309 **    \\    -> backslash
16310 **    \NNN  -> ascii character NNN in octal
16311 */
16312 static void resolve_backslashes(char *z){
16313   int i, j;
16314   char c;
16315   while( *z && *z!='\\' ) z++;
16316   for(i=j=0; (c = z[i])!=0; i++, j++){
16317     if( c=='\\' && z[i+1]!=0 ){
16318       c = z[++i];
16319       if( c=='a' ){
16320         c = '\a';
16321       }else if( c=='b' ){
16322         c = '\b';
16323       }else if( c=='t' ){
16324         c = '\t';
16325       }else if( c=='n' ){
16326         c = '\n';
16327       }else if( c=='v' ){
16328         c = '\v';
16329       }else if( c=='f' ){
16330         c = '\f';
16331       }else if( c=='r' ){
16332         c = '\r';
16333       }else if( c=='"' ){
16334         c = '"';
16335       }else if( c=='\'' ){
16336         c = '\'';
16337       }else if( c=='\\' ){
16338         c = '\\';
16339       }else if( c>='0' && c<='7' ){
16340         c -= '0';
16341         if( z[i+1]>='0' && z[i+1]<='7' ){
16342           i++;
16343           c = (c<<3) + z[i] - '0';
16344           if( z[i+1]>='0' && z[i+1]<='7' ){
16345             i++;
16346             c = (c<<3) + z[i] - '0';
16347           }
16348         }
16349       }
16350     }
16351     z[j] = c;
16352   }
16353   if( j<i ) z[j] = 0;
16354 }
16355 
16356 /*
16357 ** Interpret zArg as either an integer or a boolean value.  Return 1 or 0
16358 ** for TRUE and FALSE.  Return the integer value if appropriate.
16359 */
16360 static int booleanValue(const char *zArg){
16361   int i;
16362   if( zArg[0]=='0' && zArg[1]=='x' ){
16363     for(i=2; hexDigitValue(zArg[i])>=0; i++){}
16364   }else{
16365     for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
16366   }
16367   if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
16368   if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
16369     return 1;
16370   }
16371   if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
16372     return 0;
16373   }
16374   utf8_printf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
16375           zArg);
16376   return 0;
16377 }
16378 
16379 /*
16380 ** Set or clear a shell flag according to a boolean value.
16381 */
16382 static void setOrClearFlag(ShellState *p, unsigned mFlag, const char *zArg){
16383   if( booleanValue(zArg) ){
16384     ShellSetFlag(p, mFlag);
16385   }else{
16386     ShellClearFlag(p, mFlag);
16387   }
16388 }
16389 
16390 /*
16391 ** Close an output file, assuming it is not stderr or stdout
16392 */
16393 static void output_file_close(FILE *f){
16394   if( f && f!=stdout && f!=stderr ) fclose(f);
16395 }
16396 
16397 /*
16398 ** Try to open an output file.   The names "stdout" and "stderr" are
16399 ** recognized and do the right thing.  NULL is returned if the output
16400 ** filename is "off".
16401 */
16402 static FILE *output_file_open(const char *zFile, int bTextMode){
16403   FILE *f;
16404   if( strcmp(zFile,"stdout")==0 ){
16405     f = stdout;
16406   }else if( strcmp(zFile, "stderr")==0 ){
16407     f = stderr;
16408   }else if( strcmp(zFile, "off")==0 ){
16409     f = 0;
16410   }else{
16411     f = fopen(zFile, bTextMode ? "w" : "wb");
16412     if( f==0 ){
16413       utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
16414     }
16415   }
16416   return f;
16417 }
16418 
16419 #ifndef SQLITE_OMIT_TRACE
16420 /*
16421 ** A routine for handling output from sqlite3_trace().
16422 */
16423 static int sql_trace_callback(
16424   unsigned mType,         /* The trace type */
16425   void *pArg,             /* The ShellState pointer */
16426   void *pP,               /* Usually a pointer to sqlite_stmt */
16427   void *pX                /* Auxiliary output */
16428 ){
16429   ShellState *p = (ShellState*)pArg;
16430   sqlite3_stmt *pStmt;
16431   const char *zSql;
16432   int nSql;
16433   if( p->traceOut==0 ) return 0;
16434   if( mType==SQLITE_TRACE_CLOSE ){
16435     utf8_printf(p->traceOut, "-- closing database connection\n");
16436     return 0;
16437   }
16438   if( mType!=SQLITE_TRACE_ROW && ((const char*)pX)[0]=='-' ){
16439     zSql = (const char*)pX;
16440   }else{
16441     pStmt = (sqlite3_stmt*)pP;
16442     switch( p->eTraceType ){
16443       case SHELL_TRACE_EXPANDED: {
16444         zSql = sqlite3_expanded_sql(pStmt);
16445         break;
16446       }
16447 #ifdef SQLITE_ENABLE_NORMALIZE
16448       case SHELL_TRACE_NORMALIZED: {
16449         zSql = sqlite3_normalized_sql(pStmt);
16450         break;
16451       }
16452 #endif
16453       default: {
16454         zSql = sqlite3_sql(pStmt);
16455         break;
16456       }
16457     }
16458   }
16459   if( zSql==0 ) return 0;
16460   nSql = strlen30(zSql);
16461   while( nSql>0 && zSql[nSql-1]==';' ){ nSql--; }
16462   switch( mType ){
16463     case SQLITE_TRACE_ROW:
16464     case SQLITE_TRACE_STMT: {
16465       utf8_printf(p->traceOut, "%.*s;\n", nSql, zSql);
16466       break;
16467     }
16468     case SQLITE_TRACE_PROFILE: {
16469       sqlite3_int64 nNanosec = *(sqlite3_int64*)pX;
16470       utf8_printf(p->traceOut, "%.*s; -- %lld ns\n", nSql, zSql, nNanosec);
16471       break;
16472     }
16473   }
16474   return 0;
16475 }
16476 #endif
16477 
16478 /*
16479 ** A no-op routine that runs with the ".breakpoint" doc-command.  This is
16480 ** a useful spot to set a debugger breakpoint.
16481 */
16482 static void test_breakpoint(void){
16483   static int nCall = 0;
16484   nCall++;
16485 }
16486 
16487 /*
16488 ** An object used to read a CSV and other files for import.
16489 */
16490 typedef struct ImportCtx ImportCtx;
16491 struct ImportCtx {
16492   const char *zFile;  /* Name of the input file */
16493   FILE *in;           /* Read the CSV text from this input stream */
16494   int (SQLITE_CDECL *xCloser)(FILE*);      /* Func to close in */
16495   char *z;            /* Accumulated text for a field */
16496   int n;              /* Number of bytes in z */
16497   int nAlloc;         /* Space allocated for z[] */
16498   int nLine;          /* Current line number */
16499   int nRow;           /* Number of rows imported */
16500   int nErr;           /* Number of errors encountered */
16501   int bNotFirst;      /* True if one or more bytes already read */
16502   int cTerm;          /* Character that terminated the most recent field */
16503   int cColSep;        /* The column separator character.  (Usually ",") */
16504   int cRowSep;        /* The row separator character.  (Usually "\n") */
16505 };
16506 
16507 /* Clean up resourced used by an ImportCtx */
16508 static void import_cleanup(ImportCtx *p){
16509   if( p->in!=0 && p->xCloser!=0 ){
16510     p->xCloser(p->in);
16511     p->in = 0;
16512   }
16513   sqlite3_free(p->z);
16514   p->z = 0;
16515 }
16516 
16517 /* Append a single byte to z[] */
16518 static void import_append_char(ImportCtx *p, int c){
16519   if( p->n+1>=p->nAlloc ){
16520     p->nAlloc += p->nAlloc + 100;
16521     p->z = sqlite3_realloc64(p->z, p->nAlloc);
16522     shell_check_oom(p->z);
16523   }
16524   p->z[p->n++] = (char)c;
16525 }
16526 
16527 /* Read a single field of CSV text.  Compatible with rfc4180 and extended
16528 ** with the option of having a separator other than ",".
16529 **
16530 **   +  Input comes from p->in.
16531 **   +  Store results in p->z of length p->n.  Space to hold p->z comes
16532 **      from sqlite3_malloc64().
16533 **   +  Use p->cSep as the column separator.  The default is ",".
16534 **   +  Use p->rSep as the row separator.  The default is "\n".
16535 **   +  Keep track of the line number in p->nLine.
16536 **   +  Store the character that terminates the field in p->cTerm.  Store
16537 **      EOF on end-of-file.
16538 **   +  Report syntax errors on stderr
16539 */
16540 static char *SQLITE_CDECL csv_read_one_field(ImportCtx *p){
16541   int c;
16542   int cSep = p->cColSep;
16543   int rSep = p->cRowSep;
16544   p->n = 0;
16545   c = fgetc(p->in);
16546   if( c==EOF || seenInterrupt ){
16547     p->cTerm = EOF;
16548     return 0;
16549   }
16550   if( c=='"' ){
16551     int pc, ppc;
16552     int startLine = p->nLine;
16553     int cQuote = c;
16554     pc = ppc = 0;
16555     while( 1 ){
16556       c = fgetc(p->in);
16557       if( c==rSep ) p->nLine++;
16558       if( c==cQuote ){
16559         if( pc==cQuote ){
16560           pc = 0;
16561           continue;
16562         }
16563       }
16564       if( (c==cSep && pc==cQuote)
16565        || (c==rSep && pc==cQuote)
16566        || (c==rSep && pc=='\r' && ppc==cQuote)
16567        || (c==EOF && pc==cQuote)
16568       ){
16569         do{ p->n--; }while( p->z[p->n]!=cQuote );
16570         p->cTerm = c;
16571         break;
16572       }
16573       if( pc==cQuote && c!='\r' ){
16574         utf8_printf(stderr, "%s:%d: unescaped %c character\n",
16575                 p->zFile, p->nLine, cQuote);
16576       }
16577       if( c==EOF ){
16578         utf8_printf(stderr, "%s:%d: unterminated %c-quoted field\n",
16579                 p->zFile, startLine, cQuote);
16580         p->cTerm = c;
16581         break;
16582       }
16583       import_append_char(p, c);
16584       ppc = pc;
16585       pc = c;
16586     }
16587   }else{
16588     /* If this is the first field being parsed and it begins with the
16589     ** UTF-8 BOM  (0xEF BB BF) then skip the BOM */
16590     if( (c&0xff)==0xef && p->bNotFirst==0 ){
16591       import_append_char(p, c);
16592       c = fgetc(p->in);
16593       if( (c&0xff)==0xbb ){
16594         import_append_char(p, c);
16595         c = fgetc(p->in);
16596         if( (c&0xff)==0xbf ){
16597           p->bNotFirst = 1;
16598           p->n = 0;
16599           return csv_read_one_field(p);
16600         }
16601       }
16602     }
16603     while( c!=EOF && c!=cSep && c!=rSep ){
16604       import_append_char(p, c);
16605       c = fgetc(p->in);
16606     }
16607     if( c==rSep ){
16608       p->nLine++;
16609       if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
16610     }
16611     p->cTerm = c;
16612   }
16613   if( p->z ) p->z[p->n] = 0;
16614   p->bNotFirst = 1;
16615   return p->z;
16616 }
16617 
16618 /* Read a single field of ASCII delimited text.
16619 **
16620 **   +  Input comes from p->in.
16621 **   +  Store results in p->z of length p->n.  Space to hold p->z comes
16622 **      from sqlite3_malloc64().
16623 **   +  Use p->cSep as the column separator.  The default is "\x1F".
16624 **   +  Use p->rSep as the row separator.  The default is "\x1E".
16625 **   +  Keep track of the row number in p->nLine.
16626 **   +  Store the character that terminates the field in p->cTerm.  Store
16627 **      EOF on end-of-file.
16628 **   +  Report syntax errors on stderr
16629 */
16630 static char *SQLITE_CDECL ascii_read_one_field(ImportCtx *p){
16631   int c;
16632   int cSep = p->cColSep;
16633   int rSep = p->cRowSep;
16634   p->n = 0;
16635   c = fgetc(p->in);
16636   if( c==EOF || seenInterrupt ){
16637     p->cTerm = EOF;
16638     return 0;
16639   }
16640   while( c!=EOF && c!=cSep && c!=rSep ){
16641     import_append_char(p, c);
16642     c = fgetc(p->in);
16643   }
16644   if( c==rSep ){
16645     p->nLine++;
16646   }
16647   p->cTerm = c;
16648   if( p->z ) p->z[p->n] = 0;
16649   return p->z;
16650 }
16651 
16652 /*
16653 ** Try to transfer data for table zTable.  If an error is seen while
16654 ** moving forward, try to go backwards.  The backwards movement won't
16655 ** work for WITHOUT ROWID tables.
16656 */
16657 static void tryToCloneData(
16658   ShellState *p,
16659   sqlite3 *newDb,
16660   const char *zTable
16661 ){
16662   sqlite3_stmt *pQuery = 0;
16663   sqlite3_stmt *pInsert = 0;
16664   char *zQuery = 0;
16665   char *zInsert = 0;
16666   int rc;
16667   int i, j, n;
16668   int nTable = strlen30(zTable);
16669   int k = 0;
16670   int cnt = 0;
16671   const int spinRate = 10000;
16672 
16673   zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
16674   shell_check_oom(zQuery);
16675   rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
16676   if( rc ){
16677     utf8_printf(stderr, "Error %d: %s on [%s]\n",
16678             sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
16679             zQuery);
16680     goto end_data_xfer;
16681   }
16682   n = sqlite3_column_count(pQuery);
16683   zInsert = sqlite3_malloc64(200 + nTable + n*3);
16684   shell_check_oom(zInsert);
16685   sqlite3_snprintf(200+nTable,zInsert,
16686                    "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
16687   i = strlen30(zInsert);
16688   for(j=1; j<n; j++){
16689     memcpy(zInsert+i, ",?", 2);
16690     i += 2;
16691   }
16692   memcpy(zInsert+i, ");", 3);
16693   rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
16694   if( rc ){
16695     utf8_printf(stderr, "Error %d: %s on [%s]\n",
16696             sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
16697             zQuery);
16698     goto end_data_xfer;
16699   }
16700   for(k=0; k<2; k++){
16701     while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
16702       for(i=0; i<n; i++){
16703         switch( sqlite3_column_type(pQuery, i) ){
16704           case SQLITE_NULL: {
16705             sqlite3_bind_null(pInsert, i+1);
16706             break;
16707           }
16708           case SQLITE_INTEGER: {
16709             sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
16710             break;
16711           }
16712           case SQLITE_FLOAT: {
16713             sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
16714             break;
16715           }
16716           case SQLITE_TEXT: {
16717             sqlite3_bind_text(pInsert, i+1,
16718                              (const char*)sqlite3_column_text(pQuery,i),
16719                              -1, SQLITE_STATIC);
16720             break;
16721           }
16722           case SQLITE_BLOB: {
16723             sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
16724                                             sqlite3_column_bytes(pQuery,i),
16725                                             SQLITE_STATIC);
16726             break;
16727           }
16728         }
16729       } /* End for */
16730       rc = sqlite3_step(pInsert);
16731       if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
16732         utf8_printf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
16733                         sqlite3_errmsg(newDb));
16734       }
16735       sqlite3_reset(pInsert);
16736       cnt++;
16737       if( (cnt%spinRate)==0 ){
16738         printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
16739         fflush(stdout);
16740       }
16741     } /* End while */
16742     if( rc==SQLITE_DONE ) break;
16743     sqlite3_finalize(pQuery);
16744     sqlite3_free(zQuery);
16745     zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
16746                              zTable);
16747     shell_check_oom(zQuery);
16748     rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
16749     if( rc ){
16750       utf8_printf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
16751       break;
16752     }
16753   } /* End for(k=0...) */
16754 
16755 end_data_xfer:
16756   sqlite3_finalize(pQuery);
16757   sqlite3_finalize(pInsert);
16758   sqlite3_free(zQuery);
16759   sqlite3_free(zInsert);
16760 }
16761 
16762 
16763 /*
16764 ** Try to transfer all rows of the schema that match zWhere.  For
16765 ** each row, invoke xForEach() on the object defined by that row.
16766 ** If an error is encountered while moving forward through the
16767 ** sqlite_schema table, try again moving backwards.
16768 */
16769 static void tryToCloneSchema(
16770   ShellState *p,
16771   sqlite3 *newDb,
16772   const char *zWhere,
16773   void (*xForEach)(ShellState*,sqlite3*,const char*)
16774 ){
16775   sqlite3_stmt *pQuery = 0;
16776   char *zQuery = 0;
16777   int rc;
16778   const unsigned char *zName;
16779   const unsigned char *zSql;
16780   char *zErrMsg = 0;
16781 
16782   zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_schema"
16783                            " WHERE %s", zWhere);
16784   shell_check_oom(zQuery);
16785   rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
16786   if( rc ){
16787     utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
16788                     sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
16789                     zQuery);
16790     goto end_schema_xfer;
16791   }
16792   while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
16793     zName = sqlite3_column_text(pQuery, 0);
16794     zSql = sqlite3_column_text(pQuery, 1);
16795     if( zName==0 || zSql==0 ) continue;
16796     printf("%s... ", zName); fflush(stdout);
16797     sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
16798     if( zErrMsg ){
16799       utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
16800       sqlite3_free(zErrMsg);
16801       zErrMsg = 0;
16802     }
16803     if( xForEach ){
16804       xForEach(p, newDb, (const char*)zName);
16805     }
16806     printf("done\n");
16807   }
16808   if( rc!=SQLITE_DONE ){
16809     sqlite3_finalize(pQuery);
16810     sqlite3_free(zQuery);
16811     zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_schema"
16812                              " WHERE %s ORDER BY rowid DESC", zWhere);
16813     shell_check_oom(zQuery);
16814     rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
16815     if( rc ){
16816       utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
16817                       sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
16818                       zQuery);
16819       goto end_schema_xfer;
16820     }
16821     while( sqlite3_step(pQuery)==SQLITE_ROW ){
16822       zName = sqlite3_column_text(pQuery, 0);
16823       zSql = sqlite3_column_text(pQuery, 1);
16824       if( zName==0 || zSql==0 ) continue;
16825       printf("%s... ", zName); fflush(stdout);
16826       sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
16827       if( zErrMsg ){
16828         utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
16829         sqlite3_free(zErrMsg);
16830         zErrMsg = 0;
16831       }
16832       if( xForEach ){
16833         xForEach(p, newDb, (const char*)zName);
16834       }
16835       printf("done\n");
16836     }
16837   }
16838 end_schema_xfer:
16839   sqlite3_finalize(pQuery);
16840   sqlite3_free(zQuery);
16841 }
16842 
16843 /*
16844 ** Open a new database file named "zNewDb".  Try to recover as much information
16845 ** as possible out of the main database (which might be corrupt) and write it
16846 ** into zNewDb.
16847 */
16848 static void tryToClone(ShellState *p, const char *zNewDb){
16849   int rc;
16850   sqlite3 *newDb = 0;
16851   if( access(zNewDb,0)==0 ){
16852     utf8_printf(stderr, "File \"%s\" already exists.\n", zNewDb);
16853     return;
16854   }
16855   rc = sqlite3_open(zNewDb, &newDb);
16856   if( rc ){
16857     utf8_printf(stderr, "Cannot create output database: %s\n",
16858             sqlite3_errmsg(newDb));
16859   }else{
16860     sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0);
16861     sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
16862     tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
16863     tryToCloneSchema(p, newDb, "type!='table'", 0);
16864     sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
16865     sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
16866   }
16867   close_db(newDb);
16868 }
16869 
16870 /*
16871 ** Change the output file back to stdout.
16872 **
16873 ** If the p->doXdgOpen flag is set, that means the output was being
16874 ** redirected to a temporary file named by p->zTempFile.  In that case,
16875 ** launch start/open/xdg-open on that temporary file.
16876 */
16877 static void output_reset(ShellState *p){
16878   if( p->outfile[0]=='|' ){
16879 #ifndef SQLITE_OMIT_POPEN
16880     pclose(p->out);
16881 #endif
16882   }else{
16883     output_file_close(p->out);
16884 #ifndef SQLITE_NOHAVE_SYSTEM
16885     if( p->doXdgOpen ){
16886       const char *zXdgOpenCmd =
16887 #if defined(_WIN32)
16888       "start";
16889 #elif defined(__APPLE__)
16890       "open";
16891 #else
16892       "xdg-open";
16893 #endif
16894       char *zCmd;
16895       zCmd = sqlite3_mprintf("%s %s", zXdgOpenCmd, p->zTempFile);
16896       if( system(zCmd) ){
16897         utf8_printf(stderr, "Failed: [%s]\n", zCmd);
16898       }else{
16899         /* Give the start/open/xdg-open command some time to get
16900         ** going before we continue, and potential delete the
16901         ** p->zTempFile data file out from under it */
16902         sqlite3_sleep(2000);
16903       }
16904       sqlite3_free(zCmd);
16905       outputModePop(p);
16906       p->doXdgOpen = 0;
16907     }
16908 #endif /* !defined(SQLITE_NOHAVE_SYSTEM) */
16909   }
16910   p->outfile[0] = 0;
16911   p->out = stdout;
16912 }
16913 
16914 /*
16915 ** Run an SQL command and return the single integer result.
16916 */
16917 static int db_int(sqlite3 *db, const char *zSql){
16918   sqlite3_stmt *pStmt;
16919   int res = 0;
16920   sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
16921   if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){
16922     res = sqlite3_column_int(pStmt,0);
16923   }
16924   sqlite3_finalize(pStmt);
16925   return res;
16926 }
16927 
16928 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
16929 /*
16930 ** Convert a 2-byte or 4-byte big-endian integer into a native integer
16931 */
16932 static unsigned int get2byteInt(unsigned char *a){
16933   return (a[0]<<8) + a[1];
16934 }
16935 static unsigned int get4byteInt(unsigned char *a){
16936   return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3];
16937 }
16938 
16939 /*
16940 ** Implementation of the ".dbinfo" command.
16941 **
16942 ** Return 1 on error, 2 to exit, and 0 otherwise.
16943 */
16944 static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){
16945   static const struct { const char *zName; int ofst; } aField[] = {
16946      { "file change counter:",  24  },
16947      { "database page count:",  28  },
16948      { "freelist page count:",  36  },
16949      { "schema cookie:",        40  },
16950      { "schema format:",        44  },
16951      { "default cache size:",   48  },
16952      { "autovacuum top root:",  52  },
16953      { "incremental vacuum:",   64  },
16954      { "text encoding:",        56  },
16955      { "user version:",         60  },
16956      { "application id:",       68  },
16957      { "software version:",     96  },
16958   };
16959   static const struct { const char *zName; const char *zSql; } aQuery[] = {
16960      { "number of tables:",
16961        "SELECT count(*) FROM %s WHERE type='table'" },
16962      { "number of indexes:",
16963        "SELECT count(*) FROM %s WHERE type='index'" },
16964      { "number of triggers:",
16965        "SELECT count(*) FROM %s WHERE type='trigger'" },
16966      { "number of views:",
16967        "SELECT count(*) FROM %s WHERE type='view'" },
16968      { "schema size:",
16969        "SELECT total(length(sql)) FROM %s" },
16970   };
16971   int i, rc;
16972   unsigned iDataVersion;
16973   char *zSchemaTab;
16974   char *zDb = nArg>=2 ? azArg[1] : "main";
16975   sqlite3_stmt *pStmt = 0;
16976   unsigned char aHdr[100];
16977   open_db(p, 0);
16978   if( p->db==0 ) return 1;
16979   rc = sqlite3_prepare_v2(p->db,
16980              "SELECT data FROM sqlite_dbpage(?1) WHERE pgno=1",
16981              -1, &pStmt, 0);
16982   if( rc ){
16983     utf8_printf(stderr, "error: %s\n", sqlite3_errmsg(p->db));
16984     sqlite3_finalize(pStmt);
16985     return 1;
16986   }
16987   sqlite3_bind_text(pStmt, 1, zDb, -1, SQLITE_STATIC);
16988   if( sqlite3_step(pStmt)==SQLITE_ROW
16989    && sqlite3_column_bytes(pStmt,0)>100
16990   ){
16991     memcpy(aHdr, sqlite3_column_blob(pStmt,0), 100);
16992     sqlite3_finalize(pStmt);
16993   }else{
16994     raw_printf(stderr, "unable to read database header\n");
16995     sqlite3_finalize(pStmt);
16996     return 1;
16997   }
16998   i = get2byteInt(aHdr+16);
16999   if( i==1 ) i = 65536;
17000   utf8_printf(p->out, "%-20s %d\n", "database page size:", i);
17001   utf8_printf(p->out, "%-20s %d\n", "write format:", aHdr[18]);
17002   utf8_printf(p->out, "%-20s %d\n", "read format:", aHdr[19]);
17003   utf8_printf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]);
17004   for(i=0; i<ArraySize(aField); i++){
17005     int ofst = aField[i].ofst;
17006     unsigned int val = get4byteInt(aHdr + ofst);
17007     utf8_printf(p->out, "%-20s %u", aField[i].zName, val);
17008     switch( ofst ){
17009       case 56: {
17010         if( val==1 ) raw_printf(p->out, " (utf8)");
17011         if( val==2 ) raw_printf(p->out, " (utf16le)");
17012         if( val==3 ) raw_printf(p->out, " (utf16be)");
17013       }
17014     }
17015     raw_printf(p->out, "\n");
17016   }
17017   if( zDb==0 ){
17018     zSchemaTab = sqlite3_mprintf("main.sqlite_schema");
17019   }else if( strcmp(zDb,"temp")==0 ){
17020     zSchemaTab = sqlite3_mprintf("%s", "sqlite_temp_schema");
17021   }else{
17022     zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_schema", zDb);
17023   }
17024   for(i=0; i<ArraySize(aQuery); i++){
17025     char *zSql = sqlite3_mprintf(aQuery[i].zSql, zSchemaTab);
17026     int val = db_int(p->db, zSql);
17027     sqlite3_free(zSql);
17028     utf8_printf(p->out, "%-20s %d\n", aQuery[i].zName, val);
17029   }
17030   sqlite3_free(zSchemaTab);
17031   sqlite3_file_control(p->db, zDb, SQLITE_FCNTL_DATA_VERSION, &iDataVersion);
17032   utf8_printf(p->out, "%-20s %u\n", "data version", iDataVersion);
17033   return 0;
17034 }
17035 #endif /* !defined(SQLITE_OMIT_VIRTUALTABLE)
17036           && defined(SQLITE_ENABLE_DBPAGE_VTAB) */
17037 
17038 /*
17039 ** Print the current sqlite3_errmsg() value to stderr and return 1.
17040 */
17041 static int shellDatabaseError(sqlite3 *db){
17042   const char *zErr = sqlite3_errmsg(db);
17043   utf8_printf(stderr, "Error: %s\n", zErr);
17044   return 1;
17045 }
17046 
17047 /*
17048 ** Compare the pattern in zGlob[] against the text in z[].  Return TRUE
17049 ** if they match and FALSE (0) if they do not match.
17050 **
17051 ** Globbing rules:
17052 **
17053 **      '*'       Matches any sequence of zero or more characters.
17054 **
17055 **      '?'       Matches exactly one character.
17056 **
17057 **     [...]      Matches one character from the enclosed list of
17058 **                characters.
17059 **
17060 **     [^...]     Matches one character not in the enclosed list.
17061 **
17062 **      '#'       Matches any sequence of one or more digits with an
17063 **                optional + or - sign in front
17064 **
17065 **      ' '       Any span of whitespace matches any other span of
17066 **                whitespace.
17067 **
17068 ** Extra whitespace at the end of z[] is ignored.
17069 */
17070 static int testcase_glob(const char *zGlob, const char *z){
17071   int c, c2;
17072   int invert;
17073   int seen;
17074 
17075   while( (c = (*(zGlob++)))!=0 ){
17076     if( IsSpace(c) ){
17077       if( !IsSpace(*z) ) return 0;
17078       while( IsSpace(*zGlob) ) zGlob++;
17079       while( IsSpace(*z) ) z++;
17080     }else if( c=='*' ){
17081       while( (c=(*(zGlob++))) == '*' || c=='?' ){
17082         if( c=='?' && (*(z++))==0 ) return 0;
17083       }
17084       if( c==0 ){
17085         return 1;
17086       }else if( c=='[' ){
17087         while( *z && testcase_glob(zGlob-1,z)==0 ){
17088           z++;
17089         }
17090         return (*z)!=0;
17091       }
17092       while( (c2 = (*(z++)))!=0 ){
17093         while( c2!=c ){
17094           c2 = *(z++);
17095           if( c2==0 ) return 0;
17096         }
17097         if( testcase_glob(zGlob,z) ) return 1;
17098       }
17099       return 0;
17100     }else if( c=='?' ){
17101       if( (*(z++))==0 ) return 0;
17102     }else if( c=='[' ){
17103       int prior_c = 0;
17104       seen = 0;
17105       invert = 0;
17106       c = *(z++);
17107       if( c==0 ) return 0;
17108       c2 = *(zGlob++);
17109       if( c2=='^' ){
17110         invert = 1;
17111         c2 = *(zGlob++);
17112       }
17113       if( c2==']' ){
17114         if( c==']' ) seen = 1;
17115         c2 = *(zGlob++);
17116       }
17117       while( c2 && c2!=']' ){
17118         if( c2=='-' && zGlob[0]!=']' && zGlob[0]!=0 && prior_c>0 ){
17119           c2 = *(zGlob++);
17120           if( c>=prior_c && c<=c2 ) seen = 1;
17121           prior_c = 0;
17122         }else{
17123           if( c==c2 ){
17124             seen = 1;
17125           }
17126           prior_c = c2;
17127         }
17128         c2 = *(zGlob++);
17129       }
17130       if( c2==0 || (seen ^ invert)==0 ) return 0;
17131     }else if( c=='#' ){
17132       if( (z[0]=='-' || z[0]=='+') && IsDigit(z[1]) ) z++;
17133       if( !IsDigit(z[0]) ) return 0;
17134       z++;
17135       while( IsDigit(z[0]) ){ z++; }
17136     }else{
17137       if( c!=(*(z++)) ) return 0;
17138     }
17139   }
17140   while( IsSpace(*z) ){ z++; }
17141   return *z==0;
17142 }
17143 
17144 
17145 /*
17146 ** Compare the string as a command-line option with either one or two
17147 ** initial "-" characters.
17148 */
17149 static int optionMatch(const char *zStr, const char *zOpt){
17150   if( zStr[0]!='-' ) return 0;
17151   zStr++;
17152   if( zStr[0]=='-' ) zStr++;
17153   return strcmp(zStr, zOpt)==0;
17154 }
17155 
17156 /*
17157 ** Delete a file.
17158 */
17159 int shellDeleteFile(const char *zFilename){
17160   int rc;
17161 #ifdef _WIN32
17162   wchar_t *z = sqlite3_win32_utf8_to_unicode(zFilename);
17163   rc = _wunlink(z);
17164   sqlite3_free(z);
17165 #else
17166   rc = unlink(zFilename);
17167 #endif
17168   return rc;
17169 }
17170 
17171 /*
17172 ** Try to delete the temporary file (if there is one) and free the
17173 ** memory used to hold the name of the temp file.
17174 */
17175 static void clearTempFile(ShellState *p){
17176   if( p->zTempFile==0 ) return;
17177   if( p->doXdgOpen ) return;
17178   if( shellDeleteFile(p->zTempFile) ) return;
17179   sqlite3_free(p->zTempFile);
17180   p->zTempFile = 0;
17181 }
17182 
17183 /*
17184 ** Create a new temp file name with the given suffix.
17185 */
17186 static void newTempFile(ShellState *p, const char *zSuffix){
17187   clearTempFile(p);
17188   sqlite3_free(p->zTempFile);
17189   p->zTempFile = 0;
17190   if( p->db ){
17191     sqlite3_file_control(p->db, 0, SQLITE_FCNTL_TEMPFILENAME, &p->zTempFile);
17192   }
17193   if( p->zTempFile==0 ){
17194     /* If p->db is an in-memory database then the TEMPFILENAME file-control
17195     ** will not work and we will need to fallback to guessing */
17196     char *zTemp;
17197     sqlite3_uint64 r;
17198     sqlite3_randomness(sizeof(r), &r);
17199     zTemp = getenv("TEMP");
17200     if( zTemp==0 ) zTemp = getenv("TMP");
17201     if( zTemp==0 ){
17202 #ifdef _WIN32
17203       zTemp = "\\tmp";
17204 #else
17205       zTemp = "/tmp";
17206 #endif
17207     }
17208     p->zTempFile = sqlite3_mprintf("%s/temp%llx.%s", zTemp, r, zSuffix);
17209   }else{
17210     p->zTempFile = sqlite3_mprintf("%z.%s", p->zTempFile, zSuffix);
17211   }
17212   shell_check_oom(p->zTempFile);
17213 }
17214 
17215 
17216 /*
17217 ** The implementation of SQL scalar function fkey_collate_clause(), used
17218 ** by the ".lint fkey-indexes" command. This scalar function is always
17219 ** called with four arguments - the parent table name, the parent column name,
17220 ** the child table name and the child column name.
17221 **
17222 **   fkey_collate_clause('parent-tab', 'parent-col', 'child-tab', 'child-col')
17223 **
17224 ** If either of the named tables or columns do not exist, this function
17225 ** returns an empty string. An empty string is also returned if both tables
17226 ** and columns exist but have the same default collation sequence. Or,
17227 ** if both exist but the default collation sequences are different, this
17228 ** function returns the string " COLLATE <parent-collation>", where
17229 ** <parent-collation> is the default collation sequence of the parent column.
17230 */
17231 static void shellFkeyCollateClause(
17232   sqlite3_context *pCtx,
17233   int nVal,
17234   sqlite3_value **apVal
17235 ){
17236   sqlite3 *db = sqlite3_context_db_handle(pCtx);
17237   const char *zParent;
17238   const char *zParentCol;
17239   const char *zParentSeq;
17240   const char *zChild;
17241   const char *zChildCol;
17242   const char *zChildSeq = 0;  /* Initialize to avoid false-positive warning */
17243   int rc;
17244 
17245   assert( nVal==4 );
17246   zParent = (const char*)sqlite3_value_text(apVal[0]);
17247   zParentCol = (const char*)sqlite3_value_text(apVal[1]);
17248   zChild = (const char*)sqlite3_value_text(apVal[2]);
17249   zChildCol = (const char*)sqlite3_value_text(apVal[3]);
17250 
17251   sqlite3_result_text(pCtx, "", -1, SQLITE_STATIC);
17252   rc = sqlite3_table_column_metadata(
17253       db, "main", zParent, zParentCol, 0, &zParentSeq, 0, 0, 0
17254   );
17255   if( rc==SQLITE_OK ){
17256     rc = sqlite3_table_column_metadata(
17257         db, "main", zChild, zChildCol, 0, &zChildSeq, 0, 0, 0
17258     );
17259   }
17260 
17261   if( rc==SQLITE_OK && sqlite3_stricmp(zParentSeq, zChildSeq) ){
17262     char *z = sqlite3_mprintf(" COLLATE %s", zParentSeq);
17263     sqlite3_result_text(pCtx, z, -1, SQLITE_TRANSIENT);
17264     sqlite3_free(z);
17265   }
17266 }
17267 
17268 
17269 /*
17270 ** The implementation of dot-command ".lint fkey-indexes".
17271 */
17272 static int lintFkeyIndexes(
17273   ShellState *pState,             /* Current shell tool state */
17274   char **azArg,                   /* Array of arguments passed to dot command */
17275   int nArg                        /* Number of entries in azArg[] */
17276 ){
17277   sqlite3 *db = pState->db;       /* Database handle to query "main" db of */
17278   FILE *out = pState->out;        /* Stream to write non-error output to */
17279   int bVerbose = 0;               /* If -verbose is present */
17280   int bGroupByParent = 0;         /* If -groupbyparent is present */
17281   int i;                          /* To iterate through azArg[] */
17282   const char *zIndent = "";       /* How much to indent CREATE INDEX by */
17283   int rc;                         /* Return code */
17284   sqlite3_stmt *pSql = 0;         /* Compiled version of SQL statement below */
17285 
17286   /*
17287   ** This SELECT statement returns one row for each foreign key constraint
17288   ** in the schema of the main database. The column values are:
17289   **
17290   ** 0. The text of an SQL statement similar to:
17291   **
17292   **      "EXPLAIN QUERY PLAN SELECT 1 FROM child_table WHERE child_key=?"
17293   **
17294   **    This SELECT is similar to the one that the foreign keys implementation
17295   **    needs to run internally on child tables. If there is an index that can
17296   **    be used to optimize this query, then it can also be used by the FK
17297   **    implementation to optimize DELETE or UPDATE statements on the parent
17298   **    table.
17299   **
17300   ** 1. A GLOB pattern suitable for sqlite3_strglob(). If the plan output by
17301   **    the EXPLAIN QUERY PLAN command matches this pattern, then the schema
17302   **    contains an index that can be used to optimize the query.
17303   **
17304   ** 2. Human readable text that describes the child table and columns. e.g.
17305   **
17306   **       "child_table(child_key1, child_key2)"
17307   **
17308   ** 3. Human readable text that describes the parent table and columns. e.g.
17309   **
17310   **       "parent_table(parent_key1, parent_key2)"
17311   **
17312   ** 4. A full CREATE INDEX statement for an index that could be used to
17313   **    optimize DELETE or UPDATE statements on the parent table. e.g.
17314   **
17315   **       "CREATE INDEX child_table_child_key ON child_table(child_key)"
17316   **
17317   ** 5. The name of the parent table.
17318   **
17319   ** These six values are used by the C logic below to generate the report.
17320   */
17321   const char *zSql =
17322   "SELECT "
17323     "     'EXPLAIN QUERY PLAN SELECT 1 FROM ' || quote(s.name) || ' WHERE '"
17324     "  || group_concat(quote(s.name) || '.' || quote(f.[from]) || '=?' "
17325     "  || fkey_collate_clause("
17326     "       f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]),' AND ')"
17327     ", "
17328     "     'SEARCH ' || s.name || ' USING COVERING INDEX*('"
17329     "  || group_concat('*=?', ' AND ') || ')'"
17330     ", "
17331     "     s.name  || '(' || group_concat(f.[from],  ', ') || ')'"
17332     ", "
17333     "     f.[table] || '(' || group_concat(COALESCE(f.[to], p.[name])) || ')'"
17334     ", "
17335     "     'CREATE INDEX ' || quote(s.name ||'_'|| group_concat(f.[from], '_'))"
17336     "  || ' ON ' || quote(s.name) || '('"
17337     "  || group_concat(quote(f.[from]) ||"
17338     "        fkey_collate_clause("
17339     "          f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]), ', ')"
17340     "  || ');'"
17341     ", "
17342     "     f.[table] "
17343     "FROM sqlite_schema AS s, pragma_foreign_key_list(s.name) AS f "
17344     "LEFT JOIN pragma_table_info AS p ON (pk-1=seq AND p.arg=f.[table]) "
17345     "GROUP BY s.name, f.id "
17346     "ORDER BY (CASE WHEN ? THEN f.[table] ELSE s.name END)"
17347   ;
17348   const char *zGlobIPK = "SEARCH * USING INTEGER PRIMARY KEY (rowid=?)";
17349 
17350   for(i=2; i<nArg; i++){
17351     int n = strlen30(azArg[i]);
17352     if( n>1 && sqlite3_strnicmp("-verbose", azArg[i], n)==0 ){
17353       bVerbose = 1;
17354     }
17355     else if( n>1 && sqlite3_strnicmp("-groupbyparent", azArg[i], n)==0 ){
17356       bGroupByParent = 1;
17357       zIndent = "    ";
17358     }
17359     else{
17360       raw_printf(stderr, "Usage: %s %s ?-verbose? ?-groupbyparent?\n",
17361           azArg[0], azArg[1]
17362       );
17363       return SQLITE_ERROR;
17364     }
17365   }
17366 
17367   /* Register the fkey_collate_clause() SQL function */
17368   rc = sqlite3_create_function(db, "fkey_collate_clause", 4, SQLITE_UTF8,
17369       0, shellFkeyCollateClause, 0, 0
17370   );
17371 
17372 
17373   if( rc==SQLITE_OK ){
17374     rc = sqlite3_prepare_v2(db, zSql, -1, &pSql, 0);
17375   }
17376   if( rc==SQLITE_OK ){
17377     sqlite3_bind_int(pSql, 1, bGroupByParent);
17378   }
17379 
17380   if( rc==SQLITE_OK ){
17381     int rc2;
17382     char *zPrev = 0;
17383     while( SQLITE_ROW==sqlite3_step(pSql) ){
17384       int res = -1;
17385       sqlite3_stmt *pExplain = 0;
17386       const char *zEQP = (const char*)sqlite3_column_text(pSql, 0);
17387       const char *zGlob = (const char*)sqlite3_column_text(pSql, 1);
17388       const char *zFrom = (const char*)sqlite3_column_text(pSql, 2);
17389       const char *zTarget = (const char*)sqlite3_column_text(pSql, 3);
17390       const char *zCI = (const char*)sqlite3_column_text(pSql, 4);
17391       const char *zParent = (const char*)sqlite3_column_text(pSql, 5);
17392 
17393       if( zEQP==0 ) continue;
17394       if( zGlob==0 ) continue;
17395       rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
17396       if( rc!=SQLITE_OK ) break;
17397       if( SQLITE_ROW==sqlite3_step(pExplain) ){
17398         const char *zPlan = (const char*)sqlite3_column_text(pExplain, 3);
17399         res = zPlan!=0 && (  0==sqlite3_strglob(zGlob, zPlan)
17400                           || 0==sqlite3_strglob(zGlobIPK, zPlan));
17401       }
17402       rc = sqlite3_finalize(pExplain);
17403       if( rc!=SQLITE_OK ) break;
17404 
17405       if( res<0 ){
17406         raw_printf(stderr, "Error: internal error");
17407         break;
17408       }else{
17409         if( bGroupByParent
17410         && (bVerbose || res==0)
17411         && (zPrev==0 || sqlite3_stricmp(zParent, zPrev))
17412         ){
17413           raw_printf(out, "-- Parent table %s\n", zParent);
17414           sqlite3_free(zPrev);
17415           zPrev = sqlite3_mprintf("%s", zParent);
17416         }
17417 
17418         if( res==0 ){
17419           raw_printf(out, "%s%s --> %s\n", zIndent, zCI, zTarget);
17420         }else if( bVerbose ){
17421           raw_printf(out, "%s/* no extra indexes required for %s -> %s */\n",
17422               zIndent, zFrom, zTarget
17423           );
17424         }
17425       }
17426     }
17427     sqlite3_free(zPrev);
17428 
17429     if( rc!=SQLITE_OK ){
17430       raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
17431     }
17432 
17433     rc2 = sqlite3_finalize(pSql);
17434     if( rc==SQLITE_OK && rc2!=SQLITE_OK ){
17435       rc = rc2;
17436       raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
17437     }
17438   }else{
17439     raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
17440   }
17441 
17442   return rc;
17443 }
17444 
17445 /*
17446 ** Implementation of ".lint" dot command.
17447 */
17448 static int lintDotCommand(
17449   ShellState *pState,             /* Current shell tool state */
17450   char **azArg,                   /* Array of arguments passed to dot command */
17451   int nArg                        /* Number of entries in azArg[] */
17452 ){
17453   int n;
17454   n = (nArg>=2 ? strlen30(azArg[1]) : 0);
17455   if( n<1 || sqlite3_strnicmp(azArg[1], "fkey-indexes", n) ) goto usage;
17456   return lintFkeyIndexes(pState, azArg, nArg);
17457 
17458  usage:
17459   raw_printf(stderr, "Usage %s sub-command ?switches...?\n", azArg[0]);
17460   raw_printf(stderr, "Where sub-commands are:\n");
17461   raw_printf(stderr, "    fkey-indexes\n");
17462   return SQLITE_ERROR;
17463 }
17464 
17465 #if !defined SQLITE_OMIT_VIRTUALTABLE
17466 static void shellPrepare(
17467   sqlite3 *db,
17468   int *pRc,
17469   const char *zSql,
17470   sqlite3_stmt **ppStmt
17471 ){
17472   *ppStmt = 0;
17473   if( *pRc==SQLITE_OK ){
17474     int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0);
17475     if( rc!=SQLITE_OK ){
17476       raw_printf(stderr, "sql error: %s (%d)\n",
17477           sqlite3_errmsg(db), sqlite3_errcode(db)
17478       );
17479       *pRc = rc;
17480     }
17481   }
17482 }
17483 
17484 /*
17485 ** Create a prepared statement using printf-style arguments for the SQL.
17486 **
17487 ** This routine is could be marked "static".  But it is not always used,
17488 ** depending on compile-time options.  By omitting the "static", we avoid
17489 ** nuisance compiler warnings about "defined but not used".
17490 */
17491 void shellPreparePrintf(
17492   sqlite3 *db,
17493   int *pRc,
17494   sqlite3_stmt **ppStmt,
17495   const char *zFmt,
17496   ...
17497 ){
17498   *ppStmt = 0;
17499   if( *pRc==SQLITE_OK ){
17500     va_list ap;
17501     char *z;
17502     va_start(ap, zFmt);
17503     z = sqlite3_vmprintf(zFmt, ap);
17504     va_end(ap);
17505     if( z==0 ){
17506       *pRc = SQLITE_NOMEM;
17507     }else{
17508       shellPrepare(db, pRc, z, ppStmt);
17509       sqlite3_free(z);
17510     }
17511   }
17512 }
17513 
17514 /* Finalize the prepared statement created using shellPreparePrintf().
17515 **
17516 ** This routine is could be marked "static".  But it is not always used,
17517 ** depending on compile-time options.  By omitting the "static", we avoid
17518 ** nuisance compiler warnings about "defined but not used".
17519 */
17520 void shellFinalize(
17521   int *pRc,
17522   sqlite3_stmt *pStmt
17523 ){
17524   if( pStmt ){
17525     sqlite3 *db = sqlite3_db_handle(pStmt);
17526     int rc = sqlite3_finalize(pStmt);
17527     if( *pRc==SQLITE_OK ){
17528       if( rc!=SQLITE_OK ){
17529         raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));
17530       }
17531       *pRc = rc;
17532     }
17533   }
17534 }
17535 
17536 /* Reset the prepared statement created using shellPreparePrintf().
17537 **
17538 ** This routine is could be marked "static".  But it is not always used,
17539 ** depending on compile-time options.  By omitting the "static", we avoid
17540 ** nuisance compiler warnings about "defined but not used".
17541 */
17542 void shellReset(
17543   int *pRc,
17544   sqlite3_stmt *pStmt
17545 ){
17546   int rc = sqlite3_reset(pStmt);
17547   if( *pRc==SQLITE_OK ){
17548     if( rc!=SQLITE_OK ){
17549       sqlite3 *db = sqlite3_db_handle(pStmt);
17550       raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));
17551     }
17552     *pRc = rc;
17553   }
17554 }
17555 #endif /* !defined SQLITE_OMIT_VIRTUALTABLE */
17556 
17557 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
17558 /******************************************************************************
17559 ** The ".archive" or ".ar" command.
17560 */
17561 /*
17562 ** Structure representing a single ".ar" command.
17563 */
17564 typedef struct ArCommand ArCommand;
17565 struct ArCommand {
17566   u8 eCmd;                        /* An AR_CMD_* value */
17567   u8 bVerbose;                    /* True if --verbose */
17568   u8 bZip;                        /* True if the archive is a ZIP */
17569   u8 bDryRun;                     /* True if --dry-run */
17570   u8 bAppend;                     /* True if --append */
17571   u8 bGlob;                       /* True if --glob */
17572   u8 fromCmdLine;                 /* Run from -A instead of .archive */
17573   int nArg;                       /* Number of command arguments */
17574   char *zSrcTable;                /* "sqlar", "zipfile($file)" or "zip" */
17575   const char *zFile;              /* --file argument, or NULL */
17576   const char *zDir;               /* --directory argument, or NULL */
17577   char **azArg;                   /* Array of command arguments */
17578   ShellState *p;                  /* Shell state */
17579   sqlite3 *db;                    /* Database containing the archive */
17580 };
17581 
17582 /*
17583 ** Print a usage message for the .ar command to stderr and return SQLITE_ERROR.
17584 */
17585 static int arUsage(FILE *f){
17586   showHelp(f,"archive");
17587   return SQLITE_ERROR;
17588 }
17589 
17590 /*
17591 ** Print an error message for the .ar command to stderr and return
17592 ** SQLITE_ERROR.
17593 */
17594 static int arErrorMsg(ArCommand *pAr, const char *zFmt, ...){
17595   va_list ap;
17596   char *z;
17597   va_start(ap, zFmt);
17598   z = sqlite3_vmprintf(zFmt, ap);
17599   va_end(ap);
17600   utf8_printf(stderr, "Error: %s\n", z);
17601   if( pAr->fromCmdLine ){
17602     utf8_printf(stderr, "Use \"-A\" for more help\n");
17603   }else{
17604     utf8_printf(stderr, "Use \".archive --help\" for more help\n");
17605   }
17606   sqlite3_free(z);
17607   return SQLITE_ERROR;
17608 }
17609 
17610 /*
17611 ** Values for ArCommand.eCmd.
17612 */
17613 #define AR_CMD_CREATE       1
17614 #define AR_CMD_UPDATE       2
17615 #define AR_CMD_INSERT       3
17616 #define AR_CMD_EXTRACT      4
17617 #define AR_CMD_LIST         5
17618 #define AR_CMD_HELP         6
17619 #define AR_CMD_REMOVE       7
17620 
17621 /*
17622 ** Other (non-command) switches.
17623 */
17624 #define AR_SWITCH_VERBOSE     8
17625 #define AR_SWITCH_FILE        9
17626 #define AR_SWITCH_DIRECTORY  10
17627 #define AR_SWITCH_APPEND     11
17628 #define AR_SWITCH_DRYRUN     12
17629 #define AR_SWITCH_GLOB       13
17630 
17631 static int arProcessSwitch(ArCommand *pAr, int eSwitch, const char *zArg){
17632   switch( eSwitch ){
17633     case AR_CMD_CREATE:
17634     case AR_CMD_EXTRACT:
17635     case AR_CMD_LIST:
17636     case AR_CMD_REMOVE:
17637     case AR_CMD_UPDATE:
17638     case AR_CMD_INSERT:
17639     case AR_CMD_HELP:
17640       if( pAr->eCmd ){
17641         return arErrorMsg(pAr, "multiple command options");
17642       }
17643       pAr->eCmd = eSwitch;
17644       break;
17645 
17646     case AR_SWITCH_DRYRUN:
17647       pAr->bDryRun = 1;
17648       break;
17649     case AR_SWITCH_GLOB:
17650       pAr->bGlob = 1;
17651       break;
17652     case AR_SWITCH_VERBOSE:
17653       pAr->bVerbose = 1;
17654       break;
17655     case AR_SWITCH_APPEND:
17656       pAr->bAppend = 1;
17657       /* Fall thru into --file */
17658     case AR_SWITCH_FILE:
17659       pAr->zFile = zArg;
17660       break;
17661     case AR_SWITCH_DIRECTORY:
17662       pAr->zDir = zArg;
17663       break;
17664   }
17665 
17666   return SQLITE_OK;
17667 }
17668 
17669 /*
17670 ** Parse the command line for an ".ar" command. The results are written into
17671 ** structure (*pAr). SQLITE_OK is returned if the command line is parsed
17672 ** successfully, otherwise an error message is written to stderr and
17673 ** SQLITE_ERROR returned.
17674 */
17675 static int arParseCommand(
17676   char **azArg,                   /* Array of arguments passed to dot command */
17677   int nArg,                       /* Number of entries in azArg[] */
17678   ArCommand *pAr                  /* Populate this object */
17679 ){
17680   struct ArSwitch {
17681     const char *zLong;
17682     char cShort;
17683     u8 eSwitch;
17684     u8 bArg;
17685   } aSwitch[] = {
17686     { "create",    'c', AR_CMD_CREATE,       0 },
17687     { "extract",   'x', AR_CMD_EXTRACT,      0 },
17688     { "insert",    'i', AR_CMD_INSERT,       0 },
17689     { "list",      't', AR_CMD_LIST,         0 },
17690     { "remove",    'r', AR_CMD_REMOVE,       0 },
17691     { "update",    'u', AR_CMD_UPDATE,       0 },
17692     { "help",      'h', AR_CMD_HELP,         0 },
17693     { "verbose",   'v', AR_SWITCH_VERBOSE,   0 },
17694     { "file",      'f', AR_SWITCH_FILE,      1 },
17695     { "append",    'a', AR_SWITCH_APPEND,    1 },
17696     { "directory", 'C', AR_SWITCH_DIRECTORY, 1 },
17697     { "dryrun",    'n', AR_SWITCH_DRYRUN,    0 },
17698     { "glob",      'g', AR_SWITCH_GLOB,      0 },
17699   };
17700   int nSwitch = sizeof(aSwitch) / sizeof(struct ArSwitch);
17701   struct ArSwitch *pEnd = &aSwitch[nSwitch];
17702 
17703   if( nArg<=1 ){
17704     utf8_printf(stderr, "Wrong number of arguments.  Usage:\n");
17705     return arUsage(stderr);
17706   }else{
17707     char *z = azArg[1];
17708     if( z[0]!='-' ){
17709       /* Traditional style [tar] invocation */
17710       int i;
17711       int iArg = 2;
17712       for(i=0; z[i]; i++){
17713         const char *zArg = 0;
17714         struct ArSwitch *pOpt;
17715         for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
17716           if( z[i]==pOpt->cShort ) break;
17717         }
17718         if( pOpt==pEnd ){
17719           return arErrorMsg(pAr, "unrecognized option: %c", z[i]);
17720         }
17721         if( pOpt->bArg ){
17722           if( iArg>=nArg ){
17723             return arErrorMsg(pAr, "option requires an argument: %c",z[i]);
17724           }
17725           zArg = azArg[iArg++];
17726         }
17727         if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR;
17728       }
17729       pAr->nArg = nArg-iArg;
17730       if( pAr->nArg>0 ){
17731         pAr->azArg = &azArg[iArg];
17732       }
17733     }else{
17734       /* Non-traditional invocation */
17735       int iArg;
17736       for(iArg=1; iArg<nArg; iArg++){
17737         int n;
17738         z = azArg[iArg];
17739         if( z[0]!='-' ){
17740           /* All remaining command line words are command arguments. */
17741           pAr->azArg = &azArg[iArg];
17742           pAr->nArg = nArg-iArg;
17743           break;
17744         }
17745         n = strlen30(z);
17746 
17747         if( z[1]!='-' ){
17748           int i;
17749           /* One or more short options */
17750           for(i=1; i<n; i++){
17751             const char *zArg = 0;
17752             struct ArSwitch *pOpt;
17753             for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
17754               if( z[i]==pOpt->cShort ) break;
17755             }
17756             if( pOpt==pEnd ){
17757               return arErrorMsg(pAr, "unrecognized option: %c", z[i]);
17758             }
17759             if( pOpt->bArg ){
17760               if( i<(n-1) ){
17761                 zArg = &z[i+1];
17762                 i = n;
17763               }else{
17764                 if( iArg>=(nArg-1) ){
17765                   return arErrorMsg(pAr, "option requires an argument: %c",
17766                                     z[i]);
17767                 }
17768                 zArg = azArg[++iArg];
17769               }
17770             }
17771             if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR;
17772           }
17773         }else if( z[2]=='\0' ){
17774           /* A -- option, indicating that all remaining command line words
17775           ** are command arguments.  */
17776           pAr->azArg = &azArg[iArg+1];
17777           pAr->nArg = nArg-iArg-1;
17778           break;
17779         }else{
17780           /* A long option */
17781           const char *zArg = 0;             /* Argument for option, if any */
17782           struct ArSwitch *pMatch = 0;      /* Matching option */
17783           struct ArSwitch *pOpt;            /* Iterator */
17784           for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
17785             const char *zLong = pOpt->zLong;
17786             if( (n-2)<=strlen30(zLong) && 0==memcmp(&z[2], zLong, n-2) ){
17787               if( pMatch ){
17788                 return arErrorMsg(pAr, "ambiguous option: %s",z);
17789               }else{
17790                 pMatch = pOpt;
17791               }
17792             }
17793           }
17794 
17795           if( pMatch==0 ){
17796             return arErrorMsg(pAr, "unrecognized option: %s", z);
17797           }
17798           if( pMatch->bArg ){
17799             if( iArg>=(nArg-1) ){
17800               return arErrorMsg(pAr, "option requires an argument: %s", z);
17801             }
17802             zArg = azArg[++iArg];
17803           }
17804           if( arProcessSwitch(pAr, pMatch->eSwitch, zArg) ) return SQLITE_ERROR;
17805         }
17806       }
17807     }
17808   }
17809 
17810   return SQLITE_OK;
17811 }
17812 
17813 /*
17814 ** This function assumes that all arguments within the ArCommand.azArg[]
17815 ** array refer to archive members, as for the --extract, --list or --remove
17816 ** commands. It checks that each of them are "present". If any specified
17817 ** file is not present in the archive, an error is printed to stderr and an
17818 ** error code returned. Otherwise, if all specified arguments are present
17819 ** in the archive, SQLITE_OK is returned. Here, "present" means either an
17820 ** exact equality when pAr->bGlob is false or a "name GLOB pattern" match
17821 ** when pAr->bGlob is true.
17822 **
17823 ** This function strips any trailing '/' characters from each argument.
17824 ** This is consistent with the way the [tar] command seems to work on
17825 ** Linux.
17826 */
17827 static int arCheckEntries(ArCommand *pAr){
17828   int rc = SQLITE_OK;
17829   if( pAr->nArg ){
17830     int i, j;
17831     sqlite3_stmt *pTest = 0;
17832     const char *zSel = (pAr->bGlob)
17833       ? "SELECT name FROM %s WHERE glob($name,name)"
17834       : "SELECT name FROM %s WHERE name=$name";
17835 
17836     shellPreparePrintf(pAr->db, &rc, &pTest, zSel, pAr->zSrcTable);
17837     j = sqlite3_bind_parameter_index(pTest, "$name");
17838     for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){
17839       char *z = pAr->azArg[i];
17840       int n = strlen30(z);
17841       int bOk = 0;
17842       while( n>0 && z[n-1]=='/' ) n--;
17843       z[n] = '\0';
17844       sqlite3_bind_text(pTest, j, z, -1, SQLITE_STATIC);
17845       if( SQLITE_ROW==sqlite3_step(pTest) ){
17846         bOk = 1;
17847       }
17848       shellReset(&rc, pTest);
17849       if( rc==SQLITE_OK && bOk==0 ){
17850         utf8_printf(stderr, "not found in archive: %s\n", z);
17851         rc = SQLITE_ERROR;
17852       }
17853     }
17854     shellFinalize(&rc, pTest);
17855   }
17856   return rc;
17857 }
17858 
17859 /*
17860 ** Format a WHERE clause that can be used against the "sqlar" table to
17861 ** identify all archive members that match the command arguments held
17862 ** in (*pAr). Leave this WHERE clause in (*pzWhere) before returning.
17863 ** The caller is responsible for eventually calling sqlite3_free() on
17864 ** any non-NULL (*pzWhere) value. Here, "match" means strict equality
17865 ** when pAr->bGlob is false and GLOB match when pAr->bGlob is true.
17866 */
17867 static void arWhereClause(
17868   int *pRc,
17869   ArCommand *pAr,
17870   char **pzWhere                  /* OUT: New WHERE clause */
17871 ){
17872   char *zWhere = 0;
17873   const char *zSameOp = (pAr->bGlob)? "GLOB" : "=";
17874   if( *pRc==SQLITE_OK ){
17875     if( pAr->nArg==0 ){
17876       zWhere = sqlite3_mprintf("1");
17877     }else{
17878       int i;
17879       const char *zSep = "";
17880       for(i=0; i<pAr->nArg; i++){
17881         const char *z = pAr->azArg[i];
17882         zWhere = sqlite3_mprintf(
17883           "%z%s name %s '%q' OR substr(name,1,%d) %s '%q/'",
17884           zWhere, zSep, zSameOp, z, strlen30(z)+1, zSameOp, z
17885         );
17886         if( zWhere==0 ){
17887           *pRc = SQLITE_NOMEM;
17888           break;
17889         }
17890         zSep = " OR ";
17891       }
17892     }
17893   }
17894   *pzWhere = zWhere;
17895 }
17896 
17897 /*
17898 ** Implementation of .ar "lisT" command.
17899 */
17900 static int arListCommand(ArCommand *pAr){
17901   const char *zSql = "SELECT %s FROM %s WHERE %s";
17902   const char *azCols[] = {
17903     "name",
17904     "lsmode(mode), sz, datetime(mtime, 'unixepoch'), name"
17905   };
17906 
17907   char *zWhere = 0;
17908   sqlite3_stmt *pSql = 0;
17909   int rc;
17910 
17911   rc = arCheckEntries(pAr);
17912   arWhereClause(&rc, pAr, &zWhere);
17913 
17914   shellPreparePrintf(pAr->db, &rc, &pSql, zSql, azCols[pAr->bVerbose],
17915                      pAr->zSrcTable, zWhere);
17916   if( pAr->bDryRun ){
17917     utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql));
17918   }else{
17919     while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
17920       if( pAr->bVerbose ){
17921         utf8_printf(pAr->p->out, "%s % 10d  %s  %s\n",
17922             sqlite3_column_text(pSql, 0),
17923             sqlite3_column_int(pSql, 1),
17924             sqlite3_column_text(pSql, 2),
17925             sqlite3_column_text(pSql, 3)
17926         );
17927       }else{
17928         utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0));
17929       }
17930     }
17931   }
17932   shellFinalize(&rc, pSql);
17933   sqlite3_free(zWhere);
17934   return rc;
17935 }
17936 
17937 
17938 /*
17939 ** Implementation of .ar "Remove" command.
17940 */
17941 static int arRemoveCommand(ArCommand *pAr){
17942   int rc = 0;
17943   char *zSql = 0;
17944   char *zWhere = 0;
17945 
17946   if( pAr->nArg ){
17947     /* Verify that args actually exist within the archive before proceeding.
17948     ** And formulate a WHERE clause to match them.  */
17949     rc = arCheckEntries(pAr);
17950     arWhereClause(&rc, pAr, &zWhere);
17951   }
17952   if( rc==SQLITE_OK ){
17953     zSql = sqlite3_mprintf("DELETE FROM %s WHERE %s;",
17954                            pAr->zSrcTable, zWhere);
17955     if( pAr->bDryRun ){
17956       utf8_printf(pAr->p->out, "%s\n", zSql);
17957     }else{
17958       char *zErr = 0;
17959       rc = sqlite3_exec(pAr->db, "SAVEPOINT ar;", 0, 0, 0);
17960       if( rc==SQLITE_OK ){
17961         rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr);
17962         if( rc!=SQLITE_OK ){
17963           sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0);
17964         }else{
17965           rc = sqlite3_exec(pAr->db, "RELEASE ar;", 0, 0, 0);
17966         }
17967       }
17968       if( zErr ){
17969         utf8_printf(stdout, "ERROR: %s\n", zErr);
17970         sqlite3_free(zErr);
17971       }
17972     }
17973   }
17974   sqlite3_free(zWhere);
17975   sqlite3_free(zSql);
17976   return rc;
17977 }
17978 
17979 /*
17980 ** Implementation of .ar "eXtract" command.
17981 */
17982 static int arExtractCommand(ArCommand *pAr){
17983   const char *zSql1 =
17984     "SELECT "
17985     " ($dir || name),"
17986     " writefile(($dir || name), %s, mode, mtime) "
17987     "FROM %s WHERE (%s) AND (data IS NULL OR $dirOnly = 0)"
17988     " AND name NOT GLOB '*..[/\\]*'";
17989 
17990   const char *azExtraArg[] = {
17991     "sqlar_uncompress(data, sz)",
17992     "data"
17993   };
17994 
17995   sqlite3_stmt *pSql = 0;
17996   int rc = SQLITE_OK;
17997   char *zDir = 0;
17998   char *zWhere = 0;
17999   int i, j;
18000 
18001   /* If arguments are specified, check that they actually exist within
18002   ** the archive before proceeding. And formulate a WHERE clause to
18003   ** match them.  */
18004   rc = arCheckEntries(pAr);
18005   arWhereClause(&rc, pAr, &zWhere);
18006 
18007   if( rc==SQLITE_OK ){
18008     if( pAr->zDir ){
18009       zDir = sqlite3_mprintf("%s/", pAr->zDir);
18010     }else{
18011       zDir = sqlite3_mprintf("");
18012     }
18013     if( zDir==0 ) rc = SQLITE_NOMEM;
18014   }
18015 
18016   shellPreparePrintf(pAr->db, &rc, &pSql, zSql1,
18017       azExtraArg[pAr->bZip], pAr->zSrcTable, zWhere
18018   );
18019 
18020   if( rc==SQLITE_OK ){
18021     j = sqlite3_bind_parameter_index(pSql, "$dir");
18022     sqlite3_bind_text(pSql, j, zDir, -1, SQLITE_STATIC);
18023 
18024     /* Run the SELECT statement twice. The first time, writefile() is called
18025     ** for all archive members that should be extracted. The second time,
18026     ** only for the directories. This is because the timestamps for
18027     ** extracted directories must be reset after they are populated (as
18028     ** populating them changes the timestamp).  */
18029     for(i=0; i<2; i++){
18030       j = sqlite3_bind_parameter_index(pSql, "$dirOnly");
18031       sqlite3_bind_int(pSql, j, i);
18032       if( pAr->bDryRun ){
18033         utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql));
18034       }else{
18035         while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
18036           if( i==0 && pAr->bVerbose ){
18037             utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0));
18038           }
18039         }
18040       }
18041       shellReset(&rc, pSql);
18042     }
18043     shellFinalize(&rc, pSql);
18044   }
18045 
18046   sqlite3_free(zDir);
18047   sqlite3_free(zWhere);
18048   return rc;
18049 }
18050 
18051 /*
18052 ** Run the SQL statement in zSql.  Or if doing a --dryrun, merely print it out.
18053 */
18054 static int arExecSql(ArCommand *pAr, const char *zSql){
18055   int rc;
18056   if( pAr->bDryRun ){
18057     utf8_printf(pAr->p->out, "%s\n", zSql);
18058     rc = SQLITE_OK;
18059   }else{
18060     char *zErr = 0;
18061     rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr);
18062     if( zErr ){
18063       utf8_printf(stdout, "ERROR: %s\n", zErr);
18064       sqlite3_free(zErr);
18065     }
18066   }
18067   return rc;
18068 }
18069 
18070 
18071 /*
18072 ** Implementation of .ar "create", "insert", and "update" commands.
18073 **
18074 **     create    ->     Create a new SQL archive
18075 **     insert    ->     Insert or reinsert all files listed
18076 **     update    ->     Insert files that have changed or that were not
18077 **                      previously in the archive
18078 **
18079 ** Create the "sqlar" table in the database if it does not already exist.
18080 ** Then add each file in the azFile[] array to the archive. Directories
18081 ** are added recursively. If argument bVerbose is non-zero, a message is
18082 ** printed on stdout for each file archived.
18083 **
18084 ** The create command is the same as update, except that it drops
18085 ** any existing "sqlar" table before beginning.  The "insert" command
18086 ** always overwrites every file named on the command-line, where as
18087 ** "update" only overwrites if the size or mtime or mode has changed.
18088 */
18089 static int arCreateOrUpdateCommand(
18090   ArCommand *pAr,                 /* Command arguments and options */
18091   int bUpdate,                    /* true for a --create. */
18092   int bOnlyIfChanged              /* Only update if file has changed */
18093 ){
18094   const char *zCreate =
18095       "CREATE TABLE IF NOT EXISTS sqlar(\n"
18096       "  name TEXT PRIMARY KEY,  -- name of the file\n"
18097       "  mode INT,               -- access permissions\n"
18098       "  mtime INT,              -- last modification time\n"
18099       "  sz INT,                 -- original file size\n"
18100       "  data BLOB               -- compressed content\n"
18101       ")";
18102   const char *zDrop = "DROP TABLE IF EXISTS sqlar";
18103   const char *zInsertFmt[2] = {
18104      "REPLACE INTO %s(name,mode,mtime,sz,data)\n"
18105      "  SELECT\n"
18106      "    %s,\n"
18107      "    mode,\n"
18108      "    mtime,\n"
18109      "    CASE substr(lsmode(mode),1,1)\n"
18110      "      WHEN '-' THEN length(data)\n"
18111      "      WHEN 'd' THEN 0\n"
18112      "      ELSE -1 END,\n"
18113      "    sqlar_compress(data)\n"
18114      "  FROM fsdir(%Q,%Q) AS disk\n"
18115      "  WHERE lsmode(mode) NOT LIKE '?%%'%s;"
18116      ,
18117      "REPLACE INTO %s(name,mode,mtime,data)\n"
18118      "  SELECT\n"
18119      "    %s,\n"
18120      "    mode,\n"
18121      "    mtime,\n"
18122      "    data\n"
18123      "  FROM fsdir(%Q,%Q) AS disk\n"
18124      "  WHERE lsmode(mode) NOT LIKE '?%%'%s;"
18125   };
18126   int i;                          /* For iterating through azFile[] */
18127   int rc;                         /* Return code */
18128   const char *zTab = 0;           /* SQL table into which to insert */
18129   char *zSql;
18130   char zTemp[50];
18131   char *zExists = 0;
18132 
18133   arExecSql(pAr, "PRAGMA page_size=512");
18134   rc = arExecSql(pAr, "SAVEPOINT ar;");
18135   if( rc!=SQLITE_OK ) return rc;
18136   zTemp[0] = 0;
18137   if( pAr->bZip ){
18138     /* Initialize the zipfile virtual table, if necessary */
18139     if( pAr->zFile ){
18140       sqlite3_uint64 r;
18141       sqlite3_randomness(sizeof(r),&r);
18142       sqlite3_snprintf(sizeof(zTemp),zTemp,"zip%016llx",r);
18143       zTab = zTemp;
18144       zSql = sqlite3_mprintf(
18145          "CREATE VIRTUAL TABLE temp.%s USING zipfile(%Q)",
18146          zTab, pAr->zFile
18147       );
18148       rc = arExecSql(pAr, zSql);
18149       sqlite3_free(zSql);
18150     }else{
18151       zTab = "zip";
18152     }
18153   }else{
18154     /* Initialize the table for an SQLAR */
18155     zTab = "sqlar";
18156     if( bUpdate==0 ){
18157       rc = arExecSql(pAr, zDrop);
18158       if( rc!=SQLITE_OK ) goto end_ar_transaction;
18159     }
18160     rc = arExecSql(pAr, zCreate);
18161   }
18162   if( bOnlyIfChanged ){
18163     zExists = sqlite3_mprintf(
18164       " AND NOT EXISTS("
18165           "SELECT 1 FROM %s AS mem"
18166           " WHERE mem.name=disk.name"
18167           " AND mem.mtime=disk.mtime"
18168           " AND mem.mode=disk.mode)", zTab);
18169   }else{
18170     zExists = sqlite3_mprintf("");
18171   }
18172   if( zExists==0 ) rc = SQLITE_NOMEM;
18173   for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){
18174     char *zSql2 = sqlite3_mprintf(zInsertFmt[pAr->bZip], zTab,
18175         pAr->bVerbose ? "shell_putsnl(name)" : "name",
18176         pAr->azArg[i], pAr->zDir, zExists);
18177     rc = arExecSql(pAr, zSql2);
18178     sqlite3_free(zSql2);
18179   }
18180 end_ar_transaction:
18181   if( rc!=SQLITE_OK ){
18182     sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0);
18183   }else{
18184     rc = arExecSql(pAr, "RELEASE ar;");
18185     if( pAr->bZip && pAr->zFile ){
18186       zSql = sqlite3_mprintf("DROP TABLE %s", zTemp);
18187       arExecSql(pAr, zSql);
18188       sqlite3_free(zSql);
18189     }
18190   }
18191   sqlite3_free(zExists);
18192   return rc;
18193 }
18194 
18195 /*
18196 ** Implementation of ".ar" dot command.
18197 */
18198 static int arDotCommand(
18199   ShellState *pState,          /* Current shell tool state */
18200   int fromCmdLine,             /* True if -A command-line option, not .ar cmd */
18201   char **azArg,                /* Array of arguments passed to dot command */
18202   int nArg                     /* Number of entries in azArg[] */
18203 ){
18204   ArCommand cmd;
18205   int rc;
18206   memset(&cmd, 0, sizeof(cmd));
18207   cmd.fromCmdLine = fromCmdLine;
18208   rc = arParseCommand(azArg, nArg, &cmd);
18209   if( rc==SQLITE_OK ){
18210     int eDbType = SHELL_OPEN_UNSPEC;
18211     cmd.p = pState;
18212     cmd.db = pState->db;
18213     if( cmd.zFile ){
18214       eDbType = deduceDatabaseType(cmd.zFile, 1);
18215     }else{
18216       eDbType = pState->openMode;
18217     }
18218     if( eDbType==SHELL_OPEN_ZIPFILE ){
18219       if( cmd.eCmd==AR_CMD_EXTRACT || cmd.eCmd==AR_CMD_LIST ){
18220         if( cmd.zFile==0 ){
18221           cmd.zSrcTable = sqlite3_mprintf("zip");
18222         }else{
18223           cmd.zSrcTable = sqlite3_mprintf("zipfile(%Q)", cmd.zFile);
18224         }
18225       }
18226       cmd.bZip = 1;
18227     }else if( cmd.zFile ){
18228       int flags;
18229       if( cmd.bAppend ) eDbType = SHELL_OPEN_APPENDVFS;
18230       if( cmd.eCmd==AR_CMD_CREATE || cmd.eCmd==AR_CMD_INSERT
18231            || cmd.eCmd==AR_CMD_REMOVE || cmd.eCmd==AR_CMD_UPDATE ){
18232         flags = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE;
18233       }else{
18234         flags = SQLITE_OPEN_READONLY;
18235       }
18236       cmd.db = 0;
18237       if( cmd.bDryRun ){
18238         utf8_printf(pState->out, "-- open database '%s'%s\n", cmd.zFile,
18239              eDbType==SHELL_OPEN_APPENDVFS ? " using 'apndvfs'" : "");
18240       }
18241       rc = sqlite3_open_v2(cmd.zFile, &cmd.db, flags,
18242              eDbType==SHELL_OPEN_APPENDVFS ? "apndvfs" : 0);
18243       if( rc!=SQLITE_OK ){
18244         utf8_printf(stderr, "cannot open file: %s (%s)\n",
18245             cmd.zFile, sqlite3_errmsg(cmd.db)
18246         );
18247         goto end_ar_command;
18248       }
18249       sqlite3_fileio_init(cmd.db, 0, 0);
18250       sqlite3_sqlar_init(cmd.db, 0, 0);
18251       sqlite3_create_function(cmd.db, "shell_putsnl", 1, SQLITE_UTF8, cmd.p,
18252                               shellPutsFunc, 0, 0);
18253 
18254     }
18255     if( cmd.zSrcTable==0 && cmd.bZip==0 && cmd.eCmd!=AR_CMD_HELP ){
18256       if( cmd.eCmd!=AR_CMD_CREATE
18257        && sqlite3_table_column_metadata(cmd.db,0,"sqlar","name",0,0,0,0,0)
18258       ){
18259         utf8_printf(stderr, "database does not contain an 'sqlar' table\n");
18260         rc = SQLITE_ERROR;
18261         goto end_ar_command;
18262       }
18263       cmd.zSrcTable = sqlite3_mprintf("sqlar");
18264     }
18265 
18266     switch( cmd.eCmd ){
18267       case AR_CMD_CREATE:
18268         rc = arCreateOrUpdateCommand(&cmd, 0, 0);
18269         break;
18270 
18271       case AR_CMD_EXTRACT:
18272         rc = arExtractCommand(&cmd);
18273         break;
18274 
18275       case AR_CMD_LIST:
18276         rc = arListCommand(&cmd);
18277         break;
18278 
18279       case AR_CMD_HELP:
18280         arUsage(pState->out);
18281         break;
18282 
18283       case AR_CMD_INSERT:
18284         rc = arCreateOrUpdateCommand(&cmd, 1, 0);
18285         break;
18286 
18287       case AR_CMD_REMOVE:
18288         rc = arRemoveCommand(&cmd);
18289         break;
18290 
18291       default:
18292         assert( cmd.eCmd==AR_CMD_UPDATE );
18293         rc = arCreateOrUpdateCommand(&cmd, 1, 1);
18294         break;
18295     }
18296   }
18297 end_ar_command:
18298   if( cmd.db!=pState->db ){
18299     close_db(cmd.db);
18300   }
18301   sqlite3_free(cmd.zSrcTable);
18302 
18303   return rc;
18304 }
18305 /* End of the ".archive" or ".ar" command logic
18306 *******************************************************************************/
18307 #endif /* !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) */
18308 
18309 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
18310 /*
18311 ** If (*pRc) is not SQLITE_OK when this function is called, it is a no-op.
18312 ** Otherwise, the SQL statement or statements in zSql are executed using
18313 ** database connection db and the error code written to *pRc before
18314 ** this function returns.
18315 */
18316 static void shellExec(sqlite3 *db, int *pRc, const char *zSql){
18317   int rc = *pRc;
18318   if( rc==SQLITE_OK ){
18319     char *zErr = 0;
18320     rc = sqlite3_exec(db, zSql, 0, 0, &zErr);
18321     if( rc!=SQLITE_OK ){
18322       raw_printf(stderr, "SQL error: %s\n", zErr);
18323     }
18324     sqlite3_free(zErr);
18325     *pRc = rc;
18326   }
18327 }
18328 
18329 /*
18330 ** Like shellExec(), except that zFmt is a printf() style format string.
18331 */
18332 static void shellExecPrintf(sqlite3 *db, int *pRc, const char *zFmt, ...){
18333   char *z = 0;
18334   if( *pRc==SQLITE_OK ){
18335     va_list ap;
18336     va_start(ap, zFmt);
18337     z = sqlite3_vmprintf(zFmt, ap);
18338     va_end(ap);
18339     if( z==0 ){
18340       *pRc = SQLITE_NOMEM;
18341     }else{
18342       shellExec(db, pRc, z);
18343     }
18344     sqlite3_free(z);
18345   }
18346 }
18347 
18348 /*
18349 ** If *pRc is not SQLITE_OK when this function is called, it is a no-op.
18350 ** Otherwise, an attempt is made to allocate, zero and return a pointer
18351 ** to a buffer nByte bytes in size. If an OOM error occurs, *pRc is set
18352 ** to SQLITE_NOMEM and NULL returned.
18353 */
18354 static void *shellMalloc(int *pRc, sqlite3_int64 nByte){
18355   void *pRet = 0;
18356   if( *pRc==SQLITE_OK ){
18357     pRet = sqlite3_malloc64(nByte);
18358     if( pRet==0 ){
18359       *pRc = SQLITE_NOMEM;
18360     }else{
18361       memset(pRet, 0, nByte);
18362     }
18363   }
18364   return pRet;
18365 }
18366 
18367 /*
18368 ** If *pRc is not SQLITE_OK when this function is called, it is a no-op.
18369 ** Otherwise, zFmt is treated as a printf() style string. The result of
18370 ** formatting it along with any trailing arguments is written into a
18371 ** buffer obtained from sqlite3_malloc(), and pointer to which is returned.
18372 ** It is the responsibility of the caller to eventually free this buffer
18373 ** using a call to sqlite3_free().
18374 **
18375 ** If an OOM error occurs, (*pRc) is set to SQLITE_NOMEM and a NULL
18376 ** pointer returned.
18377 */
18378 static char *shellMPrintf(int *pRc, const char *zFmt, ...){
18379   char *z = 0;
18380   if( *pRc==SQLITE_OK ){
18381     va_list ap;
18382     va_start(ap, zFmt);
18383     z = sqlite3_vmprintf(zFmt, ap);
18384     va_end(ap);
18385     if( z==0 ){
18386       *pRc = SQLITE_NOMEM;
18387     }
18388   }
18389   return z;
18390 }
18391 
18392 
18393 /*
18394 ** When running the ".recover" command, each output table, and the special
18395 ** orphaned row table if it is required, is represented by an instance
18396 ** of the following struct.
18397 */
18398 typedef struct RecoverTable RecoverTable;
18399 struct RecoverTable {
18400   char *zQuoted;                  /* Quoted version of table name */
18401   int nCol;                       /* Number of columns in table */
18402   char **azlCol;                  /* Array of column lists */
18403   int iPk;                        /* Index of IPK column */
18404 };
18405 
18406 /*
18407 ** Free a RecoverTable object allocated by recoverFindTable() or
18408 ** recoverOrphanTable().
18409 */
18410 static void recoverFreeTable(RecoverTable *pTab){
18411   if( pTab ){
18412     sqlite3_free(pTab->zQuoted);
18413     if( pTab->azlCol ){
18414       int i;
18415       for(i=0; i<=pTab->nCol; i++){
18416         sqlite3_free(pTab->azlCol[i]);
18417       }
18418       sqlite3_free(pTab->azlCol);
18419     }
18420     sqlite3_free(pTab);
18421   }
18422 }
18423 
18424 /*
18425 ** This function is a no-op if (*pRc) is not SQLITE_OK when it is called.
18426 ** Otherwise, it allocates and returns a RecoverTable object based on the
18427 ** final four arguments passed to this function. It is the responsibility
18428 ** of the caller to eventually free the returned object using
18429 ** recoverFreeTable().
18430 */
18431 static RecoverTable *recoverNewTable(
18432   int *pRc,                       /* IN/OUT: Error code */
18433   const char *zName,              /* Name of table */
18434   const char *zSql,               /* CREATE TABLE statement */
18435   int bIntkey,
18436   int nCol
18437 ){
18438   sqlite3 *dbtmp = 0;             /* sqlite3 handle for testing CREATE TABLE */
18439   int rc = *pRc;
18440   RecoverTable *pTab = 0;
18441 
18442   pTab = (RecoverTable*)shellMalloc(&rc, sizeof(RecoverTable));
18443   if( rc==SQLITE_OK ){
18444     int nSqlCol = 0;
18445     int bSqlIntkey = 0;
18446     sqlite3_stmt *pStmt = 0;
18447 
18448     rc = sqlite3_open("", &dbtmp);
18449     if( rc==SQLITE_OK ){
18450       sqlite3_create_function(dbtmp, "shell_idquote", 1, SQLITE_UTF8, 0,
18451                               shellIdQuote, 0, 0);
18452     }
18453     if( rc==SQLITE_OK ){
18454       rc = sqlite3_exec(dbtmp, "PRAGMA writable_schema = on", 0, 0, 0);
18455     }
18456     if( rc==SQLITE_OK ){
18457       rc = sqlite3_exec(dbtmp, zSql, 0, 0, 0);
18458       if( rc==SQLITE_ERROR ){
18459         rc = SQLITE_OK;
18460         goto finished;
18461       }
18462     }
18463     shellPreparePrintf(dbtmp, &rc, &pStmt,
18464         "SELECT count(*) FROM pragma_table_info(%Q)", zName
18465     );
18466     if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
18467       nSqlCol = sqlite3_column_int(pStmt, 0);
18468     }
18469     shellFinalize(&rc, pStmt);
18470 
18471     if( rc!=SQLITE_OK || nSqlCol<nCol ){
18472       goto finished;
18473     }
18474 
18475     shellPreparePrintf(dbtmp, &rc, &pStmt,
18476       "SELECT ("
18477       "  SELECT substr(data,1,1)==X'0D' FROM sqlite_dbpage WHERE pgno=rootpage"
18478       ") FROM sqlite_schema WHERE name = %Q", zName
18479     );
18480     if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
18481       bSqlIntkey = sqlite3_column_int(pStmt, 0);
18482     }
18483     shellFinalize(&rc, pStmt);
18484 
18485     if( bIntkey==bSqlIntkey ){
18486       int i;
18487       const char *zPk = "_rowid_";
18488       sqlite3_stmt *pPkFinder = 0;
18489 
18490       /* If this is an intkey table and there is an INTEGER PRIMARY KEY,
18491       ** set zPk to the name of the PK column, and pTab->iPk to the index
18492       ** of the column, where columns are 0-numbered from left to right.
18493       ** Or, if this is a WITHOUT ROWID table or if there is no IPK column,
18494       ** leave zPk as "_rowid_" and pTab->iPk at -2.  */
18495       pTab->iPk = -2;
18496       if( bIntkey ){
18497         shellPreparePrintf(dbtmp, &rc, &pPkFinder,
18498           "SELECT cid, name FROM pragma_table_info(%Q) "
18499           "  WHERE pk=1 AND type='integer' COLLATE nocase"
18500           "  AND NOT EXISTS (SELECT cid FROM pragma_table_info(%Q) WHERE pk=2)"
18501           , zName, zName
18502         );
18503         if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pPkFinder) ){
18504           pTab->iPk = sqlite3_column_int(pPkFinder, 0);
18505           zPk = (const char*)sqlite3_column_text(pPkFinder, 1);
18506           if( zPk==0 ){ zPk = "_";  /* Defensive.  Should never happen */ }
18507         }
18508       }
18509 
18510       pTab->zQuoted = shellMPrintf(&rc, "\"%w\"", zName);
18511       pTab->azlCol = (char**)shellMalloc(&rc, sizeof(char*) * (nSqlCol+1));
18512       pTab->nCol = nSqlCol;
18513 
18514       if( bIntkey ){
18515         pTab->azlCol[0] = shellMPrintf(&rc, "\"%w\"", zPk);
18516       }else{
18517         pTab->azlCol[0] = shellMPrintf(&rc, "");
18518       }
18519       i = 1;
18520       shellPreparePrintf(dbtmp, &rc, &pStmt,
18521           "SELECT %Q || group_concat(shell_idquote(name), ', ') "
18522           "  FILTER (WHERE cid!=%d) OVER (ORDER BY %s cid) "
18523           "FROM pragma_table_info(%Q)",
18524           bIntkey ? ", " : "", pTab->iPk,
18525           bIntkey ? "" : "(CASE WHEN pk=0 THEN 1000000 ELSE pk END), ",
18526           zName
18527       );
18528       while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
18529         const char *zText = (const char*)sqlite3_column_text(pStmt, 0);
18530         pTab->azlCol[i] = shellMPrintf(&rc, "%s%s", pTab->azlCol[0], zText);
18531         i++;
18532       }
18533       shellFinalize(&rc, pStmt);
18534 
18535       shellFinalize(&rc, pPkFinder);
18536     }
18537   }
18538 
18539  finished:
18540   sqlite3_close(dbtmp);
18541   *pRc = rc;
18542   if( rc!=SQLITE_OK || (pTab && pTab->zQuoted==0) ){
18543     recoverFreeTable(pTab);
18544     pTab = 0;
18545   }
18546   return pTab;
18547 }
18548 
18549 /*
18550 ** This function is called to search the schema recovered from the
18551 ** sqlite_schema table of the (possibly) corrupt database as part
18552 ** of a ".recover" command. Specifically, for a table with root page
18553 ** iRoot and at least nCol columns. Additionally, if bIntkey is 0, the
18554 ** table must be a WITHOUT ROWID table, or if non-zero, not one of
18555 ** those.
18556 **
18557 ** If a table is found, a (RecoverTable*) object is returned. Or, if
18558 ** no such table is found, but bIntkey is false and iRoot is the
18559 ** root page of an index in the recovered schema, then (*pbNoop) is
18560 ** set to true and NULL returned. Or, if there is no such table or
18561 ** index, NULL is returned and (*pbNoop) set to 0, indicating that
18562 ** the caller should write data to the orphans table.
18563 */
18564 static RecoverTable *recoverFindTable(
18565   ShellState *pState,             /* Shell state object */
18566   int *pRc,                       /* IN/OUT: Error code */
18567   int iRoot,                      /* Root page of table */
18568   int bIntkey,                    /* True for an intkey table */
18569   int nCol,                       /* Number of columns in table */
18570   int *pbNoop                     /* OUT: True if iRoot is root of index */
18571 ){
18572   sqlite3_stmt *pStmt = 0;
18573   RecoverTable *pRet = 0;
18574   int bNoop = 0;
18575   const char *zSql = 0;
18576   const char *zName = 0;
18577 
18578   /* Search the recovered schema for an object with root page iRoot. */
18579   shellPreparePrintf(pState->db, pRc, &pStmt,
18580       "SELECT type, name, sql FROM recovery.schema WHERE rootpage=%d", iRoot
18581   );
18582   while( *pRc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
18583     const char *zType = (const char*)sqlite3_column_text(pStmt, 0);
18584     if( bIntkey==0 && sqlite3_stricmp(zType, "index")==0 ){
18585       bNoop = 1;
18586       break;
18587     }
18588     if( sqlite3_stricmp(zType, "table")==0 ){
18589       zName = (const char*)sqlite3_column_text(pStmt, 1);
18590       zSql = (const char*)sqlite3_column_text(pStmt, 2);
18591       if( zName!=0 && zSql!=0 ){
18592         pRet = recoverNewTable(pRc, zName, zSql, bIntkey, nCol);
18593         break;
18594       }
18595     }
18596   }
18597 
18598   shellFinalize(pRc, pStmt);
18599   *pbNoop = bNoop;
18600   return pRet;
18601 }
18602 
18603 /*
18604 ** Return a RecoverTable object representing the orphans table.
18605 */
18606 static RecoverTable *recoverOrphanTable(
18607   ShellState *pState,             /* Shell state object */
18608   int *pRc,                       /* IN/OUT: Error code */
18609   const char *zLostAndFound,      /* Base name for orphans table */
18610   int nCol                        /* Number of user data columns */
18611 ){
18612   RecoverTable *pTab = 0;
18613   if( nCol>=0 && *pRc==SQLITE_OK ){
18614     int i;
18615 
18616     /* This block determines the name of the orphan table. The prefered
18617     ** name is zLostAndFound. But if that clashes with another name
18618     ** in the recovered schema, try zLostAndFound_0, zLostAndFound_1
18619     ** and so on until a non-clashing name is found.  */
18620     int iTab = 0;
18621     char *zTab = shellMPrintf(pRc, "%s", zLostAndFound);
18622     sqlite3_stmt *pTest = 0;
18623     shellPrepare(pState->db, pRc,
18624         "SELECT 1 FROM recovery.schema WHERE name=?", &pTest
18625     );
18626     if( pTest ) sqlite3_bind_text(pTest, 1, zTab, -1, SQLITE_TRANSIENT);
18627     while( *pRc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pTest) ){
18628       shellReset(pRc, pTest);
18629       sqlite3_free(zTab);
18630       zTab = shellMPrintf(pRc, "%s_%d", zLostAndFound, iTab++);
18631       sqlite3_bind_text(pTest, 1, zTab, -1, SQLITE_TRANSIENT);
18632     }
18633     shellFinalize(pRc, pTest);
18634 
18635     pTab = (RecoverTable*)shellMalloc(pRc, sizeof(RecoverTable));
18636     if( pTab ){
18637       pTab->zQuoted = shellMPrintf(pRc, "\"%w\"", zTab);
18638       pTab->nCol = nCol;
18639       pTab->iPk = -2;
18640       if( nCol>0 ){
18641         pTab->azlCol = (char**)shellMalloc(pRc, sizeof(char*) * (nCol+1));
18642         if( pTab->azlCol ){
18643           pTab->azlCol[nCol] = shellMPrintf(pRc, "");
18644           for(i=nCol-1; i>=0; i--){
18645             pTab->azlCol[i] = shellMPrintf(pRc, "%s, NULL", pTab->azlCol[i+1]);
18646           }
18647         }
18648       }
18649 
18650       if( *pRc!=SQLITE_OK ){
18651         recoverFreeTable(pTab);
18652         pTab = 0;
18653       }else{
18654         raw_printf(pState->out,
18655             "CREATE TABLE %s(rootpgno INTEGER, "
18656             "pgno INTEGER, nfield INTEGER, id INTEGER", pTab->zQuoted
18657         );
18658         for(i=0; i<nCol; i++){
18659           raw_printf(pState->out, ", c%d", i);
18660         }
18661         raw_printf(pState->out, ");\n");
18662       }
18663     }
18664     sqlite3_free(zTab);
18665   }
18666   return pTab;
18667 }
18668 
18669 /*
18670 ** This function is called to recover data from the database. A script
18671 ** to construct a new database containing all recovered data is output
18672 ** on stream pState->out.
18673 */
18674 static int recoverDatabaseCmd(ShellState *pState, int nArg, char **azArg){
18675   int rc = SQLITE_OK;
18676   sqlite3_stmt *pLoop = 0;        /* Loop through all root pages */
18677   sqlite3_stmt *pPages = 0;       /* Loop through all pages in a group */
18678   sqlite3_stmt *pCells = 0;       /* Loop through all cells in a page */
18679   const char *zRecoveryDb = "";   /* Name of "recovery" database */
18680   const char *zLostAndFound = "lost_and_found";
18681   int i;
18682   int nOrphan = -1;
18683   RecoverTable *pOrphan = 0;
18684 
18685   int bFreelist = 1;              /* 0 if --freelist-corrupt is specified */
18686   int bRowids = 1;                /* 0 if --no-rowids */
18687   for(i=1; i<nArg; i++){
18688     char *z = azArg[i];
18689     int n;
18690     if( z[0]=='-' && z[1]=='-' ) z++;
18691     n = strlen30(z);
18692     if( n<=17 && memcmp("-freelist-corrupt", z, n)==0 ){
18693       bFreelist = 0;
18694     }else
18695     if( n<=12 && memcmp("-recovery-db", z, n)==0 && i<(nArg-1) ){
18696       i++;
18697       zRecoveryDb = azArg[i];
18698     }else
18699     if( n<=15 && memcmp("-lost-and-found", z, n)==0 && i<(nArg-1) ){
18700       i++;
18701       zLostAndFound = azArg[i];
18702     }else
18703     if( n<=10 && memcmp("-no-rowids", z, n)==0 ){
18704       bRowids = 0;
18705     }
18706     else{
18707       utf8_printf(stderr, "unexpected option: %s\n", azArg[i]);
18708       showHelp(pState->out, azArg[0]);
18709       return 1;
18710     }
18711   }
18712 
18713   shellExecPrintf(pState->db, &rc,
18714     /* Attach an in-memory database named 'recovery'. Create an indexed
18715     ** cache of the sqlite_dbptr virtual table. */
18716     "PRAGMA writable_schema = on;"
18717     "ATTACH %Q AS recovery;"
18718     "DROP TABLE IF EXISTS recovery.dbptr;"
18719     "DROP TABLE IF EXISTS recovery.freelist;"
18720     "DROP TABLE IF EXISTS recovery.map;"
18721     "DROP TABLE IF EXISTS recovery.schema;"
18722     "CREATE TABLE recovery.freelist(pgno INTEGER PRIMARY KEY);", zRecoveryDb
18723   );
18724 
18725   if( bFreelist ){
18726     shellExec(pState->db, &rc,
18727       "WITH trunk(pgno) AS ("
18728       "  SELECT shell_int32("
18729       "      (SELECT data FROM sqlite_dbpage WHERE pgno=1), 8) AS x "
18730       "      WHERE x>0"
18731       "    UNION"
18732       "  SELECT shell_int32("
18733       "      (SELECT data FROM sqlite_dbpage WHERE pgno=trunk.pgno), 0) AS x "
18734       "      FROM trunk WHERE x>0"
18735       "),"
18736       "freelist(data, n, freepgno) AS ("
18737       "  SELECT data, min(16384, shell_int32(data, 1)-1), t.pgno "
18738       "      FROM trunk t, sqlite_dbpage s WHERE s.pgno=t.pgno"
18739       "    UNION ALL"
18740       "  SELECT data, n-1, shell_int32(data, 2+n) "
18741       "      FROM freelist WHERE n>=0"
18742       ")"
18743       "REPLACE INTO recovery.freelist SELECT freepgno FROM freelist;"
18744     );
18745   }
18746 
18747   /* If this is an auto-vacuum database, add all pointer-map pages to
18748   ** the freelist table. Do this regardless of whether or not
18749   ** --freelist-corrupt was specified.  */
18750   shellExec(pState->db, &rc,
18751     "WITH ptrmap(pgno) AS ("
18752     "  SELECT 2 WHERE shell_int32("
18753     "    (SELECT data FROM sqlite_dbpage WHERE pgno=1), 13"
18754     "  )"
18755     "    UNION ALL "
18756     "  SELECT pgno+1+(SELECT page_size FROM pragma_page_size)/5 AS pp "
18757     "  FROM ptrmap WHERE pp<=(SELECT page_count FROM pragma_page_count)"
18758     ")"
18759     "REPLACE INTO recovery.freelist SELECT pgno FROM ptrmap"
18760   );
18761 
18762   shellExec(pState->db, &rc,
18763     "CREATE TABLE recovery.dbptr("
18764     "      pgno, child, PRIMARY KEY(child, pgno)"
18765     ") WITHOUT ROWID;"
18766     "INSERT OR IGNORE INTO recovery.dbptr(pgno, child) "
18767     "    SELECT * FROM sqlite_dbptr"
18768     "      WHERE pgno NOT IN freelist AND child NOT IN freelist;"
18769 
18770     /* Delete any pointer to page 1. This ensures that page 1 is considered
18771     ** a root page, regardless of how corrupt the db is. */
18772     "DELETE FROM recovery.dbptr WHERE child = 1;"
18773 
18774     /* Delete all pointers to any pages that have more than one pointer
18775     ** to them. Such pages will be treated as root pages when recovering
18776     ** data.  */
18777     "DELETE FROM recovery.dbptr WHERE child IN ("
18778     "  SELECT child FROM recovery.dbptr GROUP BY child HAVING count(*)>1"
18779     ");"
18780 
18781     /* Create the "map" table that will (eventually) contain instructions
18782     ** for dealing with each page in the db that contains one or more
18783     ** records. */
18784     "CREATE TABLE recovery.map("
18785       "pgno INTEGER PRIMARY KEY, maxlen INT, intkey, root INT"
18786     ");"
18787 
18788     /* Populate table [map]. If there are circular loops of pages in the
18789     ** database, the following adds all pages in such a loop to the map
18790     ** as individual root pages. This could be handled better.  */
18791     "WITH pages(i, maxlen) AS ("
18792     "  SELECT page_count, ("
18793     "    SELECT max(field+1) FROM sqlite_dbdata WHERE pgno=page_count"
18794     "  ) FROM pragma_page_count WHERE page_count>0"
18795     "    UNION ALL"
18796     "  SELECT i-1, ("
18797     "    SELECT max(field+1) FROM sqlite_dbdata WHERE pgno=i-1"
18798     "  ) FROM pages WHERE i>=2"
18799     ")"
18800     "INSERT INTO recovery.map(pgno, maxlen, intkey, root) "
18801     "  SELECT i, maxlen, NULL, ("
18802     "    WITH p(orig, pgno, parent) AS ("
18803     "      SELECT 0, i, (SELECT pgno FROM recovery.dbptr WHERE child=i)"
18804     "        UNION "
18805     "      SELECT i, p.parent, "
18806     "        (SELECT pgno FROM recovery.dbptr WHERE child=p.parent) FROM p"
18807     "    )"
18808     "    SELECT pgno FROM p WHERE (parent IS NULL OR pgno = orig)"
18809     ") "
18810     "FROM pages WHERE maxlen IS NOT NULL AND i NOT IN freelist;"
18811     "UPDATE recovery.map AS o SET intkey = ("
18812     "  SELECT substr(data, 1, 1)==X'0D' FROM sqlite_dbpage WHERE pgno=o.pgno"
18813     ");"
18814 
18815     /* Extract data from page 1 and any linked pages into table
18816     ** recovery.schema. With the same schema as an sqlite_schema table.  */
18817     "CREATE TABLE recovery.schema(type, name, tbl_name, rootpage, sql);"
18818     "INSERT INTO recovery.schema SELECT "
18819     "  max(CASE WHEN field=0 THEN value ELSE NULL END),"
18820     "  max(CASE WHEN field=1 THEN value ELSE NULL END),"
18821     "  max(CASE WHEN field=2 THEN value ELSE NULL END),"
18822     "  max(CASE WHEN field=3 THEN value ELSE NULL END),"
18823     "  max(CASE WHEN field=4 THEN value ELSE NULL END)"
18824     "FROM sqlite_dbdata WHERE pgno IN ("
18825     "  SELECT pgno FROM recovery.map WHERE root=1"
18826     ")"
18827     "GROUP BY pgno, cell;"
18828     "CREATE INDEX recovery.schema_rootpage ON schema(rootpage);"
18829   );
18830 
18831   /* Open a transaction, then print out all non-virtual, non-"sqlite_%"
18832   ** CREATE TABLE statements that extracted from the existing schema.  */
18833   if( rc==SQLITE_OK ){
18834     sqlite3_stmt *pStmt = 0;
18835     /* ".recover" might output content in an order which causes immediate
18836     ** foreign key constraints to be violated. So disable foreign-key
18837     ** constraint enforcement to prevent problems when running the output
18838     ** script. */
18839     raw_printf(pState->out, "PRAGMA foreign_keys=OFF;\n");
18840     raw_printf(pState->out, "BEGIN;\n");
18841     raw_printf(pState->out, "PRAGMA writable_schema = on;\n");
18842     shellPrepare(pState->db, &rc,
18843         "SELECT sql FROM recovery.schema "
18844         "WHERE type='table' AND sql LIKE 'create table%'", &pStmt
18845     );
18846     while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
18847       const char *zCreateTable = (const char*)sqlite3_column_text(pStmt, 0);
18848       raw_printf(pState->out, "CREATE TABLE IF NOT EXISTS %s;\n",
18849           &zCreateTable[12]
18850       );
18851     }
18852     shellFinalize(&rc, pStmt);
18853   }
18854 
18855   /* Figure out if an orphan table will be required. And if so, how many
18856   ** user columns it should contain */
18857   shellPrepare(pState->db, &rc,
18858       "SELECT coalesce(max(maxlen), -2) FROM recovery.map WHERE root>1"
18859       , &pLoop
18860   );
18861   if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pLoop) ){
18862     nOrphan = sqlite3_column_int(pLoop, 0);
18863   }
18864   shellFinalize(&rc, pLoop);
18865   pLoop = 0;
18866 
18867   shellPrepare(pState->db, &rc,
18868       "SELECT pgno FROM recovery.map WHERE root=?", &pPages
18869   );
18870 
18871   shellPrepare(pState->db, &rc,
18872       "SELECT max(field), group_concat(shell_escape_crnl(quote"
18873       "(case when (? AND field<0) then NULL else value end)"
18874       "), ', ')"
18875       ", min(field) "
18876       "FROM sqlite_dbdata WHERE pgno = ? AND field != ?"
18877       "GROUP BY cell", &pCells
18878   );
18879 
18880   /* Loop through each root page. */
18881   shellPrepare(pState->db, &rc,
18882       "SELECT root, intkey, max(maxlen) FROM recovery.map"
18883       " WHERE root>1 GROUP BY root, intkey ORDER BY root=("
18884       "  SELECT rootpage FROM recovery.schema WHERE name='sqlite_sequence'"
18885       ")", &pLoop
18886   );
18887   while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pLoop) ){
18888     int iRoot = sqlite3_column_int(pLoop, 0);
18889     int bIntkey = sqlite3_column_int(pLoop, 1);
18890     int nCol = sqlite3_column_int(pLoop, 2);
18891     int bNoop = 0;
18892     RecoverTable *pTab;
18893 
18894     assert( bIntkey==0 || bIntkey==1 );
18895     pTab = recoverFindTable(pState, &rc, iRoot, bIntkey, nCol, &bNoop);
18896     if( bNoop || rc ) continue;
18897     if( pTab==0 ){
18898       if( pOrphan==0 ){
18899         pOrphan = recoverOrphanTable(pState, &rc, zLostAndFound, nOrphan);
18900       }
18901       pTab = pOrphan;
18902       if( pTab==0 ) break;
18903     }
18904 
18905     if( 0==sqlite3_stricmp(pTab->zQuoted, "\"sqlite_sequence\"") ){
18906       raw_printf(pState->out, "DELETE FROM sqlite_sequence;\n");
18907     }
18908     sqlite3_bind_int(pPages, 1, iRoot);
18909     if( bRowids==0 && pTab->iPk<0 ){
18910       sqlite3_bind_int(pCells, 1, 1);
18911     }else{
18912       sqlite3_bind_int(pCells, 1, 0);
18913     }
18914     sqlite3_bind_int(pCells, 3, pTab->iPk);
18915 
18916     while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pPages) ){
18917       int iPgno = sqlite3_column_int(pPages, 0);
18918       sqlite3_bind_int(pCells, 2, iPgno);
18919       while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pCells) ){
18920         int nField = sqlite3_column_int(pCells, 0);
18921         int iMin = sqlite3_column_int(pCells, 2);
18922         const char *zVal = (const char*)sqlite3_column_text(pCells, 1);
18923 
18924         RecoverTable *pTab2 = pTab;
18925         if( pTab!=pOrphan && (iMin<0)!=bIntkey ){
18926           if( pOrphan==0 ){
18927             pOrphan = recoverOrphanTable(pState, &rc, zLostAndFound, nOrphan);
18928           }
18929           pTab2 = pOrphan;
18930           if( pTab2==0 ) break;
18931         }
18932 
18933         nField = nField+1;
18934         if( pTab2==pOrphan ){
18935           raw_printf(pState->out,
18936               "INSERT INTO %s VALUES(%d, %d, %d, %s%s%s);\n",
18937               pTab2->zQuoted, iRoot, iPgno, nField,
18938               iMin<0 ? "" : "NULL, ", zVal, pTab2->azlCol[nField]
18939           );
18940         }else{
18941           raw_printf(pState->out, "INSERT INTO %s(%s) VALUES( %s );\n",
18942               pTab2->zQuoted, pTab2->azlCol[nField], zVal
18943           );
18944         }
18945       }
18946       shellReset(&rc, pCells);
18947     }
18948     shellReset(&rc, pPages);
18949     if( pTab!=pOrphan ) recoverFreeTable(pTab);
18950   }
18951   shellFinalize(&rc, pLoop);
18952   shellFinalize(&rc, pPages);
18953   shellFinalize(&rc, pCells);
18954   recoverFreeTable(pOrphan);
18955 
18956   /* The rest of the schema */
18957   if( rc==SQLITE_OK ){
18958     sqlite3_stmt *pStmt = 0;
18959     shellPrepare(pState->db, &rc,
18960         "SELECT sql, name FROM recovery.schema "
18961         "WHERE sql NOT LIKE 'create table%'", &pStmt
18962     );
18963     while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
18964       const char *zSql = (const char*)sqlite3_column_text(pStmt, 0);
18965       if( sqlite3_strnicmp(zSql, "create virt", 11)==0 ){
18966         const char *zName = (const char*)sqlite3_column_text(pStmt, 1);
18967         char *zPrint = shellMPrintf(&rc,
18968           "INSERT INTO sqlite_schema VALUES('table', %Q, %Q, 0, %Q)",
18969           zName, zName, zSql
18970         );
18971         raw_printf(pState->out, "%s;\n", zPrint);
18972         sqlite3_free(zPrint);
18973       }else{
18974         raw_printf(pState->out, "%s;\n", zSql);
18975       }
18976     }
18977     shellFinalize(&rc, pStmt);
18978   }
18979 
18980   if( rc==SQLITE_OK ){
18981     raw_printf(pState->out, "PRAGMA writable_schema = off;\n");
18982     raw_printf(pState->out, "COMMIT;\n");
18983   }
18984   sqlite3_exec(pState->db, "DETACH recovery", 0, 0, 0);
18985   return rc;
18986 }
18987 #endif /* !(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) */
18988 
18989 
18990 /*
18991  * zAutoColumn(zCol, &db, ?) => Maybe init db, add column zCol to it.
18992  * zAutoColumn(0, &db, ?) => (db!=0) Form columns spec for CREATE TABLE,
18993  *   close db and set it to 0, and return the columns spec, to later
18994  *   be sqlite3_free()'ed by the caller.
18995  * The return is 0 when either:
18996  *   (a) The db was not initialized and zCol==0 (There are no columns.)
18997  *   (b) zCol!=0  (Column was added, db initialized as needed.)
18998  * The 3rd argument, pRenamed, references an out parameter. If the
18999  * pointer is non-zero, its referent will be set to a summary of renames
19000  * done if renaming was necessary, or set to 0 if none was done. The out
19001  * string (if any) must be sqlite3_free()'ed by the caller.
19002  */
19003 #ifdef SHELL_DEBUG
19004 #define rc_err_oom_die(rc) \
19005   if( rc==SQLITE_NOMEM ) shell_check_oom(0); \
19006   else if(!(rc==SQLITE_OK||rc==SQLITE_DONE)) \
19007     fprintf(stderr,"E:%d\n",rc), assert(0)
19008 #else
19009 static void rc_err_oom_die(int rc){
19010   if( rc==SQLITE_NOMEM ) shell_check_oom(0);
19011   assert(rc==SQLITE_OK||rc==SQLITE_DONE);
19012 }
19013 #endif
19014 
19015 #ifdef SHELL_COLFIX_DB /* If this is set, the DB can be in a file. */
19016 static char zCOL_DB[] = SHELL_STRINGIFY(SHELL_COLFIX_DB);
19017 #else  /* Otherwise, memory is faster/better for the transient DB. */
19018 static const char *zCOL_DB = ":memory:";
19019 #endif
19020 
19021 /* Define character (as C string) to separate generated column ordinal
19022  * from protected part of incoming column names. This defaults to "_"
19023  * so that incoming column identifiers that did not need not be quoted
19024  * remain usable without being quoted. It must be one character.
19025  */
19026 #ifndef SHELL_AUTOCOLUMN_SEP
19027 # define AUTOCOLUMN_SEP "_"
19028 #else
19029 # define AUTOCOLUMN_SEP SHELL_STRINGIFY(SHELL_AUTOCOLUMN_SEP)
19030 #endif
19031 
19032 static char *zAutoColumn(const char *zColNew, sqlite3 **pDb, char **pzRenamed){
19033   /* Queries and D{D,M}L used here */
19034   static const char * const zTabMake = "\
19035 CREATE TABLE ColNames(\
19036  cpos INTEGER PRIMARY KEY,\
19037  name TEXT, nlen INT, chop INT, reps INT, suff TEXT);\
19038 CREATE VIEW RepeatedNames AS \
19039 SELECT DISTINCT t.name FROM ColNames t \
19040 WHERE t.name COLLATE NOCASE IN (\
19041  SELECT o.name FROM ColNames o WHERE o.cpos<>t.cpos\
19042 );\
19043 ";
19044   static const char * const zTabFill = "\
19045 INSERT INTO ColNames(name,nlen,chop,reps,suff)\
19046  VALUES(iif(length(?1)>0,?1,'?'),max(length(?1),1),0,0,'')\
19047 ";
19048   static const char * const zHasDupes = "\
19049 SELECT count(DISTINCT (substring(name,1,nlen-chop)||suff) COLLATE NOCASE)\
19050  <count(name) FROM ColNames\
19051 ";
19052 #ifdef SHELL_COLUMN_RENAME_CLEAN
19053   static const char * const zDedoctor = "\
19054 UPDATE ColNames SET chop=iif(\
19055   (substring(name,nlen,1) BETWEEN '0' AND '9')\
19056   AND (rtrim(name,'0123456790') glob '*"AUTOCOLUMN_SEP"'),\
19057  nlen-length(rtrim(name, '"AUTOCOLUMN_SEP"0123456789')),\
19058  0\
19059 )\
19060 ";
19061 #endif
19062   static const char * const zSetReps = "\
19063 UPDATE ColNames AS t SET reps=\
19064 (SELECT count(*) FROM ColNames d \
19065  WHERE substring(t.name,1,t.nlen-t.chop)=substring(d.name,1,d.nlen-d.chop)\
19066  COLLATE NOCASE\
19067 )\
19068 ";
19069 #ifdef SQLITE_ENABLE_MATH_FUNCTIONS
19070   static const char * const zColDigits = "\
19071 SELECT CAST(ceil(log(count(*)+0.5)) AS INT) FROM ColNames \
19072 ";
19073 #else
19074   /* Counting on SQLITE_MAX_COLUMN < 100,000 here. (32767 is the hard limit.) */
19075   static const char * const zColDigits = "\
19076 SELECT CASE WHEN (nc < 10) THEN 1 WHEN (nc < 100) THEN 2 \
19077  WHEN (nc < 1000) THEN 3 WHEN (nc < 10000) THEN 4 \
19078  ELSE 5 FROM (SELECT count(*) AS nc FROM ColNames) \
19079 ";
19080 #endif
19081   static const char * const zRenameRank =
19082 #ifdef SHELL_COLUMN_RENAME_CLEAN
19083     "UPDATE ColNames AS t SET suff="
19084     "iif(reps>1, printf('%c%0*d', '"AUTOCOLUMN_SEP"', $1, cpos), '')"
19085 #else /* ...RENAME_MINIMAL_ONE_PASS */
19086 "WITH Lzn(nlz) AS (" /* Find minimum extraneous leading 0's for uniqueness */
19087 "  SELECT 0 AS nlz"
19088 "  UNION"
19089 "  SELECT nlz+1 AS nlz FROM Lzn"
19090 "  WHERE EXISTS("
19091 "   SELECT 1"
19092 "   FROM ColNames t, ColNames o"
19093 "   WHERE"
19094 "    iif(t.name IN (SELECT * FROM RepeatedNames),"
19095 "     printf('%s"AUTOCOLUMN_SEP"%s',"
19096 "      t.name, substring(printf('%.*c%0.*d',nlz+1,'0',$1,t.cpos),2)),"
19097 "     t.name"
19098 "    )"
19099 "    ="
19100 "    iif(o.name IN (SELECT * FROM RepeatedNames),"
19101 "     printf('%s"AUTOCOLUMN_SEP"%s',"
19102 "      o.name, substring(printf('%.*c%0.*d',nlz+1,'0',$1,o.cpos),2)),"
19103 "     o.name"
19104 "    )"
19105 "    COLLATE NOCASE"
19106 "    AND o.cpos<>t.cpos"
19107 "   GROUP BY t.cpos"
19108 "  )"
19109 ") UPDATE Colnames AS t SET"
19110 " chop = 0," /* No chopping, never touch incoming names. */
19111 " suff = iif(name IN (SELECT * FROM RepeatedNames),"
19112 "  printf('"AUTOCOLUMN_SEP"%s', substring("
19113 "   printf('%.*c%0.*d',(SELECT max(nlz) FROM Lzn)+1,'0',1,t.cpos),2)),"
19114 "  ''"
19115 " )"
19116 #endif
19117     ;
19118   static const char * const zCollectVar = "\
19119 SELECT\
19120  '('||x'0a'\
19121  || group_concat(\
19122   cname||' TEXT',\
19123   ','||iif((cpos-1)%4>0, ' ', x'0a'||' '))\
19124  ||')' AS ColsSpec \
19125 FROM (\
19126  SELECT cpos, printf('\"%w\"',printf('%!.*s%s', nlen-chop,name,suff)) AS cname \
19127  FROM ColNames ORDER BY cpos\
19128 )";
19129   static const char * const zRenamesDone =
19130     "SELECT group_concat("
19131     " printf('\"%w\" to \"%w\"',name,printf('%!.*s%s', nlen-chop, name, suff)),"
19132     " ','||x'0a')"
19133     "FROM ColNames WHERE suff<>'' OR chop!=0"
19134     ;
19135   int rc;
19136   sqlite3_stmt *pStmt = 0;
19137   assert(pDb!=0);
19138   if( zColNew ){
19139     /* Add initial or additional column. Init db if necessary. */
19140     if( *pDb==0 ){
19141       if( SQLITE_OK!=sqlite3_open(zCOL_DB, pDb) ) return 0;
19142 #ifdef SHELL_COLFIX_DB
19143       if(*zCOL_DB!=':')
19144         sqlite3_exec(*pDb,"drop table if exists ColNames;"
19145                      "drop view if exists RepeatedNames;",0,0,0);
19146 #endif
19147       rc = sqlite3_exec(*pDb, zTabMake, 0, 0, 0);
19148       rc_err_oom_die(rc);
19149     }
19150     assert(*pDb!=0);
19151     rc = sqlite3_prepare_v2(*pDb, zTabFill, -1, &pStmt, 0);
19152     rc_err_oom_die(rc);
19153     rc = sqlite3_bind_text(pStmt, 1, zColNew, -1, 0);
19154     rc_err_oom_die(rc);
19155     rc = sqlite3_step(pStmt);
19156     rc_err_oom_die(rc);
19157     sqlite3_finalize(pStmt);
19158     return 0;
19159   }else if( *pDb==0 ){
19160     return 0;
19161   }else{
19162     /* Formulate the columns spec, close the DB, zero *pDb. */
19163     char *zColsSpec = 0;
19164     int hasDupes = db_int(*pDb, zHasDupes);
19165     int nDigits = (hasDupes)? db_int(*pDb, zColDigits) : 0;
19166     if( hasDupes ){
19167 #ifdef SHELL_COLUMN_RENAME_CLEAN
19168       rc = sqlite3_exec(*pDb, zDedoctor, 0, 0, 0);
19169       rc_err_oom_die(rc);
19170 #endif
19171       rc = sqlite3_exec(*pDb, zSetReps, 0, 0, 0);
19172       rc_err_oom_die(rc);
19173       rc = sqlite3_prepare_v2(*pDb, zRenameRank, -1, &pStmt, 0);
19174       rc_err_oom_die(rc);
19175       sqlite3_bind_int(pStmt, 1, nDigits);
19176       rc = sqlite3_step(pStmt);
19177       sqlite3_finalize(pStmt);
19178       assert(rc==SQLITE_DONE);
19179     }
19180     assert(db_int(*pDb, zHasDupes)==0); /* Consider: remove this */
19181     rc = sqlite3_prepare_v2(*pDb, zCollectVar, -1, &pStmt, 0);
19182     rc_err_oom_die(rc);
19183     rc = sqlite3_step(pStmt);
19184     if( rc==SQLITE_ROW ){
19185       zColsSpec = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
19186     }else{
19187       zColsSpec = 0;
19188     }
19189     if( pzRenamed!=0 ){
19190       if( !hasDupes ) *pzRenamed = 0;
19191       else{
19192         sqlite3_finalize(pStmt);
19193         if( SQLITE_OK==sqlite3_prepare_v2(*pDb, zRenamesDone, -1, &pStmt, 0)
19194             && SQLITE_ROW==sqlite3_step(pStmt) ){
19195           *pzRenamed = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
19196         }else
19197           *pzRenamed = 0;
19198       }
19199     }
19200     sqlite3_finalize(pStmt);
19201     sqlite3_close(*pDb);
19202     *pDb = 0;
19203     return zColsSpec;
19204   }
19205 }
19206 
19207 /*
19208 ** If an input line begins with "." then invoke this routine to
19209 ** process that line.
19210 **
19211 ** Return 1 on error, 2 to exit, and 0 otherwise.
19212 */
19213 static int do_meta_command(char *zLine, ShellState *p){
19214   int h = 1;
19215   int nArg = 0;
19216   int n, c;
19217   int rc = 0;
19218   char *azArg[52];
19219 
19220 #ifndef SQLITE_OMIT_VIRTUALTABLE
19221   if( p->expert.pExpert ){
19222     expertFinish(p, 1, 0);
19223   }
19224 #endif
19225 
19226   /* Parse the input line into tokens.
19227   */
19228   while( zLine[h] && nArg<ArraySize(azArg)-1 ){
19229     while( IsSpace(zLine[h]) ){ h++; }
19230     if( zLine[h]==0 ) break;
19231     if( zLine[h]=='\'' || zLine[h]=='"' ){
19232       int delim = zLine[h++];
19233       azArg[nArg++] = &zLine[h];
19234       while( zLine[h] && zLine[h]!=delim ){
19235         if( zLine[h]=='\\' && delim=='"' && zLine[h+1]!=0 ) h++;
19236         h++;
19237       }
19238       if( zLine[h]==delim ){
19239         zLine[h++] = 0;
19240       }
19241       if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
19242     }else{
19243       azArg[nArg++] = &zLine[h];
19244       while( zLine[h] && !IsSpace(zLine[h]) ){ h++; }
19245       if( zLine[h] ) zLine[h++] = 0;
19246       resolve_backslashes(azArg[nArg-1]);
19247     }
19248   }
19249   azArg[nArg] = 0;
19250 
19251   /* Process the input line.
19252   */
19253   if( nArg==0 ) return 0; /* no tokens, no error */
19254   n = strlen30(azArg[0]);
19255   c = azArg[0][0];
19256   clearTempFile(p);
19257 
19258 #ifndef SQLITE_OMIT_AUTHORIZATION
19259   if( c=='a' && strncmp(azArg[0], "auth", n)==0 ){
19260     if( nArg!=2 ){
19261       raw_printf(stderr, "Usage: .auth ON|OFF\n");
19262       rc = 1;
19263       goto meta_command_exit;
19264     }
19265     open_db(p, 0);
19266     if( booleanValue(azArg[1]) ){
19267       sqlite3_set_authorizer(p->db, shellAuth, p);
19268     }else if( p->bSafeModePersist ){
19269       sqlite3_set_authorizer(p->db, safeModeAuth, p);
19270     }else{
19271       sqlite3_set_authorizer(p->db, 0, 0);
19272     }
19273   }else
19274 #endif
19275 
19276 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) \
19277   && !defined(SQLITE_SHELL_WASM_MODE)
19278   if( c=='a' && strncmp(azArg[0], "archive", n)==0 ){
19279     open_db(p, 0);
19280     failIfSafeMode(p, "cannot run .archive in safe mode");
19281     rc = arDotCommand(p, 0, azArg, nArg);
19282   }else
19283 #endif
19284 
19285 #ifndef SQLITE_SHELL_WASM_MODE
19286   if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0)
19287    || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0)
19288   ){
19289     const char *zDestFile = 0;
19290     const char *zDb = 0;
19291     sqlite3 *pDest;
19292     sqlite3_backup *pBackup;
19293     int j;
19294     int bAsync = 0;
19295     const char *zVfs = 0;
19296     failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]);
19297     for(j=1; j<nArg; j++){
19298       const char *z = azArg[j];
19299       if( z[0]=='-' ){
19300         if( z[1]=='-' ) z++;
19301         if( strcmp(z, "-append")==0 ){
19302           zVfs = "apndvfs";
19303         }else
19304         if( strcmp(z, "-async")==0 ){
19305           bAsync = 1;
19306         }else
19307         {
19308           utf8_printf(stderr, "unknown option: %s\n", azArg[j]);
19309           return 1;
19310         }
19311       }else if( zDestFile==0 ){
19312         zDestFile = azArg[j];
19313       }else if( zDb==0 ){
19314         zDb = zDestFile;
19315         zDestFile = azArg[j];
19316       }else{
19317         raw_printf(stderr, "Usage: .backup ?DB? ?OPTIONS? FILENAME\n");
19318         return 1;
19319       }
19320     }
19321     if( zDestFile==0 ){
19322       raw_printf(stderr, "missing FILENAME argument on .backup\n");
19323       return 1;
19324     }
19325     if( zDb==0 ) zDb = "main";
19326     rc = sqlite3_open_v2(zDestFile, &pDest,
19327                   SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE, zVfs);
19328     if( rc!=SQLITE_OK ){
19329       utf8_printf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
19330       close_db(pDest);
19331       return 1;
19332     }
19333     if( bAsync ){
19334       sqlite3_exec(pDest, "PRAGMA synchronous=OFF; PRAGMA journal_mode=OFF;",
19335                    0, 0, 0);
19336     }
19337     open_db(p, 0);
19338     pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
19339     if( pBackup==0 ){
19340       utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
19341       close_db(pDest);
19342       return 1;
19343     }
19344     while(  (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
19345     sqlite3_backup_finish(pBackup);
19346     if( rc==SQLITE_DONE ){
19347       rc = 0;
19348     }else{
19349       utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
19350       rc = 1;
19351     }
19352     close_db(pDest);
19353   }else
19354 #endif /* !defined(SQLITE_SHELL_WASM_MODE) */
19355 
19356   if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 ){
19357     if( nArg==2 ){
19358       bail_on_error = booleanValue(azArg[1]);
19359     }else{
19360       raw_printf(stderr, "Usage: .bail on|off\n");
19361       rc = 1;
19362     }
19363   }else
19364 
19365   if( c=='b' && n>=3 && strncmp(azArg[0], "binary", n)==0 ){
19366     if( nArg==2 ){
19367       if( booleanValue(azArg[1]) ){
19368         setBinaryMode(p->out, 1);
19369       }else{
19370         setTextMode(p->out, 1);
19371       }
19372     }else{
19373       raw_printf(stderr, "Usage: .binary on|off\n");
19374       rc = 1;
19375     }
19376   }else
19377 
19378   /* The undocumented ".breakpoint" command causes a call to the no-op
19379   ** routine named test_breakpoint().
19380   */
19381   if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
19382     test_breakpoint();
19383   }else
19384 
19385 #ifndef SQLITE_SHELL_WASM_MODE
19386   if( c=='c' && strcmp(azArg[0],"cd")==0 ){
19387     failIfSafeMode(p, "cannot run .cd in safe mode");
19388     if( nArg==2 ){
19389 #if defined(_WIN32) || defined(WIN32)
19390       wchar_t *z = sqlite3_win32_utf8_to_unicode(azArg[1]);
19391       rc = !SetCurrentDirectoryW(z);
19392       sqlite3_free(z);
19393 #else
19394       rc = chdir(azArg[1]);
19395 #endif
19396       if( rc ){
19397         utf8_printf(stderr, "Cannot change to directory \"%s\"\n", azArg[1]);
19398         rc = 1;
19399       }
19400     }else{
19401       raw_printf(stderr, "Usage: .cd DIRECTORY\n");
19402       rc = 1;
19403     }
19404   }else
19405 #endif /* !defined(SQLITE_SHELL_WASM_MODE) */
19406 
19407   if( c=='c' && n>=3 && strncmp(azArg[0], "changes", n)==0 ){
19408     if( nArg==2 ){
19409       setOrClearFlag(p, SHFLG_CountChanges, azArg[1]);
19410     }else{
19411       raw_printf(stderr, "Usage: .changes on|off\n");
19412       rc = 1;
19413     }
19414   }else
19415 
19416 #ifndef SQLITE_SHELL_WASM_MODE
19417   /* Cancel output redirection, if it is currently set (by .testcase)
19418   ** Then read the content of the testcase-out.txt file and compare against
19419   ** azArg[1].  If there are differences, report an error and exit.
19420   */
19421   if( c=='c' && n>=3 && strncmp(azArg[0], "check", n)==0 ){
19422     char *zRes = 0;
19423     output_reset(p);
19424     if( nArg!=2 ){
19425       raw_printf(stderr, "Usage: .check GLOB-PATTERN\n");
19426       rc = 2;
19427     }else if( (zRes = readFile("testcase-out.txt", 0))==0 ){
19428       raw_printf(stderr, "Error: cannot read 'testcase-out.txt'\n");
19429       rc = 2;
19430     }else if( testcase_glob(azArg[1],zRes)==0 ){
19431       utf8_printf(stderr,
19432                  "testcase-%s FAILED\n Expected: [%s]\n      Got: [%s]\n",
19433                  p->zTestcase, azArg[1], zRes);
19434       rc = 1;
19435     }else{
19436       utf8_printf(stdout, "testcase-%s ok\n", p->zTestcase);
19437       p->nCheck++;
19438     }
19439     sqlite3_free(zRes);
19440   }else
19441 #endif /* !defined(SQLITE_SHELL_WASM_MODE) */
19442 
19443 #ifndef SQLITE_SHELL_WASM_MODE
19444   if( c=='c' && strncmp(azArg[0], "clone", n)==0 ){
19445     failIfSafeMode(p, "cannot run .clone in safe mode");
19446     if( nArg==2 ){
19447       tryToClone(p, azArg[1]);
19448     }else{
19449       raw_printf(stderr, "Usage: .clone FILENAME\n");
19450       rc = 1;
19451     }
19452   }else
19453 #endif /* !defined(SQLITE_SHELL_WASM_MODE) */
19454 
19455   if( c=='c' && strncmp(azArg[0], "connection", n)==0 ){
19456     if( nArg==1 ){
19457       /* List available connections */
19458       int i;
19459       for(i=0; i<ArraySize(p->aAuxDb); i++){
19460         const char *zFile = p->aAuxDb[i].zDbFilename;
19461         if( p->aAuxDb[i].db==0 && p->pAuxDb!=&p->aAuxDb[i] ){
19462           zFile = "(not open)";
19463         }else if( zFile==0 ){
19464           zFile = "(memory)";
19465         }else if( zFile[0]==0 ){
19466           zFile = "(temporary-file)";
19467         }
19468         if( p->pAuxDb == &p->aAuxDb[i] ){
19469           utf8_printf(stdout, "ACTIVE %d: %s\n", i, zFile);
19470         }else if( p->aAuxDb[i].db!=0 ){
19471           utf8_printf(stdout, "       %d: %s\n", i, zFile);
19472         }
19473       }
19474     }else if( nArg==2 && IsDigit(azArg[1][0]) && azArg[1][1]==0 ){
19475       int i = azArg[1][0] - '0';
19476       if( p->pAuxDb != &p->aAuxDb[i] && i>=0 && i<ArraySize(p->aAuxDb) ){
19477         p->pAuxDb->db = p->db;
19478         p->pAuxDb = &p->aAuxDb[i];
19479         globalDb = p->db = p->pAuxDb->db;
19480         p->pAuxDb->db = 0;
19481       }
19482     }else if( nArg==3 && strcmp(azArg[1], "close")==0
19483            && IsDigit(azArg[2][0]) && azArg[2][1]==0 ){
19484       int i = azArg[2][0] - '0';
19485       if( i<0 || i>=ArraySize(p->aAuxDb) ){
19486         /* No-op */
19487       }else if( p->pAuxDb == &p->aAuxDb[i] ){
19488         raw_printf(stderr, "cannot close the active database connection\n");
19489         rc = 1;
19490       }else if( p->aAuxDb[i].db ){
19491         session_close_all(p, i);
19492         close_db(p->aAuxDb[i].db);
19493         p->aAuxDb[i].db = 0;
19494       }
19495     }else{
19496       raw_printf(stderr, "Usage: .connection [close] [CONNECTION-NUMBER]\n");
19497       rc = 1;
19498     }
19499   }else
19500 
19501   if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){
19502     char **azName = 0;
19503     int nName = 0;
19504     sqlite3_stmt *pStmt;
19505     int i;
19506     open_db(p, 0);
19507     rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
19508     if( rc ){
19509       utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
19510       rc = 1;
19511     }else{
19512       while( sqlite3_step(pStmt)==SQLITE_ROW ){
19513         const char *zSchema = (const char *)sqlite3_column_text(pStmt,1);
19514         const char *zFile = (const char*)sqlite3_column_text(pStmt,2);
19515         if( zSchema==0 || zFile==0 ) continue;
19516         azName = sqlite3_realloc(azName, (nName+1)*2*sizeof(char*));
19517         shell_check_oom(azName);
19518         azName[nName*2] = strdup(zSchema);
19519         azName[nName*2+1] = strdup(zFile);
19520         nName++;
19521       }
19522     }
19523     sqlite3_finalize(pStmt);
19524     for(i=0; i<nName; i++){
19525       int eTxn = sqlite3_txn_state(p->db, azName[i*2]);
19526       int bRdonly = sqlite3_db_readonly(p->db, azName[i*2]);
19527       const char *z = azName[i*2+1];
19528       utf8_printf(p->out, "%s: %s %s%s\n",
19529          azName[i*2],
19530          z && z[0] ? z : "\"\"",
19531          bRdonly ? "r/o" : "r/w",
19532          eTxn==SQLITE_TXN_NONE ? "" :
19533             eTxn==SQLITE_TXN_READ ? " read-txn" : " write-txn");
19534       free(azName[i*2]);
19535       free(azName[i*2+1]);
19536     }
19537     sqlite3_free(azName);
19538   }else
19539 
19540   if( c=='d' && n>=3 && strncmp(azArg[0], "dbconfig", n)==0 ){
19541     static const struct DbConfigChoices {
19542       const char *zName;
19543       int op;
19544     } aDbConfig[] = {
19545         { "defensive",          SQLITE_DBCONFIG_DEFENSIVE             },
19546         { "dqs_ddl",            SQLITE_DBCONFIG_DQS_DDL               },
19547         { "dqs_dml",            SQLITE_DBCONFIG_DQS_DML               },
19548         { "enable_fkey",        SQLITE_DBCONFIG_ENABLE_FKEY           },
19549         { "enable_qpsg",        SQLITE_DBCONFIG_ENABLE_QPSG           },
19550         { "enable_trigger",     SQLITE_DBCONFIG_ENABLE_TRIGGER        },
19551         { "enable_view",        SQLITE_DBCONFIG_ENABLE_VIEW           },
19552         { "fts3_tokenizer",     SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER },
19553         { "legacy_alter_table", SQLITE_DBCONFIG_LEGACY_ALTER_TABLE    },
19554         { "legacy_file_format", SQLITE_DBCONFIG_LEGACY_FILE_FORMAT    },
19555         { "load_extension",     SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION },
19556         { "no_ckpt_on_close",   SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE      },
19557         { "reset_database",     SQLITE_DBCONFIG_RESET_DATABASE        },
19558         { "trigger_eqp",        SQLITE_DBCONFIG_TRIGGER_EQP           },
19559         { "trusted_schema",     SQLITE_DBCONFIG_TRUSTED_SCHEMA        },
19560         { "writable_schema",    SQLITE_DBCONFIG_WRITABLE_SCHEMA       },
19561     };
19562     int ii, v;
19563     open_db(p, 0);
19564     for(ii=0; ii<ArraySize(aDbConfig); ii++){
19565       if( nArg>1 && strcmp(azArg[1], aDbConfig[ii].zName)!=0 ) continue;
19566       if( nArg>=3 ){
19567         sqlite3_db_config(p->db, aDbConfig[ii].op, booleanValue(azArg[2]), 0);
19568       }
19569       sqlite3_db_config(p->db, aDbConfig[ii].op, -1, &v);
19570       utf8_printf(p->out, "%19s %s\n", aDbConfig[ii].zName, v ? "on" : "off");
19571       if( nArg>1 ) break;
19572     }
19573     if( nArg>1 && ii==ArraySize(aDbConfig) ){
19574       utf8_printf(stderr, "Error: unknown dbconfig \"%s\"\n", azArg[1]);
19575       utf8_printf(stderr, "Enter \".dbconfig\" with no arguments for a list\n");
19576     }
19577   }else
19578 
19579 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
19580   if( c=='d' && n>=3 && strncmp(azArg[0], "dbinfo", n)==0 ){
19581     rc = shell_dbinfo_command(p, nArg, azArg);
19582   }else
19583 
19584   if( c=='r' && strncmp(azArg[0], "recover", n)==0 ){
19585     open_db(p, 0);
19586     rc = recoverDatabaseCmd(p, nArg, azArg);
19587   }else
19588 #endif /* !(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) */
19589 
19590   if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){
19591     char *zLike = 0;
19592     char *zSql;
19593     int i;
19594     int savedShowHeader = p->showHeader;
19595     int savedShellFlags = p->shellFlgs;
19596     ShellClearFlag(p,
19597        SHFLG_PreserveRowid|SHFLG_Newlines|SHFLG_Echo
19598        |SHFLG_DumpDataOnly|SHFLG_DumpNoSys);
19599     for(i=1; i<nArg; i++){
19600       if( azArg[i][0]=='-' ){
19601         const char *z = azArg[i]+1;
19602         if( z[0]=='-' ) z++;
19603         if( strcmp(z,"preserve-rowids")==0 ){
19604 #ifdef SQLITE_OMIT_VIRTUALTABLE
19605           raw_printf(stderr, "The --preserve-rowids option is not compatible"
19606                              " with SQLITE_OMIT_VIRTUALTABLE\n");
19607           rc = 1;
19608           sqlite3_free(zLike);
19609           goto meta_command_exit;
19610 #else
19611           ShellSetFlag(p, SHFLG_PreserveRowid);
19612 #endif
19613         }else
19614         if( strcmp(z,"newlines")==0 ){
19615           ShellSetFlag(p, SHFLG_Newlines);
19616         }else
19617         if( strcmp(z,"data-only")==0 ){
19618           ShellSetFlag(p, SHFLG_DumpDataOnly);
19619         }else
19620         if( strcmp(z,"nosys")==0 ){
19621           ShellSetFlag(p, SHFLG_DumpNoSys);
19622         }else
19623         {
19624           raw_printf(stderr, "Unknown option \"%s\" on \".dump\"\n", azArg[i]);
19625           rc = 1;
19626           sqlite3_free(zLike);
19627           goto meta_command_exit;
19628         }
19629       }else{
19630         /* azArg[i] contains a LIKE pattern. This ".dump" request should
19631         ** only dump data for tables for which either the table name matches
19632         ** the LIKE pattern, or the table appears to be a shadow table of
19633         ** a virtual table for which the name matches the LIKE pattern.
19634         */
19635         char *zExpr = sqlite3_mprintf(
19636             "name LIKE %Q ESCAPE '\\' OR EXISTS ("
19637             "  SELECT 1 FROM sqlite_schema WHERE "
19638             "    name LIKE %Q ESCAPE '\\' AND"
19639             "    sql LIKE 'CREATE VIRTUAL TABLE%%' AND"
19640             "    substr(o.name, 1, length(name)+1) == (name||'_')"
19641             ")", azArg[i], azArg[i]
19642         );
19643 
19644         if( zLike ){
19645           zLike = sqlite3_mprintf("%z OR %z", zLike, zExpr);
19646         }else{
19647           zLike = zExpr;
19648         }
19649       }
19650     }
19651 
19652     open_db(p, 0);
19653 
19654     if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
19655       /* When playing back a "dump", the content might appear in an order
19656       ** which causes immediate foreign key constraints to be violated.
19657       ** So disable foreign-key constraint enforcement to prevent problems. */
19658       raw_printf(p->out, "PRAGMA foreign_keys=OFF;\n");
19659       raw_printf(p->out, "BEGIN TRANSACTION;\n");
19660     }
19661     p->writableSchema = 0;
19662     p->showHeader = 0;
19663     /* Set writable_schema=ON since doing so forces SQLite to initialize
19664     ** as much of the schema as it can even if the sqlite_schema table is
19665     ** corrupt. */
19666     sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
19667     p->nErr = 0;
19668     if( zLike==0 ) zLike = sqlite3_mprintf("true");
19669     zSql = sqlite3_mprintf(
19670       "SELECT name, type, sql FROM sqlite_schema AS o "
19671       "WHERE (%s) AND type=='table'"
19672       "  AND sql NOT NULL"
19673       " ORDER BY tbl_name='sqlite_sequence', rowid",
19674       zLike
19675     );
19676     run_schema_dump_query(p,zSql);
19677     sqlite3_free(zSql);
19678     if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
19679       zSql = sqlite3_mprintf(
19680         "SELECT sql FROM sqlite_schema AS o "
19681         "WHERE (%s) AND sql NOT NULL"
19682         "  AND type IN ('index','trigger','view')",
19683         zLike
19684       );
19685       run_table_dump_query(p, zSql);
19686       sqlite3_free(zSql);
19687     }
19688     sqlite3_free(zLike);
19689     if( p->writableSchema ){
19690       raw_printf(p->out, "PRAGMA writable_schema=OFF;\n");
19691       p->writableSchema = 0;
19692     }
19693     sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
19694     sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
19695     if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
19696       raw_printf(p->out, p->nErr?"ROLLBACK; -- due to errors\n":"COMMIT;\n");
19697     }
19698     p->showHeader = savedShowHeader;
19699     p->shellFlgs = savedShellFlags;
19700   }else
19701 
19702   if( c=='e' && strncmp(azArg[0], "echo", n)==0 ){
19703     if( nArg==2 ){
19704       setOrClearFlag(p, SHFLG_Echo, azArg[1]);
19705     }else{
19706       raw_printf(stderr, "Usage: .echo on|off\n");
19707       rc = 1;
19708     }
19709   }else
19710 
19711   if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){
19712     if( nArg==2 ){
19713       p->autoEQPtest = 0;
19714       if( p->autoEQPtrace ){
19715         if( p->db ) sqlite3_exec(p->db, "PRAGMA vdbe_trace=OFF;", 0, 0, 0);
19716         p->autoEQPtrace = 0;
19717       }
19718       if( strcmp(azArg[1],"full")==0 ){
19719         p->autoEQP = AUTOEQP_full;
19720       }else if( strcmp(azArg[1],"trigger")==0 ){
19721         p->autoEQP = AUTOEQP_trigger;
19722 #ifdef SQLITE_DEBUG
19723       }else if( strcmp(azArg[1],"test")==0 ){
19724         p->autoEQP = AUTOEQP_on;
19725         p->autoEQPtest = 1;
19726       }else if( strcmp(azArg[1],"trace")==0 ){
19727         p->autoEQP = AUTOEQP_full;
19728         p->autoEQPtrace = 1;
19729         open_db(p, 0);
19730         sqlite3_exec(p->db, "SELECT name FROM sqlite_schema LIMIT 1", 0, 0, 0);
19731         sqlite3_exec(p->db, "PRAGMA vdbe_trace=ON;", 0, 0, 0);
19732 #endif
19733       }else{
19734         p->autoEQP = (u8)booleanValue(azArg[1]);
19735       }
19736     }else{
19737       raw_printf(stderr, "Usage: .eqp off|on|trace|trigger|full\n");
19738       rc = 1;
19739     }
19740   }else
19741 
19742 #ifndef SQLITE_SHELL_WASM_MODE
19743   if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
19744     if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
19745     rc = 2;
19746   }else
19747 #endif
19748 
19749   /* The ".explain" command is automatic now.  It is largely pointless.  It
19750   ** retained purely for backwards compatibility */
19751   if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){
19752     int val = 1;
19753     if( nArg>=2 ){
19754       if( strcmp(azArg[1],"auto")==0 ){
19755         val = 99;
19756       }else{
19757         val =  booleanValue(azArg[1]);
19758       }
19759     }
19760     if( val==1 && p->mode!=MODE_Explain ){
19761       p->normalMode = p->mode;
19762       p->mode = MODE_Explain;
19763       p->autoExplain = 0;
19764     }else if( val==0 ){
19765       if( p->mode==MODE_Explain ) p->mode = p->normalMode;
19766       p->autoExplain = 0;
19767     }else if( val==99 ){
19768       if( p->mode==MODE_Explain ) p->mode = p->normalMode;
19769       p->autoExplain = 1;
19770     }
19771   }else
19772 
19773 #ifndef SQLITE_OMIT_VIRTUALTABLE
19774   if( c=='e' && strncmp(azArg[0], "expert", n)==0 ){
19775     if( p->bSafeMode ){
19776       raw_printf(stderr,
19777         "Cannot run experimental commands such as \"%s\" in safe mode\n",
19778         azArg[0]);
19779       rc = 1;
19780     }else{
19781       open_db(p, 0);
19782       expertDotCommand(p, azArg, nArg);
19783     }
19784   }else
19785 #endif
19786 
19787   if( c=='f' && strncmp(azArg[0], "filectrl", n)==0 ){
19788     static const struct {
19789        const char *zCtrlName;   /* Name of a test-control option */
19790        int ctrlCode;            /* Integer code for that option */
19791        const char *zUsage;      /* Usage notes */
19792     } aCtrl[] = {
19793       { "chunk_size",     SQLITE_FCNTL_CHUNK_SIZE,      "SIZE"           },
19794       { "data_version",   SQLITE_FCNTL_DATA_VERSION,    ""               },
19795       { "has_moved",      SQLITE_FCNTL_HAS_MOVED,       ""               },
19796       { "lock_timeout",   SQLITE_FCNTL_LOCK_TIMEOUT,    "MILLISEC"       },
19797       { "persist_wal",    SQLITE_FCNTL_PERSIST_WAL,     "[BOOLEAN]"      },
19798    /* { "pragma",         SQLITE_FCNTL_PRAGMA,          "NAME ARG"       },*/
19799       { "psow",       SQLITE_FCNTL_POWERSAFE_OVERWRITE, "[BOOLEAN]"      },
19800       { "reserve_bytes",  SQLITE_FCNTL_RESERVE_BYTES,   "[N]"            },
19801       { "size_limit",     SQLITE_FCNTL_SIZE_LIMIT,      "[LIMIT]"        },
19802       { "tempfilename",   SQLITE_FCNTL_TEMPFILENAME,    ""               },
19803    /* { "win32_av_retry", SQLITE_FCNTL_WIN32_AV_RETRY,  "COUNT DELAY"    },*/
19804     };
19805     int filectrl = -1;
19806     int iCtrl = -1;
19807     sqlite3_int64 iRes = 0;  /* Integer result to display if rc2==1 */
19808     int isOk = 0;            /* 0: usage  1: %lld  2: no-result */
19809     int n2, i;
19810     const char *zCmd = 0;
19811     const char *zSchema = 0;
19812 
19813     open_db(p, 0);
19814     zCmd = nArg>=2 ? azArg[1] : "help";
19815 
19816     if( zCmd[0]=='-'
19817      && (strcmp(zCmd,"--schema")==0 || strcmp(zCmd,"-schema")==0)
19818      && nArg>=4
19819     ){
19820       zSchema = azArg[2];
19821       for(i=3; i<nArg; i++) azArg[i-2] = azArg[i];
19822       nArg -= 2;
19823       zCmd = azArg[1];
19824     }
19825 
19826     /* The argument can optionally begin with "-" or "--" */
19827     if( zCmd[0]=='-' && zCmd[1] ){
19828       zCmd++;
19829       if( zCmd[0]=='-' && zCmd[1] ) zCmd++;
19830     }
19831 
19832     /* --help lists all file-controls */
19833     if( strcmp(zCmd,"help")==0 ){
19834       utf8_printf(p->out, "Available file-controls:\n");
19835       for(i=0; i<ArraySize(aCtrl); i++){
19836         utf8_printf(p->out, "  .filectrl %s %s\n",
19837                     aCtrl[i].zCtrlName, aCtrl[i].zUsage);
19838       }
19839       rc = 1;
19840       goto meta_command_exit;
19841     }
19842 
19843     /* convert filectrl text option to value. allow any unique prefix
19844     ** of the option name, or a numerical value. */
19845     n2 = strlen30(zCmd);
19846     for(i=0; i<ArraySize(aCtrl); i++){
19847       if( strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){
19848         if( filectrl<0 ){
19849           filectrl = aCtrl[i].ctrlCode;
19850           iCtrl = i;
19851         }else{
19852           utf8_printf(stderr, "Error: ambiguous file-control: \"%s\"\n"
19853                               "Use \".filectrl --help\" for help\n", zCmd);
19854           rc = 1;
19855           goto meta_command_exit;
19856         }
19857       }
19858     }
19859     if( filectrl<0 ){
19860       utf8_printf(stderr,"Error: unknown file-control: %s\n"
19861                          "Use \".filectrl --help\" for help\n", zCmd);
19862     }else{
19863       switch(filectrl){
19864         case SQLITE_FCNTL_SIZE_LIMIT: {
19865           if( nArg!=2 && nArg!=3 ) break;
19866           iRes = nArg==3 ? integerValue(azArg[2]) : -1;
19867           sqlite3_file_control(p->db, zSchema, SQLITE_FCNTL_SIZE_LIMIT, &iRes);
19868           isOk = 1;
19869           break;
19870         }
19871         case SQLITE_FCNTL_LOCK_TIMEOUT:
19872         case SQLITE_FCNTL_CHUNK_SIZE: {
19873           int x;
19874           if( nArg!=3 ) break;
19875           x = (int)integerValue(azArg[2]);
19876           sqlite3_file_control(p->db, zSchema, filectrl, &x);
19877           isOk = 2;
19878           break;
19879         }
19880         case SQLITE_FCNTL_PERSIST_WAL:
19881         case SQLITE_FCNTL_POWERSAFE_OVERWRITE: {
19882           int x;
19883           if( nArg!=2 && nArg!=3 ) break;
19884           x = nArg==3 ? booleanValue(azArg[2]) : -1;
19885           sqlite3_file_control(p->db, zSchema, filectrl, &x);
19886           iRes = x;
19887           isOk = 1;
19888           break;
19889         }
19890         case SQLITE_FCNTL_DATA_VERSION:
19891         case SQLITE_FCNTL_HAS_MOVED: {
19892           int x;
19893           if( nArg!=2 ) break;
19894           sqlite3_file_control(p->db, zSchema, filectrl, &x);
19895           iRes = x;
19896           isOk = 1;
19897           break;
19898         }
19899         case SQLITE_FCNTL_TEMPFILENAME: {
19900           char *z = 0;
19901           if( nArg!=2 ) break;
19902           sqlite3_file_control(p->db, zSchema, filectrl, &z);
19903           if( z ){
19904             utf8_printf(p->out, "%s\n", z);
19905             sqlite3_free(z);
19906           }
19907           isOk = 2;
19908           break;
19909         }
19910         case SQLITE_FCNTL_RESERVE_BYTES: {
19911           int x;
19912           if( nArg>=3 ){
19913             x = atoi(azArg[2]);
19914             sqlite3_file_control(p->db, zSchema, filectrl, &x);
19915           }
19916           x = -1;
19917           sqlite3_file_control(p->db, zSchema, filectrl, &x);
19918           utf8_printf(p->out,"%d\n", x);
19919           isOk = 2;
19920           break;
19921         }
19922       }
19923     }
19924     if( isOk==0 && iCtrl>=0 ){
19925       utf8_printf(p->out, "Usage: .filectrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage);
19926       rc = 1;
19927     }else if( isOk==1 ){
19928       char zBuf[100];
19929       sqlite3_snprintf(sizeof(zBuf), zBuf, "%lld", iRes);
19930       raw_printf(p->out, "%s\n", zBuf);
19931     }
19932   }else
19933 
19934   if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){
19935     ShellState data;
19936     int doStats = 0;
19937     memcpy(&data, p, sizeof(data));
19938     data.showHeader = 0;
19939     data.cMode = data.mode = MODE_Semi;
19940     if( nArg==2 && optionMatch(azArg[1], "indent") ){
19941       data.cMode = data.mode = MODE_Pretty;
19942       nArg = 1;
19943     }
19944     if( nArg!=1 ){
19945       raw_printf(stderr, "Usage: .fullschema ?--indent?\n");
19946       rc = 1;
19947       goto meta_command_exit;
19948     }
19949     open_db(p, 0);
19950     rc = sqlite3_exec(p->db,
19951        "SELECT sql FROM"
19952        "  (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
19953        "     FROM sqlite_schema UNION ALL"
19954        "   SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_schema) "
19955        "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
19956        "ORDER BY x",
19957        callback, &data, 0
19958     );
19959     if( rc==SQLITE_OK ){
19960       sqlite3_stmt *pStmt;
19961       rc = sqlite3_prepare_v2(p->db,
19962                "SELECT rowid FROM sqlite_schema"
19963                " WHERE name GLOB 'sqlite_stat[134]'",
19964                -1, &pStmt, 0);
19965       doStats = sqlite3_step(pStmt)==SQLITE_ROW;
19966       sqlite3_finalize(pStmt);
19967     }
19968     if( doStats==0 ){
19969       raw_printf(p->out, "/* No STAT tables available */\n");
19970     }else{
19971       raw_printf(p->out, "ANALYZE sqlite_schema;\n");
19972       data.cMode = data.mode = MODE_Insert;
19973       data.zDestTable = "sqlite_stat1";
19974       shell_exec(&data, "SELECT * FROM sqlite_stat1", 0);
19975       data.zDestTable = "sqlite_stat4";
19976       shell_exec(&data, "SELECT * FROM sqlite_stat4", 0);
19977       raw_printf(p->out, "ANALYZE sqlite_schema;\n");
19978     }
19979   }else
19980 
19981   if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){
19982     if( nArg==2 ){
19983       p->showHeader = booleanValue(azArg[1]);
19984       p->shellFlgs |= SHFLG_HeaderSet;
19985     }else{
19986       raw_printf(stderr, "Usage: .headers on|off\n");
19987       rc = 1;
19988     }
19989   }else
19990 
19991   if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
19992     if( nArg>=2 ){
19993       n = showHelp(p->out, azArg[1]);
19994       if( n==0 ){
19995         utf8_printf(p->out, "Nothing matches '%s'\n", azArg[1]);
19996       }
19997     }else{
19998       showHelp(p->out, 0);
19999     }
20000   }else
20001 
20002 #ifndef SQLITE_SHELL_WASM_MODE
20003   if( c=='i' && strncmp(azArg[0], "import", n)==0 ){
20004     char *zTable = 0;           /* Insert data into this table */
20005     char *zSchema = 0;          /* within this schema (may default to "main") */
20006     char *zFile = 0;            /* Name of file to extra content from */
20007     sqlite3_stmt *pStmt = NULL; /* A statement */
20008     int nCol;                   /* Number of columns in the table */
20009     int nByte;                  /* Number of bytes in an SQL string */
20010     int i, j;                   /* Loop counters */
20011     int needCommit;             /* True to COMMIT or ROLLBACK at end */
20012     int nSep;                   /* Number of bytes in p->colSeparator[] */
20013     char *zSql;                 /* An SQL statement */
20014     char *zFullTabName;         /* Table name with schema if applicable */
20015     ImportCtx sCtx;             /* Reader context */
20016     char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */
20017     int eVerbose = 0;           /* Larger for more console output */
20018     int nSkip = 0;              /* Initial lines to skip */
20019     int useOutputMode = 1;      /* Use output mode to determine separators */
20020     char *zCreate = 0;          /* CREATE TABLE statement text */
20021 
20022     failIfSafeMode(p, "cannot run .import in safe mode");
20023     memset(&sCtx, 0, sizeof(sCtx));
20024     if( p->mode==MODE_Ascii ){
20025       xRead = ascii_read_one_field;
20026     }else{
20027       xRead = csv_read_one_field;
20028     }
20029     rc = 1;
20030     for(i=1; i<nArg; i++){
20031       char *z = azArg[i];
20032       if( z[0]=='-' && z[1]=='-' ) z++;
20033       if( z[0]!='-' ){
20034         if( zFile==0 ){
20035           zFile = z;
20036         }else if( zTable==0 ){
20037           zTable = z;
20038         }else{
20039           utf8_printf(p->out, "ERROR: extra argument: \"%s\".  Usage:\n", z);
20040           showHelp(p->out, "import");
20041           goto meta_command_exit;
20042         }
20043       }else if( strcmp(z,"-v")==0 ){
20044         eVerbose++;
20045       }else if( strcmp(z,"-schema")==0 && i<nArg-1 ){
20046         zSchema = azArg[++i];
20047       }else if( strcmp(z,"-skip")==0 && i<nArg-1 ){
20048         nSkip = integerValue(azArg[++i]);
20049       }else if( strcmp(z,"-ascii")==0 ){
20050         sCtx.cColSep = SEP_Unit[0];
20051         sCtx.cRowSep = SEP_Record[0];
20052         xRead = ascii_read_one_field;
20053         useOutputMode = 0;
20054       }else if( strcmp(z,"-csv")==0 ){
20055         sCtx.cColSep = ',';
20056         sCtx.cRowSep = '\n';
20057         xRead = csv_read_one_field;
20058         useOutputMode = 0;
20059       }else{
20060         utf8_printf(p->out, "ERROR: unknown option: \"%s\".  Usage:\n", z);
20061         showHelp(p->out, "import");
20062         goto meta_command_exit;
20063       }
20064     }
20065     if( zTable==0 ){
20066       utf8_printf(p->out, "ERROR: missing %s argument. Usage:\n",
20067                   zFile==0 ? "FILE" : "TABLE");
20068       showHelp(p->out, "import");
20069       goto meta_command_exit;
20070     }
20071     seenInterrupt = 0;
20072     open_db(p, 0);
20073     if( useOutputMode ){
20074       /* If neither the --csv or --ascii options are specified, then set
20075       ** the column and row separator characters from the output mode. */
20076       nSep = strlen30(p->colSeparator);
20077       if( nSep==0 ){
20078         raw_printf(stderr,
20079                    "Error: non-null column separator required for import\n");
20080         goto meta_command_exit;
20081       }
20082       if( nSep>1 ){
20083         raw_printf(stderr,
20084               "Error: multi-character column separators not allowed"
20085               " for import\n");
20086         goto meta_command_exit;
20087       }
20088       nSep = strlen30(p->rowSeparator);
20089       if( nSep==0 ){
20090         raw_printf(stderr,
20091             "Error: non-null row separator required for import\n");
20092         goto meta_command_exit;
20093       }
20094       if( nSep==2 && p->mode==MODE_Csv && strcmp(p->rowSeparator,SEP_CrLf)==0 ){
20095         /* When importing CSV (only), if the row separator is set to the
20096         ** default output row separator, change it to the default input
20097         ** row separator.  This avoids having to maintain different input
20098         ** and output row separators. */
20099         sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
20100         nSep = strlen30(p->rowSeparator);
20101       }
20102       if( nSep>1 ){
20103         raw_printf(stderr, "Error: multi-character row separators not allowed"
20104                            " for import\n");
20105         goto meta_command_exit;
20106       }
20107       sCtx.cColSep = p->colSeparator[0];
20108       sCtx.cRowSep = p->rowSeparator[0];
20109     }
20110     sCtx.zFile = zFile;
20111     sCtx.nLine = 1;
20112     if( sCtx.zFile[0]=='|' ){
20113 #ifdef SQLITE_OMIT_POPEN
20114       raw_printf(stderr, "Error: pipes are not supported in this OS\n");
20115       goto meta_command_exit;
20116 #else
20117       sCtx.in = popen(sCtx.zFile+1, "r");
20118       sCtx.zFile = "<pipe>";
20119       sCtx.xCloser = pclose;
20120 #endif
20121     }else{
20122       sCtx.in = fopen(sCtx.zFile, "rb");
20123       sCtx.xCloser = fclose;
20124     }
20125     if( sCtx.in==0 ){
20126       utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
20127       goto meta_command_exit;
20128     }
20129     if( eVerbose>=2 || (eVerbose>=1 && useOutputMode) ){
20130       char zSep[2];
20131       zSep[1] = 0;
20132       zSep[0] = sCtx.cColSep;
20133       utf8_printf(p->out, "Column separator ");
20134       output_c_string(p->out, zSep);
20135       utf8_printf(p->out, ", row separator ");
20136       zSep[0] = sCtx.cRowSep;
20137       output_c_string(p->out, zSep);
20138       utf8_printf(p->out, "\n");
20139     }
20140     sCtx.z = sqlite3_malloc64(120);
20141     if( sCtx.z==0 ){
20142       import_cleanup(&sCtx);
20143       shell_out_of_memory();
20144     }
20145     /* Below, resources must be freed before exit. */
20146     while( (nSkip--)>0 ){
20147       while( xRead(&sCtx) && sCtx.cTerm==sCtx.cColSep ){}
20148     }
20149     if( zSchema!=0 ){
20150       zFullTabName = sqlite3_mprintf("\"%w\".\"%w\"", zSchema, zTable);
20151     }else{
20152       zFullTabName = sqlite3_mprintf("\"%w\"", zTable);
20153     }
20154     zSql = sqlite3_mprintf("SELECT * FROM %s", zFullTabName);
20155     if( zSql==0 || zFullTabName==0 ){
20156       import_cleanup(&sCtx);
20157       shell_out_of_memory();
20158     }
20159     nByte = strlen30(zSql);
20160     rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
20161     import_append_char(&sCtx, 0);    /* To ensure sCtx.z is allocated */
20162     if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(p->db))==0 ){
20163       sqlite3 *dbCols = 0;
20164       char *zRenames = 0;
20165       char *zColDefs;
20166       zCreate = sqlite3_mprintf("CREATE TABLE %s", zFullTabName);
20167       while( xRead(&sCtx) ){
20168         zAutoColumn(sCtx.z, &dbCols, 0);
20169         if( sCtx.cTerm!=sCtx.cColSep ) break;
20170       }
20171       zColDefs = zAutoColumn(0, &dbCols, &zRenames);
20172       if( zRenames!=0 ){
20173         utf8_printf((stdin_is_interactive && p->in==stdin)? p->out : stderr,
20174                     "Columns renamed during .import %s due to duplicates:\n"
20175                     "%s\n", sCtx.zFile, zRenames);
20176         sqlite3_free(zRenames);
20177       }
20178       assert(dbCols==0);
20179       if( zColDefs==0 ){
20180         utf8_printf(stderr,"%s: empty file\n", sCtx.zFile);
20181       import_fail:
20182         sqlite3_free(zCreate);
20183         sqlite3_free(zSql);
20184         sqlite3_free(zFullTabName);
20185         import_cleanup(&sCtx);
20186         rc = 1;
20187         goto meta_command_exit;
20188       }
20189       zCreate = sqlite3_mprintf("%z%z\n", zCreate, zColDefs);
20190       if( eVerbose>=1 ){
20191         utf8_printf(p->out, "%s\n", zCreate);
20192       }
20193       rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
20194       if( rc ){
20195         utf8_printf(stderr, "%s failed:\n%s\n", zCreate, sqlite3_errmsg(p->db));
20196         goto import_fail;
20197       }
20198       sqlite3_free(zCreate);
20199       zCreate = 0;
20200       rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
20201     }
20202     if( rc ){
20203       if (pStmt) sqlite3_finalize(pStmt);
20204       utf8_printf(stderr,"Error: %s\n", sqlite3_errmsg(p->db));
20205       goto import_fail;
20206     }
20207     sqlite3_free(zSql);
20208     nCol = sqlite3_column_count(pStmt);
20209     sqlite3_finalize(pStmt);
20210     pStmt = 0;
20211     if( nCol==0 ) return 0; /* no columns, no error */
20212     zSql = sqlite3_malloc64( nByte*2 + 20 + nCol*2 );
20213     if( zSql==0 ){
20214       import_cleanup(&sCtx);
20215       shell_out_of_memory();
20216     }
20217     sqlite3_snprintf(nByte+20, zSql, "INSERT INTO %s VALUES(?", zFullTabName);
20218     j = strlen30(zSql);
20219     for(i=1; i<nCol; i++){
20220       zSql[j++] = ',';
20221       zSql[j++] = '?';
20222     }
20223     zSql[j++] = ')';
20224     zSql[j] = 0;
20225     if( eVerbose>=2 ){
20226       utf8_printf(p->out, "Insert using: %s\n", zSql);
20227     }
20228     rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
20229     if( rc ){
20230       utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
20231       if (pStmt) sqlite3_finalize(pStmt);
20232       goto import_fail;
20233     }
20234     sqlite3_free(zSql);
20235     sqlite3_free(zFullTabName);
20236     needCommit = sqlite3_get_autocommit(p->db);
20237     if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
20238     do{
20239       int startLine = sCtx.nLine;
20240       for(i=0; i<nCol; i++){
20241         char *z = xRead(&sCtx);
20242         /*
20243         ** Did we reach end-of-file before finding any columns?
20244         ** If so, stop instead of NULL filling the remaining columns.
20245         */
20246         if( z==0 && i==0 ) break;
20247         /*
20248         ** Did we reach end-of-file OR end-of-line before finding any
20249         ** columns in ASCII mode?  If so, stop instead of NULL filling
20250         ** the remaining columns.
20251         */
20252         if( p->mode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break;
20253         sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
20254         if( i<nCol-1 && sCtx.cTerm!=sCtx.cColSep ){
20255           utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
20256                           "filling the rest with NULL\n",
20257                           sCtx.zFile, startLine, nCol, i+1);
20258           i += 2;
20259           while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; }
20260         }
20261       }
20262       if( sCtx.cTerm==sCtx.cColSep ){
20263         do{
20264           xRead(&sCtx);
20265           i++;
20266         }while( sCtx.cTerm==sCtx.cColSep );
20267         utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
20268                         "extras ignored\n",
20269                         sCtx.zFile, startLine, nCol, i);
20270       }
20271       if( i>=nCol ){
20272         sqlite3_step(pStmt);
20273         rc = sqlite3_reset(pStmt);
20274         if( rc!=SQLITE_OK ){
20275           utf8_printf(stderr, "%s:%d: INSERT failed: %s\n", sCtx.zFile,
20276                       startLine, sqlite3_errmsg(p->db));
20277           sCtx.nErr++;
20278         }else{
20279           sCtx.nRow++;
20280         }
20281       }
20282     }while( sCtx.cTerm!=EOF );
20283 
20284     import_cleanup(&sCtx);
20285     sqlite3_finalize(pStmt);
20286     if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0);
20287     if( eVerbose>0 ){
20288       utf8_printf(p->out,
20289           "Added %d rows with %d errors using %d lines of input\n",
20290           sCtx.nRow, sCtx.nErr, sCtx.nLine-1);
20291     }
20292   }else
20293 #endif /* !defined(SQLITE_SHELL_WASM_MODE) */
20294 
20295 #ifndef SQLITE_UNTESTABLE
20296   if( c=='i' && strncmp(azArg[0], "imposter", n)==0 ){
20297     char *zSql;
20298     char *zCollist = 0;
20299     sqlite3_stmt *pStmt;
20300     int tnum = 0;
20301     int isWO = 0;  /* True if making an imposter of a WITHOUT ROWID table */
20302     int lenPK = 0; /* Length of the PRIMARY KEY string for isWO tables */
20303     int i;
20304     if( !(nArg==3 || (nArg==2 && sqlite3_stricmp(azArg[1],"off")==0)) ){
20305       utf8_printf(stderr, "Usage: .imposter INDEX IMPOSTER\n"
20306                           "       .imposter off\n");
20307       /* Also allowed, but not documented:
20308       **
20309       **    .imposter TABLE IMPOSTER
20310       **
20311       ** where TABLE is a WITHOUT ROWID table.  In that case, the
20312       ** imposter is another WITHOUT ROWID table with the columns in
20313       ** storage order. */
20314       rc = 1;
20315       goto meta_command_exit;
20316     }
20317     open_db(p, 0);
20318     if( nArg==2 ){
20319       sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 1);
20320       goto meta_command_exit;
20321     }
20322     zSql = sqlite3_mprintf(
20323       "SELECT rootpage, 0 FROM sqlite_schema"
20324       " WHERE name='%q' AND type='index'"
20325       "UNION ALL "
20326       "SELECT rootpage, 1 FROM sqlite_schema"
20327       " WHERE name='%q' AND type='table'"
20328       "   AND sql LIKE '%%without%%rowid%%'",
20329       azArg[1], azArg[1]
20330     );
20331     sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
20332     sqlite3_free(zSql);
20333     if( sqlite3_step(pStmt)==SQLITE_ROW ){
20334       tnum = sqlite3_column_int(pStmt, 0);
20335       isWO = sqlite3_column_int(pStmt, 1);
20336     }
20337     sqlite3_finalize(pStmt);
20338     zSql = sqlite3_mprintf("PRAGMA index_xinfo='%q'", azArg[1]);
20339     rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
20340     sqlite3_free(zSql);
20341     i = 0;
20342     while( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
20343       char zLabel[20];
20344       const char *zCol = (const char*)sqlite3_column_text(pStmt,2);
20345       i++;
20346       if( zCol==0 ){
20347         if( sqlite3_column_int(pStmt,1)==-1 ){
20348           zCol = "_ROWID_";
20349         }else{
20350           sqlite3_snprintf(sizeof(zLabel),zLabel,"expr%d",i);
20351           zCol = zLabel;
20352         }
20353       }
20354       if( isWO && lenPK==0 && sqlite3_column_int(pStmt,5)==0 && zCollist ){
20355         lenPK = (int)strlen(zCollist);
20356       }
20357       if( zCollist==0 ){
20358         zCollist = sqlite3_mprintf("\"%w\"", zCol);
20359       }else{
20360         zCollist = sqlite3_mprintf("%z,\"%w\"", zCollist, zCol);
20361       }
20362     }
20363     sqlite3_finalize(pStmt);
20364     if( i==0 || tnum==0 ){
20365       utf8_printf(stderr, "no such index: \"%s\"\n", azArg[1]);
20366       rc = 1;
20367       sqlite3_free(zCollist);
20368       goto meta_command_exit;
20369     }
20370     if( lenPK==0 ) lenPK = 100000;
20371     zSql = sqlite3_mprintf(
20372           "CREATE TABLE \"%w\"(%s,PRIMARY KEY(%.*s))WITHOUT ROWID",
20373           azArg[2], zCollist, lenPK, zCollist);
20374     sqlite3_free(zCollist);
20375     rc = sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 1, tnum);
20376     if( rc==SQLITE_OK ){
20377       rc = sqlite3_exec(p->db, zSql, 0, 0, 0);
20378       sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 0);
20379       if( rc ){
20380         utf8_printf(stderr, "Error in [%s]: %s\n", zSql, sqlite3_errmsg(p->db));
20381       }else{
20382         utf8_printf(stdout, "%s;\n", zSql);
20383         raw_printf(stdout,
20384           "WARNING: writing to an imposter table will corrupt the \"%s\" %s!\n",
20385           azArg[1], isWO ? "table" : "index"
20386         );
20387       }
20388     }else{
20389       raw_printf(stderr, "SQLITE_TESTCTRL_IMPOSTER returns %d\n", rc);
20390       rc = 1;
20391     }
20392     sqlite3_free(zSql);
20393   }else
20394 #endif /* !defined(SQLITE_OMIT_TEST_CONTROL) */
20395 
20396 #ifdef SQLITE_ENABLE_IOTRACE
20397   if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
20398     SQLITE_API extern void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...);
20399     if( iotrace && iotrace!=stdout ) fclose(iotrace);
20400     iotrace = 0;
20401     if( nArg<2 ){
20402       sqlite3IoTrace = 0;
20403     }else if( strcmp(azArg[1], "-")==0 ){
20404       sqlite3IoTrace = iotracePrintf;
20405       iotrace = stdout;
20406     }else{
20407       iotrace = fopen(azArg[1], "w");
20408       if( iotrace==0 ){
20409         utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
20410         sqlite3IoTrace = 0;
20411         rc = 1;
20412       }else{
20413         sqlite3IoTrace = iotracePrintf;
20414       }
20415     }
20416   }else
20417 #endif
20418 
20419   if( c=='l' && n>=5 && strncmp(azArg[0], "limits", n)==0 ){
20420     static const struct {
20421        const char *zLimitName;   /* Name of a limit */
20422        int limitCode;            /* Integer code for that limit */
20423     } aLimit[] = {
20424       { "length",                SQLITE_LIMIT_LENGTH                    },
20425       { "sql_length",            SQLITE_LIMIT_SQL_LENGTH                },
20426       { "column",                SQLITE_LIMIT_COLUMN                    },
20427       { "expr_depth",            SQLITE_LIMIT_EXPR_DEPTH                },
20428       { "compound_select",       SQLITE_LIMIT_COMPOUND_SELECT           },
20429       { "vdbe_op",               SQLITE_LIMIT_VDBE_OP                   },
20430       { "function_arg",          SQLITE_LIMIT_FUNCTION_ARG              },
20431       { "attached",              SQLITE_LIMIT_ATTACHED                  },
20432       { "like_pattern_length",   SQLITE_LIMIT_LIKE_PATTERN_LENGTH       },
20433       { "variable_number",       SQLITE_LIMIT_VARIABLE_NUMBER           },
20434       { "trigger_depth",         SQLITE_LIMIT_TRIGGER_DEPTH             },
20435       { "worker_threads",        SQLITE_LIMIT_WORKER_THREADS            },
20436     };
20437     int i, n2;
20438     open_db(p, 0);
20439     if( nArg==1 ){
20440       for(i=0; i<ArraySize(aLimit); i++){
20441         printf("%20s %d\n", aLimit[i].zLimitName,
20442                sqlite3_limit(p->db, aLimit[i].limitCode, -1));
20443       }
20444     }else if( nArg>3 ){
20445       raw_printf(stderr, "Usage: .limit NAME ?NEW-VALUE?\n");
20446       rc = 1;
20447       goto meta_command_exit;
20448     }else{
20449       int iLimit = -1;
20450       n2 = strlen30(azArg[1]);
20451       for(i=0; i<ArraySize(aLimit); i++){
20452         if( sqlite3_strnicmp(aLimit[i].zLimitName, azArg[1], n2)==0 ){
20453           if( iLimit<0 ){
20454             iLimit = i;
20455           }else{
20456             utf8_printf(stderr, "ambiguous limit: \"%s\"\n", azArg[1]);
20457             rc = 1;
20458             goto meta_command_exit;
20459           }
20460         }
20461       }
20462       if( iLimit<0 ){
20463         utf8_printf(stderr, "unknown limit: \"%s\"\n"
20464                         "enter \".limits\" with no arguments for a list.\n",
20465                          azArg[1]);
20466         rc = 1;
20467         goto meta_command_exit;
20468       }
20469       if( nArg==3 ){
20470         sqlite3_limit(p->db, aLimit[iLimit].limitCode,
20471                       (int)integerValue(azArg[2]));
20472       }
20473       printf("%20s %d\n", aLimit[iLimit].zLimitName,
20474              sqlite3_limit(p->db, aLimit[iLimit].limitCode, -1));
20475     }
20476   }else
20477 
20478   if( c=='l' && n>2 && strncmp(azArg[0], "lint", n)==0 ){
20479     open_db(p, 0);
20480     lintDotCommand(p, azArg, nArg);
20481   }else
20482 
20483 #if !defined(SQLITE_OMIT_LOAD_EXTENSION) && !defined(SQLITE_SHELL_WASM_MODE)
20484   if( c=='l' && strncmp(azArg[0], "load", n)==0 ){
20485     const char *zFile, *zProc;
20486     char *zErrMsg = 0;
20487     failIfSafeMode(p, "cannot run .load in safe mode");
20488     if( nArg<2 ){
20489       raw_printf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n");
20490       rc = 1;
20491       goto meta_command_exit;
20492     }
20493     zFile = azArg[1];
20494     zProc = nArg>=3 ? azArg[2] : 0;
20495     open_db(p, 0);
20496     rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
20497     if( rc!=SQLITE_OK ){
20498       utf8_printf(stderr, "Error: %s\n", zErrMsg);
20499       sqlite3_free(zErrMsg);
20500       rc = 1;
20501     }
20502   }else
20503 #endif
20504 
20505 #ifndef SQLITE_SHELL_WASM_MODE
20506   if( c=='l' && strncmp(azArg[0], "log", n)==0 ){
20507     failIfSafeMode(p, "cannot run .log in safe mode");
20508     if( nArg!=2 ){
20509       raw_printf(stderr, "Usage: .log FILENAME\n");
20510       rc = 1;
20511     }else{
20512       const char *zFile = azArg[1];
20513       output_file_close(p->pLog);
20514       p->pLog = output_file_open(zFile, 0);
20515     }
20516   }else
20517 #endif
20518 
20519   if( c=='m' && strncmp(azArg[0], "mode", n)==0 ){
20520     const char *zMode = 0;
20521     const char *zTabname = 0;
20522     int i, n2;
20523     ColModeOpts cmOpts = ColModeOpts_default;
20524     for(i=1; i<nArg; i++){
20525       const char *z = azArg[i];
20526       if( optionMatch(z,"wrap") && i+1<nArg ){
20527         cmOpts.iWrap = integerValue(azArg[++i]);
20528       }else if( optionMatch(z,"ww") ){
20529         cmOpts.bWordWrap = 1;
20530       }else if( optionMatch(z,"wordwrap") && i+1<nArg ){
20531         cmOpts.bWordWrap = (u8)booleanValue(azArg[++i]);
20532       }else if( optionMatch(z,"quote") ){
20533         cmOpts.bQuote = 1;
20534       }else if( optionMatch(z,"noquote") ){
20535         cmOpts.bQuote = 0;
20536       }else if( zMode==0 ){
20537         zMode = z;
20538         /* Apply defaults for qbox pseudo-mods. If that
20539          * overwrites already-set values, user was informed of this.
20540          */
20541         if( strcmp(z, "qbox")==0 ){
20542           ColModeOpts cmo = ColModeOpts_default_qbox;
20543           zMode = "box";
20544           cmOpts = cmo;
20545         }
20546       }else if( zTabname==0 ){
20547         zTabname = z;
20548       }else if( z[0]=='-' ){
20549         utf8_printf(stderr, "unknown option: %s\n", z);
20550         utf8_printf(stderr, "options:\n"
20551                             "  --noquote\n"
20552                             "  --quote\n"
20553                             "  --wordwrap on/off\n"
20554                             "  --wrap N\n"
20555                             "  --ww\n");
20556         rc = 1;
20557         goto meta_command_exit;
20558       }else{
20559         utf8_printf(stderr, "extra argument: \"%s\"\n", z);
20560         rc = 1;
20561         goto meta_command_exit;
20562       }
20563     }
20564     if( zMode==0 ){
20565       if( p->mode==MODE_Column
20566        || (p->mode>=MODE_Markdown && p->mode<=MODE_Box)
20567       ){
20568         raw_printf
20569           (p->out,
20570            "current output mode: %s --wrap %d --wordwrap %s --%squote\n",
20571            modeDescr[p->mode], p->cmOpts.iWrap,
20572            p->cmOpts.bWordWrap ? "on" : "off",
20573            p->cmOpts.bQuote ? "" : "no");
20574       }else{
20575         raw_printf(p->out, "current output mode: %s\n", modeDescr[p->mode]);
20576       }
20577       zMode = modeDescr[p->mode];
20578     }
20579     n2 = strlen30(zMode);
20580     if( strncmp(zMode,"lines",n2)==0 ){
20581       p->mode = MODE_Line;
20582       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
20583     }else if( strncmp(zMode,"columns",n2)==0 ){
20584       p->mode = MODE_Column;
20585       if( (p->shellFlgs & SHFLG_HeaderSet)==0 ){
20586         p->showHeader = 1;
20587       }
20588       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
20589       p->cmOpts = cmOpts;
20590     }else if( strncmp(zMode,"list",n2)==0 ){
20591       p->mode = MODE_List;
20592       sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Column);
20593       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
20594     }else if( strncmp(zMode,"html",n2)==0 ){
20595       p->mode = MODE_Html;
20596     }else if( strncmp(zMode,"tcl",n2)==0 ){
20597       p->mode = MODE_Tcl;
20598       sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Space);
20599       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
20600     }else if( strncmp(zMode,"csv",n2)==0 ){
20601       p->mode = MODE_Csv;
20602       sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
20603       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
20604     }else if( strncmp(zMode,"tabs",n2)==0 ){
20605       p->mode = MODE_List;
20606       sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Tab);
20607     }else if( strncmp(zMode,"insert",n2)==0 ){
20608       p->mode = MODE_Insert;
20609       set_table_name(p, zTabname ? zTabname : "table");
20610     }else if( strncmp(zMode,"quote",n2)==0 ){
20611       p->mode = MODE_Quote;
20612       sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
20613       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
20614     }else if( strncmp(zMode,"ascii",n2)==0 ){
20615       p->mode = MODE_Ascii;
20616       sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit);
20617       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record);
20618     }else if( strncmp(zMode,"markdown",n2)==0 ){
20619       p->mode = MODE_Markdown;
20620       p->cmOpts = cmOpts;
20621     }else if( strncmp(zMode,"table",n2)==0 ){
20622       p->mode = MODE_Table;
20623       p->cmOpts = cmOpts;
20624     }else if( strncmp(zMode,"box",n2)==0 ){
20625       p->mode = MODE_Box;
20626       p->cmOpts = cmOpts;
20627     }else if( strncmp(zMode,"count",n2)==0 ){
20628       p->mode = MODE_Count;
20629     }else if( strncmp(zMode,"off",n2)==0 ){
20630       p->mode = MODE_Off;
20631     }else if( strncmp(zMode,"json",n2)==0 ){
20632       p->mode = MODE_Json;
20633     }else{
20634       raw_printf(stderr, "Error: mode should be one of: "
20635          "ascii box column csv html insert json line list markdown "
20636          "qbox quote table tabs tcl\n");
20637       rc = 1;
20638     }
20639     p->cMode = p->mode;
20640   }else
20641 
20642 #ifndef SQLITE_SHELL_WASM_MODE
20643   if( c=='n' && strcmp(azArg[0], "nonce")==0 ){
20644     if( nArg!=2 ){
20645       raw_printf(stderr, "Usage: .nonce NONCE\n");
20646       rc = 1;
20647     }else if( p->zNonce==0 || strcmp(azArg[1],p->zNonce)!=0 ){
20648       raw_printf(stderr, "line %d: incorrect nonce: \"%s\"\n",
20649                  p->lineno, azArg[1]);
20650       exit(1);
20651     }else{
20652       p->bSafeMode = 0;
20653       return 0;  /* Return immediately to bypass the safe mode reset
20654                  ** at the end of this procedure */
20655     }
20656   }else
20657 #endif /* !defined(SQLITE_SHELL_WASM_MODE) */
20658 
20659   if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){
20660     if( nArg==2 ){
20661       sqlite3_snprintf(sizeof(p->nullValue), p->nullValue,
20662                        "%.*s", (int)ArraySize(p->nullValue)-1, azArg[1]);
20663     }else{
20664       raw_printf(stderr, "Usage: .nullvalue STRING\n");
20665       rc = 1;
20666     }
20667   }else
20668 
20669   if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
20670     const char *zFN = 0;     /* Pointer to constant filename */
20671     char *zNewFilename = 0;  /* Name of the database file to open */
20672     int iName = 1;           /* Index in azArg[] of the filename */
20673     int newFlag = 0;         /* True to delete file before opening */
20674     int openMode = SHELL_OPEN_UNSPEC;
20675 
20676     /* Check for command-line arguments */
20677     for(iName=1; iName<nArg; iName++){
20678       const char *z = azArg[iName];
20679 #ifndef SQLITE_SHELL_WASM_MODE
20680       if( optionMatch(z,"new") ){
20681         newFlag = 1;
20682 #ifdef SQLITE_HAVE_ZLIB
20683       }else if( optionMatch(z, "zip") ){
20684         openMode = SHELL_OPEN_ZIPFILE;
20685 #endif
20686       }else if( optionMatch(z, "append") ){
20687         openMode = SHELL_OPEN_APPENDVFS;
20688       }else if( optionMatch(z, "readonly") ){
20689         openMode = SHELL_OPEN_READONLY;
20690       }else if( optionMatch(z, "nofollow") ){
20691         p->openFlags |= SQLITE_OPEN_NOFOLLOW;
20692 #ifndef SQLITE_OMIT_DESERIALIZE
20693       }else if( optionMatch(z, "deserialize") ){
20694         openMode = SHELL_OPEN_DESERIALIZE;
20695       }else if( optionMatch(z, "hexdb") ){
20696         openMode = SHELL_OPEN_HEXDB;
20697       }else if( optionMatch(z, "maxsize") && iName+1<nArg ){
20698         p->szMax = integerValue(azArg[++iName]);
20699 #endif /* SQLITE_OMIT_DESERIALIZE */
20700       }else
20701 #endif /* !SQLITE_SHELL_WASM_MODE */
20702       if( z[0]=='-' ){
20703         utf8_printf(stderr, "unknown option: %s\n", z);
20704         rc = 1;
20705         goto meta_command_exit;
20706       }else if( zFN ){
20707         utf8_printf(stderr, "extra argument: \"%s\"\n", z);
20708         rc = 1;
20709         goto meta_command_exit;
20710       }else{
20711         zFN = z;
20712       }
20713     }
20714 
20715     /* Close the existing database */
20716     session_close_all(p, -1);
20717     close_db(p->db);
20718     p->db = 0;
20719     p->pAuxDb->zDbFilename = 0;
20720     sqlite3_free(p->pAuxDb->zFreeOnClose);
20721     p->pAuxDb->zFreeOnClose = 0;
20722     p->openMode = openMode;
20723     p->openFlags = 0;
20724     p->szMax = 0;
20725 
20726     /* If a filename is specified, try to open it first */
20727     if( zFN || p->openMode==SHELL_OPEN_HEXDB ){
20728       if( newFlag && zFN && !p->bSafeMode ) shellDeleteFile(zFN);
20729 #ifndef SQLITE_SHELL_WASM_MODE
20730       if( p->bSafeMode
20731        && p->openMode!=SHELL_OPEN_HEXDB
20732        && zFN
20733        && strcmp(zFN,":memory:")!=0
20734       ){
20735         failIfSafeMode(p, "cannot open disk-based database files in safe mode");
20736       }
20737 #else
20738       /* WASM mode has its own sandboxed pseudo-filesystem. */
20739 #endif
20740       if( zFN ){
20741         zNewFilename = sqlite3_mprintf("%s", zFN);
20742         shell_check_oom(zNewFilename);
20743       }else{
20744         zNewFilename = 0;
20745       }
20746       p->pAuxDb->zDbFilename = zNewFilename;
20747       open_db(p, OPEN_DB_KEEPALIVE);
20748       if( p->db==0 ){
20749         utf8_printf(stderr, "Error: cannot open '%s'\n", zNewFilename);
20750         sqlite3_free(zNewFilename);
20751       }else{
20752         p->pAuxDb->zFreeOnClose = zNewFilename;
20753       }
20754     }
20755     if( p->db==0 ){
20756       /* As a fall-back open a TEMP database */
20757       p->pAuxDb->zDbFilename = 0;
20758       open_db(p, 0);
20759     }
20760   }else
20761 
20762 #ifndef SQLITE_SHELL_WASM_MODE
20763   if( (c=='o'
20764         && (strncmp(azArg[0], "output", n)==0||strncmp(azArg[0], "once", n)==0))
20765    || (c=='e' && n==5 && strcmp(azArg[0],"excel")==0)
20766   ){
20767     char *zFile = 0;
20768     int bTxtMode = 0;
20769     int i;
20770     int eMode = 0;
20771     int bOnce = 0;            /* 0: .output, 1: .once, 2: .excel */
20772     unsigned char zBOM[4];    /* Byte-order mark to using if --bom is present */
20773 
20774     zBOM[0] = 0;
20775     failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]);
20776     if( c=='e' ){
20777       eMode = 'x';
20778       bOnce = 2;
20779     }else if( strncmp(azArg[0],"once",n)==0 ){
20780       bOnce = 1;
20781     }
20782     for(i=1; i<nArg; i++){
20783       char *z = azArg[i];
20784       if( z[0]=='-' ){
20785         if( z[1]=='-' ) z++;
20786         if( strcmp(z,"-bom")==0 ){
20787           zBOM[0] = 0xef;
20788           zBOM[1] = 0xbb;
20789           zBOM[2] = 0xbf;
20790           zBOM[3] = 0;
20791         }else if( c!='e' && strcmp(z,"-x")==0 ){
20792           eMode = 'x';  /* spreadsheet */
20793         }else if( c!='e' && strcmp(z,"-e")==0 ){
20794           eMode = 'e';  /* text editor */
20795         }else{
20796           utf8_printf(p->out, "ERROR: unknown option: \"%s\".  Usage:\n",
20797                       azArg[i]);
20798           showHelp(p->out, azArg[0]);
20799           rc = 1;
20800           goto meta_command_exit;
20801         }
20802       }else if( zFile==0 && eMode!='e' && eMode!='x' ){
20803         zFile = sqlite3_mprintf("%s", z);
20804         if( zFile && zFile[0]=='|' ){
20805           while( i+1<nArg ) zFile = sqlite3_mprintf("%z %s", zFile, azArg[++i]);
20806           break;
20807         }
20808       }else{
20809         utf8_printf(p->out,"ERROR: extra parameter: \"%s\".  Usage:\n",
20810                     azArg[i]);
20811         showHelp(p->out, azArg[0]);
20812         rc = 1;
20813         sqlite3_free(zFile);
20814         goto meta_command_exit;
20815       }
20816     }
20817     if( zFile==0 ){
20818       zFile = sqlite3_mprintf("stdout");
20819     }
20820     if( bOnce ){
20821       p->outCount = 2;
20822     }else{
20823       p->outCount = 0;
20824     }
20825     output_reset(p);
20826 #ifndef SQLITE_NOHAVE_SYSTEM
20827     if( eMode=='e' || eMode=='x' ){
20828       p->doXdgOpen = 1;
20829       outputModePush(p);
20830       if( eMode=='x' ){
20831         /* spreadsheet mode.  Output as CSV. */
20832         newTempFile(p, "csv");
20833         ShellClearFlag(p, SHFLG_Echo);
20834         p->mode = MODE_Csv;
20835         sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
20836         sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
20837       }else{
20838         /* text editor mode */
20839         newTempFile(p, "txt");
20840         bTxtMode = 1;
20841       }
20842       sqlite3_free(zFile);
20843       zFile = sqlite3_mprintf("%s", p->zTempFile);
20844     }
20845 #endif /* SQLITE_NOHAVE_SYSTEM */
20846     shell_check_oom(zFile);
20847     if( zFile[0]=='|' ){
20848 #ifdef SQLITE_OMIT_POPEN
20849       raw_printf(stderr, "Error: pipes are not supported in this OS\n");
20850       rc = 1;
20851       p->out = stdout;
20852 #else
20853       p->out = popen(zFile + 1, "w");
20854       if( p->out==0 ){
20855         utf8_printf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1);
20856         p->out = stdout;
20857         rc = 1;
20858       }else{
20859         if( zBOM[0] ) fwrite(zBOM, 1, 3, p->out);
20860         sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
20861       }
20862 #endif
20863     }else{
20864       p->out = output_file_open(zFile, bTxtMode);
20865       if( p->out==0 ){
20866         if( strcmp(zFile,"off")!=0 ){
20867           utf8_printf(stderr,"Error: cannot write to \"%s\"\n", zFile);
20868         }
20869         p->out = stdout;
20870         rc = 1;
20871       } else {
20872         if( zBOM[0] ) fwrite(zBOM, 1, 3, p->out);
20873         sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
20874       }
20875     }
20876     sqlite3_free(zFile);
20877   }else
20878 #endif /* !defined(SQLITE_SHELL_WASM_MODE) */
20879 
20880   if( c=='p' && n>=3 && strncmp(azArg[0], "parameter", n)==0 ){
20881     open_db(p,0);
20882     if( nArg<=1 ) goto parameter_syntax_error;
20883 
20884     /* .parameter clear
20885     ** Clear all bind parameters by dropping the TEMP table that holds them.
20886     */
20887     if( nArg==2 && strcmp(azArg[1],"clear")==0 ){
20888       sqlite3_exec(p->db, "DROP TABLE IF EXISTS temp.sqlite_parameters;",
20889                    0, 0, 0);
20890     }else
20891 
20892     /* .parameter list
20893     ** List all bind parameters.
20894     */
20895     if( nArg==2 && strcmp(azArg[1],"list")==0 ){
20896       sqlite3_stmt *pStmt = 0;
20897       int rx;
20898       int len = 0;
20899       rx = sqlite3_prepare_v2(p->db,
20900              "SELECT max(length(key)) "
20901              "FROM temp.sqlite_parameters;", -1, &pStmt, 0);
20902       if( rx==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
20903         len = sqlite3_column_int(pStmt, 0);
20904         if( len>40 ) len = 40;
20905       }
20906       sqlite3_finalize(pStmt);
20907       pStmt = 0;
20908       if( len ){
20909         rx = sqlite3_prepare_v2(p->db,
20910              "SELECT key, quote(value) "
20911              "FROM temp.sqlite_parameters;", -1, &pStmt, 0);
20912         while( rx==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
20913           utf8_printf(p->out, "%-*s %s\n", len, sqlite3_column_text(pStmt,0),
20914                       sqlite3_column_text(pStmt,1));
20915         }
20916         sqlite3_finalize(pStmt);
20917       }
20918     }else
20919 
20920     /* .parameter init
20921     ** Make sure the TEMP table used to hold bind parameters exists.
20922     ** Create it if necessary.
20923     */
20924     if( nArg==2 && strcmp(azArg[1],"init")==0 ){
20925       bind_table_init(p);
20926     }else
20927 
20928     /* .parameter set NAME VALUE
20929     ** Set or reset a bind parameter.  NAME should be the full parameter
20930     ** name exactly as it appears in the query.  (ex: $abc, @def).  The
20931     ** VALUE can be in either SQL literal notation, or if not it will be
20932     ** understood to be a text string.
20933     */
20934     if( nArg==4 && strcmp(azArg[1],"set")==0 ){
20935       int rx;
20936       char *zSql;
20937       sqlite3_stmt *pStmt;
20938       const char *zKey = azArg[2];
20939       const char *zValue = azArg[3];
20940       bind_table_init(p);
20941       zSql = sqlite3_mprintf(
20942                   "REPLACE INTO temp.sqlite_parameters(key,value)"
20943                   "VALUES(%Q,%s);", zKey, zValue);
20944       shell_check_oom(zSql);
20945       pStmt = 0;
20946       rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
20947       sqlite3_free(zSql);
20948       if( rx!=SQLITE_OK ){
20949         sqlite3_finalize(pStmt);
20950         pStmt = 0;
20951         zSql = sqlite3_mprintf(
20952                    "REPLACE INTO temp.sqlite_parameters(key,value)"
20953                    "VALUES(%Q,%Q);", zKey, zValue);
20954         shell_check_oom(zSql);
20955         rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
20956         sqlite3_free(zSql);
20957         if( rx!=SQLITE_OK ){
20958           utf8_printf(p->out, "Error: %s\n", sqlite3_errmsg(p->db));
20959           sqlite3_finalize(pStmt);
20960           pStmt = 0;
20961           rc = 1;
20962         }
20963       }
20964       sqlite3_step(pStmt);
20965       sqlite3_finalize(pStmt);
20966     }else
20967 
20968     /* .parameter unset NAME
20969     ** Remove the NAME binding from the parameter binding table, if it
20970     ** exists.
20971     */
20972     if( nArg==3 && strcmp(azArg[1],"unset")==0 ){
20973       char *zSql = sqlite3_mprintf(
20974           "DELETE FROM temp.sqlite_parameters WHERE key=%Q", azArg[2]);
20975       shell_check_oom(zSql);
20976       sqlite3_exec(p->db, zSql, 0, 0, 0);
20977       sqlite3_free(zSql);
20978     }else
20979     /* If no command name matches, show a syntax error */
20980     parameter_syntax_error:
20981     showHelp(p->out, "parameter");
20982   }else
20983 
20984   if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
20985     int i;
20986     for(i=1; i<nArg; i++){
20987       if( i>1 ) raw_printf(p->out, " ");
20988       utf8_printf(p->out, "%s", azArg[i]);
20989     }
20990     raw_printf(p->out, "\n");
20991   }else
20992 
20993 #ifndef SQLITE_OMIT_PROGRESS_CALLBACK
20994   if( c=='p' && n>=3 && strncmp(azArg[0], "progress", n)==0 ){
20995     int i;
20996     int nn = 0;
20997     p->flgProgress = 0;
20998     p->mxProgress = 0;
20999     p->nProgress = 0;
21000     for(i=1; i<nArg; i++){
21001       const char *z = azArg[i];
21002       if( z[0]=='-' ){
21003         z++;
21004         if( z[0]=='-' ) z++;
21005         if( strcmp(z,"quiet")==0 || strcmp(z,"q")==0 ){
21006           p->flgProgress |= SHELL_PROGRESS_QUIET;
21007           continue;
21008         }
21009         if( strcmp(z,"reset")==0 ){
21010           p->flgProgress |= SHELL_PROGRESS_RESET;
21011           continue;
21012         }
21013         if( strcmp(z,"once")==0 ){
21014           p->flgProgress |= SHELL_PROGRESS_ONCE;
21015           continue;
21016         }
21017         if( strcmp(z,"limit")==0 ){
21018           if( i+1>=nArg ){
21019             utf8_printf(stderr, "Error: missing argument on --limit\n");
21020             rc = 1;
21021             goto meta_command_exit;
21022           }else{
21023             p->mxProgress = (int)integerValue(azArg[++i]);
21024           }
21025           continue;
21026         }
21027         utf8_printf(stderr, "Error: unknown option: \"%s\"\n", azArg[i]);
21028         rc = 1;
21029         goto meta_command_exit;
21030       }else{
21031         nn = (int)integerValue(z);
21032       }
21033     }
21034     open_db(p, 0);
21035     sqlite3_progress_handler(p->db, nn, progress_handler, p);
21036   }else
21037 #endif /* SQLITE_OMIT_PROGRESS_CALLBACK */
21038 
21039   if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){
21040     if( nArg >= 2) {
21041       strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
21042     }
21043     if( nArg >= 3) {
21044       strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
21045     }
21046   }else
21047 
21048 #ifndef SQLITE_SHELL_WASM_MODE
21049   if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){
21050     rc = 2;
21051   }else
21052 #endif
21053 
21054 #ifndef SQLITE_SHELL_WASM_MODE
21055   if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){
21056     FILE *inSaved = p->in;
21057     int savedLineno = p->lineno;
21058     failIfSafeMode(p, "cannot run .read in safe mode");
21059     if( nArg!=2 ){
21060       raw_printf(stderr, "Usage: .read FILE\n");
21061       rc = 1;
21062       goto meta_command_exit;
21063     }
21064     if( azArg[1][0]=='|' ){
21065 #ifdef SQLITE_OMIT_POPEN
21066       raw_printf(stderr, "Error: pipes are not supported in this OS\n");
21067       rc = 1;
21068       p->out = stdout;
21069 #else
21070       p->in = popen(azArg[1]+1, "r");
21071       if( p->in==0 ){
21072         utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
21073         rc = 1;
21074       }else{
21075         rc = process_input(p);
21076         pclose(p->in);
21077       }
21078 #endif
21079     }else if( (p->in = openChrSource(azArg[1]))==0 ){
21080       utf8_printf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
21081       rc = 1;
21082     }else{
21083       rc = process_input(p);
21084       fclose(p->in);
21085     }
21086     p->in = inSaved;
21087     p->lineno = savedLineno;
21088   }else
21089 #endif /* !defined(SQLITE_SHELL_WASM_MODE) */
21090 
21091 #ifndef SQLITE_SHELL_WASM_MODE
21092   if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){
21093     const char *zSrcFile;
21094     const char *zDb;
21095     sqlite3 *pSrc;
21096     sqlite3_backup *pBackup;
21097     int nTimeout = 0;
21098 
21099     failIfSafeMode(p, "cannot run .restore in safe mode");
21100     if( nArg==2 ){
21101       zSrcFile = azArg[1];
21102       zDb = "main";
21103     }else if( nArg==3 ){
21104       zSrcFile = azArg[2];
21105       zDb = azArg[1];
21106     }else{
21107       raw_printf(stderr, "Usage: .restore ?DB? FILE\n");
21108       rc = 1;
21109       goto meta_command_exit;
21110     }
21111     rc = sqlite3_open(zSrcFile, &pSrc);
21112     if( rc!=SQLITE_OK ){
21113       utf8_printf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
21114       close_db(pSrc);
21115       return 1;
21116     }
21117     open_db(p, 0);
21118     pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
21119     if( pBackup==0 ){
21120       utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
21121       close_db(pSrc);
21122       return 1;
21123     }
21124     while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
21125           || rc==SQLITE_BUSY  ){
21126       if( rc==SQLITE_BUSY ){
21127         if( nTimeout++ >= 3 ) break;
21128         sqlite3_sleep(100);
21129       }
21130     }
21131     sqlite3_backup_finish(pBackup);
21132     if( rc==SQLITE_DONE ){
21133       rc = 0;
21134     }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
21135       raw_printf(stderr, "Error: source database is busy\n");
21136       rc = 1;
21137     }else{
21138       utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
21139       rc = 1;
21140     }
21141     close_db(pSrc);
21142   }else
21143 #endif /* !defined(SQLITE_SHELL_WASM_MODE) */
21144 
21145   if( c=='s' && strncmp(azArg[0], "scanstats", n)==0 ){
21146     if( nArg==2 ){
21147       p->scanstatsOn = (u8)booleanValue(azArg[1]);
21148 #ifndef SQLITE_ENABLE_STMT_SCANSTATUS
21149       raw_printf(stderr, "Warning: .scanstats not available in this build.\n");
21150 #endif
21151     }else{
21152       raw_printf(stderr, "Usage: .scanstats on|off\n");
21153       rc = 1;
21154     }
21155   }else
21156 
21157   if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){
21158     ShellText sSelect;
21159     ShellState data;
21160     char *zErrMsg = 0;
21161     const char *zDiv = "(";
21162     const char *zName = 0;
21163     int iSchema = 0;
21164     int bDebug = 0;
21165     int bNoSystemTabs = 0;
21166     int ii;
21167 
21168     open_db(p, 0);
21169     memcpy(&data, p, sizeof(data));
21170     data.showHeader = 0;
21171     data.cMode = data.mode = MODE_Semi;
21172     initText(&sSelect);
21173     for(ii=1; ii<nArg; ii++){
21174       if( optionMatch(azArg[ii],"indent") ){
21175         data.cMode = data.mode = MODE_Pretty;
21176       }else if( optionMatch(azArg[ii],"debug") ){
21177         bDebug = 1;
21178       }else if( optionMatch(azArg[ii],"nosys") ){
21179         bNoSystemTabs = 1;
21180       }else if( azArg[ii][0]=='-' ){
21181         utf8_printf(stderr, "Unknown option: \"%s\"\n", azArg[ii]);
21182         rc = 1;
21183         goto meta_command_exit;
21184       }else if( zName==0 ){
21185         zName = azArg[ii];
21186       }else{
21187         raw_printf(stderr, "Usage: .schema ?--indent? ?--nosys? ?LIKE-PATTERN?\n");
21188         rc = 1;
21189         goto meta_command_exit;
21190       }
21191     }
21192     if( zName!=0 ){
21193       int isSchema = sqlite3_strlike(zName, "sqlite_master", '\\')==0
21194                   || sqlite3_strlike(zName, "sqlite_schema", '\\')==0
21195                   || sqlite3_strlike(zName,"sqlite_temp_master", '\\')==0
21196                   || sqlite3_strlike(zName,"sqlite_temp_schema", '\\')==0;
21197       if( isSchema ){
21198         char *new_argv[2], *new_colv[2];
21199         new_argv[0] = sqlite3_mprintf(
21200                       "CREATE TABLE %s (\n"
21201                       "  type text,\n"
21202                       "  name text,\n"
21203                       "  tbl_name text,\n"
21204                       "  rootpage integer,\n"
21205                       "  sql text\n"
21206                       ")", zName);
21207         shell_check_oom(new_argv[0]);
21208         new_argv[1] = 0;
21209         new_colv[0] = "sql";
21210         new_colv[1] = 0;
21211         callback(&data, 1, new_argv, new_colv);
21212         sqlite3_free(new_argv[0]);
21213       }
21214     }
21215     if( zDiv ){
21216       sqlite3_stmt *pStmt = 0;
21217       rc = sqlite3_prepare_v2(p->db, "SELECT name FROM pragma_database_list",
21218                               -1, &pStmt, 0);
21219       if( rc ){
21220         utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
21221         sqlite3_finalize(pStmt);
21222         rc = 1;
21223         goto meta_command_exit;
21224       }
21225       appendText(&sSelect, "SELECT sql FROM", 0);
21226       iSchema = 0;
21227       while( sqlite3_step(pStmt)==SQLITE_ROW ){
21228         const char *zDb = (const char*)sqlite3_column_text(pStmt, 0);
21229         char zScNum[30];
21230         sqlite3_snprintf(sizeof(zScNum), zScNum, "%d", ++iSchema);
21231         appendText(&sSelect, zDiv, 0);
21232         zDiv = " UNION ALL ";
21233         appendText(&sSelect, "SELECT shell_add_schema(sql,", 0);
21234         if( sqlite3_stricmp(zDb, "main")!=0 ){
21235           appendText(&sSelect, zDb, '\'');
21236         }else{
21237           appendText(&sSelect, "NULL", 0);
21238         }
21239         appendText(&sSelect, ",name) AS sql, type, tbl_name, name, rowid,", 0);
21240         appendText(&sSelect, zScNum, 0);
21241         appendText(&sSelect, " AS snum, ", 0);
21242         appendText(&sSelect, zDb, '\'');
21243         appendText(&sSelect, " AS sname FROM ", 0);
21244         appendText(&sSelect, zDb, quoteChar(zDb));
21245         appendText(&sSelect, ".sqlite_schema", 0);
21246       }
21247       sqlite3_finalize(pStmt);
21248 #ifndef SQLITE_OMIT_INTROSPECTION_PRAGMAS
21249       if( zName ){
21250         appendText(&sSelect,
21251            " UNION ALL SELECT shell_module_schema(name),"
21252            " 'table', name, name, name, 9e+99, 'main' FROM pragma_module_list",
21253         0);
21254       }
21255 #endif
21256       appendText(&sSelect, ") WHERE ", 0);
21257       if( zName ){
21258         char *zQarg = sqlite3_mprintf("%Q", zName);
21259         int bGlob;
21260         shell_check_oom(zQarg);
21261         bGlob = strchr(zName, '*') != 0 || strchr(zName, '?') != 0 ||
21262                 strchr(zName, '[') != 0;
21263         if( strchr(zName, '.') ){
21264           appendText(&sSelect, "lower(printf('%s.%s',sname,tbl_name))", 0);
21265         }else{
21266           appendText(&sSelect, "lower(tbl_name)", 0);
21267         }
21268         appendText(&sSelect, bGlob ? " GLOB " : " LIKE ", 0);
21269         appendText(&sSelect, zQarg, 0);
21270         if( !bGlob ){
21271           appendText(&sSelect, " ESCAPE '\\' ", 0);
21272         }
21273         appendText(&sSelect, " AND ", 0);
21274         sqlite3_free(zQarg);
21275       }
21276       if( bNoSystemTabs ){
21277         appendText(&sSelect, "name NOT LIKE 'sqlite_%%' AND ", 0);
21278       }
21279       appendText(&sSelect, "sql IS NOT NULL"
21280                            " ORDER BY snum, rowid", 0);
21281       if( bDebug ){
21282         utf8_printf(p->out, "SQL: %s;\n", sSelect.z);
21283       }else{
21284         rc = sqlite3_exec(p->db, sSelect.z, callback, &data, &zErrMsg);
21285       }
21286       freeText(&sSelect);
21287     }
21288     if( zErrMsg ){
21289       utf8_printf(stderr,"Error: %s\n", zErrMsg);
21290       sqlite3_free(zErrMsg);
21291       rc = 1;
21292     }else if( rc != SQLITE_OK ){
21293       raw_printf(stderr,"Error: querying schema information\n");
21294       rc = 1;
21295     }else{
21296       rc = 0;
21297     }
21298   }else
21299 
21300   if( (c=='s' && n==11 && strncmp(azArg[0], "selecttrace", n)==0)
21301    || (c=='t' && n==9  && strncmp(azArg[0], "treetrace", n)==0)
21302   ){
21303     unsigned int x = nArg>=2 ? (unsigned int)integerValue(azArg[1]) : 0xffffffff;
21304     sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &x);
21305   }else
21306 
21307 #if defined(SQLITE_ENABLE_SESSION)
21308   if( c=='s' && strncmp(azArg[0],"session",n)==0 && n>=3 ){
21309     struct AuxDb *pAuxDb = p->pAuxDb;
21310     OpenSession *pSession = &pAuxDb->aSession[0];
21311     char **azCmd = &azArg[1];
21312     int iSes = 0;
21313     int nCmd = nArg - 1;
21314     int i;
21315     if( nArg<=1 ) goto session_syntax_error;
21316     open_db(p, 0);
21317     if( nArg>=3 ){
21318       for(iSes=0; iSes<pAuxDb->nSession; iSes++){
21319         if( strcmp(pAuxDb->aSession[iSes].zName, azArg[1])==0 ) break;
21320       }
21321       if( iSes<pAuxDb->nSession ){
21322         pSession = &pAuxDb->aSession[iSes];
21323         azCmd++;
21324         nCmd--;
21325       }else{
21326         pSession = &pAuxDb->aSession[0];
21327         iSes = 0;
21328       }
21329     }
21330 
21331     /* .session attach TABLE
21332     ** Invoke the sqlite3session_attach() interface to attach a particular
21333     ** table so that it is never filtered.
21334     */
21335     if( strcmp(azCmd[0],"attach")==0 ){
21336       if( nCmd!=2 ) goto session_syntax_error;
21337       if( pSession->p==0 ){
21338         session_not_open:
21339         raw_printf(stderr, "ERROR: No sessions are open\n");
21340       }else{
21341         rc = sqlite3session_attach(pSession->p, azCmd[1]);
21342         if( rc ){
21343           raw_printf(stderr, "ERROR: sqlite3session_attach() returns %d\n", rc);
21344           rc = 0;
21345         }
21346       }
21347     }else
21348 
21349     /* .session changeset FILE
21350     ** .session patchset FILE
21351     ** Write a changeset or patchset into a file.  The file is overwritten.
21352     */
21353     if( strcmp(azCmd[0],"changeset")==0 || strcmp(azCmd[0],"patchset")==0 ){
21354       FILE *out = 0;
21355       failIfSafeMode(p, "cannot run \".session %s\" in safe mode", azCmd[0]);
21356       if( nCmd!=2 ) goto session_syntax_error;
21357       if( pSession->p==0 ) goto session_not_open;
21358       out = fopen(azCmd[1], "wb");
21359       if( out==0 ){
21360         utf8_printf(stderr, "ERROR: cannot open \"%s\" for writing\n",
21361                     azCmd[1]);
21362       }else{
21363         int szChng;
21364         void *pChng;
21365         if( azCmd[0][0]=='c' ){
21366           rc = sqlite3session_changeset(pSession->p, &szChng, &pChng);
21367         }else{
21368           rc = sqlite3session_patchset(pSession->p, &szChng, &pChng);
21369         }
21370         if( rc ){
21371           printf("Error: error code %d\n", rc);
21372           rc = 0;
21373         }
21374         if( pChng
21375           && fwrite(pChng, szChng, 1, out)!=1 ){
21376           raw_printf(stderr, "ERROR: Failed to write entire %d-byte output\n",
21377                   szChng);
21378         }
21379         sqlite3_free(pChng);
21380         fclose(out);
21381       }
21382     }else
21383 
21384     /* .session close
21385     ** Close the identified session
21386     */
21387     if( strcmp(azCmd[0], "close")==0 ){
21388       if( nCmd!=1 ) goto session_syntax_error;
21389       if( pAuxDb->nSession ){
21390         session_close(pSession);
21391         pAuxDb->aSession[iSes] = pAuxDb->aSession[--pAuxDb->nSession];
21392       }
21393     }else
21394 
21395     /* .session enable ?BOOLEAN?
21396     ** Query or set the enable flag
21397     */
21398     if( strcmp(azCmd[0], "enable")==0 ){
21399       int ii;
21400       if( nCmd>2 ) goto session_syntax_error;
21401       ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
21402       if( pAuxDb->nSession ){
21403         ii = sqlite3session_enable(pSession->p, ii);
21404         utf8_printf(p->out, "session %s enable flag = %d\n",
21405                     pSession->zName, ii);
21406       }
21407     }else
21408 
21409     /* .session filter GLOB ....
21410     ** Set a list of GLOB patterns of table names to be excluded.
21411     */
21412     if( strcmp(azCmd[0], "filter")==0 ){
21413       int ii, nByte;
21414       if( nCmd<2 ) goto session_syntax_error;
21415       if( pAuxDb->nSession ){
21416         for(ii=0; ii<pSession->nFilter; ii++){
21417           sqlite3_free(pSession->azFilter[ii]);
21418         }
21419         sqlite3_free(pSession->azFilter);
21420         nByte = sizeof(pSession->azFilter[0])*(nCmd-1);
21421         pSession->azFilter = sqlite3_malloc( nByte );
21422         if( pSession->azFilter==0 ){
21423           raw_printf(stderr, "Error: out or memory\n");
21424           exit(1);
21425         }
21426         for(ii=1; ii<nCmd; ii++){
21427           char *x = pSession->azFilter[ii-1] = sqlite3_mprintf("%s", azCmd[ii]);
21428           shell_check_oom(x);
21429         }
21430         pSession->nFilter = ii-1;
21431       }
21432     }else
21433 
21434     /* .session indirect ?BOOLEAN?
21435     ** Query or set the indirect flag
21436     */
21437     if( strcmp(azCmd[0], "indirect")==0 ){
21438       int ii;
21439       if( nCmd>2 ) goto session_syntax_error;
21440       ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
21441       if( pAuxDb->nSession ){
21442         ii = sqlite3session_indirect(pSession->p, ii);
21443         utf8_printf(p->out, "session %s indirect flag = %d\n",
21444                     pSession->zName, ii);
21445       }
21446     }else
21447 
21448     /* .session isempty
21449     ** Determine if the session is empty
21450     */
21451     if( strcmp(azCmd[0], "isempty")==0 ){
21452       int ii;
21453       if( nCmd!=1 ) goto session_syntax_error;
21454       if( pAuxDb->nSession ){
21455         ii = sqlite3session_isempty(pSession->p);
21456         utf8_printf(p->out, "session %s isempty flag = %d\n",
21457                     pSession->zName, ii);
21458       }
21459     }else
21460 
21461     /* .session list
21462     ** List all currently open sessions
21463     */
21464     if( strcmp(azCmd[0],"list")==0 ){
21465       for(i=0; i<pAuxDb->nSession; i++){
21466         utf8_printf(p->out, "%d %s\n", i, pAuxDb->aSession[i].zName);
21467       }
21468     }else
21469 
21470     /* .session open DB NAME
21471     ** Open a new session called NAME on the attached database DB.
21472     ** DB is normally "main".
21473     */
21474     if( strcmp(azCmd[0],"open")==0 ){
21475       char *zName;
21476       if( nCmd!=3 ) goto session_syntax_error;
21477       zName = azCmd[2];
21478       if( zName[0]==0 ) goto session_syntax_error;
21479       for(i=0; i<pAuxDb->nSession; i++){
21480         if( strcmp(pAuxDb->aSession[i].zName,zName)==0 ){
21481           utf8_printf(stderr, "Session \"%s\" already exists\n", zName);
21482           goto meta_command_exit;
21483         }
21484       }
21485       if( pAuxDb->nSession>=ArraySize(pAuxDb->aSession) ){
21486         raw_printf(stderr, "Maximum of %d sessions\n", ArraySize(pAuxDb->aSession));
21487         goto meta_command_exit;
21488       }
21489       pSession = &pAuxDb->aSession[pAuxDb->nSession];
21490       rc = sqlite3session_create(p->db, azCmd[1], &pSession->p);
21491       if( rc ){
21492         raw_printf(stderr, "Cannot open session: error code=%d\n", rc);
21493         rc = 0;
21494         goto meta_command_exit;
21495       }
21496       pSession->nFilter = 0;
21497       sqlite3session_table_filter(pSession->p, session_filter, pSession);
21498       pAuxDb->nSession++;
21499       pSession->zName = sqlite3_mprintf("%s", zName);
21500       shell_check_oom(pSession->zName);
21501     }else
21502     /* If no command name matches, show a syntax error */
21503     session_syntax_error:
21504     showHelp(p->out, "session");
21505   }else
21506 #endif
21507 
21508 #ifdef SQLITE_DEBUG
21509   /* Undocumented commands for internal testing.  Subject to change
21510   ** without notice. */
21511   if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
21512     if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
21513       int i, v;
21514       for(i=1; i<nArg; i++){
21515         v = booleanValue(azArg[i]);
21516         utf8_printf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
21517       }
21518     }
21519     if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
21520       int i; sqlite3_int64 v;
21521       for(i=1; i<nArg; i++){
21522         char zBuf[200];
21523         v = integerValue(azArg[i]);
21524         sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v);
21525         utf8_printf(p->out, "%s", zBuf);
21526       }
21527     }
21528   }else
21529 #endif
21530 
21531   if( c=='s' && n>=4 && strncmp(azArg[0],"selftest",n)==0 ){
21532     int bIsInit = 0;         /* True to initialize the SELFTEST table */
21533     int bVerbose = 0;        /* Verbose output */
21534     int bSelftestExists;     /* True if SELFTEST already exists */
21535     int i, k;                /* Loop counters */
21536     int nTest = 0;           /* Number of tests runs */
21537     int nErr = 0;            /* Number of errors seen */
21538     ShellText str;           /* Answer for a query */
21539     sqlite3_stmt *pStmt = 0; /* Query against the SELFTEST table */
21540 
21541     open_db(p,0);
21542     for(i=1; i<nArg; i++){
21543       const char *z = azArg[i];
21544       if( z[0]=='-' && z[1]=='-' ) z++;
21545       if( strcmp(z,"-init")==0 ){
21546         bIsInit = 1;
21547       }else
21548       if( strcmp(z,"-v")==0 ){
21549         bVerbose++;
21550       }else
21551       {
21552         utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n",
21553                     azArg[i], azArg[0]);
21554         raw_printf(stderr, "Should be one of: --init -v\n");
21555         rc = 1;
21556         goto meta_command_exit;
21557       }
21558     }
21559     if( sqlite3_table_column_metadata(p->db,"main","selftest",0,0,0,0,0,0)
21560            != SQLITE_OK ){
21561       bSelftestExists = 0;
21562     }else{
21563       bSelftestExists = 1;
21564     }
21565     if( bIsInit ){
21566       createSelftestTable(p);
21567       bSelftestExists = 1;
21568     }
21569     initText(&str);
21570     appendText(&str, "x", 0);
21571     for(k=bSelftestExists; k>=0; k--){
21572       if( k==1 ){
21573         rc = sqlite3_prepare_v2(p->db,
21574             "SELECT tno,op,cmd,ans FROM selftest ORDER BY tno",
21575             -1, &pStmt, 0);
21576       }else{
21577         rc = sqlite3_prepare_v2(p->db,
21578           "VALUES(0,'memo','Missing SELFTEST table - default checks only',''),"
21579           "      (1,'run','PRAGMA integrity_check','ok')",
21580           -1, &pStmt, 0);
21581       }
21582       if( rc ){
21583         raw_printf(stderr, "Error querying the selftest table\n");
21584         rc = 1;
21585         sqlite3_finalize(pStmt);
21586         goto meta_command_exit;
21587       }
21588       for(i=1; sqlite3_step(pStmt)==SQLITE_ROW; i++){
21589         int tno = sqlite3_column_int(pStmt, 0);
21590         const char *zOp = (const char*)sqlite3_column_text(pStmt, 1);
21591         const char *zSql = (const char*)sqlite3_column_text(pStmt, 2);
21592         const char *zAns = (const char*)sqlite3_column_text(pStmt, 3);
21593 
21594         if( zOp==0 ) continue;
21595         if( zSql==0 ) continue;
21596         if( zAns==0 ) continue;
21597         k = 0;
21598         if( bVerbose>0 ){
21599           printf("%d: %s %s\n", tno, zOp, zSql);
21600         }
21601         if( strcmp(zOp,"memo")==0 ){
21602           utf8_printf(p->out, "%s\n", zSql);
21603         }else
21604         if( strcmp(zOp,"run")==0 ){
21605           char *zErrMsg = 0;
21606           str.n = 0;
21607           str.z[0] = 0;
21608           rc = sqlite3_exec(p->db, zSql, captureOutputCallback, &str, &zErrMsg);
21609           nTest++;
21610           if( bVerbose ){
21611             utf8_printf(p->out, "Result: %s\n", str.z);
21612           }
21613           if( rc || zErrMsg ){
21614             nErr++;
21615             rc = 1;
21616             utf8_printf(p->out, "%d: error-code-%d: %s\n", tno, rc, zErrMsg);
21617             sqlite3_free(zErrMsg);
21618           }else if( strcmp(zAns,str.z)!=0 ){
21619             nErr++;
21620             rc = 1;
21621             utf8_printf(p->out, "%d: Expected: [%s]\n", tno, zAns);
21622             utf8_printf(p->out, "%d:      Got: [%s]\n", tno, str.z);
21623           }
21624         }else
21625         {
21626           utf8_printf(stderr,
21627             "Unknown operation \"%s\" on selftest line %d\n", zOp, tno);
21628           rc = 1;
21629           break;
21630         }
21631       } /* End loop over rows of content from SELFTEST */
21632       sqlite3_finalize(pStmt);
21633     } /* End loop over k */
21634     freeText(&str);
21635     utf8_printf(p->out, "%d errors out of %d tests\n", nErr, nTest);
21636   }else
21637 
21638   if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){
21639     if( nArg<2 || nArg>3 ){
21640       raw_printf(stderr, "Usage: .separator COL ?ROW?\n");
21641       rc = 1;
21642     }
21643     if( nArg>=2 ){
21644       sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator,
21645                        "%.*s", (int)ArraySize(p->colSeparator)-1, azArg[1]);
21646     }
21647     if( nArg>=3 ){
21648       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator,
21649                        "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]);
21650     }
21651   }else
21652 
21653   if( c=='s' && n>=4 && strncmp(azArg[0],"sha3sum",n)==0 ){
21654     const char *zLike = 0;   /* Which table to checksum. 0 means everything */
21655     int i;                   /* Loop counter */
21656     int bSchema = 0;         /* Also hash the schema */
21657     int bSeparate = 0;       /* Hash each table separately */
21658     int iSize = 224;         /* Hash algorithm to use */
21659     int bDebug = 0;          /* Only show the query that would have run */
21660     sqlite3_stmt *pStmt;     /* For querying tables names */
21661     char *zSql;              /* SQL to be run */
21662     char *zSep;              /* Separator */
21663     ShellText sSql;          /* Complete SQL for the query to run the hash */
21664     ShellText sQuery;        /* Set of queries used to read all content */
21665     open_db(p, 0);
21666     for(i=1; i<nArg; i++){
21667       const char *z = azArg[i];
21668       if( z[0]=='-' ){
21669         z++;
21670         if( z[0]=='-' ) z++;
21671         if( strcmp(z,"schema")==0 ){
21672           bSchema = 1;
21673         }else
21674         if( strcmp(z,"sha3-224")==0 || strcmp(z,"sha3-256")==0
21675          || strcmp(z,"sha3-384")==0 || strcmp(z,"sha3-512")==0
21676         ){
21677           iSize = atoi(&z[5]);
21678         }else
21679         if( strcmp(z,"debug")==0 ){
21680           bDebug = 1;
21681         }else
21682         {
21683           utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n",
21684                       azArg[i], azArg[0]);
21685           showHelp(p->out, azArg[0]);
21686           rc = 1;
21687           goto meta_command_exit;
21688         }
21689       }else if( zLike ){
21690         raw_printf(stderr, "Usage: .sha3sum ?OPTIONS? ?LIKE-PATTERN?\n");
21691         rc = 1;
21692         goto meta_command_exit;
21693       }else{
21694         zLike = z;
21695         bSeparate = 1;
21696         if( sqlite3_strlike("sqlite\\_%", zLike, '\\')==0 ) bSchema = 1;
21697       }
21698     }
21699     if( bSchema ){
21700       zSql = "SELECT lower(name) FROM sqlite_schema"
21701              " WHERE type='table' AND coalesce(rootpage,0)>1"
21702              " UNION ALL SELECT 'sqlite_schema'"
21703              " ORDER BY 1 collate nocase";
21704     }else{
21705       zSql = "SELECT lower(name) FROM sqlite_schema"
21706              " WHERE type='table' AND coalesce(rootpage,0)>1"
21707              " AND name NOT LIKE 'sqlite_%'"
21708              " ORDER BY 1 collate nocase";
21709     }
21710     sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
21711     initText(&sQuery);
21712     initText(&sSql);
21713     appendText(&sSql, "WITH [sha3sum$query](a,b) AS(",0);
21714     zSep = "VALUES(";
21715     while( SQLITE_ROW==sqlite3_step(pStmt) ){
21716       const char *zTab = (const char*)sqlite3_column_text(pStmt,0);
21717       if( zTab==0 ) continue;
21718       if( zLike && sqlite3_strlike(zLike, zTab, 0)!=0 ) continue;
21719       if( strncmp(zTab, "sqlite_",7)!=0 ){
21720         appendText(&sQuery,"SELECT * FROM ", 0);
21721         appendText(&sQuery,zTab,'"');
21722         appendText(&sQuery," NOT INDEXED;", 0);
21723       }else if( strcmp(zTab, "sqlite_schema")==0 ){
21724         appendText(&sQuery,"SELECT type,name,tbl_name,sql FROM sqlite_schema"
21725                            " ORDER BY name;", 0);
21726       }else if( strcmp(zTab, "sqlite_sequence")==0 ){
21727         appendText(&sQuery,"SELECT name,seq FROM sqlite_sequence"
21728                            " ORDER BY name;", 0);
21729       }else if( strcmp(zTab, "sqlite_stat1")==0 ){
21730         appendText(&sQuery,"SELECT tbl,idx,stat FROM sqlite_stat1"
21731                            " ORDER BY tbl,idx;", 0);
21732       }else if( strcmp(zTab, "sqlite_stat4")==0 ){
21733         appendText(&sQuery, "SELECT * FROM ", 0);
21734         appendText(&sQuery, zTab, 0);
21735         appendText(&sQuery, " ORDER BY tbl, idx, rowid;\n", 0);
21736       }
21737       appendText(&sSql, zSep, 0);
21738       appendText(&sSql, sQuery.z, '\'');
21739       sQuery.n = 0;
21740       appendText(&sSql, ",", 0);
21741       appendText(&sSql, zTab, '\'');
21742       zSep = "),(";
21743     }
21744     sqlite3_finalize(pStmt);
21745     if( bSeparate ){
21746       zSql = sqlite3_mprintf(
21747           "%s))"
21748           " SELECT lower(hex(sha3_query(a,%d))) AS hash, b AS label"
21749           "   FROM [sha3sum$query]",
21750           sSql.z, iSize);
21751     }else{
21752       zSql = sqlite3_mprintf(
21753           "%s))"
21754           " SELECT lower(hex(sha3_query(group_concat(a,''),%d))) AS hash"
21755           "   FROM [sha3sum$query]",
21756           sSql.z, iSize);
21757     }
21758     shell_check_oom(zSql);
21759     freeText(&sQuery);
21760     freeText(&sSql);
21761     if( bDebug ){
21762       utf8_printf(p->out, "%s\n", zSql);
21763     }else{
21764       shell_exec(p, zSql, 0);
21765     }
21766     sqlite3_free(zSql);
21767   }else
21768 
21769 #if !defined(SQLITE_NOHAVE_SYSTEM) && !defined(SQLITE_SHELL_WASM_MODE)
21770   if( c=='s'
21771    && (strncmp(azArg[0], "shell", n)==0 || strncmp(azArg[0],"system",n)==0)
21772   ){
21773     char *zCmd;
21774     int i, x;
21775     failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]);
21776     if( nArg<2 ){
21777       raw_printf(stderr, "Usage: .system COMMAND\n");
21778       rc = 1;
21779       goto meta_command_exit;
21780     }
21781     zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]);
21782     for(i=2; i<nArg && zCmd!=0; i++){
21783       zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"",
21784                              zCmd, azArg[i]);
21785     }
21786     x = zCmd!=0 ? system(zCmd) : 1;
21787     sqlite3_free(zCmd);
21788     if( x ) raw_printf(stderr, "System command returns %d\n", x);
21789   }else
21790 #endif /* !defined(SQLITE_NOHAVE_SYSTEM) && !defined(SQLITE_SHELL_WASM_MODE) */
21791 
21792   if( c=='s' && strncmp(azArg[0], "show", n)==0 ){
21793     static const char *azBool[] = { "off", "on", "trigger", "full"};
21794     const char *zOut;
21795     int i;
21796     if( nArg!=1 ){
21797       raw_printf(stderr, "Usage: .show\n");
21798       rc = 1;
21799       goto meta_command_exit;
21800     }
21801     utf8_printf(p->out, "%12.12s: %s\n","echo",
21802                 azBool[ShellHasFlag(p, SHFLG_Echo)]);
21803     utf8_printf(p->out, "%12.12s: %s\n","eqp", azBool[p->autoEQP&3]);
21804     utf8_printf(p->out, "%12.12s: %s\n","explain",
21805          p->mode==MODE_Explain ? "on" : p->autoExplain ? "auto" : "off");
21806     utf8_printf(p->out,"%12.12s: %s\n","headers", azBool[p->showHeader!=0]);
21807     if( p->mode==MODE_Column
21808      || (p->mode>=MODE_Markdown && p->mode<=MODE_Box)
21809     ){
21810       utf8_printf
21811         (p->out, "%12.12s: %s --wrap %d --wordwrap %s --%squote\n", "mode",
21812          modeDescr[p->mode], p->cmOpts.iWrap,
21813          p->cmOpts.bWordWrap ? "on" : "off",
21814          p->cmOpts.bQuote ? "" : "no");
21815     }else{
21816       utf8_printf(p->out, "%12.12s: %s\n","mode", modeDescr[p->mode]);
21817     }
21818     utf8_printf(p->out, "%12.12s: ", "nullvalue");
21819       output_c_string(p->out, p->nullValue);
21820       raw_printf(p->out, "\n");
21821     utf8_printf(p->out,"%12.12s: %s\n","output",
21822             strlen30(p->outfile) ? p->outfile : "stdout");
21823     utf8_printf(p->out,"%12.12s: ", "colseparator");
21824       output_c_string(p->out, p->colSeparator);
21825       raw_printf(p->out, "\n");
21826     utf8_printf(p->out,"%12.12s: ", "rowseparator");
21827       output_c_string(p->out, p->rowSeparator);
21828       raw_printf(p->out, "\n");
21829     switch( p->statsOn ){
21830       case 0:  zOut = "off";     break;
21831       default: zOut = "on";      break;
21832       case 2:  zOut = "stmt";    break;
21833       case 3:  zOut = "vmstep";  break;
21834     }
21835     utf8_printf(p->out, "%12.12s: %s\n","stats", zOut);
21836     utf8_printf(p->out, "%12.12s: ", "width");
21837     for (i=0;i<p->nWidth;i++) {
21838       raw_printf(p->out, "%d ", p->colWidth[i]);
21839     }
21840     raw_printf(p->out, "\n");
21841     utf8_printf(p->out, "%12.12s: %s\n", "filename",
21842                 p->pAuxDb->zDbFilename ? p->pAuxDb->zDbFilename : "");
21843   }else
21844 
21845   if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){
21846     if( nArg==2 ){
21847       if( strcmp(azArg[1],"stmt")==0 ){
21848         p->statsOn = 2;
21849       }else if( strcmp(azArg[1],"vmstep")==0 ){
21850         p->statsOn = 3;
21851       }else{
21852         p->statsOn = (u8)booleanValue(azArg[1]);
21853       }
21854     }else if( nArg==1 ){
21855       display_stats(p->db, p, 0);
21856     }else{
21857       raw_printf(stderr, "Usage: .stats ?on|off|stmt|vmstep?\n");
21858       rc = 1;
21859     }
21860   }else
21861 
21862   if( (c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0)
21863    || (c=='i' && (strncmp(azArg[0], "indices", n)==0
21864                  || strncmp(azArg[0], "indexes", n)==0) )
21865   ){
21866     sqlite3_stmt *pStmt;
21867     char **azResult;
21868     int nRow, nAlloc;
21869     int ii;
21870     ShellText s;
21871     initText(&s);
21872     open_db(p, 0);
21873     rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
21874     if( rc ){
21875       sqlite3_finalize(pStmt);
21876       return shellDatabaseError(p->db);
21877     }
21878 
21879     if( nArg>2 && c=='i' ){
21880       /* It is an historical accident that the .indexes command shows an error
21881       ** when called with the wrong number of arguments whereas the .tables
21882       ** command does not. */
21883       raw_printf(stderr, "Usage: .indexes ?LIKE-PATTERN?\n");
21884       rc = 1;
21885       sqlite3_finalize(pStmt);
21886       goto meta_command_exit;
21887     }
21888     for(ii=0; sqlite3_step(pStmt)==SQLITE_ROW; ii++){
21889       const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
21890       if( zDbName==0 ) continue;
21891       if( s.z && s.z[0] ) appendText(&s, " UNION ALL ", 0);
21892       if( sqlite3_stricmp(zDbName, "main")==0 ){
21893         appendText(&s, "SELECT name FROM ", 0);
21894       }else{
21895         appendText(&s, "SELECT ", 0);
21896         appendText(&s, zDbName, '\'');
21897         appendText(&s, "||'.'||name FROM ", 0);
21898       }
21899       appendText(&s, zDbName, '"');
21900       appendText(&s, ".sqlite_schema ", 0);
21901       if( c=='t' ){
21902         appendText(&s," WHERE type IN ('table','view')"
21903                       "   AND name NOT LIKE 'sqlite_%'"
21904                       "   AND name LIKE ?1", 0);
21905       }else{
21906         appendText(&s," WHERE type='index'"
21907                       "   AND tbl_name LIKE ?1", 0);
21908       }
21909     }
21910     rc = sqlite3_finalize(pStmt);
21911     if( rc==SQLITE_OK ){
21912       appendText(&s, " ORDER BY 1", 0);
21913       rc = sqlite3_prepare_v2(p->db, s.z, -1, &pStmt, 0);
21914     }
21915     freeText(&s);
21916     if( rc ) return shellDatabaseError(p->db);
21917 
21918     /* Run the SQL statement prepared by the above block. Store the results
21919     ** as an array of nul-terminated strings in azResult[].  */
21920     nRow = nAlloc = 0;
21921     azResult = 0;
21922     if( nArg>1 ){
21923       sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
21924     }else{
21925       sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
21926     }
21927     while( sqlite3_step(pStmt)==SQLITE_ROW ){
21928       if( nRow>=nAlloc ){
21929         char **azNew;
21930         int n2 = nAlloc*2 + 10;
21931         azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2);
21932         shell_check_oom(azNew);
21933         nAlloc = n2;
21934         azResult = azNew;
21935       }
21936       azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
21937       shell_check_oom(azResult[nRow]);
21938       nRow++;
21939     }
21940     if( sqlite3_finalize(pStmt)!=SQLITE_OK ){
21941       rc = shellDatabaseError(p->db);
21942     }
21943 
21944     /* Pretty-print the contents of array azResult[] to the output */
21945     if( rc==0 && nRow>0 ){
21946       int len, maxlen = 0;
21947       int i, j;
21948       int nPrintCol, nPrintRow;
21949       for(i=0; i<nRow; i++){
21950         len = strlen30(azResult[i]);
21951         if( len>maxlen ) maxlen = len;
21952       }
21953       nPrintCol = 80/(maxlen+2);
21954       if( nPrintCol<1 ) nPrintCol = 1;
21955       nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
21956       for(i=0; i<nPrintRow; i++){
21957         for(j=i; j<nRow; j+=nPrintRow){
21958           char *zSp = j<nPrintRow ? "" : "  ";
21959           utf8_printf(p->out, "%s%-*s", zSp, maxlen,
21960                       azResult[j] ? azResult[j]:"");
21961         }
21962         raw_printf(p->out, "\n");
21963       }
21964     }
21965 
21966     for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
21967     sqlite3_free(azResult);
21968   }else
21969 
21970 #ifndef SQLITE_SHELL_WASM_MODE
21971   /* Begin redirecting output to the file "testcase-out.txt" */
21972   if( c=='t' && strcmp(azArg[0],"testcase")==0 ){
21973     output_reset(p);
21974     p->out = output_file_open("testcase-out.txt", 0);
21975     if( p->out==0 ){
21976       raw_printf(stderr, "Error: cannot open 'testcase-out.txt'\n");
21977     }
21978     if( nArg>=2 ){
21979       sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "%s", azArg[1]);
21980     }else{
21981       sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "?");
21982     }
21983   }else
21984 #endif /* !defined(SQLITE_SHELL_WASM_MODE) */
21985 
21986 #ifndef SQLITE_UNTESTABLE
21987   if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 ){
21988     static const struct {
21989        const char *zCtrlName;   /* Name of a test-control option */
21990        int ctrlCode;            /* Integer code for that option */
21991        int unSafe;              /* Not valid for --safe mode */
21992        const char *zUsage;      /* Usage notes */
21993     } aCtrl[] = {
21994       { "always",             SQLITE_TESTCTRL_ALWAYS, 1,     "BOOLEAN"         },
21995       { "assert",             SQLITE_TESTCTRL_ASSERT, 1,     "BOOLEAN"         },
21996     /*{ "benign_malloc_hooks",SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS,1, ""        },*/
21997     /*{ "bitvec_test",        SQLITE_TESTCTRL_BITVEC_TEST, 1,  ""              },*/
21998       { "byteorder",          SQLITE_TESTCTRL_BYTEORDER, 0,  ""                },
21999       { "extra_schema_checks",SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS,0,"BOOLEAN"  },
22000     /*{ "fault_install",      SQLITE_TESTCTRL_FAULT_INSTALL, 1,""              },*/
22001       { "imposter",         SQLITE_TESTCTRL_IMPOSTER,1,"SCHEMA ON/OFF ROOTPAGE"},
22002       { "internal_functions", SQLITE_TESTCTRL_INTERNAL_FUNCTIONS,0,""          },
22003       { "localtime_fault",    SQLITE_TESTCTRL_LOCALTIME_FAULT,0,"BOOLEAN"      },
22004       { "never_corrupt",      SQLITE_TESTCTRL_NEVER_CORRUPT,1, "BOOLEAN"       },
22005       { "optimizations",      SQLITE_TESTCTRL_OPTIMIZATIONS,0,"DISABLE-MASK"   },
22006 #ifdef YYCOVERAGE
22007       { "parser_coverage",    SQLITE_TESTCTRL_PARSER_COVERAGE,0,""             },
22008 #endif
22009       { "pending_byte",       SQLITE_TESTCTRL_PENDING_BYTE,0, "OFFSET  "       },
22010       { "prng_restore",       SQLITE_TESTCTRL_PRNG_RESTORE,0, ""               },
22011       { "prng_save",          SQLITE_TESTCTRL_PRNG_SAVE,   0, ""               },
22012       { "prng_seed",          SQLITE_TESTCTRL_PRNG_SEED,   0, "SEED ?db?"      },
22013       { "seek_count",         SQLITE_TESTCTRL_SEEK_COUNT,  0, ""               },
22014       { "sorter_mmap",        SQLITE_TESTCTRL_SORTER_MMAP, 0, "NMAX"           },
22015       { "tune",               SQLITE_TESTCTRL_TUNE,        1, "ID VALUE"       },
22016     };
22017     int testctrl = -1;
22018     int iCtrl = -1;
22019     int rc2 = 0;    /* 0: usage.  1: %d  2: %x  3: no-output */
22020     int isOk = 0;
22021     int i, n2;
22022     const char *zCmd = 0;
22023 
22024     open_db(p, 0);
22025     zCmd = nArg>=2 ? azArg[1] : "help";
22026 
22027     /* The argument can optionally begin with "-" or "--" */
22028     if( zCmd[0]=='-' && zCmd[1] ){
22029       zCmd++;
22030       if( zCmd[0]=='-' && zCmd[1] ) zCmd++;
22031     }
22032 
22033     /* --help lists all test-controls */
22034     if( strcmp(zCmd,"help")==0 ){
22035       utf8_printf(p->out, "Available test-controls:\n");
22036       for(i=0; i<ArraySize(aCtrl); i++){
22037         utf8_printf(p->out, "  .testctrl %s %s\n",
22038                     aCtrl[i].zCtrlName, aCtrl[i].zUsage);
22039       }
22040       rc = 1;
22041       goto meta_command_exit;
22042     }
22043 
22044     /* convert testctrl text option to value. allow any unique prefix
22045     ** of the option name, or a numerical value. */
22046     n2 = strlen30(zCmd);
22047     for(i=0; i<ArraySize(aCtrl); i++){
22048       if( strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){
22049         if( testctrl<0 ){
22050           testctrl = aCtrl[i].ctrlCode;
22051           iCtrl = i;
22052         }else{
22053           utf8_printf(stderr, "Error: ambiguous test-control: \"%s\"\n"
22054                               "Use \".testctrl --help\" for help\n", zCmd);
22055           rc = 1;
22056           goto meta_command_exit;
22057         }
22058       }
22059     }
22060     if( testctrl<0 ){
22061       utf8_printf(stderr,"Error: unknown test-control: %s\n"
22062                          "Use \".testctrl --help\" for help\n", zCmd);
22063     }else if( aCtrl[iCtrl].unSafe && p->bSafeMode ){
22064       utf8_printf(stderr,
22065          "line %d: \".testctrl %s\" may not be used in safe mode\n",
22066          p->lineno, aCtrl[iCtrl].zCtrlName);
22067       exit(1);
22068     }else{
22069       switch(testctrl){
22070 
22071         /* sqlite3_test_control(int, db, int) */
22072         case SQLITE_TESTCTRL_OPTIMIZATIONS:
22073           if( nArg==3 ){
22074             unsigned int opt = (unsigned int)strtol(azArg[2], 0, 0);
22075             rc2 = sqlite3_test_control(testctrl, p->db, opt);
22076             isOk = 3;
22077           }
22078           break;
22079 
22080         /* sqlite3_test_control(int) */
22081         case SQLITE_TESTCTRL_PRNG_SAVE:
22082         case SQLITE_TESTCTRL_PRNG_RESTORE:
22083         case SQLITE_TESTCTRL_BYTEORDER:
22084           if( nArg==2 ){
22085             rc2 = sqlite3_test_control(testctrl);
22086             isOk = testctrl==SQLITE_TESTCTRL_BYTEORDER ? 1 : 3;
22087           }
22088           break;
22089 
22090         /* sqlite3_test_control(int, uint) */
22091         case SQLITE_TESTCTRL_PENDING_BYTE:
22092           if( nArg==3 ){
22093             unsigned int opt = (unsigned int)integerValue(azArg[2]);
22094             rc2 = sqlite3_test_control(testctrl, opt);
22095             isOk = 3;
22096           }
22097           break;
22098 
22099         /* sqlite3_test_control(int, int, sqlite3*) */
22100         case SQLITE_TESTCTRL_PRNG_SEED:
22101           if( nArg==3 || nArg==4 ){
22102             int ii = (int)integerValue(azArg[2]);
22103             sqlite3 *db;
22104             if( ii==0 && strcmp(azArg[2],"random")==0 ){
22105               sqlite3_randomness(sizeof(ii),&ii);
22106               printf("-- random seed: %d\n", ii);
22107             }
22108             if( nArg==3 ){
22109               db = 0;
22110             }else{
22111               db = p->db;
22112               /* Make sure the schema has been loaded */
22113               sqlite3_table_column_metadata(db, 0, "x", 0, 0, 0, 0, 0, 0);
22114             }
22115             rc2 = sqlite3_test_control(testctrl, ii, db);
22116             isOk = 3;
22117           }
22118           break;
22119 
22120         /* sqlite3_test_control(int, int) */
22121         case SQLITE_TESTCTRL_ASSERT:
22122         case SQLITE_TESTCTRL_ALWAYS:
22123           if( nArg==3 ){
22124             int opt = booleanValue(azArg[2]);
22125             rc2 = sqlite3_test_control(testctrl, opt);
22126             isOk = 1;
22127           }
22128           break;
22129 
22130         /* sqlite3_test_control(int, int) */
22131         case SQLITE_TESTCTRL_LOCALTIME_FAULT:
22132         case SQLITE_TESTCTRL_NEVER_CORRUPT:
22133           if( nArg==3 ){
22134             int opt = booleanValue(azArg[2]);
22135             rc2 = sqlite3_test_control(testctrl, opt);
22136             isOk = 3;
22137           }
22138           break;
22139 
22140         /* sqlite3_test_control(sqlite3*) */
22141         case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS:
22142           rc2 = sqlite3_test_control(testctrl, p->db);
22143           isOk = 3;
22144           break;
22145 
22146         case SQLITE_TESTCTRL_IMPOSTER:
22147           if( nArg==5 ){
22148             rc2 = sqlite3_test_control(testctrl, p->db,
22149                           azArg[2],
22150                           integerValue(azArg[3]),
22151                           integerValue(azArg[4]));
22152             isOk = 3;
22153           }
22154           break;
22155 
22156         case SQLITE_TESTCTRL_SEEK_COUNT: {
22157           u64 x = 0;
22158           rc2 = sqlite3_test_control(testctrl, p->db, &x);
22159           utf8_printf(p->out, "%llu\n", x);
22160           isOk = 3;
22161           break;
22162         }
22163 
22164 #ifdef YYCOVERAGE
22165         case SQLITE_TESTCTRL_PARSER_COVERAGE: {
22166           if( nArg==2 ){
22167             sqlite3_test_control(testctrl, p->out);
22168             isOk = 3;
22169           }
22170           break;
22171         }
22172 #endif
22173 #ifdef SQLITE_DEBUG
22174         case SQLITE_TESTCTRL_TUNE: {
22175           if( nArg==4 ){
22176             int id = (int)integerValue(azArg[2]);
22177             int val = (int)integerValue(azArg[3]);
22178             sqlite3_test_control(testctrl, id, &val);
22179             isOk = 3;
22180           }else if( nArg==3 ){
22181             int id = (int)integerValue(azArg[2]);
22182             sqlite3_test_control(testctrl, -id, &rc2);
22183             isOk = 1;
22184           }else if( nArg==2 ){
22185             int id = 1;
22186             while(1){
22187               int val = 0;
22188               rc2 = sqlite3_test_control(testctrl, -id, &val);
22189               if( rc2!=SQLITE_OK ) break;
22190               if( id>1 ) utf8_printf(p->out, "  ");
22191               utf8_printf(p->out, "%d: %d", id, val);
22192               id++;
22193             }
22194             if( id>1 ) utf8_printf(p->out, "\n");
22195             isOk = 3;
22196           }
22197           break;
22198         }
22199 #endif
22200         case SQLITE_TESTCTRL_SORTER_MMAP:
22201           if( nArg==3 ){
22202             int opt = (unsigned int)integerValue(azArg[2]);
22203             rc2 = sqlite3_test_control(testctrl, p->db, opt);
22204             isOk = 3;
22205           }
22206           break;
22207       }
22208     }
22209     if( isOk==0 && iCtrl>=0 ){
22210       utf8_printf(p->out, "Usage: .testctrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage);
22211       rc = 1;
22212     }else if( isOk==1 ){
22213       raw_printf(p->out, "%d\n", rc2);
22214     }else if( isOk==2 ){
22215       raw_printf(p->out, "0x%08x\n", rc2);
22216     }
22217   }else
22218 #endif /* !defined(SQLITE_UNTESTABLE) */
22219 
22220   if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 ){
22221     open_db(p, 0);
22222     sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0);
22223   }else
22224 
22225   if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 ){
22226     if( nArg==2 ){
22227       enableTimer = booleanValue(azArg[1]);
22228       if( enableTimer && !HAS_TIMER ){
22229         raw_printf(stderr, "Error: timer not available on this system.\n");
22230         enableTimer = 0;
22231       }
22232     }else{
22233       raw_printf(stderr, "Usage: .timer on|off\n");
22234       rc = 1;
22235     }
22236   }else
22237 
22238 #ifndef SQLITE_OMIT_TRACE
22239   if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){
22240     int mType = 0;
22241     int jj;
22242     open_db(p, 0);
22243     for(jj=1; jj<nArg; jj++){
22244       const char *z = azArg[jj];
22245       if( z[0]=='-' ){
22246         if( optionMatch(z, "expanded") ){
22247           p->eTraceType = SHELL_TRACE_EXPANDED;
22248         }
22249 #ifdef SQLITE_ENABLE_NORMALIZE
22250         else if( optionMatch(z, "normalized") ){
22251           p->eTraceType = SHELL_TRACE_NORMALIZED;
22252         }
22253 #endif
22254         else if( optionMatch(z, "plain") ){
22255           p->eTraceType = SHELL_TRACE_PLAIN;
22256         }
22257         else if( optionMatch(z, "profile") ){
22258           mType |= SQLITE_TRACE_PROFILE;
22259         }
22260         else if( optionMatch(z, "row") ){
22261           mType |= SQLITE_TRACE_ROW;
22262         }
22263         else if( optionMatch(z, "stmt") ){
22264           mType |= SQLITE_TRACE_STMT;
22265         }
22266         else if( optionMatch(z, "close") ){
22267           mType |= SQLITE_TRACE_CLOSE;
22268         }
22269         else {
22270           raw_printf(stderr, "Unknown option \"%s\" on \".trace\"\n", z);
22271           rc = 1;
22272           goto meta_command_exit;
22273         }
22274       }else{
22275         output_file_close(p->traceOut);
22276         p->traceOut = output_file_open(azArg[1], 0);
22277       }
22278     }
22279     if( p->traceOut==0 ){
22280       sqlite3_trace_v2(p->db, 0, 0, 0);
22281     }else{
22282       if( mType==0 ) mType = SQLITE_TRACE_STMT;
22283       sqlite3_trace_v2(p->db, mType, sql_trace_callback, p);
22284     }
22285   }else
22286 #endif /* !defined(SQLITE_OMIT_TRACE) */
22287 
22288 #if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_VIRTUALTABLE)
22289   if( c=='u' && strncmp(azArg[0], "unmodule", n)==0 ){
22290     int ii;
22291     int lenOpt;
22292     char *zOpt;
22293     if( nArg<2 ){
22294       raw_printf(stderr, "Usage: .unmodule [--allexcept] NAME ...\n");
22295       rc = 1;
22296       goto meta_command_exit;
22297     }
22298     open_db(p, 0);
22299     zOpt = azArg[1];
22300     if( zOpt[0]=='-' && zOpt[1]=='-' && zOpt[2]!=0 ) zOpt++;
22301     lenOpt = (int)strlen(zOpt);
22302     if( lenOpt>=3 && strncmp(zOpt, "-allexcept",lenOpt)==0 ){
22303       assert( azArg[nArg]==0 );
22304       sqlite3_drop_modules(p->db, nArg>2 ? (const char**)(azArg+2) : 0);
22305     }else{
22306       for(ii=1; ii<nArg; ii++){
22307         sqlite3_create_module(p->db, azArg[ii], 0, 0);
22308       }
22309     }
22310   }else
22311 #endif
22312 
22313 #if SQLITE_USER_AUTHENTICATION
22314   if( c=='u' && strncmp(azArg[0], "user", n)==0 ){
22315     if( nArg<2 ){
22316       raw_printf(stderr, "Usage: .user SUBCOMMAND ...\n");
22317       rc = 1;
22318       goto meta_command_exit;
22319     }
22320     open_db(p, 0);
22321     if( strcmp(azArg[1],"login")==0 ){
22322       if( nArg!=4 ){
22323         raw_printf(stderr, "Usage: .user login USER PASSWORD\n");
22324         rc = 1;
22325         goto meta_command_exit;
22326       }
22327       rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3],
22328                                      strlen30(azArg[3]));
22329       if( rc ){
22330         utf8_printf(stderr, "Authentication failed for user %s\n", azArg[2]);
22331         rc = 1;
22332       }
22333     }else if( strcmp(azArg[1],"add")==0 ){
22334       if( nArg!=5 ){
22335         raw_printf(stderr, "Usage: .user add USER PASSWORD ISADMIN\n");
22336         rc = 1;
22337         goto meta_command_exit;
22338       }
22339       rc = sqlite3_user_add(p->db, azArg[2], azArg[3], strlen30(azArg[3]),
22340                             booleanValue(azArg[4]));
22341       if( rc ){
22342         raw_printf(stderr, "User-Add failed: %d\n", rc);
22343         rc = 1;
22344       }
22345     }else if( strcmp(azArg[1],"edit")==0 ){
22346       if( nArg!=5 ){
22347         raw_printf(stderr, "Usage: .user edit USER PASSWORD ISADMIN\n");
22348         rc = 1;
22349         goto meta_command_exit;
22350       }
22351       rc = sqlite3_user_change(p->db, azArg[2], azArg[3], strlen30(azArg[3]),
22352                               booleanValue(azArg[4]));
22353       if( rc ){
22354         raw_printf(stderr, "User-Edit failed: %d\n", rc);
22355         rc = 1;
22356       }
22357     }else if( strcmp(azArg[1],"delete")==0 ){
22358       if( nArg!=3 ){
22359         raw_printf(stderr, "Usage: .user delete USER\n");
22360         rc = 1;
22361         goto meta_command_exit;
22362       }
22363       rc = sqlite3_user_delete(p->db, azArg[2]);
22364       if( rc ){
22365         raw_printf(stderr, "User-Delete failed: %d\n", rc);
22366         rc = 1;
22367       }
22368     }else{
22369       raw_printf(stderr, "Usage: .user login|add|edit|delete ...\n");
22370       rc = 1;
22371       goto meta_command_exit;
22372     }
22373   }else
22374 #endif /* SQLITE_USER_AUTHENTICATION */
22375 
22376   if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
22377     utf8_printf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
22378         sqlite3_libversion(), sqlite3_sourceid());
22379 #if SQLITE_HAVE_ZLIB
22380     utf8_printf(p->out, "zlib version %s\n", zlibVersion());
22381 #endif
22382 #define CTIMEOPT_VAL_(opt) #opt
22383 #define CTIMEOPT_VAL(opt) CTIMEOPT_VAL_(opt)
22384 #if defined(__clang__) && defined(__clang_major__)
22385     utf8_printf(p->out, "clang-" CTIMEOPT_VAL(__clang_major__) "."
22386                     CTIMEOPT_VAL(__clang_minor__) "."
22387                     CTIMEOPT_VAL(__clang_patchlevel__) "\n");
22388 #elif defined(_MSC_VER)
22389     utf8_printf(p->out, "msvc-" CTIMEOPT_VAL(_MSC_VER) "\n");
22390 #elif defined(__GNUC__) && defined(__VERSION__)
22391     utf8_printf(p->out, "gcc-" __VERSION__ "\n");
22392 #endif
22393   }else
22394 
22395   if( c=='v' && strncmp(azArg[0], "vfsinfo", n)==0 ){
22396     const char *zDbName = nArg==2 ? azArg[1] : "main";
22397     sqlite3_vfs *pVfs = 0;
22398     if( p->db ){
22399       sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFS_POINTER, &pVfs);
22400       if( pVfs ){
22401         utf8_printf(p->out, "vfs.zName      = \"%s\"\n", pVfs->zName);
22402         raw_printf(p->out, "vfs.iVersion   = %d\n", pVfs->iVersion);
22403         raw_printf(p->out, "vfs.szOsFile   = %d\n", pVfs->szOsFile);
22404         raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
22405       }
22406     }
22407   }else
22408 
22409   if( c=='v' && strncmp(azArg[0], "vfslist", n)==0 ){
22410     sqlite3_vfs *pVfs;
22411     sqlite3_vfs *pCurrent = 0;
22412     if( p->db ){
22413       sqlite3_file_control(p->db, "main", SQLITE_FCNTL_VFS_POINTER, &pCurrent);
22414     }
22415     for(pVfs=sqlite3_vfs_find(0); pVfs; pVfs=pVfs->pNext){
22416       utf8_printf(p->out, "vfs.zName      = \"%s\"%s\n", pVfs->zName,
22417            pVfs==pCurrent ? "  <--- CURRENT" : "");
22418       raw_printf(p->out, "vfs.iVersion   = %d\n", pVfs->iVersion);
22419       raw_printf(p->out, "vfs.szOsFile   = %d\n", pVfs->szOsFile);
22420       raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
22421       if( pVfs->pNext ){
22422         raw_printf(p->out, "-----------------------------------\n");
22423       }
22424     }
22425   }else
22426 
22427   if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
22428     const char *zDbName = nArg==2 ? azArg[1] : "main";
22429     char *zVfsName = 0;
22430     if( p->db ){
22431       sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
22432       if( zVfsName ){
22433         utf8_printf(p->out, "%s\n", zVfsName);
22434         sqlite3_free(zVfsName);
22435       }
22436     }
22437   }else
22438 
22439   if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
22440     unsigned int x = nArg>=2 ? (unsigned int)integerValue(azArg[1]) : 0xffffffff;
22441     sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &x);
22442   }else
22443 
22444   if( c=='w' && strncmp(azArg[0], "width", n)==0 ){
22445     int j;
22446     assert( nArg<=ArraySize(azArg) );
22447     p->nWidth = nArg-1;
22448     p->colWidth = realloc(p->colWidth, (p->nWidth+1)*sizeof(int)*2);
22449     if( p->colWidth==0 && p->nWidth>0 ) shell_out_of_memory();
22450     if( p->nWidth ) p->actualWidth = &p->colWidth[p->nWidth];
22451     for(j=1; j<nArg; j++){
22452       p->colWidth[j-1] = (int)integerValue(azArg[j]);
22453     }
22454   }else
22455 
22456   {
22457     utf8_printf(stderr, "Error: unknown command or invalid arguments: "
22458       " \"%s\". Enter \".help\" for help\n", azArg[0]);
22459     rc = 1;
22460   }
22461 
22462 meta_command_exit:
22463   if( p->outCount ){
22464     p->outCount--;
22465     if( p->outCount==0 ) output_reset(p);
22466   }
22467   p->bSafeMode = p->bSafeModePersist;
22468   return rc;
22469 }
22470 
22471 /* Line scan result and intermediate states (supporting scan resumption)
22472 */
22473 #ifndef CHAR_BIT
22474 # define CHAR_BIT 8
22475 #endif
22476 typedef enum {
22477   QSS_HasDark = 1<<CHAR_BIT, QSS_EndingSemi = 2<<CHAR_BIT,
22478   QSS_CharMask = (1<<CHAR_BIT)-1, QSS_ScanMask = 3<<CHAR_BIT,
22479   QSS_Start = 0
22480 } QuickScanState;
22481 #define QSS_SETV(qss, newst) ((newst) | ((qss) & QSS_ScanMask))
22482 #define QSS_INPLAIN(qss) (((qss)&QSS_CharMask)==QSS_Start)
22483 #define QSS_PLAINWHITE(qss) (((qss)&~QSS_EndingSemi)==QSS_Start)
22484 #define QSS_PLAINDARK(qss) (((qss)&~QSS_EndingSemi)==QSS_HasDark)
22485 #define QSS_SEMITERM(qss) (((qss)&~QSS_HasDark)==QSS_EndingSemi)
22486 
22487 /*
22488 ** Scan line for classification to guide shell's handling.
22489 ** The scan is resumable for subsequent lines when prior
22490 ** return values are passed as the 2nd argument.
22491 */
22492 static QuickScanState quickscan(char *zLine, QuickScanState qss){
22493   char cin;
22494   char cWait = (char)qss; /* intentional narrowing loss */
22495   if( cWait==0 ){
22496   PlainScan:
22497     assert( cWait==0 );
22498     while( (cin = *zLine++)!=0 ){
22499       if( IsSpace(cin) )
22500         continue;
22501       switch (cin){
22502       case '-':
22503         if( *zLine!='-' )
22504           break;
22505         while((cin = *++zLine)!=0 )
22506           if( cin=='\n')
22507             goto PlainScan;
22508         return qss;
22509       case ';':
22510         qss |= QSS_EndingSemi;
22511         continue;
22512       case '/':
22513         if( *zLine=='*' ){
22514           ++zLine;
22515           cWait = '*';
22516           qss = QSS_SETV(qss, cWait);
22517           goto TermScan;
22518         }
22519         break;
22520       case '[':
22521         cin = ']';
22522         /* fall thru */
22523       case '`': case '\'': case '"':
22524         cWait = cin;
22525         qss = QSS_HasDark | cWait;
22526         goto TermScan;
22527       default:
22528         break;
22529       }
22530       qss = (qss & ~QSS_EndingSemi) | QSS_HasDark;
22531     }
22532   }else{
22533   TermScan:
22534     while( (cin = *zLine++)!=0 ){
22535       if( cin==cWait ){
22536         switch( cWait ){
22537         case '*':
22538           if( *zLine != '/' )
22539             continue;
22540           ++zLine;
22541           cWait = 0;
22542           qss = QSS_SETV(qss, 0);
22543           goto PlainScan;
22544         case '`': case '\'': case '"':
22545           if(*zLine==cWait){
22546             ++zLine;
22547             continue;
22548           }
22549           /* fall thru */
22550         case ']':
22551           cWait = 0;
22552           qss = QSS_SETV(qss, 0);
22553           goto PlainScan;
22554         default: assert(0);
22555         }
22556       }
22557     }
22558   }
22559   return qss;
22560 }
22561 
22562 /*
22563 ** Return TRUE if the line typed in is an SQL command terminator other
22564 ** than a semi-colon.  The SQL Server style "go" command is understood
22565 ** as is the Oracle "/".
22566 */
22567 static int line_is_command_terminator(char *zLine){
22568   while( IsSpace(zLine[0]) ){ zLine++; };
22569   if( zLine[0]=='/' )
22570     zLine += 1; /* Oracle */
22571   else if ( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o' )
22572     zLine += 2; /* SQL Server */
22573   else
22574     return 0;
22575   return quickscan(zLine, QSS_Start)==QSS_Start;
22576 }
22577 
22578 /*
22579 ** We need a default sqlite3_complete() implementation to use in case
22580 ** the shell is compiled with SQLITE_OMIT_COMPLETE.  The default assumes
22581 ** any arbitrary text is a complete SQL statement.  This is not very
22582 ** user-friendly, but it does seem to work.
22583 */
22584 #ifdef SQLITE_OMIT_COMPLETE
22585 #define sqlite3_complete(x) 1
22586 #endif
22587 
22588 /*
22589 ** Return true if zSql is a complete SQL statement.  Return false if it
22590 ** ends in the middle of a string literal or C-style comment.
22591 */
22592 static int line_is_complete(char *zSql, int nSql){
22593   int rc;
22594   if( zSql==0 ) return 1;
22595   zSql[nSql] = ';';
22596   zSql[nSql+1] = 0;
22597   rc = sqlite3_complete(zSql);
22598   zSql[nSql] = 0;
22599   return rc;
22600 }
22601 
22602 /*
22603 ** Run a single line of SQL.  Return the number of errors.
22604 */
22605 static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){
22606   int rc;
22607   char *zErrMsg = 0;
22608 
22609   open_db(p, 0);
22610   if( ShellHasFlag(p,SHFLG_Backslash) ) resolve_backslashes(zSql);
22611   if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0;
22612   BEGIN_TIMER;
22613   rc = shell_exec(p, zSql, &zErrMsg);
22614   END_TIMER;
22615   if( rc || zErrMsg ){
22616     char zPrefix[100];
22617     const char *zErrorTail;
22618     const char *zErrorType;
22619     if( zErrMsg==0 ){
22620       zErrorType = "Error";
22621       zErrorTail = sqlite3_errmsg(p->db);
22622     }else if( strncmp(zErrMsg, "in prepare, ",12)==0 ){
22623       zErrorType = "Parse error";
22624       zErrorTail = &zErrMsg[12];
22625     }else if( strncmp(zErrMsg, "stepping, ", 10)==0 ){
22626       zErrorType = "Runtime error";
22627       zErrorTail = &zErrMsg[10];
22628     }else{
22629       zErrorType = "Error";
22630       zErrorTail = zErrMsg;
22631     }
22632     if( in!=0 || !stdin_is_interactive ){
22633       sqlite3_snprintf(sizeof(zPrefix), zPrefix,
22634                        "%s near line %d:", zErrorType, startline);
22635     }else{
22636       sqlite3_snprintf(sizeof(zPrefix), zPrefix, "%s:", zErrorType);
22637     }
22638     utf8_printf(stderr, "%s %s\n", zPrefix, zErrorTail);
22639     sqlite3_free(zErrMsg);
22640     zErrMsg = 0;
22641     return 1;
22642   }else if( ShellHasFlag(p, SHFLG_CountChanges) ){
22643     char zLineBuf[2000];
22644     sqlite3_snprintf(sizeof(zLineBuf), zLineBuf,
22645             "changes: %lld   total_changes: %lld",
22646             sqlite3_changes64(p->db), sqlite3_total_changes64(p->db));
22647     raw_printf(p->out, "%s\n", zLineBuf);
22648   }
22649   return 0;
22650 }
22651 
22652 static void echo_group_input(ShellState *p, const char *zDo){
22653   if( ShellHasFlag(p, SHFLG_Echo) ) utf8_printf(p->out, "%s\n", zDo);
22654 }
22655 
22656 #ifdef SQLITE_SHELL_WASM_MODE
22657 /*
22658 ** Alternate one_input_line() impl for wasm mode. This is not in the primary impl
22659 ** because we need the global shellState and cannot access it from that function
22660 ** without moving lots of code around (creating a larger/messier diff).
22661 */
22662 static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
22663   /* Parse the next line from shellState.wasm.zInput. */
22664   const char *zBegin = shellState.wasm.zPos;
22665   const char *z = zBegin;
22666   char *zLine = 0;
22667   int nZ = 0;
22668 
22669   UNUSED_PARAMETER(in);
22670   UNUSED_PARAMETER(isContinuation);
22671   if(!z || !*z){
22672     return 0;
22673   }
22674   while(*z && isspace(*z)) ++z;
22675   zBegin = z;
22676   for(; *z && '\n'!=*z; ++nZ, ++z){}
22677   if(nZ>0 && '\r'==zBegin[nZ-1]){
22678     --nZ;
22679   }
22680   shellState.wasm.zPos = z;
22681   zLine = realloc(zPrior, nZ+1);
22682   shell_check_oom(zLine);
22683   memcpy(zLine, zBegin, (size_t)nZ);
22684   zLine[nZ] = 0;
22685   return zLine;
22686 }
22687 #endif /* SQLITE_SHELL_WASM_MODE */
22688 
22689 /*
22690 ** Read input from *in and process it.  If *in==0 then input
22691 ** is interactive - the user is typing it it.  Otherwise, input
22692 ** is coming from a file or device.  A prompt is issued and history
22693 ** is saved only if input is interactive.  An interrupt signal will
22694 ** cause this routine to exit immediately, unless input is interactive.
22695 **
22696 ** Return the number of errors.
22697 */
22698 static int process_input(ShellState *p){
22699   char *zLine = 0;          /* A single input line */
22700   char *zSql = 0;           /* Accumulated SQL text */
22701   int nLine;                /* Length of current line */
22702   int nSql = 0;             /* Bytes of zSql[] used */
22703   int nAlloc = 0;           /* Allocated zSql[] space */
22704   int rc;                   /* Error code */
22705   int errCnt = 0;           /* Number of errors seen */
22706   int startline = 0;        /* Line number for start of current input */
22707   QuickScanState qss = QSS_Start; /* Accumulated line status (so far) */
22708 
22709   if( p->inputNesting==MAX_INPUT_NESTING ){
22710     /* This will be more informative in a later version. */
22711     utf8_printf(stderr,"Input nesting limit (%d) reached at line %d."
22712                 " Check recursion.\n", MAX_INPUT_NESTING, p->lineno);
22713     return 1;
22714   }
22715   ++p->inputNesting;
22716   p->lineno = 0;
22717   while( errCnt==0 || !bail_on_error || (p->in==0 && stdin_is_interactive) ){
22718     fflush(p->out);
22719     zLine = one_input_line(p->in, zLine, nSql>0);
22720     if( zLine==0 ){
22721       /* End of input */
22722       if( p->in==0 && stdin_is_interactive ) printf("\n");
22723       break;
22724     }
22725     if( seenInterrupt ){
22726       if( p->in!=0 ) break;
22727       seenInterrupt = 0;
22728     }
22729     p->lineno++;
22730     if( QSS_INPLAIN(qss)
22731         && line_is_command_terminator(zLine)
22732         && line_is_complete(zSql, nSql) ){
22733       memcpy(zLine,";",2);
22734     }
22735     qss = quickscan(zLine, qss);
22736     if( QSS_PLAINWHITE(qss) && nSql==0 ){
22737       /* Just swallow single-line whitespace */
22738       echo_group_input(p, zLine);
22739       qss = QSS_Start;
22740       continue;
22741     }
22742     if( zLine && (zLine[0]=='.' || zLine[0]=='#') && nSql==0 ){
22743       echo_group_input(p, zLine);
22744       if( zLine[0]=='.' ){
22745         rc = do_meta_command(zLine, p);
22746         if( rc==2 ){ /* exit requested */
22747           break;
22748         }else if( rc ){
22749           errCnt++;
22750         }
22751       }
22752       qss = QSS_Start;
22753       continue;
22754     }
22755     /* No single-line dispositions remain; accumulate line(s). */
22756     nLine = strlen30(zLine);
22757     if( nSql+nLine+2>=nAlloc ){
22758       /* Grow buffer by half-again increments when big. */
22759       nAlloc = nSql+(nSql>>1)+nLine+100;
22760       zSql = realloc(zSql, nAlloc);
22761       shell_check_oom(zSql);
22762     }
22763     if( nSql==0 ){
22764       int i;
22765       for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
22766       assert( nAlloc>0 && zSql!=0 );
22767       memcpy(zSql, zLine+i, nLine+1-i);
22768       startline = p->lineno;
22769       nSql = nLine-i;
22770     }else{
22771       zSql[nSql++] = '\n';
22772       memcpy(zSql+nSql, zLine, nLine+1);
22773       nSql += nLine;
22774     }
22775     if( nSql && QSS_SEMITERM(qss) && sqlite3_complete(zSql) ){
22776       echo_group_input(p, zSql);
22777       errCnt += runOneSqlLine(p, zSql, p->in, startline);
22778       nSql = 0;
22779       if( p->outCount ){
22780         output_reset(p);
22781         p->outCount = 0;
22782       }else{
22783         clearTempFile(p);
22784       }
22785       p->bSafeMode = p->bSafeModePersist;
22786       qss = QSS_Start;
22787     }else if( nSql && QSS_PLAINWHITE(qss) ){
22788       echo_group_input(p, zSql);
22789       nSql = 0;
22790       qss = QSS_Start;
22791     }
22792   }
22793   if( nSql ){
22794     /* This may be incomplete. Let the SQL parser deal with that. */
22795     echo_group_input(p, zSql);
22796     errCnt += runOneSqlLine(p, zSql, p->in, startline);
22797   }
22798   free(zSql);
22799   free(zLine);
22800   --p->inputNesting;
22801   return errCnt>0;
22802 }
22803 
22804 /*
22805 ** Return a pathname which is the user's home directory.  A
22806 ** 0 return indicates an error of some kind.
22807 */
22808 static char *find_home_dir(int clearFlag){
22809   static char *home_dir = NULL;
22810   if( clearFlag ){
22811     free(home_dir);
22812     home_dir = 0;
22813     return 0;
22814   }
22815   if( home_dir ) return home_dir;
22816 
22817 #if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) \
22818      && !defined(__RTP__) && !defined(_WRS_KERNEL)
22819   {
22820     struct passwd *pwent;
22821     uid_t uid = getuid();
22822     if( (pwent=getpwuid(uid)) != NULL) {
22823       home_dir = pwent->pw_dir;
22824     }
22825   }
22826 #endif
22827 
22828 #if defined(_WIN32_WCE)
22829   /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
22830    */
22831   home_dir = "/";
22832 #else
22833 
22834 #if defined(_WIN32) || defined(WIN32)
22835   if (!home_dir) {
22836     home_dir = getenv("USERPROFILE");
22837   }
22838 #endif
22839 
22840   if (!home_dir) {
22841     home_dir = getenv("HOME");
22842   }
22843 
22844 #if defined(_WIN32) || defined(WIN32)
22845   if (!home_dir) {
22846     char *zDrive, *zPath;
22847     int n;
22848     zDrive = getenv("HOMEDRIVE");
22849     zPath = getenv("HOMEPATH");
22850     if( zDrive && zPath ){
22851       n = strlen30(zDrive) + strlen30(zPath) + 1;
22852       home_dir = malloc( n );
22853       if( home_dir==0 ) return 0;
22854       sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
22855       return home_dir;
22856     }
22857     home_dir = "c:\\";
22858   }
22859 #endif
22860 
22861 #endif /* !_WIN32_WCE */
22862 
22863   if( home_dir ){
22864     int n = strlen30(home_dir) + 1;
22865     char *z = malloc( n );
22866     if( z ) memcpy(z, home_dir, n);
22867     home_dir = z;
22868   }
22869 
22870   return home_dir;
22871 }
22872 
22873 /*
22874 ** Read input from the file given by sqliterc_override.  Or if that
22875 ** parameter is NULL, take input from ~/.sqliterc
22876 **
22877 ** Returns the number of errors.
22878 */
22879 static void process_sqliterc(
22880   ShellState *p,                  /* Configuration data */
22881   const char *sqliterc_override   /* Name of config file. NULL to use default */
22882 ){
22883   char *home_dir = NULL;
22884   const char *sqliterc = sqliterc_override;
22885   char *zBuf = 0;
22886   FILE *inSaved = p->in;
22887   int savedLineno = p->lineno;
22888 
22889   if (sqliterc == NULL) {
22890     home_dir = find_home_dir(0);
22891     if( home_dir==0 ){
22892       raw_printf(stderr, "-- warning: cannot find home directory;"
22893                       " cannot read ~/.sqliterc\n");
22894       return;
22895     }
22896     zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
22897     shell_check_oom(zBuf);
22898     sqliterc = zBuf;
22899   }
22900   p->in = fopen(sqliterc,"rb");
22901   if( p->in ){
22902     if( stdin_is_interactive ){
22903       utf8_printf(stderr,"-- Loading resources from %s\n",sqliterc);
22904     }
22905     if( process_input(p) && bail_on_error ) exit(1);
22906     fclose(p->in);
22907   }else if( sqliterc_override!=0 ){
22908     utf8_printf(stderr,"cannot open: \"%s\"\n", sqliterc);
22909     if( bail_on_error ) exit(1);
22910   }
22911   p->in = inSaved;
22912   p->lineno = savedLineno;
22913   sqlite3_free(zBuf);
22914 }
22915 
22916 /*
22917 ** Show available command line options
22918 */
22919 static const char zOptions[] =
22920 #if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE)
22921   "   -A ARGS...           run \".archive ARGS\" and exit\n"
22922 #endif
22923   "   -append              append the database to the end of the file\n"
22924   "   -ascii               set output mode to 'ascii'\n"
22925   "   -bail                stop after hitting an error\n"
22926   "   -batch               force batch I/O\n"
22927   "   -box                 set output mode to 'box'\n"
22928   "   -column              set output mode to 'column'\n"
22929   "   -cmd COMMAND         run \"COMMAND\" before reading stdin\n"
22930   "   -csv                 set output mode to 'csv'\n"
22931 #if !defined(SQLITE_OMIT_DESERIALIZE)
22932   "   -deserialize         open the database using sqlite3_deserialize()\n"
22933 #endif
22934   "   -echo                print inputs before execution\n"
22935   "   -init FILENAME       read/process named file\n"
22936   "   -[no]header          turn headers on or off\n"
22937 #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
22938   "   -heap SIZE           Size of heap for memsys3 or memsys5\n"
22939 #endif
22940   "   -help                show this message\n"
22941   "   -html                set output mode to HTML\n"
22942   "   -interactive         force interactive I/O\n"
22943   "   -json                set output mode to 'json'\n"
22944   "   -line                set output mode to 'line'\n"
22945   "   -list                set output mode to 'list'\n"
22946   "   -lookaside SIZE N    use N entries of SZ bytes for lookaside memory\n"
22947   "   -markdown            set output mode to 'markdown'\n"
22948 #if !defined(SQLITE_OMIT_DESERIALIZE)
22949   "   -maxsize N           maximum size for a --deserialize database\n"
22950 #endif
22951   "   -memtrace            trace all memory allocations and deallocations\n"
22952   "   -mmap N              default mmap size set to N\n"
22953 #ifdef SQLITE_ENABLE_MULTIPLEX
22954   "   -multiplex           enable the multiplexor VFS\n"
22955 #endif
22956   "   -newline SEP         set output row separator. Default: '\\n'\n"
22957   "   -nofollow            refuse to open symbolic links to database files\n"
22958   "   -nonce STRING        set the safe-mode escape nonce\n"
22959   "   -nullvalue TEXT      set text string for NULL values. Default ''\n"
22960   "   -pagecache SIZE N    use N slots of SZ bytes each for page cache memory\n"
22961   "   -quote               set output mode to 'quote'\n"
22962   "   -readonly            open the database read-only\n"
22963   "   -safe                enable safe-mode\n"
22964   "   -separator SEP       set output column separator. Default: '|'\n"
22965 #ifdef SQLITE_ENABLE_SORTER_REFERENCES
22966   "   -sorterref SIZE      sorter references threshold size\n"
22967 #endif
22968   "   -stats               print memory stats before each finalize\n"
22969   "   -table               set output mode to 'table'\n"
22970   "   -tabs                set output mode to 'tabs'\n"
22971   "   -version             show SQLite version\n"
22972   "   -vfs NAME            use NAME as the default VFS\n"
22973 #ifdef SQLITE_ENABLE_VFSTRACE
22974   "   -vfstrace            enable tracing of all VFS calls\n"
22975 #endif
22976 #ifdef SQLITE_HAVE_ZLIB
22977   "   -zip                 open the file as a ZIP Archive\n"
22978 #endif
22979 ;
22980 static void usage(int showDetail){
22981   utf8_printf(stderr,
22982       "Usage: %s [OPTIONS] FILENAME [SQL]\n"
22983       "FILENAME is the name of an SQLite database. A new database is created\n"
22984       "if the file does not previously exist.\n", Argv0);
22985   if( showDetail ){
22986     utf8_printf(stderr, "OPTIONS include:\n%s", zOptions);
22987   }else{
22988     raw_printf(stderr, "Use the -help option for additional information\n");
22989   }
22990   exit(1);
22991 }
22992 
22993 /*
22994 ** Internal check:  Verify that the SQLite is uninitialized.  Print a
22995 ** error message if it is initialized.
22996 */
22997 static void verify_uninitialized(void){
22998   if( sqlite3_config(-1)==SQLITE_MISUSE ){
22999     utf8_printf(stdout, "WARNING: attempt to configure SQLite after"
23000                         " initialization.\n");
23001   }
23002 }
23003 
23004 /*
23005 ** Initialize the state information in data
23006 */
23007 static void main_init(ShellState *data) {
23008   memset(data, 0, sizeof(*data));
23009   data->normalMode = data->cMode = data->mode = MODE_List;
23010   data->autoExplain = 1;
23011   data->pAuxDb = &data->aAuxDb[0];
23012   memcpy(data->colSeparator,SEP_Column, 2);
23013   memcpy(data->rowSeparator,SEP_Row, 2);
23014   data->showHeader = 0;
23015   data->shellFlgs = SHFLG_Lookaside;
23016   verify_uninitialized();
23017   sqlite3_config(SQLITE_CONFIG_URI, 1);
23018   sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
23019   sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
23020   sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
23021   sqlite3_snprintf(sizeof(continuePrompt), continuePrompt,"   ...> ");
23022 }
23023 
23024 /*
23025 ** Output text to the console in a font that attracts extra attention.
23026 */
23027 #ifdef _WIN32
23028 static void printBold(const char *zText){
23029 #if !SQLITE_OS_WINRT
23030   HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
23031   CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
23032   GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
23033   SetConsoleTextAttribute(out,
23034          FOREGROUND_RED|FOREGROUND_INTENSITY
23035   );
23036 #endif
23037   printf("%s", zText);
23038 #if !SQLITE_OS_WINRT
23039   SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
23040 #endif
23041 }
23042 #else
23043 static void printBold(const char *zText){
23044   printf("\033[1m%s\033[0m", zText);
23045 }
23046 #endif
23047 
23048 /*
23049 ** Get the argument to an --option.  Throw an error and die if no argument
23050 ** is available.
23051 */
23052 static char *cmdline_option_value(int argc, char **argv, int i){
23053   if( i==argc ){
23054     utf8_printf(stderr, "%s: Error: missing argument to %s\n",
23055             argv[0], argv[argc-1]);
23056     exit(1);
23057   }
23058   return argv[i];
23059 }
23060 
23061 #ifndef SQLITE_SHELL_IS_UTF8
23062 #  if (defined(_WIN32) || defined(WIN32)) \
23063    && (defined(_MSC_VER) || (defined(UNICODE) && defined(__GNUC__)))
23064 #    define SQLITE_SHELL_IS_UTF8          (0)
23065 #  else
23066 #    define SQLITE_SHELL_IS_UTF8          (1)
23067 #  endif
23068 #endif
23069 
23070 #ifdef SQLITE_SHELL_WASM_MODE
23071 #  define main fiddle_main
23072 #endif
23073 
23074 #if SQLITE_SHELL_IS_UTF8
23075 int SQLITE_CDECL main(int argc, char **argv){
23076 #else
23077 int SQLITE_CDECL wmain(int argc, wchar_t **wargv){
23078   char **argv;
23079 #endif
23080 #ifdef SQLITE_DEBUG
23081   sqlite3_int64 mem_main_enter = sqlite3_memory_used();
23082 #endif
23083   char *zErrMsg = 0;
23084 #ifdef SQLITE_SHELL_WASM_MODE
23085 #  define data shellState
23086 #else
23087   ShellState data;
23088 #endif
23089   const char *zInitFile = 0;
23090   int i;
23091   int rc = 0;
23092   int warnInmemoryDb = 0;
23093   int readStdin = 1;
23094   int nCmd = 0;
23095   char **azCmd = 0;
23096   const char *zVfs = 0;           /* Value of -vfs command-line option */
23097 #if !SQLITE_SHELL_IS_UTF8
23098   char **argvToFree = 0;
23099   int argcToFree = 0;
23100 #endif
23101 
23102   setBinaryMode(stdin, 0);
23103   setvbuf(stderr, 0, _IONBF, 0); /* Make sure stderr is unbuffered */
23104 #ifdef SQLITE_SHELL_WASM_MODE
23105   stdin_is_interactive = 0;
23106   stdout_is_console = 1;
23107 #else
23108   stdin_is_interactive = isatty(0);
23109   stdout_is_console = isatty(1);
23110 #endif
23111 
23112 #if !defined(_WIN32_WCE)
23113   if( getenv("SQLITE_DEBUG_BREAK") ){
23114     if( isatty(0) && isatty(2) ){
23115       fprintf(stderr,
23116           "attach debugger to process %d and press any key to continue.\n",
23117           GETPID());
23118       fgetc(stdin);
23119     }else{
23120 #if defined(_WIN32) || defined(WIN32)
23121 #if SQLITE_OS_WINRT
23122       __debugbreak();
23123 #else
23124       DebugBreak();
23125 #endif
23126 #elif defined(SIGTRAP)
23127       raise(SIGTRAP);
23128 #endif
23129     }
23130   }
23131 #endif
23132 
23133 #if USE_SYSTEM_SQLITE+0!=1
23134   if( strncmp(sqlite3_sourceid(),SQLITE_SOURCE_ID,60)!=0 ){
23135     utf8_printf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
23136             sqlite3_sourceid(), SQLITE_SOURCE_ID);
23137     exit(1);
23138   }
23139 #endif
23140   main_init(&data);
23141 
23142   /* On Windows, we must translate command-line arguments into UTF-8.
23143   ** The SQLite memory allocator subsystem has to be enabled in order to
23144   ** do this.  But we want to run an sqlite3_shutdown() afterwards so that
23145   ** subsequent sqlite3_config() calls will work.  So copy all results into
23146   ** memory that does not come from the SQLite memory allocator.
23147   */
23148 #if !SQLITE_SHELL_IS_UTF8
23149   sqlite3_initialize();
23150   argvToFree = malloc(sizeof(argv[0])*argc*2);
23151   shell_check_oom(argvToFree);
23152   argcToFree = argc;
23153   argv = argvToFree + argc;
23154   for(i=0; i<argc; i++){
23155     char *z = sqlite3_win32_unicode_to_utf8(wargv[i]);
23156     int n;
23157     shell_check_oom(z);
23158     n = (int)strlen(z);
23159     argv[i] = malloc( n+1 );
23160     shell_check_oom(argv[i]);
23161     memcpy(argv[i], z, n+1);
23162     argvToFree[i] = argv[i];
23163     sqlite3_free(z);
23164   }
23165   sqlite3_shutdown();
23166 #endif
23167 
23168   assert( argc>=1 && argv && argv[0] );
23169   Argv0 = argv[0];
23170 
23171   /* Make sure we have a valid signal handler early, before anything
23172   ** else is done.
23173   */
23174 #ifdef SIGINT
23175   signal(SIGINT, interrupt_handler);
23176 #elif (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE)
23177   SetConsoleCtrlHandler(ConsoleCtrlHandler, TRUE);
23178 #endif
23179 
23180 #ifdef SQLITE_SHELL_DBNAME_PROC
23181   {
23182     /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name
23183     ** of a C-function that will provide the name of the database file.  Use
23184     ** this compile-time option to embed this shell program in larger
23185     ** applications. */
23186     extern void SQLITE_SHELL_DBNAME_PROC(const char**);
23187     SQLITE_SHELL_DBNAME_PROC(&data.pAuxDb->zDbFilename);
23188     warnInmemoryDb = 0;
23189   }
23190 #endif
23191 
23192   /* Do an initial pass through the command-line argument to locate
23193   ** the name of the database file, the name of the initialization file,
23194   ** the size of the alternative malloc heap,
23195   ** and the first command to execute.
23196   */
23197   verify_uninitialized();
23198   for(i=1; i<argc; i++){
23199     char *z;
23200     z = argv[i];
23201     if( z[0]!='-' ){
23202       if( data.aAuxDb->zDbFilename==0 ){
23203         data.aAuxDb->zDbFilename = z;
23204       }else{
23205         /* Excesss arguments are interpreted as SQL (or dot-commands) and
23206         ** mean that nothing is read from stdin */
23207         readStdin = 0;
23208         nCmd++;
23209         azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd);
23210         shell_check_oom(azCmd);
23211         azCmd[nCmd-1] = z;
23212       }
23213     }
23214     if( z[1]=='-' ) z++;
23215     if( strcmp(z,"-separator")==0
23216      || strcmp(z,"-nullvalue")==0
23217      || strcmp(z,"-newline")==0
23218      || strcmp(z,"-cmd")==0
23219     ){
23220       (void)cmdline_option_value(argc, argv, ++i);
23221     }else if( strcmp(z,"-init")==0 ){
23222       zInitFile = cmdline_option_value(argc, argv, ++i);
23223     }else if( strcmp(z,"-batch")==0 ){
23224       /* Need to check for batch mode here to so we can avoid printing
23225       ** informational messages (like from process_sqliterc) before
23226       ** we do the actual processing of arguments later in a second pass.
23227       */
23228       stdin_is_interactive = 0;
23229     }else if( strcmp(z,"-heap")==0 ){
23230 #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
23231       const char *zSize;
23232       sqlite3_int64 szHeap;
23233 
23234       zSize = cmdline_option_value(argc, argv, ++i);
23235       szHeap = integerValue(zSize);
23236       if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
23237       sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
23238 #else
23239       (void)cmdline_option_value(argc, argv, ++i);
23240 #endif
23241     }else if( strcmp(z,"-pagecache")==0 ){
23242       sqlite3_int64 n, sz;
23243       sz = integerValue(cmdline_option_value(argc,argv,++i));
23244       if( sz>70000 ) sz = 70000;
23245       if( sz<0 ) sz = 0;
23246       n = integerValue(cmdline_option_value(argc,argv,++i));
23247       if( sz>0 && n>0 && 0xffffffffffffLL/sz<n ){
23248         n = 0xffffffffffffLL/sz;
23249       }
23250       sqlite3_config(SQLITE_CONFIG_PAGECACHE,
23251                     (n>0 && sz>0) ? malloc(n*sz) : 0, sz, n);
23252       data.shellFlgs |= SHFLG_Pagecache;
23253     }else if( strcmp(z,"-lookaside")==0 ){
23254       int n, sz;
23255       sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
23256       if( sz<0 ) sz = 0;
23257       n = (int)integerValue(cmdline_option_value(argc,argv,++i));
23258       if( n<0 ) n = 0;
23259       sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n);
23260       if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside;
23261     }else if( strcmp(z,"-threadsafe")==0 ){
23262       int n;
23263       n = (int)integerValue(cmdline_option_value(argc,argv,++i));
23264       switch( n ){
23265          case 0:  sqlite3_config(SQLITE_CONFIG_SINGLETHREAD);  break;
23266          case 2:  sqlite3_config(SQLITE_CONFIG_MULTITHREAD);   break;
23267          default: sqlite3_config(SQLITE_CONFIG_SERIALIZED);    break;
23268       }
23269 #ifdef SQLITE_ENABLE_VFSTRACE
23270     }else if( strcmp(z,"-vfstrace")==0 ){
23271       extern int vfstrace_register(
23272          const char *zTraceName,
23273          const char *zOldVfsName,
23274          int (*xOut)(const char*,void*),
23275          void *pOutArg,
23276          int makeDefault
23277       );
23278       vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
23279 #endif
23280 #ifdef SQLITE_ENABLE_MULTIPLEX
23281     }else if( strcmp(z,"-multiplex")==0 ){
23282       extern int sqlite3_multiple_initialize(const char*,int);
23283       sqlite3_multiplex_initialize(0, 1);
23284 #endif
23285     }else if( strcmp(z,"-mmap")==0 ){
23286       sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
23287       sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
23288 #ifdef SQLITE_ENABLE_SORTER_REFERENCES
23289     }else if( strcmp(z,"-sorterref")==0 ){
23290       sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
23291       sqlite3_config(SQLITE_CONFIG_SORTERREF_SIZE, (int)sz);
23292 #endif
23293     }else if( strcmp(z,"-vfs")==0 ){
23294       zVfs = cmdline_option_value(argc, argv, ++i);
23295 #ifdef SQLITE_HAVE_ZLIB
23296     }else if( strcmp(z,"-zip")==0 ){
23297       data.openMode = SHELL_OPEN_ZIPFILE;
23298 #endif
23299     }else if( strcmp(z,"-append")==0 ){
23300       data.openMode = SHELL_OPEN_APPENDVFS;
23301 #ifndef SQLITE_OMIT_DESERIALIZE
23302     }else if( strcmp(z,"-deserialize")==0 ){
23303       data.openMode = SHELL_OPEN_DESERIALIZE;
23304     }else if( strcmp(z,"-maxsize")==0 && i+1<argc ){
23305       data.szMax = integerValue(argv[++i]);
23306 #endif
23307     }else if( strcmp(z,"-readonly")==0 ){
23308       data.openMode = SHELL_OPEN_READONLY;
23309     }else if( strcmp(z,"-nofollow")==0 ){
23310       data.openFlags = SQLITE_OPEN_NOFOLLOW;
23311 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
23312     }else if( strncmp(z, "-A",2)==0 ){
23313       /* All remaining command-line arguments are passed to the ".archive"
23314       ** command, so ignore them */
23315       break;
23316 #endif
23317     }else if( strcmp(z, "-memtrace")==0 ){
23318       sqlite3MemTraceActivate(stderr);
23319     }else if( strcmp(z,"-bail")==0 ){
23320       bail_on_error = 1;
23321     }else if( strcmp(z,"-nonce")==0 ){
23322       free(data.zNonce);
23323       data.zNonce = strdup(argv[++i]);
23324     }else if( strcmp(z,"-safe")==0 ){
23325       /* no-op - catch this on the second pass */
23326     }
23327   }
23328   verify_uninitialized();
23329 
23330 
23331 #ifdef SQLITE_SHELL_INIT_PROC
23332   {
23333     /* If the SQLITE_SHELL_INIT_PROC macro is defined, then it is the name
23334     ** of a C-function that will perform initialization actions on SQLite that
23335     ** occur just before or after sqlite3_initialize(). Use this compile-time
23336     ** option to embed this shell program in larger applications. */
23337     extern void SQLITE_SHELL_INIT_PROC(void);
23338     SQLITE_SHELL_INIT_PROC();
23339   }
23340 #else
23341   /* All the sqlite3_config() calls have now been made. So it is safe
23342   ** to call sqlite3_initialize() and process any command line -vfs option. */
23343   sqlite3_initialize();
23344 #endif
23345 
23346   if( zVfs ){
23347     sqlite3_vfs *pVfs = sqlite3_vfs_find(zVfs);
23348     if( pVfs ){
23349       sqlite3_vfs_register(pVfs, 1);
23350     }else{
23351       utf8_printf(stderr, "no such VFS: \"%s\"\n", argv[i]);
23352       exit(1);
23353     }
23354   }
23355 
23356   if( data.pAuxDb->zDbFilename==0 ){
23357 #ifndef SQLITE_OMIT_MEMORYDB
23358     data.pAuxDb->zDbFilename = ":memory:";
23359     warnInmemoryDb = argc==1;
23360 #else
23361     utf8_printf(stderr,"%s: Error: no database filename specified\n", Argv0);
23362     return 1;
23363 #endif
23364   }
23365   data.out = stdout;
23366 #ifndef SQLITE_SHELL_WASM_MODE
23367   sqlite3_appendvfs_init(0,0,0);
23368 #endif
23369 
23370   /* Go ahead and open the database file if it already exists.  If the
23371   ** file does not exist, delay opening it.  This prevents empty database
23372   ** files from being created if a user mistypes the database name argument
23373   ** to the sqlite command-line tool.
23374   */
23375   if( access(data.pAuxDb->zDbFilename, 0)==0 ){
23376     open_db(&data, 0);
23377   }
23378 
23379   /* Process the initialization file if there is one.  If no -init option
23380   ** is given on the command line, look for a file named ~/.sqliterc and
23381   ** try to process it.
23382   */
23383   process_sqliterc(&data,zInitFile);
23384 
23385   /* Make a second pass through the command-line argument and set
23386   ** options.  This second pass is delayed until after the initialization
23387   ** file is processed so that the command-line arguments will override
23388   ** settings in the initialization file.
23389   */
23390   for(i=1; i<argc; i++){
23391     char *z = argv[i];
23392     if( z[0]!='-' ) continue;
23393     if( z[1]=='-' ){ z++; }
23394     if( strcmp(z,"-init")==0 ){
23395       i++;
23396     }else if( strcmp(z,"-html")==0 ){
23397       data.mode = MODE_Html;
23398     }else if( strcmp(z,"-list")==0 ){
23399       data.mode = MODE_List;
23400     }else if( strcmp(z,"-quote")==0 ){
23401       data.mode = MODE_Quote;
23402       sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Comma);
23403       sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Row);
23404     }else if( strcmp(z,"-line")==0 ){
23405       data.mode = MODE_Line;
23406     }else if( strcmp(z,"-column")==0 ){
23407       data.mode = MODE_Column;
23408     }else if( strcmp(z,"-json")==0 ){
23409       data.mode = MODE_Json;
23410     }else if( strcmp(z,"-markdown")==0 ){
23411       data.mode = MODE_Markdown;
23412     }else if( strcmp(z,"-table")==0 ){
23413       data.mode = MODE_Table;
23414     }else if( strcmp(z,"-box")==0 ){
23415       data.mode = MODE_Box;
23416     }else if( strcmp(z,"-csv")==0 ){
23417       data.mode = MODE_Csv;
23418       memcpy(data.colSeparator,",",2);
23419 #ifdef SQLITE_HAVE_ZLIB
23420     }else if( strcmp(z,"-zip")==0 ){
23421       data.openMode = SHELL_OPEN_ZIPFILE;
23422 #endif
23423     }else if( strcmp(z,"-append")==0 ){
23424       data.openMode = SHELL_OPEN_APPENDVFS;
23425 #ifndef SQLITE_OMIT_DESERIALIZE
23426     }else if( strcmp(z,"-deserialize")==0 ){
23427       data.openMode = SHELL_OPEN_DESERIALIZE;
23428     }else if( strcmp(z,"-maxsize")==0 && i+1<argc ){
23429       data.szMax = integerValue(argv[++i]);
23430 #endif
23431     }else if( strcmp(z,"-readonly")==0 ){
23432       data.openMode = SHELL_OPEN_READONLY;
23433     }else if( strcmp(z,"-nofollow")==0 ){
23434       data.openFlags |= SQLITE_OPEN_NOFOLLOW;
23435     }else if( strcmp(z,"-ascii")==0 ){
23436       data.mode = MODE_Ascii;
23437       sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Unit);
23438       sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Record);
23439     }else if( strcmp(z,"-tabs")==0 ){
23440       data.mode = MODE_List;
23441       sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Tab);
23442       sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Row);
23443     }else if( strcmp(z,"-separator")==0 ){
23444       sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
23445                        "%s",cmdline_option_value(argc,argv,++i));
23446     }else if( strcmp(z,"-newline")==0 ){
23447       sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
23448                        "%s",cmdline_option_value(argc,argv,++i));
23449     }else if( strcmp(z,"-nullvalue")==0 ){
23450       sqlite3_snprintf(sizeof(data.nullValue), data.nullValue,
23451                        "%s",cmdline_option_value(argc,argv,++i));
23452     }else if( strcmp(z,"-header")==0 ){
23453       data.showHeader = 1;
23454       ShellSetFlag(&data, SHFLG_HeaderSet);
23455      }else if( strcmp(z,"-noheader")==0 ){
23456       data.showHeader = 0;
23457       ShellSetFlag(&data, SHFLG_HeaderSet);
23458     }else if( strcmp(z,"-echo")==0 ){
23459       ShellSetFlag(&data, SHFLG_Echo);
23460     }else if( strcmp(z,"-eqp")==0 ){
23461       data.autoEQP = AUTOEQP_on;
23462     }else if( strcmp(z,"-eqpfull")==0 ){
23463       data.autoEQP = AUTOEQP_full;
23464     }else if( strcmp(z,"-stats")==0 ){
23465       data.statsOn = 1;
23466     }else if( strcmp(z,"-scanstats")==0 ){
23467       data.scanstatsOn = 1;
23468     }else if( strcmp(z,"-backslash")==0 ){
23469       /* Undocumented command-line option: -backslash
23470       ** Causes C-style backslash escapes to be evaluated in SQL statements
23471       ** prior to sending the SQL into SQLite.  Useful for injecting
23472       ** crazy bytes in the middle of SQL statements for testing and debugging.
23473       */
23474       ShellSetFlag(&data, SHFLG_Backslash);
23475     }else if( strcmp(z,"-bail")==0 ){
23476       /* No-op.  The bail_on_error flag should already be set. */
23477     }else if( strcmp(z,"-version")==0 ){
23478       printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
23479       return 0;
23480     }else if( strcmp(z,"-interactive")==0 ){
23481       stdin_is_interactive = 1;
23482     }else if( strcmp(z,"-batch")==0 ){
23483       stdin_is_interactive = 0;
23484     }else if( strcmp(z,"-heap")==0 ){
23485       i++;
23486     }else if( strcmp(z,"-pagecache")==0 ){
23487       i+=2;
23488     }else if( strcmp(z,"-lookaside")==0 ){
23489       i+=2;
23490     }else if( strcmp(z,"-threadsafe")==0 ){
23491       i+=2;
23492     }else if( strcmp(z,"-nonce")==0 ){
23493       i += 2;
23494     }else if( strcmp(z,"-mmap")==0 ){
23495       i++;
23496     }else if( strcmp(z,"-memtrace")==0 ){
23497       i++;
23498 #ifdef SQLITE_ENABLE_SORTER_REFERENCES
23499     }else if( strcmp(z,"-sorterref")==0 ){
23500       i++;
23501 #endif
23502     }else if( strcmp(z,"-vfs")==0 ){
23503       i++;
23504 #ifdef SQLITE_ENABLE_VFSTRACE
23505     }else if( strcmp(z,"-vfstrace")==0 ){
23506       i++;
23507 #endif
23508 #ifdef SQLITE_ENABLE_MULTIPLEX
23509     }else if( strcmp(z,"-multiplex")==0 ){
23510       i++;
23511 #endif
23512     }else if( strcmp(z,"-help")==0 ){
23513       usage(1);
23514     }else if( strcmp(z,"-cmd")==0 ){
23515       /* Run commands that follow -cmd first and separately from commands
23516       ** that simply appear on the command-line.  This seems goofy.  It would
23517       ** be better if all commands ran in the order that they appear.  But
23518       ** we retain the goofy behavior for historical compatibility. */
23519       if( i==argc-1 ) break;
23520       z = cmdline_option_value(argc,argv,++i);
23521       if( z[0]=='.' ){
23522         rc = do_meta_command(z, &data);
23523         if( rc && bail_on_error ) return rc==2 ? 0 : rc;
23524       }else{
23525         open_db(&data, 0);
23526         rc = shell_exec(&data, z, &zErrMsg);
23527         if( zErrMsg!=0 ){
23528           utf8_printf(stderr,"Error: %s\n", zErrMsg);
23529           if( bail_on_error ) return rc!=0 ? rc : 1;
23530         }else if( rc!=0 ){
23531           utf8_printf(stderr,"Error: unable to process SQL \"%s\"\n", z);
23532           if( bail_on_error ) return rc;
23533         }
23534       }
23535 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
23536     }else if( strncmp(z, "-A", 2)==0 ){
23537       if( nCmd>0 ){
23538         utf8_printf(stderr, "Error: cannot mix regular SQL or dot-commands"
23539                             " with \"%s\"\n", z);
23540         return 1;
23541       }
23542       open_db(&data, OPEN_DB_ZIPFILE);
23543       if( z[2] ){
23544         argv[i] = &z[2];
23545         arDotCommand(&data, 1, argv+(i-1), argc-(i-1));
23546       }else{
23547         arDotCommand(&data, 1, argv+i, argc-i);
23548       }
23549       readStdin = 0;
23550       break;
23551 #endif
23552     }else if( strcmp(z,"-safe")==0 ){
23553       data.bSafeMode = data.bSafeModePersist = 1;
23554     }else{
23555       utf8_printf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
23556       raw_printf(stderr,"Use -help for a list of options.\n");
23557       return 1;
23558     }
23559     data.cMode = data.mode;
23560   }
23561 
23562   if( !readStdin ){
23563     /* Run all arguments that do not begin with '-' as if they were separate
23564     ** command-line inputs, except for the argToSkip argument which contains
23565     ** the database filename.
23566     */
23567     for(i=0; i<nCmd; i++){
23568       if( azCmd[i][0]=='.' ){
23569         rc = do_meta_command(azCmd[i], &data);
23570         if( rc ){
23571           free(azCmd);
23572           return rc==2 ? 0 : rc;
23573         }
23574       }else{
23575         open_db(&data, 0);
23576         rc = shell_exec(&data, azCmd[i], &zErrMsg);
23577         if( zErrMsg || rc ){
23578           if( zErrMsg!=0 ){
23579             utf8_printf(stderr,"Error: %s\n", zErrMsg);
23580           }else{
23581             utf8_printf(stderr,"Error: unable to process SQL: %s\n", azCmd[i]);
23582           }
23583           sqlite3_free(zErrMsg);
23584           free(azCmd);
23585           return rc!=0 ? rc : 1;
23586         }
23587       }
23588     }
23589   }else{
23590     /* Run commands received from standard input
23591     */
23592     if( stdin_is_interactive ){
23593       char *zHome;
23594       char *zHistory;
23595       int nHistory;
23596       printf(
23597         "SQLite version %s %.19s\n" /*extra-version-info*/
23598         "Enter \".help\" for usage hints.\n",
23599         sqlite3_libversion(), sqlite3_sourceid()
23600       );
23601       if( warnInmemoryDb ){
23602         printf("Connected to a ");
23603         printBold("transient in-memory database");
23604         printf(".\nUse \".open FILENAME\" to reopen on a "
23605                "persistent database.\n");
23606       }
23607       zHistory = getenv("SQLITE_HISTORY");
23608       if( zHistory ){
23609         zHistory = strdup(zHistory);
23610       }else if( (zHome = find_home_dir(0))!=0 ){
23611         nHistory = strlen30(zHome) + 20;
23612         if( (zHistory = malloc(nHistory))!=0 ){
23613           sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
23614         }
23615       }
23616       if( zHistory ){ shell_read_history(zHistory); }
23617 #if HAVE_READLINE || HAVE_EDITLINE
23618       rl_attempted_completion_function = readline_completion;
23619 #elif HAVE_LINENOISE
23620       linenoiseSetCompletionCallback(linenoise_completion);
23621 #endif
23622       data.in = 0;
23623       rc = process_input(&data);
23624       if( zHistory ){
23625         shell_stifle_history(2000);
23626         shell_write_history(zHistory);
23627         free(zHistory);
23628       }
23629     }else{
23630       data.in = stdin;
23631       rc = process_input(&data);
23632     }
23633   }
23634 #ifndef SQLITE_SHELL_WASM_MODE
23635   /* In WASM mode we have to leave the db state in place so that
23636   ** client code can "push" SQL into it after this call returns. */
23637   free(azCmd);
23638   set_table_name(&data, 0);
23639   if( data.db ){
23640     session_close_all(&data, -1);
23641     close_db(data.db);
23642   }
23643   for(i=0; i<ArraySize(data.aAuxDb); i++){
23644     sqlite3_free(data.aAuxDb[i].zFreeOnClose);
23645     if( data.aAuxDb[i].db ){
23646       session_close_all(&data, i);
23647       close_db(data.aAuxDb[i].db);
23648     }
23649   }
23650   find_home_dir(1);
23651   output_reset(&data);
23652   data.doXdgOpen = 0;
23653   clearTempFile(&data);
23654 #if !SQLITE_SHELL_IS_UTF8
23655   for(i=0; i<argcToFree; i++) free(argvToFree[i]);
23656   free(argvToFree);
23657 #endif
23658   free(data.colWidth);
23659   free(data.zNonce);
23660   /* Clear the global data structure so that valgrind will detect memory
23661   ** leaks */
23662   memset(&data, 0, sizeof(data));
23663 #ifdef SQLITE_DEBUG
23664   if( sqlite3_memory_used()>mem_main_enter ){
23665     utf8_printf(stderr, "Memory leaked: %u bytes\n",
23666                 (unsigned int)(sqlite3_memory_used()-mem_main_enter));
23667   }
23668 #endif
23669 #endif /* !SQLITE_SHELL_WASM_MODE */
23670   return rc;
23671 }
23672 
23673 
23674 #ifdef SQLITE_SHELL_WASM_MODE
23675 /* Only for emcc experimentation purposes. */
23676 int fiddle_experiment(int a,int b){
23677    return a + b;
23678 }
23679 
23680 /* Only for emcc experimentation purposes.
23681 
23682   Define this function in JS using:
23683 
23684   emcc ... --js-library somefile.js
23685 
23686   containing:
23687 
23688 mergeInto(LibraryManager.library, {
23689     my_foo: function(){
23690         console.debug("my_foo()",arguments);
23691     }
23692 });
23693 */
23694 /*extern void my_foo(sqlite3 *);*/
23695 /* Only for emcc experimentation purposes. */
23696 sqlite3 * fiddle_the_db(){
23697     printf("fiddle_the_db(%p)\n", (const void*)globalDb);
23698     /*my_foo(globalDb);*/
23699     return globalDb;
23700 }
23701 /* Only for emcc experimentation purposes. */
23702 sqlite3 * fiddle_db_arg(sqlite3 *arg){
23703     printf("fiddle_db_arg(%p)\n", (const void*)arg);
23704     return arg;
23705 }
23706 
23707 /*
23708 ** Intended to be called via a SharedWorker() while a separate
23709 ** SharedWorker() (which manages the wasm module) is performing work
23710 ** which should be interrupted. Unfortunately, SharedWorker is not
23711 ** portable enough to make real use of.
23712 */
23713 void fiddle_interrupt(void){
23714   if(globalDb) sqlite3_interrupt(globalDb);
23715 }
23716 
23717 /*
23718 ** Returns the filename of the given db name, assuming "main" if
23719 ** zDbName is NULL. Returns NULL if globalDb is not opened.
23720 */
23721 const char * fiddle_db_filename(const char * zDbName){
23722     return globalDb
23723       ? sqlite3_db_filename(globalDb, zDbName ? zDbName : "main")
23724       : NULL;
23725 }
23726 
23727 /*
23728 ** Closes, unlinks, and reopens the db using its current filename (or
23729 ** the default if the db is currently closed). It is assumed, for
23730 ** purposes of the fiddle build, that the file is in a transient
23731 ** virtual filesystem within the browser.
23732 */
23733 void fiddle_reset_db(void){
23734   char *zFilename = 0;
23735   if(0==globalDb){
23736     shellState.pAuxDb->zDbFilename = "/fiddle.sqlite3";
23737   }else{
23738     zFilename =
23739       sqlite3_mprintf("%s", sqlite3_db_filename(globalDb, "main"));
23740     shell_check_oom(zFilename);
23741     close_db(globalDb);
23742     shellDeleteFile(zFilename);
23743     shellState.db = 0;
23744     shellState.pAuxDb->zDbFilename = zFilename;
23745   }
23746   open_db(&shellState, 0);
23747   sqlite3_free(zFilename);
23748 }
23749 
23750 /*
23751 ** Trivial exportable function for emscripten. Needs to be exported using:
23752 **
23753 ** emcc ..flags... -sEXPORTED_FUNCTIONS=_fiddle_exec -sEXPORTED_RUNTIME_METHODS=ccall,cwrap
23754 **
23755 ** (Note the underscore before the function name.) It processes zSql
23756 ** as if it were input to the sqlite3 shell and redirects all output
23757 ** to the wasm binding.
23758 */
23759 void fiddle_exec(const char * zSql){
23760   static int once = 0;
23761   int rc = 0;
23762   if(!once){
23763     /* Simulate an argv array for main() */
23764     static char * argv[] = {"fiddle",
23765                             "-bail",
23766                             "-safe"};
23767     rc = fiddle_main((int)(sizeof(argv)/sizeof(argv[0])), argv);
23768     once = rc ? -1 : 1;
23769     memset(&shellState.wasm, 0, sizeof(shellState.wasm));
23770     printf(
23771         "SQLite version %s %.19s\n" /*extra-version-info*/,
23772         sqlite3_libversion(), sqlite3_sourceid()
23773     );
23774     puts("WASM shell");
23775     puts("Enter \".help\" for usage hints.");
23776     if(once>0){
23777       fiddle_reset_db();
23778     }
23779     if(shellState.db){
23780       printf("Connected to %s.\n", fiddle_db_filename(NULL));
23781     }else{
23782       fprintf(stderr,"ERROR initializing db!\n");
23783       return;
23784     }
23785   }
23786   if(once<0){
23787     puts("DB init failed. Not executing SQL.");
23788   }else if(zSql && *zSql){
23789     shellState.wasm.zInput = zSql;
23790     shellState.wasm.zPos = zSql;
23791     process_input(&shellState);
23792     memset(&shellState.wasm, 0, sizeof(shellState.wasm));
23793   }
23794 }
23795 #endif /* SQLITE_SHELL_WASM_MODE */
23796