xref: /freebsd/contrib/sqlite3/shell.c (revision efe014e6b177ba1b0d70f7df751f5066d4eafe9b)
1 /* DO NOT EDIT!
2 ** This file is automatically generated by the script in the canonical
3 ** SQLite source tree at tool/mkshellc.tcl.  That script combines source
4 ** code from various constituent source files of SQLite into this single
5 ** "shell.c" file used to implement the SQLite command-line shell.
6 **
7 ** Most of the code found below comes from the "src/shell.c.in" file in
8 ** the canonical SQLite source tree.  That main file contains "INCLUDE"
9 ** lines that specify other files in the canonical source tree that are
10 ** inserted to getnerate this complete program source file.
11 **
12 ** The code from multiple files is combined into this single "shell.c"
13 ** source file to help make the command-line program easier to compile.
14 **
15 ** To modify this program, get a copy of the canonical SQLite source tree,
16 ** edit the src/shell.c.in" and/or some of the other files that are included
17 ** by "src/shell.c.in", then rerun the tool/mkshellc.tcl script.
18 */
19 /*
20 ** 2001 September 15
21 **
22 ** The author disclaims copyright to this source code.  In place of
23 ** a legal notice, here is a blessing:
24 **
25 **    May you do good and not evil.
26 **    May you find forgiveness for yourself and forgive others.
27 **    May you share freely, never taking more than you give.
28 **
29 *************************************************************************
30 ** This file contains code to implement the "sqlite" command line
31 ** utility for accessing SQLite databases.
32 */
33 #if (defined(_WIN32) || defined(WIN32)) && !defined(_CRT_SECURE_NO_WARNINGS)
34 /* This needs to come before any includes for MSVC compiler */
35 #define _CRT_SECURE_NO_WARNINGS
36 #endif
37 
38 /*
39 ** Determine if we are dealing with WinRT, which provides only a subset of
40 ** the full Win32 API.
41 */
42 #if !defined(SQLITE_OS_WINRT)
43 # define SQLITE_OS_WINRT 0
44 #endif
45 
46 /*
47 ** Warning pragmas copied from msvc.h in the core.
48 */
49 #if defined(_MSC_VER)
50 #pragma warning(disable : 4054)
51 #pragma warning(disable : 4055)
52 #pragma warning(disable : 4100)
53 #pragma warning(disable : 4127)
54 #pragma warning(disable : 4130)
55 #pragma warning(disable : 4152)
56 #pragma warning(disable : 4189)
57 #pragma warning(disable : 4206)
58 #pragma warning(disable : 4210)
59 #pragma warning(disable : 4232)
60 #pragma warning(disable : 4244)
61 #pragma warning(disable : 4305)
62 #pragma warning(disable : 4306)
63 #pragma warning(disable : 4702)
64 #pragma warning(disable : 4706)
65 #endif /* defined(_MSC_VER) */
66 
67 /*
68 ** No support for loadable extensions in VxWorks.
69 */
70 #if (defined(__RTP__) || defined(_WRS_KERNEL)) && !SQLITE_OMIT_LOAD_EXTENSION
71 # define SQLITE_OMIT_LOAD_EXTENSION 1
72 #endif
73 
74 /*
75 ** Enable large-file support for fopen() and friends on unix.
76 */
77 #ifndef SQLITE_DISABLE_LFS
78 # define _LARGE_FILE       1
79 # ifndef _FILE_OFFSET_BITS
80 #   define _FILE_OFFSET_BITS 64
81 # endif
82 # define _LARGEFILE_SOURCE 1
83 #endif
84 
85 #include <stdlib.h>
86 #include <string.h>
87 #include <stdio.h>
88 #include <assert.h>
89 #include "sqlite3.h"
90 typedef sqlite3_int64 i64;
91 typedef sqlite3_uint64 u64;
92 typedef unsigned char u8;
93 #if SQLITE_USER_AUTHENTICATION
94 # include "sqlite3userauth.h"
95 #endif
96 #include <ctype.h>
97 #include <stdarg.h>
98 
99 #if !defined(_WIN32) && !defined(WIN32)
100 # include <signal.h>
101 # if !defined(__RTP__) && !defined(_WRS_KERNEL)
102 #  include <pwd.h>
103 # endif
104 #endif
105 #if (!defined(_WIN32) && !defined(WIN32)) || defined(__MINGW32__)
106 # include <unistd.h>
107 # include <dirent.h>
108 # define GETPID getpid
109 # if defined(__MINGW32__)
110 #  define DIRENT dirent
111 #  ifndef S_ISLNK
112 #   define S_ISLNK(mode) (0)
113 #  endif
114 # endif
115 #else
116 # define GETPID (int)GetCurrentProcessId
117 #endif
118 #include <sys/types.h>
119 #include <sys/stat.h>
120 
121 #if HAVE_READLINE
122 # include <readline/readline.h>
123 # include <readline/history.h>
124 #endif
125 
126 #if HAVE_EDITLINE
127 # include <editline/readline.h>
128 #endif
129 
130 #if HAVE_EDITLINE || HAVE_READLINE
131 
132 # define shell_add_history(X) add_history(X)
133 # define shell_read_history(X) read_history(X)
134 # define shell_write_history(X) write_history(X)
135 # define shell_stifle_history(X) stifle_history(X)
136 # define shell_readline(X) readline(X)
137 
138 #elif HAVE_LINENOISE
139 
140 # include "linenoise.h"
141 # define shell_add_history(X) linenoiseHistoryAdd(X)
142 # define shell_read_history(X) linenoiseHistoryLoad(X)
143 # define shell_write_history(X) linenoiseHistorySave(X)
144 # define shell_stifle_history(X) linenoiseHistorySetMaxLen(X)
145 # define shell_readline(X) linenoise(X)
146 
147 #else
148 
149 # define shell_read_history(X)
150 # define shell_write_history(X)
151 # define shell_stifle_history(X)
152 
153 # define SHELL_USE_LOCAL_GETLINE 1
154 #endif
155 
156 
157 #if defined(_WIN32) || defined(WIN32)
158 # if SQLITE_OS_WINRT
159 #  define SQLITE_OMIT_POPEN 1
160 # else
161 #  include <io.h>
162 #  include <fcntl.h>
163 #  define isatty(h) _isatty(h)
164 #  ifndef access
165 #   define access(f,m) _access((f),(m))
166 #  endif
167 #  ifndef unlink
168 #   define unlink _unlink
169 #  endif
170 #  ifndef strdup
171 #   define strdup _strdup
172 #  endif
173 #  undef popen
174 #  define popen _popen
175 #  undef pclose
176 #  define pclose _pclose
177 # endif
178 #else
179  /* Make sure isatty() has a prototype. */
180  extern int isatty(int);
181 
182 # if !defined(__RTP__) && !defined(_WRS_KERNEL)
183   /* popen and pclose are not C89 functions and so are
184   ** sometimes omitted from the <stdio.h> header */
185    extern FILE *popen(const char*,const char*);
186    extern int pclose(FILE*);
187 # else
188 #  define SQLITE_OMIT_POPEN 1
189 # endif
190 #endif
191 
192 #if defined(_WIN32_WCE)
193 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
194  * thus we always assume that we have a console. That can be
195  * overridden with the -batch command line option.
196  */
197 #define isatty(x) 1
198 #endif
199 
200 /* ctype macros that work with signed characters */
201 #define IsSpace(X)  isspace((unsigned char)X)
202 #define IsDigit(X)  isdigit((unsigned char)X)
203 #define ToLower(X)  (char)tolower((unsigned char)X)
204 
205 #if defined(_WIN32) || defined(WIN32)
206 #if SQLITE_OS_WINRT
207 #include <intrin.h>
208 #endif
209 #include <windows.h>
210 
211 /* string conversion routines only needed on Win32 */
212 extern char *sqlite3_win32_unicode_to_utf8(LPCWSTR);
213 extern char *sqlite3_win32_mbcs_to_utf8_v2(const char *, int);
214 extern char *sqlite3_win32_utf8_to_mbcs_v2(const char *, int);
215 extern LPWSTR sqlite3_win32_utf8_to_unicode(const char *zText);
216 #endif
217 
218 /* On Windows, we normally run with output mode of TEXT so that \n characters
219 ** are automatically translated into \r\n.  However, this behavior needs
220 ** to be disabled in some cases (ex: when generating CSV output and when
221 ** rendering quoted strings that contain \n characters).  The following
222 ** routines take care of that.
223 */
224 #if (defined(_WIN32) || defined(WIN32)) && !SQLITE_OS_WINRT
225 static void setBinaryMode(FILE *file, int isOutput){
226   if( isOutput ) fflush(file);
227   _setmode(_fileno(file), _O_BINARY);
228 }
229 static void setTextMode(FILE *file, int isOutput){
230   if( isOutput ) fflush(file);
231   _setmode(_fileno(file), _O_TEXT);
232 }
233 #else
234 # define setBinaryMode(X,Y)
235 # define setTextMode(X,Y)
236 #endif
237 
238 
239 /* True if the timer is enabled */
240 static int enableTimer = 0;
241 
242 /* Return the current wall-clock time */
243 static sqlite3_int64 timeOfDay(void){
244   static sqlite3_vfs *clockVfs = 0;
245   sqlite3_int64 t;
246   if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0);
247   if( clockVfs->iVersion>=2 && clockVfs->xCurrentTimeInt64!=0 ){
248     clockVfs->xCurrentTimeInt64(clockVfs, &t);
249   }else{
250     double r;
251     clockVfs->xCurrentTime(clockVfs, &r);
252     t = (sqlite3_int64)(r*86400000.0);
253   }
254   return t;
255 }
256 
257 #if !defined(_WIN32) && !defined(WIN32) && !defined(__minux)
258 #include <sys/time.h>
259 #include <sys/resource.h>
260 
261 /* VxWorks does not support getrusage() as far as we can determine */
262 #if defined(_WRS_KERNEL) || defined(__RTP__)
263 struct rusage {
264   struct timeval ru_utime; /* user CPU time used */
265   struct timeval ru_stime; /* system CPU time used */
266 };
267 #define getrusage(A,B) memset(B,0,sizeof(*B))
268 #endif
269 
270 /* Saved resource information for the beginning of an operation */
271 static struct rusage sBegin;  /* CPU time at start */
272 static sqlite3_int64 iBegin;  /* Wall-clock time at start */
273 
274 /*
275 ** Begin timing an operation
276 */
277 static void beginTimer(void){
278   if( enableTimer ){
279     getrusage(RUSAGE_SELF, &sBegin);
280     iBegin = timeOfDay();
281   }
282 }
283 
284 /* Return the difference of two time_structs in seconds */
285 static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
286   return (pEnd->tv_usec - pStart->tv_usec)*0.000001 +
287          (double)(pEnd->tv_sec - pStart->tv_sec);
288 }
289 
290 /*
291 ** Print the timing results.
292 */
293 static void endTimer(void){
294   if( enableTimer ){
295     sqlite3_int64 iEnd = timeOfDay();
296     struct rusage sEnd;
297     getrusage(RUSAGE_SELF, &sEnd);
298     printf("Run Time: real %.3f user %f sys %f\n",
299        (iEnd - iBegin)*0.001,
300        timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
301        timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
302   }
303 }
304 
305 #define BEGIN_TIMER beginTimer()
306 #define END_TIMER endTimer()
307 #define HAS_TIMER 1
308 
309 #elif (defined(_WIN32) || defined(WIN32))
310 
311 /* Saved resource information for the beginning of an operation */
312 static HANDLE hProcess;
313 static FILETIME ftKernelBegin;
314 static FILETIME ftUserBegin;
315 static sqlite3_int64 ftWallBegin;
316 typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME,
317                                     LPFILETIME, LPFILETIME);
318 static GETPROCTIMES getProcessTimesAddr = NULL;
319 
320 /*
321 ** Check to see if we have timer support.  Return 1 if necessary
322 ** support found (or found previously).
323 */
324 static int hasTimer(void){
325   if( getProcessTimesAddr ){
326     return 1;
327   } else {
328 #if !SQLITE_OS_WINRT
329     /* GetProcessTimes() isn't supported in WIN95 and some other Windows
330     ** versions. See if the version we are running on has it, and if it
331     ** does, save off a pointer to it and the current process handle.
332     */
333     hProcess = GetCurrentProcess();
334     if( hProcess ){
335       HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll"));
336       if( NULL != hinstLib ){
337         getProcessTimesAddr =
338             (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes");
339         if( NULL != getProcessTimesAddr ){
340           return 1;
341         }
342         FreeLibrary(hinstLib);
343       }
344     }
345 #endif
346   }
347   return 0;
348 }
349 
350 /*
351 ** Begin timing an operation
352 */
353 static void beginTimer(void){
354   if( enableTimer && getProcessTimesAddr ){
355     FILETIME ftCreation, ftExit;
356     getProcessTimesAddr(hProcess,&ftCreation,&ftExit,
357                         &ftKernelBegin,&ftUserBegin);
358     ftWallBegin = timeOfDay();
359   }
360 }
361 
362 /* Return the difference of two FILETIME structs in seconds */
363 static double timeDiff(FILETIME *pStart, FILETIME *pEnd){
364   sqlite_int64 i64Start = *((sqlite_int64 *) pStart);
365   sqlite_int64 i64End = *((sqlite_int64 *) pEnd);
366   return (double) ((i64End - i64Start) / 10000000.0);
367 }
368 
369 /*
370 ** Print the timing results.
371 */
372 static void endTimer(void){
373   if( enableTimer && getProcessTimesAddr){
374     FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
375     sqlite3_int64 ftWallEnd = timeOfDay();
376     getProcessTimesAddr(hProcess,&ftCreation,&ftExit,&ftKernelEnd,&ftUserEnd);
377     printf("Run Time: real %.3f user %f sys %f\n",
378        (ftWallEnd - ftWallBegin)*0.001,
379        timeDiff(&ftUserBegin, &ftUserEnd),
380        timeDiff(&ftKernelBegin, &ftKernelEnd));
381   }
382 }
383 
384 #define BEGIN_TIMER beginTimer()
385 #define END_TIMER endTimer()
386 #define HAS_TIMER hasTimer()
387 
388 #else
389 #define BEGIN_TIMER
390 #define END_TIMER
391 #define HAS_TIMER 0
392 #endif
393 
394 /*
395 ** Used to prevent warnings about unused parameters
396 */
397 #define UNUSED_PARAMETER(x) (void)(x)
398 
399 /*
400 ** Number of elements in an array
401 */
402 #define ArraySize(X)  (int)(sizeof(X)/sizeof(X[0]))
403 
404 /*
405 ** If the following flag is set, then command execution stops
406 ** at an error if we are not interactive.
407 */
408 static int bail_on_error = 0;
409 
410 /*
411 ** Threat stdin as an interactive input if the following variable
412 ** is true.  Otherwise, assume stdin is connected to a file or pipe.
413 */
414 static int stdin_is_interactive = 1;
415 
416 /*
417 ** On Windows systems we have to know if standard output is a console
418 ** in order to translate UTF-8 into MBCS.  The following variable is
419 ** true if translation is required.
420 */
421 static int stdout_is_console = 1;
422 
423 /*
424 ** The following is the open SQLite database.  We make a pointer
425 ** to this database a static variable so that it can be accessed
426 ** by the SIGINT handler to interrupt database processing.
427 */
428 static sqlite3 *globalDb = 0;
429 
430 /*
431 ** True if an interrupt (Control-C) has been received.
432 */
433 static volatile int seenInterrupt = 0;
434 
435 #ifdef SQLITE_DEBUG
436 /*
437 ** Out-of-memory simulator variables
438 */
439 static unsigned int oomCounter = 0;    /* Simulate OOM when equals 1 */
440 static unsigned int oomRepeat = 0;     /* Number of OOMs in a row */
441 static void*(*defaultMalloc)(int) = 0; /* The low-level malloc routine */
442 #endif /* SQLITE_DEBUG */
443 
444 /*
445 ** This is the name of our program. It is set in main(), used
446 ** in a number of other places, mostly for error messages.
447 */
448 static char *Argv0;
449 
450 /*
451 ** Prompt strings. Initialized in main. Settable with
452 **   .prompt main continue
453 */
454 static char mainPrompt[20];     /* First line prompt. default: "sqlite> "*/
455 static char continuePrompt[20]; /* Continuation prompt. default: "   ...> " */
456 
457 /*
458 ** Render output like fprintf().  Except, if the output is going to the
459 ** console and if this is running on a Windows machine, translate the
460 ** output from UTF-8 into MBCS.
461 */
462 #if defined(_WIN32) || defined(WIN32)
463 void utf8_printf(FILE *out, const char *zFormat, ...){
464   va_list ap;
465   va_start(ap, zFormat);
466   if( stdout_is_console && (out==stdout || out==stderr) ){
467     char *z1 = sqlite3_vmprintf(zFormat, ap);
468     char *z2 = sqlite3_win32_utf8_to_mbcs_v2(z1, 0);
469     sqlite3_free(z1);
470     fputs(z2, out);
471     sqlite3_free(z2);
472   }else{
473     vfprintf(out, zFormat, ap);
474   }
475   va_end(ap);
476 }
477 #elif !defined(utf8_printf)
478 # define utf8_printf fprintf
479 #endif
480 
481 /*
482 ** Render output like fprintf().  This should not be used on anything that
483 ** includes string formatting (e.g. "%s").
484 */
485 #if !defined(raw_printf)
486 # define raw_printf fprintf
487 #endif
488 
489 /* Indicate out-of-memory and exit. */
490 static void shell_out_of_memory(void){
491   raw_printf(stderr,"Error: out of memory\n");
492   exit(1);
493 }
494 
495 #ifdef SQLITE_DEBUG
496 /* This routine is called when a simulated OOM occurs.  It is broken
497 ** out as a separate routine to make it easy to set a breakpoint on
498 ** the OOM
499 */
500 void shellOomFault(void){
501   if( oomRepeat>0 ){
502     oomRepeat--;
503   }else{
504     oomCounter--;
505   }
506 }
507 #endif /* SQLITE_DEBUG */
508 
509 #ifdef SQLITE_DEBUG
510 /* This routine is a replacement malloc() that is used to simulate
511 ** Out-Of-Memory (OOM) errors for testing purposes.
512 */
513 static void *oomMalloc(int nByte){
514   if( oomCounter ){
515     if( oomCounter==1 ){
516       shellOomFault();
517       return 0;
518     }else{
519       oomCounter--;
520     }
521   }
522   return defaultMalloc(nByte);
523 }
524 #endif /* SQLITE_DEBUG */
525 
526 #ifdef SQLITE_DEBUG
527 /* Register the OOM simulator.  This must occur before any memory
528 ** allocations */
529 static void registerOomSimulator(void){
530   sqlite3_mem_methods mem;
531   sqlite3_config(SQLITE_CONFIG_GETMALLOC, &mem);
532   defaultMalloc = mem.xMalloc;
533   mem.xMalloc = oomMalloc;
534   sqlite3_config(SQLITE_CONFIG_MALLOC, &mem);
535 }
536 #endif
537 
538 /*
539 ** Write I/O traces to the following stream.
540 */
541 #ifdef SQLITE_ENABLE_IOTRACE
542 static FILE *iotrace = 0;
543 #endif
544 
545 /*
546 ** This routine works like printf in that its first argument is a
547 ** format string and subsequent arguments are values to be substituted
548 ** in place of % fields.  The result of formatting this string
549 ** is written to iotrace.
550 */
551 #ifdef SQLITE_ENABLE_IOTRACE
552 static void SQLITE_CDECL iotracePrintf(const char *zFormat, ...){
553   va_list ap;
554   char *z;
555   if( iotrace==0 ) return;
556   va_start(ap, zFormat);
557   z = sqlite3_vmprintf(zFormat, ap);
558   va_end(ap);
559   utf8_printf(iotrace, "%s", z);
560   sqlite3_free(z);
561 }
562 #endif
563 
564 /*
565 ** Output string zUtf to stream pOut as w characters.  If w is negative,
566 ** then right-justify the text.  W is the width in UTF-8 characters, not
567 ** in bytes.  This is different from the %*.*s specification in printf
568 ** since with %*.*s the width is measured in bytes, not characters.
569 */
570 static void utf8_width_print(FILE *pOut, int w, const char *zUtf){
571   int i;
572   int n;
573   int aw = w<0 ? -w : w;
574   for(i=n=0; zUtf[i]; i++){
575     if( (zUtf[i]&0xc0)!=0x80 ){
576       n++;
577       if( n==aw ){
578         do{ i++; }while( (zUtf[i]&0xc0)==0x80 );
579         break;
580       }
581     }
582   }
583   if( n>=aw ){
584     utf8_printf(pOut, "%.*s", i, zUtf);
585   }else if( w<0 ){
586     utf8_printf(pOut, "%*s%s", aw-n, "", zUtf);
587   }else{
588     utf8_printf(pOut, "%s%*s", zUtf, aw-n, "");
589   }
590 }
591 
592 
593 /*
594 ** Determines if a string is a number of not.
595 */
596 static int isNumber(const char *z, int *realnum){
597   if( *z=='-' || *z=='+' ) z++;
598   if( !IsDigit(*z) ){
599     return 0;
600   }
601   z++;
602   if( realnum ) *realnum = 0;
603   while( IsDigit(*z) ){ z++; }
604   if( *z=='.' ){
605     z++;
606     if( !IsDigit(*z) ) return 0;
607     while( IsDigit(*z) ){ z++; }
608     if( realnum ) *realnum = 1;
609   }
610   if( *z=='e' || *z=='E' ){
611     z++;
612     if( *z=='+' || *z=='-' ) z++;
613     if( !IsDigit(*z) ) return 0;
614     while( IsDigit(*z) ){ z++; }
615     if( realnum ) *realnum = 1;
616   }
617   return *z==0;
618 }
619 
620 /*
621 ** Compute a string length that is limited to what can be stored in
622 ** lower 30 bits of a 32-bit signed integer.
623 */
624 static int strlen30(const char *z){
625   const char *z2 = z;
626   while( *z2 ){ z2++; }
627   return 0x3fffffff & (int)(z2 - z);
628 }
629 
630 /*
631 ** Return the length of a string in characters.  Multibyte UTF8 characters
632 ** count as a single character.
633 */
634 static int strlenChar(const char *z){
635   int n = 0;
636   while( *z ){
637     if( (0xc0&*(z++))!=0x80 ) n++;
638   }
639   return n;
640 }
641 
642 /*
643 ** Return true if zFile does not exist or if it is not an ordinary file.
644 */
645 #ifdef _WIN32
646 # define notNormalFile(X) 0
647 #else
648 static int notNormalFile(const char *zFile){
649   struct stat x;
650   int rc;
651   memset(&x, 0, sizeof(x));
652   rc = stat(zFile, &x);
653   return rc || !S_ISREG(x.st_mode);
654 }
655 #endif
656 
657 /*
658 ** This routine reads a line of text from FILE in, stores
659 ** the text in memory obtained from malloc() and returns a pointer
660 ** to the text.  NULL is returned at end of file, or if malloc()
661 ** fails.
662 **
663 ** If zLine is not NULL then it is a malloced buffer returned from
664 ** a previous call to this routine that may be reused.
665 */
666 static char *local_getline(char *zLine, FILE *in){
667   int nLine = zLine==0 ? 0 : 100;
668   int n = 0;
669 
670   while( 1 ){
671     if( n+100>nLine ){
672       nLine = nLine*2 + 100;
673       zLine = realloc(zLine, nLine);
674       if( zLine==0 ) shell_out_of_memory();
675     }
676     if( fgets(&zLine[n], nLine - n, in)==0 ){
677       if( n==0 ){
678         free(zLine);
679         return 0;
680       }
681       zLine[n] = 0;
682       break;
683     }
684     while( zLine[n] ) n++;
685     if( n>0 && zLine[n-1]=='\n' ){
686       n--;
687       if( n>0 && zLine[n-1]=='\r' ) n--;
688       zLine[n] = 0;
689       break;
690     }
691   }
692 #if defined(_WIN32) || defined(WIN32)
693   /* For interactive input on Windows systems, translate the
694   ** multi-byte characterset characters into UTF-8. */
695   if( stdin_is_interactive && in==stdin ){
696     char *zTrans = sqlite3_win32_mbcs_to_utf8_v2(zLine, 0);
697     if( zTrans ){
698       int nTrans = strlen30(zTrans)+1;
699       if( nTrans>nLine ){
700         zLine = realloc(zLine, nTrans);
701         if( zLine==0 ) shell_out_of_memory();
702       }
703       memcpy(zLine, zTrans, nTrans);
704       sqlite3_free(zTrans);
705     }
706   }
707 #endif /* defined(_WIN32) || defined(WIN32) */
708   return zLine;
709 }
710 
711 /*
712 ** Retrieve a single line of input text.
713 **
714 ** If in==0 then read from standard input and prompt before each line.
715 ** If isContinuation is true, then a continuation prompt is appropriate.
716 ** If isContinuation is zero, then the main prompt should be used.
717 **
718 ** If zPrior is not NULL then it is a buffer from a prior call to this
719 ** routine that can be reused.
720 **
721 ** The result is stored in space obtained from malloc() and must either
722 ** be freed by the caller or else passed back into this routine via the
723 ** zPrior argument for reuse.
724 */
725 static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
726   char *zPrompt;
727   char *zResult;
728   if( in!=0 ){
729     zResult = local_getline(zPrior, in);
730   }else{
731     zPrompt = isContinuation ? continuePrompt : mainPrompt;
732 #if SHELL_USE_LOCAL_GETLINE
733     printf("%s", zPrompt);
734     fflush(stdout);
735     zResult = local_getline(zPrior, stdin);
736 #else
737     free(zPrior);
738     zResult = shell_readline(zPrompt);
739     if( zResult && *zResult ) shell_add_history(zResult);
740 #endif
741   }
742   return zResult;
743 }
744 
745 
746 /*
747 ** Return the value of a hexadecimal digit.  Return -1 if the input
748 ** is not a hex digit.
749 */
750 static int hexDigitValue(char c){
751   if( c>='0' && c<='9' ) return c - '0';
752   if( c>='a' && c<='f' ) return c - 'a' + 10;
753   if( c>='A' && c<='F' ) return c - 'A' + 10;
754   return -1;
755 }
756 
757 /*
758 ** Interpret zArg as an integer value, possibly with suffixes.
759 */
760 static sqlite3_int64 integerValue(const char *zArg){
761   sqlite3_int64 v = 0;
762   static const struct { char *zSuffix; int iMult; } aMult[] = {
763     { "KiB", 1024 },
764     { "MiB", 1024*1024 },
765     { "GiB", 1024*1024*1024 },
766     { "KB",  1000 },
767     { "MB",  1000000 },
768     { "GB",  1000000000 },
769     { "K",   1000 },
770     { "M",   1000000 },
771     { "G",   1000000000 },
772   };
773   int i;
774   int isNeg = 0;
775   if( zArg[0]=='-' ){
776     isNeg = 1;
777     zArg++;
778   }else if( zArg[0]=='+' ){
779     zArg++;
780   }
781   if( zArg[0]=='0' && zArg[1]=='x' ){
782     int x;
783     zArg += 2;
784     while( (x = hexDigitValue(zArg[0]))>=0 ){
785       v = (v<<4) + x;
786       zArg++;
787     }
788   }else{
789     while( IsDigit(zArg[0]) ){
790       v = v*10 + zArg[0] - '0';
791       zArg++;
792     }
793   }
794   for(i=0; i<ArraySize(aMult); i++){
795     if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
796       v *= aMult[i].iMult;
797       break;
798     }
799   }
800   return isNeg? -v : v;
801 }
802 
803 /*
804 ** A variable length string to which one can append text.
805 */
806 typedef struct ShellText ShellText;
807 struct ShellText {
808   char *z;
809   int n;
810   int nAlloc;
811 };
812 
813 /*
814 ** Initialize and destroy a ShellText object
815 */
816 static void initText(ShellText *p){
817   memset(p, 0, sizeof(*p));
818 }
819 static void freeText(ShellText *p){
820   free(p->z);
821   initText(p);
822 }
823 
824 /* zIn is either a pointer to a NULL-terminated string in memory obtained
825 ** from malloc(), or a NULL pointer. The string pointed to by zAppend is
826 ** added to zIn, and the result returned in memory obtained from malloc().
827 ** zIn, if it was not NULL, is freed.
828 **
829 ** If the third argument, quote, is not '\0', then it is used as a
830 ** quote character for zAppend.
831 */
832 static void appendText(ShellText *p, char const *zAppend, char quote){
833   int len;
834   int i;
835   int nAppend = strlen30(zAppend);
836 
837   len = nAppend+p->n+1;
838   if( quote ){
839     len += 2;
840     for(i=0; i<nAppend; i++){
841       if( zAppend[i]==quote ) len++;
842     }
843   }
844 
845   if( p->n+len>=p->nAlloc ){
846     p->nAlloc = p->nAlloc*2 + len + 20;
847     p->z = realloc(p->z, p->nAlloc);
848     if( p->z==0 ) shell_out_of_memory();
849   }
850 
851   if( quote ){
852     char *zCsr = p->z+p->n;
853     *zCsr++ = quote;
854     for(i=0; i<nAppend; i++){
855       *zCsr++ = zAppend[i];
856       if( zAppend[i]==quote ) *zCsr++ = quote;
857     }
858     *zCsr++ = quote;
859     p->n = (int)(zCsr - p->z);
860     *zCsr = '\0';
861   }else{
862     memcpy(p->z+p->n, zAppend, nAppend);
863     p->n += nAppend;
864     p->z[p->n] = '\0';
865   }
866 }
867 
868 /*
869 ** Attempt to determine if identifier zName needs to be quoted, either
870 ** because it contains non-alphanumeric characters, or because it is an
871 ** SQLite keyword.  Be conservative in this estimate:  When in doubt assume
872 ** that quoting is required.
873 **
874 ** Return '"' if quoting is required.  Return 0 if no quoting is required.
875 */
876 static char quoteChar(const char *zName){
877   int i;
878   if( !isalpha((unsigned char)zName[0]) && zName[0]!='_' ) return '"';
879   for(i=0; zName[i]; i++){
880     if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ) return '"';
881   }
882   return sqlite3_keyword_check(zName, i) ? '"' : 0;
883 }
884 
885 /*
886 ** Construct a fake object name and column list to describe the structure
887 ** of the view, virtual table, or table valued function zSchema.zName.
888 */
889 static char *shellFakeSchema(
890   sqlite3 *db,            /* The database connection containing the vtab */
891   const char *zSchema,    /* Schema of the database holding the vtab */
892   const char *zName       /* The name of the virtual table */
893 ){
894   sqlite3_stmt *pStmt = 0;
895   char *zSql;
896   ShellText s;
897   char cQuote;
898   char *zDiv = "(";
899   int nRow = 0;
900 
901   zSql = sqlite3_mprintf("PRAGMA \"%w\".table_info=%Q;",
902                          zSchema ? zSchema : "main", zName);
903   sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
904   sqlite3_free(zSql);
905   initText(&s);
906   if( zSchema ){
907     cQuote = quoteChar(zSchema);
908     if( cQuote && sqlite3_stricmp(zSchema,"temp")==0 ) cQuote = 0;
909     appendText(&s, zSchema, cQuote);
910     appendText(&s, ".", 0);
911   }
912   cQuote = quoteChar(zName);
913   appendText(&s, zName, cQuote);
914   while( sqlite3_step(pStmt)==SQLITE_ROW ){
915     const char *zCol = (const char*)sqlite3_column_text(pStmt, 1);
916     nRow++;
917     appendText(&s, zDiv, 0);
918     zDiv = ",";
919     cQuote = quoteChar(zCol);
920     appendText(&s, zCol, cQuote);
921   }
922   appendText(&s, ")", 0);
923   sqlite3_finalize(pStmt);
924   if( nRow==0 ){
925     freeText(&s);
926     s.z = 0;
927   }
928   return s.z;
929 }
930 
931 /*
932 ** SQL function:  shell_module_schema(X)
933 **
934 ** Return a fake schema for the table-valued function or eponymous virtual
935 ** table X.
936 */
937 static void shellModuleSchema(
938   sqlite3_context *pCtx,
939   int nVal,
940   sqlite3_value **apVal
941 ){
942   const char *zName = (const char*)sqlite3_value_text(apVal[0]);
943   char *zFake = shellFakeSchema(sqlite3_context_db_handle(pCtx), 0, zName);
944   UNUSED_PARAMETER(nVal);
945   if( zFake ){
946     sqlite3_result_text(pCtx, sqlite3_mprintf("/* %s */", zFake),
947                         -1, sqlite3_free);
948     free(zFake);
949   }
950 }
951 
952 /*
953 ** SQL function:  shell_add_schema(S,X)
954 **
955 ** Add the schema name X to the CREATE statement in S and return the result.
956 ** Examples:
957 **
958 **    CREATE TABLE t1(x)   ->   CREATE TABLE xyz.t1(x);
959 **
960 ** Also works on
961 **
962 **    CREATE INDEX
963 **    CREATE UNIQUE INDEX
964 **    CREATE VIEW
965 **    CREATE TRIGGER
966 **    CREATE VIRTUAL TABLE
967 **
968 ** This UDF is used by the .schema command to insert the schema name of
969 ** attached databases into the middle of the sqlite_schema.sql field.
970 */
971 static void shellAddSchemaName(
972   sqlite3_context *pCtx,
973   int nVal,
974   sqlite3_value **apVal
975 ){
976   static const char *aPrefix[] = {
977      "TABLE",
978      "INDEX",
979      "UNIQUE INDEX",
980      "VIEW",
981      "TRIGGER",
982      "VIRTUAL TABLE"
983   };
984   int i = 0;
985   const char *zIn = (const char*)sqlite3_value_text(apVal[0]);
986   const char *zSchema = (const char*)sqlite3_value_text(apVal[1]);
987   const char *zName = (const char*)sqlite3_value_text(apVal[2]);
988   sqlite3 *db = sqlite3_context_db_handle(pCtx);
989   UNUSED_PARAMETER(nVal);
990   if( zIn!=0 && strncmp(zIn, "CREATE ", 7)==0 ){
991     for(i=0; i<(int)(sizeof(aPrefix)/sizeof(aPrefix[0])); i++){
992       int n = strlen30(aPrefix[i]);
993       if( strncmp(zIn+7, aPrefix[i], n)==0 && zIn[n+7]==' ' ){
994         char *z = 0;
995         char *zFake = 0;
996         if( zSchema ){
997           char cQuote = quoteChar(zSchema);
998           if( cQuote && sqlite3_stricmp(zSchema,"temp")!=0 ){
999             z = sqlite3_mprintf("%.*s \"%w\".%s", n+7, zIn, zSchema, zIn+n+8);
1000           }else{
1001             z = sqlite3_mprintf("%.*s %s.%s", n+7, zIn, zSchema, zIn+n+8);
1002           }
1003         }
1004         if( zName
1005          && aPrefix[i][0]=='V'
1006          && (zFake = shellFakeSchema(db, zSchema, zName))!=0
1007         ){
1008           if( z==0 ){
1009             z = sqlite3_mprintf("%s\n/* %s */", zIn, zFake);
1010           }else{
1011             z = sqlite3_mprintf("%z\n/* %s */", z, zFake);
1012           }
1013           free(zFake);
1014         }
1015         if( z ){
1016           sqlite3_result_text(pCtx, z, -1, sqlite3_free);
1017           return;
1018         }
1019       }
1020     }
1021   }
1022   sqlite3_result_value(pCtx, apVal[0]);
1023 }
1024 
1025 /*
1026 ** The source code for several run-time loadable extensions is inserted
1027 ** below by the ../tool/mkshellc.tcl script.  Before processing that included
1028 ** code, we need to override some macros to make the included program code
1029 ** work here in the middle of this regular program.
1030 */
1031 #define SQLITE_EXTENSION_INIT1
1032 #define SQLITE_EXTENSION_INIT2(X) (void)(X)
1033 
1034 #if defined(_WIN32) && defined(_MSC_VER)
1035 /************************* Begin test_windirent.h ******************/
1036 /*
1037 ** 2015 November 30
1038 **
1039 ** The author disclaims copyright to this source code.  In place of
1040 ** a legal notice, here is a blessing:
1041 **
1042 **    May you do good and not evil.
1043 **    May you find forgiveness for yourself and forgive others.
1044 **    May you share freely, never taking more than you give.
1045 **
1046 *************************************************************************
1047 ** This file contains declarations for most of the opendir() family of
1048 ** POSIX functions on Win32 using the MSVCRT.
1049 */
1050 
1051 #if defined(_WIN32) && defined(_MSC_VER) && !defined(SQLITE_WINDIRENT_H)
1052 #define SQLITE_WINDIRENT_H
1053 
1054 /*
1055 ** We need several data types from the Windows SDK header.
1056 */
1057 
1058 #ifndef WIN32_LEAN_AND_MEAN
1059 #define WIN32_LEAN_AND_MEAN
1060 #endif
1061 
1062 #include "windows.h"
1063 
1064 /*
1065 ** We need several support functions from the SQLite core.
1066 */
1067 
1068 /* #include "sqlite3.h" */
1069 
1070 /*
1071 ** We need several things from the ANSI and MSVCRT headers.
1072 */
1073 
1074 #include <stdio.h>
1075 #include <stdlib.h>
1076 #include <errno.h>
1077 #include <io.h>
1078 #include <limits.h>
1079 #include <sys/types.h>
1080 #include <sys/stat.h>
1081 
1082 /*
1083 ** We may need several defines that should have been in "sys/stat.h".
1084 */
1085 
1086 #ifndef S_ISREG
1087 #define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG)
1088 #endif
1089 
1090 #ifndef S_ISDIR
1091 #define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
1092 #endif
1093 
1094 #ifndef S_ISLNK
1095 #define S_ISLNK(mode) (0)
1096 #endif
1097 
1098 /*
1099 ** We may need to provide the "mode_t" type.
1100 */
1101 
1102 #ifndef MODE_T_DEFINED
1103   #define MODE_T_DEFINED
1104   typedef unsigned short mode_t;
1105 #endif
1106 
1107 /*
1108 ** We may need to provide the "ino_t" type.
1109 */
1110 
1111 #ifndef INO_T_DEFINED
1112   #define INO_T_DEFINED
1113   typedef unsigned short ino_t;
1114 #endif
1115 
1116 /*
1117 ** We need to define "NAME_MAX" if it was not present in "limits.h".
1118 */
1119 
1120 #ifndef NAME_MAX
1121 #  ifdef FILENAME_MAX
1122 #    define NAME_MAX (FILENAME_MAX)
1123 #  else
1124 #    define NAME_MAX (260)
1125 #  endif
1126 #endif
1127 
1128 /*
1129 ** We need to define "NULL_INTPTR_T" and "BAD_INTPTR_T".
1130 */
1131 
1132 #ifndef NULL_INTPTR_T
1133 #  define NULL_INTPTR_T ((intptr_t)(0))
1134 #endif
1135 
1136 #ifndef BAD_INTPTR_T
1137 #  define BAD_INTPTR_T ((intptr_t)(-1))
1138 #endif
1139 
1140 /*
1141 ** We need to provide the necessary structures and related types.
1142 */
1143 
1144 #ifndef DIRENT_DEFINED
1145 #define DIRENT_DEFINED
1146 typedef struct DIRENT DIRENT;
1147 typedef DIRENT *LPDIRENT;
1148 struct DIRENT {
1149   ino_t d_ino;               /* Sequence number, do not use. */
1150   unsigned d_attributes;     /* Win32 file attributes. */
1151   char d_name[NAME_MAX + 1]; /* Name within the directory. */
1152 };
1153 #endif
1154 
1155 #ifndef DIR_DEFINED
1156 #define DIR_DEFINED
1157 typedef struct DIR DIR;
1158 typedef DIR *LPDIR;
1159 struct DIR {
1160   intptr_t d_handle; /* Value returned by "_findfirst". */
1161   DIRENT d_first;    /* DIRENT constructed based on "_findfirst". */
1162   DIRENT d_next;     /* DIRENT constructed based on "_findnext". */
1163 };
1164 #endif
1165 
1166 /*
1167 ** Provide a macro, for use by the implementation, to determine if a
1168 ** particular directory entry should be skipped over when searching for
1169 ** the next directory entry that should be returned by the readdir() or
1170 ** readdir_r() functions.
1171 */
1172 
1173 #ifndef is_filtered
1174 #  define is_filtered(a) ((((a).attrib)&_A_HIDDEN) || (((a).attrib)&_A_SYSTEM))
1175 #endif
1176 
1177 /*
1178 ** Provide the function prototype for the POSIX compatiable getenv()
1179 ** function.  This function is not thread-safe.
1180 */
1181 
1182 extern const char *windirent_getenv(const char *name);
1183 
1184 /*
1185 ** Finally, we can provide the function prototypes for the opendir(),
1186 ** readdir(), readdir_r(), and closedir() POSIX functions.
1187 */
1188 
1189 extern LPDIR opendir(const char *dirname);
1190 extern LPDIRENT readdir(LPDIR dirp);
1191 extern INT readdir_r(LPDIR dirp, LPDIRENT entry, LPDIRENT *result);
1192 extern INT closedir(LPDIR dirp);
1193 
1194 #endif /* defined(WIN32) && defined(_MSC_VER) */
1195 
1196 /************************* End test_windirent.h ********************/
1197 /************************* Begin test_windirent.c ******************/
1198 /*
1199 ** 2015 November 30
1200 **
1201 ** The author disclaims copyright to this source code.  In place of
1202 ** a legal notice, here is a blessing:
1203 **
1204 **    May you do good and not evil.
1205 **    May you find forgiveness for yourself and forgive others.
1206 **    May you share freely, never taking more than you give.
1207 **
1208 *************************************************************************
1209 ** This file contains code to implement most of the opendir() family of
1210 ** POSIX functions on Win32 using the MSVCRT.
1211 */
1212 
1213 #if defined(_WIN32) && defined(_MSC_VER)
1214 /* #include "test_windirent.h" */
1215 
1216 /*
1217 ** Implementation of the POSIX getenv() function using the Win32 API.
1218 ** This function is not thread-safe.
1219 */
1220 const char *windirent_getenv(
1221   const char *name
1222 ){
1223   static char value[32768]; /* Maximum length, per MSDN */
1224   DWORD dwSize = sizeof(value) / sizeof(char); /* Size in chars */
1225   DWORD dwRet; /* Value returned by GetEnvironmentVariableA() */
1226 
1227   memset(value, 0, sizeof(value));
1228   dwRet = GetEnvironmentVariableA(name, value, dwSize);
1229   if( dwRet==0 || dwRet>dwSize ){
1230     /*
1231     ** The function call to GetEnvironmentVariableA() failed -OR-
1232     ** the buffer is not large enough.  Either way, return NULL.
1233     */
1234     return 0;
1235   }else{
1236     /*
1237     ** The function call to GetEnvironmentVariableA() succeeded
1238     ** -AND- the buffer contains the entire value.
1239     */
1240     return value;
1241   }
1242 }
1243 
1244 /*
1245 ** Implementation of the POSIX opendir() function using the MSVCRT.
1246 */
1247 LPDIR opendir(
1248   const char *dirname
1249 ){
1250   struct _finddata_t data;
1251   LPDIR dirp = (LPDIR)sqlite3_malloc(sizeof(DIR));
1252   SIZE_T namesize = sizeof(data.name) / sizeof(data.name[0]);
1253 
1254   if( dirp==NULL ) return NULL;
1255   memset(dirp, 0, sizeof(DIR));
1256 
1257   /* TODO: Remove this if Unix-style root paths are not used. */
1258   if( sqlite3_stricmp(dirname, "/")==0 ){
1259     dirname = windirent_getenv("SystemDrive");
1260   }
1261 
1262   memset(&data, 0, sizeof(struct _finddata_t));
1263   _snprintf(data.name, namesize, "%s\\*", dirname);
1264   dirp->d_handle = _findfirst(data.name, &data);
1265 
1266   if( dirp->d_handle==BAD_INTPTR_T ){
1267     closedir(dirp);
1268     return NULL;
1269   }
1270 
1271   /* TODO: Remove this block to allow hidden and/or system files. */
1272   if( is_filtered(data) ){
1273 next:
1274 
1275     memset(&data, 0, sizeof(struct _finddata_t));
1276     if( _findnext(dirp->d_handle, &data)==-1 ){
1277       closedir(dirp);
1278       return NULL;
1279     }
1280 
1281     /* TODO: Remove this block to allow hidden and/or system files. */
1282     if( is_filtered(data) ) goto next;
1283   }
1284 
1285   dirp->d_first.d_attributes = data.attrib;
1286   strncpy(dirp->d_first.d_name, data.name, NAME_MAX);
1287   dirp->d_first.d_name[NAME_MAX] = '\0';
1288 
1289   return dirp;
1290 }
1291 
1292 /*
1293 ** Implementation of the POSIX readdir() function using the MSVCRT.
1294 */
1295 LPDIRENT readdir(
1296   LPDIR dirp
1297 ){
1298   struct _finddata_t data;
1299 
1300   if( dirp==NULL ) return NULL;
1301 
1302   if( dirp->d_first.d_ino==0 ){
1303     dirp->d_first.d_ino++;
1304     dirp->d_next.d_ino++;
1305 
1306     return &dirp->d_first;
1307   }
1308 
1309 next:
1310 
1311   memset(&data, 0, sizeof(struct _finddata_t));
1312   if( _findnext(dirp->d_handle, &data)==-1 ) return NULL;
1313 
1314   /* TODO: Remove this block to allow hidden and/or system files. */
1315   if( is_filtered(data) ) goto next;
1316 
1317   dirp->d_next.d_ino++;
1318   dirp->d_next.d_attributes = data.attrib;
1319   strncpy(dirp->d_next.d_name, data.name, NAME_MAX);
1320   dirp->d_next.d_name[NAME_MAX] = '\0';
1321 
1322   return &dirp->d_next;
1323 }
1324 
1325 /*
1326 ** Implementation of the POSIX readdir_r() function using the MSVCRT.
1327 */
1328 INT readdir_r(
1329   LPDIR dirp,
1330   LPDIRENT entry,
1331   LPDIRENT *result
1332 ){
1333   struct _finddata_t data;
1334 
1335   if( dirp==NULL ) return EBADF;
1336 
1337   if( dirp->d_first.d_ino==0 ){
1338     dirp->d_first.d_ino++;
1339     dirp->d_next.d_ino++;
1340 
1341     entry->d_ino = dirp->d_first.d_ino;
1342     entry->d_attributes = dirp->d_first.d_attributes;
1343     strncpy(entry->d_name, dirp->d_first.d_name, NAME_MAX);
1344     entry->d_name[NAME_MAX] = '\0';
1345 
1346     *result = entry;
1347     return 0;
1348   }
1349 
1350 next:
1351 
1352   memset(&data, 0, sizeof(struct _finddata_t));
1353   if( _findnext(dirp->d_handle, &data)==-1 ){
1354     *result = NULL;
1355     return ENOENT;
1356   }
1357 
1358   /* TODO: Remove this block to allow hidden and/or system files. */
1359   if( is_filtered(data) ) goto next;
1360 
1361   entry->d_ino = (ino_t)-1; /* not available */
1362   entry->d_attributes = data.attrib;
1363   strncpy(entry->d_name, data.name, NAME_MAX);
1364   entry->d_name[NAME_MAX] = '\0';
1365 
1366   *result = entry;
1367   return 0;
1368 }
1369 
1370 /*
1371 ** Implementation of the POSIX closedir() function using the MSVCRT.
1372 */
1373 INT closedir(
1374   LPDIR dirp
1375 ){
1376   INT result = 0;
1377 
1378   if( dirp==NULL ) return EINVAL;
1379 
1380   if( dirp->d_handle!=NULL_INTPTR_T && dirp->d_handle!=BAD_INTPTR_T ){
1381     result = _findclose(dirp->d_handle);
1382   }
1383 
1384   sqlite3_free(dirp);
1385   return result;
1386 }
1387 
1388 #endif /* defined(WIN32) && defined(_MSC_VER) */
1389 
1390 /************************* End test_windirent.c ********************/
1391 #define dirent DIRENT
1392 #endif
1393 /************************* Begin ../ext/misc/shathree.c ******************/
1394 /*
1395 ** 2017-03-08
1396 **
1397 ** The author disclaims copyright to this source code.  In place of
1398 ** a legal notice, here is a blessing:
1399 **
1400 **    May you do good and not evil.
1401 **    May you find forgiveness for yourself and forgive others.
1402 **    May you share freely, never taking more than you give.
1403 **
1404 ******************************************************************************
1405 **
1406 ** This SQLite extension implements functions that compute SHA3 hashes.
1407 ** Two SQL functions are implemented:
1408 **
1409 **     sha3(X,SIZE)
1410 **     sha3_query(Y,SIZE)
1411 **
1412 ** The sha3(X) function computes the SHA3 hash of the input X, or NULL if
1413 ** X is NULL.
1414 **
1415 ** The sha3_query(Y) function evalutes all queries in the SQL statements of Y
1416 ** and returns a hash of their results.
1417 **
1418 ** The SIZE argument is optional.  If omitted, the SHA3-256 hash algorithm
1419 ** is used.  If SIZE is included it must be one of the integers 224, 256,
1420 ** 384, or 512, to determine SHA3 hash variant that is computed.
1421 */
1422 /* #include "sqlite3ext.h" */
1423 SQLITE_EXTENSION_INIT1
1424 #include <assert.h>
1425 #include <string.h>
1426 #include <stdarg.h>
1427 
1428 #ifndef SQLITE_AMALGAMATION
1429 /* typedef sqlite3_uint64 u64; */
1430 #endif /* SQLITE_AMALGAMATION */
1431 
1432 /******************************************************************************
1433 ** The Hash Engine
1434 */
1435 /*
1436 ** Macros to determine whether the machine is big or little endian,
1437 ** and whether or not that determination is run-time or compile-time.
1438 **
1439 ** For best performance, an attempt is made to guess at the byte-order
1440 ** using C-preprocessor macros.  If that is unsuccessful, or if
1441 ** -DSHA3_BYTEORDER=0 is set, then byte-order is determined
1442 ** at run-time.
1443 */
1444 #ifndef SHA3_BYTEORDER
1445 # if defined(i386)     || defined(__i386__)   || defined(_M_IX86) ||    \
1446      defined(__x86_64) || defined(__x86_64__) || defined(_M_X64)  ||    \
1447      defined(_M_AMD64) || defined(_M_ARM)     || defined(__x86)   ||    \
1448      defined(__arm__)
1449 #   define SHA3_BYTEORDER    1234
1450 # elif defined(sparc)    || defined(__ppc__)
1451 #   define SHA3_BYTEORDER    4321
1452 # else
1453 #   define SHA3_BYTEORDER 0
1454 # endif
1455 #endif
1456 
1457 
1458 /*
1459 ** State structure for a SHA3 hash in progress
1460 */
1461 typedef struct SHA3Context SHA3Context;
1462 struct SHA3Context {
1463   union {
1464     u64 s[25];                /* Keccak state. 5x5 lines of 64 bits each */
1465     unsigned char x[1600];    /* ... or 1600 bytes */
1466   } u;
1467   unsigned nRate;        /* Bytes of input accepted per Keccak iteration */
1468   unsigned nLoaded;      /* Input bytes loaded into u.x[] so far this cycle */
1469   unsigned ixMask;       /* Insert next input into u.x[nLoaded^ixMask]. */
1470 };
1471 
1472 /*
1473 ** A single step of the Keccak mixing function for a 1600-bit state
1474 */
1475 static void KeccakF1600Step(SHA3Context *p){
1476   int i;
1477   u64 b0, b1, b2, b3, b4;
1478   u64 c0, c1, c2, c3, c4;
1479   u64 d0, d1, d2, d3, d4;
1480   static const u64 RC[] = {
1481     0x0000000000000001ULL,  0x0000000000008082ULL,
1482     0x800000000000808aULL,  0x8000000080008000ULL,
1483     0x000000000000808bULL,  0x0000000080000001ULL,
1484     0x8000000080008081ULL,  0x8000000000008009ULL,
1485     0x000000000000008aULL,  0x0000000000000088ULL,
1486     0x0000000080008009ULL,  0x000000008000000aULL,
1487     0x000000008000808bULL,  0x800000000000008bULL,
1488     0x8000000000008089ULL,  0x8000000000008003ULL,
1489     0x8000000000008002ULL,  0x8000000000000080ULL,
1490     0x000000000000800aULL,  0x800000008000000aULL,
1491     0x8000000080008081ULL,  0x8000000000008080ULL,
1492     0x0000000080000001ULL,  0x8000000080008008ULL
1493   };
1494 # define a00 (p->u.s[0])
1495 # define a01 (p->u.s[1])
1496 # define a02 (p->u.s[2])
1497 # define a03 (p->u.s[3])
1498 # define a04 (p->u.s[4])
1499 # define a10 (p->u.s[5])
1500 # define a11 (p->u.s[6])
1501 # define a12 (p->u.s[7])
1502 # define a13 (p->u.s[8])
1503 # define a14 (p->u.s[9])
1504 # define a20 (p->u.s[10])
1505 # define a21 (p->u.s[11])
1506 # define a22 (p->u.s[12])
1507 # define a23 (p->u.s[13])
1508 # define a24 (p->u.s[14])
1509 # define a30 (p->u.s[15])
1510 # define a31 (p->u.s[16])
1511 # define a32 (p->u.s[17])
1512 # define a33 (p->u.s[18])
1513 # define a34 (p->u.s[19])
1514 # define a40 (p->u.s[20])
1515 # define a41 (p->u.s[21])
1516 # define a42 (p->u.s[22])
1517 # define a43 (p->u.s[23])
1518 # define a44 (p->u.s[24])
1519 # define ROL64(a,x) ((a<<x)|(a>>(64-x)))
1520 
1521   for(i=0; i<24; i+=4){
1522     c0 = a00^a10^a20^a30^a40;
1523     c1 = a01^a11^a21^a31^a41;
1524     c2 = a02^a12^a22^a32^a42;
1525     c3 = a03^a13^a23^a33^a43;
1526     c4 = a04^a14^a24^a34^a44;
1527     d0 = c4^ROL64(c1, 1);
1528     d1 = c0^ROL64(c2, 1);
1529     d2 = c1^ROL64(c3, 1);
1530     d3 = c2^ROL64(c4, 1);
1531     d4 = c3^ROL64(c0, 1);
1532 
1533     b0 = (a00^d0);
1534     b1 = ROL64((a11^d1), 44);
1535     b2 = ROL64((a22^d2), 43);
1536     b3 = ROL64((a33^d3), 21);
1537     b4 = ROL64((a44^d4), 14);
1538     a00 =   b0 ^((~b1)&  b2 );
1539     a00 ^= RC[i];
1540     a11 =   b1 ^((~b2)&  b3 );
1541     a22 =   b2 ^((~b3)&  b4 );
1542     a33 =   b3 ^((~b4)&  b0 );
1543     a44 =   b4 ^((~b0)&  b1 );
1544 
1545     b2 = ROL64((a20^d0), 3);
1546     b3 = ROL64((a31^d1), 45);
1547     b4 = ROL64((a42^d2), 61);
1548     b0 = ROL64((a03^d3), 28);
1549     b1 = ROL64((a14^d4), 20);
1550     a20 =   b0 ^((~b1)&  b2 );
1551     a31 =   b1 ^((~b2)&  b3 );
1552     a42 =   b2 ^((~b3)&  b4 );
1553     a03 =   b3 ^((~b4)&  b0 );
1554     a14 =   b4 ^((~b0)&  b1 );
1555 
1556     b4 = ROL64((a40^d0), 18);
1557     b0 = ROL64((a01^d1), 1);
1558     b1 = ROL64((a12^d2), 6);
1559     b2 = ROL64((a23^d3), 25);
1560     b3 = ROL64((a34^d4), 8);
1561     a40 =   b0 ^((~b1)&  b2 );
1562     a01 =   b1 ^((~b2)&  b3 );
1563     a12 =   b2 ^((~b3)&  b4 );
1564     a23 =   b3 ^((~b4)&  b0 );
1565     a34 =   b4 ^((~b0)&  b1 );
1566 
1567     b1 = ROL64((a10^d0), 36);
1568     b2 = ROL64((a21^d1), 10);
1569     b3 = ROL64((a32^d2), 15);
1570     b4 = ROL64((a43^d3), 56);
1571     b0 = ROL64((a04^d4), 27);
1572     a10 =   b0 ^((~b1)&  b2 );
1573     a21 =   b1 ^((~b2)&  b3 );
1574     a32 =   b2 ^((~b3)&  b4 );
1575     a43 =   b3 ^((~b4)&  b0 );
1576     a04 =   b4 ^((~b0)&  b1 );
1577 
1578     b3 = ROL64((a30^d0), 41);
1579     b4 = ROL64((a41^d1), 2);
1580     b0 = ROL64((a02^d2), 62);
1581     b1 = ROL64((a13^d3), 55);
1582     b2 = ROL64((a24^d4), 39);
1583     a30 =   b0 ^((~b1)&  b2 );
1584     a41 =   b1 ^((~b2)&  b3 );
1585     a02 =   b2 ^((~b3)&  b4 );
1586     a13 =   b3 ^((~b4)&  b0 );
1587     a24 =   b4 ^((~b0)&  b1 );
1588 
1589     c0 = a00^a20^a40^a10^a30;
1590     c1 = a11^a31^a01^a21^a41;
1591     c2 = a22^a42^a12^a32^a02;
1592     c3 = a33^a03^a23^a43^a13;
1593     c4 = a44^a14^a34^a04^a24;
1594     d0 = c4^ROL64(c1, 1);
1595     d1 = c0^ROL64(c2, 1);
1596     d2 = c1^ROL64(c3, 1);
1597     d3 = c2^ROL64(c4, 1);
1598     d4 = c3^ROL64(c0, 1);
1599 
1600     b0 = (a00^d0);
1601     b1 = ROL64((a31^d1), 44);
1602     b2 = ROL64((a12^d2), 43);
1603     b3 = ROL64((a43^d3), 21);
1604     b4 = ROL64((a24^d4), 14);
1605     a00 =   b0 ^((~b1)&  b2 );
1606     a00 ^= RC[i+1];
1607     a31 =   b1 ^((~b2)&  b3 );
1608     a12 =   b2 ^((~b3)&  b4 );
1609     a43 =   b3 ^((~b4)&  b0 );
1610     a24 =   b4 ^((~b0)&  b1 );
1611 
1612     b2 = ROL64((a40^d0), 3);
1613     b3 = ROL64((a21^d1), 45);
1614     b4 = ROL64((a02^d2), 61);
1615     b0 = ROL64((a33^d3), 28);
1616     b1 = ROL64((a14^d4), 20);
1617     a40 =   b0 ^((~b1)&  b2 );
1618     a21 =   b1 ^((~b2)&  b3 );
1619     a02 =   b2 ^((~b3)&  b4 );
1620     a33 =   b3 ^((~b4)&  b0 );
1621     a14 =   b4 ^((~b0)&  b1 );
1622 
1623     b4 = ROL64((a30^d0), 18);
1624     b0 = ROL64((a11^d1), 1);
1625     b1 = ROL64((a42^d2), 6);
1626     b2 = ROL64((a23^d3), 25);
1627     b3 = ROL64((a04^d4), 8);
1628     a30 =   b0 ^((~b1)&  b2 );
1629     a11 =   b1 ^((~b2)&  b3 );
1630     a42 =   b2 ^((~b3)&  b4 );
1631     a23 =   b3 ^((~b4)&  b0 );
1632     a04 =   b4 ^((~b0)&  b1 );
1633 
1634     b1 = ROL64((a20^d0), 36);
1635     b2 = ROL64((a01^d1), 10);
1636     b3 = ROL64((a32^d2), 15);
1637     b4 = ROL64((a13^d3), 56);
1638     b0 = ROL64((a44^d4), 27);
1639     a20 =   b0 ^((~b1)&  b2 );
1640     a01 =   b1 ^((~b2)&  b3 );
1641     a32 =   b2 ^((~b3)&  b4 );
1642     a13 =   b3 ^((~b4)&  b0 );
1643     a44 =   b4 ^((~b0)&  b1 );
1644 
1645     b3 = ROL64((a10^d0), 41);
1646     b4 = ROL64((a41^d1), 2);
1647     b0 = ROL64((a22^d2), 62);
1648     b1 = ROL64((a03^d3), 55);
1649     b2 = ROL64((a34^d4), 39);
1650     a10 =   b0 ^((~b1)&  b2 );
1651     a41 =   b1 ^((~b2)&  b3 );
1652     a22 =   b2 ^((~b3)&  b4 );
1653     a03 =   b3 ^((~b4)&  b0 );
1654     a34 =   b4 ^((~b0)&  b1 );
1655 
1656     c0 = a00^a40^a30^a20^a10;
1657     c1 = a31^a21^a11^a01^a41;
1658     c2 = a12^a02^a42^a32^a22;
1659     c3 = a43^a33^a23^a13^a03;
1660     c4 = a24^a14^a04^a44^a34;
1661     d0 = c4^ROL64(c1, 1);
1662     d1 = c0^ROL64(c2, 1);
1663     d2 = c1^ROL64(c3, 1);
1664     d3 = c2^ROL64(c4, 1);
1665     d4 = c3^ROL64(c0, 1);
1666 
1667     b0 = (a00^d0);
1668     b1 = ROL64((a21^d1), 44);
1669     b2 = ROL64((a42^d2), 43);
1670     b3 = ROL64((a13^d3), 21);
1671     b4 = ROL64((a34^d4), 14);
1672     a00 =   b0 ^((~b1)&  b2 );
1673     a00 ^= RC[i+2];
1674     a21 =   b1 ^((~b2)&  b3 );
1675     a42 =   b2 ^((~b3)&  b4 );
1676     a13 =   b3 ^((~b4)&  b0 );
1677     a34 =   b4 ^((~b0)&  b1 );
1678 
1679     b2 = ROL64((a30^d0), 3);
1680     b3 = ROL64((a01^d1), 45);
1681     b4 = ROL64((a22^d2), 61);
1682     b0 = ROL64((a43^d3), 28);
1683     b1 = ROL64((a14^d4), 20);
1684     a30 =   b0 ^((~b1)&  b2 );
1685     a01 =   b1 ^((~b2)&  b3 );
1686     a22 =   b2 ^((~b3)&  b4 );
1687     a43 =   b3 ^((~b4)&  b0 );
1688     a14 =   b4 ^((~b0)&  b1 );
1689 
1690     b4 = ROL64((a10^d0), 18);
1691     b0 = ROL64((a31^d1), 1);
1692     b1 = ROL64((a02^d2), 6);
1693     b2 = ROL64((a23^d3), 25);
1694     b3 = ROL64((a44^d4), 8);
1695     a10 =   b0 ^((~b1)&  b2 );
1696     a31 =   b1 ^((~b2)&  b3 );
1697     a02 =   b2 ^((~b3)&  b4 );
1698     a23 =   b3 ^((~b4)&  b0 );
1699     a44 =   b4 ^((~b0)&  b1 );
1700 
1701     b1 = ROL64((a40^d0), 36);
1702     b2 = ROL64((a11^d1), 10);
1703     b3 = ROL64((a32^d2), 15);
1704     b4 = ROL64((a03^d3), 56);
1705     b0 = ROL64((a24^d4), 27);
1706     a40 =   b0 ^((~b1)&  b2 );
1707     a11 =   b1 ^((~b2)&  b3 );
1708     a32 =   b2 ^((~b3)&  b4 );
1709     a03 =   b3 ^((~b4)&  b0 );
1710     a24 =   b4 ^((~b0)&  b1 );
1711 
1712     b3 = ROL64((a20^d0), 41);
1713     b4 = ROL64((a41^d1), 2);
1714     b0 = ROL64((a12^d2), 62);
1715     b1 = ROL64((a33^d3), 55);
1716     b2 = ROL64((a04^d4), 39);
1717     a20 =   b0 ^((~b1)&  b2 );
1718     a41 =   b1 ^((~b2)&  b3 );
1719     a12 =   b2 ^((~b3)&  b4 );
1720     a33 =   b3 ^((~b4)&  b0 );
1721     a04 =   b4 ^((~b0)&  b1 );
1722 
1723     c0 = a00^a30^a10^a40^a20;
1724     c1 = a21^a01^a31^a11^a41;
1725     c2 = a42^a22^a02^a32^a12;
1726     c3 = a13^a43^a23^a03^a33;
1727     c4 = a34^a14^a44^a24^a04;
1728     d0 = c4^ROL64(c1, 1);
1729     d1 = c0^ROL64(c2, 1);
1730     d2 = c1^ROL64(c3, 1);
1731     d3 = c2^ROL64(c4, 1);
1732     d4 = c3^ROL64(c0, 1);
1733 
1734     b0 = (a00^d0);
1735     b1 = ROL64((a01^d1), 44);
1736     b2 = ROL64((a02^d2), 43);
1737     b3 = ROL64((a03^d3), 21);
1738     b4 = ROL64((a04^d4), 14);
1739     a00 =   b0 ^((~b1)&  b2 );
1740     a00 ^= RC[i+3];
1741     a01 =   b1 ^((~b2)&  b3 );
1742     a02 =   b2 ^((~b3)&  b4 );
1743     a03 =   b3 ^((~b4)&  b0 );
1744     a04 =   b4 ^((~b0)&  b1 );
1745 
1746     b2 = ROL64((a10^d0), 3);
1747     b3 = ROL64((a11^d1), 45);
1748     b4 = ROL64((a12^d2), 61);
1749     b0 = ROL64((a13^d3), 28);
1750     b1 = ROL64((a14^d4), 20);
1751     a10 =   b0 ^((~b1)&  b2 );
1752     a11 =   b1 ^((~b2)&  b3 );
1753     a12 =   b2 ^((~b3)&  b4 );
1754     a13 =   b3 ^((~b4)&  b0 );
1755     a14 =   b4 ^((~b0)&  b1 );
1756 
1757     b4 = ROL64((a20^d0), 18);
1758     b0 = ROL64((a21^d1), 1);
1759     b1 = ROL64((a22^d2), 6);
1760     b2 = ROL64((a23^d3), 25);
1761     b3 = ROL64((a24^d4), 8);
1762     a20 =   b0 ^((~b1)&  b2 );
1763     a21 =   b1 ^((~b2)&  b3 );
1764     a22 =   b2 ^((~b3)&  b4 );
1765     a23 =   b3 ^((~b4)&  b0 );
1766     a24 =   b4 ^((~b0)&  b1 );
1767 
1768     b1 = ROL64((a30^d0), 36);
1769     b2 = ROL64((a31^d1), 10);
1770     b3 = ROL64((a32^d2), 15);
1771     b4 = ROL64((a33^d3), 56);
1772     b0 = ROL64((a34^d4), 27);
1773     a30 =   b0 ^((~b1)&  b2 );
1774     a31 =   b1 ^((~b2)&  b3 );
1775     a32 =   b2 ^((~b3)&  b4 );
1776     a33 =   b3 ^((~b4)&  b0 );
1777     a34 =   b4 ^((~b0)&  b1 );
1778 
1779     b3 = ROL64((a40^d0), 41);
1780     b4 = ROL64((a41^d1), 2);
1781     b0 = ROL64((a42^d2), 62);
1782     b1 = ROL64((a43^d3), 55);
1783     b2 = ROL64((a44^d4), 39);
1784     a40 =   b0 ^((~b1)&  b2 );
1785     a41 =   b1 ^((~b2)&  b3 );
1786     a42 =   b2 ^((~b3)&  b4 );
1787     a43 =   b3 ^((~b4)&  b0 );
1788     a44 =   b4 ^((~b0)&  b1 );
1789   }
1790 }
1791 
1792 /*
1793 ** Initialize a new hash.  iSize determines the size of the hash
1794 ** in bits and should be one of 224, 256, 384, or 512.  Or iSize
1795 ** can be zero to use the default hash size of 256 bits.
1796 */
1797 static void SHA3Init(SHA3Context *p, int iSize){
1798   memset(p, 0, sizeof(*p));
1799   if( iSize>=128 && iSize<=512 ){
1800     p->nRate = (1600 - ((iSize + 31)&~31)*2)/8;
1801   }else{
1802     p->nRate = (1600 - 2*256)/8;
1803   }
1804 #if SHA3_BYTEORDER==1234
1805   /* Known to be little-endian at compile-time. No-op */
1806 #elif SHA3_BYTEORDER==4321
1807   p->ixMask = 7;  /* Big-endian */
1808 #else
1809   {
1810     static unsigned int one = 1;
1811     if( 1==*(unsigned char*)&one ){
1812       /* Little endian.  No byte swapping. */
1813       p->ixMask = 0;
1814     }else{
1815       /* Big endian.  Byte swap. */
1816       p->ixMask = 7;
1817     }
1818   }
1819 #endif
1820 }
1821 
1822 /*
1823 ** Make consecutive calls to the SHA3Update function to add new content
1824 ** to the hash
1825 */
1826 static void SHA3Update(
1827   SHA3Context *p,
1828   const unsigned char *aData,
1829   unsigned int nData
1830 ){
1831   unsigned int i = 0;
1832 #if SHA3_BYTEORDER==1234
1833   if( (p->nLoaded % 8)==0 && ((aData - (const unsigned char*)0)&7)==0 ){
1834     for(; i+7<nData; i+=8){
1835       p->u.s[p->nLoaded/8] ^= *(u64*)&aData[i];
1836       p->nLoaded += 8;
1837       if( p->nLoaded>=p->nRate ){
1838         KeccakF1600Step(p);
1839         p->nLoaded = 0;
1840       }
1841     }
1842   }
1843 #endif
1844   for(; i<nData; i++){
1845 #if SHA3_BYTEORDER==1234
1846     p->u.x[p->nLoaded] ^= aData[i];
1847 #elif SHA3_BYTEORDER==4321
1848     p->u.x[p->nLoaded^0x07] ^= aData[i];
1849 #else
1850     p->u.x[p->nLoaded^p->ixMask] ^= aData[i];
1851 #endif
1852     p->nLoaded++;
1853     if( p->nLoaded==p->nRate ){
1854       KeccakF1600Step(p);
1855       p->nLoaded = 0;
1856     }
1857   }
1858 }
1859 
1860 /*
1861 ** After all content has been added, invoke SHA3Final() to compute
1862 ** the final hash.  The function returns a pointer to the binary
1863 ** hash value.
1864 */
1865 static unsigned char *SHA3Final(SHA3Context *p){
1866   unsigned int i;
1867   if( p->nLoaded==p->nRate-1 ){
1868     const unsigned char c1 = 0x86;
1869     SHA3Update(p, &c1, 1);
1870   }else{
1871     const unsigned char c2 = 0x06;
1872     const unsigned char c3 = 0x80;
1873     SHA3Update(p, &c2, 1);
1874     p->nLoaded = p->nRate - 1;
1875     SHA3Update(p, &c3, 1);
1876   }
1877   for(i=0; i<p->nRate; i++){
1878     p->u.x[i+p->nRate] = p->u.x[i^p->ixMask];
1879   }
1880   return &p->u.x[p->nRate];
1881 }
1882 /* End of the hashing logic
1883 *****************************************************************************/
1884 
1885 /*
1886 ** Implementation of the sha3(X,SIZE) function.
1887 **
1888 ** Return a BLOB which is the SIZE-bit SHA3 hash of X.  The default
1889 ** size is 256.  If X is a BLOB, it is hashed as is.
1890 ** For all other non-NULL types of input, X is converted into a UTF-8 string
1891 ** and the string is hashed without the trailing 0x00 terminator.  The hash
1892 ** of a NULL value is NULL.
1893 */
1894 static void sha3Func(
1895   sqlite3_context *context,
1896   int argc,
1897   sqlite3_value **argv
1898 ){
1899   SHA3Context cx;
1900   int eType = sqlite3_value_type(argv[0]);
1901   int nByte = sqlite3_value_bytes(argv[0]);
1902   int iSize;
1903   if( argc==1 ){
1904     iSize = 256;
1905   }else{
1906     iSize = sqlite3_value_int(argv[1]);
1907     if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){
1908       sqlite3_result_error(context, "SHA3 size should be one of: 224 256 "
1909                                     "384 512", -1);
1910       return;
1911     }
1912   }
1913   if( eType==SQLITE_NULL ) return;
1914   SHA3Init(&cx, iSize);
1915   if( eType==SQLITE_BLOB ){
1916     SHA3Update(&cx, sqlite3_value_blob(argv[0]), nByte);
1917   }else{
1918     SHA3Update(&cx, sqlite3_value_text(argv[0]), nByte);
1919   }
1920   sqlite3_result_blob(context, SHA3Final(&cx), iSize/8, SQLITE_TRANSIENT);
1921 }
1922 
1923 /* Compute a string using sqlite3_vsnprintf() with a maximum length
1924 ** of 50 bytes and add it to the hash.
1925 */
1926 static void hash_step_vformat(
1927   SHA3Context *p,                 /* Add content to this context */
1928   const char *zFormat,
1929   ...
1930 ){
1931   va_list ap;
1932   int n;
1933   char zBuf[50];
1934   va_start(ap, zFormat);
1935   sqlite3_vsnprintf(sizeof(zBuf),zBuf,zFormat,ap);
1936   va_end(ap);
1937   n = (int)strlen(zBuf);
1938   SHA3Update(p, (unsigned char*)zBuf, n);
1939 }
1940 
1941 /*
1942 ** Implementation of the sha3_query(SQL,SIZE) function.
1943 **
1944 ** This function compiles and runs the SQL statement(s) given in the
1945 ** argument. The results are hashed using a SIZE-bit SHA3.  The default
1946 ** size is 256.
1947 **
1948 ** The format of the byte stream that is hashed is summarized as follows:
1949 **
1950 **       S<n>:<sql>
1951 **       R
1952 **       N
1953 **       I<int>
1954 **       F<ieee-float>
1955 **       B<size>:<bytes>
1956 **       T<size>:<text>
1957 **
1958 ** <sql> is the original SQL text for each statement run and <n> is
1959 ** the size of that text.  The SQL text is UTF-8.  A single R character
1960 ** occurs before the start of each row.  N means a NULL value.
1961 ** I mean an 8-byte little-endian integer <int>.  F is a floating point
1962 ** number with an 8-byte little-endian IEEE floating point value <ieee-float>.
1963 ** B means blobs of <size> bytes.  T means text rendered as <size>
1964 ** bytes of UTF-8.  The <n> and <size> values are expressed as an ASCII
1965 ** text integers.
1966 **
1967 ** For each SQL statement in the X input, there is one S segment.  Each
1968 ** S segment is followed by zero or more R segments, one for each row in the
1969 ** result set.  After each R, there are one or more N, I, F, B, or T segments,
1970 ** one for each column in the result set.  Segments are concatentated directly
1971 ** with no delimiters of any kind.
1972 */
1973 static void sha3QueryFunc(
1974   sqlite3_context *context,
1975   int argc,
1976   sqlite3_value **argv
1977 ){
1978   sqlite3 *db = sqlite3_context_db_handle(context);
1979   const char *zSql = (const char*)sqlite3_value_text(argv[0]);
1980   sqlite3_stmt *pStmt = 0;
1981   int nCol;                   /* Number of columns in the result set */
1982   int i;                      /* Loop counter */
1983   int rc;
1984   int n;
1985   const char *z;
1986   SHA3Context cx;
1987   int iSize;
1988 
1989   if( argc==1 ){
1990     iSize = 256;
1991   }else{
1992     iSize = sqlite3_value_int(argv[1]);
1993     if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){
1994       sqlite3_result_error(context, "SHA3 size should be one of: 224 256 "
1995                                     "384 512", -1);
1996       return;
1997     }
1998   }
1999   if( zSql==0 ) return;
2000   SHA3Init(&cx, iSize);
2001   while( zSql[0] ){
2002     rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zSql);
2003     if( rc ){
2004       char *zMsg = sqlite3_mprintf("error SQL statement [%s]: %s",
2005                                    zSql, sqlite3_errmsg(db));
2006       sqlite3_finalize(pStmt);
2007       sqlite3_result_error(context, zMsg, -1);
2008       sqlite3_free(zMsg);
2009       return;
2010     }
2011     if( !sqlite3_stmt_readonly(pStmt) ){
2012       char *zMsg = sqlite3_mprintf("non-query: [%s]", sqlite3_sql(pStmt));
2013       sqlite3_finalize(pStmt);
2014       sqlite3_result_error(context, zMsg, -1);
2015       sqlite3_free(zMsg);
2016       return;
2017     }
2018     nCol = sqlite3_column_count(pStmt);
2019     z = sqlite3_sql(pStmt);
2020     if( z ){
2021       n = (int)strlen(z);
2022       hash_step_vformat(&cx,"S%d:",n);
2023       SHA3Update(&cx,(unsigned char*)z,n);
2024     }
2025 
2026     /* Compute a hash over the result of the query */
2027     while( SQLITE_ROW==sqlite3_step(pStmt) ){
2028       SHA3Update(&cx,(const unsigned char*)"R",1);
2029       for(i=0; i<nCol; i++){
2030         switch( sqlite3_column_type(pStmt,i) ){
2031           case SQLITE_NULL: {
2032             SHA3Update(&cx, (const unsigned char*)"N",1);
2033             break;
2034           }
2035           case SQLITE_INTEGER: {
2036             sqlite3_uint64 u;
2037             int j;
2038             unsigned char x[9];
2039             sqlite3_int64 v = sqlite3_column_int64(pStmt,i);
2040             memcpy(&u, &v, 8);
2041             for(j=8; j>=1; j--){
2042               x[j] = u & 0xff;
2043               u >>= 8;
2044             }
2045             x[0] = 'I';
2046             SHA3Update(&cx, x, 9);
2047             break;
2048           }
2049           case SQLITE_FLOAT: {
2050             sqlite3_uint64 u;
2051             int j;
2052             unsigned char x[9];
2053             double r = sqlite3_column_double(pStmt,i);
2054             memcpy(&u, &r, 8);
2055             for(j=8; j>=1; j--){
2056               x[j] = u & 0xff;
2057               u >>= 8;
2058             }
2059             x[0] = 'F';
2060             SHA3Update(&cx,x,9);
2061             break;
2062           }
2063           case SQLITE_TEXT: {
2064             int n2 = sqlite3_column_bytes(pStmt, i);
2065             const unsigned char *z2 = sqlite3_column_text(pStmt, i);
2066             hash_step_vformat(&cx,"T%d:",n2);
2067             SHA3Update(&cx, z2, n2);
2068             break;
2069           }
2070           case SQLITE_BLOB: {
2071             int n2 = sqlite3_column_bytes(pStmt, i);
2072             const unsigned char *z2 = sqlite3_column_blob(pStmt, i);
2073             hash_step_vformat(&cx,"B%d:",n2);
2074             SHA3Update(&cx, z2, n2);
2075             break;
2076           }
2077         }
2078       }
2079     }
2080     sqlite3_finalize(pStmt);
2081   }
2082   sqlite3_result_blob(context, SHA3Final(&cx), iSize/8, SQLITE_TRANSIENT);
2083 }
2084 
2085 
2086 #ifdef _WIN32
2087 
2088 #endif
2089 int sqlite3_shathree_init(
2090   sqlite3 *db,
2091   char **pzErrMsg,
2092   const sqlite3_api_routines *pApi
2093 ){
2094   int rc = SQLITE_OK;
2095   SQLITE_EXTENSION_INIT2(pApi);
2096   (void)pzErrMsg;  /* Unused parameter */
2097   rc = sqlite3_create_function(db, "sha3", 1,
2098                       SQLITE_UTF8 | SQLITE_INNOCUOUS | SQLITE_DETERMINISTIC,
2099                       0, sha3Func, 0, 0);
2100   if( rc==SQLITE_OK ){
2101     rc = sqlite3_create_function(db, "sha3", 2,
2102                       SQLITE_UTF8 | SQLITE_INNOCUOUS | SQLITE_DETERMINISTIC,
2103                       0, sha3Func, 0, 0);
2104   }
2105   if( rc==SQLITE_OK ){
2106     rc = sqlite3_create_function(db, "sha3_query", 1,
2107                       SQLITE_UTF8 | SQLITE_DIRECTONLY,
2108                       0, sha3QueryFunc, 0, 0);
2109   }
2110   if( rc==SQLITE_OK ){
2111     rc = sqlite3_create_function(db, "sha3_query", 2,
2112                       SQLITE_UTF8 | SQLITE_DIRECTONLY,
2113                       0, sha3QueryFunc, 0, 0);
2114   }
2115   return rc;
2116 }
2117 
2118 /************************* End ../ext/misc/shathree.c ********************/
2119 /************************* Begin ../ext/misc/fileio.c ******************/
2120 /*
2121 ** 2014-06-13
2122 **
2123 ** The author disclaims copyright to this source code.  In place of
2124 ** a legal notice, here is a blessing:
2125 **
2126 **    May you do good and not evil.
2127 **    May you find forgiveness for yourself and forgive others.
2128 **    May you share freely, never taking more than you give.
2129 **
2130 ******************************************************************************
2131 **
2132 ** This SQLite extension implements SQL functions readfile() and
2133 ** writefile(), and eponymous virtual type "fsdir".
2134 **
2135 ** WRITEFILE(FILE, DATA [, MODE [, MTIME]]):
2136 **
2137 **   If neither of the optional arguments is present, then this UDF
2138 **   function writes blob DATA to file FILE. If successful, the number
2139 **   of bytes written is returned. If an error occurs, NULL is returned.
2140 **
2141 **   If the first option argument - MODE - is present, then it must
2142 **   be passed an integer value that corresponds to a POSIX mode
2143 **   value (file type + permissions, as returned in the stat.st_mode
2144 **   field by the stat() system call). Three types of files may
2145 **   be written/created:
2146 **
2147 **     regular files:  (mode & 0170000)==0100000
2148 **     symbolic links: (mode & 0170000)==0120000
2149 **     directories:    (mode & 0170000)==0040000
2150 **
2151 **   For a directory, the DATA is ignored. For a symbolic link, it is
2152 **   interpreted as text and used as the target of the link. For a
2153 **   regular file, it is interpreted as a blob and written into the
2154 **   named file. Regardless of the type of file, its permissions are
2155 **   set to (mode & 0777) before returning.
2156 **
2157 **   If the optional MTIME argument is present, then it is interpreted
2158 **   as an integer - the number of seconds since the unix epoch. The
2159 **   modification-time of the target file is set to this value before
2160 **   returning.
2161 **
2162 **   If three or more arguments are passed to this function and an
2163 **   error is encountered, an exception is raised.
2164 **
2165 ** READFILE(FILE):
2166 **
2167 **   Read and return the contents of file FILE (type blob) from disk.
2168 **
2169 ** FSDIR:
2170 **
2171 **   Used as follows:
2172 **
2173 **     SELECT * FROM fsdir($path [, $dir]);
2174 **
2175 **   Parameter $path is an absolute or relative pathname. If the file that it
2176 **   refers to does not exist, it is an error. If the path refers to a regular
2177 **   file or symbolic link, it returns a single row. Or, if the path refers
2178 **   to a directory, it returns one row for the directory, and one row for each
2179 **   file within the hierarchy rooted at $path.
2180 **
2181 **   Each row has the following columns:
2182 **
2183 **     name:  Path to file or directory (text value).
2184 **     mode:  Value of stat.st_mode for directory entry (an integer).
2185 **     mtime: Value of stat.st_mtime for directory entry (an integer).
2186 **     data:  For a regular file, a blob containing the file data. For a
2187 **            symlink, a text value containing the text of the link. For a
2188 **            directory, NULL.
2189 **
2190 **   If a non-NULL value is specified for the optional $dir parameter and
2191 **   $path is a relative path, then $path is interpreted relative to $dir.
2192 **   And the paths returned in the "name" column of the table are also
2193 **   relative to directory $dir.
2194 */
2195 /* #include "sqlite3ext.h" */
2196 SQLITE_EXTENSION_INIT1
2197 #include <stdio.h>
2198 #include <string.h>
2199 #include <assert.h>
2200 
2201 #include <sys/types.h>
2202 #include <sys/stat.h>
2203 #include <fcntl.h>
2204 #if !defined(_WIN32) && !defined(WIN32)
2205 #  include <unistd.h>
2206 #  include <dirent.h>
2207 #  include <utime.h>
2208 #  include <sys/time.h>
2209 #else
2210 #  include "windows.h"
2211 #  include <io.h>
2212 #  include <direct.h>
2213 /* #  include "test_windirent.h" */
2214 #  define dirent DIRENT
2215 #  ifndef chmod
2216 #    define chmod _chmod
2217 #  endif
2218 #  ifndef stat
2219 #    define stat _stat
2220 #  endif
2221 #  define mkdir(path,mode) _mkdir(path)
2222 #  define lstat(path,buf) stat(path,buf)
2223 #endif
2224 #include <time.h>
2225 #include <errno.h>
2226 
2227 
2228 /*
2229 ** Structure of the fsdir() table-valued function
2230 */
2231                  /*    0    1    2     3    4           5             */
2232 #define FSDIR_SCHEMA "(name,mode,mtime,data,path HIDDEN,dir HIDDEN)"
2233 #define FSDIR_COLUMN_NAME     0     /* Name of the file */
2234 #define FSDIR_COLUMN_MODE     1     /* Access mode */
2235 #define FSDIR_COLUMN_MTIME    2     /* Last modification time */
2236 #define FSDIR_COLUMN_DATA     3     /* File content */
2237 #define FSDIR_COLUMN_PATH     4     /* Path to top of search */
2238 #define FSDIR_COLUMN_DIR      5     /* Path is relative to this directory */
2239 
2240 
2241 /*
2242 ** Set the result stored by context ctx to a blob containing the
2243 ** contents of file zName.  Or, leave the result unchanged (NULL)
2244 ** if the file does not exist or is unreadable.
2245 **
2246 ** If the file exceeds the SQLite blob size limit, through an
2247 ** SQLITE_TOOBIG error.
2248 **
2249 ** Throw an SQLITE_IOERR if there are difficulties pulling the file
2250 ** off of disk.
2251 */
2252 static void readFileContents(sqlite3_context *ctx, const char *zName){
2253   FILE *in;
2254   sqlite3_int64 nIn;
2255   void *pBuf;
2256   sqlite3 *db;
2257   int mxBlob;
2258 
2259   in = fopen(zName, "rb");
2260   if( in==0 ){
2261     /* File does not exist or is unreadable. Leave the result set to NULL. */
2262     return;
2263   }
2264   fseek(in, 0, SEEK_END);
2265   nIn = ftell(in);
2266   rewind(in);
2267   db = sqlite3_context_db_handle(ctx);
2268   mxBlob = sqlite3_limit(db, SQLITE_LIMIT_LENGTH, -1);
2269   if( nIn>mxBlob ){
2270     sqlite3_result_error_code(ctx, SQLITE_TOOBIG);
2271     fclose(in);
2272     return;
2273   }
2274   pBuf = sqlite3_malloc64( nIn ? nIn : 1 );
2275   if( pBuf==0 ){
2276     sqlite3_result_error_nomem(ctx);
2277     fclose(in);
2278     return;
2279   }
2280   if( nIn==(sqlite3_int64)fread(pBuf, 1, (size_t)nIn, in) ){
2281     sqlite3_result_blob64(ctx, pBuf, nIn, sqlite3_free);
2282   }else{
2283     sqlite3_result_error_code(ctx, SQLITE_IOERR);
2284     sqlite3_free(pBuf);
2285   }
2286   fclose(in);
2287 }
2288 
2289 /*
2290 ** Implementation of the "readfile(X)" SQL function.  The entire content
2291 ** of the file named X is read and returned as a BLOB.  NULL is returned
2292 ** if the file does not exist or is unreadable.
2293 */
2294 static void readfileFunc(
2295   sqlite3_context *context,
2296   int argc,
2297   sqlite3_value **argv
2298 ){
2299   const char *zName;
2300   (void)(argc);  /* Unused parameter */
2301   zName = (const char*)sqlite3_value_text(argv[0]);
2302   if( zName==0 ) return;
2303   readFileContents(context, zName);
2304 }
2305 
2306 /*
2307 ** Set the error message contained in context ctx to the results of
2308 ** vprintf(zFmt, ...).
2309 */
2310 static void ctxErrorMsg(sqlite3_context *ctx, const char *zFmt, ...){
2311   char *zMsg = 0;
2312   va_list ap;
2313   va_start(ap, zFmt);
2314   zMsg = sqlite3_vmprintf(zFmt, ap);
2315   sqlite3_result_error(ctx, zMsg, -1);
2316   sqlite3_free(zMsg);
2317   va_end(ap);
2318 }
2319 
2320 #if defined(_WIN32)
2321 /*
2322 ** This function is designed to convert a Win32 FILETIME structure into the
2323 ** number of seconds since the Unix Epoch (1970-01-01 00:00:00 UTC).
2324 */
2325 static sqlite3_uint64 fileTimeToUnixTime(
2326   LPFILETIME pFileTime
2327 ){
2328   SYSTEMTIME epochSystemTime;
2329   ULARGE_INTEGER epochIntervals;
2330   FILETIME epochFileTime;
2331   ULARGE_INTEGER fileIntervals;
2332 
2333   memset(&epochSystemTime, 0, sizeof(SYSTEMTIME));
2334   epochSystemTime.wYear = 1970;
2335   epochSystemTime.wMonth = 1;
2336   epochSystemTime.wDay = 1;
2337   SystemTimeToFileTime(&epochSystemTime, &epochFileTime);
2338   epochIntervals.LowPart = epochFileTime.dwLowDateTime;
2339   epochIntervals.HighPart = epochFileTime.dwHighDateTime;
2340 
2341   fileIntervals.LowPart = pFileTime->dwLowDateTime;
2342   fileIntervals.HighPart = pFileTime->dwHighDateTime;
2343 
2344   return (fileIntervals.QuadPart - epochIntervals.QuadPart) / 10000000;
2345 }
2346 
2347 /*
2348 ** This function attempts to normalize the time values found in the stat()
2349 ** buffer to UTC.  This is necessary on Win32, where the runtime library
2350 ** appears to return these values as local times.
2351 */
2352 static void statTimesToUtc(
2353   const char *zPath,
2354   struct stat *pStatBuf
2355 ){
2356   HANDLE hFindFile;
2357   WIN32_FIND_DATAW fd;
2358   LPWSTR zUnicodeName;
2359   extern LPWSTR sqlite3_win32_utf8_to_unicode(const char*);
2360   zUnicodeName = sqlite3_win32_utf8_to_unicode(zPath);
2361   if( zUnicodeName ){
2362     memset(&fd, 0, sizeof(WIN32_FIND_DATAW));
2363     hFindFile = FindFirstFileW(zUnicodeName, &fd);
2364     if( hFindFile!=NULL ){
2365       pStatBuf->st_ctime = (time_t)fileTimeToUnixTime(&fd.ftCreationTime);
2366       pStatBuf->st_atime = (time_t)fileTimeToUnixTime(&fd.ftLastAccessTime);
2367       pStatBuf->st_mtime = (time_t)fileTimeToUnixTime(&fd.ftLastWriteTime);
2368       FindClose(hFindFile);
2369     }
2370     sqlite3_free(zUnicodeName);
2371   }
2372 }
2373 #endif
2374 
2375 /*
2376 ** This function is used in place of stat().  On Windows, special handling
2377 ** is required in order for the included time to be returned as UTC.  On all
2378 ** other systems, this function simply calls stat().
2379 */
2380 static int fileStat(
2381   const char *zPath,
2382   struct stat *pStatBuf
2383 ){
2384 #if defined(_WIN32)
2385   int rc = stat(zPath, pStatBuf);
2386   if( rc==0 ) statTimesToUtc(zPath, pStatBuf);
2387   return rc;
2388 #else
2389   return stat(zPath, pStatBuf);
2390 #endif
2391 }
2392 
2393 /*
2394 ** This function is used in place of lstat().  On Windows, special handling
2395 ** is required in order for the included time to be returned as UTC.  On all
2396 ** other systems, this function simply calls lstat().
2397 */
2398 static int fileLinkStat(
2399   const char *zPath,
2400   struct stat *pStatBuf
2401 ){
2402 #if defined(_WIN32)
2403   int rc = lstat(zPath, pStatBuf);
2404   if( rc==0 ) statTimesToUtc(zPath, pStatBuf);
2405   return rc;
2406 #else
2407   return lstat(zPath, pStatBuf);
2408 #endif
2409 }
2410 
2411 /*
2412 ** Argument zFile is the name of a file that will be created and/or written
2413 ** by SQL function writefile(). This function ensures that the directory
2414 ** zFile will be written to exists, creating it if required. The permissions
2415 ** for any path components created by this function are set in accordance
2416 ** with the current umask.
2417 **
2418 ** If an OOM condition is encountered, SQLITE_NOMEM is returned. Otherwise,
2419 ** SQLITE_OK is returned if the directory is successfully created, or
2420 ** SQLITE_ERROR otherwise.
2421 */
2422 static int makeDirectory(
2423   const char *zFile
2424 ){
2425   char *zCopy = sqlite3_mprintf("%s", zFile);
2426   int rc = SQLITE_OK;
2427 
2428   if( zCopy==0 ){
2429     rc = SQLITE_NOMEM;
2430   }else{
2431     int nCopy = (int)strlen(zCopy);
2432     int i = 1;
2433 
2434     while( rc==SQLITE_OK ){
2435       struct stat sStat;
2436       int rc2;
2437 
2438       for(; zCopy[i]!='/' && i<nCopy; i++);
2439       if( i==nCopy ) break;
2440       zCopy[i] = '\0';
2441 
2442       rc2 = fileStat(zCopy, &sStat);
2443       if( rc2!=0 ){
2444         if( mkdir(zCopy, 0777) ) rc = SQLITE_ERROR;
2445       }else{
2446         if( !S_ISDIR(sStat.st_mode) ) rc = SQLITE_ERROR;
2447       }
2448       zCopy[i] = '/';
2449       i++;
2450     }
2451 
2452     sqlite3_free(zCopy);
2453   }
2454 
2455   return rc;
2456 }
2457 
2458 /*
2459 ** This function does the work for the writefile() UDF. Refer to
2460 ** header comments at the top of this file for details.
2461 */
2462 static int writeFile(
2463   sqlite3_context *pCtx,          /* Context to return bytes written in */
2464   const char *zFile,              /* File to write */
2465   sqlite3_value *pData,           /* Data to write */
2466   mode_t mode,                    /* MODE parameter passed to writefile() */
2467   sqlite3_int64 mtime             /* MTIME parameter (or -1 to not set time) */
2468 ){
2469 #if !defined(_WIN32) && !defined(WIN32)
2470   if( S_ISLNK(mode) ){
2471     const char *zTo = (const char*)sqlite3_value_text(pData);
2472     if( symlink(zTo, zFile)<0 ) return 1;
2473   }else
2474 #endif
2475   {
2476     if( S_ISDIR(mode) ){
2477       if( mkdir(zFile, mode) ){
2478         /* The mkdir() call to create the directory failed. This might not
2479         ** be an error though - if there is already a directory at the same
2480         ** path and either the permissions already match or can be changed
2481         ** to do so using chmod(), it is not an error.  */
2482         struct stat sStat;
2483         if( errno!=EEXIST
2484          || 0!=fileStat(zFile, &sStat)
2485          || !S_ISDIR(sStat.st_mode)
2486          || ((sStat.st_mode&0777)!=(mode&0777) && 0!=chmod(zFile, mode&0777))
2487         ){
2488           return 1;
2489         }
2490       }
2491     }else{
2492       sqlite3_int64 nWrite = 0;
2493       const char *z;
2494       int rc = 0;
2495       FILE *out = fopen(zFile, "wb");
2496       if( out==0 ) return 1;
2497       z = (const char*)sqlite3_value_blob(pData);
2498       if( z ){
2499         sqlite3_int64 n = fwrite(z, 1, sqlite3_value_bytes(pData), out);
2500         nWrite = sqlite3_value_bytes(pData);
2501         if( nWrite!=n ){
2502           rc = 1;
2503         }
2504       }
2505       fclose(out);
2506       if( rc==0 && mode && chmod(zFile, mode & 0777) ){
2507         rc = 1;
2508       }
2509       if( rc ) return 2;
2510       sqlite3_result_int64(pCtx, nWrite);
2511     }
2512   }
2513 
2514   if( mtime>=0 ){
2515 #if defined(_WIN32)
2516 #if !SQLITE_OS_WINRT
2517     /* Windows */
2518     FILETIME lastAccess;
2519     FILETIME lastWrite;
2520     SYSTEMTIME currentTime;
2521     LONGLONG intervals;
2522     HANDLE hFile;
2523     LPWSTR zUnicodeName;
2524     extern LPWSTR sqlite3_win32_utf8_to_unicode(const char*);
2525 
2526     GetSystemTime(&currentTime);
2527     SystemTimeToFileTime(&currentTime, &lastAccess);
2528     intervals = Int32x32To64(mtime, 10000000) + 116444736000000000;
2529     lastWrite.dwLowDateTime = (DWORD)intervals;
2530     lastWrite.dwHighDateTime = intervals >> 32;
2531     zUnicodeName = sqlite3_win32_utf8_to_unicode(zFile);
2532     if( zUnicodeName==0 ){
2533       return 1;
2534     }
2535     hFile = CreateFileW(
2536       zUnicodeName, FILE_WRITE_ATTRIBUTES, 0, NULL, OPEN_EXISTING,
2537       FILE_FLAG_BACKUP_SEMANTICS, NULL
2538     );
2539     sqlite3_free(zUnicodeName);
2540     if( hFile!=INVALID_HANDLE_VALUE ){
2541       BOOL bResult = SetFileTime(hFile, NULL, &lastAccess, &lastWrite);
2542       CloseHandle(hFile);
2543       return !bResult;
2544     }else{
2545       return 1;
2546     }
2547 #endif
2548 #elif defined(AT_FDCWD) && 0 /* utimensat() is not universally available */
2549     /* Recent unix */
2550     struct timespec times[2];
2551     times[0].tv_nsec = times[1].tv_nsec = 0;
2552     times[0].tv_sec = time(0);
2553     times[1].tv_sec = mtime;
2554     if( utimensat(AT_FDCWD, zFile, times, AT_SYMLINK_NOFOLLOW) ){
2555       return 1;
2556     }
2557 #else
2558     /* Legacy unix */
2559     struct timeval times[2];
2560     times[0].tv_usec = times[1].tv_usec = 0;
2561     times[0].tv_sec = time(0);
2562     times[1].tv_sec = mtime;
2563     if( utimes(zFile, times) ){
2564       return 1;
2565     }
2566 #endif
2567   }
2568 
2569   return 0;
2570 }
2571 
2572 /*
2573 ** Implementation of the "writefile(W,X[,Y[,Z]]])" SQL function.
2574 ** Refer to header comments at the top of this file for details.
2575 */
2576 static void writefileFunc(
2577   sqlite3_context *context,
2578   int argc,
2579   sqlite3_value **argv
2580 ){
2581   const char *zFile;
2582   mode_t mode = 0;
2583   int res;
2584   sqlite3_int64 mtime = -1;
2585 
2586   if( argc<2 || argc>4 ){
2587     sqlite3_result_error(context,
2588         "wrong number of arguments to function writefile()", -1
2589     );
2590     return;
2591   }
2592 
2593   zFile = (const char*)sqlite3_value_text(argv[0]);
2594   if( zFile==0 ) return;
2595   if( argc>=3 ){
2596     mode = (mode_t)sqlite3_value_int(argv[2]);
2597   }
2598   if( argc==4 ){
2599     mtime = sqlite3_value_int64(argv[3]);
2600   }
2601 
2602   res = writeFile(context, zFile, argv[1], mode, mtime);
2603   if( res==1 && errno==ENOENT ){
2604     if( makeDirectory(zFile)==SQLITE_OK ){
2605       res = writeFile(context, zFile, argv[1], mode, mtime);
2606     }
2607   }
2608 
2609   if( argc>2 && res!=0 ){
2610     if( S_ISLNK(mode) ){
2611       ctxErrorMsg(context, "failed to create symlink: %s", zFile);
2612     }else if( S_ISDIR(mode) ){
2613       ctxErrorMsg(context, "failed to create directory: %s", zFile);
2614     }else{
2615       ctxErrorMsg(context, "failed to write file: %s", zFile);
2616     }
2617   }
2618 }
2619 
2620 /*
2621 ** SQL function:   lsmode(MODE)
2622 **
2623 ** Given a numberic st_mode from stat(), convert it into a human-readable
2624 ** text string in the style of "ls -l".
2625 */
2626 static void lsModeFunc(
2627   sqlite3_context *context,
2628   int argc,
2629   sqlite3_value **argv
2630 ){
2631   int i;
2632   int iMode = sqlite3_value_int(argv[0]);
2633   char z[16];
2634   (void)argc;
2635   if( S_ISLNK(iMode) ){
2636     z[0] = 'l';
2637   }else if( S_ISREG(iMode) ){
2638     z[0] = '-';
2639   }else if( S_ISDIR(iMode) ){
2640     z[0] = 'd';
2641   }else{
2642     z[0] = '?';
2643   }
2644   for(i=0; i<3; i++){
2645     int m = (iMode >> ((2-i)*3));
2646     char *a = &z[1 + i*3];
2647     a[0] = (m & 0x4) ? 'r' : '-';
2648     a[1] = (m & 0x2) ? 'w' : '-';
2649     a[2] = (m & 0x1) ? 'x' : '-';
2650   }
2651   z[10] = '\0';
2652   sqlite3_result_text(context, z, -1, SQLITE_TRANSIENT);
2653 }
2654 
2655 #ifndef SQLITE_OMIT_VIRTUALTABLE
2656 
2657 /*
2658 ** Cursor type for recursively iterating through a directory structure.
2659 */
2660 typedef struct fsdir_cursor fsdir_cursor;
2661 typedef struct FsdirLevel FsdirLevel;
2662 
2663 struct FsdirLevel {
2664   DIR *pDir;                 /* From opendir() */
2665   char *zDir;                /* Name of directory (nul-terminated) */
2666 };
2667 
2668 struct fsdir_cursor {
2669   sqlite3_vtab_cursor base;  /* Base class - must be first */
2670 
2671   int nLvl;                  /* Number of entries in aLvl[] array */
2672   int iLvl;                  /* Index of current entry */
2673   FsdirLevel *aLvl;          /* Hierarchy of directories being traversed */
2674 
2675   const char *zBase;
2676   int nBase;
2677 
2678   struct stat sStat;         /* Current lstat() results */
2679   char *zPath;               /* Path to current entry */
2680   sqlite3_int64 iRowid;      /* Current rowid */
2681 };
2682 
2683 typedef struct fsdir_tab fsdir_tab;
2684 struct fsdir_tab {
2685   sqlite3_vtab base;         /* Base class - must be first */
2686 };
2687 
2688 /*
2689 ** Construct a new fsdir virtual table object.
2690 */
2691 static int fsdirConnect(
2692   sqlite3 *db,
2693   void *pAux,
2694   int argc, const char *const*argv,
2695   sqlite3_vtab **ppVtab,
2696   char **pzErr
2697 ){
2698   fsdir_tab *pNew = 0;
2699   int rc;
2700   (void)pAux;
2701   (void)argc;
2702   (void)argv;
2703   (void)pzErr;
2704   rc = sqlite3_declare_vtab(db, "CREATE TABLE x" FSDIR_SCHEMA);
2705   if( rc==SQLITE_OK ){
2706     pNew = (fsdir_tab*)sqlite3_malloc( sizeof(*pNew) );
2707     if( pNew==0 ) return SQLITE_NOMEM;
2708     memset(pNew, 0, sizeof(*pNew));
2709     sqlite3_vtab_config(db, SQLITE_VTAB_DIRECTONLY);
2710   }
2711   *ppVtab = (sqlite3_vtab*)pNew;
2712   return rc;
2713 }
2714 
2715 /*
2716 ** This method is the destructor for fsdir vtab objects.
2717 */
2718 static int fsdirDisconnect(sqlite3_vtab *pVtab){
2719   sqlite3_free(pVtab);
2720   return SQLITE_OK;
2721 }
2722 
2723 /*
2724 ** Constructor for a new fsdir_cursor object.
2725 */
2726 static int fsdirOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){
2727   fsdir_cursor *pCur;
2728   (void)p;
2729   pCur = sqlite3_malloc( sizeof(*pCur) );
2730   if( pCur==0 ) return SQLITE_NOMEM;
2731   memset(pCur, 0, sizeof(*pCur));
2732   pCur->iLvl = -1;
2733   *ppCursor = &pCur->base;
2734   return SQLITE_OK;
2735 }
2736 
2737 /*
2738 ** Reset a cursor back to the state it was in when first returned
2739 ** by fsdirOpen().
2740 */
2741 static void fsdirResetCursor(fsdir_cursor *pCur){
2742   int i;
2743   for(i=0; i<=pCur->iLvl; i++){
2744     FsdirLevel *pLvl = &pCur->aLvl[i];
2745     if( pLvl->pDir ) closedir(pLvl->pDir);
2746     sqlite3_free(pLvl->zDir);
2747   }
2748   sqlite3_free(pCur->zPath);
2749   sqlite3_free(pCur->aLvl);
2750   pCur->aLvl = 0;
2751   pCur->zPath = 0;
2752   pCur->zBase = 0;
2753   pCur->nBase = 0;
2754   pCur->nLvl = 0;
2755   pCur->iLvl = -1;
2756   pCur->iRowid = 1;
2757 }
2758 
2759 /*
2760 ** Destructor for an fsdir_cursor.
2761 */
2762 static int fsdirClose(sqlite3_vtab_cursor *cur){
2763   fsdir_cursor *pCur = (fsdir_cursor*)cur;
2764 
2765   fsdirResetCursor(pCur);
2766   sqlite3_free(pCur);
2767   return SQLITE_OK;
2768 }
2769 
2770 /*
2771 ** Set the error message for the virtual table associated with cursor
2772 ** pCur to the results of vprintf(zFmt, ...).
2773 */
2774 static void fsdirSetErrmsg(fsdir_cursor *pCur, const char *zFmt, ...){
2775   va_list ap;
2776   va_start(ap, zFmt);
2777   pCur->base.pVtab->zErrMsg = sqlite3_vmprintf(zFmt, ap);
2778   va_end(ap);
2779 }
2780 
2781 
2782 /*
2783 ** Advance an fsdir_cursor to its next row of output.
2784 */
2785 static int fsdirNext(sqlite3_vtab_cursor *cur){
2786   fsdir_cursor *pCur = (fsdir_cursor*)cur;
2787   mode_t m = pCur->sStat.st_mode;
2788 
2789   pCur->iRowid++;
2790   if( S_ISDIR(m) ){
2791     /* Descend into this directory */
2792     int iNew = pCur->iLvl + 1;
2793     FsdirLevel *pLvl;
2794     if( iNew>=pCur->nLvl ){
2795       int nNew = iNew+1;
2796       sqlite3_int64 nByte = nNew*sizeof(FsdirLevel);
2797       FsdirLevel *aNew = (FsdirLevel*)sqlite3_realloc64(pCur->aLvl, nByte);
2798       if( aNew==0 ) return SQLITE_NOMEM;
2799       memset(&aNew[pCur->nLvl], 0, sizeof(FsdirLevel)*(nNew-pCur->nLvl));
2800       pCur->aLvl = aNew;
2801       pCur->nLvl = nNew;
2802     }
2803     pCur->iLvl = iNew;
2804     pLvl = &pCur->aLvl[iNew];
2805 
2806     pLvl->zDir = pCur->zPath;
2807     pCur->zPath = 0;
2808     pLvl->pDir = opendir(pLvl->zDir);
2809     if( pLvl->pDir==0 ){
2810       fsdirSetErrmsg(pCur, "cannot read directory: %s", pCur->zPath);
2811       return SQLITE_ERROR;
2812     }
2813   }
2814 
2815   while( pCur->iLvl>=0 ){
2816     FsdirLevel *pLvl = &pCur->aLvl[pCur->iLvl];
2817     struct dirent *pEntry = readdir(pLvl->pDir);
2818     if( pEntry ){
2819       if( pEntry->d_name[0]=='.' ){
2820        if( pEntry->d_name[1]=='.' && pEntry->d_name[2]=='\0' ) continue;
2821        if( pEntry->d_name[1]=='\0' ) continue;
2822       }
2823       sqlite3_free(pCur->zPath);
2824       pCur->zPath = sqlite3_mprintf("%s/%s", pLvl->zDir, pEntry->d_name);
2825       if( pCur->zPath==0 ) return SQLITE_NOMEM;
2826       if( fileLinkStat(pCur->zPath, &pCur->sStat) ){
2827         fsdirSetErrmsg(pCur, "cannot stat file: %s", pCur->zPath);
2828         return SQLITE_ERROR;
2829       }
2830       return SQLITE_OK;
2831     }
2832     closedir(pLvl->pDir);
2833     sqlite3_free(pLvl->zDir);
2834     pLvl->pDir = 0;
2835     pLvl->zDir = 0;
2836     pCur->iLvl--;
2837   }
2838 
2839   /* EOF */
2840   sqlite3_free(pCur->zPath);
2841   pCur->zPath = 0;
2842   return SQLITE_OK;
2843 }
2844 
2845 /*
2846 ** Return values of columns for the row at which the series_cursor
2847 ** is currently pointing.
2848 */
2849 static int fsdirColumn(
2850   sqlite3_vtab_cursor *cur,   /* The cursor */
2851   sqlite3_context *ctx,       /* First argument to sqlite3_result_...() */
2852   int i                       /* Which column to return */
2853 ){
2854   fsdir_cursor *pCur = (fsdir_cursor*)cur;
2855   switch( i ){
2856     case FSDIR_COLUMN_NAME: {
2857       sqlite3_result_text(ctx, &pCur->zPath[pCur->nBase], -1, SQLITE_TRANSIENT);
2858       break;
2859     }
2860 
2861     case FSDIR_COLUMN_MODE:
2862       sqlite3_result_int64(ctx, pCur->sStat.st_mode);
2863       break;
2864 
2865     case FSDIR_COLUMN_MTIME:
2866       sqlite3_result_int64(ctx, pCur->sStat.st_mtime);
2867       break;
2868 
2869     case FSDIR_COLUMN_DATA: {
2870       mode_t m = pCur->sStat.st_mode;
2871       if( S_ISDIR(m) ){
2872         sqlite3_result_null(ctx);
2873 #if !defined(_WIN32) && !defined(WIN32)
2874       }else if( S_ISLNK(m) ){
2875         char aStatic[64];
2876         char *aBuf = aStatic;
2877         sqlite3_int64 nBuf = 64;
2878         int n;
2879 
2880         while( 1 ){
2881           n = readlink(pCur->zPath, aBuf, nBuf);
2882           if( n<nBuf ) break;
2883           if( aBuf!=aStatic ) sqlite3_free(aBuf);
2884           nBuf = nBuf*2;
2885           aBuf = sqlite3_malloc64(nBuf);
2886           if( aBuf==0 ){
2887             sqlite3_result_error_nomem(ctx);
2888             return SQLITE_NOMEM;
2889           }
2890         }
2891 
2892         sqlite3_result_text(ctx, aBuf, n, SQLITE_TRANSIENT);
2893         if( aBuf!=aStatic ) sqlite3_free(aBuf);
2894 #endif
2895       }else{
2896         readFileContents(ctx, pCur->zPath);
2897       }
2898     }
2899     case FSDIR_COLUMN_PATH:
2900     default: {
2901       /* The FSDIR_COLUMN_PATH and FSDIR_COLUMN_DIR are input parameters.
2902       ** always return their values as NULL */
2903       break;
2904     }
2905   }
2906   return SQLITE_OK;
2907 }
2908 
2909 /*
2910 ** Return the rowid for the current row. In this implementation, the
2911 ** first row returned is assigned rowid value 1, and each subsequent
2912 ** row a value 1 more than that of the previous.
2913 */
2914 static int fsdirRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
2915   fsdir_cursor *pCur = (fsdir_cursor*)cur;
2916   *pRowid = pCur->iRowid;
2917   return SQLITE_OK;
2918 }
2919 
2920 /*
2921 ** Return TRUE if the cursor has been moved off of the last
2922 ** row of output.
2923 */
2924 static int fsdirEof(sqlite3_vtab_cursor *cur){
2925   fsdir_cursor *pCur = (fsdir_cursor*)cur;
2926   return (pCur->zPath==0);
2927 }
2928 
2929 /*
2930 ** xFilter callback.
2931 **
2932 ** idxNum==1   PATH parameter only
2933 ** idxNum==2   Both PATH and DIR supplied
2934 */
2935 static int fsdirFilter(
2936   sqlite3_vtab_cursor *cur,
2937   int idxNum, const char *idxStr,
2938   int argc, sqlite3_value **argv
2939 ){
2940   const char *zDir = 0;
2941   fsdir_cursor *pCur = (fsdir_cursor*)cur;
2942   (void)idxStr;
2943   fsdirResetCursor(pCur);
2944 
2945   if( idxNum==0 ){
2946     fsdirSetErrmsg(pCur, "table function fsdir requires an argument");
2947     return SQLITE_ERROR;
2948   }
2949 
2950   assert( argc==idxNum && (argc==1 || argc==2) );
2951   zDir = (const char*)sqlite3_value_text(argv[0]);
2952   if( zDir==0 ){
2953     fsdirSetErrmsg(pCur, "table function fsdir requires a non-NULL argument");
2954     return SQLITE_ERROR;
2955   }
2956   if( argc==2 ){
2957     pCur->zBase = (const char*)sqlite3_value_text(argv[1]);
2958   }
2959   if( pCur->zBase ){
2960     pCur->nBase = (int)strlen(pCur->zBase)+1;
2961     pCur->zPath = sqlite3_mprintf("%s/%s", pCur->zBase, zDir);
2962   }else{
2963     pCur->zPath = sqlite3_mprintf("%s", zDir);
2964   }
2965 
2966   if( pCur->zPath==0 ){
2967     return SQLITE_NOMEM;
2968   }
2969   if( fileLinkStat(pCur->zPath, &pCur->sStat) ){
2970     fsdirSetErrmsg(pCur, "cannot stat file: %s", pCur->zPath);
2971     return SQLITE_ERROR;
2972   }
2973 
2974   return SQLITE_OK;
2975 }
2976 
2977 /*
2978 ** SQLite will invoke this method one or more times while planning a query
2979 ** that uses the generate_series virtual table.  This routine needs to create
2980 ** a query plan for each invocation and compute an estimated cost for that
2981 ** plan.
2982 **
2983 ** In this implementation idxNum is used to represent the
2984 ** query plan.  idxStr is unused.
2985 **
2986 ** The query plan is represented by values of idxNum:
2987 **
2988 **  (1)  The path value is supplied by argv[0]
2989 **  (2)  Path is in argv[0] and dir is in argv[1]
2990 */
2991 static int fsdirBestIndex(
2992   sqlite3_vtab *tab,
2993   sqlite3_index_info *pIdxInfo
2994 ){
2995   int i;                 /* Loop over constraints */
2996   int idxPath = -1;      /* Index in pIdxInfo->aConstraint of PATH= */
2997   int idxDir = -1;       /* Index in pIdxInfo->aConstraint of DIR= */
2998   int seenPath = 0;      /* True if an unusable PATH= constraint is seen */
2999   int seenDir = 0;       /* True if an unusable DIR= constraint is seen */
3000   const struct sqlite3_index_constraint *pConstraint;
3001 
3002   (void)tab;
3003   pConstraint = pIdxInfo->aConstraint;
3004   for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){
3005     if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue;
3006     switch( pConstraint->iColumn ){
3007       case FSDIR_COLUMN_PATH: {
3008         if( pConstraint->usable ){
3009           idxPath = i;
3010           seenPath = 0;
3011         }else if( idxPath<0 ){
3012           seenPath = 1;
3013         }
3014         break;
3015       }
3016       case FSDIR_COLUMN_DIR: {
3017         if( pConstraint->usable ){
3018           idxDir = i;
3019           seenDir = 0;
3020         }else if( idxDir<0 ){
3021           seenDir = 1;
3022         }
3023         break;
3024       }
3025     }
3026   }
3027   if( seenPath || seenDir ){
3028     /* If input parameters are unusable, disallow this plan */
3029     return SQLITE_CONSTRAINT;
3030   }
3031 
3032   if( idxPath<0 ){
3033     pIdxInfo->idxNum = 0;
3034     /* The pIdxInfo->estimatedCost should have been initialized to a huge
3035     ** number.  Leave it unchanged. */
3036     pIdxInfo->estimatedRows = 0x7fffffff;
3037   }else{
3038     pIdxInfo->aConstraintUsage[idxPath].omit = 1;
3039     pIdxInfo->aConstraintUsage[idxPath].argvIndex = 1;
3040     if( idxDir>=0 ){
3041       pIdxInfo->aConstraintUsage[idxDir].omit = 1;
3042       pIdxInfo->aConstraintUsage[idxDir].argvIndex = 2;
3043       pIdxInfo->idxNum = 2;
3044       pIdxInfo->estimatedCost = 10.0;
3045     }else{
3046       pIdxInfo->idxNum = 1;
3047       pIdxInfo->estimatedCost = 100.0;
3048     }
3049   }
3050 
3051   return SQLITE_OK;
3052 }
3053 
3054 /*
3055 ** Register the "fsdir" virtual table.
3056 */
3057 static int fsdirRegister(sqlite3 *db){
3058   static sqlite3_module fsdirModule = {
3059     0,                         /* iVersion */
3060     0,                         /* xCreate */
3061     fsdirConnect,              /* xConnect */
3062     fsdirBestIndex,            /* xBestIndex */
3063     fsdirDisconnect,           /* xDisconnect */
3064     0,                         /* xDestroy */
3065     fsdirOpen,                 /* xOpen - open a cursor */
3066     fsdirClose,                /* xClose - close a cursor */
3067     fsdirFilter,               /* xFilter - configure scan constraints */
3068     fsdirNext,                 /* xNext - advance a cursor */
3069     fsdirEof,                  /* xEof - check for end of scan */
3070     fsdirColumn,               /* xColumn - read data */
3071     fsdirRowid,                /* xRowid - read data */
3072     0,                         /* xUpdate */
3073     0,                         /* xBegin */
3074     0,                         /* xSync */
3075     0,                         /* xCommit */
3076     0,                         /* xRollback */
3077     0,                         /* xFindMethod */
3078     0,                         /* xRename */
3079     0,                         /* xSavepoint */
3080     0,                         /* xRelease */
3081     0,                         /* xRollbackTo */
3082     0,                         /* xShadowName */
3083   };
3084 
3085   int rc = sqlite3_create_module(db, "fsdir", &fsdirModule, 0);
3086   return rc;
3087 }
3088 #else         /* SQLITE_OMIT_VIRTUALTABLE */
3089 # define fsdirRegister(x) SQLITE_OK
3090 #endif
3091 
3092 #ifdef _WIN32
3093 
3094 #endif
3095 int sqlite3_fileio_init(
3096   sqlite3 *db,
3097   char **pzErrMsg,
3098   const sqlite3_api_routines *pApi
3099 ){
3100   int rc = SQLITE_OK;
3101   SQLITE_EXTENSION_INIT2(pApi);
3102   (void)pzErrMsg;  /* Unused parameter */
3103   rc = sqlite3_create_function(db, "readfile", 1,
3104                                SQLITE_UTF8|SQLITE_DIRECTONLY, 0,
3105                                readfileFunc, 0, 0);
3106   if( rc==SQLITE_OK ){
3107     rc = sqlite3_create_function(db, "writefile", -1,
3108                                  SQLITE_UTF8|SQLITE_DIRECTONLY, 0,
3109                                  writefileFunc, 0, 0);
3110   }
3111   if( rc==SQLITE_OK ){
3112     rc = sqlite3_create_function(db, "lsmode", 1, SQLITE_UTF8, 0,
3113                                  lsModeFunc, 0, 0);
3114   }
3115   if( rc==SQLITE_OK ){
3116     rc = fsdirRegister(db);
3117   }
3118   return rc;
3119 }
3120 
3121 /************************* End ../ext/misc/fileio.c ********************/
3122 /************************* Begin ../ext/misc/completion.c ******************/
3123 /*
3124 ** 2017-07-10
3125 **
3126 ** The author disclaims copyright to this source code.  In place of
3127 ** a legal notice, here is a blessing:
3128 **
3129 **    May you do good and not evil.
3130 **    May you find forgiveness for yourself and forgive others.
3131 **    May you share freely, never taking more than you give.
3132 **
3133 *************************************************************************
3134 **
3135 ** This file implements an eponymous virtual table that returns suggested
3136 ** completions for a partial SQL input.
3137 **
3138 ** Suggested usage:
3139 **
3140 **     SELECT DISTINCT candidate COLLATE nocase
3141 **       FROM completion($prefix,$wholeline)
3142 **      ORDER BY 1;
3143 **
3144 ** The two query parameters are optional.  $prefix is the text of the
3145 ** current word being typed and that is to be completed.  $wholeline is
3146 ** the complete input line, used for context.
3147 **
3148 ** The raw completion() table might return the same candidate multiple
3149 ** times, for example if the same column name is used to two or more
3150 ** tables.  And the candidates are returned in an arbitrary order.  Hence,
3151 ** the DISTINCT and ORDER BY are recommended.
3152 **
3153 ** This virtual table operates at the speed of human typing, and so there
3154 ** is no attempt to make it fast.  Even a slow implementation will be much
3155 ** faster than any human can type.
3156 **
3157 */
3158 /* #include "sqlite3ext.h" */
3159 SQLITE_EXTENSION_INIT1
3160 #include <assert.h>
3161 #include <string.h>
3162 #include <ctype.h>
3163 
3164 #ifndef SQLITE_OMIT_VIRTUALTABLE
3165 
3166 /* completion_vtab is a subclass of sqlite3_vtab which will
3167 ** serve as the underlying representation of a completion virtual table
3168 */
3169 typedef struct completion_vtab completion_vtab;
3170 struct completion_vtab {
3171   sqlite3_vtab base;  /* Base class - must be first */
3172   sqlite3 *db;        /* Database connection for this completion vtab */
3173 };
3174 
3175 /* completion_cursor is a subclass of sqlite3_vtab_cursor which will
3176 ** serve as the underlying representation of a cursor that scans
3177 ** over rows of the result
3178 */
3179 typedef struct completion_cursor completion_cursor;
3180 struct completion_cursor {
3181   sqlite3_vtab_cursor base;  /* Base class - must be first */
3182   sqlite3 *db;               /* Database connection for this cursor */
3183   int nPrefix, nLine;        /* Number of bytes in zPrefix and zLine */
3184   char *zPrefix;             /* The prefix for the word we want to complete */
3185   char *zLine;               /* The whole that we want to complete */
3186   const char *zCurrentRow;   /* Current output row */
3187   int szRow;                 /* Length of the zCurrentRow string */
3188   sqlite3_stmt *pStmt;       /* Current statement */
3189   sqlite3_int64 iRowid;      /* The rowid */
3190   int ePhase;                /* Current phase */
3191   int j;                     /* inter-phase counter */
3192 };
3193 
3194 /* Values for ePhase:
3195 */
3196 #define COMPLETION_FIRST_PHASE   1
3197 #define COMPLETION_KEYWORDS      1
3198 #define COMPLETION_PRAGMAS       2
3199 #define COMPLETION_FUNCTIONS     3
3200 #define COMPLETION_COLLATIONS    4
3201 #define COMPLETION_INDEXES       5
3202 #define COMPLETION_TRIGGERS      6
3203 #define COMPLETION_DATABASES     7
3204 #define COMPLETION_TABLES        8    /* Also VIEWs and TRIGGERs */
3205 #define COMPLETION_COLUMNS       9
3206 #define COMPLETION_MODULES       10
3207 #define COMPLETION_EOF           11
3208 
3209 /*
3210 ** The completionConnect() method is invoked to create a new
3211 ** completion_vtab that describes the completion virtual table.
3212 **
3213 ** Think of this routine as the constructor for completion_vtab objects.
3214 **
3215 ** All this routine needs to do is:
3216 **
3217 **    (1) Allocate the completion_vtab object and initialize all fields.
3218 **
3219 **    (2) Tell SQLite (via the sqlite3_declare_vtab() interface) what the
3220 **        result set of queries against completion will look like.
3221 */
3222 static int completionConnect(
3223   sqlite3 *db,
3224   void *pAux,
3225   int argc, const char *const*argv,
3226   sqlite3_vtab **ppVtab,
3227   char **pzErr
3228 ){
3229   completion_vtab *pNew;
3230   int rc;
3231 
3232   (void)(pAux);    /* Unused parameter */
3233   (void)(argc);    /* Unused parameter */
3234   (void)(argv);    /* Unused parameter */
3235   (void)(pzErr);   /* Unused parameter */
3236 
3237 /* Column numbers */
3238 #define COMPLETION_COLUMN_CANDIDATE 0  /* Suggested completion of the input */
3239 #define COMPLETION_COLUMN_PREFIX    1  /* Prefix of the word to be completed */
3240 #define COMPLETION_COLUMN_WHOLELINE 2  /* Entire line seen so far */
3241 #define COMPLETION_COLUMN_PHASE     3  /* ePhase - used for debugging only */
3242 
3243   sqlite3_vtab_config(db, SQLITE_VTAB_INNOCUOUS);
3244   rc = sqlite3_declare_vtab(db,
3245       "CREATE TABLE x("
3246       "  candidate TEXT,"
3247       "  prefix TEXT HIDDEN,"
3248       "  wholeline TEXT HIDDEN,"
3249       "  phase INT HIDDEN"        /* Used for debugging only */
3250       ")");
3251   if( rc==SQLITE_OK ){
3252     pNew = sqlite3_malloc( sizeof(*pNew) );
3253     *ppVtab = (sqlite3_vtab*)pNew;
3254     if( pNew==0 ) return SQLITE_NOMEM;
3255     memset(pNew, 0, sizeof(*pNew));
3256     pNew->db = db;
3257   }
3258   return rc;
3259 }
3260 
3261 /*
3262 ** This method is the destructor for completion_cursor objects.
3263 */
3264 static int completionDisconnect(sqlite3_vtab *pVtab){
3265   sqlite3_free(pVtab);
3266   return SQLITE_OK;
3267 }
3268 
3269 /*
3270 ** Constructor for a new completion_cursor object.
3271 */
3272 static int completionOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){
3273   completion_cursor *pCur;
3274   pCur = sqlite3_malloc( sizeof(*pCur) );
3275   if( pCur==0 ) return SQLITE_NOMEM;
3276   memset(pCur, 0, sizeof(*pCur));
3277   pCur->db = ((completion_vtab*)p)->db;
3278   *ppCursor = &pCur->base;
3279   return SQLITE_OK;
3280 }
3281 
3282 /*
3283 ** Reset the completion_cursor.
3284 */
3285 static void completionCursorReset(completion_cursor *pCur){
3286   sqlite3_free(pCur->zPrefix);   pCur->zPrefix = 0;  pCur->nPrefix = 0;
3287   sqlite3_free(pCur->zLine);     pCur->zLine = 0;    pCur->nLine = 0;
3288   sqlite3_finalize(pCur->pStmt); pCur->pStmt = 0;
3289   pCur->j = 0;
3290 }
3291 
3292 /*
3293 ** Destructor for a completion_cursor.
3294 */
3295 static int completionClose(sqlite3_vtab_cursor *cur){
3296   completionCursorReset((completion_cursor*)cur);
3297   sqlite3_free(cur);
3298   return SQLITE_OK;
3299 }
3300 
3301 /*
3302 ** Advance a completion_cursor to its next row of output.
3303 **
3304 ** The ->ePhase, ->j, and ->pStmt fields of the completion_cursor object
3305 ** record the current state of the scan.  This routine sets ->zCurrentRow
3306 ** to the current row of output and then returns.  If no more rows remain,
3307 ** then ->ePhase is set to COMPLETION_EOF which will signal the virtual
3308 ** table that has reached the end of its scan.
3309 **
3310 ** The current implementation just lists potential identifiers and
3311 ** keywords and filters them by zPrefix.  Future enhancements should
3312 ** take zLine into account to try to restrict the set of identifiers and
3313 ** keywords based on what would be legal at the current point of input.
3314 */
3315 static int completionNext(sqlite3_vtab_cursor *cur){
3316   completion_cursor *pCur = (completion_cursor*)cur;
3317   int eNextPhase = 0;  /* Next phase to try if current phase reaches end */
3318   int iCol = -1;       /* If >=0, step pCur->pStmt and use the i-th column */
3319   pCur->iRowid++;
3320   while( pCur->ePhase!=COMPLETION_EOF ){
3321     switch( pCur->ePhase ){
3322       case COMPLETION_KEYWORDS: {
3323         if( pCur->j >= sqlite3_keyword_count() ){
3324           pCur->zCurrentRow = 0;
3325           pCur->ePhase = COMPLETION_DATABASES;
3326         }else{
3327           sqlite3_keyword_name(pCur->j++, &pCur->zCurrentRow, &pCur->szRow);
3328         }
3329         iCol = -1;
3330         break;
3331       }
3332       case COMPLETION_DATABASES: {
3333         if( pCur->pStmt==0 ){
3334           sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1,
3335                              &pCur->pStmt, 0);
3336         }
3337         iCol = 1;
3338         eNextPhase = COMPLETION_TABLES;
3339         break;
3340       }
3341       case COMPLETION_TABLES: {
3342         if( pCur->pStmt==0 ){
3343           sqlite3_stmt *pS2;
3344           char *zSql = 0;
3345           const char *zSep = "";
3346           sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1, &pS2, 0);
3347           while( sqlite3_step(pS2)==SQLITE_ROW ){
3348             const char *zDb = (const char*)sqlite3_column_text(pS2, 1);
3349             zSql = sqlite3_mprintf(
3350                "%z%s"
3351                "SELECT name FROM \"%w\".sqlite_schema",
3352                zSql, zSep, zDb
3353             );
3354             if( zSql==0 ) return SQLITE_NOMEM;
3355             zSep = " UNION ";
3356           }
3357           sqlite3_finalize(pS2);
3358           sqlite3_prepare_v2(pCur->db, zSql, -1, &pCur->pStmt, 0);
3359           sqlite3_free(zSql);
3360         }
3361         iCol = 0;
3362         eNextPhase = COMPLETION_COLUMNS;
3363         break;
3364       }
3365       case COMPLETION_COLUMNS: {
3366         if( pCur->pStmt==0 ){
3367           sqlite3_stmt *pS2;
3368           char *zSql = 0;
3369           const char *zSep = "";
3370           sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1, &pS2, 0);
3371           while( sqlite3_step(pS2)==SQLITE_ROW ){
3372             const char *zDb = (const char*)sqlite3_column_text(pS2, 1);
3373             zSql = sqlite3_mprintf(
3374                "%z%s"
3375                "SELECT pti.name FROM \"%w\".sqlite_schema AS sm"
3376                        " JOIN pragma_table_info(sm.name,%Q) AS pti"
3377                " WHERE sm.type='table'",
3378                zSql, zSep, zDb, zDb
3379             );
3380             if( zSql==0 ) return SQLITE_NOMEM;
3381             zSep = " UNION ";
3382           }
3383           sqlite3_finalize(pS2);
3384           sqlite3_prepare_v2(pCur->db, zSql, -1, &pCur->pStmt, 0);
3385           sqlite3_free(zSql);
3386         }
3387         iCol = 0;
3388         eNextPhase = COMPLETION_EOF;
3389         break;
3390       }
3391     }
3392     if( iCol<0 ){
3393       /* This case is when the phase presets zCurrentRow */
3394       if( pCur->zCurrentRow==0 ) continue;
3395     }else{
3396       if( sqlite3_step(pCur->pStmt)==SQLITE_ROW ){
3397         /* Extract the next row of content */
3398         pCur->zCurrentRow = (const char*)sqlite3_column_text(pCur->pStmt, iCol);
3399         pCur->szRow = sqlite3_column_bytes(pCur->pStmt, iCol);
3400       }else{
3401         /* When all rows are finished, advance to the next phase */
3402         sqlite3_finalize(pCur->pStmt);
3403         pCur->pStmt = 0;
3404         pCur->ePhase = eNextPhase;
3405         continue;
3406       }
3407     }
3408     if( pCur->nPrefix==0 ) break;
3409     if( pCur->nPrefix<=pCur->szRow
3410      && sqlite3_strnicmp(pCur->zPrefix, pCur->zCurrentRow, pCur->nPrefix)==0
3411     ){
3412       break;
3413     }
3414   }
3415 
3416   return SQLITE_OK;
3417 }
3418 
3419 /*
3420 ** Return values of columns for the row at which the completion_cursor
3421 ** is currently pointing.
3422 */
3423 static int completionColumn(
3424   sqlite3_vtab_cursor *cur,   /* The cursor */
3425   sqlite3_context *ctx,       /* First argument to sqlite3_result_...() */
3426   int i                       /* Which column to return */
3427 ){
3428   completion_cursor *pCur = (completion_cursor*)cur;
3429   switch( i ){
3430     case COMPLETION_COLUMN_CANDIDATE: {
3431       sqlite3_result_text(ctx, pCur->zCurrentRow, pCur->szRow,SQLITE_TRANSIENT);
3432       break;
3433     }
3434     case COMPLETION_COLUMN_PREFIX: {
3435       sqlite3_result_text(ctx, pCur->zPrefix, -1, SQLITE_TRANSIENT);
3436       break;
3437     }
3438     case COMPLETION_COLUMN_WHOLELINE: {
3439       sqlite3_result_text(ctx, pCur->zLine, -1, SQLITE_TRANSIENT);
3440       break;
3441     }
3442     case COMPLETION_COLUMN_PHASE: {
3443       sqlite3_result_int(ctx, pCur->ePhase);
3444       break;
3445     }
3446   }
3447   return SQLITE_OK;
3448 }
3449 
3450 /*
3451 ** Return the rowid for the current row.  In this implementation, the
3452 ** rowid is the same as the output value.
3453 */
3454 static int completionRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
3455   completion_cursor *pCur = (completion_cursor*)cur;
3456   *pRowid = pCur->iRowid;
3457   return SQLITE_OK;
3458 }
3459 
3460 /*
3461 ** Return TRUE if the cursor has been moved off of the last
3462 ** row of output.
3463 */
3464 static int completionEof(sqlite3_vtab_cursor *cur){
3465   completion_cursor *pCur = (completion_cursor*)cur;
3466   return pCur->ePhase >= COMPLETION_EOF;
3467 }
3468 
3469 /*
3470 ** This method is called to "rewind" the completion_cursor object back
3471 ** to the first row of output.  This method is always called at least
3472 ** once prior to any call to completionColumn() or completionRowid() or
3473 ** completionEof().
3474 */
3475 static int completionFilter(
3476   sqlite3_vtab_cursor *pVtabCursor,
3477   int idxNum, const char *idxStr,
3478   int argc, sqlite3_value **argv
3479 ){
3480   completion_cursor *pCur = (completion_cursor *)pVtabCursor;
3481   int iArg = 0;
3482   (void)(idxStr);   /* Unused parameter */
3483   (void)(argc);     /* Unused parameter */
3484   completionCursorReset(pCur);
3485   if( idxNum & 1 ){
3486     pCur->nPrefix = sqlite3_value_bytes(argv[iArg]);
3487     if( pCur->nPrefix>0 ){
3488       pCur->zPrefix = sqlite3_mprintf("%s", sqlite3_value_text(argv[iArg]));
3489       if( pCur->zPrefix==0 ) return SQLITE_NOMEM;
3490     }
3491     iArg = 1;
3492   }
3493   if( idxNum & 2 ){
3494     pCur->nLine = sqlite3_value_bytes(argv[iArg]);
3495     if( pCur->nLine>0 ){
3496       pCur->zLine = sqlite3_mprintf("%s", sqlite3_value_text(argv[iArg]));
3497       if( pCur->zLine==0 ) return SQLITE_NOMEM;
3498     }
3499   }
3500   if( pCur->zLine!=0 && pCur->zPrefix==0 ){
3501     int i = pCur->nLine;
3502     while( i>0 && (isalnum(pCur->zLine[i-1]) || pCur->zLine[i-1]=='_') ){
3503       i--;
3504     }
3505     pCur->nPrefix = pCur->nLine - i;
3506     if( pCur->nPrefix>0 ){
3507       pCur->zPrefix = sqlite3_mprintf("%.*s", pCur->nPrefix, pCur->zLine + i);
3508       if( pCur->zPrefix==0 ) return SQLITE_NOMEM;
3509     }
3510   }
3511   pCur->iRowid = 0;
3512   pCur->ePhase = COMPLETION_FIRST_PHASE;
3513   return completionNext(pVtabCursor);
3514 }
3515 
3516 /*
3517 ** SQLite will invoke this method one or more times while planning a query
3518 ** that uses the completion virtual table.  This routine needs to create
3519 ** a query plan for each invocation and compute an estimated cost for that
3520 ** plan.
3521 **
3522 ** There are two hidden parameters that act as arguments to the table-valued
3523 ** function:  "prefix" and "wholeline".  Bit 0 of idxNum is set if "prefix"
3524 ** is available and bit 1 is set if "wholeline" is available.
3525 */
3526 static int completionBestIndex(
3527   sqlite3_vtab *tab,
3528   sqlite3_index_info *pIdxInfo
3529 ){
3530   int i;                 /* Loop over constraints */
3531   int idxNum = 0;        /* The query plan bitmask */
3532   int prefixIdx = -1;    /* Index of the start= constraint, or -1 if none */
3533   int wholelineIdx = -1; /* Index of the stop= constraint, or -1 if none */
3534   int nArg = 0;          /* Number of arguments that completeFilter() expects */
3535   const struct sqlite3_index_constraint *pConstraint;
3536 
3537   (void)(tab);    /* Unused parameter */
3538   pConstraint = pIdxInfo->aConstraint;
3539   for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){
3540     if( pConstraint->usable==0 ) continue;
3541     if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue;
3542     switch( pConstraint->iColumn ){
3543       case COMPLETION_COLUMN_PREFIX:
3544         prefixIdx = i;
3545         idxNum |= 1;
3546         break;
3547       case COMPLETION_COLUMN_WHOLELINE:
3548         wholelineIdx = i;
3549         idxNum |= 2;
3550         break;
3551     }
3552   }
3553   if( prefixIdx>=0 ){
3554     pIdxInfo->aConstraintUsage[prefixIdx].argvIndex = ++nArg;
3555     pIdxInfo->aConstraintUsage[prefixIdx].omit = 1;
3556   }
3557   if( wholelineIdx>=0 ){
3558     pIdxInfo->aConstraintUsage[wholelineIdx].argvIndex = ++nArg;
3559     pIdxInfo->aConstraintUsage[wholelineIdx].omit = 1;
3560   }
3561   pIdxInfo->idxNum = idxNum;
3562   pIdxInfo->estimatedCost = (double)5000 - 1000*nArg;
3563   pIdxInfo->estimatedRows = 500 - 100*nArg;
3564   return SQLITE_OK;
3565 }
3566 
3567 /*
3568 ** This following structure defines all the methods for the
3569 ** completion virtual table.
3570 */
3571 static sqlite3_module completionModule = {
3572   0,                         /* iVersion */
3573   0,                         /* xCreate */
3574   completionConnect,         /* xConnect */
3575   completionBestIndex,       /* xBestIndex */
3576   completionDisconnect,      /* xDisconnect */
3577   0,                         /* xDestroy */
3578   completionOpen,            /* xOpen - open a cursor */
3579   completionClose,           /* xClose - close a cursor */
3580   completionFilter,          /* xFilter - configure scan constraints */
3581   completionNext,            /* xNext - advance a cursor */
3582   completionEof,             /* xEof - check for end of scan */
3583   completionColumn,          /* xColumn - read data */
3584   completionRowid,           /* xRowid - read data */
3585   0,                         /* xUpdate */
3586   0,                         /* xBegin */
3587   0,                         /* xSync */
3588   0,                         /* xCommit */
3589   0,                         /* xRollback */
3590   0,                         /* xFindMethod */
3591   0,                         /* xRename */
3592   0,                         /* xSavepoint */
3593   0,                         /* xRelease */
3594   0,                         /* xRollbackTo */
3595   0                          /* xShadowName */
3596 };
3597 
3598 #endif /* SQLITE_OMIT_VIRTUALTABLE */
3599 
3600 int sqlite3CompletionVtabInit(sqlite3 *db){
3601   int rc = SQLITE_OK;
3602 #ifndef SQLITE_OMIT_VIRTUALTABLE
3603   rc = sqlite3_create_module(db, "completion", &completionModule, 0);
3604 #endif
3605   return rc;
3606 }
3607 
3608 #ifdef _WIN32
3609 
3610 #endif
3611 int sqlite3_completion_init(
3612   sqlite3 *db,
3613   char **pzErrMsg,
3614   const sqlite3_api_routines *pApi
3615 ){
3616   int rc = SQLITE_OK;
3617   SQLITE_EXTENSION_INIT2(pApi);
3618   (void)(pzErrMsg);  /* Unused parameter */
3619 #ifndef SQLITE_OMIT_VIRTUALTABLE
3620   rc = sqlite3CompletionVtabInit(db);
3621 #endif
3622   return rc;
3623 }
3624 
3625 /************************* End ../ext/misc/completion.c ********************/
3626 /************************* Begin ../ext/misc/appendvfs.c ******************/
3627 /*
3628 ** 2017-10-20
3629 **
3630 ** The author disclaims copyright to this source code.  In place of
3631 ** a legal notice, here is a blessing:
3632 **
3633 **    May you do good and not evil.
3634 **    May you find forgiveness for yourself and forgive others.
3635 **    May you share freely, never taking more than you give.
3636 **
3637 ******************************************************************************
3638 **
3639 ** This file implements a VFS shim that allows an SQLite database to be
3640 ** appended onto the end of some other file, such as an executable.
3641 **
3642 ** A special record must appear at the end of the file that identifies the
3643 ** file as an appended database and provides the offset to the first page
3644 ** of the exposed content. (Or, it is the length of the content prefix.)
3645 ** For best performance page 1 should be located at a disk page boundary,
3646 ** though that is not required.
3647 **
3648 ** When opening a database using this VFS, the connection might treat
3649 ** the file as an ordinary SQLite database, or it might treat it as a
3650 ** database appended onto some other file.  The decision is made by
3651 ** applying the following rules in order:
3652 **
3653 **  (1)  An empty file is an ordinary database.
3654 **
3655 **  (2)  If the file ends with the appendvfs trailer string
3656 **       "Start-Of-SQLite3-NNNNNNNN" that file is an appended database.
3657 **
3658 **  (3)  If the file begins with the standard SQLite prefix string
3659 **       "SQLite format 3", that file is an ordinary database.
3660 **
3661 **  (4)  If none of the above apply and the SQLITE_OPEN_CREATE flag is
3662 **       set, then a new database is appended to the already existing file.
3663 **
3664 **  (5)  Otherwise, SQLITE_CANTOPEN is returned.
3665 **
3666 ** To avoid unnecessary complications with the PENDING_BYTE, the size of
3667 ** the file containing the database is limited to 1GiB. (1073741824 bytes)
3668 ** This VFS will not read or write past the 1GiB mark.  This restriction
3669 ** might be lifted in future versions.  For now, if you need a larger
3670 ** database, then keep it in a separate file.
3671 **
3672 ** If the file being opened is a plain database (not an appended one), then
3673 ** this shim is a pass-through into the default underlying VFS. (rule 3)
3674 **/
3675 /* #include "sqlite3ext.h" */
3676 SQLITE_EXTENSION_INIT1
3677 #include <string.h>
3678 #include <assert.h>
3679 
3680 /* The append mark at the end of the database is:
3681 **
3682 **     Start-Of-SQLite3-NNNNNNNN
3683 **     123456789 123456789 12345
3684 **
3685 ** The NNNNNNNN represents a 64-bit big-endian unsigned integer which is
3686 ** the offset to page 1, and also the length of the prefix content.
3687 */
3688 #define APND_MARK_PREFIX     "Start-Of-SQLite3-"
3689 #define APND_MARK_PREFIX_SZ  17
3690 #define APND_MARK_FOS_SZ      8
3691 #define APND_MARK_SIZE       (APND_MARK_PREFIX_SZ+APND_MARK_FOS_SZ)
3692 
3693 /*
3694 ** Maximum size of the combined prefix + database + append-mark.  This
3695 ** must be less than 0x40000000 to avoid locking issues on Windows.
3696 */
3697 #define APND_MAX_SIZE  (0x40000000)
3698 
3699 /*
3700 ** Try to align the database to an even multiple of APND_ROUNDUP bytes.
3701 */
3702 #ifndef APND_ROUNDUP
3703 #define APND_ROUNDUP 4096
3704 #endif
3705 #define APND_ALIGN_MASK         ((sqlite3_int64)(APND_ROUNDUP-1))
3706 #define APND_START_ROUNDUP(fsz) (((fsz)+APND_ALIGN_MASK) & ~APND_ALIGN_MASK)
3707 
3708 /*
3709 ** Forward declaration of objects used by this utility
3710 */
3711 typedef struct sqlite3_vfs ApndVfs;
3712 typedef struct ApndFile ApndFile;
3713 
3714 /* Access to a lower-level VFS that (might) implement dynamic loading,
3715 ** access to randomness, etc.
3716 */
3717 #define ORIGVFS(p)  ((sqlite3_vfs*)((p)->pAppData))
3718 #define ORIGFILE(p) ((sqlite3_file*)(((ApndFile*)(p))+1))
3719 
3720 /* An open appendvfs file
3721 **
3722 ** An instance of this structure describes the appended database file.
3723 ** A separate sqlite3_file object is always appended. The appended
3724 ** sqlite3_file object (which can be accessed using ORIGFILE()) describes
3725 ** the entire file, including the prefix, the database, and the
3726 ** append-mark.
3727 **
3728 ** The structure of an AppendVFS database is like this:
3729 **
3730 **   +-------------+---------+----------+-------------+
3731 **   | prefix-file | padding | database | append-mark |
3732 **   +-------------+---------+----------+-------------+
3733 **                           ^          ^
3734 **                           |          |
3735 **                         iPgOne      iMark
3736 **
3737 **
3738 ** "prefix file" -  file onto which the database has been appended.
3739 ** "padding"     -  zero or more bytes inserted so that "database"
3740 **                  starts on an APND_ROUNDUP boundary
3741 ** "database"    -  The SQLite database file
3742 ** "append-mark" -  The 25-byte "Start-Of-SQLite3-NNNNNNNN" that indicates
3743 **                  the offset from the start of prefix-file to the start
3744 **                  of "database".
3745 **
3746 ** The size of the database is iMark - iPgOne.
3747 **
3748 ** The NNNNNNNN in the "Start-Of-SQLite3-NNNNNNNN" suffix is the value
3749 ** of iPgOne stored as a big-ending 64-bit integer.
3750 **
3751 ** iMark will be the size of the underlying file minus 25 (APND_MARKSIZE).
3752 ** Or, iMark is -1 to indicate that it has not yet been written.
3753 */
3754 struct ApndFile {
3755   sqlite3_file base;        /* Subclass.  MUST BE FIRST! */
3756   sqlite3_int64 iPgOne;     /* Offset to the start of the database */
3757   sqlite3_int64 iMark;      /* Offset of the append mark.  -1 if unwritten */
3758   /* Always followed by another sqlite3_file that describes the whole file */
3759 };
3760 
3761 /*
3762 ** Methods for ApndFile
3763 */
3764 static int apndClose(sqlite3_file*);
3765 static int apndRead(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst);
3766 static int apndWrite(sqlite3_file*,const void*,int iAmt, sqlite3_int64 iOfst);
3767 static int apndTruncate(sqlite3_file*, sqlite3_int64 size);
3768 static int apndSync(sqlite3_file*, int flags);
3769 static int apndFileSize(sqlite3_file*, sqlite3_int64 *pSize);
3770 static int apndLock(sqlite3_file*, int);
3771 static int apndUnlock(sqlite3_file*, int);
3772 static int apndCheckReservedLock(sqlite3_file*, int *pResOut);
3773 static int apndFileControl(sqlite3_file*, int op, void *pArg);
3774 static int apndSectorSize(sqlite3_file*);
3775 static int apndDeviceCharacteristics(sqlite3_file*);
3776 static int apndShmMap(sqlite3_file*, int iPg, int pgsz, int, void volatile**);
3777 static int apndShmLock(sqlite3_file*, int offset, int n, int flags);
3778 static void apndShmBarrier(sqlite3_file*);
3779 static int apndShmUnmap(sqlite3_file*, int deleteFlag);
3780 static int apndFetch(sqlite3_file*, sqlite3_int64 iOfst, int iAmt, void **pp);
3781 static int apndUnfetch(sqlite3_file*, sqlite3_int64 iOfst, void *p);
3782 
3783 /*
3784 ** Methods for ApndVfs
3785 */
3786 static int apndOpen(sqlite3_vfs*, const char *, sqlite3_file*, int , int *);
3787 static int apndDelete(sqlite3_vfs*, const char *zName, int syncDir);
3788 static int apndAccess(sqlite3_vfs*, const char *zName, int flags, int *);
3789 static int apndFullPathname(sqlite3_vfs*, const char *zName, int, char *zOut);
3790 static void *apndDlOpen(sqlite3_vfs*, const char *zFilename);
3791 static void apndDlError(sqlite3_vfs*, int nByte, char *zErrMsg);
3792 static void (*apndDlSym(sqlite3_vfs *pVfs, void *p, const char*zSym))(void);
3793 static void apndDlClose(sqlite3_vfs*, void*);
3794 static int apndRandomness(sqlite3_vfs*, int nByte, char *zOut);
3795 static int apndSleep(sqlite3_vfs*, int microseconds);
3796 static int apndCurrentTime(sqlite3_vfs*, double*);
3797 static int apndGetLastError(sqlite3_vfs*, int, char *);
3798 static int apndCurrentTimeInt64(sqlite3_vfs*, sqlite3_int64*);
3799 static int apndSetSystemCall(sqlite3_vfs*, const char*,sqlite3_syscall_ptr);
3800 static sqlite3_syscall_ptr apndGetSystemCall(sqlite3_vfs*, const char *z);
3801 static const char *apndNextSystemCall(sqlite3_vfs*, const char *zName);
3802 
3803 static sqlite3_vfs apnd_vfs = {
3804   3,                            /* iVersion (set when registered) */
3805   0,                            /* szOsFile (set when registered) */
3806   1024,                         /* mxPathname */
3807   0,                            /* pNext */
3808   "apndvfs",                    /* zName */
3809   0,                            /* pAppData (set when registered) */
3810   apndOpen,                     /* xOpen */
3811   apndDelete,                   /* xDelete */
3812   apndAccess,                   /* xAccess */
3813   apndFullPathname,             /* xFullPathname */
3814   apndDlOpen,                   /* xDlOpen */
3815   apndDlError,                  /* xDlError */
3816   apndDlSym,                    /* xDlSym */
3817   apndDlClose,                  /* xDlClose */
3818   apndRandomness,               /* xRandomness */
3819   apndSleep,                    /* xSleep */
3820   apndCurrentTime,              /* xCurrentTime */
3821   apndGetLastError,             /* xGetLastError */
3822   apndCurrentTimeInt64,         /* xCurrentTimeInt64 */
3823   apndSetSystemCall,            /* xSetSystemCall */
3824   apndGetSystemCall,            /* xGetSystemCall */
3825   apndNextSystemCall            /* xNextSystemCall */
3826 };
3827 
3828 static const sqlite3_io_methods apnd_io_methods = {
3829   3,                              /* iVersion */
3830   apndClose,                      /* xClose */
3831   apndRead,                       /* xRead */
3832   apndWrite,                      /* xWrite */
3833   apndTruncate,                   /* xTruncate */
3834   apndSync,                       /* xSync */
3835   apndFileSize,                   /* xFileSize */
3836   apndLock,                       /* xLock */
3837   apndUnlock,                     /* xUnlock */
3838   apndCheckReservedLock,          /* xCheckReservedLock */
3839   apndFileControl,                /* xFileControl */
3840   apndSectorSize,                 /* xSectorSize */
3841   apndDeviceCharacteristics,      /* xDeviceCharacteristics */
3842   apndShmMap,                     /* xShmMap */
3843   apndShmLock,                    /* xShmLock */
3844   apndShmBarrier,                 /* xShmBarrier */
3845   apndShmUnmap,                   /* xShmUnmap */
3846   apndFetch,                      /* xFetch */
3847   apndUnfetch                     /* xUnfetch */
3848 };
3849 
3850 /*
3851 ** Close an apnd-file.
3852 */
3853 static int apndClose(sqlite3_file *pFile){
3854   pFile = ORIGFILE(pFile);
3855   return pFile->pMethods->xClose(pFile);
3856 }
3857 
3858 /*
3859 ** Read data from an apnd-file.
3860 */
3861 static int apndRead(
3862   sqlite3_file *pFile,
3863   void *zBuf,
3864   int iAmt,
3865   sqlite_int64 iOfst
3866 ){
3867   ApndFile *paf = (ApndFile *)pFile;
3868   pFile = ORIGFILE(pFile);
3869   return pFile->pMethods->xRead(pFile, zBuf, iAmt, paf->iPgOne+iOfst);
3870 }
3871 
3872 /*
3873 ** Add the append-mark onto what should become the end of the file.
3874 *  If and only if this succeeds, internal ApndFile.iMark is updated.
3875 *  Parameter iWriteEnd is the appendvfs-relative offset of the new mark.
3876 */
3877 static int apndWriteMark(
3878   ApndFile *paf,
3879   sqlite3_file *pFile,
3880   sqlite_int64 iWriteEnd
3881 ){
3882   sqlite_int64 iPgOne = paf->iPgOne;
3883   unsigned char a[APND_MARK_SIZE];
3884   int i = APND_MARK_FOS_SZ;
3885   int rc;
3886   assert(pFile == ORIGFILE(paf));
3887   memcpy(a, APND_MARK_PREFIX, APND_MARK_PREFIX_SZ);
3888   while( --i >= 0 ){
3889     a[APND_MARK_PREFIX_SZ+i] = (unsigned char)(iPgOne & 0xff);
3890     iPgOne >>= 8;
3891   }
3892   iWriteEnd += paf->iPgOne;
3893   if( SQLITE_OK==(rc = pFile->pMethods->xWrite
3894                   (pFile, a, APND_MARK_SIZE, iWriteEnd)) ){
3895     paf->iMark = iWriteEnd;
3896   }
3897   return rc;
3898 }
3899 
3900 /*
3901 ** Write data to an apnd-file.
3902 */
3903 static int apndWrite(
3904   sqlite3_file *pFile,
3905   const void *zBuf,
3906   int iAmt,
3907   sqlite_int64 iOfst
3908 ){
3909   ApndFile *paf = (ApndFile *)pFile;
3910   sqlite_int64 iWriteEnd = iOfst + iAmt;
3911   if( iWriteEnd>=APND_MAX_SIZE ) return SQLITE_FULL;
3912   pFile = ORIGFILE(pFile);
3913   /* If append-mark is absent or will be overwritten, write it. */
3914   if( paf->iMark < 0 || paf->iPgOne + iWriteEnd > paf->iMark ){
3915     int rc = apndWriteMark(paf, pFile, iWriteEnd);
3916     if( SQLITE_OK!=rc ) return rc;
3917   }
3918   return pFile->pMethods->xWrite(pFile, zBuf, iAmt, paf->iPgOne+iOfst);
3919 }
3920 
3921 /*
3922 ** Truncate an apnd-file.
3923 */
3924 static int apndTruncate(sqlite3_file *pFile, sqlite_int64 size){
3925   ApndFile *paf = (ApndFile *)pFile;
3926   pFile = ORIGFILE(pFile);
3927   /* The append mark goes out first so truncate failure does not lose it. */
3928   if( SQLITE_OK!=apndWriteMark(paf, pFile, size) ) return SQLITE_IOERR;
3929   /* Truncate underlying file just past append mark */
3930   return pFile->pMethods->xTruncate(pFile, paf->iMark+APND_MARK_SIZE);
3931 }
3932 
3933 /*
3934 ** Sync an apnd-file.
3935 */
3936 static int apndSync(sqlite3_file *pFile, int flags){
3937   pFile = ORIGFILE(pFile);
3938   return pFile->pMethods->xSync(pFile, flags);
3939 }
3940 
3941 /*
3942 ** Return the current file-size of an apnd-file.
3943 ** If the append mark is not yet there, the file-size is 0.
3944 */
3945 static int apndFileSize(sqlite3_file *pFile, sqlite_int64 *pSize){
3946   ApndFile *paf = (ApndFile *)pFile;
3947   *pSize = ( paf->iMark >= 0 )? (paf->iMark - paf->iPgOne) : 0;
3948   return SQLITE_OK;
3949 }
3950 
3951 /*
3952 ** Lock an apnd-file.
3953 */
3954 static int apndLock(sqlite3_file *pFile, int eLock){
3955   pFile = ORIGFILE(pFile);
3956   return pFile->pMethods->xLock(pFile, eLock);
3957 }
3958 
3959 /*
3960 ** Unlock an apnd-file.
3961 */
3962 static int apndUnlock(sqlite3_file *pFile, int eLock){
3963   pFile = ORIGFILE(pFile);
3964   return pFile->pMethods->xUnlock(pFile, eLock);
3965 }
3966 
3967 /*
3968 ** Check if another file-handle holds a RESERVED lock on an apnd-file.
3969 */
3970 static int apndCheckReservedLock(sqlite3_file *pFile, int *pResOut){
3971   pFile = ORIGFILE(pFile);
3972   return pFile->pMethods->xCheckReservedLock(pFile, pResOut);
3973 }
3974 
3975 /*
3976 ** File control method. For custom operations on an apnd-file.
3977 */
3978 static int apndFileControl(sqlite3_file *pFile, int op, void *pArg){
3979   ApndFile *paf = (ApndFile *)pFile;
3980   int rc;
3981   pFile = ORIGFILE(pFile);
3982   if( op==SQLITE_FCNTL_SIZE_HINT ) *(sqlite3_int64*)pArg += paf->iPgOne;
3983   rc = pFile->pMethods->xFileControl(pFile, op, pArg);
3984   if( rc==SQLITE_OK && op==SQLITE_FCNTL_VFSNAME ){
3985     *(char**)pArg = sqlite3_mprintf("apnd(%lld)/%z", paf->iPgOne,*(char**)pArg);
3986   }
3987   return rc;
3988 }
3989 
3990 /*
3991 ** Return the sector-size in bytes for an apnd-file.
3992 */
3993 static int apndSectorSize(sqlite3_file *pFile){
3994   pFile = ORIGFILE(pFile);
3995   return pFile->pMethods->xSectorSize(pFile);
3996 }
3997 
3998 /*
3999 ** Return the device characteristic flags supported by an apnd-file.
4000 */
4001 static int apndDeviceCharacteristics(sqlite3_file *pFile){
4002   pFile = ORIGFILE(pFile);
4003   return pFile->pMethods->xDeviceCharacteristics(pFile);
4004 }
4005 
4006 /* Create a shared memory file mapping */
4007 static int apndShmMap(
4008   sqlite3_file *pFile,
4009   int iPg,
4010   int pgsz,
4011   int bExtend,
4012   void volatile **pp
4013 ){
4014   pFile = ORIGFILE(pFile);
4015   return pFile->pMethods->xShmMap(pFile,iPg,pgsz,bExtend,pp);
4016 }
4017 
4018 /* Perform locking on a shared-memory segment */
4019 static int apndShmLock(sqlite3_file *pFile, int offset, int n, int flags){
4020   pFile = ORIGFILE(pFile);
4021   return pFile->pMethods->xShmLock(pFile,offset,n,flags);
4022 }
4023 
4024 /* Memory barrier operation on shared memory */
4025 static void apndShmBarrier(sqlite3_file *pFile){
4026   pFile = ORIGFILE(pFile);
4027   pFile->pMethods->xShmBarrier(pFile);
4028 }
4029 
4030 /* Unmap a shared memory segment */
4031 static int apndShmUnmap(sqlite3_file *pFile, int deleteFlag){
4032   pFile = ORIGFILE(pFile);
4033   return pFile->pMethods->xShmUnmap(pFile,deleteFlag);
4034 }
4035 
4036 /* Fetch a page of a memory-mapped file */
4037 static int apndFetch(
4038   sqlite3_file *pFile,
4039   sqlite3_int64 iOfst,
4040   int iAmt,
4041   void **pp
4042 ){
4043   ApndFile *p = (ApndFile *)pFile;
4044   if( p->iMark < 0 || iOfst+iAmt > p->iMark ){
4045     return SQLITE_IOERR; /* Cannot read what is not yet there. */
4046   }
4047   pFile = ORIGFILE(pFile);
4048   return pFile->pMethods->xFetch(pFile, iOfst+p->iPgOne, iAmt, pp);
4049 }
4050 
4051 /* Release a memory-mapped page */
4052 static int apndUnfetch(sqlite3_file *pFile, sqlite3_int64 iOfst, void *pPage){
4053   ApndFile *p = (ApndFile *)pFile;
4054   pFile = ORIGFILE(pFile);
4055   return pFile->pMethods->xUnfetch(pFile, iOfst+p->iPgOne, pPage);
4056 }
4057 
4058 /*
4059 ** Try to read the append-mark off the end of a file.  Return the
4060 ** start of the appended database if the append-mark is present.
4061 ** If there is no valid append-mark, return -1;
4062 **
4063 ** An append-mark is only valid if the NNNNNNNN start-of-database offset
4064 ** indicates that the appended database contains at least one page.  The
4065 ** start-of-database value must be a multiple of 512.
4066 */
4067 static sqlite3_int64 apndReadMark(sqlite3_int64 sz, sqlite3_file *pFile){
4068   int rc, i;
4069   sqlite3_int64 iMark;
4070   int msbs = 8 * (APND_MARK_FOS_SZ-1);
4071   unsigned char a[APND_MARK_SIZE];
4072 
4073   if( APND_MARK_SIZE!=(sz & 0x1ff) ) return -1;
4074   rc = pFile->pMethods->xRead(pFile, a, APND_MARK_SIZE, sz-APND_MARK_SIZE);
4075   if( rc ) return -1;
4076   if( memcmp(a, APND_MARK_PREFIX, APND_MARK_PREFIX_SZ)!=0 ) return -1;
4077   iMark = ((sqlite3_int64)(a[APND_MARK_PREFIX_SZ] & 0x7f)) << msbs;
4078   for(i=1; i<8; i++){
4079     msbs -= 8;
4080     iMark |= (sqlite3_int64)a[APND_MARK_PREFIX_SZ+i]<<msbs;
4081   }
4082   if( iMark > (sz - APND_MARK_SIZE - 512) ) return -1;
4083   if( iMark & 0x1ff ) return -1;
4084   return iMark;
4085 }
4086 
4087 static const char apvfsSqliteHdr[] = "SQLite format 3";
4088 /*
4089 ** Check to see if the file is an appendvfs SQLite database file.
4090 ** Return true iff it is such. Parameter sz is the file's size.
4091 */
4092 static int apndIsAppendvfsDatabase(sqlite3_int64 sz, sqlite3_file *pFile){
4093   int rc;
4094   char zHdr[16];
4095   sqlite3_int64 iMark = apndReadMark(sz, pFile);
4096   if( iMark>=0 ){
4097     /* If file has the correct end-marker, the expected odd size, and the
4098     ** SQLite DB type marker where the end-marker puts it, then it
4099     ** is an appendvfs database.
4100     */
4101     rc = pFile->pMethods->xRead(pFile, zHdr, sizeof(zHdr), iMark);
4102     if( SQLITE_OK==rc
4103      && memcmp(zHdr, apvfsSqliteHdr, sizeof(zHdr))==0
4104      && (sz & 0x1ff) == APND_MARK_SIZE
4105      && sz>=512+APND_MARK_SIZE
4106     ){
4107       return 1; /* It's an appendvfs database */
4108     }
4109   }
4110   return 0;
4111 }
4112 
4113 /*
4114 ** Check to see if the file is an ordinary SQLite database file.
4115 ** Return true iff so. Parameter sz is the file's size.
4116 */
4117 static int apndIsOrdinaryDatabaseFile(sqlite3_int64 sz, sqlite3_file *pFile){
4118   char zHdr[16];
4119   if( apndIsAppendvfsDatabase(sz, pFile) /* rule 2 */
4120    || (sz & 0x1ff) != 0
4121    || SQLITE_OK!=pFile->pMethods->xRead(pFile, zHdr, sizeof(zHdr), 0)
4122    || memcmp(zHdr, apvfsSqliteHdr, sizeof(zHdr))!=0
4123   ){
4124     return 0;
4125   }else{
4126     return 1;
4127   }
4128 }
4129 
4130 /*
4131 ** Open an apnd file handle.
4132 */
4133 static int apndOpen(
4134   sqlite3_vfs *pApndVfs,
4135   const char *zName,
4136   sqlite3_file *pFile,
4137   int flags,
4138   int *pOutFlags
4139 ){
4140   ApndFile *pApndFile = (ApndFile*)pFile;
4141   sqlite3_file *pBaseFile = ORIGFILE(pFile);
4142   sqlite3_vfs *pBaseVfs = ORIGVFS(pApndVfs);
4143   int rc;
4144   sqlite3_int64 sz = 0;
4145   if( (flags & SQLITE_OPEN_MAIN_DB)==0 ){
4146     /* The appendvfs is not to be used for transient or temporary databases.
4147     ** Just use the base VFS open to initialize the given file object and
4148     ** open the underlying file. (Appendvfs is then unused for this file.)
4149     */
4150     return pBaseVfs->xOpen(pBaseVfs, zName, pFile, flags, pOutFlags);
4151   }
4152   memset(pApndFile, 0, sizeof(ApndFile));
4153   pFile->pMethods = &apnd_io_methods;
4154   pApndFile->iMark = -1;    /* Append mark not yet written */
4155 
4156   rc = pBaseVfs->xOpen(pBaseVfs, zName, pBaseFile, flags, pOutFlags);
4157   if( rc==SQLITE_OK ){
4158     rc = pBaseFile->pMethods->xFileSize(pBaseFile, &sz);
4159   }
4160   if( rc ){
4161     pBaseFile->pMethods->xClose(pBaseFile);
4162     pFile->pMethods = 0;
4163     return rc;
4164   }
4165   if( apndIsOrdinaryDatabaseFile(sz, pBaseFile) ){
4166     /* The file being opened appears to be just an ordinary DB. Copy
4167     ** the base dispatch-table so this instance mimics the base VFS.
4168     */
4169     memmove(pApndFile, pBaseFile, pBaseVfs->szOsFile);
4170     return SQLITE_OK;
4171   }
4172   pApndFile->iPgOne = apndReadMark(sz, pFile);
4173   if( pApndFile->iPgOne>=0 ){
4174     pApndFile->iMark = sz - APND_MARK_SIZE; /* Append mark found */
4175     return SQLITE_OK;
4176   }
4177   if( (flags & SQLITE_OPEN_CREATE)==0 ){
4178     pBaseFile->pMethods->xClose(pBaseFile);
4179     rc = SQLITE_CANTOPEN;
4180     pFile->pMethods = 0;
4181   }else{
4182     /* Round newly added appendvfs location to #define'd page boundary.
4183     ** Note that nothing has yet been written to the underlying file.
4184     ** The append mark will be written along with first content write.
4185     ** Until then, paf->iMark value indicates it is not yet written.
4186     */
4187     pApndFile->iPgOne = APND_START_ROUNDUP(sz);
4188   }
4189   return rc;
4190 }
4191 
4192 /*
4193 ** Delete an apnd file.
4194 ** For an appendvfs, this could mean delete the appendvfs portion,
4195 ** leaving the appendee as it was before it gained an appendvfs.
4196 ** For now, this code deletes the underlying file too.
4197 */
4198 static int apndDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){
4199   return ORIGVFS(pVfs)->xDelete(ORIGVFS(pVfs), zPath, dirSync);
4200 }
4201 
4202 /*
4203 ** All other VFS methods are pass-thrus.
4204 */
4205 static int apndAccess(
4206   sqlite3_vfs *pVfs,
4207   const char *zPath,
4208   int flags,
4209   int *pResOut
4210 ){
4211   return ORIGVFS(pVfs)->xAccess(ORIGVFS(pVfs), zPath, flags, pResOut);
4212 }
4213 static int apndFullPathname(
4214   sqlite3_vfs *pVfs,
4215   const char *zPath,
4216   int nOut,
4217   char *zOut
4218 ){
4219   return ORIGVFS(pVfs)->xFullPathname(ORIGVFS(pVfs),zPath,nOut,zOut);
4220 }
4221 static void *apndDlOpen(sqlite3_vfs *pVfs, const char *zPath){
4222   return ORIGVFS(pVfs)->xDlOpen(ORIGVFS(pVfs), zPath);
4223 }
4224 static void apndDlError(sqlite3_vfs *pVfs, int nByte, char *zErrMsg){
4225   ORIGVFS(pVfs)->xDlError(ORIGVFS(pVfs), nByte, zErrMsg);
4226 }
4227 static void (*apndDlSym(sqlite3_vfs *pVfs, void *p, const char *zSym))(void){
4228   return ORIGVFS(pVfs)->xDlSym(ORIGVFS(pVfs), p, zSym);
4229 }
4230 static void apndDlClose(sqlite3_vfs *pVfs, void *pHandle){
4231   ORIGVFS(pVfs)->xDlClose(ORIGVFS(pVfs), pHandle);
4232 }
4233 static int apndRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){
4234   return ORIGVFS(pVfs)->xRandomness(ORIGVFS(pVfs), nByte, zBufOut);
4235 }
4236 static int apndSleep(sqlite3_vfs *pVfs, int nMicro){
4237   return ORIGVFS(pVfs)->xSleep(ORIGVFS(pVfs), nMicro);
4238 }
4239 static int apndCurrentTime(sqlite3_vfs *pVfs, double *pTimeOut){
4240   return ORIGVFS(pVfs)->xCurrentTime(ORIGVFS(pVfs), pTimeOut);
4241 }
4242 static int apndGetLastError(sqlite3_vfs *pVfs, int a, char *b){
4243   return ORIGVFS(pVfs)->xGetLastError(ORIGVFS(pVfs), a, b);
4244 }
4245 static int apndCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *p){
4246   return ORIGVFS(pVfs)->xCurrentTimeInt64(ORIGVFS(pVfs), p);
4247 }
4248 static int apndSetSystemCall(
4249   sqlite3_vfs *pVfs,
4250   const char *zName,
4251   sqlite3_syscall_ptr pCall
4252 ){
4253   return ORIGVFS(pVfs)->xSetSystemCall(ORIGVFS(pVfs),zName,pCall);
4254 }
4255 static sqlite3_syscall_ptr apndGetSystemCall(
4256   sqlite3_vfs *pVfs,
4257   const char *zName
4258 ){
4259   return ORIGVFS(pVfs)->xGetSystemCall(ORIGVFS(pVfs),zName);
4260 }
4261 static const char *apndNextSystemCall(sqlite3_vfs *pVfs, const char *zName){
4262   return ORIGVFS(pVfs)->xNextSystemCall(ORIGVFS(pVfs), zName);
4263 }
4264 
4265 
4266 #ifdef _WIN32
4267 
4268 #endif
4269 /*
4270 ** This routine is called when the extension is loaded.
4271 ** Register the new VFS.
4272 */
4273 int sqlite3_appendvfs_init(
4274   sqlite3 *db,
4275   char **pzErrMsg,
4276   const sqlite3_api_routines *pApi
4277 ){
4278   int rc = SQLITE_OK;
4279   sqlite3_vfs *pOrig;
4280   SQLITE_EXTENSION_INIT2(pApi);
4281   (void)pzErrMsg;
4282   (void)db;
4283   pOrig = sqlite3_vfs_find(0);
4284   apnd_vfs.iVersion = pOrig->iVersion;
4285   apnd_vfs.pAppData = pOrig;
4286   apnd_vfs.szOsFile = pOrig->szOsFile + sizeof(ApndFile);
4287   rc = sqlite3_vfs_register(&apnd_vfs, 0);
4288 #ifdef APPENDVFS_TEST
4289   if( rc==SQLITE_OK ){
4290     rc = sqlite3_auto_extension((void(*)(void))apndvfsRegister);
4291   }
4292 #endif
4293   if( rc==SQLITE_OK ) rc = SQLITE_OK_LOAD_PERMANENTLY;
4294   return rc;
4295 }
4296 
4297 /************************* End ../ext/misc/appendvfs.c ********************/
4298 /************************* Begin ../ext/misc/memtrace.c ******************/
4299 /*
4300 ** 2019-01-21
4301 **
4302 ** The author disclaims copyright to this source code.  In place of
4303 ** a legal notice, here is a blessing:
4304 **
4305 **    May you do good and not evil.
4306 **    May you find forgiveness for yourself and forgive others.
4307 **    May you share freely, never taking more than you give.
4308 **
4309 *************************************************************************
4310 **
4311 ** This file implements an extension that uses the SQLITE_CONFIG_MALLOC
4312 ** mechanism to add a tracing layer on top of SQLite.  If this extension
4313 ** is registered prior to sqlite3_initialize(), it will cause all memory
4314 ** allocation activities to be logged on standard output, or to some other
4315 ** FILE specified by the initializer.
4316 **
4317 ** This file needs to be compiled into the application that uses it.
4318 **
4319 ** This extension is used to implement the --memtrace option of the
4320 ** command-line shell.
4321 */
4322 #include <assert.h>
4323 #include <string.h>
4324 #include <stdio.h>
4325 
4326 /* The original memory allocation routines */
4327 static sqlite3_mem_methods memtraceBase;
4328 static FILE *memtraceOut;
4329 
4330 /* Methods that trace memory allocations */
4331 static void *memtraceMalloc(int n){
4332   if( memtraceOut ){
4333     fprintf(memtraceOut, "MEMTRACE: allocate %d bytes\n",
4334             memtraceBase.xRoundup(n));
4335   }
4336   return memtraceBase.xMalloc(n);
4337 }
4338 static void memtraceFree(void *p){
4339   if( p==0 ) return;
4340   if( memtraceOut ){
4341     fprintf(memtraceOut, "MEMTRACE: free %d bytes\n", memtraceBase.xSize(p));
4342   }
4343   memtraceBase.xFree(p);
4344 }
4345 static void *memtraceRealloc(void *p, int n){
4346   if( p==0 ) return memtraceMalloc(n);
4347   if( n==0 ){
4348     memtraceFree(p);
4349     return 0;
4350   }
4351   if( memtraceOut ){
4352     fprintf(memtraceOut, "MEMTRACE: resize %d -> %d bytes\n",
4353             memtraceBase.xSize(p), memtraceBase.xRoundup(n));
4354   }
4355   return memtraceBase.xRealloc(p, n);
4356 }
4357 static int memtraceSize(void *p){
4358   return memtraceBase.xSize(p);
4359 }
4360 static int memtraceRoundup(int n){
4361   return memtraceBase.xRoundup(n);
4362 }
4363 static int memtraceInit(void *p){
4364   return memtraceBase.xInit(p);
4365 }
4366 static void memtraceShutdown(void *p){
4367   memtraceBase.xShutdown(p);
4368 }
4369 
4370 /* The substitute memory allocator */
4371 static sqlite3_mem_methods ersaztMethods = {
4372   memtraceMalloc,
4373   memtraceFree,
4374   memtraceRealloc,
4375   memtraceSize,
4376   memtraceRoundup,
4377   memtraceInit,
4378   memtraceShutdown,
4379   0
4380 };
4381 
4382 /* Begin tracing memory allocations to out. */
4383 int sqlite3MemTraceActivate(FILE *out){
4384   int rc = SQLITE_OK;
4385   if( memtraceBase.xMalloc==0 ){
4386     rc = sqlite3_config(SQLITE_CONFIG_GETMALLOC, &memtraceBase);
4387     if( rc==SQLITE_OK ){
4388       rc = sqlite3_config(SQLITE_CONFIG_MALLOC, &ersaztMethods);
4389     }
4390   }
4391   memtraceOut = out;
4392   return rc;
4393 }
4394 
4395 /* Deactivate memory tracing */
4396 int sqlite3MemTraceDeactivate(void){
4397   int rc = SQLITE_OK;
4398   if( memtraceBase.xMalloc!=0 ){
4399     rc = sqlite3_config(SQLITE_CONFIG_MALLOC, &memtraceBase);
4400     if( rc==SQLITE_OK ){
4401       memset(&memtraceBase, 0, sizeof(memtraceBase));
4402     }
4403   }
4404   memtraceOut = 0;
4405   return rc;
4406 }
4407 
4408 /************************* End ../ext/misc/memtrace.c ********************/
4409 /************************* Begin ../ext/misc/uint.c ******************/
4410 /*
4411 ** 2020-04-14
4412 **
4413 ** The author disclaims copyright to this source code.  In place of
4414 ** a legal notice, here is a blessing:
4415 **
4416 **    May you do good and not evil.
4417 **    May you find forgiveness for yourself and forgive others.
4418 **    May you share freely, never taking more than you give.
4419 **
4420 ******************************************************************************
4421 **
4422 ** This SQLite extension implements the UINT collating sequence.
4423 **
4424 ** UINT works like BINARY for text, except that embedded strings
4425 ** of digits compare in numeric order.
4426 **
4427 **     *   Leading zeros are handled properly, in the sense that
4428 **         they do not mess of the maginitude comparison of embedded
4429 **         strings of digits.  "x00123y" is equal to "x123y".
4430 **
4431 **     *   Only unsigned integers are recognized.  Plus and minus
4432 **         signs are ignored.  Decimal points and exponential notation
4433 **         are ignored.
4434 **
4435 **     *   Embedded integers can be of arbitrary length.  Comparison
4436 **         is *not* limited integers that can be expressed as a
4437 **         64-bit machine integer.
4438 */
4439 /* #include "sqlite3ext.h" */
4440 SQLITE_EXTENSION_INIT1
4441 #include <assert.h>
4442 #include <string.h>
4443 #include <ctype.h>
4444 
4445 /*
4446 ** Compare text in lexicographic order, except strings of digits
4447 ** compare in numeric order.
4448 */
4449 static int uintCollFunc(
4450   void *notUsed,
4451   int nKey1, const void *pKey1,
4452   int nKey2, const void *pKey2
4453 ){
4454   const unsigned char *zA = (const unsigned char*)pKey1;
4455   const unsigned char *zB = (const unsigned char*)pKey2;
4456   int i=0, j=0, x;
4457   (void)notUsed;
4458   while( i<nKey1 && j<nKey2 ){
4459     x = zA[i] - zB[j];
4460     if( isdigit(zA[i]) ){
4461       int k;
4462       if( !isdigit(zB[j]) ) return x;
4463       while( i<nKey1 && zA[i]=='0' ){ i++; }
4464       while( j<nKey2 && zB[j]=='0' ){ j++; }
4465       k = 0;
4466       while( i+k<nKey1 && isdigit(zA[i+k])
4467              && j+k<nKey2 && isdigit(zB[j+k]) ){
4468         k++;
4469       }
4470       if( i+k<nKey1 && isdigit(zA[i+k]) ){
4471         return +1;
4472       }else if( j+k<nKey2 && isdigit(zB[j+k]) ){
4473         return -1;
4474       }else{
4475         x = memcmp(zA+i, zB+j, k);
4476         if( x ) return x;
4477         i += k;
4478         j += k;
4479       }
4480     }else if( x ){
4481       return x;
4482     }else{
4483       i++;
4484       j++;
4485     }
4486   }
4487   return (nKey1 - i) - (nKey2 - j);
4488 }
4489 
4490 #ifdef _WIN32
4491 
4492 #endif
4493 int sqlite3_uint_init(
4494   sqlite3 *db,
4495   char **pzErrMsg,
4496   const sqlite3_api_routines *pApi
4497 ){
4498   SQLITE_EXTENSION_INIT2(pApi);
4499   (void)pzErrMsg;  /* Unused parameter */
4500   return sqlite3_create_collation(db, "uint", SQLITE_UTF8, 0, uintCollFunc);
4501 }
4502 
4503 /************************* End ../ext/misc/uint.c ********************/
4504 /************************* Begin ../ext/misc/decimal.c ******************/
4505 /*
4506 ** 2020-06-22
4507 **
4508 ** The author disclaims copyright to this source code.  In place of
4509 ** a legal notice, here is a blessing:
4510 **
4511 **    May you do good and not evil.
4512 **    May you find forgiveness for yourself and forgive others.
4513 **    May you share freely, never taking more than you give.
4514 **
4515 ******************************************************************************
4516 **
4517 ** Routines to implement arbitrary-precision decimal math.
4518 **
4519 ** The focus here is on simplicity and correctness, not performance.
4520 */
4521 /* #include "sqlite3ext.h" */
4522 SQLITE_EXTENSION_INIT1
4523 #include <assert.h>
4524 #include <string.h>
4525 #include <ctype.h>
4526 #include <stdlib.h>
4527 
4528 /* Mark a function parameter as unused, to suppress nuisance compiler
4529 ** warnings. */
4530 #ifndef UNUSED_PARAMETER
4531 # define UNUSED_PARAMETER(X)  (void)(X)
4532 #endif
4533 
4534 
4535 /* A decimal object */
4536 typedef struct Decimal Decimal;
4537 struct Decimal {
4538   char sign;        /* 0 for positive, 1 for negative */
4539   char oom;         /* True if an OOM is encountered */
4540   char isNull;      /* True if holds a NULL rather than a number */
4541   char isInit;      /* True upon initialization */
4542   int nDigit;       /* Total number of digits */
4543   int nFrac;        /* Number of digits to the right of the decimal point */
4544   signed char *a;   /* Array of digits.  Most significant first. */
4545 };
4546 
4547 /*
4548 ** Release memory held by a Decimal, but do not free the object itself.
4549 */
4550 static void decimal_clear(Decimal *p){
4551   sqlite3_free(p->a);
4552 }
4553 
4554 /*
4555 ** Destroy a Decimal object
4556 */
4557 static void decimal_free(Decimal *p){
4558   if( p ){
4559     decimal_clear(p);
4560     sqlite3_free(p);
4561   }
4562 }
4563 
4564 /*
4565 ** Allocate a new Decimal object.  Initialize it to the number given
4566 ** by the input string.
4567 */
4568 static Decimal *decimal_new(
4569   sqlite3_context *pCtx,
4570   sqlite3_value *pIn,
4571   int nAlt,
4572   const unsigned char *zAlt
4573 ){
4574   Decimal *p;
4575   int n, i;
4576   const unsigned char *zIn;
4577   int iExp = 0;
4578   p = sqlite3_malloc( sizeof(*p) );
4579   if( p==0 ) goto new_no_mem;
4580   p->sign = 0;
4581   p->oom = 0;
4582   p->isInit = 1;
4583   p->isNull = 0;
4584   p->nDigit = 0;
4585   p->nFrac = 0;
4586   if( zAlt ){
4587     n = nAlt,
4588     zIn = zAlt;
4589   }else{
4590     if( sqlite3_value_type(pIn)==SQLITE_NULL ){
4591       p->a = 0;
4592       p->isNull = 1;
4593       return p;
4594     }
4595     n = sqlite3_value_bytes(pIn);
4596     zIn = sqlite3_value_text(pIn);
4597   }
4598   p->a = sqlite3_malloc64( n+1 );
4599   if( p->a==0 ) goto new_no_mem;
4600   for(i=0; isspace(zIn[i]); i++){}
4601   if( zIn[i]=='-' ){
4602     p->sign = 1;
4603     i++;
4604   }else if( zIn[i]=='+' ){
4605     i++;
4606   }
4607   while( i<n && zIn[i]=='0' ) i++;
4608   while( i<n ){
4609     char c = zIn[i];
4610     if( c>='0' && c<='9' ){
4611       p->a[p->nDigit++] = c - '0';
4612     }else if( c=='.' ){
4613       p->nFrac = p->nDigit + 1;
4614     }else if( c=='e' || c=='E' ){
4615       int j = i+1;
4616       int neg = 0;
4617       if( j>=n ) break;
4618       if( zIn[j]=='-' ){
4619         neg = 1;
4620         j++;
4621       }else if( zIn[j]=='+' ){
4622         j++;
4623       }
4624       while( j<n && iExp<1000000 ){
4625         if( zIn[j]>='0' && zIn[j]<='9' ){
4626           iExp = iExp*10 + zIn[j] - '0';
4627         }
4628         j++;
4629       }
4630       if( neg ) iExp = -iExp;
4631       break;
4632     }
4633     i++;
4634   }
4635   if( p->nFrac ){
4636     p->nFrac = p->nDigit - (p->nFrac - 1);
4637   }
4638   if( iExp>0 ){
4639     if( p->nFrac>0 ){
4640       if( iExp<=p->nFrac ){
4641         p->nFrac -= iExp;
4642         iExp = 0;
4643       }else{
4644         iExp -= p->nFrac;
4645         p->nFrac = 0;
4646       }
4647     }
4648     if( iExp>0 ){
4649       p->a = sqlite3_realloc64(p->a, p->nDigit + iExp + 1 );
4650       if( p->a==0 ) goto new_no_mem;
4651       memset(p->a+p->nDigit, 0, iExp);
4652       p->nDigit += iExp;
4653     }
4654   }else if( iExp<0 ){
4655     int nExtra;
4656     iExp = -iExp;
4657     nExtra = p->nDigit - p->nFrac - 1;
4658     if( nExtra ){
4659       if( nExtra>=iExp ){
4660         p->nFrac += iExp;
4661         iExp  = 0;
4662       }else{
4663         iExp -= nExtra;
4664         p->nFrac = p->nDigit - 1;
4665       }
4666     }
4667     if( iExp>0 ){
4668       p->a = sqlite3_realloc64(p->a, p->nDigit + iExp + 1 );
4669       if( p->a==0 ) goto new_no_mem;
4670       memmove(p->a+iExp, p->a, p->nDigit);
4671       memset(p->a, 0, iExp);
4672       p->nDigit += iExp;
4673       p->nFrac += iExp;
4674     }
4675   }
4676   return p;
4677 
4678 new_no_mem:
4679   if( pCtx ) sqlite3_result_error_nomem(pCtx);
4680   sqlite3_free(p);
4681   return 0;
4682 }
4683 
4684 /*
4685 ** Make the given Decimal the result.
4686 */
4687 static void decimal_result(sqlite3_context *pCtx, Decimal *p){
4688   char *z;
4689   int i, j;
4690   int n;
4691   if( p==0 || p->oom ){
4692     sqlite3_result_error_nomem(pCtx);
4693     return;
4694   }
4695   if( p->isNull ){
4696     sqlite3_result_null(pCtx);
4697     return;
4698   }
4699   z = sqlite3_malloc( p->nDigit+4 );
4700   if( z==0 ){
4701     sqlite3_result_error_nomem(pCtx);
4702     return;
4703   }
4704   i = 0;
4705   if( p->nDigit==0 || (p->nDigit==1 && p->a[0]==0) ){
4706     p->sign = 0;
4707   }
4708   if( p->sign ){
4709     z[0] = '-';
4710     i = 1;
4711   }
4712   n = p->nDigit - p->nFrac;
4713   if( n<=0 ){
4714     z[i++] = '0';
4715   }
4716   j = 0;
4717   while( n>1 && p->a[j]==0 ){
4718     j++;
4719     n--;
4720   }
4721   while( n>0  ){
4722     z[i++] = p->a[j] + '0';
4723     j++;
4724     n--;
4725   }
4726   if( p->nFrac ){
4727     z[i++] = '.';
4728     do{
4729       z[i++] = p->a[j] + '0';
4730       j++;
4731     }while( j<p->nDigit );
4732   }
4733   z[i] = 0;
4734   sqlite3_result_text(pCtx, z, i, sqlite3_free);
4735 }
4736 
4737 /*
4738 ** SQL Function:   decimal(X)
4739 **
4740 ** Convert input X into decimal and then back into text
4741 */
4742 static void decimalFunc(
4743   sqlite3_context *context,
4744   int argc,
4745   sqlite3_value **argv
4746 ){
4747   Decimal *p = decimal_new(context, argv[0], 0, 0);
4748   UNUSED_PARAMETER(argc);
4749   decimal_result(context, p);
4750   decimal_free(p);
4751 }
4752 
4753 /*
4754 ** Compare to Decimal objects.  Return negative, 0, or positive if the
4755 ** first object is less than, equal to, or greater than the second.
4756 **
4757 ** Preconditions for this routine:
4758 **
4759 **    pA!=0
4760 **    pA->isNull==0
4761 **    pB!=0
4762 **    pB->isNull==0
4763 */
4764 static int decimal_cmp(const Decimal *pA, const Decimal *pB){
4765   int nASig, nBSig, rc, n;
4766   if( pA->sign!=pB->sign ){
4767     return pA->sign ? -1 : +1;
4768   }
4769   if( pA->sign ){
4770     const Decimal *pTemp = pA;
4771     pA = pB;
4772     pB = pTemp;
4773   }
4774   nASig = pA->nDigit - pA->nFrac;
4775   nBSig = pB->nDigit - pB->nFrac;
4776   if( nASig!=nBSig ){
4777     return nASig - nBSig;
4778   }
4779   n = pA->nDigit;
4780   if( n>pB->nDigit ) n = pB->nDigit;
4781   rc = memcmp(pA->a, pB->a, n);
4782   if( rc==0 ){
4783     rc = pA->nDigit - pB->nDigit;
4784   }
4785   return rc;
4786 }
4787 
4788 /*
4789 ** SQL Function:   decimal_cmp(X, Y)
4790 **
4791 ** Return negative, zero, or positive if X is less then, equal to, or
4792 ** greater than Y.
4793 */
4794 static void decimalCmpFunc(
4795   sqlite3_context *context,
4796   int argc,
4797   sqlite3_value **argv
4798 ){
4799   Decimal *pA = 0, *pB = 0;
4800   int rc;
4801 
4802   UNUSED_PARAMETER(argc);
4803   pA = decimal_new(context, argv[0], 0, 0);
4804   if( pA==0 || pA->isNull ) goto cmp_done;
4805   pB = decimal_new(context, argv[1], 0, 0);
4806   if( pB==0 || pB->isNull ) goto cmp_done;
4807   rc = decimal_cmp(pA, pB);
4808   if( rc<0 ) rc = -1;
4809   else if( rc>0 ) rc = +1;
4810   sqlite3_result_int(context, rc);
4811 cmp_done:
4812   decimal_free(pA);
4813   decimal_free(pB);
4814 }
4815 
4816 /*
4817 ** Expand the Decimal so that it has a least nDigit digits and nFrac
4818 ** digits to the right of the decimal point.
4819 */
4820 static void decimal_expand(Decimal *p, int nDigit, int nFrac){
4821   int nAddSig;
4822   int nAddFrac;
4823   if( p==0 ) return;
4824   nAddFrac = nFrac - p->nFrac;
4825   nAddSig = (nDigit - p->nDigit) - nAddFrac;
4826   if( nAddFrac==0 && nAddSig==0 ) return;
4827   p->a = sqlite3_realloc64(p->a, nDigit+1);
4828   if( p->a==0 ){
4829     p->oom = 1;
4830     return;
4831   }
4832   if( nAddSig ){
4833     memmove(p->a+nAddSig, p->a, p->nDigit);
4834     memset(p->a, 0, nAddSig);
4835     p->nDigit += nAddSig;
4836   }
4837   if( nAddFrac ){
4838     memset(p->a+p->nDigit, 0, nAddFrac);
4839     p->nDigit += nAddFrac;
4840     p->nFrac += nAddFrac;
4841   }
4842 }
4843 
4844 /*
4845 ** Add the value pB into pA.
4846 **
4847 ** Both pA and pB might become denormalized by this routine.
4848 */
4849 static void decimal_add(Decimal *pA, Decimal *pB){
4850   int nSig, nFrac, nDigit;
4851   int i, rc;
4852   if( pA==0 ){
4853     return;
4854   }
4855   if( pA->oom || pB==0 || pB->oom ){
4856     pA->oom = 1;
4857     return;
4858   }
4859   if( pA->isNull || pB->isNull ){
4860     pA->isNull = 1;
4861     return;
4862   }
4863   nSig = pA->nDigit - pA->nFrac;
4864   if( nSig && pA->a[0]==0 ) nSig--;
4865   if( nSig<pB->nDigit-pB->nFrac ){
4866     nSig = pB->nDigit - pB->nFrac;
4867   }
4868   nFrac = pA->nFrac;
4869   if( nFrac<pB->nFrac ) nFrac = pB->nFrac;
4870   nDigit = nSig + nFrac + 1;
4871   decimal_expand(pA, nDigit, nFrac);
4872   decimal_expand(pB, nDigit, nFrac);
4873   if( pA->oom || pB->oom ){
4874     pA->oom = 1;
4875   }else{
4876     if( pA->sign==pB->sign ){
4877       int carry = 0;
4878       for(i=nDigit-1; i>=0; i--){
4879         int x = pA->a[i] + pB->a[i] + carry;
4880         if( x>=10 ){
4881           carry = 1;
4882           pA->a[i] = x - 10;
4883         }else{
4884           carry = 0;
4885           pA->a[i] = x;
4886         }
4887       }
4888     }else{
4889       signed char *aA, *aB;
4890       int borrow = 0;
4891       rc = memcmp(pA->a, pB->a, nDigit);
4892       if( rc<0 ){
4893         aA = pB->a;
4894         aB = pA->a;
4895         pA->sign = !pA->sign;
4896       }else{
4897         aA = pA->a;
4898         aB = pB->a;
4899       }
4900       for(i=nDigit-1; i>=0; i--){
4901         int x = aA[i] - aB[i] - borrow;
4902         if( x<0 ){
4903           pA->a[i] = x+10;
4904           borrow = 1;
4905         }else{
4906           pA->a[i] = x;
4907           borrow = 0;
4908         }
4909       }
4910     }
4911   }
4912 }
4913 
4914 /*
4915 ** Compare text in decimal order.
4916 */
4917 static int decimalCollFunc(
4918   void *notUsed,
4919   int nKey1, const void *pKey1,
4920   int nKey2, const void *pKey2
4921 ){
4922   const unsigned char *zA = (const unsigned char*)pKey1;
4923   const unsigned char *zB = (const unsigned char*)pKey2;
4924   Decimal *pA = decimal_new(0, 0, nKey1, zA);
4925   Decimal *pB = decimal_new(0, 0, nKey2, zB);
4926   int rc;
4927   UNUSED_PARAMETER(notUsed);
4928   if( pA==0 || pB==0 ){
4929     rc = 0;
4930   }else{
4931     rc = decimal_cmp(pA, pB);
4932   }
4933   decimal_free(pA);
4934   decimal_free(pB);
4935   return rc;
4936 }
4937 
4938 
4939 /*
4940 ** SQL Function:   decimal_add(X, Y)
4941 **                 decimal_sub(X, Y)
4942 **
4943 ** Return the sum or difference of X and Y.
4944 */
4945 static void decimalAddFunc(
4946   sqlite3_context *context,
4947   int argc,
4948   sqlite3_value **argv
4949 ){
4950   Decimal *pA = decimal_new(context, argv[0], 0, 0);
4951   Decimal *pB = decimal_new(context, argv[1], 0, 0);
4952   UNUSED_PARAMETER(argc);
4953   decimal_add(pA, pB);
4954   decimal_result(context, pA);
4955   decimal_free(pA);
4956   decimal_free(pB);
4957 }
4958 static void decimalSubFunc(
4959   sqlite3_context *context,
4960   int argc,
4961   sqlite3_value **argv
4962 ){
4963   Decimal *pA = decimal_new(context, argv[0], 0, 0);
4964   Decimal *pB = decimal_new(context, argv[1], 0, 0);
4965   UNUSED_PARAMETER(argc);
4966   if( pB==0 ) return;
4967   pB->sign = !pB->sign;
4968   decimal_add(pA, pB);
4969   decimal_result(context, pA);
4970   decimal_free(pA);
4971   decimal_free(pB);
4972 }
4973 
4974 /* Aggregate funcion:   decimal_sum(X)
4975 **
4976 ** Works like sum() except that it uses decimal arithmetic for unlimited
4977 ** precision.
4978 */
4979 static void decimalSumStep(
4980   sqlite3_context *context,
4981   int argc,
4982   sqlite3_value **argv
4983 ){
4984   Decimal *p;
4985   Decimal *pArg;
4986   UNUSED_PARAMETER(argc);
4987   p = sqlite3_aggregate_context(context, sizeof(*p));
4988   if( p==0 ) return;
4989   if( !p->isInit ){
4990     p->isInit = 1;
4991     p->a = sqlite3_malloc(2);
4992     if( p->a==0 ){
4993       p->oom = 1;
4994     }else{
4995       p->a[0] = 0;
4996     }
4997     p->nDigit = 1;
4998     p->nFrac = 0;
4999   }
5000   if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
5001   pArg = decimal_new(context, argv[0], 0, 0);
5002   decimal_add(p, pArg);
5003   decimal_free(pArg);
5004 }
5005 static void decimalSumInverse(
5006   sqlite3_context *context,
5007   int argc,
5008   sqlite3_value **argv
5009 ){
5010   Decimal *p;
5011   Decimal *pArg;
5012   UNUSED_PARAMETER(argc);
5013   p = sqlite3_aggregate_context(context, sizeof(*p));
5014   if( p==0 ) return;
5015   if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
5016   pArg = decimal_new(context, argv[0], 0, 0);
5017   if( pArg ) pArg->sign = !pArg->sign;
5018   decimal_add(p, pArg);
5019   decimal_free(pArg);
5020 }
5021 static void decimalSumValue(sqlite3_context *context){
5022   Decimal *p = sqlite3_aggregate_context(context, 0);
5023   if( p==0 ) return;
5024   decimal_result(context, p);
5025 }
5026 static void decimalSumFinalize(sqlite3_context *context){
5027   Decimal *p = sqlite3_aggregate_context(context, 0);
5028   if( p==0 ) return;
5029   decimal_result(context, p);
5030   decimal_clear(p);
5031 }
5032 
5033 /*
5034 ** SQL Function:   decimal_mul(X, Y)
5035 **
5036 ** Return the product of X and Y.
5037 **
5038 ** All significant digits after the decimal point are retained.
5039 ** Trailing zeros after the decimal point are omitted as long as
5040 ** the number of digits after the decimal point is no less than
5041 ** either the number of digits in either input.
5042 */
5043 static void decimalMulFunc(
5044   sqlite3_context *context,
5045   int argc,
5046   sqlite3_value **argv
5047 ){
5048   Decimal *pA = decimal_new(context, argv[0], 0, 0);
5049   Decimal *pB = decimal_new(context, argv[1], 0, 0);
5050   signed char *acc = 0;
5051   int i, j, k;
5052   int minFrac;
5053   UNUSED_PARAMETER(argc);
5054   if( pA==0 || pA->oom || pA->isNull
5055    || pB==0 || pB->oom || pB->isNull
5056   ){
5057     goto mul_end;
5058   }
5059   acc = sqlite3_malloc64( pA->nDigit + pB->nDigit + 2 );
5060   if( acc==0 ){
5061     sqlite3_result_error_nomem(context);
5062     goto mul_end;
5063   }
5064   memset(acc, 0, pA->nDigit + pB->nDigit + 2);
5065   minFrac = pA->nFrac;
5066   if( pB->nFrac<minFrac ) minFrac = pB->nFrac;
5067   for(i=pA->nDigit-1; i>=0; i--){
5068     signed char f = pA->a[i];
5069     int carry = 0, x;
5070     for(j=pB->nDigit-1, k=i+j+3; j>=0; j--, k--){
5071       x = acc[k] + f*pB->a[j] + carry;
5072       acc[k] = x%10;
5073       carry = x/10;
5074     }
5075     x = acc[k] + carry;
5076     acc[k] = x%10;
5077     acc[k-1] += x/10;
5078   }
5079   sqlite3_free(pA->a);
5080   pA->a = acc;
5081   acc = 0;
5082   pA->nDigit += pB->nDigit + 2;
5083   pA->nFrac += pB->nFrac;
5084   pA->sign ^= pB->sign;
5085   while( pA->nFrac>minFrac && pA->a[pA->nDigit-1]==0 ){
5086     pA->nFrac--;
5087     pA->nDigit--;
5088   }
5089   decimal_result(context, pA);
5090 
5091 mul_end:
5092   sqlite3_free(acc);
5093   decimal_free(pA);
5094   decimal_free(pB);
5095 }
5096 
5097 #ifdef _WIN32
5098 
5099 #endif
5100 int sqlite3_decimal_init(
5101   sqlite3 *db,
5102   char **pzErrMsg,
5103   const sqlite3_api_routines *pApi
5104 ){
5105   int rc = SQLITE_OK;
5106   static const struct {
5107     const char *zFuncName;
5108     int nArg;
5109     void (*xFunc)(sqlite3_context*,int,sqlite3_value**);
5110   } aFunc[] = {
5111     { "decimal",       1,   decimalFunc        },
5112     { "decimal_cmp",   2,   decimalCmpFunc     },
5113     { "decimal_add",   2,   decimalAddFunc     },
5114     { "decimal_sub",   2,   decimalSubFunc     },
5115     { "decimal_mul",   2,   decimalMulFunc     },
5116   };
5117   unsigned int i;
5118   (void)pzErrMsg;  /* Unused parameter */
5119 
5120   SQLITE_EXTENSION_INIT2(pApi);
5121 
5122   for(i=0; i<sizeof(aFunc)/sizeof(aFunc[0]) && rc==SQLITE_OK; i++){
5123     rc = sqlite3_create_function(db, aFunc[i].zFuncName, aFunc[i].nArg,
5124                    SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC,
5125                    0, aFunc[i].xFunc, 0, 0);
5126   }
5127   if( rc==SQLITE_OK ){
5128     rc = sqlite3_create_window_function(db, "decimal_sum", 1,
5129                    SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC, 0,
5130                    decimalSumStep, decimalSumFinalize,
5131                    decimalSumValue, decimalSumInverse, 0);
5132   }
5133   if( rc==SQLITE_OK ){
5134     rc = sqlite3_create_collation(db, "decimal", SQLITE_UTF8,
5135                                   0, decimalCollFunc);
5136   }
5137   return rc;
5138 }
5139 
5140 /************************* End ../ext/misc/decimal.c ********************/
5141 /************************* Begin ../ext/misc/ieee754.c ******************/
5142 /*
5143 ** 2013-04-17
5144 **
5145 ** The author disclaims copyright to this source code.  In place of
5146 ** a legal notice, here is a blessing:
5147 **
5148 **    May you do good and not evil.
5149 **    May you find forgiveness for yourself and forgive others.
5150 **    May you share freely, never taking more than you give.
5151 **
5152 ******************************************************************************
5153 **
5154 ** This SQLite extension implements functions for the exact display
5155 ** and input of IEEE754 Binary64 floating-point numbers.
5156 **
5157 **   ieee754(X)
5158 **   ieee754(Y,Z)
5159 **
5160 ** In the first form, the value X should be a floating-point number.
5161 ** The function will return a string of the form 'ieee754(Y,Z)' where
5162 ** Y and Z are integers such that X==Y*pow(2,Z).
5163 **
5164 ** In the second form, Y and Z are integers which are the mantissa and
5165 ** base-2 exponent of a new floating point number.  The function returns
5166 ** a floating-point value equal to Y*pow(2,Z).
5167 **
5168 ** Examples:
5169 **
5170 **     ieee754(2.0)             ->     'ieee754(2,0)'
5171 **     ieee754(45.25)           ->     'ieee754(181,-2)'
5172 **     ieee754(2, 0)            ->     2.0
5173 **     ieee754(181, -2)         ->     45.25
5174 **
5175 ** Two additional functions break apart the one-argument ieee754()
5176 ** result into separate integer values:
5177 **
5178 **     ieee754_mantissa(45.25)  ->     181
5179 **     ieee754_exponent(45.25)  ->     -2
5180 **
5181 ** These functions convert binary64 numbers into blobs and back again.
5182 **
5183 **     ieee754_from_blob(x'3ff0000000000000')  ->  1.0
5184 **     ieee754_to_blob(1.0)                    ->  x'3ff0000000000000'
5185 **
5186 ** In all single-argument functions, if the argument is an 8-byte blob
5187 ** then that blob is interpreted as a big-endian binary64 value.
5188 **
5189 **
5190 ** EXACT DECIMAL REPRESENTATION OF BINARY64 VALUES
5191 ** -----------------------------------------------
5192 **
5193 ** This extension in combination with the separate 'decimal' extension
5194 ** can be used to compute the exact decimal representation of binary64
5195 ** values.  To begin, first compute a table of exponent values:
5196 **
5197 **    CREATE TABLE pow2(x INTEGER PRIMARY KEY, v TEXT);
5198 **    WITH RECURSIVE c(x,v) AS (
5199 **      VALUES(0,'1')
5200 **      UNION ALL
5201 **      SELECT x+1, decimal_mul(v,'2') FROM c WHERE x+1<=971
5202 **    ) INSERT INTO pow2(x,v) SELECT x, v FROM c;
5203 **    WITH RECURSIVE c(x,v) AS (
5204 **      VALUES(-1,'0.5')
5205 **      UNION ALL
5206 **      SELECT x-1, decimal_mul(v,'0.5') FROM c WHERE x-1>=-1075
5207 **    ) INSERT INTO pow2(x,v) SELECT x, v FROM c;
5208 **
5209 ** Then, to compute the exact decimal representation of a floating
5210 ** point value (the value 47.49 is used in the example) do:
5211 **
5212 **    WITH c(n) AS (VALUES(47.49))
5213 **          ---------------^^^^^---- Replace with whatever you want
5214 **    SELECT decimal_mul(ieee754_mantissa(c.n),pow2.v)
5215 **      FROM pow2, c WHERE pow2.x=ieee754_exponent(c.n);
5216 **
5217 ** Here is a query to show various boundry values for the binary64
5218 ** number format:
5219 **
5220 **    WITH c(name,bin) AS (VALUES
5221 **       ('minimum positive value',        x'0000000000000001'),
5222 **       ('maximum subnormal value',       x'000fffffffffffff'),
5223 **       ('mininum positive nornal value', x'0010000000000000'),
5224 **       ('maximum value',                 x'7fefffffffffffff'))
5225 **    SELECT c.name, decimal_mul(ieee754_mantissa(c.bin),pow2.v)
5226 **      FROM pow2, c WHERE pow2.x=ieee754_exponent(c.bin);
5227 **
5228 */
5229 /* #include "sqlite3ext.h" */
5230 SQLITE_EXTENSION_INIT1
5231 #include <assert.h>
5232 #include <string.h>
5233 
5234 /* Mark a function parameter as unused, to suppress nuisance compiler
5235 ** warnings. */
5236 #ifndef UNUSED_PARAMETER
5237 # define UNUSED_PARAMETER(X)  (void)(X)
5238 #endif
5239 
5240 /*
5241 ** Implementation of the ieee754() function
5242 */
5243 static void ieee754func(
5244   sqlite3_context *context,
5245   int argc,
5246   sqlite3_value **argv
5247 ){
5248   if( argc==1 ){
5249     sqlite3_int64 m, a;
5250     double r;
5251     int e;
5252     int isNeg;
5253     char zResult[100];
5254     assert( sizeof(m)==sizeof(r) );
5255     if( sqlite3_value_type(argv[0])==SQLITE_BLOB
5256      && sqlite3_value_bytes(argv[0])==sizeof(r)
5257     ){
5258       const unsigned char *x = sqlite3_value_blob(argv[0]);
5259       unsigned int i;
5260       sqlite3_uint64 v = 0;
5261       for(i=0; i<sizeof(r); i++){
5262         v = (v<<8) | x[i];
5263       }
5264       memcpy(&r, &v, sizeof(r));
5265     }else{
5266       r = sqlite3_value_double(argv[0]);
5267     }
5268     if( r<0.0 ){
5269       isNeg = 1;
5270       r = -r;
5271     }else{
5272       isNeg = 0;
5273     }
5274     memcpy(&a,&r,sizeof(a));
5275     if( a==0 ){
5276       e = 0;
5277       m = 0;
5278     }else{
5279       e = a>>52;
5280       m = a & ((((sqlite3_int64)1)<<52)-1);
5281       if( e==0 ){
5282         m <<= 1;
5283       }else{
5284         m |= ((sqlite3_int64)1)<<52;
5285       }
5286       while( e<1075 && m>0 && (m&1)==0 ){
5287         m >>= 1;
5288         e++;
5289       }
5290       if( isNeg ) m = -m;
5291     }
5292     switch( *(int*)sqlite3_user_data(context) ){
5293       case 0:
5294         sqlite3_snprintf(sizeof(zResult), zResult, "ieee754(%lld,%d)",
5295                          m, e-1075);
5296         sqlite3_result_text(context, zResult, -1, SQLITE_TRANSIENT);
5297         break;
5298       case 1:
5299         sqlite3_result_int64(context, m);
5300         break;
5301       case 2:
5302         sqlite3_result_int(context, e-1075);
5303         break;
5304     }
5305   }else{
5306     sqlite3_int64 m, e, a;
5307     double r;
5308     int isNeg = 0;
5309     m = sqlite3_value_int64(argv[0]);
5310     e = sqlite3_value_int64(argv[1]);
5311 
5312     /* Limit the range of e.  Ticket 22dea1cfdb9151e4 2021-03-02 */
5313     if( e>10000 ){
5314       e = 10000;
5315     }else if( e<-10000 ){
5316       e = -10000;
5317     }
5318 
5319     if( m<0 ){
5320       isNeg = 1;
5321       m = -m;
5322       if( m<0 ) return;
5323     }else if( m==0 && e>-1000 && e<1000 ){
5324       sqlite3_result_double(context, 0.0);
5325       return;
5326     }
5327     while( (m>>32)&0xffe00000 ){
5328       m >>= 1;
5329       e++;
5330     }
5331     while( m!=0 && ((m>>32)&0xfff00000)==0 ){
5332       m <<= 1;
5333       e--;
5334     }
5335     e += 1075;
5336     if( e<=0 ){
5337       /* Subnormal */
5338       m >>= 1-e;
5339       e = 0;
5340     }else if( e>0x7ff ){
5341       e = 0x7ff;
5342     }
5343     a = m & ((((sqlite3_int64)1)<<52)-1);
5344     a |= e<<52;
5345     if( isNeg ) a |= ((sqlite3_uint64)1)<<63;
5346     memcpy(&r, &a, sizeof(r));
5347     sqlite3_result_double(context, r);
5348   }
5349 }
5350 
5351 /*
5352 ** Functions to convert between blobs and floats.
5353 */
5354 static void ieee754func_from_blob(
5355   sqlite3_context *context,
5356   int argc,
5357   sqlite3_value **argv
5358 ){
5359   UNUSED_PARAMETER(argc);
5360   if( sqlite3_value_type(argv[0])==SQLITE_BLOB
5361    && sqlite3_value_bytes(argv[0])==sizeof(double)
5362   ){
5363     double r;
5364     const unsigned char *x = sqlite3_value_blob(argv[0]);
5365     unsigned int i;
5366     sqlite3_uint64 v = 0;
5367     for(i=0; i<sizeof(r); i++){
5368       v = (v<<8) | x[i];
5369     }
5370     memcpy(&r, &v, sizeof(r));
5371     sqlite3_result_double(context, r);
5372   }
5373 }
5374 static void ieee754func_to_blob(
5375   sqlite3_context *context,
5376   int argc,
5377   sqlite3_value **argv
5378 ){
5379   UNUSED_PARAMETER(argc);
5380   if( sqlite3_value_type(argv[0])==SQLITE_FLOAT
5381    || sqlite3_value_type(argv[0])==SQLITE_INTEGER
5382   ){
5383     double r = sqlite3_value_double(argv[0]);
5384     sqlite3_uint64 v;
5385     unsigned char a[sizeof(r)];
5386     unsigned int i;
5387     memcpy(&v, &r, sizeof(r));
5388     for(i=1; i<=sizeof(r); i++){
5389       a[sizeof(r)-i] = v&0xff;
5390       v >>= 8;
5391     }
5392     sqlite3_result_blob(context, a, sizeof(r), SQLITE_TRANSIENT);
5393   }
5394 }
5395 
5396 
5397 #ifdef _WIN32
5398 
5399 #endif
5400 int sqlite3_ieee_init(
5401   sqlite3 *db,
5402   char **pzErrMsg,
5403   const sqlite3_api_routines *pApi
5404 ){
5405   static const struct {
5406     char *zFName;
5407     int nArg;
5408     int iAux;
5409     void (*xFunc)(sqlite3_context*,int,sqlite3_value**);
5410   } aFunc[] = {
5411     { "ieee754",           1,   0, ieee754func },
5412     { "ieee754",           2,   0, ieee754func },
5413     { "ieee754_mantissa",  1,   1, ieee754func },
5414     { "ieee754_exponent",  1,   2, ieee754func },
5415     { "ieee754_to_blob",   1,   0, ieee754func_to_blob },
5416     { "ieee754_from_blob", 1,   0, ieee754func_from_blob },
5417 
5418   };
5419   unsigned int i;
5420   int rc = SQLITE_OK;
5421   SQLITE_EXTENSION_INIT2(pApi);
5422   (void)pzErrMsg;  /* Unused parameter */
5423   for(i=0; i<sizeof(aFunc)/sizeof(aFunc[0]) && rc==SQLITE_OK; i++){
5424     rc = sqlite3_create_function(db, aFunc[i].zFName, aFunc[i].nArg,
5425                                SQLITE_UTF8|SQLITE_INNOCUOUS,
5426                                (void*)&aFunc[i].iAux,
5427                                aFunc[i].xFunc, 0, 0);
5428   }
5429   return rc;
5430 }
5431 
5432 /************************* End ../ext/misc/ieee754.c ********************/
5433 /************************* Begin ../ext/misc/series.c ******************/
5434 /*
5435 ** 2015-08-18
5436 **
5437 ** The author disclaims copyright to this source code.  In place of
5438 ** a legal notice, here is a blessing:
5439 **
5440 **    May you do good and not evil.
5441 **    May you find forgiveness for yourself and forgive others.
5442 **    May you share freely, never taking more than you give.
5443 **
5444 *************************************************************************
5445 **
5446 ** This file demonstrates how to create a table-valued-function using
5447 ** a virtual table.  This demo implements the generate_series() function
5448 ** which gives similar results to the eponymous function in PostgreSQL.
5449 ** Examples:
5450 **
5451 **      SELECT * FROM generate_series(0,100,5);
5452 **
5453 ** The query above returns integers from 0 through 100 counting by steps
5454 ** of 5.
5455 **
5456 **      SELECT * FROM generate_series(0,100);
5457 **
5458 ** Integers from 0 through 100 with a step size of 1.
5459 **
5460 **      SELECT * FROM generate_series(20) LIMIT 10;
5461 **
5462 ** Integers 20 through 29.
5463 **
5464 ** HOW IT WORKS
5465 **
5466 ** The generate_series "function" is really a virtual table with the
5467 ** following schema:
5468 **
5469 **     CREATE TABLE generate_series(
5470 **       value,
5471 **       start HIDDEN,
5472 **       stop HIDDEN,
5473 **       step HIDDEN
5474 **     );
5475 **
5476 ** Function arguments in queries against this virtual table are translated
5477 ** into equality constraints against successive hidden columns.  In other
5478 ** words, the following pairs of queries are equivalent to each other:
5479 **
5480 **    SELECT * FROM generate_series(0,100,5);
5481 **    SELECT * FROM generate_series WHERE start=0 AND stop=100 AND step=5;
5482 **
5483 **    SELECT * FROM generate_series(0,100);
5484 **    SELECT * FROM generate_series WHERE start=0 AND stop=100;
5485 **
5486 **    SELECT * FROM generate_series(20) LIMIT 10;
5487 **    SELECT * FROM generate_series WHERE start=20 LIMIT 10;
5488 **
5489 ** The generate_series virtual table implementation leaves the xCreate method
5490 ** set to NULL.  This means that it is not possible to do a CREATE VIRTUAL
5491 ** TABLE command with "generate_series" as the USING argument.  Instead, there
5492 ** is a single generate_series virtual table that is always available without
5493 ** having to be created first.
5494 **
5495 ** The xBestIndex method looks for equality constraints against the hidden
5496 ** start, stop, and step columns, and if present, it uses those constraints
5497 ** to bound the sequence of generated values.  If the equality constraints
5498 ** are missing, it uses 0 for start, 4294967295 for stop, and 1 for step.
5499 ** xBestIndex returns a small cost when both start and stop are available,
5500 ** and a very large cost if either start or stop are unavailable.  This
5501 ** encourages the query planner to order joins such that the bounds of the
5502 ** series are well-defined.
5503 */
5504 /* #include "sqlite3ext.h" */
5505 SQLITE_EXTENSION_INIT1
5506 #include <assert.h>
5507 #include <string.h>
5508 
5509 #ifndef SQLITE_OMIT_VIRTUALTABLE
5510 
5511 
5512 /* series_cursor is a subclass of sqlite3_vtab_cursor which will
5513 ** serve as the underlying representation of a cursor that scans
5514 ** over rows of the result
5515 */
5516 typedef struct series_cursor series_cursor;
5517 struct series_cursor {
5518   sqlite3_vtab_cursor base;  /* Base class - must be first */
5519   int isDesc;                /* True to count down rather than up */
5520   sqlite3_int64 iRowid;      /* The rowid */
5521   sqlite3_int64 iValue;      /* Current value ("value") */
5522   sqlite3_int64 mnValue;     /* Mimimum value ("start") */
5523   sqlite3_int64 mxValue;     /* Maximum value ("stop") */
5524   sqlite3_int64 iStep;       /* Increment ("step") */
5525 };
5526 
5527 /*
5528 ** The seriesConnect() method is invoked to create a new
5529 ** series_vtab that describes the generate_series virtual table.
5530 **
5531 ** Think of this routine as the constructor for series_vtab objects.
5532 **
5533 ** All this routine needs to do is:
5534 **
5535 **    (1) Allocate the series_vtab object and initialize all fields.
5536 **
5537 **    (2) Tell SQLite (via the sqlite3_declare_vtab() interface) what the
5538 **        result set of queries against generate_series will look like.
5539 */
5540 static int seriesConnect(
5541   sqlite3 *db,
5542   void *pUnused,
5543   int argcUnused, const char *const*argvUnused,
5544   sqlite3_vtab **ppVtab,
5545   char **pzErrUnused
5546 ){
5547   sqlite3_vtab *pNew;
5548   int rc;
5549 
5550 /* Column numbers */
5551 #define SERIES_COLUMN_VALUE 0
5552 #define SERIES_COLUMN_START 1
5553 #define SERIES_COLUMN_STOP  2
5554 #define SERIES_COLUMN_STEP  3
5555 
5556   (void)pUnused;
5557   (void)argcUnused;
5558   (void)argvUnused;
5559   (void)pzErrUnused;
5560   rc = sqlite3_declare_vtab(db,
5561      "CREATE TABLE x(value,start hidden,stop hidden,step hidden)");
5562   if( rc==SQLITE_OK ){
5563     pNew = *ppVtab = sqlite3_malloc( sizeof(*pNew) );
5564     if( pNew==0 ) return SQLITE_NOMEM;
5565     memset(pNew, 0, sizeof(*pNew));
5566     sqlite3_vtab_config(db, SQLITE_VTAB_INNOCUOUS);
5567   }
5568   return rc;
5569 }
5570 
5571 /*
5572 ** This method is the destructor for series_cursor objects.
5573 */
5574 static int seriesDisconnect(sqlite3_vtab *pVtab){
5575   sqlite3_free(pVtab);
5576   return SQLITE_OK;
5577 }
5578 
5579 /*
5580 ** Constructor for a new series_cursor object.
5581 */
5582 static int seriesOpen(sqlite3_vtab *pUnused, sqlite3_vtab_cursor **ppCursor){
5583   series_cursor *pCur;
5584   (void)pUnused;
5585   pCur = sqlite3_malloc( sizeof(*pCur) );
5586   if( pCur==0 ) return SQLITE_NOMEM;
5587   memset(pCur, 0, sizeof(*pCur));
5588   *ppCursor = &pCur->base;
5589   return SQLITE_OK;
5590 }
5591 
5592 /*
5593 ** Destructor for a series_cursor.
5594 */
5595 static int seriesClose(sqlite3_vtab_cursor *cur){
5596   sqlite3_free(cur);
5597   return SQLITE_OK;
5598 }
5599 
5600 
5601 /*
5602 ** Advance a series_cursor to its next row of output.
5603 */
5604 static int seriesNext(sqlite3_vtab_cursor *cur){
5605   series_cursor *pCur = (series_cursor*)cur;
5606   if( pCur->isDesc ){
5607     pCur->iValue -= pCur->iStep;
5608   }else{
5609     pCur->iValue += pCur->iStep;
5610   }
5611   pCur->iRowid++;
5612   return SQLITE_OK;
5613 }
5614 
5615 /*
5616 ** Return values of columns for the row at which the series_cursor
5617 ** is currently pointing.
5618 */
5619 static int seriesColumn(
5620   sqlite3_vtab_cursor *cur,   /* The cursor */
5621   sqlite3_context *ctx,       /* First argument to sqlite3_result_...() */
5622   int i                       /* Which column to return */
5623 ){
5624   series_cursor *pCur = (series_cursor*)cur;
5625   sqlite3_int64 x = 0;
5626   switch( i ){
5627     case SERIES_COLUMN_START:  x = pCur->mnValue; break;
5628     case SERIES_COLUMN_STOP:   x = pCur->mxValue; break;
5629     case SERIES_COLUMN_STEP:   x = pCur->iStep;   break;
5630     default:                   x = pCur->iValue;  break;
5631   }
5632   sqlite3_result_int64(ctx, x);
5633   return SQLITE_OK;
5634 }
5635 
5636 /*
5637 ** Return the rowid for the current row. In this implementation, the
5638 ** first row returned is assigned rowid value 1, and each subsequent
5639 ** row a value 1 more than that of the previous.
5640 */
5641 static int seriesRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
5642   series_cursor *pCur = (series_cursor*)cur;
5643   *pRowid = pCur->iRowid;
5644   return SQLITE_OK;
5645 }
5646 
5647 /*
5648 ** Return TRUE if the cursor has been moved off of the last
5649 ** row of output.
5650 */
5651 static int seriesEof(sqlite3_vtab_cursor *cur){
5652   series_cursor *pCur = (series_cursor*)cur;
5653   if( pCur->isDesc ){
5654     return pCur->iValue < pCur->mnValue;
5655   }else{
5656     return pCur->iValue > pCur->mxValue;
5657   }
5658 }
5659 
5660 /* True to cause run-time checking of the start=, stop=, and/or step=
5661 ** parameters.  The only reason to do this is for testing the
5662 ** constraint checking logic for virtual tables in the SQLite core.
5663 */
5664 #ifndef SQLITE_SERIES_CONSTRAINT_VERIFY
5665 # define SQLITE_SERIES_CONSTRAINT_VERIFY 0
5666 #endif
5667 
5668 /*
5669 ** This method is called to "rewind" the series_cursor object back
5670 ** to the first row of output.  This method is always called at least
5671 ** once prior to any call to seriesColumn() or seriesRowid() or
5672 ** seriesEof().
5673 **
5674 ** The query plan selected by seriesBestIndex is passed in the idxNum
5675 ** parameter.  (idxStr is not used in this implementation.)  idxNum
5676 ** is a bitmask showing which constraints are available:
5677 **
5678 **    1:    start=VALUE
5679 **    2:    stop=VALUE
5680 **    4:    step=VALUE
5681 **
5682 ** Also, if bit 8 is set, that means that the series should be output
5683 ** in descending order rather than in ascending order.  If bit 16 is
5684 ** set, then output must appear in ascending order.
5685 **
5686 ** This routine should initialize the cursor and position it so that it
5687 ** is pointing at the first row, or pointing off the end of the table
5688 ** (so that seriesEof() will return true) if the table is empty.
5689 */
5690 static int seriesFilter(
5691   sqlite3_vtab_cursor *pVtabCursor,
5692   int idxNum, const char *idxStrUnused,
5693   int argc, sqlite3_value **argv
5694 ){
5695   series_cursor *pCur = (series_cursor *)pVtabCursor;
5696   int i = 0;
5697   (void)idxStrUnused;
5698   if( idxNum & 1 ){
5699     pCur->mnValue = sqlite3_value_int64(argv[i++]);
5700   }else{
5701     pCur->mnValue = 0;
5702   }
5703   if( idxNum & 2 ){
5704     pCur->mxValue = sqlite3_value_int64(argv[i++]);
5705   }else{
5706     pCur->mxValue = 0xffffffff;
5707   }
5708   if( idxNum & 4 ){
5709     pCur->iStep = sqlite3_value_int64(argv[i++]);
5710     if( pCur->iStep==0 ){
5711       pCur->iStep = 1;
5712     }else if( pCur->iStep<0 ){
5713       pCur->iStep = -pCur->iStep;
5714       if( (idxNum & 16)==0 ) idxNum |= 8;
5715     }
5716   }else{
5717     pCur->iStep = 1;
5718   }
5719   for(i=0; i<argc; i++){
5720     if( sqlite3_value_type(argv[i])==SQLITE_NULL ){
5721       /* If any of the constraints have a NULL value, then return no rows.
5722       ** See ticket https://www.sqlite.org/src/info/fac496b61722daf2 */
5723       pCur->mnValue = 1;
5724       pCur->mxValue = 0;
5725       break;
5726     }
5727   }
5728   if( idxNum & 8 ){
5729     pCur->isDesc = 1;
5730     pCur->iValue = pCur->mxValue;
5731     if( pCur->iStep>0 ){
5732       pCur->iValue -= (pCur->mxValue - pCur->mnValue)%pCur->iStep;
5733     }
5734   }else{
5735     pCur->isDesc = 0;
5736     pCur->iValue = pCur->mnValue;
5737   }
5738   pCur->iRowid = 1;
5739   return SQLITE_OK;
5740 }
5741 
5742 /*
5743 ** SQLite will invoke this method one or more times while planning a query
5744 ** that uses the generate_series virtual table.  This routine needs to create
5745 ** a query plan for each invocation and compute an estimated cost for that
5746 ** plan.
5747 **
5748 ** In this implementation idxNum is used to represent the
5749 ** query plan.  idxStr is unused.
5750 **
5751 ** The query plan is represented by bits in idxNum:
5752 **
5753 **  (1)  start = $value  -- constraint exists
5754 **  (2)  stop = $value   -- constraint exists
5755 **  (4)  step = $value   -- constraint exists
5756 **  (8)  output in descending order
5757 */
5758 static int seriesBestIndex(
5759   sqlite3_vtab *tabUnused,
5760   sqlite3_index_info *pIdxInfo
5761 ){
5762   int i, j;              /* Loop over constraints */
5763   int idxNum = 0;        /* The query plan bitmask */
5764   int unusableMask = 0;  /* Mask of unusable constraints */
5765   int nArg = 0;          /* Number of arguments that seriesFilter() expects */
5766   int aIdx[3];           /* Constraints on start, stop, and step */
5767   const struct sqlite3_index_constraint *pConstraint;
5768 
5769   /* This implementation assumes that the start, stop, and step columns
5770   ** are the last three columns in the virtual table. */
5771   assert( SERIES_COLUMN_STOP == SERIES_COLUMN_START+1 );
5772   assert( SERIES_COLUMN_STEP == SERIES_COLUMN_START+2 );
5773   (void)tabUnused;
5774   aIdx[0] = aIdx[1] = aIdx[2] = -1;
5775   pConstraint = pIdxInfo->aConstraint;
5776   for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){
5777     int iCol;    /* 0 for start, 1 for stop, 2 for step */
5778     int iMask;   /* bitmask for those column */
5779     if( pConstraint->iColumn<SERIES_COLUMN_START ) continue;
5780     iCol = pConstraint->iColumn - SERIES_COLUMN_START;
5781     assert( iCol>=0 && iCol<=2 );
5782     iMask = 1 << iCol;
5783     if( pConstraint->usable==0 ){
5784       unusableMask |=  iMask;
5785       continue;
5786     }else if( pConstraint->op==SQLITE_INDEX_CONSTRAINT_EQ ){
5787       idxNum |= iMask;
5788       aIdx[iCol] = i;
5789     }
5790   }
5791   for(i=0; i<3; i++){
5792     if( (j = aIdx[i])>=0 ){
5793       pIdxInfo->aConstraintUsage[j].argvIndex = ++nArg;
5794       pIdxInfo->aConstraintUsage[j].omit = !SQLITE_SERIES_CONSTRAINT_VERIFY;
5795     }
5796   }
5797   if( (unusableMask & ~idxNum)!=0 ){
5798     /* The start, stop, and step columns are inputs.  Therefore if there
5799     ** are unusable constraints on any of start, stop, or step then
5800     ** this plan is unusable */
5801     return SQLITE_CONSTRAINT;
5802   }
5803   if( (idxNum & 3)==3 ){
5804     /* Both start= and stop= boundaries are available.  This is the
5805     ** the preferred case */
5806     pIdxInfo->estimatedCost = (double)(2 - ((idxNum&4)!=0));
5807     pIdxInfo->estimatedRows = 1000;
5808     if( pIdxInfo->nOrderBy==1 ){
5809       if( pIdxInfo->aOrderBy[0].desc ){
5810         idxNum |= 8;
5811       }else{
5812         idxNum |= 16;
5813       }
5814       pIdxInfo->orderByConsumed = 1;
5815     }
5816   }else{
5817     /* If either boundary is missing, we have to generate a huge span
5818     ** of numbers.  Make this case very expensive so that the query
5819     ** planner will work hard to avoid it. */
5820     pIdxInfo->estimatedRows = 2147483647;
5821   }
5822   pIdxInfo->idxNum = idxNum;
5823   return SQLITE_OK;
5824 }
5825 
5826 /*
5827 ** This following structure defines all the methods for the
5828 ** generate_series virtual table.
5829 */
5830 static sqlite3_module seriesModule = {
5831   0,                         /* iVersion */
5832   0,                         /* xCreate */
5833   seriesConnect,             /* xConnect */
5834   seriesBestIndex,           /* xBestIndex */
5835   seriesDisconnect,          /* xDisconnect */
5836   0,                         /* xDestroy */
5837   seriesOpen,                /* xOpen - open a cursor */
5838   seriesClose,               /* xClose - close a cursor */
5839   seriesFilter,              /* xFilter - configure scan constraints */
5840   seriesNext,                /* xNext - advance a cursor */
5841   seriesEof,                 /* xEof - check for end of scan */
5842   seriesColumn,              /* xColumn - read data */
5843   seriesRowid,               /* xRowid - read data */
5844   0,                         /* xUpdate */
5845   0,                         /* xBegin */
5846   0,                         /* xSync */
5847   0,                         /* xCommit */
5848   0,                         /* xRollback */
5849   0,                         /* xFindMethod */
5850   0,                         /* xRename */
5851   0,                         /* xSavepoint */
5852   0,                         /* xRelease */
5853   0,                         /* xRollbackTo */
5854   0                          /* xShadowName */
5855 };
5856 
5857 #endif /* SQLITE_OMIT_VIRTUALTABLE */
5858 
5859 #ifdef _WIN32
5860 
5861 #endif
5862 int sqlite3_series_init(
5863   sqlite3 *db,
5864   char **pzErrMsg,
5865   const sqlite3_api_routines *pApi
5866 ){
5867   int rc = SQLITE_OK;
5868   SQLITE_EXTENSION_INIT2(pApi);
5869 #ifndef SQLITE_OMIT_VIRTUALTABLE
5870   if( sqlite3_libversion_number()<3008012 ){
5871     *pzErrMsg = sqlite3_mprintf(
5872         "generate_series() requires SQLite 3.8.12 or later");
5873     return SQLITE_ERROR;
5874   }
5875   rc = sqlite3_create_module(db, "generate_series", &seriesModule, 0);
5876 #endif
5877   return rc;
5878 }
5879 
5880 /************************* End ../ext/misc/series.c ********************/
5881 #ifdef SQLITE_HAVE_ZLIB
5882 /************************* Begin ../ext/misc/zipfile.c ******************/
5883 /*
5884 ** 2017-12-26
5885 **
5886 ** The author disclaims copyright to this source code.  In place of
5887 ** a legal notice, here is a blessing:
5888 **
5889 **    May you do good and not evil.
5890 **    May you find forgiveness for yourself and forgive others.
5891 **    May you share freely, never taking more than you give.
5892 **
5893 ******************************************************************************
5894 **
5895 ** This file implements a virtual table for reading and writing ZIP archive
5896 ** files.
5897 **
5898 ** Usage example:
5899 **
5900 **     SELECT name, sz, datetime(mtime,'unixepoch') FROM zipfile($filename);
5901 **
5902 ** Current limitations:
5903 **
5904 **    *  No support for encryption
5905 **    *  No support for ZIP archives spanning multiple files
5906 **    *  No support for zip64 extensions
5907 **    *  Only the "inflate/deflate" (zlib) compression method is supported
5908 */
5909 /* #include "sqlite3ext.h" */
5910 SQLITE_EXTENSION_INIT1
5911 #include <stdio.h>
5912 #include <string.h>
5913 #include <assert.h>
5914 
5915 #include <zlib.h>
5916 
5917 #ifndef SQLITE_OMIT_VIRTUALTABLE
5918 
5919 #ifndef SQLITE_AMALGAMATION
5920 
5921 /* typedef sqlite3_int64 i64; */
5922 /* typedef unsigned char u8; */
5923 typedef unsigned short u16;
5924 typedef unsigned long u32;
5925 #define MIN(a,b) ((a)<(b) ? (a) : (b))
5926 
5927 #if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST)
5928 # define ALWAYS(X)      (1)
5929 # define NEVER(X)       (0)
5930 #elif !defined(NDEBUG)
5931 # define ALWAYS(X)      ((X)?1:(assert(0),0))
5932 # define NEVER(X)       ((X)?(assert(0),1):0)
5933 #else
5934 # define ALWAYS(X)      (X)
5935 # define NEVER(X)       (X)
5936 #endif
5937 
5938 #endif   /* SQLITE_AMALGAMATION */
5939 
5940 /*
5941 ** Definitions for mode bitmasks S_IFDIR, S_IFREG and S_IFLNK.
5942 **
5943 ** In some ways it would be better to obtain these values from system
5944 ** header files. But, the dependency is undesirable and (a) these
5945 ** have been stable for decades, (b) the values are part of POSIX and
5946 ** are also made explicit in [man stat], and (c) are part of the
5947 ** file format for zip archives.
5948 */
5949 #ifndef S_IFDIR
5950 # define S_IFDIR 0040000
5951 #endif
5952 #ifndef S_IFREG
5953 # define S_IFREG 0100000
5954 #endif
5955 #ifndef S_IFLNK
5956 # define S_IFLNK 0120000
5957 #endif
5958 
5959 static const char ZIPFILE_SCHEMA[] =
5960   "CREATE TABLE y("
5961     "name PRIMARY KEY,"  /* 0: Name of file in zip archive */
5962     "mode,"              /* 1: POSIX mode for file */
5963     "mtime,"             /* 2: Last modification time (secs since 1970)*/
5964     "sz,"                /* 3: Size of object */
5965     "rawdata,"           /* 4: Raw data */
5966     "data,"              /* 5: Uncompressed data */
5967     "method,"            /* 6: Compression method (integer) */
5968     "z HIDDEN"           /* 7: Name of zip file */
5969   ") WITHOUT ROWID;";
5970 
5971 #define ZIPFILE_F_COLUMN_IDX 7    /* Index of column "file" in the above */
5972 #define ZIPFILE_BUFFER_SIZE (64*1024)
5973 
5974 
5975 /*
5976 ** Magic numbers used to read and write zip files.
5977 **
5978 ** ZIPFILE_NEWENTRY_MADEBY:
5979 **   Use this value for the "version-made-by" field in new zip file
5980 **   entries. The upper byte indicates "unix", and the lower byte
5981 **   indicates that the zip file matches pkzip specification 3.0.
5982 **   This is what info-zip seems to do.
5983 **
5984 ** ZIPFILE_NEWENTRY_REQUIRED:
5985 **   Value for "version-required-to-extract" field of new entries.
5986 **   Version 2.0 is required to support folders and deflate compression.
5987 **
5988 ** ZIPFILE_NEWENTRY_FLAGS:
5989 **   Value for "general-purpose-bit-flags" field of new entries. Bit
5990 **   11 means "utf-8 filename and comment".
5991 **
5992 ** ZIPFILE_SIGNATURE_CDS:
5993 **   First 4 bytes of a valid CDS record.
5994 **
5995 ** ZIPFILE_SIGNATURE_LFH:
5996 **   First 4 bytes of a valid LFH record.
5997 **
5998 ** ZIPFILE_SIGNATURE_EOCD
5999 **   First 4 bytes of a valid EOCD record.
6000 */
6001 #define ZIPFILE_EXTRA_TIMESTAMP   0x5455
6002 #define ZIPFILE_NEWENTRY_MADEBY   ((3<<8) + 30)
6003 #define ZIPFILE_NEWENTRY_REQUIRED 20
6004 #define ZIPFILE_NEWENTRY_FLAGS    0x800
6005 #define ZIPFILE_SIGNATURE_CDS     0x02014b50
6006 #define ZIPFILE_SIGNATURE_LFH     0x04034b50
6007 #define ZIPFILE_SIGNATURE_EOCD    0x06054b50
6008 
6009 /*
6010 ** The sizes of the fixed-size part of each of the three main data
6011 ** structures in a zip archive.
6012 */
6013 #define ZIPFILE_LFH_FIXED_SZ      30
6014 #define ZIPFILE_EOCD_FIXED_SZ     22
6015 #define ZIPFILE_CDS_FIXED_SZ      46
6016 
6017 /*
6018 *** 4.3.16  End of central directory record:
6019 ***
6020 ***   end of central dir signature    4 bytes  (0x06054b50)
6021 ***   number of this disk             2 bytes
6022 ***   number of the disk with the
6023 ***   start of the central directory  2 bytes
6024 ***   total number of entries in the
6025 ***   central directory on this disk  2 bytes
6026 ***   total number of entries in
6027 ***   the central directory           2 bytes
6028 ***   size of the central directory   4 bytes
6029 ***   offset of start of central
6030 ***   directory with respect to
6031 ***   the starting disk number        4 bytes
6032 ***   .ZIP file comment length        2 bytes
6033 ***   .ZIP file comment       (variable size)
6034 */
6035 typedef struct ZipfileEOCD ZipfileEOCD;
6036 struct ZipfileEOCD {
6037   u16 iDisk;
6038   u16 iFirstDisk;
6039   u16 nEntry;
6040   u16 nEntryTotal;
6041   u32 nSize;
6042   u32 iOffset;
6043 };
6044 
6045 /*
6046 *** 4.3.12  Central directory structure:
6047 ***
6048 *** ...
6049 ***
6050 ***   central file header signature   4 bytes  (0x02014b50)
6051 ***   version made by                 2 bytes
6052 ***   version needed to extract       2 bytes
6053 ***   general purpose bit flag        2 bytes
6054 ***   compression method              2 bytes
6055 ***   last mod file time              2 bytes
6056 ***   last mod file date              2 bytes
6057 ***   crc-32                          4 bytes
6058 ***   compressed size                 4 bytes
6059 ***   uncompressed size               4 bytes
6060 ***   file name length                2 bytes
6061 ***   extra field length              2 bytes
6062 ***   file comment length             2 bytes
6063 ***   disk number start               2 bytes
6064 ***   internal file attributes        2 bytes
6065 ***   external file attributes        4 bytes
6066 ***   relative offset of local header 4 bytes
6067 */
6068 typedef struct ZipfileCDS ZipfileCDS;
6069 struct ZipfileCDS {
6070   u16 iVersionMadeBy;
6071   u16 iVersionExtract;
6072   u16 flags;
6073   u16 iCompression;
6074   u16 mTime;
6075   u16 mDate;
6076   u32 crc32;
6077   u32 szCompressed;
6078   u32 szUncompressed;
6079   u16 nFile;
6080   u16 nExtra;
6081   u16 nComment;
6082   u16 iDiskStart;
6083   u16 iInternalAttr;
6084   u32 iExternalAttr;
6085   u32 iOffset;
6086   char *zFile;                    /* Filename (sqlite3_malloc()) */
6087 };
6088 
6089 /*
6090 *** 4.3.7  Local file header:
6091 ***
6092 ***   local file header signature     4 bytes  (0x04034b50)
6093 ***   version needed to extract       2 bytes
6094 ***   general purpose bit flag        2 bytes
6095 ***   compression method              2 bytes
6096 ***   last mod file time              2 bytes
6097 ***   last mod file date              2 bytes
6098 ***   crc-32                          4 bytes
6099 ***   compressed size                 4 bytes
6100 ***   uncompressed size               4 bytes
6101 ***   file name length                2 bytes
6102 ***   extra field length              2 bytes
6103 ***
6104 */
6105 typedef struct ZipfileLFH ZipfileLFH;
6106 struct ZipfileLFH {
6107   u16 iVersionExtract;
6108   u16 flags;
6109   u16 iCompression;
6110   u16 mTime;
6111   u16 mDate;
6112   u32 crc32;
6113   u32 szCompressed;
6114   u32 szUncompressed;
6115   u16 nFile;
6116   u16 nExtra;
6117 };
6118 
6119 typedef struct ZipfileEntry ZipfileEntry;
6120 struct ZipfileEntry {
6121   ZipfileCDS cds;            /* Parsed CDS record */
6122   u32 mUnixTime;             /* Modification time, in UNIX format */
6123   u8 *aExtra;                /* cds.nExtra+cds.nComment bytes of extra data */
6124   i64 iDataOff;              /* Offset to data in file (if aData==0) */
6125   u8 *aData;                 /* cds.szCompressed bytes of compressed data */
6126   ZipfileEntry *pNext;       /* Next element in in-memory CDS */
6127 };
6128 
6129 /*
6130 ** Cursor type for zipfile tables.
6131 */
6132 typedef struct ZipfileCsr ZipfileCsr;
6133 struct ZipfileCsr {
6134   sqlite3_vtab_cursor base;  /* Base class - must be first */
6135   i64 iId;                   /* Cursor ID */
6136   u8 bEof;                   /* True when at EOF */
6137   u8 bNoop;                  /* If next xNext() call is no-op */
6138 
6139   /* Used outside of write transactions */
6140   FILE *pFile;               /* Zip file */
6141   i64 iNextOff;              /* Offset of next record in central directory */
6142   ZipfileEOCD eocd;          /* Parse of central directory record */
6143 
6144   ZipfileEntry *pFreeEntry;  /* Free this list when cursor is closed or reset */
6145   ZipfileEntry *pCurrent;    /* Current entry */
6146   ZipfileCsr *pCsrNext;      /* Next cursor on same virtual table */
6147 };
6148 
6149 typedef struct ZipfileTab ZipfileTab;
6150 struct ZipfileTab {
6151   sqlite3_vtab base;         /* Base class - must be first */
6152   char *zFile;               /* Zip file this table accesses (may be NULL) */
6153   sqlite3 *db;               /* Host database connection */
6154   u8 *aBuffer;               /* Temporary buffer used for various tasks */
6155 
6156   ZipfileCsr *pCsrList;      /* List of cursors */
6157   i64 iNextCsrid;
6158 
6159   /* The following are used by write transactions only */
6160   ZipfileEntry *pFirstEntry; /* Linked list of all files (if pWriteFd!=0) */
6161   ZipfileEntry *pLastEntry;  /* Last element in pFirstEntry list */
6162   FILE *pWriteFd;            /* File handle open on zip archive */
6163   i64 szCurrent;             /* Current size of zip archive */
6164   i64 szOrig;                /* Size of archive at start of transaction */
6165 };
6166 
6167 /*
6168 ** Set the error message contained in context ctx to the results of
6169 ** vprintf(zFmt, ...).
6170 */
6171 static void zipfileCtxErrorMsg(sqlite3_context *ctx, const char *zFmt, ...){
6172   char *zMsg = 0;
6173   va_list ap;
6174   va_start(ap, zFmt);
6175   zMsg = sqlite3_vmprintf(zFmt, ap);
6176   sqlite3_result_error(ctx, zMsg, -1);
6177   sqlite3_free(zMsg);
6178   va_end(ap);
6179 }
6180 
6181 /*
6182 ** If string zIn is quoted, dequote it in place. Otherwise, if the string
6183 ** is not quoted, do nothing.
6184 */
6185 static void zipfileDequote(char *zIn){
6186   char q = zIn[0];
6187   if( q=='"' || q=='\'' || q=='`' || q=='[' ){
6188     int iIn = 1;
6189     int iOut = 0;
6190     if( q=='[' ) q = ']';
6191     while( ALWAYS(zIn[iIn]) ){
6192       char c = zIn[iIn++];
6193       if( c==q && zIn[iIn++]!=q ) break;
6194       zIn[iOut++] = c;
6195     }
6196     zIn[iOut] = '\0';
6197   }
6198 }
6199 
6200 /*
6201 ** Construct a new ZipfileTab virtual table object.
6202 **
6203 **   argv[0]   -> module name  ("zipfile")
6204 **   argv[1]   -> database name
6205 **   argv[2]   -> table name
6206 **   argv[...] -> "column name" and other module argument fields.
6207 */
6208 static int zipfileConnect(
6209   sqlite3 *db,
6210   void *pAux,
6211   int argc, const char *const*argv,
6212   sqlite3_vtab **ppVtab,
6213   char **pzErr
6214 ){
6215   int nByte = sizeof(ZipfileTab) + ZIPFILE_BUFFER_SIZE;
6216   int nFile = 0;
6217   const char *zFile = 0;
6218   ZipfileTab *pNew = 0;
6219   int rc;
6220 
6221   /* If the table name is not "zipfile", require that the argument be
6222   ** specified. This stops zipfile tables from being created as:
6223   **
6224   **   CREATE VIRTUAL TABLE zzz USING zipfile();
6225   **
6226   ** It does not prevent:
6227   **
6228   **   CREATE VIRTUAL TABLE zipfile USING zipfile();
6229   */
6230   assert( 0==sqlite3_stricmp(argv[0], "zipfile") );
6231   if( (0!=sqlite3_stricmp(argv[2], "zipfile") && argc<4) || argc>4 ){
6232     *pzErr = sqlite3_mprintf("zipfile constructor requires one argument");
6233     return SQLITE_ERROR;
6234   }
6235 
6236   if( argc>3 ){
6237     zFile = argv[3];
6238     nFile = (int)strlen(zFile)+1;
6239   }
6240 
6241   rc = sqlite3_declare_vtab(db, ZIPFILE_SCHEMA);
6242   if( rc==SQLITE_OK ){
6243     pNew = (ZipfileTab*)sqlite3_malloc64((sqlite3_int64)nByte+nFile);
6244     if( pNew==0 ) return SQLITE_NOMEM;
6245     memset(pNew, 0, nByte+nFile);
6246     pNew->db = db;
6247     pNew->aBuffer = (u8*)&pNew[1];
6248     if( zFile ){
6249       pNew->zFile = (char*)&pNew->aBuffer[ZIPFILE_BUFFER_SIZE];
6250       memcpy(pNew->zFile, zFile, nFile);
6251       zipfileDequote(pNew->zFile);
6252     }
6253   }
6254   sqlite3_vtab_config(db, SQLITE_VTAB_DIRECTONLY);
6255   *ppVtab = (sqlite3_vtab*)pNew;
6256   return rc;
6257 }
6258 
6259 /*
6260 ** Free the ZipfileEntry structure indicated by the only argument.
6261 */
6262 static void zipfileEntryFree(ZipfileEntry *p){
6263   if( p ){
6264     sqlite3_free(p->cds.zFile);
6265     sqlite3_free(p);
6266   }
6267 }
6268 
6269 /*
6270 ** Release resources that should be freed at the end of a write
6271 ** transaction.
6272 */
6273 static void zipfileCleanupTransaction(ZipfileTab *pTab){
6274   ZipfileEntry *pEntry;
6275   ZipfileEntry *pNext;
6276 
6277   if( pTab->pWriteFd ){
6278     fclose(pTab->pWriteFd);
6279     pTab->pWriteFd = 0;
6280   }
6281   for(pEntry=pTab->pFirstEntry; pEntry; pEntry=pNext){
6282     pNext = pEntry->pNext;
6283     zipfileEntryFree(pEntry);
6284   }
6285   pTab->pFirstEntry = 0;
6286   pTab->pLastEntry = 0;
6287   pTab->szCurrent = 0;
6288   pTab->szOrig = 0;
6289 }
6290 
6291 /*
6292 ** This method is the destructor for zipfile vtab objects.
6293 */
6294 static int zipfileDisconnect(sqlite3_vtab *pVtab){
6295   zipfileCleanupTransaction((ZipfileTab*)pVtab);
6296   sqlite3_free(pVtab);
6297   return SQLITE_OK;
6298 }
6299 
6300 /*
6301 ** Constructor for a new ZipfileCsr object.
6302 */
6303 static int zipfileOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCsr){
6304   ZipfileTab *pTab = (ZipfileTab*)p;
6305   ZipfileCsr *pCsr;
6306   pCsr = sqlite3_malloc(sizeof(*pCsr));
6307   *ppCsr = (sqlite3_vtab_cursor*)pCsr;
6308   if( pCsr==0 ){
6309     return SQLITE_NOMEM;
6310   }
6311   memset(pCsr, 0, sizeof(*pCsr));
6312   pCsr->iId = ++pTab->iNextCsrid;
6313   pCsr->pCsrNext = pTab->pCsrList;
6314   pTab->pCsrList = pCsr;
6315   return SQLITE_OK;
6316 }
6317 
6318 /*
6319 ** Reset a cursor back to the state it was in when first returned
6320 ** by zipfileOpen().
6321 */
6322 static void zipfileResetCursor(ZipfileCsr *pCsr){
6323   ZipfileEntry *p;
6324   ZipfileEntry *pNext;
6325 
6326   pCsr->bEof = 0;
6327   if( pCsr->pFile ){
6328     fclose(pCsr->pFile);
6329     pCsr->pFile = 0;
6330     zipfileEntryFree(pCsr->pCurrent);
6331     pCsr->pCurrent = 0;
6332   }
6333 
6334   for(p=pCsr->pFreeEntry; p; p=pNext){
6335     pNext = p->pNext;
6336     zipfileEntryFree(p);
6337   }
6338 }
6339 
6340 /*
6341 ** Destructor for an ZipfileCsr.
6342 */
6343 static int zipfileClose(sqlite3_vtab_cursor *cur){
6344   ZipfileCsr *pCsr = (ZipfileCsr*)cur;
6345   ZipfileTab *pTab = (ZipfileTab*)(pCsr->base.pVtab);
6346   ZipfileCsr **pp;
6347   zipfileResetCursor(pCsr);
6348 
6349   /* Remove this cursor from the ZipfileTab.pCsrList list. */
6350   for(pp=&pTab->pCsrList; *pp!=pCsr; pp=&((*pp)->pCsrNext));
6351   *pp = pCsr->pCsrNext;
6352 
6353   sqlite3_free(pCsr);
6354   return SQLITE_OK;
6355 }
6356 
6357 /*
6358 ** Set the error message for the virtual table associated with cursor
6359 ** pCsr to the results of vprintf(zFmt, ...).
6360 */
6361 static void zipfileTableErr(ZipfileTab *pTab, const char *zFmt, ...){
6362   va_list ap;
6363   va_start(ap, zFmt);
6364   sqlite3_free(pTab->base.zErrMsg);
6365   pTab->base.zErrMsg = sqlite3_vmprintf(zFmt, ap);
6366   va_end(ap);
6367 }
6368 static void zipfileCursorErr(ZipfileCsr *pCsr, const char *zFmt, ...){
6369   va_list ap;
6370   va_start(ap, zFmt);
6371   sqlite3_free(pCsr->base.pVtab->zErrMsg);
6372   pCsr->base.pVtab->zErrMsg = sqlite3_vmprintf(zFmt, ap);
6373   va_end(ap);
6374 }
6375 
6376 /*
6377 ** Read nRead bytes of data from offset iOff of file pFile into buffer
6378 ** aRead[]. Return SQLITE_OK if successful, or an SQLite error code
6379 ** otherwise.
6380 **
6381 ** If an error does occur, output variable (*pzErrmsg) may be set to point
6382 ** to an English language error message. It is the responsibility of the
6383 ** caller to eventually free this buffer using
6384 ** sqlite3_free().
6385 */
6386 static int zipfileReadData(
6387   FILE *pFile,                    /* Read from this file */
6388   u8 *aRead,                      /* Read into this buffer */
6389   int nRead,                      /* Number of bytes to read */
6390   i64 iOff,                       /* Offset to read from */
6391   char **pzErrmsg                 /* OUT: Error message (from sqlite3_malloc) */
6392 ){
6393   size_t n;
6394   fseek(pFile, (long)iOff, SEEK_SET);
6395   n = fread(aRead, 1, nRead, pFile);
6396   if( (int)n!=nRead ){
6397     *pzErrmsg = sqlite3_mprintf("error in fread()");
6398     return SQLITE_ERROR;
6399   }
6400   return SQLITE_OK;
6401 }
6402 
6403 static int zipfileAppendData(
6404   ZipfileTab *pTab,
6405   const u8 *aWrite,
6406   int nWrite
6407 ){
6408   if( nWrite>0 ){
6409     size_t n = nWrite;
6410     fseek(pTab->pWriteFd, (long)pTab->szCurrent, SEEK_SET);
6411     n = fwrite(aWrite, 1, nWrite, pTab->pWriteFd);
6412     if( (int)n!=nWrite ){
6413       pTab->base.zErrMsg = sqlite3_mprintf("error in fwrite()");
6414       return SQLITE_ERROR;
6415     }
6416     pTab->szCurrent += nWrite;
6417   }
6418   return SQLITE_OK;
6419 }
6420 
6421 /*
6422 ** Read and return a 16-bit little-endian unsigned integer from buffer aBuf.
6423 */
6424 static u16 zipfileGetU16(const u8 *aBuf){
6425   return (aBuf[1] << 8) + aBuf[0];
6426 }
6427 
6428 /*
6429 ** Read and return a 32-bit little-endian unsigned integer from buffer aBuf.
6430 */
6431 static u32 zipfileGetU32(const u8 *aBuf){
6432   return ((u32)(aBuf[3]) << 24)
6433        + ((u32)(aBuf[2]) << 16)
6434        + ((u32)(aBuf[1]) <<  8)
6435        + ((u32)(aBuf[0]) <<  0);
6436 }
6437 
6438 /*
6439 ** Write a 16-bit little endiate integer into buffer aBuf.
6440 */
6441 static void zipfilePutU16(u8 *aBuf, u16 val){
6442   aBuf[0] = val & 0xFF;
6443   aBuf[1] = (val>>8) & 0xFF;
6444 }
6445 
6446 /*
6447 ** Write a 32-bit little endiate integer into buffer aBuf.
6448 */
6449 static void zipfilePutU32(u8 *aBuf, u32 val){
6450   aBuf[0] = val & 0xFF;
6451   aBuf[1] = (val>>8) & 0xFF;
6452   aBuf[2] = (val>>16) & 0xFF;
6453   aBuf[3] = (val>>24) & 0xFF;
6454 }
6455 
6456 #define zipfileRead32(aBuf) ( aBuf+=4, zipfileGetU32(aBuf-4) )
6457 #define zipfileRead16(aBuf) ( aBuf+=2, zipfileGetU16(aBuf-2) )
6458 
6459 #define zipfileWrite32(aBuf,val) { zipfilePutU32(aBuf,val); aBuf+=4; }
6460 #define zipfileWrite16(aBuf,val) { zipfilePutU16(aBuf,val); aBuf+=2; }
6461 
6462 /*
6463 ** Magic numbers used to read CDS records.
6464 */
6465 #define ZIPFILE_CDS_NFILE_OFF        28
6466 #define ZIPFILE_CDS_SZCOMPRESSED_OFF 20
6467 
6468 /*
6469 ** Decode the CDS record in buffer aBuf into (*pCDS). Return SQLITE_ERROR
6470 ** if the record is not well-formed, or SQLITE_OK otherwise.
6471 */
6472 static int zipfileReadCDS(u8 *aBuf, ZipfileCDS *pCDS){
6473   u8 *aRead = aBuf;
6474   u32 sig = zipfileRead32(aRead);
6475   int rc = SQLITE_OK;
6476   if( sig!=ZIPFILE_SIGNATURE_CDS ){
6477     rc = SQLITE_ERROR;
6478   }else{
6479     pCDS->iVersionMadeBy = zipfileRead16(aRead);
6480     pCDS->iVersionExtract = zipfileRead16(aRead);
6481     pCDS->flags = zipfileRead16(aRead);
6482     pCDS->iCompression = zipfileRead16(aRead);
6483     pCDS->mTime = zipfileRead16(aRead);
6484     pCDS->mDate = zipfileRead16(aRead);
6485     pCDS->crc32 = zipfileRead32(aRead);
6486     pCDS->szCompressed = zipfileRead32(aRead);
6487     pCDS->szUncompressed = zipfileRead32(aRead);
6488     assert( aRead==&aBuf[ZIPFILE_CDS_NFILE_OFF] );
6489     pCDS->nFile = zipfileRead16(aRead);
6490     pCDS->nExtra = zipfileRead16(aRead);
6491     pCDS->nComment = zipfileRead16(aRead);
6492     pCDS->iDiskStart = zipfileRead16(aRead);
6493     pCDS->iInternalAttr = zipfileRead16(aRead);
6494     pCDS->iExternalAttr = zipfileRead32(aRead);
6495     pCDS->iOffset = zipfileRead32(aRead);
6496     assert( aRead==&aBuf[ZIPFILE_CDS_FIXED_SZ] );
6497   }
6498 
6499   return rc;
6500 }
6501 
6502 /*
6503 ** Decode the LFH record in buffer aBuf into (*pLFH). Return SQLITE_ERROR
6504 ** if the record is not well-formed, or SQLITE_OK otherwise.
6505 */
6506 static int zipfileReadLFH(
6507   u8 *aBuffer,
6508   ZipfileLFH *pLFH
6509 ){
6510   u8 *aRead = aBuffer;
6511   int rc = SQLITE_OK;
6512 
6513   u32 sig = zipfileRead32(aRead);
6514   if( sig!=ZIPFILE_SIGNATURE_LFH ){
6515     rc = SQLITE_ERROR;
6516   }else{
6517     pLFH->iVersionExtract = zipfileRead16(aRead);
6518     pLFH->flags = zipfileRead16(aRead);
6519     pLFH->iCompression = zipfileRead16(aRead);
6520     pLFH->mTime = zipfileRead16(aRead);
6521     pLFH->mDate = zipfileRead16(aRead);
6522     pLFH->crc32 = zipfileRead32(aRead);
6523     pLFH->szCompressed = zipfileRead32(aRead);
6524     pLFH->szUncompressed = zipfileRead32(aRead);
6525     pLFH->nFile = zipfileRead16(aRead);
6526     pLFH->nExtra = zipfileRead16(aRead);
6527   }
6528   return rc;
6529 }
6530 
6531 
6532 /*
6533 ** Buffer aExtra (size nExtra bytes) contains zip archive "extra" fields.
6534 ** Scan through this buffer to find an "extra-timestamp" field. If one
6535 ** exists, extract the 32-bit modification-timestamp from it and store
6536 ** the value in output parameter *pmTime.
6537 **
6538 ** Zero is returned if no extra-timestamp record could be found (and so
6539 ** *pmTime is left unchanged), or non-zero otherwise.
6540 **
6541 ** The general format of an extra field is:
6542 **
6543 **   Header ID    2 bytes
6544 **   Data Size    2 bytes
6545 **   Data         N bytes
6546 */
6547 static int zipfileScanExtra(u8 *aExtra, int nExtra, u32 *pmTime){
6548   int ret = 0;
6549   u8 *p = aExtra;
6550   u8 *pEnd = &aExtra[nExtra];
6551 
6552   while( p<pEnd ){
6553     u16 id = zipfileRead16(p);
6554     u16 nByte = zipfileRead16(p);
6555 
6556     switch( id ){
6557       case ZIPFILE_EXTRA_TIMESTAMP: {
6558         u8 b = p[0];
6559         if( b & 0x01 ){     /* 0x01 -> modtime is present */
6560           *pmTime = zipfileGetU32(&p[1]);
6561           ret = 1;
6562         }
6563         break;
6564       }
6565     }
6566 
6567     p += nByte;
6568   }
6569   return ret;
6570 }
6571 
6572 /*
6573 ** Convert the standard MS-DOS timestamp stored in the mTime and mDate
6574 ** fields of the CDS structure passed as the only argument to a 32-bit
6575 ** UNIX seconds-since-the-epoch timestamp. Return the result.
6576 **
6577 ** "Standard" MS-DOS time format:
6578 **
6579 **   File modification time:
6580 **     Bits 00-04: seconds divided by 2
6581 **     Bits 05-10: minute
6582 **     Bits 11-15: hour
6583 **   File modification date:
6584 **     Bits 00-04: day
6585 **     Bits 05-08: month (1-12)
6586 **     Bits 09-15: years from 1980
6587 **
6588 ** https://msdn.microsoft.com/en-us/library/9kkf9tah.aspx
6589 */
6590 static u32 zipfileMtime(ZipfileCDS *pCDS){
6591   int Y = (1980 + ((pCDS->mDate >> 9) & 0x7F));
6592   int M = ((pCDS->mDate >> 5) & 0x0F);
6593   int D = (pCDS->mDate & 0x1F);
6594   int B = -13;
6595 
6596   int sec = (pCDS->mTime & 0x1F)*2;
6597   int min = (pCDS->mTime >> 5) & 0x3F;
6598   int hr = (pCDS->mTime >> 11) & 0x1F;
6599   i64 JD;
6600 
6601   /* JD = INT(365.25 * (Y+4716)) + INT(30.6001 * (M+1)) + D + B - 1524.5 */
6602 
6603   /* Calculate the JD in seconds for noon on the day in question */
6604   if( M<3 ){
6605     Y = Y-1;
6606     M = M+12;
6607   }
6608   JD = (i64)(24*60*60) * (
6609       (int)(365.25 * (Y + 4716))
6610     + (int)(30.6001 * (M + 1))
6611     + D + B - 1524
6612   );
6613 
6614   /* Correct the JD for the time within the day */
6615   JD += (hr-12) * 3600 + min * 60 + sec;
6616 
6617   /* Convert JD to unix timestamp (the JD epoch is 2440587.5) */
6618   return (u32)(JD - (i64)(24405875) * 24*60*6);
6619 }
6620 
6621 /*
6622 ** The opposite of zipfileMtime(). This function populates the mTime and
6623 ** mDate fields of the CDS structure passed as the first argument according
6624 ** to the UNIX timestamp value passed as the second.
6625 */
6626 static void zipfileMtimeToDos(ZipfileCDS *pCds, u32 mUnixTime){
6627   /* Convert unix timestamp to JD (2440588 is noon on 1/1/1970) */
6628   i64 JD = (i64)2440588 + mUnixTime / (24*60*60);
6629 
6630   int A, B, C, D, E;
6631   int yr, mon, day;
6632   int hr, min, sec;
6633 
6634   A = (int)((JD - 1867216.25)/36524.25);
6635   A = (int)(JD + 1 + A - (A/4));
6636   B = A + 1524;
6637   C = (int)((B - 122.1)/365.25);
6638   D = (36525*(C&32767))/100;
6639   E = (int)((B-D)/30.6001);
6640 
6641   day = B - D - (int)(30.6001*E);
6642   mon = (E<14 ? E-1 : E-13);
6643   yr = mon>2 ? C-4716 : C-4715;
6644 
6645   hr = (mUnixTime % (24*60*60)) / (60*60);
6646   min = (mUnixTime % (60*60)) / 60;
6647   sec = (mUnixTime % 60);
6648 
6649   if( yr>=1980 ){
6650     pCds->mDate = (u16)(day + (mon << 5) + ((yr-1980) << 9));
6651     pCds->mTime = (u16)(sec/2 + (min<<5) + (hr<<11));
6652   }else{
6653     pCds->mDate = pCds->mTime = 0;
6654   }
6655 
6656   assert( mUnixTime<315507600
6657        || mUnixTime==zipfileMtime(pCds)
6658        || ((mUnixTime % 2) && mUnixTime-1==zipfileMtime(pCds))
6659        /* || (mUnixTime % 2) */
6660   );
6661 }
6662 
6663 /*
6664 ** If aBlob is not NULL, then it is a pointer to a buffer (nBlob bytes in
6665 ** size) containing an entire zip archive image. Or, if aBlob is NULL,
6666 ** then pFile is a file-handle open on a zip file. In either case, this
6667 ** function creates a ZipfileEntry object based on the zip archive entry
6668 ** for which the CDS record is at offset iOff.
6669 **
6670 ** If successful, SQLITE_OK is returned and (*ppEntry) set to point to
6671 ** the new object. Otherwise, an SQLite error code is returned and the
6672 ** final value of (*ppEntry) undefined.
6673 */
6674 static int zipfileGetEntry(
6675   ZipfileTab *pTab,               /* Store any error message here */
6676   const u8 *aBlob,                /* Pointer to in-memory file image */
6677   int nBlob,                      /* Size of aBlob[] in bytes */
6678   FILE *pFile,                    /* If aBlob==0, read from this file */
6679   i64 iOff,                       /* Offset of CDS record */
6680   ZipfileEntry **ppEntry          /* OUT: Pointer to new object */
6681 ){
6682   u8 *aRead;
6683   char **pzErr = &pTab->base.zErrMsg;
6684   int rc = SQLITE_OK;
6685 
6686   if( aBlob==0 ){
6687     aRead = pTab->aBuffer;
6688     rc = zipfileReadData(pFile, aRead, ZIPFILE_CDS_FIXED_SZ, iOff, pzErr);
6689   }else{
6690     aRead = (u8*)&aBlob[iOff];
6691   }
6692 
6693   if( rc==SQLITE_OK ){
6694     sqlite3_int64 nAlloc;
6695     ZipfileEntry *pNew;
6696 
6697     int nFile = zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF]);
6698     int nExtra = zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF+2]);
6699     nExtra += zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF+4]);
6700 
6701     nAlloc = sizeof(ZipfileEntry) + nExtra;
6702     if( aBlob ){
6703       nAlloc += zipfileGetU32(&aRead[ZIPFILE_CDS_SZCOMPRESSED_OFF]);
6704     }
6705 
6706     pNew = (ZipfileEntry*)sqlite3_malloc64(nAlloc);
6707     if( pNew==0 ){
6708       rc = SQLITE_NOMEM;
6709     }else{
6710       memset(pNew, 0, sizeof(ZipfileEntry));
6711       rc = zipfileReadCDS(aRead, &pNew->cds);
6712       if( rc!=SQLITE_OK ){
6713         *pzErr = sqlite3_mprintf("failed to read CDS at offset %lld", iOff);
6714       }else if( aBlob==0 ){
6715         rc = zipfileReadData(
6716             pFile, aRead, nExtra+nFile, iOff+ZIPFILE_CDS_FIXED_SZ, pzErr
6717         );
6718       }else{
6719         aRead = (u8*)&aBlob[iOff + ZIPFILE_CDS_FIXED_SZ];
6720       }
6721     }
6722 
6723     if( rc==SQLITE_OK ){
6724       u32 *pt = &pNew->mUnixTime;
6725       pNew->cds.zFile = sqlite3_mprintf("%.*s", nFile, aRead);
6726       pNew->aExtra = (u8*)&pNew[1];
6727       memcpy(pNew->aExtra, &aRead[nFile], nExtra);
6728       if( pNew->cds.zFile==0 ){
6729         rc = SQLITE_NOMEM;
6730       }else if( 0==zipfileScanExtra(&aRead[nFile], pNew->cds.nExtra, pt) ){
6731         pNew->mUnixTime = zipfileMtime(&pNew->cds);
6732       }
6733     }
6734 
6735     if( rc==SQLITE_OK ){
6736       static const int szFix = ZIPFILE_LFH_FIXED_SZ;
6737       ZipfileLFH lfh;
6738       if( pFile ){
6739         rc = zipfileReadData(pFile, aRead, szFix, pNew->cds.iOffset, pzErr);
6740       }else{
6741         aRead = (u8*)&aBlob[pNew->cds.iOffset];
6742       }
6743 
6744       rc = zipfileReadLFH(aRead, &lfh);
6745       if( rc==SQLITE_OK ){
6746         pNew->iDataOff =  pNew->cds.iOffset + ZIPFILE_LFH_FIXED_SZ;
6747         pNew->iDataOff += lfh.nFile + lfh.nExtra;
6748         if( aBlob && pNew->cds.szCompressed ){
6749           pNew->aData = &pNew->aExtra[nExtra];
6750           memcpy(pNew->aData, &aBlob[pNew->iDataOff], pNew->cds.szCompressed);
6751         }
6752       }else{
6753         *pzErr = sqlite3_mprintf("failed to read LFH at offset %d",
6754             (int)pNew->cds.iOffset
6755         );
6756       }
6757     }
6758 
6759     if( rc!=SQLITE_OK ){
6760       zipfileEntryFree(pNew);
6761     }else{
6762       *ppEntry = pNew;
6763     }
6764   }
6765 
6766   return rc;
6767 }
6768 
6769 /*
6770 ** Advance an ZipfileCsr to its next row of output.
6771 */
6772 static int zipfileNext(sqlite3_vtab_cursor *cur){
6773   ZipfileCsr *pCsr = (ZipfileCsr*)cur;
6774   int rc = SQLITE_OK;
6775 
6776   if( pCsr->pFile ){
6777     i64 iEof = pCsr->eocd.iOffset + pCsr->eocd.nSize;
6778     zipfileEntryFree(pCsr->pCurrent);
6779     pCsr->pCurrent = 0;
6780     if( pCsr->iNextOff>=iEof ){
6781       pCsr->bEof = 1;
6782     }else{
6783       ZipfileEntry *p = 0;
6784       ZipfileTab *pTab = (ZipfileTab*)(cur->pVtab);
6785       rc = zipfileGetEntry(pTab, 0, 0, pCsr->pFile, pCsr->iNextOff, &p);
6786       if( rc==SQLITE_OK ){
6787         pCsr->iNextOff += ZIPFILE_CDS_FIXED_SZ;
6788         pCsr->iNextOff += (int)p->cds.nExtra + p->cds.nFile + p->cds.nComment;
6789       }
6790       pCsr->pCurrent = p;
6791     }
6792   }else{
6793     if( !pCsr->bNoop ){
6794       pCsr->pCurrent = pCsr->pCurrent->pNext;
6795     }
6796     if( pCsr->pCurrent==0 ){
6797       pCsr->bEof = 1;
6798     }
6799   }
6800 
6801   pCsr->bNoop = 0;
6802   return rc;
6803 }
6804 
6805 static void zipfileFree(void *p) {
6806   sqlite3_free(p);
6807 }
6808 
6809 /*
6810 ** Buffer aIn (size nIn bytes) contains compressed data. Uncompressed, the
6811 ** size is nOut bytes. This function uncompresses the data and sets the
6812 ** return value in context pCtx to the result (a blob).
6813 **
6814 ** If an error occurs, an error code is left in pCtx instead.
6815 */
6816 static void zipfileInflate(
6817   sqlite3_context *pCtx,          /* Store result here */
6818   const u8 *aIn,                  /* Compressed data */
6819   int nIn,                        /* Size of buffer aIn[] in bytes */
6820   int nOut                        /* Expected output size */
6821 ){
6822   u8 *aRes = sqlite3_malloc(nOut);
6823   if( aRes==0 ){
6824     sqlite3_result_error_nomem(pCtx);
6825   }else{
6826     int err;
6827     z_stream str;
6828     memset(&str, 0, sizeof(str));
6829 
6830     str.next_in = (Byte*)aIn;
6831     str.avail_in = nIn;
6832     str.next_out = (Byte*)aRes;
6833     str.avail_out = nOut;
6834 
6835     err = inflateInit2(&str, -15);
6836     if( err!=Z_OK ){
6837       zipfileCtxErrorMsg(pCtx, "inflateInit2() failed (%d)", err);
6838     }else{
6839       err = inflate(&str, Z_NO_FLUSH);
6840       if( err!=Z_STREAM_END ){
6841         zipfileCtxErrorMsg(pCtx, "inflate() failed (%d)", err);
6842       }else{
6843         sqlite3_result_blob(pCtx, aRes, nOut, zipfileFree);
6844         aRes = 0;
6845       }
6846     }
6847     sqlite3_free(aRes);
6848     inflateEnd(&str);
6849   }
6850 }
6851 
6852 /*
6853 ** Buffer aIn (size nIn bytes) contains uncompressed data. This function
6854 ** compresses it and sets (*ppOut) to point to a buffer containing the
6855 ** compressed data. The caller is responsible for eventually calling
6856 ** sqlite3_free() to release buffer (*ppOut). Before returning, (*pnOut)
6857 ** is set to the size of buffer (*ppOut) in bytes.
6858 **
6859 ** If no error occurs, SQLITE_OK is returned. Otherwise, an SQLite error
6860 ** code is returned and an error message left in virtual-table handle
6861 ** pTab. The values of (*ppOut) and (*pnOut) are left unchanged in this
6862 ** case.
6863 */
6864 static int zipfileDeflate(
6865   const u8 *aIn, int nIn,         /* Input */
6866   u8 **ppOut, int *pnOut,         /* Output */
6867   char **pzErr                    /* OUT: Error message */
6868 ){
6869   int rc = SQLITE_OK;
6870   sqlite3_int64 nAlloc;
6871   z_stream str;
6872   u8 *aOut;
6873 
6874   memset(&str, 0, sizeof(str));
6875   str.next_in = (Bytef*)aIn;
6876   str.avail_in = nIn;
6877   deflateInit2(&str, 9, Z_DEFLATED, -15, 8, Z_DEFAULT_STRATEGY);
6878 
6879   nAlloc = deflateBound(&str, nIn);
6880   aOut = (u8*)sqlite3_malloc64(nAlloc);
6881   if( aOut==0 ){
6882     rc = SQLITE_NOMEM;
6883   }else{
6884     int res;
6885     str.next_out = aOut;
6886     str.avail_out = nAlloc;
6887     res = deflate(&str, Z_FINISH);
6888     if( res==Z_STREAM_END ){
6889       *ppOut = aOut;
6890       *pnOut = (int)str.total_out;
6891     }else{
6892       sqlite3_free(aOut);
6893       *pzErr = sqlite3_mprintf("zipfile: deflate() error");
6894       rc = SQLITE_ERROR;
6895     }
6896     deflateEnd(&str);
6897   }
6898 
6899   return rc;
6900 }
6901 
6902 
6903 /*
6904 ** Return values of columns for the row at which the series_cursor
6905 ** is currently pointing.
6906 */
6907 static int zipfileColumn(
6908   sqlite3_vtab_cursor *cur,   /* The cursor */
6909   sqlite3_context *ctx,       /* First argument to sqlite3_result_...() */
6910   int i                       /* Which column to return */
6911 ){
6912   ZipfileCsr *pCsr = (ZipfileCsr*)cur;
6913   ZipfileCDS *pCDS = &pCsr->pCurrent->cds;
6914   int rc = SQLITE_OK;
6915   switch( i ){
6916     case 0:   /* name */
6917       sqlite3_result_text(ctx, pCDS->zFile, -1, SQLITE_TRANSIENT);
6918       break;
6919     case 1:   /* mode */
6920       /* TODO: Whether or not the following is correct surely depends on
6921       ** the platform on which the archive was created.  */
6922       sqlite3_result_int(ctx, pCDS->iExternalAttr >> 16);
6923       break;
6924     case 2: { /* mtime */
6925       sqlite3_result_int64(ctx, pCsr->pCurrent->mUnixTime);
6926       break;
6927     }
6928     case 3: { /* sz */
6929       if( sqlite3_vtab_nochange(ctx)==0 ){
6930         sqlite3_result_int64(ctx, pCDS->szUncompressed);
6931       }
6932       break;
6933     }
6934     case 4:   /* rawdata */
6935       if( sqlite3_vtab_nochange(ctx) ) break;
6936     case 5: { /* data */
6937       if( i==4 || pCDS->iCompression==0 || pCDS->iCompression==8 ){
6938         int sz = pCDS->szCompressed;
6939         int szFinal = pCDS->szUncompressed;
6940         if( szFinal>0 ){
6941           u8 *aBuf;
6942           u8 *aFree = 0;
6943           if( pCsr->pCurrent->aData ){
6944             aBuf = pCsr->pCurrent->aData;
6945           }else{
6946             aBuf = aFree = sqlite3_malloc64(sz);
6947             if( aBuf==0 ){
6948               rc = SQLITE_NOMEM;
6949             }else{
6950               FILE *pFile = pCsr->pFile;
6951               if( pFile==0 ){
6952                 pFile = ((ZipfileTab*)(pCsr->base.pVtab))->pWriteFd;
6953               }
6954               rc = zipfileReadData(pFile, aBuf, sz, pCsr->pCurrent->iDataOff,
6955                   &pCsr->base.pVtab->zErrMsg
6956               );
6957             }
6958           }
6959           if( rc==SQLITE_OK ){
6960             if( i==5 && pCDS->iCompression ){
6961               zipfileInflate(ctx, aBuf, sz, szFinal);
6962             }else{
6963               sqlite3_result_blob(ctx, aBuf, sz, SQLITE_TRANSIENT);
6964             }
6965           }
6966           sqlite3_free(aFree);
6967         }else{
6968           /* Figure out if this is a directory or a zero-sized file. Consider
6969           ** it to be a directory either if the mode suggests so, or if
6970           ** the final character in the name is '/'.  */
6971           u32 mode = pCDS->iExternalAttr >> 16;
6972           if( !(mode & S_IFDIR) && pCDS->zFile[pCDS->nFile-1]!='/' ){
6973             sqlite3_result_blob(ctx, "", 0, SQLITE_STATIC);
6974           }
6975         }
6976       }
6977       break;
6978     }
6979     case 6:   /* method */
6980       sqlite3_result_int(ctx, pCDS->iCompression);
6981       break;
6982     default:  /* z */
6983       assert( i==7 );
6984       sqlite3_result_int64(ctx, pCsr->iId);
6985       break;
6986   }
6987 
6988   return rc;
6989 }
6990 
6991 /*
6992 ** Return TRUE if the cursor is at EOF.
6993 */
6994 static int zipfileEof(sqlite3_vtab_cursor *cur){
6995   ZipfileCsr *pCsr = (ZipfileCsr*)cur;
6996   return pCsr->bEof;
6997 }
6998 
6999 /*
7000 ** If aBlob is not NULL, then it points to a buffer nBlob bytes in size
7001 ** containing an entire zip archive image. Or, if aBlob is NULL, then pFile
7002 ** is guaranteed to be a file-handle open on a zip file.
7003 **
7004 ** This function attempts to locate the EOCD record within the zip archive
7005 ** and populate *pEOCD with the results of decoding it. SQLITE_OK is
7006 ** returned if successful. Otherwise, an SQLite error code is returned and
7007 ** an English language error message may be left in virtual-table pTab.
7008 */
7009 static int zipfileReadEOCD(
7010   ZipfileTab *pTab,               /* Return errors here */
7011   const u8 *aBlob,                /* Pointer to in-memory file image */
7012   int nBlob,                      /* Size of aBlob[] in bytes */
7013   FILE *pFile,                    /* Read from this file if aBlob==0 */
7014   ZipfileEOCD *pEOCD              /* Object to populate */
7015 ){
7016   u8 *aRead = pTab->aBuffer;      /* Temporary buffer */
7017   int nRead;                      /* Bytes to read from file */
7018   int rc = SQLITE_OK;
7019 
7020   if( aBlob==0 ){
7021     i64 iOff;                     /* Offset to read from */
7022     i64 szFile;                   /* Total size of file in bytes */
7023     fseek(pFile, 0, SEEK_END);
7024     szFile = (i64)ftell(pFile);
7025     if( szFile==0 ){
7026       memset(pEOCD, 0, sizeof(ZipfileEOCD));
7027       return SQLITE_OK;
7028     }
7029     nRead = (int)(MIN(szFile, ZIPFILE_BUFFER_SIZE));
7030     iOff = szFile - nRead;
7031     rc = zipfileReadData(pFile, aRead, nRead, iOff, &pTab->base.zErrMsg);
7032   }else{
7033     nRead = (int)(MIN(nBlob, ZIPFILE_BUFFER_SIZE));
7034     aRead = (u8*)&aBlob[nBlob-nRead];
7035   }
7036 
7037   if( rc==SQLITE_OK ){
7038     int i;
7039 
7040     /* Scan backwards looking for the signature bytes */
7041     for(i=nRead-20; i>=0; i--){
7042       if( aRead[i]==0x50 && aRead[i+1]==0x4b
7043        && aRead[i+2]==0x05 && aRead[i+3]==0x06
7044       ){
7045         break;
7046       }
7047     }
7048     if( i<0 ){
7049       pTab->base.zErrMsg = sqlite3_mprintf(
7050           "cannot find end of central directory record"
7051       );
7052       return SQLITE_ERROR;
7053     }
7054 
7055     aRead += i+4;
7056     pEOCD->iDisk = zipfileRead16(aRead);
7057     pEOCD->iFirstDisk = zipfileRead16(aRead);
7058     pEOCD->nEntry = zipfileRead16(aRead);
7059     pEOCD->nEntryTotal = zipfileRead16(aRead);
7060     pEOCD->nSize = zipfileRead32(aRead);
7061     pEOCD->iOffset = zipfileRead32(aRead);
7062   }
7063 
7064   return rc;
7065 }
7066 
7067 /*
7068 ** Add object pNew to the linked list that begins at ZipfileTab.pFirstEntry
7069 ** and ends with pLastEntry. If argument pBefore is NULL, then pNew is added
7070 ** to the end of the list. Otherwise, it is added to the list immediately
7071 ** before pBefore (which is guaranteed to be a part of said list).
7072 */
7073 static void zipfileAddEntry(
7074   ZipfileTab *pTab,
7075   ZipfileEntry *pBefore,
7076   ZipfileEntry *pNew
7077 ){
7078   assert( (pTab->pFirstEntry==0)==(pTab->pLastEntry==0) );
7079   assert( pNew->pNext==0 );
7080   if( pBefore==0 ){
7081     if( pTab->pFirstEntry==0 ){
7082       pTab->pFirstEntry = pTab->pLastEntry = pNew;
7083     }else{
7084       assert( pTab->pLastEntry->pNext==0 );
7085       pTab->pLastEntry->pNext = pNew;
7086       pTab->pLastEntry = pNew;
7087     }
7088   }else{
7089     ZipfileEntry **pp;
7090     for(pp=&pTab->pFirstEntry; *pp!=pBefore; pp=&((*pp)->pNext));
7091     pNew->pNext = pBefore;
7092     *pp = pNew;
7093   }
7094 }
7095 
7096 static int zipfileLoadDirectory(ZipfileTab *pTab, const u8 *aBlob, int nBlob){
7097   ZipfileEOCD eocd;
7098   int rc;
7099   int i;
7100   i64 iOff;
7101 
7102   rc = zipfileReadEOCD(pTab, aBlob, nBlob, pTab->pWriteFd, &eocd);
7103   iOff = eocd.iOffset;
7104   for(i=0; rc==SQLITE_OK && i<eocd.nEntry; i++){
7105     ZipfileEntry *pNew = 0;
7106     rc = zipfileGetEntry(pTab, aBlob, nBlob, pTab->pWriteFd, iOff, &pNew);
7107 
7108     if( rc==SQLITE_OK ){
7109       zipfileAddEntry(pTab, 0, pNew);
7110       iOff += ZIPFILE_CDS_FIXED_SZ;
7111       iOff += (int)pNew->cds.nExtra + pNew->cds.nFile + pNew->cds.nComment;
7112     }
7113   }
7114   return rc;
7115 }
7116 
7117 /*
7118 ** xFilter callback.
7119 */
7120 static int zipfileFilter(
7121   sqlite3_vtab_cursor *cur,
7122   int idxNum, const char *idxStr,
7123   int argc, sqlite3_value **argv
7124 ){
7125   ZipfileTab *pTab = (ZipfileTab*)cur->pVtab;
7126   ZipfileCsr *pCsr = (ZipfileCsr*)cur;
7127   const char *zFile = 0;          /* Zip file to scan */
7128   int rc = SQLITE_OK;             /* Return Code */
7129   int bInMemory = 0;              /* True for an in-memory zipfile */
7130 
7131   zipfileResetCursor(pCsr);
7132 
7133   if( pTab->zFile ){
7134     zFile = pTab->zFile;
7135   }else if( idxNum==0 ){
7136     zipfileCursorErr(pCsr, "zipfile() function requires an argument");
7137     return SQLITE_ERROR;
7138   }else if( sqlite3_value_type(argv[0])==SQLITE_BLOB ){
7139     const u8 *aBlob = (const u8*)sqlite3_value_blob(argv[0]);
7140     int nBlob = sqlite3_value_bytes(argv[0]);
7141     assert( pTab->pFirstEntry==0 );
7142     rc = zipfileLoadDirectory(pTab, aBlob, nBlob);
7143     pCsr->pFreeEntry = pTab->pFirstEntry;
7144     pTab->pFirstEntry = pTab->pLastEntry = 0;
7145     if( rc!=SQLITE_OK ) return rc;
7146     bInMemory = 1;
7147   }else{
7148     zFile = (const char*)sqlite3_value_text(argv[0]);
7149   }
7150 
7151   if( 0==pTab->pWriteFd && 0==bInMemory ){
7152     pCsr->pFile = fopen(zFile, "rb");
7153     if( pCsr->pFile==0 ){
7154       zipfileCursorErr(pCsr, "cannot open file: %s", zFile);
7155       rc = SQLITE_ERROR;
7156     }else{
7157       rc = zipfileReadEOCD(pTab, 0, 0, pCsr->pFile, &pCsr->eocd);
7158       if( rc==SQLITE_OK ){
7159         if( pCsr->eocd.nEntry==0 ){
7160           pCsr->bEof = 1;
7161         }else{
7162           pCsr->iNextOff = pCsr->eocd.iOffset;
7163           rc = zipfileNext(cur);
7164         }
7165       }
7166     }
7167   }else{
7168     pCsr->bNoop = 1;
7169     pCsr->pCurrent = pCsr->pFreeEntry ? pCsr->pFreeEntry : pTab->pFirstEntry;
7170     rc = zipfileNext(cur);
7171   }
7172 
7173   return rc;
7174 }
7175 
7176 /*
7177 ** xBestIndex callback.
7178 */
7179 static int zipfileBestIndex(
7180   sqlite3_vtab *tab,
7181   sqlite3_index_info *pIdxInfo
7182 ){
7183   int i;
7184   int idx = -1;
7185   int unusable = 0;
7186 
7187   for(i=0; i<pIdxInfo->nConstraint; i++){
7188     const struct sqlite3_index_constraint *pCons = &pIdxInfo->aConstraint[i];
7189     if( pCons->iColumn!=ZIPFILE_F_COLUMN_IDX ) continue;
7190     if( pCons->usable==0 ){
7191       unusable = 1;
7192     }else if( pCons->op==SQLITE_INDEX_CONSTRAINT_EQ ){
7193       idx = i;
7194     }
7195   }
7196   pIdxInfo->estimatedCost = 1000.0;
7197   if( idx>=0 ){
7198     pIdxInfo->aConstraintUsage[idx].argvIndex = 1;
7199     pIdxInfo->aConstraintUsage[idx].omit = 1;
7200     pIdxInfo->idxNum = 1;
7201   }else if( unusable ){
7202     return SQLITE_CONSTRAINT;
7203   }
7204   return SQLITE_OK;
7205 }
7206 
7207 static ZipfileEntry *zipfileNewEntry(const char *zPath){
7208   ZipfileEntry *pNew;
7209   pNew = sqlite3_malloc(sizeof(ZipfileEntry));
7210   if( pNew ){
7211     memset(pNew, 0, sizeof(ZipfileEntry));
7212     pNew->cds.zFile = sqlite3_mprintf("%s", zPath);
7213     if( pNew->cds.zFile==0 ){
7214       sqlite3_free(pNew);
7215       pNew = 0;
7216     }
7217   }
7218   return pNew;
7219 }
7220 
7221 static int zipfileSerializeLFH(ZipfileEntry *pEntry, u8 *aBuf){
7222   ZipfileCDS *pCds = &pEntry->cds;
7223   u8 *a = aBuf;
7224 
7225   pCds->nExtra = 9;
7226 
7227   /* Write the LFH itself */
7228   zipfileWrite32(a, ZIPFILE_SIGNATURE_LFH);
7229   zipfileWrite16(a, pCds->iVersionExtract);
7230   zipfileWrite16(a, pCds->flags);
7231   zipfileWrite16(a, pCds->iCompression);
7232   zipfileWrite16(a, pCds->mTime);
7233   zipfileWrite16(a, pCds->mDate);
7234   zipfileWrite32(a, pCds->crc32);
7235   zipfileWrite32(a, pCds->szCompressed);
7236   zipfileWrite32(a, pCds->szUncompressed);
7237   zipfileWrite16(a, (u16)pCds->nFile);
7238   zipfileWrite16(a, pCds->nExtra);
7239   assert( a==&aBuf[ZIPFILE_LFH_FIXED_SZ] );
7240 
7241   /* Add the file name */
7242   memcpy(a, pCds->zFile, (int)pCds->nFile);
7243   a += (int)pCds->nFile;
7244 
7245   /* The "extra" data */
7246   zipfileWrite16(a, ZIPFILE_EXTRA_TIMESTAMP);
7247   zipfileWrite16(a, 5);
7248   *a++ = 0x01;
7249   zipfileWrite32(a, pEntry->mUnixTime);
7250 
7251   return a-aBuf;
7252 }
7253 
7254 static int zipfileAppendEntry(
7255   ZipfileTab *pTab,
7256   ZipfileEntry *pEntry,
7257   const u8 *pData,
7258   int nData
7259 ){
7260   u8 *aBuf = pTab->aBuffer;
7261   int nBuf;
7262   int rc;
7263 
7264   nBuf = zipfileSerializeLFH(pEntry, aBuf);
7265   rc = zipfileAppendData(pTab, aBuf, nBuf);
7266   if( rc==SQLITE_OK ){
7267     pEntry->iDataOff = pTab->szCurrent;
7268     rc = zipfileAppendData(pTab, pData, nData);
7269   }
7270 
7271   return rc;
7272 }
7273 
7274 static int zipfileGetMode(
7275   sqlite3_value *pVal,
7276   int bIsDir,                     /* If true, default to directory */
7277   u32 *pMode,                     /* OUT: Mode value */
7278   char **pzErr                    /* OUT: Error message */
7279 ){
7280   const char *z = (const char*)sqlite3_value_text(pVal);
7281   u32 mode = 0;
7282   if( z==0 ){
7283     mode = (bIsDir ? (S_IFDIR + 0755) : (S_IFREG + 0644));
7284   }else if( z[0]>='0' && z[0]<='9' ){
7285     mode = (unsigned int)sqlite3_value_int(pVal);
7286   }else{
7287     const char zTemplate[11] = "-rwxrwxrwx";
7288     int i;
7289     if( strlen(z)!=10 ) goto parse_error;
7290     switch( z[0] ){
7291       case '-': mode |= S_IFREG; break;
7292       case 'd': mode |= S_IFDIR; break;
7293       case 'l': mode |= S_IFLNK; break;
7294       default: goto parse_error;
7295     }
7296     for(i=1; i<10; i++){
7297       if( z[i]==zTemplate[i] ) mode |= 1 << (9-i);
7298       else if( z[i]!='-' ) goto parse_error;
7299     }
7300   }
7301   if( ((mode & S_IFDIR)==0)==bIsDir ){
7302     /* The "mode" attribute is a directory, but data has been specified.
7303     ** Or vice-versa - no data but "mode" is a file or symlink.  */
7304     *pzErr = sqlite3_mprintf("zipfile: mode does not match data");
7305     return SQLITE_CONSTRAINT;
7306   }
7307   *pMode = mode;
7308   return SQLITE_OK;
7309 
7310  parse_error:
7311   *pzErr = sqlite3_mprintf("zipfile: parse error in mode: %s", z);
7312   return SQLITE_ERROR;
7313 }
7314 
7315 /*
7316 ** Both (const char*) arguments point to nul-terminated strings. Argument
7317 ** nB is the value of strlen(zB). This function returns 0 if the strings are
7318 ** identical, ignoring any trailing '/' character in either path.  */
7319 static int zipfileComparePath(const char *zA, const char *zB, int nB){
7320   int nA = (int)strlen(zA);
7321   if( nA>0 && zA[nA-1]=='/' ) nA--;
7322   if( nB>0 && zB[nB-1]=='/' ) nB--;
7323   if( nA==nB && memcmp(zA, zB, nA)==0 ) return 0;
7324   return 1;
7325 }
7326 
7327 static int zipfileBegin(sqlite3_vtab *pVtab){
7328   ZipfileTab *pTab = (ZipfileTab*)pVtab;
7329   int rc = SQLITE_OK;
7330 
7331   assert( pTab->pWriteFd==0 );
7332   if( pTab->zFile==0 || pTab->zFile[0]==0 ){
7333     pTab->base.zErrMsg = sqlite3_mprintf("zipfile: missing filename");
7334     return SQLITE_ERROR;
7335   }
7336 
7337   /* Open a write fd on the file. Also load the entire central directory
7338   ** structure into memory. During the transaction any new file data is
7339   ** appended to the archive file, but the central directory is accumulated
7340   ** in main-memory until the transaction is committed.  */
7341   pTab->pWriteFd = fopen(pTab->zFile, "ab+");
7342   if( pTab->pWriteFd==0 ){
7343     pTab->base.zErrMsg = sqlite3_mprintf(
7344         "zipfile: failed to open file %s for writing", pTab->zFile
7345         );
7346     rc = SQLITE_ERROR;
7347   }else{
7348     fseek(pTab->pWriteFd, 0, SEEK_END);
7349     pTab->szCurrent = pTab->szOrig = (i64)ftell(pTab->pWriteFd);
7350     rc = zipfileLoadDirectory(pTab, 0, 0);
7351   }
7352 
7353   if( rc!=SQLITE_OK ){
7354     zipfileCleanupTransaction(pTab);
7355   }
7356 
7357   return rc;
7358 }
7359 
7360 /*
7361 ** Return the current time as a 32-bit timestamp in UNIX epoch format (like
7362 ** time(2)).
7363 */
7364 static u32 zipfileTime(void){
7365   sqlite3_vfs *pVfs = sqlite3_vfs_find(0);
7366   u32 ret;
7367   if( pVfs->iVersion>=2 && pVfs->xCurrentTimeInt64 ){
7368     i64 ms;
7369     pVfs->xCurrentTimeInt64(pVfs, &ms);
7370     ret = (u32)((ms/1000) - ((i64)24405875 * 8640));
7371   }else{
7372     double day;
7373     pVfs->xCurrentTime(pVfs, &day);
7374     ret = (u32)((day - 2440587.5) * 86400);
7375   }
7376   return ret;
7377 }
7378 
7379 /*
7380 ** Return a 32-bit timestamp in UNIX epoch format.
7381 **
7382 ** If the value passed as the only argument is either NULL or an SQL NULL,
7383 ** return the current time. Otherwise, return the value stored in (*pVal)
7384 ** cast to a 32-bit unsigned integer.
7385 */
7386 static u32 zipfileGetTime(sqlite3_value *pVal){
7387   if( pVal==0 || sqlite3_value_type(pVal)==SQLITE_NULL ){
7388     return zipfileTime();
7389   }
7390   return (u32)sqlite3_value_int64(pVal);
7391 }
7392 
7393 /*
7394 ** Unless it is NULL, entry pOld is currently part of the pTab->pFirstEntry
7395 ** linked list.  Remove it from the list and free the object.
7396 */
7397 static void zipfileRemoveEntryFromList(ZipfileTab *pTab, ZipfileEntry *pOld){
7398   if( pOld ){
7399     ZipfileEntry **pp;
7400     for(pp=&pTab->pFirstEntry; (*pp)!=pOld; pp=&((*pp)->pNext));
7401     *pp = (*pp)->pNext;
7402     zipfileEntryFree(pOld);
7403   }
7404 }
7405 
7406 /*
7407 ** xUpdate method.
7408 */
7409 static int zipfileUpdate(
7410   sqlite3_vtab *pVtab,
7411   int nVal,
7412   sqlite3_value **apVal,
7413   sqlite_int64 *pRowid
7414 ){
7415   ZipfileTab *pTab = (ZipfileTab*)pVtab;
7416   int rc = SQLITE_OK;             /* Return Code */
7417   ZipfileEntry *pNew = 0;         /* New in-memory CDS entry */
7418 
7419   u32 mode = 0;                   /* Mode for new entry */
7420   u32 mTime = 0;                  /* Modification time for new entry */
7421   i64 sz = 0;                     /* Uncompressed size */
7422   const char *zPath = 0;          /* Path for new entry */
7423   int nPath = 0;                  /* strlen(zPath) */
7424   const u8 *pData = 0;            /* Pointer to buffer containing content */
7425   int nData = 0;                  /* Size of pData buffer in bytes */
7426   int iMethod = 0;                /* Compression method for new entry */
7427   u8 *pFree = 0;                  /* Free this */
7428   char *zFree = 0;                /* Also free this */
7429   ZipfileEntry *pOld = 0;
7430   ZipfileEntry *pOld2 = 0;
7431   int bUpdate = 0;                /* True for an update that modifies "name" */
7432   int bIsDir = 0;
7433   u32 iCrc32 = 0;
7434 
7435   if( pTab->pWriteFd==0 ){
7436     rc = zipfileBegin(pVtab);
7437     if( rc!=SQLITE_OK ) return rc;
7438   }
7439 
7440   /* If this is a DELETE or UPDATE, find the archive entry to delete. */
7441   if( sqlite3_value_type(apVal[0])!=SQLITE_NULL ){
7442     const char *zDelete = (const char*)sqlite3_value_text(apVal[0]);
7443     int nDelete = (int)strlen(zDelete);
7444     if( nVal>1 ){
7445       const char *zUpdate = (const char*)sqlite3_value_text(apVal[1]);
7446       if( zUpdate && zipfileComparePath(zUpdate, zDelete, nDelete)!=0 ){
7447         bUpdate = 1;
7448       }
7449     }
7450     for(pOld=pTab->pFirstEntry; 1; pOld=pOld->pNext){
7451       if( zipfileComparePath(pOld->cds.zFile, zDelete, nDelete)==0 ){
7452         break;
7453       }
7454       assert( pOld->pNext );
7455     }
7456   }
7457 
7458   if( nVal>1 ){
7459     /* Check that "sz" and "rawdata" are both NULL: */
7460     if( sqlite3_value_type(apVal[5])!=SQLITE_NULL ){
7461       zipfileTableErr(pTab, "sz must be NULL");
7462       rc = SQLITE_CONSTRAINT;
7463     }
7464     if( sqlite3_value_type(apVal[6])!=SQLITE_NULL ){
7465       zipfileTableErr(pTab, "rawdata must be NULL");
7466       rc = SQLITE_CONSTRAINT;
7467     }
7468 
7469     if( rc==SQLITE_OK ){
7470       if( sqlite3_value_type(apVal[7])==SQLITE_NULL ){
7471         /* data=NULL. A directory */
7472         bIsDir = 1;
7473       }else{
7474         /* Value specified for "data", and possibly "method". This must be
7475         ** a regular file or a symlink. */
7476         const u8 *aIn = sqlite3_value_blob(apVal[7]);
7477         int nIn = sqlite3_value_bytes(apVal[7]);
7478         int bAuto = sqlite3_value_type(apVal[8])==SQLITE_NULL;
7479 
7480         iMethod = sqlite3_value_int(apVal[8]);
7481         sz = nIn;
7482         pData = aIn;
7483         nData = nIn;
7484         if( iMethod!=0 && iMethod!=8 ){
7485           zipfileTableErr(pTab, "unknown compression method: %d", iMethod);
7486           rc = SQLITE_CONSTRAINT;
7487         }else{
7488           if( bAuto || iMethod ){
7489             int nCmp;
7490             rc = zipfileDeflate(aIn, nIn, &pFree, &nCmp, &pTab->base.zErrMsg);
7491             if( rc==SQLITE_OK ){
7492               if( iMethod || nCmp<nIn ){
7493                 iMethod = 8;
7494                 pData = pFree;
7495                 nData = nCmp;
7496               }
7497             }
7498           }
7499           iCrc32 = crc32(0, aIn, nIn);
7500         }
7501       }
7502     }
7503 
7504     if( rc==SQLITE_OK ){
7505       rc = zipfileGetMode(apVal[3], bIsDir, &mode, &pTab->base.zErrMsg);
7506     }
7507 
7508     if( rc==SQLITE_OK ){
7509       zPath = (const char*)sqlite3_value_text(apVal[2]);
7510       if( zPath==0 ) zPath = "";
7511       nPath = (int)strlen(zPath);
7512       mTime = zipfileGetTime(apVal[4]);
7513     }
7514 
7515     if( rc==SQLITE_OK && bIsDir ){
7516       /* For a directory, check that the last character in the path is a
7517       ** '/'. This appears to be required for compatibility with info-zip
7518       ** (the unzip command on unix). It does not create directories
7519       ** otherwise.  */
7520       if( nPath<=0 || zPath[nPath-1]!='/' ){
7521         zFree = sqlite3_mprintf("%s/", zPath);
7522         zPath = (const char*)zFree;
7523         if( zFree==0 ){
7524           rc = SQLITE_NOMEM;
7525           nPath = 0;
7526         }else{
7527           nPath = (int)strlen(zPath);
7528         }
7529       }
7530     }
7531 
7532     /* Check that we're not inserting a duplicate entry -OR- updating an
7533     ** entry with a path, thereby making it into a duplicate. */
7534     if( (pOld==0 || bUpdate) && rc==SQLITE_OK ){
7535       ZipfileEntry *p;
7536       for(p=pTab->pFirstEntry; p; p=p->pNext){
7537         if( zipfileComparePath(p->cds.zFile, zPath, nPath)==0 ){
7538           switch( sqlite3_vtab_on_conflict(pTab->db) ){
7539             case SQLITE_IGNORE: {
7540               goto zipfile_update_done;
7541             }
7542             case SQLITE_REPLACE: {
7543               pOld2 = p;
7544               break;
7545             }
7546             default: {
7547               zipfileTableErr(pTab, "duplicate name: \"%s\"", zPath);
7548               rc = SQLITE_CONSTRAINT;
7549               break;
7550             }
7551           }
7552           break;
7553         }
7554       }
7555     }
7556 
7557     if( rc==SQLITE_OK ){
7558       /* Create the new CDS record. */
7559       pNew = zipfileNewEntry(zPath);
7560       if( pNew==0 ){
7561         rc = SQLITE_NOMEM;
7562       }else{
7563         pNew->cds.iVersionMadeBy = ZIPFILE_NEWENTRY_MADEBY;
7564         pNew->cds.iVersionExtract = ZIPFILE_NEWENTRY_REQUIRED;
7565         pNew->cds.flags = ZIPFILE_NEWENTRY_FLAGS;
7566         pNew->cds.iCompression = (u16)iMethod;
7567         zipfileMtimeToDos(&pNew->cds, mTime);
7568         pNew->cds.crc32 = iCrc32;
7569         pNew->cds.szCompressed = nData;
7570         pNew->cds.szUncompressed = (u32)sz;
7571         pNew->cds.iExternalAttr = (mode<<16);
7572         pNew->cds.iOffset = (u32)pTab->szCurrent;
7573         pNew->cds.nFile = (u16)nPath;
7574         pNew->mUnixTime = (u32)mTime;
7575         rc = zipfileAppendEntry(pTab, pNew, pData, nData);
7576         zipfileAddEntry(pTab, pOld, pNew);
7577       }
7578     }
7579   }
7580 
7581   if( rc==SQLITE_OK && (pOld || pOld2) ){
7582     ZipfileCsr *pCsr;
7583     for(pCsr=pTab->pCsrList; pCsr; pCsr=pCsr->pCsrNext){
7584       if( pCsr->pCurrent && (pCsr->pCurrent==pOld || pCsr->pCurrent==pOld2) ){
7585         pCsr->pCurrent = pCsr->pCurrent->pNext;
7586         pCsr->bNoop = 1;
7587       }
7588     }
7589 
7590     zipfileRemoveEntryFromList(pTab, pOld);
7591     zipfileRemoveEntryFromList(pTab, pOld2);
7592   }
7593 
7594 zipfile_update_done:
7595   sqlite3_free(pFree);
7596   sqlite3_free(zFree);
7597   return rc;
7598 }
7599 
7600 static int zipfileSerializeEOCD(ZipfileEOCD *p, u8 *aBuf){
7601   u8 *a = aBuf;
7602   zipfileWrite32(a, ZIPFILE_SIGNATURE_EOCD);
7603   zipfileWrite16(a, p->iDisk);
7604   zipfileWrite16(a, p->iFirstDisk);
7605   zipfileWrite16(a, p->nEntry);
7606   zipfileWrite16(a, p->nEntryTotal);
7607   zipfileWrite32(a, p->nSize);
7608   zipfileWrite32(a, p->iOffset);
7609   zipfileWrite16(a, 0);        /* Size of trailing comment in bytes*/
7610 
7611   return a-aBuf;
7612 }
7613 
7614 static int zipfileAppendEOCD(ZipfileTab *pTab, ZipfileEOCD *p){
7615   int nBuf = zipfileSerializeEOCD(p, pTab->aBuffer);
7616   assert( nBuf==ZIPFILE_EOCD_FIXED_SZ );
7617   return zipfileAppendData(pTab, pTab->aBuffer, nBuf);
7618 }
7619 
7620 /*
7621 ** Serialize the CDS structure into buffer aBuf[]. Return the number
7622 ** of bytes written.
7623 */
7624 static int zipfileSerializeCDS(ZipfileEntry *pEntry, u8 *aBuf){
7625   u8 *a = aBuf;
7626   ZipfileCDS *pCDS = &pEntry->cds;
7627 
7628   if( pEntry->aExtra==0 ){
7629     pCDS->nExtra = 9;
7630   }
7631 
7632   zipfileWrite32(a, ZIPFILE_SIGNATURE_CDS);
7633   zipfileWrite16(a, pCDS->iVersionMadeBy);
7634   zipfileWrite16(a, pCDS->iVersionExtract);
7635   zipfileWrite16(a, pCDS->flags);
7636   zipfileWrite16(a, pCDS->iCompression);
7637   zipfileWrite16(a, pCDS->mTime);
7638   zipfileWrite16(a, pCDS->mDate);
7639   zipfileWrite32(a, pCDS->crc32);
7640   zipfileWrite32(a, pCDS->szCompressed);
7641   zipfileWrite32(a, pCDS->szUncompressed);
7642   assert( a==&aBuf[ZIPFILE_CDS_NFILE_OFF] );
7643   zipfileWrite16(a, pCDS->nFile);
7644   zipfileWrite16(a, pCDS->nExtra);
7645   zipfileWrite16(a, pCDS->nComment);
7646   zipfileWrite16(a, pCDS->iDiskStart);
7647   zipfileWrite16(a, pCDS->iInternalAttr);
7648   zipfileWrite32(a, pCDS->iExternalAttr);
7649   zipfileWrite32(a, pCDS->iOffset);
7650 
7651   memcpy(a, pCDS->zFile, pCDS->nFile);
7652   a += pCDS->nFile;
7653 
7654   if( pEntry->aExtra ){
7655     int n = (int)pCDS->nExtra + (int)pCDS->nComment;
7656     memcpy(a, pEntry->aExtra, n);
7657     a += n;
7658   }else{
7659     assert( pCDS->nExtra==9 );
7660     zipfileWrite16(a, ZIPFILE_EXTRA_TIMESTAMP);
7661     zipfileWrite16(a, 5);
7662     *a++ = 0x01;
7663     zipfileWrite32(a, pEntry->mUnixTime);
7664   }
7665 
7666   return a-aBuf;
7667 }
7668 
7669 static int zipfileCommit(sqlite3_vtab *pVtab){
7670   ZipfileTab *pTab = (ZipfileTab*)pVtab;
7671   int rc = SQLITE_OK;
7672   if( pTab->pWriteFd ){
7673     i64 iOffset = pTab->szCurrent;
7674     ZipfileEntry *p;
7675     ZipfileEOCD eocd;
7676     int nEntry = 0;
7677 
7678     /* Write out all entries */
7679     for(p=pTab->pFirstEntry; rc==SQLITE_OK && p; p=p->pNext){
7680       int n = zipfileSerializeCDS(p, pTab->aBuffer);
7681       rc = zipfileAppendData(pTab, pTab->aBuffer, n);
7682       nEntry++;
7683     }
7684 
7685     /* Write out the EOCD record */
7686     eocd.iDisk = 0;
7687     eocd.iFirstDisk = 0;
7688     eocd.nEntry = (u16)nEntry;
7689     eocd.nEntryTotal = (u16)nEntry;
7690     eocd.nSize = (u32)(pTab->szCurrent - iOffset);
7691     eocd.iOffset = (u32)iOffset;
7692     rc = zipfileAppendEOCD(pTab, &eocd);
7693 
7694     zipfileCleanupTransaction(pTab);
7695   }
7696   return rc;
7697 }
7698 
7699 static int zipfileRollback(sqlite3_vtab *pVtab){
7700   return zipfileCommit(pVtab);
7701 }
7702 
7703 static ZipfileCsr *zipfileFindCursor(ZipfileTab *pTab, i64 iId){
7704   ZipfileCsr *pCsr;
7705   for(pCsr=pTab->pCsrList; pCsr; pCsr=pCsr->pCsrNext){
7706     if( iId==pCsr->iId ) break;
7707   }
7708   return pCsr;
7709 }
7710 
7711 static void zipfileFunctionCds(
7712   sqlite3_context *context,
7713   int argc,
7714   sqlite3_value **argv
7715 ){
7716   ZipfileCsr *pCsr;
7717   ZipfileTab *pTab = (ZipfileTab*)sqlite3_user_data(context);
7718   assert( argc>0 );
7719 
7720   pCsr = zipfileFindCursor(pTab, sqlite3_value_int64(argv[0]));
7721   if( pCsr ){
7722     ZipfileCDS *p = &pCsr->pCurrent->cds;
7723     char *zRes = sqlite3_mprintf("{"
7724         "\"version-made-by\" : %u, "
7725         "\"version-to-extract\" : %u, "
7726         "\"flags\" : %u, "
7727         "\"compression\" : %u, "
7728         "\"time\" : %u, "
7729         "\"date\" : %u, "
7730         "\"crc32\" : %u, "
7731         "\"compressed-size\" : %u, "
7732         "\"uncompressed-size\" : %u, "
7733         "\"file-name-length\" : %u, "
7734         "\"extra-field-length\" : %u, "
7735         "\"file-comment-length\" : %u, "
7736         "\"disk-number-start\" : %u, "
7737         "\"internal-attr\" : %u, "
7738         "\"external-attr\" : %u, "
7739         "\"offset\" : %u }",
7740         (u32)p->iVersionMadeBy, (u32)p->iVersionExtract,
7741         (u32)p->flags, (u32)p->iCompression,
7742         (u32)p->mTime, (u32)p->mDate,
7743         (u32)p->crc32, (u32)p->szCompressed,
7744         (u32)p->szUncompressed, (u32)p->nFile,
7745         (u32)p->nExtra, (u32)p->nComment,
7746         (u32)p->iDiskStart, (u32)p->iInternalAttr,
7747         (u32)p->iExternalAttr, (u32)p->iOffset
7748     );
7749 
7750     if( zRes==0 ){
7751       sqlite3_result_error_nomem(context);
7752     }else{
7753       sqlite3_result_text(context, zRes, -1, SQLITE_TRANSIENT);
7754       sqlite3_free(zRes);
7755     }
7756   }
7757 }
7758 
7759 /*
7760 ** xFindFunction method.
7761 */
7762 static int zipfileFindFunction(
7763   sqlite3_vtab *pVtab,            /* Virtual table handle */
7764   int nArg,                       /* Number of SQL function arguments */
7765   const char *zName,              /* Name of SQL function */
7766   void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), /* OUT: Result */
7767   void **ppArg                    /* OUT: User data for *pxFunc */
7768 ){
7769   if( sqlite3_stricmp("zipfile_cds", zName)==0 ){
7770     *pxFunc = zipfileFunctionCds;
7771     *ppArg = (void*)pVtab;
7772     return 1;
7773   }
7774   return 0;
7775 }
7776 
7777 typedef struct ZipfileBuffer ZipfileBuffer;
7778 struct ZipfileBuffer {
7779   u8 *a;                          /* Pointer to buffer */
7780   int n;                          /* Size of buffer in bytes */
7781   int nAlloc;                     /* Byte allocated at a[] */
7782 };
7783 
7784 typedef struct ZipfileCtx ZipfileCtx;
7785 struct ZipfileCtx {
7786   int nEntry;
7787   ZipfileBuffer body;
7788   ZipfileBuffer cds;
7789 };
7790 
7791 static int zipfileBufferGrow(ZipfileBuffer *pBuf, int nByte){
7792   if( pBuf->n+nByte>pBuf->nAlloc ){
7793     u8 *aNew;
7794     sqlite3_int64 nNew = pBuf->n ? pBuf->n*2 : 512;
7795     int nReq = pBuf->n + nByte;
7796 
7797     while( nNew<nReq ) nNew = nNew*2;
7798     aNew = sqlite3_realloc64(pBuf->a, nNew);
7799     if( aNew==0 ) return SQLITE_NOMEM;
7800     pBuf->a = aNew;
7801     pBuf->nAlloc = (int)nNew;
7802   }
7803   return SQLITE_OK;
7804 }
7805 
7806 /*
7807 ** xStep() callback for the zipfile() aggregate. This can be called in
7808 ** any of the following ways:
7809 **
7810 **   SELECT zipfile(name,data) ...
7811 **   SELECT zipfile(name,mode,mtime,data) ...
7812 **   SELECT zipfile(name,mode,mtime,data,method) ...
7813 */
7814 void zipfileStep(sqlite3_context *pCtx, int nVal, sqlite3_value **apVal){
7815   ZipfileCtx *p;                  /* Aggregate function context */
7816   ZipfileEntry e;                 /* New entry to add to zip archive */
7817 
7818   sqlite3_value *pName = 0;
7819   sqlite3_value *pMode = 0;
7820   sqlite3_value *pMtime = 0;
7821   sqlite3_value *pData = 0;
7822   sqlite3_value *pMethod = 0;
7823 
7824   int bIsDir = 0;
7825   u32 mode;
7826   int rc = SQLITE_OK;
7827   char *zErr = 0;
7828 
7829   int iMethod = -1;               /* Compression method to use (0 or 8) */
7830 
7831   const u8 *aData = 0;            /* Possibly compressed data for new entry */
7832   int nData = 0;                  /* Size of aData[] in bytes */
7833   int szUncompressed = 0;         /* Size of data before compression */
7834   u8 *aFree = 0;                  /* Free this before returning */
7835   u32 iCrc32 = 0;                 /* crc32 of uncompressed data */
7836 
7837   char *zName = 0;                /* Path (name) of new entry */
7838   int nName = 0;                  /* Size of zName in bytes */
7839   char *zFree = 0;                /* Free this before returning */
7840   int nByte;
7841 
7842   memset(&e, 0, sizeof(e));
7843   p = (ZipfileCtx*)sqlite3_aggregate_context(pCtx, sizeof(ZipfileCtx));
7844   if( p==0 ) return;
7845 
7846   /* Martial the arguments into stack variables */
7847   if( nVal!=2 && nVal!=4 && nVal!=5 ){
7848     zErr = sqlite3_mprintf("wrong number of arguments to function zipfile()");
7849     rc = SQLITE_ERROR;
7850     goto zipfile_step_out;
7851   }
7852   pName = apVal[0];
7853   if( nVal==2 ){
7854     pData = apVal[1];
7855   }else{
7856     pMode = apVal[1];
7857     pMtime = apVal[2];
7858     pData = apVal[3];
7859     if( nVal==5 ){
7860       pMethod = apVal[4];
7861     }
7862   }
7863 
7864   /* Check that the 'name' parameter looks ok. */
7865   zName = (char*)sqlite3_value_text(pName);
7866   nName = sqlite3_value_bytes(pName);
7867   if( zName==0 ){
7868     zErr = sqlite3_mprintf("first argument to zipfile() must be non-NULL");
7869     rc = SQLITE_ERROR;
7870     goto zipfile_step_out;
7871   }
7872 
7873   /* Inspect the 'method' parameter. This must be either 0 (store), 8 (use
7874   ** deflate compression) or NULL (choose automatically).  */
7875   if( pMethod && SQLITE_NULL!=sqlite3_value_type(pMethod) ){
7876     iMethod = (int)sqlite3_value_int64(pMethod);
7877     if( iMethod!=0 && iMethod!=8 ){
7878       zErr = sqlite3_mprintf("illegal method value: %d", iMethod);
7879       rc = SQLITE_ERROR;
7880       goto zipfile_step_out;
7881     }
7882   }
7883 
7884   /* Now inspect the data. If this is NULL, then the new entry must be a
7885   ** directory.  Otherwise, figure out whether or not the data should
7886   ** be deflated or simply stored in the zip archive. */
7887   if( sqlite3_value_type(pData)==SQLITE_NULL ){
7888     bIsDir = 1;
7889     iMethod = 0;
7890   }else{
7891     aData = sqlite3_value_blob(pData);
7892     szUncompressed = nData = sqlite3_value_bytes(pData);
7893     iCrc32 = crc32(0, aData, nData);
7894     if( iMethod<0 || iMethod==8 ){
7895       int nOut = 0;
7896       rc = zipfileDeflate(aData, nData, &aFree, &nOut, &zErr);
7897       if( rc!=SQLITE_OK ){
7898         goto zipfile_step_out;
7899       }
7900       if( iMethod==8 || nOut<nData ){
7901         aData = aFree;
7902         nData = nOut;
7903         iMethod = 8;
7904       }else{
7905         iMethod = 0;
7906       }
7907     }
7908   }
7909 
7910   /* Decode the "mode" argument. */
7911   rc = zipfileGetMode(pMode, bIsDir, &mode, &zErr);
7912   if( rc ) goto zipfile_step_out;
7913 
7914   /* Decode the "mtime" argument. */
7915   e.mUnixTime = zipfileGetTime(pMtime);
7916 
7917   /* If this is a directory entry, ensure that there is exactly one '/'
7918   ** at the end of the path. Or, if this is not a directory and the path
7919   ** ends in '/' it is an error. */
7920   if( bIsDir==0 ){
7921     if( nName>0 && zName[nName-1]=='/' ){
7922       zErr = sqlite3_mprintf("non-directory name must not end with /");
7923       rc = SQLITE_ERROR;
7924       goto zipfile_step_out;
7925     }
7926   }else{
7927     if( nName==0 || zName[nName-1]!='/' ){
7928       zName = zFree = sqlite3_mprintf("%s/", zName);
7929       if( zName==0 ){
7930         rc = SQLITE_NOMEM;
7931         goto zipfile_step_out;
7932       }
7933       nName = (int)strlen(zName);
7934     }else{
7935       while( nName>1 && zName[nName-2]=='/' ) nName--;
7936     }
7937   }
7938 
7939   /* Assemble the ZipfileEntry object for the new zip archive entry */
7940   e.cds.iVersionMadeBy = ZIPFILE_NEWENTRY_MADEBY;
7941   e.cds.iVersionExtract = ZIPFILE_NEWENTRY_REQUIRED;
7942   e.cds.flags = ZIPFILE_NEWENTRY_FLAGS;
7943   e.cds.iCompression = (u16)iMethod;
7944   zipfileMtimeToDos(&e.cds, (u32)e.mUnixTime);
7945   e.cds.crc32 = iCrc32;
7946   e.cds.szCompressed = nData;
7947   e.cds.szUncompressed = szUncompressed;
7948   e.cds.iExternalAttr = (mode<<16);
7949   e.cds.iOffset = p->body.n;
7950   e.cds.nFile = (u16)nName;
7951   e.cds.zFile = zName;
7952 
7953   /* Append the LFH to the body of the new archive */
7954   nByte = ZIPFILE_LFH_FIXED_SZ + e.cds.nFile + 9;
7955   if( (rc = zipfileBufferGrow(&p->body, nByte)) ) goto zipfile_step_out;
7956   p->body.n += zipfileSerializeLFH(&e, &p->body.a[p->body.n]);
7957 
7958   /* Append the data to the body of the new archive */
7959   if( nData>0 ){
7960     if( (rc = zipfileBufferGrow(&p->body, nData)) ) goto zipfile_step_out;
7961     memcpy(&p->body.a[p->body.n], aData, nData);
7962     p->body.n += nData;
7963   }
7964 
7965   /* Append the CDS record to the directory of the new archive */
7966   nByte = ZIPFILE_CDS_FIXED_SZ + e.cds.nFile + 9;
7967   if( (rc = zipfileBufferGrow(&p->cds, nByte)) ) goto zipfile_step_out;
7968   p->cds.n += zipfileSerializeCDS(&e, &p->cds.a[p->cds.n]);
7969 
7970   /* Increment the count of entries in the archive */
7971   p->nEntry++;
7972 
7973  zipfile_step_out:
7974   sqlite3_free(aFree);
7975   sqlite3_free(zFree);
7976   if( rc ){
7977     if( zErr ){
7978       sqlite3_result_error(pCtx, zErr, -1);
7979     }else{
7980       sqlite3_result_error_code(pCtx, rc);
7981     }
7982   }
7983   sqlite3_free(zErr);
7984 }
7985 
7986 /*
7987 ** xFinalize() callback for zipfile aggregate function.
7988 */
7989 void zipfileFinal(sqlite3_context *pCtx){
7990   ZipfileCtx *p;
7991   ZipfileEOCD eocd;
7992   sqlite3_int64 nZip;
7993   u8 *aZip;
7994 
7995   p = (ZipfileCtx*)sqlite3_aggregate_context(pCtx, sizeof(ZipfileCtx));
7996   if( p==0 ) return;
7997   if( p->nEntry>0 ){
7998     memset(&eocd, 0, sizeof(eocd));
7999     eocd.nEntry = (u16)p->nEntry;
8000     eocd.nEntryTotal = (u16)p->nEntry;
8001     eocd.nSize = p->cds.n;
8002     eocd.iOffset = p->body.n;
8003 
8004     nZip = p->body.n + p->cds.n + ZIPFILE_EOCD_FIXED_SZ;
8005     aZip = (u8*)sqlite3_malloc64(nZip);
8006     if( aZip==0 ){
8007       sqlite3_result_error_nomem(pCtx);
8008     }else{
8009       memcpy(aZip, p->body.a, p->body.n);
8010       memcpy(&aZip[p->body.n], p->cds.a, p->cds.n);
8011       zipfileSerializeEOCD(&eocd, &aZip[p->body.n + p->cds.n]);
8012       sqlite3_result_blob(pCtx, aZip, (int)nZip, zipfileFree);
8013     }
8014   }
8015 
8016   sqlite3_free(p->body.a);
8017   sqlite3_free(p->cds.a);
8018 }
8019 
8020 
8021 /*
8022 ** Register the "zipfile" virtual table.
8023 */
8024 static int zipfileRegister(sqlite3 *db){
8025   static sqlite3_module zipfileModule = {
8026     1,                         /* iVersion */
8027     zipfileConnect,            /* xCreate */
8028     zipfileConnect,            /* xConnect */
8029     zipfileBestIndex,          /* xBestIndex */
8030     zipfileDisconnect,         /* xDisconnect */
8031     zipfileDisconnect,         /* xDestroy */
8032     zipfileOpen,               /* xOpen - open a cursor */
8033     zipfileClose,              /* xClose - close a cursor */
8034     zipfileFilter,             /* xFilter - configure scan constraints */
8035     zipfileNext,               /* xNext - advance a cursor */
8036     zipfileEof,                /* xEof - check for end of scan */
8037     zipfileColumn,             /* xColumn - read data */
8038     0,                         /* xRowid - read data */
8039     zipfileUpdate,             /* xUpdate */
8040     zipfileBegin,              /* xBegin */
8041     0,                         /* xSync */
8042     zipfileCommit,             /* xCommit */
8043     zipfileRollback,           /* xRollback */
8044     zipfileFindFunction,       /* xFindMethod */
8045     0,                         /* xRename */
8046   };
8047 
8048   int rc = sqlite3_create_module(db, "zipfile"  , &zipfileModule, 0);
8049   if( rc==SQLITE_OK ) rc = sqlite3_overload_function(db, "zipfile_cds", -1);
8050   if( rc==SQLITE_OK ){
8051     rc = sqlite3_create_function(db, "zipfile", -1, SQLITE_UTF8, 0, 0,
8052         zipfileStep, zipfileFinal
8053     );
8054   }
8055   return rc;
8056 }
8057 #else         /* SQLITE_OMIT_VIRTUALTABLE */
8058 # define zipfileRegister(x) SQLITE_OK
8059 #endif
8060 
8061 #ifdef _WIN32
8062 
8063 #endif
8064 int sqlite3_zipfile_init(
8065   sqlite3 *db,
8066   char **pzErrMsg,
8067   const sqlite3_api_routines *pApi
8068 ){
8069   SQLITE_EXTENSION_INIT2(pApi);
8070   (void)pzErrMsg;  /* Unused parameter */
8071   return zipfileRegister(db);
8072 }
8073 
8074 /************************* End ../ext/misc/zipfile.c ********************/
8075 /************************* Begin ../ext/misc/sqlar.c ******************/
8076 /*
8077 ** 2017-12-17
8078 **
8079 ** The author disclaims copyright to this source code.  In place of
8080 ** a legal notice, here is a blessing:
8081 **
8082 **    May you do good and not evil.
8083 **    May you find forgiveness for yourself and forgive others.
8084 **    May you share freely, never taking more than you give.
8085 **
8086 ******************************************************************************
8087 **
8088 ** Utility functions sqlar_compress() and sqlar_uncompress(). Useful
8089 ** for working with sqlar archives and used by the shell tool's built-in
8090 ** sqlar support.
8091 */
8092 /* #include "sqlite3ext.h" */
8093 SQLITE_EXTENSION_INIT1
8094 #include <zlib.h>
8095 #include <assert.h>
8096 
8097 /*
8098 ** Implementation of the "sqlar_compress(X)" SQL function.
8099 **
8100 ** If the type of X is SQLITE_BLOB, and compressing that blob using
8101 ** zlib utility function compress() yields a smaller blob, return the
8102 ** compressed blob. Otherwise, return a copy of X.
8103 **
8104 ** SQLar uses the "zlib format" for compressed content.  The zlib format
8105 ** contains a two-byte identification header and a four-byte checksum at
8106 ** the end.  This is different from ZIP which uses the raw deflate format.
8107 **
8108 ** Future enhancements to SQLar might add support for new compression formats.
8109 ** If so, those new formats will be identified by alternative headers in the
8110 ** compressed data.
8111 */
8112 static void sqlarCompressFunc(
8113   sqlite3_context *context,
8114   int argc,
8115   sqlite3_value **argv
8116 ){
8117   assert( argc==1 );
8118   if( sqlite3_value_type(argv[0])==SQLITE_BLOB ){
8119     const Bytef *pData = sqlite3_value_blob(argv[0]);
8120     uLong nData = sqlite3_value_bytes(argv[0]);
8121     uLongf nOut = compressBound(nData);
8122     Bytef *pOut;
8123 
8124     pOut = (Bytef*)sqlite3_malloc(nOut);
8125     if( pOut==0 ){
8126       sqlite3_result_error_nomem(context);
8127       return;
8128     }else{
8129       if( Z_OK!=compress(pOut, &nOut, pData, nData) ){
8130         sqlite3_result_error(context, "error in compress()", -1);
8131       }else if( nOut<nData ){
8132         sqlite3_result_blob(context, pOut, nOut, SQLITE_TRANSIENT);
8133       }else{
8134         sqlite3_result_value(context, argv[0]);
8135       }
8136       sqlite3_free(pOut);
8137     }
8138   }else{
8139     sqlite3_result_value(context, argv[0]);
8140   }
8141 }
8142 
8143 /*
8144 ** Implementation of the "sqlar_uncompress(X,SZ)" SQL function
8145 **
8146 ** Parameter SZ is interpreted as an integer. If it is less than or
8147 ** equal to zero, then this function returns a copy of X. Or, if
8148 ** SZ is equal to the size of X when interpreted as a blob, also
8149 ** return a copy of X. Otherwise, decompress blob X using zlib
8150 ** utility function uncompress() and return the results (another
8151 ** blob).
8152 */
8153 static void sqlarUncompressFunc(
8154   sqlite3_context *context,
8155   int argc,
8156   sqlite3_value **argv
8157 ){
8158   uLong nData;
8159   uLongf sz;
8160 
8161   assert( argc==2 );
8162   sz = sqlite3_value_int(argv[1]);
8163 
8164   if( sz<=0 || sz==(nData = sqlite3_value_bytes(argv[0])) ){
8165     sqlite3_result_value(context, argv[0]);
8166   }else{
8167     const Bytef *pData= sqlite3_value_blob(argv[0]);
8168     Bytef *pOut = sqlite3_malloc(sz);
8169     if( Z_OK!=uncompress(pOut, &sz, pData, nData) ){
8170       sqlite3_result_error(context, "error in uncompress()", -1);
8171     }else{
8172       sqlite3_result_blob(context, pOut, sz, SQLITE_TRANSIENT);
8173     }
8174     sqlite3_free(pOut);
8175   }
8176 }
8177 
8178 
8179 #ifdef _WIN32
8180 
8181 #endif
8182 int sqlite3_sqlar_init(
8183   sqlite3 *db,
8184   char **pzErrMsg,
8185   const sqlite3_api_routines *pApi
8186 ){
8187   int rc = SQLITE_OK;
8188   SQLITE_EXTENSION_INIT2(pApi);
8189   (void)pzErrMsg;  /* Unused parameter */
8190   rc = sqlite3_create_function(db, "sqlar_compress", 1,
8191                                SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
8192                                sqlarCompressFunc, 0, 0);
8193   if( rc==SQLITE_OK ){
8194     rc = sqlite3_create_function(db, "sqlar_uncompress", 2,
8195                                  SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
8196                                  sqlarUncompressFunc, 0, 0);
8197   }
8198   return rc;
8199 }
8200 
8201 /************************* End ../ext/misc/sqlar.c ********************/
8202 #endif
8203 /************************* Begin ../ext/expert/sqlite3expert.h ******************/
8204 /*
8205 ** 2017 April 07
8206 **
8207 ** The author disclaims copyright to this source code.  In place of
8208 ** a legal notice, here is a blessing:
8209 **
8210 **    May you do good and not evil.
8211 **    May you find forgiveness for yourself and forgive others.
8212 **    May you share freely, never taking more than you give.
8213 **
8214 *************************************************************************
8215 */
8216 #if !defined(SQLITEEXPERT_H)
8217 #define SQLITEEXPERT_H 1
8218 /* #include "sqlite3.h" */
8219 
8220 typedef struct sqlite3expert sqlite3expert;
8221 
8222 /*
8223 ** Create a new sqlite3expert object.
8224 **
8225 ** If successful, a pointer to the new object is returned and (*pzErr) set
8226 ** to NULL. Or, if an error occurs, NULL is returned and (*pzErr) set to
8227 ** an English-language error message. In this case it is the responsibility
8228 ** of the caller to eventually free the error message buffer using
8229 ** sqlite3_free().
8230 */
8231 sqlite3expert *sqlite3_expert_new(sqlite3 *db, char **pzErr);
8232 
8233 /*
8234 ** Configure an sqlite3expert object.
8235 **
8236 ** EXPERT_CONFIG_SAMPLE:
8237 **   By default, sqlite3_expert_analyze() generates sqlite_stat1 data for
8238 **   each candidate index. This involves scanning and sorting the entire
8239 **   contents of each user database table once for each candidate index
8240 **   associated with the table. For large databases, this can be
8241 **   prohibitively slow. This option allows the sqlite3expert object to
8242 **   be configured so that sqlite_stat1 data is instead generated based on a
8243 **   subset of each table, or so that no sqlite_stat1 data is used at all.
8244 **
8245 **   A single integer argument is passed to this option. If the value is less
8246 **   than or equal to zero, then no sqlite_stat1 data is generated or used by
8247 **   the analysis - indexes are recommended based on the database schema only.
8248 **   Or, if the value is 100 or greater, complete sqlite_stat1 data is
8249 **   generated for each candidate index (this is the default). Finally, if the
8250 **   value falls between 0 and 100, then it represents the percentage of user
8251 **   table rows that should be considered when generating sqlite_stat1 data.
8252 **
8253 **   Examples:
8254 **
8255 **     // Do not generate any sqlite_stat1 data
8256 **     sqlite3_expert_config(pExpert, EXPERT_CONFIG_SAMPLE, 0);
8257 **
8258 **     // Generate sqlite_stat1 data based on 10% of the rows in each table.
8259 **     sqlite3_expert_config(pExpert, EXPERT_CONFIG_SAMPLE, 10);
8260 */
8261 int sqlite3_expert_config(sqlite3expert *p, int op, ...);
8262 
8263 #define EXPERT_CONFIG_SAMPLE 1    /* int */
8264 
8265 /*
8266 ** Specify zero or more SQL statements to be included in the analysis.
8267 **
8268 ** Buffer zSql must contain zero or more complete SQL statements. This
8269 ** function parses all statements contained in the buffer and adds them
8270 ** to the internal list of statements to analyze. If successful, SQLITE_OK
8271 ** is returned and (*pzErr) set to NULL. Or, if an error occurs - for example
8272 ** due to a error in the SQL - an SQLite error code is returned and (*pzErr)
8273 ** may be set to point to an English language error message. In this case
8274 ** the caller is responsible for eventually freeing the error message buffer
8275 ** using sqlite3_free().
8276 **
8277 ** If an error does occur while processing one of the statements in the
8278 ** buffer passed as the second argument, none of the statements in the
8279 ** buffer are added to the analysis.
8280 **
8281 ** This function must be called before sqlite3_expert_analyze(). If a call
8282 ** to this function is made on an sqlite3expert object that has already
8283 ** been passed to sqlite3_expert_analyze() SQLITE_MISUSE is returned
8284 ** immediately and no statements are added to the analysis.
8285 */
8286 int sqlite3_expert_sql(
8287   sqlite3expert *p,               /* From a successful sqlite3_expert_new() */
8288   const char *zSql,               /* SQL statement(s) to add */
8289   char **pzErr                    /* OUT: Error message (if any) */
8290 );
8291 
8292 
8293 /*
8294 ** This function is called after the sqlite3expert object has been configured
8295 ** with all SQL statements using sqlite3_expert_sql() to actually perform
8296 ** the analysis. Once this function has been called, it is not possible to
8297 ** add further SQL statements to the analysis.
8298 **
8299 ** If successful, SQLITE_OK is returned and (*pzErr) is set to NULL. Or, if
8300 ** an error occurs, an SQLite error code is returned and (*pzErr) set to
8301 ** point to a buffer containing an English language error message. In this
8302 ** case it is the responsibility of the caller to eventually free the buffer
8303 ** using sqlite3_free().
8304 **
8305 ** If an error does occur within this function, the sqlite3expert object
8306 ** is no longer useful for any purpose. At that point it is no longer
8307 ** possible to add further SQL statements to the object or to re-attempt
8308 ** the analysis. The sqlite3expert object must still be freed using a call
8309 ** sqlite3_expert_destroy().
8310 */
8311 int sqlite3_expert_analyze(sqlite3expert *p, char **pzErr);
8312 
8313 /*
8314 ** Return the total number of statements loaded using sqlite3_expert_sql().
8315 ** The total number of SQL statements may be different from the total number
8316 ** to calls to sqlite3_expert_sql().
8317 */
8318 int sqlite3_expert_count(sqlite3expert*);
8319 
8320 /*
8321 ** Return a component of the report.
8322 **
8323 ** This function is called after sqlite3_expert_analyze() to extract the
8324 ** results of the analysis. Each call to this function returns either a
8325 ** NULL pointer or a pointer to a buffer containing a nul-terminated string.
8326 ** The value passed as the third argument must be one of the EXPERT_REPORT_*
8327 ** #define constants defined below.
8328 **
8329 ** For some EXPERT_REPORT_* parameters, the buffer returned contains
8330 ** information relating to a specific SQL statement. In these cases that
8331 ** SQL statement is identified by the value passed as the second argument.
8332 ** SQL statements are numbered from 0 in the order in which they are parsed.
8333 ** If an out-of-range value (less than zero or equal to or greater than the
8334 ** value returned by sqlite3_expert_count()) is passed as the second argument
8335 ** along with such an EXPERT_REPORT_* parameter, NULL is always returned.
8336 **
8337 ** EXPERT_REPORT_SQL:
8338 **   Return the text of SQL statement iStmt.
8339 **
8340 ** EXPERT_REPORT_INDEXES:
8341 **   Return a buffer containing the CREATE INDEX statements for all recommended
8342 **   indexes for statement iStmt. If there are no new recommeded indexes, NULL
8343 **   is returned.
8344 **
8345 ** EXPERT_REPORT_PLAN:
8346 **   Return a buffer containing the EXPLAIN QUERY PLAN output for SQL query
8347 **   iStmt after the proposed indexes have been added to the database schema.
8348 **
8349 ** EXPERT_REPORT_CANDIDATES:
8350 **   Return a pointer to a buffer containing the CREATE INDEX statements
8351 **   for all indexes that were tested (for all SQL statements). The iStmt
8352 **   parameter is ignored for EXPERT_REPORT_CANDIDATES calls.
8353 */
8354 const char *sqlite3_expert_report(sqlite3expert*, int iStmt, int eReport);
8355 
8356 /*
8357 ** Values for the third argument passed to sqlite3_expert_report().
8358 */
8359 #define EXPERT_REPORT_SQL        1
8360 #define EXPERT_REPORT_INDEXES    2
8361 #define EXPERT_REPORT_PLAN       3
8362 #define EXPERT_REPORT_CANDIDATES 4
8363 
8364 /*
8365 ** Free an (sqlite3expert*) handle and all associated resources. There
8366 ** should be one call to this function for each successful call to
8367 ** sqlite3-expert_new().
8368 */
8369 void sqlite3_expert_destroy(sqlite3expert*);
8370 
8371 #endif  /* !defined(SQLITEEXPERT_H) */
8372 
8373 /************************* End ../ext/expert/sqlite3expert.h ********************/
8374 /************************* Begin ../ext/expert/sqlite3expert.c ******************/
8375 /*
8376 ** 2017 April 09
8377 **
8378 ** The author disclaims copyright to this source code.  In place of
8379 ** a legal notice, here is a blessing:
8380 **
8381 **    May you do good and not evil.
8382 **    May you find forgiveness for yourself and forgive others.
8383 **    May you share freely, never taking more than you give.
8384 **
8385 *************************************************************************
8386 */
8387 /* #include "sqlite3expert.h" */
8388 #include <assert.h>
8389 #include <string.h>
8390 #include <stdio.h>
8391 
8392 #ifndef SQLITE_OMIT_VIRTUALTABLE
8393 
8394 /* typedef sqlite3_int64 i64; */
8395 /* typedef sqlite3_uint64 u64; */
8396 
8397 typedef struct IdxColumn IdxColumn;
8398 typedef struct IdxConstraint IdxConstraint;
8399 typedef struct IdxScan IdxScan;
8400 typedef struct IdxStatement IdxStatement;
8401 typedef struct IdxTable IdxTable;
8402 typedef struct IdxWrite IdxWrite;
8403 
8404 #define STRLEN  (int)strlen
8405 
8406 /*
8407 ** A temp table name that we assume no user database will actually use.
8408 ** If this assumption proves incorrect triggers on the table with the
8409 ** conflicting name will be ignored.
8410 */
8411 #define UNIQUE_TABLE_NAME "t592690916721053953805701627921227776"
8412 
8413 /*
8414 ** A single constraint. Equivalent to either "col = ?" or "col < ?" (or
8415 ** any other type of single-ended range constraint on a column).
8416 **
8417 ** pLink:
8418 **   Used to temporarily link IdxConstraint objects into lists while
8419 **   creating candidate indexes.
8420 */
8421 struct IdxConstraint {
8422   char *zColl;                    /* Collation sequence */
8423   int bRange;                     /* True for range, false for eq */
8424   int iCol;                       /* Constrained table column */
8425   int bFlag;                      /* Used by idxFindCompatible() */
8426   int bDesc;                      /* True if ORDER BY <expr> DESC */
8427   IdxConstraint *pNext;           /* Next constraint in pEq or pRange list */
8428   IdxConstraint *pLink;           /* See above */
8429 };
8430 
8431 /*
8432 ** A single scan of a single table.
8433 */
8434 struct IdxScan {
8435   IdxTable *pTab;                 /* Associated table object */
8436   int iDb;                        /* Database containing table zTable */
8437   i64 covering;                   /* Mask of columns required for cov. index */
8438   IdxConstraint *pOrder;          /* ORDER BY columns */
8439   IdxConstraint *pEq;             /* List of == constraints */
8440   IdxConstraint *pRange;          /* List of < constraints */
8441   IdxScan *pNextScan;             /* Next IdxScan object for same analysis */
8442 };
8443 
8444 /*
8445 ** Information regarding a single database table. Extracted from
8446 ** "PRAGMA table_info" by function idxGetTableInfo().
8447 */
8448 struct IdxColumn {
8449   char *zName;
8450   char *zColl;
8451   int iPk;
8452 };
8453 struct IdxTable {
8454   int nCol;
8455   char *zName;                    /* Table name */
8456   IdxColumn *aCol;
8457   IdxTable *pNext;                /* Next table in linked list of all tables */
8458 };
8459 
8460 /*
8461 ** An object of the following type is created for each unique table/write-op
8462 ** seen. The objects are stored in a singly-linked list beginning at
8463 ** sqlite3expert.pWrite.
8464 */
8465 struct IdxWrite {
8466   IdxTable *pTab;
8467   int eOp;                        /* SQLITE_UPDATE, DELETE or INSERT */
8468   IdxWrite *pNext;
8469 };
8470 
8471 /*
8472 ** Each statement being analyzed is represented by an instance of this
8473 ** structure.
8474 */
8475 struct IdxStatement {
8476   int iId;                        /* Statement number */
8477   char *zSql;                     /* SQL statement */
8478   char *zIdx;                     /* Indexes */
8479   char *zEQP;                     /* Plan */
8480   IdxStatement *pNext;
8481 };
8482 
8483 
8484 /*
8485 ** A hash table for storing strings. With space for a payload string
8486 ** with each entry. Methods are:
8487 **
8488 **   idxHashInit()
8489 **   idxHashClear()
8490 **   idxHashAdd()
8491 **   idxHashSearch()
8492 */
8493 #define IDX_HASH_SIZE 1023
8494 typedef struct IdxHashEntry IdxHashEntry;
8495 typedef struct IdxHash IdxHash;
8496 struct IdxHashEntry {
8497   char *zKey;                     /* nul-terminated key */
8498   char *zVal;                     /* nul-terminated value string */
8499   char *zVal2;                    /* nul-terminated value string 2 */
8500   IdxHashEntry *pHashNext;        /* Next entry in same hash bucket */
8501   IdxHashEntry *pNext;            /* Next entry in hash */
8502 };
8503 struct IdxHash {
8504   IdxHashEntry *pFirst;
8505   IdxHashEntry *aHash[IDX_HASH_SIZE];
8506 };
8507 
8508 /*
8509 ** sqlite3expert object.
8510 */
8511 struct sqlite3expert {
8512   int iSample;                    /* Percentage of tables to sample for stat1 */
8513   sqlite3 *db;                    /* User database */
8514   sqlite3 *dbm;                   /* In-memory db for this analysis */
8515   sqlite3 *dbv;                   /* Vtab schema for this analysis */
8516   IdxTable *pTable;               /* List of all IdxTable objects */
8517   IdxScan *pScan;                 /* List of scan objects */
8518   IdxWrite *pWrite;               /* List of write objects */
8519   IdxStatement *pStatement;       /* List of IdxStatement objects */
8520   int bRun;                       /* True once analysis has run */
8521   char **pzErrmsg;
8522   int rc;                         /* Error code from whereinfo hook */
8523   IdxHash hIdx;                   /* Hash containing all candidate indexes */
8524   char *zCandidates;              /* For EXPERT_REPORT_CANDIDATES */
8525 };
8526 
8527 
8528 /*
8529 ** Allocate and return nByte bytes of zeroed memory using sqlite3_malloc().
8530 ** If the allocation fails, set *pRc to SQLITE_NOMEM and return NULL.
8531 */
8532 static void *idxMalloc(int *pRc, int nByte){
8533   void *pRet;
8534   assert( *pRc==SQLITE_OK );
8535   assert( nByte>0 );
8536   pRet = sqlite3_malloc(nByte);
8537   if( pRet ){
8538     memset(pRet, 0, nByte);
8539   }else{
8540     *pRc = SQLITE_NOMEM;
8541   }
8542   return pRet;
8543 }
8544 
8545 /*
8546 ** Initialize an IdxHash hash table.
8547 */
8548 static void idxHashInit(IdxHash *pHash){
8549   memset(pHash, 0, sizeof(IdxHash));
8550 }
8551 
8552 /*
8553 ** Reset an IdxHash hash table.
8554 */
8555 static void idxHashClear(IdxHash *pHash){
8556   int i;
8557   for(i=0; i<IDX_HASH_SIZE; i++){
8558     IdxHashEntry *pEntry;
8559     IdxHashEntry *pNext;
8560     for(pEntry=pHash->aHash[i]; pEntry; pEntry=pNext){
8561       pNext = pEntry->pHashNext;
8562       sqlite3_free(pEntry->zVal2);
8563       sqlite3_free(pEntry);
8564     }
8565   }
8566   memset(pHash, 0, sizeof(IdxHash));
8567 }
8568 
8569 /*
8570 ** Return the index of the hash bucket that the string specified by the
8571 ** arguments to this function belongs.
8572 */
8573 static int idxHashString(const char *z, int n){
8574   unsigned int ret = 0;
8575   int i;
8576   for(i=0; i<n; i++){
8577     ret += (ret<<3) + (unsigned char)(z[i]);
8578   }
8579   return (int)(ret % IDX_HASH_SIZE);
8580 }
8581 
8582 /*
8583 ** If zKey is already present in the hash table, return non-zero and do
8584 ** nothing. Otherwise, add an entry with key zKey and payload string zVal to
8585 ** the hash table passed as the second argument.
8586 */
8587 static int idxHashAdd(
8588   int *pRc,
8589   IdxHash *pHash,
8590   const char *zKey,
8591   const char *zVal
8592 ){
8593   int nKey = STRLEN(zKey);
8594   int iHash = idxHashString(zKey, nKey);
8595   int nVal = (zVal ? STRLEN(zVal) : 0);
8596   IdxHashEntry *pEntry;
8597   assert( iHash>=0 );
8598   for(pEntry=pHash->aHash[iHash]; pEntry; pEntry=pEntry->pHashNext){
8599     if( STRLEN(pEntry->zKey)==nKey && 0==memcmp(pEntry->zKey, zKey, nKey) ){
8600       return 1;
8601     }
8602   }
8603   pEntry = idxMalloc(pRc, sizeof(IdxHashEntry) + nKey+1 + nVal+1);
8604   if( pEntry ){
8605     pEntry->zKey = (char*)&pEntry[1];
8606     memcpy(pEntry->zKey, zKey, nKey);
8607     if( zVal ){
8608       pEntry->zVal = &pEntry->zKey[nKey+1];
8609       memcpy(pEntry->zVal, zVal, nVal);
8610     }
8611     pEntry->pHashNext = pHash->aHash[iHash];
8612     pHash->aHash[iHash] = pEntry;
8613 
8614     pEntry->pNext = pHash->pFirst;
8615     pHash->pFirst = pEntry;
8616   }
8617   return 0;
8618 }
8619 
8620 /*
8621 ** If zKey/nKey is present in the hash table, return a pointer to the
8622 ** hash-entry object.
8623 */
8624 static IdxHashEntry *idxHashFind(IdxHash *pHash, const char *zKey, int nKey){
8625   int iHash;
8626   IdxHashEntry *pEntry;
8627   if( nKey<0 ) nKey = STRLEN(zKey);
8628   iHash = idxHashString(zKey, nKey);
8629   assert( iHash>=0 );
8630   for(pEntry=pHash->aHash[iHash]; pEntry; pEntry=pEntry->pHashNext){
8631     if( STRLEN(pEntry->zKey)==nKey && 0==memcmp(pEntry->zKey, zKey, nKey) ){
8632       return pEntry;
8633     }
8634   }
8635   return 0;
8636 }
8637 
8638 /*
8639 ** If the hash table contains an entry with a key equal to the string
8640 ** passed as the final two arguments to this function, return a pointer
8641 ** to the payload string. Otherwise, if zKey/nKey is not present in the
8642 ** hash table, return NULL.
8643 */
8644 static const char *idxHashSearch(IdxHash *pHash, const char *zKey, int nKey){
8645   IdxHashEntry *pEntry = idxHashFind(pHash, zKey, nKey);
8646   if( pEntry ) return pEntry->zVal;
8647   return 0;
8648 }
8649 
8650 /*
8651 ** Allocate and return a new IdxConstraint object. Set the IdxConstraint.zColl
8652 ** variable to point to a copy of nul-terminated string zColl.
8653 */
8654 static IdxConstraint *idxNewConstraint(int *pRc, const char *zColl){
8655   IdxConstraint *pNew;
8656   int nColl = STRLEN(zColl);
8657 
8658   assert( *pRc==SQLITE_OK );
8659   pNew = (IdxConstraint*)idxMalloc(pRc, sizeof(IdxConstraint) * nColl + 1);
8660   if( pNew ){
8661     pNew->zColl = (char*)&pNew[1];
8662     memcpy(pNew->zColl, zColl, nColl+1);
8663   }
8664   return pNew;
8665 }
8666 
8667 /*
8668 ** An error associated with database handle db has just occurred. Pass
8669 ** the error message to callback function xOut.
8670 */
8671 static void idxDatabaseError(
8672   sqlite3 *db,                    /* Database handle */
8673   char **pzErrmsg                 /* Write error here */
8674 ){
8675   *pzErrmsg = sqlite3_mprintf("%s", sqlite3_errmsg(db));
8676 }
8677 
8678 /*
8679 ** Prepare an SQL statement.
8680 */
8681 static int idxPrepareStmt(
8682   sqlite3 *db,                    /* Database handle to compile against */
8683   sqlite3_stmt **ppStmt,          /* OUT: Compiled SQL statement */
8684   char **pzErrmsg,                /* OUT: sqlite3_malloc()ed error message */
8685   const char *zSql                /* SQL statement to compile */
8686 ){
8687   int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0);
8688   if( rc!=SQLITE_OK ){
8689     *ppStmt = 0;
8690     idxDatabaseError(db, pzErrmsg);
8691   }
8692   return rc;
8693 }
8694 
8695 /*
8696 ** Prepare an SQL statement using the results of a printf() formatting.
8697 */
8698 static int idxPrintfPrepareStmt(
8699   sqlite3 *db,                    /* Database handle to compile against */
8700   sqlite3_stmt **ppStmt,          /* OUT: Compiled SQL statement */
8701   char **pzErrmsg,                /* OUT: sqlite3_malloc()ed error message */
8702   const char *zFmt,               /* printf() format of SQL statement */
8703   ...                             /* Trailing printf() arguments */
8704 ){
8705   va_list ap;
8706   int rc;
8707   char *zSql;
8708   va_start(ap, zFmt);
8709   zSql = sqlite3_vmprintf(zFmt, ap);
8710   if( zSql==0 ){
8711     rc = SQLITE_NOMEM;
8712   }else{
8713     rc = idxPrepareStmt(db, ppStmt, pzErrmsg, zSql);
8714     sqlite3_free(zSql);
8715   }
8716   va_end(ap);
8717   return rc;
8718 }
8719 
8720 
8721 /*************************************************************************
8722 ** Beginning of virtual table implementation.
8723 */
8724 typedef struct ExpertVtab ExpertVtab;
8725 struct ExpertVtab {
8726   sqlite3_vtab base;
8727   IdxTable *pTab;
8728   sqlite3expert *pExpert;
8729 };
8730 
8731 typedef struct ExpertCsr ExpertCsr;
8732 struct ExpertCsr {
8733   sqlite3_vtab_cursor base;
8734   sqlite3_stmt *pData;
8735 };
8736 
8737 static char *expertDequote(const char *zIn){
8738   int n = STRLEN(zIn);
8739   char *zRet = sqlite3_malloc(n);
8740 
8741   assert( zIn[0]=='\'' );
8742   assert( zIn[n-1]=='\'' );
8743 
8744   if( zRet ){
8745     int iOut = 0;
8746     int iIn = 0;
8747     for(iIn=1; iIn<(n-1); iIn++){
8748       if( zIn[iIn]=='\'' ){
8749         assert( zIn[iIn+1]=='\'' );
8750         iIn++;
8751       }
8752       zRet[iOut++] = zIn[iIn];
8753     }
8754     zRet[iOut] = '\0';
8755   }
8756 
8757   return zRet;
8758 }
8759 
8760 /*
8761 ** This function is the implementation of both the xConnect and xCreate
8762 ** methods of the r-tree virtual table.
8763 **
8764 **   argv[0]   -> module name
8765 **   argv[1]   -> database name
8766 **   argv[2]   -> table name
8767 **   argv[...] -> column names...
8768 */
8769 static int expertConnect(
8770   sqlite3 *db,
8771   void *pAux,
8772   int argc, const char *const*argv,
8773   sqlite3_vtab **ppVtab,
8774   char **pzErr
8775 ){
8776   sqlite3expert *pExpert = (sqlite3expert*)pAux;
8777   ExpertVtab *p = 0;
8778   int rc;
8779 
8780   if( argc!=4 ){
8781     *pzErr = sqlite3_mprintf("internal error!");
8782     rc = SQLITE_ERROR;
8783   }else{
8784     char *zCreateTable = expertDequote(argv[3]);
8785     if( zCreateTable ){
8786       rc = sqlite3_declare_vtab(db, zCreateTable);
8787       if( rc==SQLITE_OK ){
8788         p = idxMalloc(&rc, sizeof(ExpertVtab));
8789       }
8790       if( rc==SQLITE_OK ){
8791         p->pExpert = pExpert;
8792         p->pTab = pExpert->pTable;
8793         assert( sqlite3_stricmp(p->pTab->zName, argv[2])==0 );
8794       }
8795       sqlite3_free(zCreateTable);
8796     }else{
8797       rc = SQLITE_NOMEM;
8798     }
8799   }
8800 
8801   *ppVtab = (sqlite3_vtab*)p;
8802   return rc;
8803 }
8804 
8805 static int expertDisconnect(sqlite3_vtab *pVtab){
8806   ExpertVtab *p = (ExpertVtab*)pVtab;
8807   sqlite3_free(p);
8808   return SQLITE_OK;
8809 }
8810 
8811 static int expertBestIndex(sqlite3_vtab *pVtab, sqlite3_index_info *pIdxInfo){
8812   ExpertVtab *p = (ExpertVtab*)pVtab;
8813   int rc = SQLITE_OK;
8814   int n = 0;
8815   IdxScan *pScan;
8816   const int opmask =
8817     SQLITE_INDEX_CONSTRAINT_EQ | SQLITE_INDEX_CONSTRAINT_GT |
8818     SQLITE_INDEX_CONSTRAINT_LT | SQLITE_INDEX_CONSTRAINT_GE |
8819     SQLITE_INDEX_CONSTRAINT_LE;
8820 
8821   pScan = idxMalloc(&rc, sizeof(IdxScan));
8822   if( pScan ){
8823     int i;
8824 
8825     /* Link the new scan object into the list */
8826     pScan->pTab = p->pTab;
8827     pScan->pNextScan = p->pExpert->pScan;
8828     p->pExpert->pScan = pScan;
8829 
8830     /* Add the constraints to the IdxScan object */
8831     for(i=0; i<pIdxInfo->nConstraint; i++){
8832       struct sqlite3_index_constraint *pCons = &pIdxInfo->aConstraint[i];
8833       if( pCons->usable
8834        && pCons->iColumn>=0
8835        && p->pTab->aCol[pCons->iColumn].iPk==0
8836        && (pCons->op & opmask)
8837       ){
8838         IdxConstraint *pNew;
8839         const char *zColl = sqlite3_vtab_collation(pIdxInfo, i);
8840         pNew = idxNewConstraint(&rc, zColl);
8841         if( pNew ){
8842           pNew->iCol = pCons->iColumn;
8843           if( pCons->op==SQLITE_INDEX_CONSTRAINT_EQ ){
8844             pNew->pNext = pScan->pEq;
8845             pScan->pEq = pNew;
8846           }else{
8847             pNew->bRange = 1;
8848             pNew->pNext = pScan->pRange;
8849             pScan->pRange = pNew;
8850           }
8851         }
8852         n++;
8853         pIdxInfo->aConstraintUsage[i].argvIndex = n;
8854       }
8855     }
8856 
8857     /* Add the ORDER BY to the IdxScan object */
8858     for(i=pIdxInfo->nOrderBy-1; i>=0; i--){
8859       int iCol = pIdxInfo->aOrderBy[i].iColumn;
8860       if( iCol>=0 ){
8861         IdxConstraint *pNew = idxNewConstraint(&rc, p->pTab->aCol[iCol].zColl);
8862         if( pNew ){
8863           pNew->iCol = iCol;
8864           pNew->bDesc = pIdxInfo->aOrderBy[i].desc;
8865           pNew->pNext = pScan->pOrder;
8866           pNew->pLink = pScan->pOrder;
8867           pScan->pOrder = pNew;
8868           n++;
8869         }
8870       }
8871     }
8872   }
8873 
8874   pIdxInfo->estimatedCost = 1000000.0 / (n+1);
8875   return rc;
8876 }
8877 
8878 static int expertUpdate(
8879   sqlite3_vtab *pVtab,
8880   int nData,
8881   sqlite3_value **azData,
8882   sqlite_int64 *pRowid
8883 ){
8884   (void)pVtab;
8885   (void)nData;
8886   (void)azData;
8887   (void)pRowid;
8888   return SQLITE_OK;
8889 }
8890 
8891 /*
8892 ** Virtual table module xOpen method.
8893 */
8894 static int expertOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){
8895   int rc = SQLITE_OK;
8896   ExpertCsr *pCsr;
8897   (void)pVTab;
8898   pCsr = idxMalloc(&rc, sizeof(ExpertCsr));
8899   *ppCursor = (sqlite3_vtab_cursor*)pCsr;
8900   return rc;
8901 }
8902 
8903 /*
8904 ** Virtual table module xClose method.
8905 */
8906 static int expertClose(sqlite3_vtab_cursor *cur){
8907   ExpertCsr *pCsr = (ExpertCsr*)cur;
8908   sqlite3_finalize(pCsr->pData);
8909   sqlite3_free(pCsr);
8910   return SQLITE_OK;
8911 }
8912 
8913 /*
8914 ** Virtual table module xEof method.
8915 **
8916 ** Return non-zero if the cursor does not currently point to a valid
8917 ** record (i.e if the scan has finished), or zero otherwise.
8918 */
8919 static int expertEof(sqlite3_vtab_cursor *cur){
8920   ExpertCsr *pCsr = (ExpertCsr*)cur;
8921   return pCsr->pData==0;
8922 }
8923 
8924 /*
8925 ** Virtual table module xNext method.
8926 */
8927 static int expertNext(sqlite3_vtab_cursor *cur){
8928   ExpertCsr *pCsr = (ExpertCsr*)cur;
8929   int rc = SQLITE_OK;
8930 
8931   assert( pCsr->pData );
8932   rc = sqlite3_step(pCsr->pData);
8933   if( rc!=SQLITE_ROW ){
8934     rc = sqlite3_finalize(pCsr->pData);
8935     pCsr->pData = 0;
8936   }else{
8937     rc = SQLITE_OK;
8938   }
8939 
8940   return rc;
8941 }
8942 
8943 /*
8944 ** Virtual table module xRowid method.
8945 */
8946 static int expertRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
8947   (void)cur;
8948   *pRowid = 0;
8949   return SQLITE_OK;
8950 }
8951 
8952 /*
8953 ** Virtual table module xColumn method.
8954 */
8955 static int expertColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){
8956   ExpertCsr *pCsr = (ExpertCsr*)cur;
8957   sqlite3_value *pVal;
8958   pVal = sqlite3_column_value(pCsr->pData, i);
8959   if( pVal ){
8960     sqlite3_result_value(ctx, pVal);
8961   }
8962   return SQLITE_OK;
8963 }
8964 
8965 /*
8966 ** Virtual table module xFilter method.
8967 */
8968 static int expertFilter(
8969   sqlite3_vtab_cursor *cur,
8970   int idxNum, const char *idxStr,
8971   int argc, sqlite3_value **argv
8972 ){
8973   ExpertCsr *pCsr = (ExpertCsr*)cur;
8974   ExpertVtab *pVtab = (ExpertVtab*)(cur->pVtab);
8975   sqlite3expert *pExpert = pVtab->pExpert;
8976   int rc;
8977 
8978   (void)idxNum;
8979   (void)idxStr;
8980   (void)argc;
8981   (void)argv;
8982   rc = sqlite3_finalize(pCsr->pData);
8983   pCsr->pData = 0;
8984   if( rc==SQLITE_OK ){
8985     rc = idxPrintfPrepareStmt(pExpert->db, &pCsr->pData, &pVtab->base.zErrMsg,
8986         "SELECT * FROM main.%Q WHERE sample()", pVtab->pTab->zName
8987     );
8988   }
8989 
8990   if( rc==SQLITE_OK ){
8991     rc = expertNext(cur);
8992   }
8993   return rc;
8994 }
8995 
8996 static int idxRegisterVtab(sqlite3expert *p){
8997   static sqlite3_module expertModule = {
8998     2,                            /* iVersion */
8999     expertConnect,                /* xCreate - create a table */
9000     expertConnect,                /* xConnect - connect to an existing table */
9001     expertBestIndex,              /* xBestIndex - Determine search strategy */
9002     expertDisconnect,             /* xDisconnect - Disconnect from a table */
9003     expertDisconnect,             /* xDestroy - Drop a table */
9004     expertOpen,                   /* xOpen - open a cursor */
9005     expertClose,                  /* xClose - close a cursor */
9006     expertFilter,                 /* xFilter - configure scan constraints */
9007     expertNext,                   /* xNext - advance a cursor */
9008     expertEof,                    /* xEof */
9009     expertColumn,                 /* xColumn - read data */
9010     expertRowid,                  /* xRowid - read data */
9011     expertUpdate,                 /* xUpdate - write data */
9012     0,                            /* xBegin - begin transaction */
9013     0,                            /* xSync - sync transaction */
9014     0,                            /* xCommit - commit transaction */
9015     0,                            /* xRollback - rollback transaction */
9016     0,                            /* xFindFunction - function overloading */
9017     0,                            /* xRename - rename the table */
9018     0,                            /* xSavepoint */
9019     0,                            /* xRelease */
9020     0,                            /* xRollbackTo */
9021     0,                            /* xShadowName */
9022   };
9023 
9024   return sqlite3_create_module(p->dbv, "expert", &expertModule, (void*)p);
9025 }
9026 /*
9027 ** End of virtual table implementation.
9028 *************************************************************************/
9029 /*
9030 ** Finalize SQL statement pStmt. If (*pRc) is SQLITE_OK when this function
9031 ** is called, set it to the return value of sqlite3_finalize() before
9032 ** returning. Otherwise, discard the sqlite3_finalize() return value.
9033 */
9034 static void idxFinalize(int *pRc, sqlite3_stmt *pStmt){
9035   int rc = sqlite3_finalize(pStmt);
9036   if( *pRc==SQLITE_OK ) *pRc = rc;
9037 }
9038 
9039 /*
9040 ** Attempt to allocate an IdxTable structure corresponding to table zTab
9041 ** in the main database of connection db. If successful, set (*ppOut) to
9042 ** point to the new object and return SQLITE_OK. Otherwise, return an
9043 ** SQLite error code and set (*ppOut) to NULL. In this case *pzErrmsg may be
9044 ** set to point to an error string.
9045 **
9046 ** It is the responsibility of the caller to eventually free either the
9047 ** IdxTable object or error message using sqlite3_free().
9048 */
9049 static int idxGetTableInfo(
9050   sqlite3 *db,                    /* Database connection to read details from */
9051   const char *zTab,               /* Table name */
9052   IdxTable **ppOut,               /* OUT: New object (if successful) */
9053   char **pzErrmsg                 /* OUT: Error message (if not) */
9054 ){
9055   sqlite3_stmt *p1 = 0;
9056   int nCol = 0;
9057   int nTab = STRLEN(zTab);
9058   int nByte = sizeof(IdxTable) + nTab + 1;
9059   IdxTable *pNew = 0;
9060   int rc, rc2;
9061   char *pCsr = 0;
9062   int nPk = 0;
9063 
9064   rc = idxPrintfPrepareStmt(db, &p1, pzErrmsg, "PRAGMA table_xinfo=%Q", zTab);
9065   while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(p1) ){
9066     const char *zCol = (const char*)sqlite3_column_text(p1, 1);
9067     nByte += 1 + STRLEN(zCol);
9068     rc = sqlite3_table_column_metadata(
9069         db, "main", zTab, zCol, 0, &zCol, 0, 0, 0
9070     );
9071     nByte += 1 + STRLEN(zCol);
9072     nCol++;
9073     nPk += (sqlite3_column_int(p1, 5)>0);
9074   }
9075   rc2 = sqlite3_reset(p1);
9076   if( rc==SQLITE_OK ) rc = rc2;
9077 
9078   nByte += sizeof(IdxColumn) * nCol;
9079   if( rc==SQLITE_OK ){
9080     pNew = idxMalloc(&rc, nByte);
9081   }
9082   if( rc==SQLITE_OK ){
9083     pNew->aCol = (IdxColumn*)&pNew[1];
9084     pNew->nCol = nCol;
9085     pCsr = (char*)&pNew->aCol[nCol];
9086   }
9087 
9088   nCol = 0;
9089   while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(p1) ){
9090     const char *zCol = (const char*)sqlite3_column_text(p1, 1);
9091     int nCopy = STRLEN(zCol) + 1;
9092     pNew->aCol[nCol].zName = pCsr;
9093     pNew->aCol[nCol].iPk = (sqlite3_column_int(p1, 5)==1 && nPk==1);
9094     memcpy(pCsr, zCol, nCopy);
9095     pCsr += nCopy;
9096 
9097     rc = sqlite3_table_column_metadata(
9098         db, "main", zTab, zCol, 0, &zCol, 0, 0, 0
9099     );
9100     if( rc==SQLITE_OK ){
9101       nCopy = STRLEN(zCol) + 1;
9102       pNew->aCol[nCol].zColl = pCsr;
9103       memcpy(pCsr, zCol, nCopy);
9104       pCsr += nCopy;
9105     }
9106 
9107     nCol++;
9108   }
9109   idxFinalize(&rc, p1);
9110 
9111   if( rc!=SQLITE_OK ){
9112     sqlite3_free(pNew);
9113     pNew = 0;
9114   }else{
9115     pNew->zName = pCsr;
9116     memcpy(pNew->zName, zTab, nTab+1);
9117   }
9118 
9119   *ppOut = pNew;
9120   return rc;
9121 }
9122 
9123 /*
9124 ** This function is a no-op if *pRc is set to anything other than
9125 ** SQLITE_OK when it is called.
9126 **
9127 ** If *pRc is initially set to SQLITE_OK, then the text specified by
9128 ** the printf() style arguments is appended to zIn and the result returned
9129 ** in a buffer allocated by sqlite3_malloc(). sqlite3_free() is called on
9130 ** zIn before returning.
9131 */
9132 static char *idxAppendText(int *pRc, char *zIn, const char *zFmt, ...){
9133   va_list ap;
9134   char *zAppend = 0;
9135   char *zRet = 0;
9136   int nIn = zIn ? STRLEN(zIn) : 0;
9137   int nAppend = 0;
9138   va_start(ap, zFmt);
9139   if( *pRc==SQLITE_OK ){
9140     zAppend = sqlite3_vmprintf(zFmt, ap);
9141     if( zAppend ){
9142       nAppend = STRLEN(zAppend);
9143       zRet = (char*)sqlite3_malloc(nIn + nAppend + 1);
9144     }
9145     if( zAppend && zRet ){
9146       if( nIn ) memcpy(zRet, zIn, nIn);
9147       memcpy(&zRet[nIn], zAppend, nAppend+1);
9148     }else{
9149       sqlite3_free(zRet);
9150       zRet = 0;
9151       *pRc = SQLITE_NOMEM;
9152     }
9153     sqlite3_free(zAppend);
9154     sqlite3_free(zIn);
9155   }
9156   va_end(ap);
9157   return zRet;
9158 }
9159 
9160 /*
9161 ** Return true if zId must be quoted in order to use it as an SQL
9162 ** identifier, or false otherwise.
9163 */
9164 static int idxIdentifierRequiresQuotes(const char *zId){
9165   int i;
9166   for(i=0; zId[i]; i++){
9167     if( !(zId[i]=='_')
9168      && !(zId[i]>='0' && zId[i]<='9')
9169      && !(zId[i]>='a' && zId[i]<='z')
9170      && !(zId[i]>='A' && zId[i]<='Z')
9171     ){
9172       return 1;
9173     }
9174   }
9175   return 0;
9176 }
9177 
9178 /*
9179 ** This function appends an index column definition suitable for constraint
9180 ** pCons to the string passed as zIn and returns the result.
9181 */
9182 static char *idxAppendColDefn(
9183   int *pRc,                       /* IN/OUT: Error code */
9184   char *zIn,                      /* Column defn accumulated so far */
9185   IdxTable *pTab,                 /* Table index will be created on */
9186   IdxConstraint *pCons
9187 ){
9188   char *zRet = zIn;
9189   IdxColumn *p = &pTab->aCol[pCons->iCol];
9190   if( zRet ) zRet = idxAppendText(pRc, zRet, ", ");
9191 
9192   if( idxIdentifierRequiresQuotes(p->zName) ){
9193     zRet = idxAppendText(pRc, zRet, "%Q", p->zName);
9194   }else{
9195     zRet = idxAppendText(pRc, zRet, "%s", p->zName);
9196   }
9197 
9198   if( sqlite3_stricmp(p->zColl, pCons->zColl) ){
9199     if( idxIdentifierRequiresQuotes(pCons->zColl) ){
9200       zRet = idxAppendText(pRc, zRet, " COLLATE %Q", pCons->zColl);
9201     }else{
9202       zRet = idxAppendText(pRc, zRet, " COLLATE %s", pCons->zColl);
9203     }
9204   }
9205 
9206   if( pCons->bDesc ){
9207     zRet = idxAppendText(pRc, zRet, " DESC");
9208   }
9209   return zRet;
9210 }
9211 
9212 /*
9213 ** Search database dbm for an index compatible with the one idxCreateFromCons()
9214 ** would create from arguments pScan, pEq and pTail. If no error occurs and
9215 ** such an index is found, return non-zero. Or, if no such index is found,
9216 ** return zero.
9217 **
9218 ** If an error occurs, set *pRc to an SQLite error code and return zero.
9219 */
9220 static int idxFindCompatible(
9221   int *pRc,                       /* OUT: Error code */
9222   sqlite3* dbm,                   /* Database to search */
9223   IdxScan *pScan,                 /* Scan for table to search for index on */
9224   IdxConstraint *pEq,             /* List of == constraints */
9225   IdxConstraint *pTail            /* List of range constraints */
9226 ){
9227   const char *zTbl = pScan->pTab->zName;
9228   sqlite3_stmt *pIdxList = 0;
9229   IdxConstraint *pIter;
9230   int nEq = 0;                    /* Number of elements in pEq */
9231   int rc;
9232 
9233   /* Count the elements in list pEq */
9234   for(pIter=pEq; pIter; pIter=pIter->pLink) nEq++;
9235 
9236   rc = idxPrintfPrepareStmt(dbm, &pIdxList, 0, "PRAGMA index_list=%Q", zTbl);
9237   while( rc==SQLITE_OK && sqlite3_step(pIdxList)==SQLITE_ROW ){
9238     int bMatch = 1;
9239     IdxConstraint *pT = pTail;
9240     sqlite3_stmt *pInfo = 0;
9241     const char *zIdx = (const char*)sqlite3_column_text(pIdxList, 1);
9242 
9243     /* Zero the IdxConstraint.bFlag values in the pEq list */
9244     for(pIter=pEq; pIter; pIter=pIter->pLink) pIter->bFlag = 0;
9245 
9246     rc = idxPrintfPrepareStmt(dbm, &pInfo, 0, "PRAGMA index_xInfo=%Q", zIdx);
9247     while( rc==SQLITE_OK && sqlite3_step(pInfo)==SQLITE_ROW ){
9248       int iIdx = sqlite3_column_int(pInfo, 0);
9249       int iCol = sqlite3_column_int(pInfo, 1);
9250       const char *zColl = (const char*)sqlite3_column_text(pInfo, 4);
9251 
9252       if( iIdx<nEq ){
9253         for(pIter=pEq; pIter; pIter=pIter->pLink){
9254           if( pIter->bFlag ) continue;
9255           if( pIter->iCol!=iCol ) continue;
9256           if( sqlite3_stricmp(pIter->zColl, zColl) ) continue;
9257           pIter->bFlag = 1;
9258           break;
9259         }
9260         if( pIter==0 ){
9261           bMatch = 0;
9262           break;
9263         }
9264       }else{
9265         if( pT ){
9266           if( pT->iCol!=iCol || sqlite3_stricmp(pT->zColl, zColl) ){
9267             bMatch = 0;
9268             break;
9269           }
9270           pT = pT->pLink;
9271         }
9272       }
9273     }
9274     idxFinalize(&rc, pInfo);
9275 
9276     if( rc==SQLITE_OK && bMatch ){
9277       sqlite3_finalize(pIdxList);
9278       return 1;
9279     }
9280   }
9281   idxFinalize(&rc, pIdxList);
9282 
9283   *pRc = rc;
9284   return 0;
9285 }
9286 
9287 static int idxCreateFromCons(
9288   sqlite3expert *p,
9289   IdxScan *pScan,
9290   IdxConstraint *pEq,
9291   IdxConstraint *pTail
9292 ){
9293   sqlite3 *dbm = p->dbm;
9294   int rc = SQLITE_OK;
9295   if( (pEq || pTail) && 0==idxFindCompatible(&rc, dbm, pScan, pEq, pTail) ){
9296     IdxTable *pTab = pScan->pTab;
9297     char *zCols = 0;
9298     char *zIdx = 0;
9299     IdxConstraint *pCons;
9300     unsigned int h = 0;
9301     const char *zFmt;
9302 
9303     for(pCons=pEq; pCons; pCons=pCons->pLink){
9304       zCols = idxAppendColDefn(&rc, zCols, pTab, pCons);
9305     }
9306     for(pCons=pTail; pCons; pCons=pCons->pLink){
9307       zCols = idxAppendColDefn(&rc, zCols, pTab, pCons);
9308     }
9309 
9310     if( rc==SQLITE_OK ){
9311       /* Hash the list of columns to come up with a name for the index */
9312       const char *zTable = pScan->pTab->zName;
9313       char *zName;                /* Index name */
9314       int i;
9315       for(i=0; zCols[i]; i++){
9316         h += ((h<<3) + zCols[i]);
9317       }
9318       zName = sqlite3_mprintf("%s_idx_%08x", zTable, h);
9319       if( zName==0 ){
9320         rc = SQLITE_NOMEM;
9321       }else{
9322         if( idxIdentifierRequiresQuotes(zTable) ){
9323           zFmt = "CREATE INDEX '%q' ON %Q(%s)";
9324         }else{
9325           zFmt = "CREATE INDEX %s ON %s(%s)";
9326         }
9327         zIdx = sqlite3_mprintf(zFmt, zName, zTable, zCols);
9328         if( !zIdx ){
9329           rc = SQLITE_NOMEM;
9330         }else{
9331           rc = sqlite3_exec(dbm, zIdx, 0, 0, p->pzErrmsg);
9332           idxHashAdd(&rc, &p->hIdx, zName, zIdx);
9333         }
9334         sqlite3_free(zName);
9335         sqlite3_free(zIdx);
9336       }
9337     }
9338 
9339     sqlite3_free(zCols);
9340   }
9341   return rc;
9342 }
9343 
9344 /*
9345 ** Return true if list pList (linked by IdxConstraint.pLink) contains
9346 ** a constraint compatible with *p. Otherwise return false.
9347 */
9348 static int idxFindConstraint(IdxConstraint *pList, IdxConstraint *p){
9349   IdxConstraint *pCmp;
9350   for(pCmp=pList; pCmp; pCmp=pCmp->pLink){
9351     if( p->iCol==pCmp->iCol ) return 1;
9352   }
9353   return 0;
9354 }
9355 
9356 static int idxCreateFromWhere(
9357   sqlite3expert *p,
9358   IdxScan *pScan,                 /* Create indexes for this scan */
9359   IdxConstraint *pTail            /* range/ORDER BY constraints for inclusion */
9360 ){
9361   IdxConstraint *p1 = 0;
9362   IdxConstraint *pCon;
9363   int rc;
9364 
9365   /* Gather up all the == constraints. */
9366   for(pCon=pScan->pEq; pCon; pCon=pCon->pNext){
9367     if( !idxFindConstraint(p1, pCon) && !idxFindConstraint(pTail, pCon) ){
9368       pCon->pLink = p1;
9369       p1 = pCon;
9370     }
9371   }
9372 
9373   /* Create an index using the == constraints collected above. And the
9374   ** range constraint/ORDER BY terms passed in by the caller, if any. */
9375   rc = idxCreateFromCons(p, pScan, p1, pTail);
9376 
9377   /* If no range/ORDER BY passed by the caller, create a version of the
9378   ** index for each range constraint.  */
9379   if( pTail==0 ){
9380     for(pCon=pScan->pRange; rc==SQLITE_OK && pCon; pCon=pCon->pNext){
9381       assert( pCon->pLink==0 );
9382       if( !idxFindConstraint(p1, pCon) && !idxFindConstraint(pTail, pCon) ){
9383         rc = idxCreateFromCons(p, pScan, p1, pCon);
9384       }
9385     }
9386   }
9387 
9388   return rc;
9389 }
9390 
9391 /*
9392 ** Create candidate indexes in database [dbm] based on the data in
9393 ** linked-list pScan.
9394 */
9395 static int idxCreateCandidates(sqlite3expert *p){
9396   int rc = SQLITE_OK;
9397   IdxScan *pIter;
9398 
9399   for(pIter=p->pScan; pIter && rc==SQLITE_OK; pIter=pIter->pNextScan){
9400     rc = idxCreateFromWhere(p, pIter, 0);
9401     if( rc==SQLITE_OK && pIter->pOrder ){
9402       rc = idxCreateFromWhere(p, pIter, pIter->pOrder);
9403     }
9404   }
9405 
9406   return rc;
9407 }
9408 
9409 /*
9410 ** Free all elements of the linked list starting at pConstraint.
9411 */
9412 static void idxConstraintFree(IdxConstraint *pConstraint){
9413   IdxConstraint *pNext;
9414   IdxConstraint *p;
9415 
9416   for(p=pConstraint; p; p=pNext){
9417     pNext = p->pNext;
9418     sqlite3_free(p);
9419   }
9420 }
9421 
9422 /*
9423 ** Free all elements of the linked list starting from pScan up until pLast
9424 ** (pLast is not freed).
9425 */
9426 static void idxScanFree(IdxScan *pScan, IdxScan *pLast){
9427   IdxScan *p;
9428   IdxScan *pNext;
9429   for(p=pScan; p!=pLast; p=pNext){
9430     pNext = p->pNextScan;
9431     idxConstraintFree(p->pOrder);
9432     idxConstraintFree(p->pEq);
9433     idxConstraintFree(p->pRange);
9434     sqlite3_free(p);
9435   }
9436 }
9437 
9438 /*
9439 ** Free all elements of the linked list starting from pStatement up
9440 ** until pLast (pLast is not freed).
9441 */
9442 static void idxStatementFree(IdxStatement *pStatement, IdxStatement *pLast){
9443   IdxStatement *p;
9444   IdxStatement *pNext;
9445   for(p=pStatement; p!=pLast; p=pNext){
9446     pNext = p->pNext;
9447     sqlite3_free(p->zEQP);
9448     sqlite3_free(p->zIdx);
9449     sqlite3_free(p);
9450   }
9451 }
9452 
9453 /*
9454 ** Free the linked list of IdxTable objects starting at pTab.
9455 */
9456 static void idxTableFree(IdxTable *pTab){
9457   IdxTable *pIter;
9458   IdxTable *pNext;
9459   for(pIter=pTab; pIter; pIter=pNext){
9460     pNext = pIter->pNext;
9461     sqlite3_free(pIter);
9462   }
9463 }
9464 
9465 /*
9466 ** Free the linked list of IdxWrite objects starting at pTab.
9467 */
9468 static void idxWriteFree(IdxWrite *pTab){
9469   IdxWrite *pIter;
9470   IdxWrite *pNext;
9471   for(pIter=pTab; pIter; pIter=pNext){
9472     pNext = pIter->pNext;
9473     sqlite3_free(pIter);
9474   }
9475 }
9476 
9477 
9478 
9479 /*
9480 ** This function is called after candidate indexes have been created. It
9481 ** runs all the queries to see which indexes they prefer, and populates
9482 ** IdxStatement.zIdx and IdxStatement.zEQP with the results.
9483 */
9484 int idxFindIndexes(
9485   sqlite3expert *p,
9486   char **pzErr                         /* OUT: Error message (sqlite3_malloc) */
9487 ){
9488   IdxStatement *pStmt;
9489   sqlite3 *dbm = p->dbm;
9490   int rc = SQLITE_OK;
9491 
9492   IdxHash hIdx;
9493   idxHashInit(&hIdx);
9494 
9495   for(pStmt=p->pStatement; rc==SQLITE_OK && pStmt; pStmt=pStmt->pNext){
9496     IdxHashEntry *pEntry;
9497     sqlite3_stmt *pExplain = 0;
9498     idxHashClear(&hIdx);
9499     rc = idxPrintfPrepareStmt(dbm, &pExplain, pzErr,
9500         "EXPLAIN QUERY PLAN %s", pStmt->zSql
9501     );
9502     while( rc==SQLITE_OK && sqlite3_step(pExplain)==SQLITE_ROW ){
9503       /* int iId = sqlite3_column_int(pExplain, 0); */
9504       /* int iParent = sqlite3_column_int(pExplain, 1); */
9505       /* int iNotUsed = sqlite3_column_int(pExplain, 2); */
9506       const char *zDetail = (const char*)sqlite3_column_text(pExplain, 3);
9507       int nDetail;
9508       int i;
9509 
9510       if( !zDetail ) continue;
9511       nDetail = STRLEN(zDetail);
9512 
9513       for(i=0; i<nDetail; i++){
9514         const char *zIdx = 0;
9515         if( i+13<nDetail && memcmp(&zDetail[i], " USING INDEX ", 13)==0 ){
9516           zIdx = &zDetail[i+13];
9517         }else if( i+22<nDetail
9518             && memcmp(&zDetail[i], " USING COVERING INDEX ", 22)==0
9519         ){
9520           zIdx = &zDetail[i+22];
9521         }
9522         if( zIdx ){
9523           const char *zSql;
9524           int nIdx = 0;
9525           while( zIdx[nIdx]!='\0' && (zIdx[nIdx]!=' ' || zIdx[nIdx+1]!='(') ){
9526             nIdx++;
9527           }
9528           zSql = idxHashSearch(&p->hIdx, zIdx, nIdx);
9529           if( zSql ){
9530             idxHashAdd(&rc, &hIdx, zSql, 0);
9531             if( rc ) goto find_indexes_out;
9532           }
9533           break;
9534         }
9535       }
9536 
9537       if( zDetail[0]!='-' ){
9538         pStmt->zEQP = idxAppendText(&rc, pStmt->zEQP, "%s\n", zDetail);
9539       }
9540     }
9541 
9542     for(pEntry=hIdx.pFirst; pEntry; pEntry=pEntry->pNext){
9543       pStmt->zIdx = idxAppendText(&rc, pStmt->zIdx, "%s;\n", pEntry->zKey);
9544     }
9545 
9546     idxFinalize(&rc, pExplain);
9547   }
9548 
9549  find_indexes_out:
9550   idxHashClear(&hIdx);
9551   return rc;
9552 }
9553 
9554 static int idxAuthCallback(
9555   void *pCtx,
9556   int eOp,
9557   const char *z3,
9558   const char *z4,
9559   const char *zDb,
9560   const char *zTrigger
9561 ){
9562   int rc = SQLITE_OK;
9563   (void)z4;
9564   (void)zTrigger;
9565   if( eOp==SQLITE_INSERT || eOp==SQLITE_UPDATE || eOp==SQLITE_DELETE ){
9566     if( sqlite3_stricmp(zDb, "main")==0 ){
9567       sqlite3expert *p = (sqlite3expert*)pCtx;
9568       IdxTable *pTab;
9569       for(pTab=p->pTable; pTab; pTab=pTab->pNext){
9570         if( 0==sqlite3_stricmp(z3, pTab->zName) ) break;
9571       }
9572       if( pTab ){
9573         IdxWrite *pWrite;
9574         for(pWrite=p->pWrite; pWrite; pWrite=pWrite->pNext){
9575           if( pWrite->pTab==pTab && pWrite->eOp==eOp ) break;
9576         }
9577         if( pWrite==0 ){
9578           pWrite = idxMalloc(&rc, sizeof(IdxWrite));
9579           if( rc==SQLITE_OK ){
9580             pWrite->pTab = pTab;
9581             pWrite->eOp = eOp;
9582             pWrite->pNext = p->pWrite;
9583             p->pWrite = pWrite;
9584           }
9585         }
9586       }
9587     }
9588   }
9589   return rc;
9590 }
9591 
9592 static int idxProcessOneTrigger(
9593   sqlite3expert *p,
9594   IdxWrite *pWrite,
9595   char **pzErr
9596 ){
9597   static const char *zInt = UNIQUE_TABLE_NAME;
9598   static const char *zDrop = "DROP TABLE " UNIQUE_TABLE_NAME;
9599   IdxTable *pTab = pWrite->pTab;
9600   const char *zTab = pTab->zName;
9601   const char *zSql =
9602     "SELECT 'CREATE TEMP' || substr(sql, 7) FROM sqlite_schema "
9603     "WHERE tbl_name = %Q AND type IN ('table', 'trigger') "
9604     "ORDER BY type;";
9605   sqlite3_stmt *pSelect = 0;
9606   int rc = SQLITE_OK;
9607   char *zWrite = 0;
9608 
9609   /* Create the table and its triggers in the temp schema */
9610   rc = idxPrintfPrepareStmt(p->db, &pSelect, pzErr, zSql, zTab, zTab);
9611   while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSelect) ){
9612     const char *zCreate = (const char*)sqlite3_column_text(pSelect, 0);
9613     rc = sqlite3_exec(p->dbv, zCreate, 0, 0, pzErr);
9614   }
9615   idxFinalize(&rc, pSelect);
9616 
9617   /* Rename the table in the temp schema to zInt */
9618   if( rc==SQLITE_OK ){
9619     char *z = sqlite3_mprintf("ALTER TABLE temp.%Q RENAME TO %Q", zTab, zInt);
9620     if( z==0 ){
9621       rc = SQLITE_NOMEM;
9622     }else{
9623       rc = sqlite3_exec(p->dbv, z, 0, 0, pzErr);
9624       sqlite3_free(z);
9625     }
9626   }
9627 
9628   switch( pWrite->eOp ){
9629     case SQLITE_INSERT: {
9630       int i;
9631       zWrite = idxAppendText(&rc, zWrite, "INSERT INTO %Q VALUES(", zInt);
9632       for(i=0; i<pTab->nCol; i++){
9633         zWrite = idxAppendText(&rc, zWrite, "%s?", i==0 ? "" : ", ");
9634       }
9635       zWrite = idxAppendText(&rc, zWrite, ")");
9636       break;
9637     }
9638     case SQLITE_UPDATE: {
9639       int i;
9640       zWrite = idxAppendText(&rc, zWrite, "UPDATE %Q SET ", zInt);
9641       for(i=0; i<pTab->nCol; i++){
9642         zWrite = idxAppendText(&rc, zWrite, "%s%Q=?", i==0 ? "" : ", ",
9643             pTab->aCol[i].zName
9644         );
9645       }
9646       break;
9647     }
9648     default: {
9649       assert( pWrite->eOp==SQLITE_DELETE );
9650       if( rc==SQLITE_OK ){
9651         zWrite = sqlite3_mprintf("DELETE FROM %Q", zInt);
9652         if( zWrite==0 ) rc = SQLITE_NOMEM;
9653       }
9654     }
9655   }
9656 
9657   if( rc==SQLITE_OK ){
9658     sqlite3_stmt *pX = 0;
9659     rc = sqlite3_prepare_v2(p->dbv, zWrite, -1, &pX, 0);
9660     idxFinalize(&rc, pX);
9661     if( rc!=SQLITE_OK ){
9662       idxDatabaseError(p->dbv, pzErr);
9663     }
9664   }
9665   sqlite3_free(zWrite);
9666 
9667   if( rc==SQLITE_OK ){
9668     rc = sqlite3_exec(p->dbv, zDrop, 0, 0, pzErr);
9669   }
9670 
9671   return rc;
9672 }
9673 
9674 static int idxProcessTriggers(sqlite3expert *p, char **pzErr){
9675   int rc = SQLITE_OK;
9676   IdxWrite *pEnd = 0;
9677   IdxWrite *pFirst = p->pWrite;
9678 
9679   while( rc==SQLITE_OK && pFirst!=pEnd ){
9680     IdxWrite *pIter;
9681     for(pIter=pFirst; rc==SQLITE_OK && pIter!=pEnd; pIter=pIter->pNext){
9682       rc = idxProcessOneTrigger(p, pIter, pzErr);
9683     }
9684     pEnd = pFirst;
9685     pFirst = p->pWrite;
9686   }
9687 
9688   return rc;
9689 }
9690 
9691 
9692 static int idxCreateVtabSchema(sqlite3expert *p, char **pzErrmsg){
9693   int rc = idxRegisterVtab(p);
9694   sqlite3_stmt *pSchema = 0;
9695 
9696   /* For each table in the main db schema:
9697   **
9698   **   1) Add an entry to the p->pTable list, and
9699   **   2) Create the equivalent virtual table in dbv.
9700   */
9701   rc = idxPrepareStmt(p->db, &pSchema, pzErrmsg,
9702       "SELECT type, name, sql, 1 FROM sqlite_schema "
9703       "WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%%' "
9704       " UNION ALL "
9705       "SELECT type, name, sql, 2 FROM sqlite_schema "
9706       "WHERE type = 'trigger'"
9707       "  AND tbl_name IN(SELECT name FROM sqlite_schema WHERE type = 'view') "
9708       "ORDER BY 4, 1"
9709   );
9710   while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSchema) ){
9711     const char *zType = (const char*)sqlite3_column_text(pSchema, 0);
9712     const char *zName = (const char*)sqlite3_column_text(pSchema, 1);
9713     const char *zSql = (const char*)sqlite3_column_text(pSchema, 2);
9714 
9715     if( zType[0]=='v' || zType[1]=='r' ){
9716       rc = sqlite3_exec(p->dbv, zSql, 0, 0, pzErrmsg);
9717     }else{
9718       IdxTable *pTab;
9719       rc = idxGetTableInfo(p->db, zName, &pTab, pzErrmsg);
9720       if( rc==SQLITE_OK ){
9721         int i;
9722         char *zInner = 0;
9723         char *zOuter = 0;
9724         pTab->pNext = p->pTable;
9725         p->pTable = pTab;
9726 
9727         /* The statement the vtab will pass to sqlite3_declare_vtab() */
9728         zInner = idxAppendText(&rc, 0, "CREATE TABLE x(");
9729         for(i=0; i<pTab->nCol; i++){
9730           zInner = idxAppendText(&rc, zInner, "%s%Q COLLATE %s",
9731               (i==0 ? "" : ", "), pTab->aCol[i].zName, pTab->aCol[i].zColl
9732           );
9733         }
9734         zInner = idxAppendText(&rc, zInner, ")");
9735 
9736         /* The CVT statement to create the vtab */
9737         zOuter = idxAppendText(&rc, 0,
9738             "CREATE VIRTUAL TABLE %Q USING expert(%Q)", zName, zInner
9739         );
9740         if( rc==SQLITE_OK ){
9741           rc = sqlite3_exec(p->dbv, zOuter, 0, 0, pzErrmsg);
9742         }
9743         sqlite3_free(zInner);
9744         sqlite3_free(zOuter);
9745       }
9746     }
9747   }
9748   idxFinalize(&rc, pSchema);
9749   return rc;
9750 }
9751 
9752 struct IdxSampleCtx {
9753   int iTarget;
9754   double target;                  /* Target nRet/nRow value */
9755   double nRow;                    /* Number of rows seen */
9756   double nRet;                    /* Number of rows returned */
9757 };
9758 
9759 static void idxSampleFunc(
9760   sqlite3_context *pCtx,
9761   int argc,
9762   sqlite3_value **argv
9763 ){
9764   struct IdxSampleCtx *p = (struct IdxSampleCtx*)sqlite3_user_data(pCtx);
9765   int bRet;
9766 
9767   (void)argv;
9768   assert( argc==0 );
9769   if( p->nRow==0.0 ){
9770     bRet = 1;
9771   }else{
9772     bRet = (p->nRet / p->nRow) <= p->target;
9773     if( bRet==0 ){
9774       unsigned short rnd;
9775       sqlite3_randomness(2, (void*)&rnd);
9776       bRet = ((int)rnd % 100) <= p->iTarget;
9777     }
9778   }
9779 
9780   sqlite3_result_int(pCtx, bRet);
9781   p->nRow += 1.0;
9782   p->nRet += (double)bRet;
9783 }
9784 
9785 struct IdxRemCtx {
9786   int nSlot;
9787   struct IdxRemSlot {
9788     int eType;                    /* SQLITE_NULL, INTEGER, REAL, TEXT, BLOB */
9789     i64 iVal;                     /* SQLITE_INTEGER value */
9790     double rVal;                  /* SQLITE_FLOAT value */
9791     int nByte;                    /* Bytes of space allocated at z */
9792     int n;                        /* Size of buffer z */
9793     char *z;                      /* SQLITE_TEXT/BLOB value */
9794   } aSlot[1];
9795 };
9796 
9797 /*
9798 ** Implementation of scalar function rem().
9799 */
9800 static void idxRemFunc(
9801   sqlite3_context *pCtx,
9802   int argc,
9803   sqlite3_value **argv
9804 ){
9805   struct IdxRemCtx *p = (struct IdxRemCtx*)sqlite3_user_data(pCtx);
9806   struct IdxRemSlot *pSlot;
9807   int iSlot;
9808   assert( argc==2 );
9809 
9810   iSlot = sqlite3_value_int(argv[0]);
9811   assert( iSlot<=p->nSlot );
9812   pSlot = &p->aSlot[iSlot];
9813 
9814   switch( pSlot->eType ){
9815     case SQLITE_NULL:
9816       /* no-op */
9817       break;
9818 
9819     case SQLITE_INTEGER:
9820       sqlite3_result_int64(pCtx, pSlot->iVal);
9821       break;
9822 
9823     case SQLITE_FLOAT:
9824       sqlite3_result_double(pCtx, pSlot->rVal);
9825       break;
9826 
9827     case SQLITE_BLOB:
9828       sqlite3_result_blob(pCtx, pSlot->z, pSlot->n, SQLITE_TRANSIENT);
9829       break;
9830 
9831     case SQLITE_TEXT:
9832       sqlite3_result_text(pCtx, pSlot->z, pSlot->n, SQLITE_TRANSIENT);
9833       break;
9834   }
9835 
9836   pSlot->eType = sqlite3_value_type(argv[1]);
9837   switch( pSlot->eType ){
9838     case SQLITE_NULL:
9839       /* no-op */
9840       break;
9841 
9842     case SQLITE_INTEGER:
9843       pSlot->iVal = sqlite3_value_int64(argv[1]);
9844       break;
9845 
9846     case SQLITE_FLOAT:
9847       pSlot->rVal = sqlite3_value_double(argv[1]);
9848       break;
9849 
9850     case SQLITE_BLOB:
9851     case SQLITE_TEXT: {
9852       int nByte = sqlite3_value_bytes(argv[1]);
9853       if( nByte>pSlot->nByte ){
9854         char *zNew = (char*)sqlite3_realloc(pSlot->z, nByte*2);
9855         if( zNew==0 ){
9856           sqlite3_result_error_nomem(pCtx);
9857           return;
9858         }
9859         pSlot->nByte = nByte*2;
9860         pSlot->z = zNew;
9861       }
9862       pSlot->n = nByte;
9863       if( pSlot->eType==SQLITE_BLOB ){
9864         memcpy(pSlot->z, sqlite3_value_blob(argv[1]), nByte);
9865       }else{
9866         memcpy(pSlot->z, sqlite3_value_text(argv[1]), nByte);
9867       }
9868       break;
9869     }
9870   }
9871 }
9872 
9873 static int idxLargestIndex(sqlite3 *db, int *pnMax, char **pzErr){
9874   int rc = SQLITE_OK;
9875   const char *zMax =
9876     "SELECT max(i.seqno) FROM "
9877     "  sqlite_schema AS s, "
9878     "  pragma_index_list(s.name) AS l, "
9879     "  pragma_index_info(l.name) AS i "
9880     "WHERE s.type = 'table'";
9881   sqlite3_stmt *pMax = 0;
9882 
9883   *pnMax = 0;
9884   rc = idxPrepareStmt(db, &pMax, pzErr, zMax);
9885   if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pMax) ){
9886     *pnMax = sqlite3_column_int(pMax, 0) + 1;
9887   }
9888   idxFinalize(&rc, pMax);
9889 
9890   return rc;
9891 }
9892 
9893 static int idxPopulateOneStat1(
9894   sqlite3expert *p,
9895   sqlite3_stmt *pIndexXInfo,
9896   sqlite3_stmt *pWriteStat,
9897   const char *zTab,
9898   const char *zIdx,
9899   char **pzErr
9900 ){
9901   char *zCols = 0;
9902   char *zOrder = 0;
9903   char *zQuery = 0;
9904   int nCol = 0;
9905   int i;
9906   sqlite3_stmt *pQuery = 0;
9907   int *aStat = 0;
9908   int rc = SQLITE_OK;
9909 
9910   assert( p->iSample>0 );
9911 
9912   /* Formulate the query text */
9913   sqlite3_bind_text(pIndexXInfo, 1, zIdx, -1, SQLITE_STATIC);
9914   while( SQLITE_OK==rc && SQLITE_ROW==sqlite3_step(pIndexXInfo) ){
9915     const char *zComma = zCols==0 ? "" : ", ";
9916     const char *zName = (const char*)sqlite3_column_text(pIndexXInfo, 0);
9917     const char *zColl = (const char*)sqlite3_column_text(pIndexXInfo, 1);
9918     zCols = idxAppendText(&rc, zCols,
9919         "%sx.%Q IS rem(%d, x.%Q) COLLATE %s", zComma, zName, nCol, zName, zColl
9920     );
9921     zOrder = idxAppendText(&rc, zOrder, "%s%d", zComma, ++nCol);
9922   }
9923   sqlite3_reset(pIndexXInfo);
9924   if( rc==SQLITE_OK ){
9925     if( p->iSample==100 ){
9926       zQuery = sqlite3_mprintf(
9927           "SELECT %s FROM %Q x ORDER BY %s", zCols, zTab, zOrder
9928       );
9929     }else{
9930       zQuery = sqlite3_mprintf(
9931           "SELECT %s FROM temp."UNIQUE_TABLE_NAME" x ORDER BY %s", zCols, zOrder
9932       );
9933     }
9934   }
9935   sqlite3_free(zCols);
9936   sqlite3_free(zOrder);
9937 
9938   /* Formulate the query text */
9939   if( rc==SQLITE_OK ){
9940     sqlite3 *dbrem = (p->iSample==100 ? p->db : p->dbv);
9941     rc = idxPrepareStmt(dbrem, &pQuery, pzErr, zQuery);
9942   }
9943   sqlite3_free(zQuery);
9944 
9945   if( rc==SQLITE_OK ){
9946     aStat = (int*)idxMalloc(&rc, sizeof(int)*(nCol+1));
9947   }
9948   if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pQuery) ){
9949     IdxHashEntry *pEntry;
9950     char *zStat = 0;
9951     for(i=0; i<=nCol; i++) aStat[i] = 1;
9952     while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pQuery) ){
9953       aStat[0]++;
9954       for(i=0; i<nCol; i++){
9955         if( sqlite3_column_int(pQuery, i)==0 ) break;
9956       }
9957       for(/*no-op*/; i<nCol; i++){
9958         aStat[i+1]++;
9959       }
9960     }
9961 
9962     if( rc==SQLITE_OK ){
9963       int s0 = aStat[0];
9964       zStat = sqlite3_mprintf("%d", s0);
9965       if( zStat==0 ) rc = SQLITE_NOMEM;
9966       for(i=1; rc==SQLITE_OK && i<=nCol; i++){
9967         zStat = idxAppendText(&rc, zStat, " %d", (s0+aStat[i]/2) / aStat[i]);
9968       }
9969     }
9970 
9971     if( rc==SQLITE_OK ){
9972       sqlite3_bind_text(pWriteStat, 1, zTab, -1, SQLITE_STATIC);
9973       sqlite3_bind_text(pWriteStat, 2, zIdx, -1, SQLITE_STATIC);
9974       sqlite3_bind_text(pWriteStat, 3, zStat, -1, SQLITE_STATIC);
9975       sqlite3_step(pWriteStat);
9976       rc = sqlite3_reset(pWriteStat);
9977     }
9978 
9979     pEntry = idxHashFind(&p->hIdx, zIdx, STRLEN(zIdx));
9980     if( pEntry ){
9981       assert( pEntry->zVal2==0 );
9982       pEntry->zVal2 = zStat;
9983     }else{
9984       sqlite3_free(zStat);
9985     }
9986   }
9987   sqlite3_free(aStat);
9988   idxFinalize(&rc, pQuery);
9989 
9990   return rc;
9991 }
9992 
9993 static int idxBuildSampleTable(sqlite3expert *p, const char *zTab){
9994   int rc;
9995   char *zSql;
9996 
9997   rc = sqlite3_exec(p->dbv,"DROP TABLE IF EXISTS temp."UNIQUE_TABLE_NAME,0,0,0);
9998   if( rc!=SQLITE_OK ) return rc;
9999 
10000   zSql = sqlite3_mprintf(
10001       "CREATE TABLE temp." UNIQUE_TABLE_NAME " AS SELECT * FROM %Q", zTab
10002   );
10003   if( zSql==0 ) return SQLITE_NOMEM;
10004   rc = sqlite3_exec(p->dbv, zSql, 0, 0, 0);
10005   sqlite3_free(zSql);
10006 
10007   return rc;
10008 }
10009 
10010 /*
10011 ** This function is called as part of sqlite3_expert_analyze(). Candidate
10012 ** indexes have already been created in database sqlite3expert.dbm, this
10013 ** function populates sqlite_stat1 table in the same database.
10014 **
10015 ** The stat1 data is generated by querying the
10016 */
10017 static int idxPopulateStat1(sqlite3expert *p, char **pzErr){
10018   int rc = SQLITE_OK;
10019   int nMax =0;
10020   struct IdxRemCtx *pCtx = 0;
10021   struct IdxSampleCtx samplectx;
10022   int i;
10023   i64 iPrev = -100000;
10024   sqlite3_stmt *pAllIndex = 0;
10025   sqlite3_stmt *pIndexXInfo = 0;
10026   sqlite3_stmt *pWrite = 0;
10027 
10028   const char *zAllIndex =
10029     "SELECT s.rowid, s.name, l.name FROM "
10030     "  sqlite_schema AS s, "
10031     "  pragma_index_list(s.name) AS l "
10032     "WHERE s.type = 'table'";
10033   const char *zIndexXInfo =
10034     "SELECT name, coll FROM pragma_index_xinfo(?) WHERE key";
10035   const char *zWrite = "INSERT INTO sqlite_stat1 VALUES(?, ?, ?)";
10036 
10037   /* If iSample==0, no sqlite_stat1 data is required. */
10038   if( p->iSample==0 ) return SQLITE_OK;
10039 
10040   rc = idxLargestIndex(p->dbm, &nMax, pzErr);
10041   if( nMax<=0 || rc!=SQLITE_OK ) return rc;
10042 
10043   rc = sqlite3_exec(p->dbm, "ANALYZE; PRAGMA writable_schema=1", 0, 0, 0);
10044 
10045   if( rc==SQLITE_OK ){
10046     int nByte = sizeof(struct IdxRemCtx) + (sizeof(struct IdxRemSlot) * nMax);
10047     pCtx = (struct IdxRemCtx*)idxMalloc(&rc, nByte);
10048   }
10049 
10050   if( rc==SQLITE_OK ){
10051     sqlite3 *dbrem = (p->iSample==100 ? p->db : p->dbv);
10052     rc = sqlite3_create_function(
10053         dbrem, "rem", 2, SQLITE_UTF8, (void*)pCtx, idxRemFunc, 0, 0
10054     );
10055   }
10056   if( rc==SQLITE_OK ){
10057     rc = sqlite3_create_function(
10058         p->db, "sample", 0, SQLITE_UTF8, (void*)&samplectx, idxSampleFunc, 0, 0
10059     );
10060   }
10061 
10062   if( rc==SQLITE_OK ){
10063     pCtx->nSlot = nMax+1;
10064     rc = idxPrepareStmt(p->dbm, &pAllIndex, pzErr, zAllIndex);
10065   }
10066   if( rc==SQLITE_OK ){
10067     rc = idxPrepareStmt(p->dbm, &pIndexXInfo, pzErr, zIndexXInfo);
10068   }
10069   if( rc==SQLITE_OK ){
10070     rc = idxPrepareStmt(p->dbm, &pWrite, pzErr, zWrite);
10071   }
10072 
10073   while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pAllIndex) ){
10074     i64 iRowid = sqlite3_column_int64(pAllIndex, 0);
10075     const char *zTab = (const char*)sqlite3_column_text(pAllIndex, 1);
10076     const char *zIdx = (const char*)sqlite3_column_text(pAllIndex, 2);
10077     if( p->iSample<100 && iPrev!=iRowid ){
10078       samplectx.target = (double)p->iSample / 100.0;
10079       samplectx.iTarget = p->iSample;
10080       samplectx.nRow = 0.0;
10081       samplectx.nRet = 0.0;
10082       rc = idxBuildSampleTable(p, zTab);
10083       if( rc!=SQLITE_OK ) break;
10084     }
10085     rc = idxPopulateOneStat1(p, pIndexXInfo, pWrite, zTab, zIdx, pzErr);
10086     iPrev = iRowid;
10087   }
10088   if( rc==SQLITE_OK && p->iSample<100 ){
10089     rc = sqlite3_exec(p->dbv,
10090         "DROP TABLE IF EXISTS temp." UNIQUE_TABLE_NAME, 0,0,0
10091     );
10092   }
10093 
10094   idxFinalize(&rc, pAllIndex);
10095   idxFinalize(&rc, pIndexXInfo);
10096   idxFinalize(&rc, pWrite);
10097 
10098   if( pCtx ){
10099     for(i=0; i<pCtx->nSlot; i++){
10100       sqlite3_free(pCtx->aSlot[i].z);
10101     }
10102     sqlite3_free(pCtx);
10103   }
10104 
10105   if( rc==SQLITE_OK ){
10106     rc = sqlite3_exec(p->dbm, "ANALYZE sqlite_schema", 0, 0, 0);
10107   }
10108 
10109   sqlite3_exec(p->db, "DROP TABLE IF EXISTS temp."UNIQUE_TABLE_NAME,0,0,0);
10110   return rc;
10111 }
10112 
10113 /*
10114 ** Allocate a new sqlite3expert object.
10115 */
10116 sqlite3expert *sqlite3_expert_new(sqlite3 *db, char **pzErrmsg){
10117   int rc = SQLITE_OK;
10118   sqlite3expert *pNew;
10119 
10120   pNew = (sqlite3expert*)idxMalloc(&rc, sizeof(sqlite3expert));
10121 
10122   /* Open two in-memory databases to work with. The "vtab database" (dbv)
10123   ** will contain a virtual table corresponding to each real table in
10124   ** the user database schema, and a copy of each view. It is used to
10125   ** collect information regarding the WHERE, ORDER BY and other clauses
10126   ** of the user's query.
10127   */
10128   if( rc==SQLITE_OK ){
10129     pNew->db = db;
10130     pNew->iSample = 100;
10131     rc = sqlite3_open(":memory:", &pNew->dbv);
10132   }
10133   if( rc==SQLITE_OK ){
10134     rc = sqlite3_open(":memory:", &pNew->dbm);
10135     if( rc==SQLITE_OK ){
10136       sqlite3_db_config(pNew->dbm, SQLITE_DBCONFIG_TRIGGER_EQP, 1, (int*)0);
10137     }
10138   }
10139 
10140 
10141   /* Copy the entire schema of database [db] into [dbm]. */
10142   if( rc==SQLITE_OK ){
10143     sqlite3_stmt *pSql;
10144     rc = idxPrintfPrepareStmt(pNew->db, &pSql, pzErrmsg,
10145         "SELECT sql FROM sqlite_schema WHERE name NOT LIKE 'sqlite_%%'"
10146         " AND sql NOT LIKE 'CREATE VIRTUAL %%'"
10147     );
10148     while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
10149       const char *zSql = (const char*)sqlite3_column_text(pSql, 0);
10150       rc = sqlite3_exec(pNew->dbm, zSql, 0, 0, pzErrmsg);
10151     }
10152     idxFinalize(&rc, pSql);
10153   }
10154 
10155   /* Create the vtab schema */
10156   if( rc==SQLITE_OK ){
10157     rc = idxCreateVtabSchema(pNew, pzErrmsg);
10158   }
10159 
10160   /* Register the auth callback with dbv */
10161   if( rc==SQLITE_OK ){
10162     sqlite3_set_authorizer(pNew->dbv, idxAuthCallback, (void*)pNew);
10163   }
10164 
10165   /* If an error has occurred, free the new object and reutrn NULL. Otherwise,
10166   ** return the new sqlite3expert handle.  */
10167   if( rc!=SQLITE_OK ){
10168     sqlite3_expert_destroy(pNew);
10169     pNew = 0;
10170   }
10171   return pNew;
10172 }
10173 
10174 /*
10175 ** Configure an sqlite3expert object.
10176 */
10177 int sqlite3_expert_config(sqlite3expert *p, int op, ...){
10178   int rc = SQLITE_OK;
10179   va_list ap;
10180   va_start(ap, op);
10181   switch( op ){
10182     case EXPERT_CONFIG_SAMPLE: {
10183       int iVal = va_arg(ap, int);
10184       if( iVal<0 ) iVal = 0;
10185       if( iVal>100 ) iVal = 100;
10186       p->iSample = iVal;
10187       break;
10188     }
10189     default:
10190       rc = SQLITE_NOTFOUND;
10191       break;
10192   }
10193 
10194   va_end(ap);
10195   return rc;
10196 }
10197 
10198 /*
10199 ** Add an SQL statement to the analysis.
10200 */
10201 int sqlite3_expert_sql(
10202   sqlite3expert *p,               /* From sqlite3_expert_new() */
10203   const char *zSql,               /* SQL statement to add */
10204   char **pzErr                    /* OUT: Error message (if any) */
10205 ){
10206   IdxScan *pScanOrig = p->pScan;
10207   IdxStatement *pStmtOrig = p->pStatement;
10208   int rc = SQLITE_OK;
10209   const char *zStmt = zSql;
10210 
10211   if( p->bRun ) return SQLITE_MISUSE;
10212 
10213   while( rc==SQLITE_OK && zStmt && zStmt[0] ){
10214     sqlite3_stmt *pStmt = 0;
10215     rc = sqlite3_prepare_v2(p->dbv, zStmt, -1, &pStmt, &zStmt);
10216     if( rc==SQLITE_OK ){
10217       if( pStmt ){
10218         IdxStatement *pNew;
10219         const char *z = sqlite3_sql(pStmt);
10220         int n = STRLEN(z);
10221         pNew = (IdxStatement*)idxMalloc(&rc, sizeof(IdxStatement) + n+1);
10222         if( rc==SQLITE_OK ){
10223           pNew->zSql = (char*)&pNew[1];
10224           memcpy(pNew->zSql, z, n+1);
10225           pNew->pNext = p->pStatement;
10226           if( p->pStatement ) pNew->iId = p->pStatement->iId+1;
10227           p->pStatement = pNew;
10228         }
10229         sqlite3_finalize(pStmt);
10230       }
10231     }else{
10232       idxDatabaseError(p->dbv, pzErr);
10233     }
10234   }
10235 
10236   if( rc!=SQLITE_OK ){
10237     idxScanFree(p->pScan, pScanOrig);
10238     idxStatementFree(p->pStatement, pStmtOrig);
10239     p->pScan = pScanOrig;
10240     p->pStatement = pStmtOrig;
10241   }
10242 
10243   return rc;
10244 }
10245 
10246 int sqlite3_expert_analyze(sqlite3expert *p, char **pzErr){
10247   int rc;
10248   IdxHashEntry *pEntry;
10249 
10250   /* Do trigger processing to collect any extra IdxScan structures */
10251   rc = idxProcessTriggers(p, pzErr);
10252 
10253   /* Create candidate indexes within the in-memory database file */
10254   if( rc==SQLITE_OK ){
10255     rc = idxCreateCandidates(p);
10256   }
10257 
10258   /* Generate the stat1 data */
10259   if( rc==SQLITE_OK ){
10260     rc = idxPopulateStat1(p, pzErr);
10261   }
10262 
10263   /* Formulate the EXPERT_REPORT_CANDIDATES text */
10264   for(pEntry=p->hIdx.pFirst; pEntry; pEntry=pEntry->pNext){
10265     p->zCandidates = idxAppendText(&rc, p->zCandidates,
10266         "%s;%s%s\n", pEntry->zVal,
10267         pEntry->zVal2 ? " -- stat1: " : "", pEntry->zVal2
10268     );
10269   }
10270 
10271   /* Figure out which of the candidate indexes are preferred by the query
10272   ** planner and report the results to the user.  */
10273   if( rc==SQLITE_OK ){
10274     rc = idxFindIndexes(p, pzErr);
10275   }
10276 
10277   if( rc==SQLITE_OK ){
10278     p->bRun = 1;
10279   }
10280   return rc;
10281 }
10282 
10283 /*
10284 ** Return the total number of statements that have been added to this
10285 ** sqlite3expert using sqlite3_expert_sql().
10286 */
10287 int sqlite3_expert_count(sqlite3expert *p){
10288   int nRet = 0;
10289   if( p->pStatement ) nRet = p->pStatement->iId+1;
10290   return nRet;
10291 }
10292 
10293 /*
10294 ** Return a component of the report.
10295 */
10296 const char *sqlite3_expert_report(sqlite3expert *p, int iStmt, int eReport){
10297   const char *zRet = 0;
10298   IdxStatement *pStmt;
10299 
10300   if( p->bRun==0 ) return 0;
10301   for(pStmt=p->pStatement; pStmt && pStmt->iId!=iStmt; pStmt=pStmt->pNext);
10302   switch( eReport ){
10303     case EXPERT_REPORT_SQL:
10304       if( pStmt ) zRet = pStmt->zSql;
10305       break;
10306     case EXPERT_REPORT_INDEXES:
10307       if( pStmt ) zRet = pStmt->zIdx;
10308       break;
10309     case EXPERT_REPORT_PLAN:
10310       if( pStmt ) zRet = pStmt->zEQP;
10311       break;
10312     case EXPERT_REPORT_CANDIDATES:
10313       zRet = p->zCandidates;
10314       break;
10315   }
10316   return zRet;
10317 }
10318 
10319 /*
10320 ** Free an sqlite3expert object.
10321 */
10322 void sqlite3_expert_destroy(sqlite3expert *p){
10323   if( p ){
10324     sqlite3_close(p->dbm);
10325     sqlite3_close(p->dbv);
10326     idxScanFree(p->pScan, 0);
10327     idxStatementFree(p->pStatement, 0);
10328     idxTableFree(p->pTable);
10329     idxWriteFree(p->pWrite);
10330     idxHashClear(&p->hIdx);
10331     sqlite3_free(p->zCandidates);
10332     sqlite3_free(p);
10333   }
10334 }
10335 
10336 #endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
10337 
10338 /************************* End ../ext/expert/sqlite3expert.c ********************/
10339 
10340 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
10341 /************************* Begin ../ext/misc/dbdata.c ******************/
10342 /*
10343 ** 2019-04-17
10344 **
10345 ** The author disclaims copyright to this source code.  In place of
10346 ** a legal notice, here is a blessing:
10347 **
10348 **    May you do good and not evil.
10349 **    May you find forgiveness for yourself and forgive others.
10350 **    May you share freely, never taking more than you give.
10351 **
10352 ******************************************************************************
10353 **
10354 ** This file contains an implementation of two eponymous virtual tables,
10355 ** "sqlite_dbdata" and "sqlite_dbptr". Both modules require that the
10356 ** "sqlite_dbpage" eponymous virtual table be available.
10357 **
10358 ** SQLITE_DBDATA:
10359 **   sqlite_dbdata is used to extract data directly from a database b-tree
10360 **   page and its associated overflow pages, bypassing the b-tree layer.
10361 **   The table schema is equivalent to:
10362 **
10363 **     CREATE TABLE sqlite_dbdata(
10364 **       pgno INTEGER,
10365 **       cell INTEGER,
10366 **       field INTEGER,
10367 **       value ANY,
10368 **       schema TEXT HIDDEN
10369 **     );
10370 **
10371 **   IMPORTANT: THE VIRTUAL TABLE SCHEMA ABOVE IS SUBJECT TO CHANGE. IN THE
10372 **   FUTURE NEW NON-HIDDEN COLUMNS MAY BE ADDED BETWEEN "value" AND
10373 **   "schema".
10374 **
10375 **   Each page of the database is inspected. If it cannot be interpreted as
10376 **   a b-tree page, or if it is a b-tree page containing 0 entries, the
10377 **   sqlite_dbdata table contains no rows for that page.  Otherwise, the
10378 **   table contains one row for each field in the record associated with
10379 **   each cell on the page. For intkey b-trees, the key value is stored in
10380 **   field -1.
10381 **
10382 **   For example, for the database:
10383 **
10384 **     CREATE TABLE t1(a, b);     -- root page is page 2
10385 **     INSERT INTO t1(rowid, a, b) VALUES(5, 'v', 'five');
10386 **     INSERT INTO t1(rowid, a, b) VALUES(10, 'x', 'ten');
10387 **
10388 **   the sqlite_dbdata table contains, as well as from entries related to
10389 **   page 1, content equivalent to:
10390 **
10391 **     INSERT INTO sqlite_dbdata(pgno, cell, field, value) VALUES
10392 **         (2, 0, -1, 5     ),
10393 **         (2, 0,  0, 'v'   ),
10394 **         (2, 0,  1, 'five'),
10395 **         (2, 1, -1, 10    ),
10396 **         (2, 1,  0, 'x'   ),
10397 **         (2, 1,  1, 'ten' );
10398 **
10399 **   If database corruption is encountered, this module does not report an
10400 **   error. Instead, it attempts to extract as much data as possible and
10401 **   ignores the corruption.
10402 **
10403 ** SQLITE_DBPTR:
10404 **   The sqlite_dbptr table has the following schema:
10405 **
10406 **     CREATE TABLE sqlite_dbptr(
10407 **       pgno INTEGER,
10408 **       child INTEGER,
10409 **       schema TEXT HIDDEN
10410 **     );
10411 **
10412 **   It contains one entry for each b-tree pointer between a parent and
10413 **   child page in the database.
10414 */
10415 #if !defined(SQLITEINT_H)
10416 /* #include "sqlite3ext.h" */
10417 
10418 /* typedef unsigned char u8; */
10419 
10420 #endif
10421 SQLITE_EXTENSION_INIT1
10422 #include <string.h>
10423 #include <assert.h>
10424 
10425 #define DBDATA_PADDING_BYTES 100
10426 
10427 typedef struct DbdataTable DbdataTable;
10428 typedef struct DbdataCursor DbdataCursor;
10429 
10430 /* Cursor object */
10431 struct DbdataCursor {
10432   sqlite3_vtab_cursor base;       /* Base class.  Must be first */
10433   sqlite3_stmt *pStmt;            /* For fetching database pages */
10434 
10435   int iPgno;                      /* Current page number */
10436   u8 *aPage;                      /* Buffer containing page */
10437   int nPage;                      /* Size of aPage[] in bytes */
10438   int nCell;                      /* Number of cells on aPage[] */
10439   int iCell;                      /* Current cell number */
10440   int bOnePage;                   /* True to stop after one page */
10441   int szDb;
10442   sqlite3_int64 iRowid;
10443 
10444   /* Only for the sqlite_dbdata table */
10445   u8 *pRec;                       /* Buffer containing current record */
10446   int nRec;                       /* Size of pRec[] in bytes */
10447   int nHdr;                       /* Size of header in bytes */
10448   int iField;                     /* Current field number */
10449   u8 *pHdrPtr;
10450   u8 *pPtr;
10451 
10452   sqlite3_int64 iIntkey;          /* Integer key value */
10453 };
10454 
10455 /* Table object */
10456 struct DbdataTable {
10457   sqlite3_vtab base;              /* Base class.  Must be first */
10458   sqlite3 *db;                    /* The database connection */
10459   sqlite3_stmt *pStmt;            /* For fetching database pages */
10460   int bPtr;                       /* True for sqlite3_dbptr table */
10461 };
10462 
10463 /* Column and schema definitions for sqlite_dbdata */
10464 #define DBDATA_COLUMN_PGNO        0
10465 #define DBDATA_COLUMN_CELL        1
10466 #define DBDATA_COLUMN_FIELD       2
10467 #define DBDATA_COLUMN_VALUE       3
10468 #define DBDATA_COLUMN_SCHEMA      4
10469 #define DBDATA_SCHEMA             \
10470       "CREATE TABLE x("           \
10471       "  pgno INTEGER,"           \
10472       "  cell INTEGER,"           \
10473       "  field INTEGER,"          \
10474       "  value ANY,"              \
10475       "  schema TEXT HIDDEN"      \
10476       ")"
10477 
10478 /* Column and schema definitions for sqlite_dbptr */
10479 #define DBPTR_COLUMN_PGNO         0
10480 #define DBPTR_COLUMN_CHILD        1
10481 #define DBPTR_COLUMN_SCHEMA       2
10482 #define DBPTR_SCHEMA              \
10483       "CREATE TABLE x("           \
10484       "  pgno INTEGER,"           \
10485       "  child INTEGER,"          \
10486       "  schema TEXT HIDDEN"      \
10487       ")"
10488 
10489 /*
10490 ** Connect to an sqlite_dbdata (pAux==0) or sqlite_dbptr (pAux!=0) virtual
10491 ** table.
10492 */
10493 static int dbdataConnect(
10494   sqlite3 *db,
10495   void *pAux,
10496   int argc, const char *const*argv,
10497   sqlite3_vtab **ppVtab,
10498   char **pzErr
10499 ){
10500   DbdataTable *pTab = 0;
10501   int rc = sqlite3_declare_vtab(db, pAux ? DBPTR_SCHEMA : DBDATA_SCHEMA);
10502 
10503   if( rc==SQLITE_OK ){
10504     pTab = (DbdataTable*)sqlite3_malloc64(sizeof(DbdataTable));
10505     if( pTab==0 ){
10506       rc = SQLITE_NOMEM;
10507     }else{
10508       memset(pTab, 0, sizeof(DbdataTable));
10509       pTab->db = db;
10510       pTab->bPtr = (pAux!=0);
10511     }
10512   }
10513 
10514   *ppVtab = (sqlite3_vtab*)pTab;
10515   return rc;
10516 }
10517 
10518 /*
10519 ** Disconnect from or destroy a sqlite_dbdata or sqlite_dbptr virtual table.
10520 */
10521 static int dbdataDisconnect(sqlite3_vtab *pVtab){
10522   DbdataTable *pTab = (DbdataTable*)pVtab;
10523   if( pTab ){
10524     sqlite3_finalize(pTab->pStmt);
10525     sqlite3_free(pVtab);
10526   }
10527   return SQLITE_OK;
10528 }
10529 
10530 /*
10531 ** This function interprets two types of constraints:
10532 **
10533 **       schema=?
10534 **       pgno=?
10535 **
10536 ** If neither are present, idxNum is set to 0. If schema=? is present,
10537 ** the 0x01 bit in idxNum is set. If pgno=? is present, the 0x02 bit
10538 ** in idxNum is set.
10539 **
10540 ** If both parameters are present, schema is in position 0 and pgno in
10541 ** position 1.
10542 */
10543 static int dbdataBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdx){
10544   DbdataTable *pTab = (DbdataTable*)tab;
10545   int i;
10546   int iSchema = -1;
10547   int iPgno = -1;
10548   int colSchema = (pTab->bPtr ? DBPTR_COLUMN_SCHEMA : DBDATA_COLUMN_SCHEMA);
10549 
10550   for(i=0; i<pIdx->nConstraint; i++){
10551     struct sqlite3_index_constraint *p = &pIdx->aConstraint[i];
10552     if( p->op==SQLITE_INDEX_CONSTRAINT_EQ ){
10553       if( p->iColumn==colSchema ){
10554         if( p->usable==0 ) return SQLITE_CONSTRAINT;
10555         iSchema = i;
10556       }
10557       if( p->iColumn==DBDATA_COLUMN_PGNO && p->usable ){
10558         iPgno = i;
10559       }
10560     }
10561   }
10562 
10563   if( iSchema>=0 ){
10564     pIdx->aConstraintUsage[iSchema].argvIndex = 1;
10565     pIdx->aConstraintUsage[iSchema].omit = 1;
10566   }
10567   if( iPgno>=0 ){
10568     pIdx->aConstraintUsage[iPgno].argvIndex = 1 + (iSchema>=0);
10569     pIdx->aConstraintUsage[iPgno].omit = 1;
10570     pIdx->estimatedCost = 100;
10571     pIdx->estimatedRows =  50;
10572 
10573     if( pTab->bPtr==0 && pIdx->nOrderBy && pIdx->aOrderBy[0].desc==0 ){
10574       int iCol = pIdx->aOrderBy[0].iColumn;
10575       if( pIdx->nOrderBy==1 ){
10576         pIdx->orderByConsumed = (iCol==0 || iCol==1);
10577       }else if( pIdx->nOrderBy==2 && pIdx->aOrderBy[1].desc==0 && iCol==0 ){
10578         pIdx->orderByConsumed = (pIdx->aOrderBy[1].iColumn==1);
10579       }
10580     }
10581 
10582   }else{
10583     pIdx->estimatedCost = 100000000;
10584     pIdx->estimatedRows = 1000000000;
10585   }
10586   pIdx->idxNum = (iSchema>=0 ? 0x01 : 0x00) | (iPgno>=0 ? 0x02 : 0x00);
10587   return SQLITE_OK;
10588 }
10589 
10590 /*
10591 ** Open a new sqlite_dbdata or sqlite_dbptr cursor.
10592 */
10593 static int dbdataOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){
10594   DbdataCursor *pCsr;
10595 
10596   pCsr = (DbdataCursor*)sqlite3_malloc64(sizeof(DbdataCursor));
10597   if( pCsr==0 ){
10598     return SQLITE_NOMEM;
10599   }else{
10600     memset(pCsr, 0, sizeof(DbdataCursor));
10601     pCsr->base.pVtab = pVTab;
10602   }
10603 
10604   *ppCursor = (sqlite3_vtab_cursor *)pCsr;
10605   return SQLITE_OK;
10606 }
10607 
10608 /*
10609 ** Restore a cursor object to the state it was in when first allocated
10610 ** by dbdataOpen().
10611 */
10612 static void dbdataResetCursor(DbdataCursor *pCsr){
10613   DbdataTable *pTab = (DbdataTable*)(pCsr->base.pVtab);
10614   if( pTab->pStmt==0 ){
10615     pTab->pStmt = pCsr->pStmt;
10616   }else{
10617     sqlite3_finalize(pCsr->pStmt);
10618   }
10619   pCsr->pStmt = 0;
10620   pCsr->iPgno = 1;
10621   pCsr->iCell = 0;
10622   pCsr->iField = 0;
10623   pCsr->bOnePage = 0;
10624   sqlite3_free(pCsr->aPage);
10625   sqlite3_free(pCsr->pRec);
10626   pCsr->pRec = 0;
10627   pCsr->aPage = 0;
10628 }
10629 
10630 /*
10631 ** Close an sqlite_dbdata or sqlite_dbptr cursor.
10632 */
10633 static int dbdataClose(sqlite3_vtab_cursor *pCursor){
10634   DbdataCursor *pCsr = (DbdataCursor*)pCursor;
10635   dbdataResetCursor(pCsr);
10636   sqlite3_free(pCsr);
10637   return SQLITE_OK;
10638 }
10639 
10640 /*
10641 ** Utility methods to decode 16 and 32-bit big-endian unsigned integers.
10642 */
10643 static unsigned int get_uint16(unsigned char *a){
10644   return (a[0]<<8)|a[1];
10645 }
10646 static unsigned int get_uint32(unsigned char *a){
10647   return ((unsigned int)a[0]<<24)
10648        | ((unsigned int)a[1]<<16)
10649        | ((unsigned int)a[2]<<8)
10650        | ((unsigned int)a[3]);
10651 }
10652 
10653 /*
10654 ** Load page pgno from the database via the sqlite_dbpage virtual table.
10655 ** If successful, set (*ppPage) to point to a buffer containing the page
10656 ** data, (*pnPage) to the size of that buffer in bytes and return
10657 ** SQLITE_OK. In this case it is the responsibility of the caller to
10658 ** eventually free the buffer using sqlite3_free().
10659 **
10660 ** Or, if an error occurs, set both (*ppPage) and (*pnPage) to 0 and
10661 ** return an SQLite error code.
10662 */
10663 static int dbdataLoadPage(
10664   DbdataCursor *pCsr,             /* Cursor object */
10665   unsigned int pgno,              /* Page number of page to load */
10666   u8 **ppPage,                    /* OUT: pointer to page buffer */
10667   int *pnPage                     /* OUT: Size of (*ppPage) in bytes */
10668 ){
10669   int rc2;
10670   int rc = SQLITE_OK;
10671   sqlite3_stmt *pStmt = pCsr->pStmt;
10672 
10673   *ppPage = 0;
10674   *pnPage = 0;
10675   sqlite3_bind_int64(pStmt, 2, pgno);
10676   if( SQLITE_ROW==sqlite3_step(pStmt) ){
10677     int nCopy = sqlite3_column_bytes(pStmt, 0);
10678     if( nCopy>0 ){
10679       u8 *pPage;
10680       pPage = (u8*)sqlite3_malloc64(nCopy + DBDATA_PADDING_BYTES);
10681       if( pPage==0 ){
10682         rc = SQLITE_NOMEM;
10683       }else{
10684         const u8 *pCopy = sqlite3_column_blob(pStmt, 0);
10685         memcpy(pPage, pCopy, nCopy);
10686         memset(&pPage[nCopy], 0, DBDATA_PADDING_BYTES);
10687       }
10688       *ppPage = pPage;
10689       *pnPage = nCopy;
10690     }
10691   }
10692   rc2 = sqlite3_reset(pStmt);
10693   if( rc==SQLITE_OK ) rc = rc2;
10694 
10695   return rc;
10696 }
10697 
10698 /*
10699 ** Read a varint.  Put the value in *pVal and return the number of bytes.
10700 */
10701 static int dbdataGetVarint(const u8 *z, sqlite3_int64 *pVal){
10702   sqlite3_int64 v = 0;
10703   int i;
10704   for(i=0; i<8; i++){
10705     v = (v<<7) + (z[i]&0x7f);
10706     if( (z[i]&0x80)==0 ){ *pVal = v; return i+1; }
10707   }
10708   v = (v<<8) + (z[i]&0xff);
10709   *pVal = v;
10710   return 9;
10711 }
10712 
10713 /*
10714 ** Return the number of bytes of space used by an SQLite value of type
10715 ** eType.
10716 */
10717 static int dbdataValueBytes(int eType){
10718   switch( eType ){
10719     case 0: case 8: case 9:
10720     case 10: case 11:
10721       return 0;
10722     case 1:
10723       return 1;
10724     case 2:
10725       return 2;
10726     case 3:
10727       return 3;
10728     case 4:
10729       return 4;
10730     case 5:
10731       return 6;
10732     case 6:
10733     case 7:
10734       return 8;
10735     default:
10736       if( eType>0 ){
10737         return ((eType-12) / 2);
10738       }
10739       return 0;
10740   }
10741 }
10742 
10743 /*
10744 ** Load a value of type eType from buffer pData and use it to set the
10745 ** result of context object pCtx.
10746 */
10747 static void dbdataValue(
10748   sqlite3_context *pCtx,
10749   int eType,
10750   u8 *pData,
10751   int nData
10752 ){
10753   if( eType>=0 && dbdataValueBytes(eType)<=nData ){
10754     switch( eType ){
10755       case 0:
10756       case 10:
10757       case 11:
10758         sqlite3_result_null(pCtx);
10759         break;
10760 
10761       case 8:
10762         sqlite3_result_int(pCtx, 0);
10763         break;
10764       case 9:
10765         sqlite3_result_int(pCtx, 1);
10766         break;
10767 
10768       case 1: case 2: case 3: case 4: case 5: case 6: case 7: {
10769         sqlite3_uint64 v = (signed char)pData[0];
10770         pData++;
10771         switch( eType ){
10772           case 7:
10773           case 6:  v = (v<<16) + (pData[0]<<8) + pData[1];  pData += 2;
10774           case 5:  v = (v<<16) + (pData[0]<<8) + pData[1];  pData += 2;
10775           case 4:  v = (v<<8) + pData[0];  pData++;
10776           case 3:  v = (v<<8) + pData[0];  pData++;
10777           case 2:  v = (v<<8) + pData[0];  pData++;
10778         }
10779 
10780         if( eType==7 ){
10781           double r;
10782           memcpy(&r, &v, sizeof(r));
10783           sqlite3_result_double(pCtx, r);
10784         }else{
10785           sqlite3_result_int64(pCtx, (sqlite3_int64)v);
10786         }
10787         break;
10788       }
10789 
10790       default: {
10791         int n = ((eType-12) / 2);
10792         if( eType % 2 ){
10793           sqlite3_result_text(pCtx, (const char*)pData, n, SQLITE_TRANSIENT);
10794         }else{
10795           sqlite3_result_blob(pCtx, pData, n, SQLITE_TRANSIENT);
10796         }
10797       }
10798     }
10799   }
10800 }
10801 
10802 /*
10803 ** Move an sqlite_dbdata or sqlite_dbptr cursor to the next entry.
10804 */
10805 static int dbdataNext(sqlite3_vtab_cursor *pCursor){
10806   DbdataCursor *pCsr = (DbdataCursor*)pCursor;
10807   DbdataTable *pTab = (DbdataTable*)pCursor->pVtab;
10808 
10809   pCsr->iRowid++;
10810   while( 1 ){
10811     int rc;
10812     int iOff = (pCsr->iPgno==1 ? 100 : 0);
10813     int bNextPage = 0;
10814 
10815     if( pCsr->aPage==0 ){
10816       while( 1 ){
10817         if( pCsr->bOnePage==0 && pCsr->iPgno>pCsr->szDb ) return SQLITE_OK;
10818         rc = dbdataLoadPage(pCsr, pCsr->iPgno, &pCsr->aPage, &pCsr->nPage);
10819         if( rc!=SQLITE_OK ) return rc;
10820         if( pCsr->aPage ) break;
10821         pCsr->iPgno++;
10822       }
10823       pCsr->iCell = pTab->bPtr ? -2 : 0;
10824       pCsr->nCell = get_uint16(&pCsr->aPage[iOff+3]);
10825     }
10826 
10827     if( pTab->bPtr ){
10828       if( pCsr->aPage[iOff]!=0x02 && pCsr->aPage[iOff]!=0x05 ){
10829         pCsr->iCell = pCsr->nCell;
10830       }
10831       pCsr->iCell++;
10832       if( pCsr->iCell>=pCsr->nCell ){
10833         sqlite3_free(pCsr->aPage);
10834         pCsr->aPage = 0;
10835         if( pCsr->bOnePage ) return SQLITE_OK;
10836         pCsr->iPgno++;
10837       }else{
10838         return SQLITE_OK;
10839       }
10840     }else{
10841       /* If there is no record loaded, load it now. */
10842       if( pCsr->pRec==0 ){
10843         int bHasRowid = 0;
10844         int nPointer = 0;
10845         sqlite3_int64 nPayload = 0;
10846         sqlite3_int64 nHdr = 0;
10847         int iHdr;
10848         int U, X;
10849         int nLocal;
10850 
10851         switch( pCsr->aPage[iOff] ){
10852           case 0x02:
10853             nPointer = 4;
10854             break;
10855           case 0x0a:
10856             break;
10857           case 0x0d:
10858             bHasRowid = 1;
10859             break;
10860           default:
10861             /* This is not a b-tree page with records on it. Continue. */
10862             pCsr->iCell = pCsr->nCell;
10863             break;
10864         }
10865 
10866         if( pCsr->iCell>=pCsr->nCell ){
10867           bNextPage = 1;
10868         }else{
10869 
10870           iOff += 8 + nPointer + pCsr->iCell*2;
10871           if( iOff>pCsr->nPage ){
10872             bNextPage = 1;
10873           }else{
10874             iOff = get_uint16(&pCsr->aPage[iOff]);
10875           }
10876 
10877           /* For an interior node cell, skip past the child-page number */
10878           iOff += nPointer;
10879 
10880           /* Load the "byte of payload including overflow" field */
10881           if( bNextPage || iOff>pCsr->nPage ){
10882             bNextPage = 1;
10883           }else{
10884             iOff += dbdataGetVarint(&pCsr->aPage[iOff], &nPayload);
10885           }
10886 
10887           /* If this is a leaf intkey cell, load the rowid */
10888           if( bHasRowid && !bNextPage && iOff<pCsr->nPage ){
10889             iOff += dbdataGetVarint(&pCsr->aPage[iOff], &pCsr->iIntkey);
10890           }
10891 
10892           /* Figure out how much data to read from the local page */
10893           U = pCsr->nPage;
10894           if( bHasRowid ){
10895             X = U-35;
10896           }else{
10897             X = ((U-12)*64/255)-23;
10898           }
10899           if( nPayload<=X ){
10900             nLocal = nPayload;
10901           }else{
10902             int M, K;
10903             M = ((U-12)*32/255)-23;
10904             K = M+((nPayload-M)%(U-4));
10905             if( K<=X ){
10906               nLocal = K;
10907             }else{
10908               nLocal = M;
10909             }
10910           }
10911 
10912           if( bNextPage || nLocal+iOff>pCsr->nPage ){
10913             bNextPage = 1;
10914           }else{
10915 
10916             /* Allocate space for payload. And a bit more to catch small buffer
10917             ** overruns caused by attempting to read a varint or similar from
10918             ** near the end of a corrupt record.  */
10919             pCsr->pRec = (u8*)sqlite3_malloc64(nPayload+DBDATA_PADDING_BYTES);
10920             if( pCsr->pRec==0 ) return SQLITE_NOMEM;
10921             memset(pCsr->pRec, 0, nPayload+DBDATA_PADDING_BYTES);
10922             pCsr->nRec = nPayload;
10923 
10924             /* Load the nLocal bytes of payload */
10925             memcpy(pCsr->pRec, &pCsr->aPage[iOff], nLocal);
10926             iOff += nLocal;
10927 
10928             /* Load content from overflow pages */
10929             if( nPayload>nLocal ){
10930               sqlite3_int64 nRem = nPayload - nLocal;
10931               unsigned int pgnoOvfl = get_uint32(&pCsr->aPage[iOff]);
10932               while( nRem>0 ){
10933                 u8 *aOvfl = 0;
10934                 int nOvfl = 0;
10935                 int nCopy;
10936                 rc = dbdataLoadPage(pCsr, pgnoOvfl, &aOvfl, &nOvfl);
10937                 assert( rc!=SQLITE_OK || aOvfl==0 || nOvfl==pCsr->nPage );
10938                 if( rc!=SQLITE_OK ) return rc;
10939                 if( aOvfl==0 ) break;
10940 
10941                 nCopy = U-4;
10942                 if( nCopy>nRem ) nCopy = nRem;
10943                 memcpy(&pCsr->pRec[nPayload-nRem], &aOvfl[4], nCopy);
10944                 nRem -= nCopy;
10945 
10946                 pgnoOvfl = get_uint32(aOvfl);
10947                 sqlite3_free(aOvfl);
10948               }
10949             }
10950 
10951             iHdr = dbdataGetVarint(pCsr->pRec, &nHdr);
10952             pCsr->nHdr = nHdr;
10953             pCsr->pHdrPtr = &pCsr->pRec[iHdr];
10954             pCsr->pPtr = &pCsr->pRec[pCsr->nHdr];
10955             pCsr->iField = (bHasRowid ? -1 : 0);
10956           }
10957         }
10958       }else{
10959         pCsr->iField++;
10960         if( pCsr->iField>0 ){
10961           sqlite3_int64 iType;
10962           if( pCsr->pHdrPtr>&pCsr->pRec[pCsr->nRec] ){
10963             bNextPage = 1;
10964           }else{
10965             pCsr->pHdrPtr += dbdataGetVarint(pCsr->pHdrPtr, &iType);
10966             pCsr->pPtr += dbdataValueBytes(iType);
10967           }
10968         }
10969       }
10970 
10971       if( bNextPage ){
10972         sqlite3_free(pCsr->aPage);
10973         sqlite3_free(pCsr->pRec);
10974         pCsr->aPage = 0;
10975         pCsr->pRec = 0;
10976         if( pCsr->bOnePage ) return SQLITE_OK;
10977         pCsr->iPgno++;
10978       }else{
10979         if( pCsr->iField<0 || pCsr->pHdrPtr<&pCsr->pRec[pCsr->nHdr] ){
10980           return SQLITE_OK;
10981         }
10982 
10983         /* Advance to the next cell. The next iteration of the loop will load
10984         ** the record and so on. */
10985         sqlite3_free(pCsr->pRec);
10986         pCsr->pRec = 0;
10987         pCsr->iCell++;
10988       }
10989     }
10990   }
10991 
10992   assert( !"can't get here" );
10993   return SQLITE_OK;
10994 }
10995 
10996 /*
10997 ** Return true if the cursor is at EOF.
10998 */
10999 static int dbdataEof(sqlite3_vtab_cursor *pCursor){
11000   DbdataCursor *pCsr = (DbdataCursor*)pCursor;
11001   return pCsr->aPage==0;
11002 }
11003 
11004 /*
11005 ** Determine the size in pages of database zSchema (where zSchema is
11006 ** "main", "temp" or the name of an attached database) and set
11007 ** pCsr->szDb accordingly. If successful, return SQLITE_OK. Otherwise,
11008 ** an SQLite error code.
11009 */
11010 static int dbdataDbsize(DbdataCursor *pCsr, const char *zSchema){
11011   DbdataTable *pTab = (DbdataTable*)pCsr->base.pVtab;
11012   char *zSql = 0;
11013   int rc, rc2;
11014   sqlite3_stmt *pStmt = 0;
11015 
11016   zSql = sqlite3_mprintf("PRAGMA %Q.page_count", zSchema);
11017   if( zSql==0 ) return SQLITE_NOMEM;
11018   rc = sqlite3_prepare_v2(pTab->db, zSql, -1, &pStmt, 0);
11019   sqlite3_free(zSql);
11020   if( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
11021     pCsr->szDb = sqlite3_column_int(pStmt, 0);
11022   }
11023   rc2 = sqlite3_finalize(pStmt);
11024   if( rc==SQLITE_OK ) rc = rc2;
11025   return rc;
11026 }
11027 
11028 /*
11029 ** xFilter method for sqlite_dbdata and sqlite_dbptr.
11030 */
11031 static int dbdataFilter(
11032   sqlite3_vtab_cursor *pCursor,
11033   int idxNum, const char *idxStr,
11034   int argc, sqlite3_value **argv
11035 ){
11036   DbdataCursor *pCsr = (DbdataCursor*)pCursor;
11037   DbdataTable *pTab = (DbdataTable*)pCursor->pVtab;
11038   int rc = SQLITE_OK;
11039   const char *zSchema = "main";
11040 
11041   dbdataResetCursor(pCsr);
11042   assert( pCsr->iPgno==1 );
11043   if( idxNum & 0x01 ){
11044     zSchema = (const char*)sqlite3_value_text(argv[0]);
11045   }
11046   if( idxNum & 0x02 ){
11047     pCsr->iPgno = sqlite3_value_int(argv[(idxNum & 0x01)]);
11048     pCsr->bOnePage = 1;
11049   }else{
11050     pCsr->nPage = dbdataDbsize(pCsr, zSchema);
11051     rc = dbdataDbsize(pCsr, zSchema);
11052   }
11053 
11054   if( rc==SQLITE_OK ){
11055     if( pTab->pStmt ){
11056       pCsr->pStmt = pTab->pStmt;
11057       pTab->pStmt = 0;
11058     }else{
11059       rc = sqlite3_prepare_v2(pTab->db,
11060           "SELECT data FROM sqlite_dbpage(?) WHERE pgno=?", -1,
11061           &pCsr->pStmt, 0
11062       );
11063     }
11064   }
11065   if( rc==SQLITE_OK ){
11066     rc = sqlite3_bind_text(pCsr->pStmt, 1, zSchema, -1, SQLITE_TRANSIENT);
11067   }else{
11068     pTab->base.zErrMsg = sqlite3_mprintf("%s", sqlite3_errmsg(pTab->db));
11069   }
11070   if( rc==SQLITE_OK ){
11071     rc = dbdataNext(pCursor);
11072   }
11073   return rc;
11074 }
11075 
11076 /*
11077 ** Return a column for the sqlite_dbdata or sqlite_dbptr table.
11078 */
11079 static int dbdataColumn(
11080   sqlite3_vtab_cursor *pCursor,
11081   sqlite3_context *ctx,
11082   int i
11083 ){
11084   DbdataCursor *pCsr = (DbdataCursor*)pCursor;
11085   DbdataTable *pTab = (DbdataTable*)pCursor->pVtab;
11086   if( pTab->bPtr ){
11087     switch( i ){
11088       case DBPTR_COLUMN_PGNO:
11089         sqlite3_result_int64(ctx, pCsr->iPgno);
11090         break;
11091       case DBPTR_COLUMN_CHILD: {
11092         int iOff = pCsr->iPgno==1 ? 100 : 0;
11093         if( pCsr->iCell<0 ){
11094           iOff += 8;
11095         }else{
11096           iOff += 12 + pCsr->iCell*2;
11097           if( iOff>pCsr->nPage ) return SQLITE_OK;
11098           iOff = get_uint16(&pCsr->aPage[iOff]);
11099         }
11100         if( iOff<=pCsr->nPage ){
11101           sqlite3_result_int64(ctx, get_uint32(&pCsr->aPage[iOff]));
11102         }
11103         break;
11104       }
11105     }
11106   }else{
11107     switch( i ){
11108       case DBDATA_COLUMN_PGNO:
11109         sqlite3_result_int64(ctx, pCsr->iPgno);
11110         break;
11111       case DBDATA_COLUMN_CELL:
11112         sqlite3_result_int(ctx, pCsr->iCell);
11113         break;
11114       case DBDATA_COLUMN_FIELD:
11115         sqlite3_result_int(ctx, pCsr->iField);
11116         break;
11117       case DBDATA_COLUMN_VALUE: {
11118         if( pCsr->iField<0 ){
11119           sqlite3_result_int64(ctx, pCsr->iIntkey);
11120         }else{
11121           sqlite3_int64 iType;
11122           dbdataGetVarint(pCsr->pHdrPtr, &iType);
11123           dbdataValue(
11124               ctx, iType, pCsr->pPtr, &pCsr->pRec[pCsr->nRec] - pCsr->pPtr
11125           );
11126         }
11127         break;
11128       }
11129     }
11130   }
11131   return SQLITE_OK;
11132 }
11133 
11134 /*
11135 ** Return the rowid for an sqlite_dbdata or sqlite_dptr table.
11136 */
11137 static int dbdataRowid(sqlite3_vtab_cursor *pCursor, sqlite_int64 *pRowid){
11138   DbdataCursor *pCsr = (DbdataCursor*)pCursor;
11139   *pRowid = pCsr->iRowid;
11140   return SQLITE_OK;
11141 }
11142 
11143 
11144 /*
11145 ** Invoke this routine to register the "sqlite_dbdata" virtual table module
11146 */
11147 static int sqlite3DbdataRegister(sqlite3 *db){
11148   static sqlite3_module dbdata_module = {
11149     0,                            /* iVersion */
11150     0,                            /* xCreate */
11151     dbdataConnect,                /* xConnect */
11152     dbdataBestIndex,              /* xBestIndex */
11153     dbdataDisconnect,             /* xDisconnect */
11154     0,                            /* xDestroy */
11155     dbdataOpen,                   /* xOpen - open a cursor */
11156     dbdataClose,                  /* xClose - close a cursor */
11157     dbdataFilter,                 /* xFilter - configure scan constraints */
11158     dbdataNext,                   /* xNext - advance a cursor */
11159     dbdataEof,                    /* xEof - check for end of scan */
11160     dbdataColumn,                 /* xColumn - read data */
11161     dbdataRowid,                  /* xRowid - read data */
11162     0,                            /* xUpdate */
11163     0,                            /* xBegin */
11164     0,                            /* xSync */
11165     0,                            /* xCommit */
11166     0,                            /* xRollback */
11167     0,                            /* xFindMethod */
11168     0,                            /* xRename */
11169     0,                            /* xSavepoint */
11170     0,                            /* xRelease */
11171     0,                            /* xRollbackTo */
11172     0                             /* xShadowName */
11173   };
11174 
11175   int rc = sqlite3_create_module(db, "sqlite_dbdata", &dbdata_module, 0);
11176   if( rc==SQLITE_OK ){
11177     rc = sqlite3_create_module(db, "sqlite_dbptr", &dbdata_module, (void*)1);
11178   }
11179   return rc;
11180 }
11181 
11182 #ifdef _WIN32
11183 
11184 #endif
11185 int sqlite3_dbdata_init(
11186   sqlite3 *db,
11187   char **pzErrMsg,
11188   const sqlite3_api_routines *pApi
11189 ){
11190   SQLITE_EXTENSION_INIT2(pApi);
11191   return sqlite3DbdataRegister(db);
11192 }
11193 
11194 /************************* End ../ext/misc/dbdata.c ********************/
11195 #endif
11196 
11197 #if defined(SQLITE_ENABLE_SESSION)
11198 /*
11199 ** State information for a single open session
11200 */
11201 typedef struct OpenSession OpenSession;
11202 struct OpenSession {
11203   char *zName;             /* Symbolic name for this session */
11204   int nFilter;             /* Number of xFilter rejection GLOB patterns */
11205   char **azFilter;         /* Array of xFilter rejection GLOB patterns */
11206   sqlite3_session *p;      /* The open session */
11207 };
11208 #endif
11209 
11210 typedef struct ExpertInfo ExpertInfo;
11211 struct ExpertInfo {
11212   sqlite3expert *pExpert;
11213   int bVerbose;
11214 };
11215 
11216 /* A single line in the EQP output */
11217 typedef struct EQPGraphRow EQPGraphRow;
11218 struct EQPGraphRow {
11219   int iEqpId;           /* ID for this row */
11220   int iParentId;        /* ID of the parent row */
11221   EQPGraphRow *pNext;   /* Next row in sequence */
11222   char zText[1];        /* Text to display for this row */
11223 };
11224 
11225 /* All EQP output is collected into an instance of the following */
11226 typedef struct EQPGraph EQPGraph;
11227 struct EQPGraph {
11228   EQPGraphRow *pRow;    /* Linked list of all rows of the EQP output */
11229   EQPGraphRow *pLast;   /* Last element of the pRow list */
11230   char zPrefix[100];    /* Graph prefix */
11231 };
11232 
11233 /*
11234 ** State information about the database connection is contained in an
11235 ** instance of the following structure.
11236 */
11237 typedef struct ShellState ShellState;
11238 struct ShellState {
11239   sqlite3 *db;           /* The database */
11240   u8 autoExplain;        /* Automatically turn on .explain mode */
11241   u8 autoEQP;            /* Run EXPLAIN QUERY PLAN prior to seach SQL stmt */
11242   u8 autoEQPtest;        /* autoEQP is in test mode */
11243   u8 autoEQPtrace;       /* autoEQP is in trace mode */
11244   u8 scanstatsOn;        /* True to display scan stats before each finalize */
11245   u8 openMode;           /* SHELL_OPEN_NORMAL, _APPENDVFS, or _ZIPFILE */
11246   u8 doXdgOpen;          /* Invoke start/open/xdg-open in output_reset() */
11247   u8 nEqpLevel;          /* Depth of the EQP output graph */
11248   u8 eTraceType;         /* SHELL_TRACE_* value for type of trace */
11249   unsigned statsOn;      /* True to display memory stats before each finalize */
11250   unsigned mEqpLines;    /* Mask of veritical lines in the EQP output graph */
11251   int outCount;          /* Revert to stdout when reaching zero */
11252   int cnt;               /* Number of records displayed so far */
11253   int lineno;            /* Line number of last line read from in */
11254   int openFlags;         /* Additional flags to open.  (SQLITE_OPEN_NOFOLLOW) */
11255   FILE *in;              /* Read commands from this stream */
11256   FILE *out;             /* Write results here */
11257   FILE *traceOut;        /* Output for sqlite3_trace() */
11258   int nErr;              /* Number of errors seen */
11259   int mode;              /* An output mode setting */
11260   int modePrior;         /* Saved mode */
11261   int cMode;             /* temporary output mode for the current query */
11262   int normalMode;        /* Output mode before ".explain on" */
11263   int writableSchema;    /* True if PRAGMA writable_schema=ON */
11264   int showHeader;        /* True to show column names in List or Column mode */
11265   int nCheck;            /* Number of ".check" commands run */
11266   unsigned nProgress;    /* Number of progress callbacks encountered */
11267   unsigned mxProgress;   /* Maximum progress callbacks before failing */
11268   unsigned flgProgress;  /* Flags for the progress callback */
11269   unsigned shellFlgs;    /* Various flags */
11270   unsigned priorShFlgs;  /* Saved copy of flags */
11271   sqlite3_int64 szMax;   /* --maxsize argument to .open */
11272   char *zDestTable;      /* Name of destination table when MODE_Insert */
11273   char *zTempFile;       /* Temporary file that might need deleting */
11274   char zTestcase[30];    /* Name of current test case */
11275   char colSeparator[20]; /* Column separator character for several modes */
11276   char rowSeparator[20]; /* Row separator character for MODE_Ascii */
11277   char colSepPrior[20];  /* Saved column separator */
11278   char rowSepPrior[20];  /* Saved row separator */
11279   int *colWidth;         /* Requested width of each column in columnar modes */
11280   int *actualWidth;      /* Actual width of each column */
11281   int nWidth;            /* Number of slots in colWidth[] and actualWidth[] */
11282   char nullValue[20];    /* The text to print when a NULL comes back from
11283                          ** the database */
11284   char outfile[FILENAME_MAX]; /* Filename for *out */
11285   const char *zDbFilename;    /* name of the database file */
11286   char *zFreeOnClose;         /* Filename to free when closing */
11287   const char *zVfs;           /* Name of VFS to use */
11288   sqlite3_stmt *pStmt;   /* Current statement if any. */
11289   FILE *pLog;            /* Write log output here */
11290   int *aiIndent;         /* Array of indents used in MODE_Explain */
11291   int nIndent;           /* Size of array aiIndent[] */
11292   int iIndent;           /* Index of current op in aiIndent[] */
11293   EQPGraph sGraph;       /* Information for the graphical EXPLAIN QUERY PLAN */
11294 #if defined(SQLITE_ENABLE_SESSION)
11295   int nSession;             /* Number of active sessions */
11296   OpenSession aSession[4];  /* Array of sessions.  [0] is in focus. */
11297 #endif
11298   ExpertInfo expert;        /* Valid if previous command was ".expert OPT..." */
11299 };
11300 
11301 
11302 /* Allowed values for ShellState.autoEQP
11303 */
11304 #define AUTOEQP_off      0           /* Automatic EXPLAIN QUERY PLAN is off */
11305 #define AUTOEQP_on       1           /* Automatic EQP is on */
11306 #define AUTOEQP_trigger  2           /* On and also show plans for triggers */
11307 #define AUTOEQP_full     3           /* Show full EXPLAIN */
11308 
11309 /* Allowed values for ShellState.openMode
11310 */
11311 #define SHELL_OPEN_UNSPEC      0      /* No open-mode specified */
11312 #define SHELL_OPEN_NORMAL      1      /* Normal database file */
11313 #define SHELL_OPEN_APPENDVFS   2      /* Use appendvfs */
11314 #define SHELL_OPEN_ZIPFILE     3      /* Use the zipfile virtual table */
11315 #define SHELL_OPEN_READONLY    4      /* Open a normal database read-only */
11316 #define SHELL_OPEN_DESERIALIZE 5      /* Open using sqlite3_deserialize() */
11317 #define SHELL_OPEN_HEXDB       6      /* Use "dbtotxt" output as data source */
11318 
11319 /* Allowed values for ShellState.eTraceType
11320 */
11321 #define SHELL_TRACE_PLAIN      0      /* Show input SQL text */
11322 #define SHELL_TRACE_EXPANDED   1      /* Show expanded SQL text */
11323 #define SHELL_TRACE_NORMALIZED 2      /* Show normalized SQL text */
11324 
11325 /* Bits in the ShellState.flgProgress variable */
11326 #define SHELL_PROGRESS_QUIET 0x01  /* Omit announcing every progress callback */
11327 #define SHELL_PROGRESS_RESET 0x02  /* Reset the count when the progres
11328                                    ** callback limit is reached, and for each
11329                                    ** top-level SQL statement */
11330 #define SHELL_PROGRESS_ONCE  0x04  /* Cancel the --limit after firing once */
11331 
11332 /*
11333 ** These are the allowed shellFlgs values
11334 */
11335 #define SHFLG_Pagecache      0x00000001 /* The --pagecache option is used */
11336 #define SHFLG_Lookaside      0x00000002 /* Lookaside memory is used */
11337 #define SHFLG_Backslash      0x00000004 /* The --backslash option is used */
11338 #define SHFLG_PreserveRowid  0x00000008 /* .dump preserves rowid values */
11339 #define SHFLG_Newlines       0x00000010 /* .dump --newline flag */
11340 #define SHFLG_CountChanges   0x00000020 /* .changes setting */
11341 #define SHFLG_Echo           0x00000040 /* .echo or --echo setting */
11342 #define SHFLG_HeaderSet      0x00000080 /* .header has been used */
11343 #define SHFLG_DumpDataOnly   0x00000100 /* .dump show data only */
11344 #define SHFLG_DumpNoSys      0x00000200 /* .dump omits system tables */
11345 
11346 /*
11347 ** Macros for testing and setting shellFlgs
11348 */
11349 #define ShellHasFlag(P,X)    (((P)->shellFlgs & (X))!=0)
11350 #define ShellSetFlag(P,X)    ((P)->shellFlgs|=(X))
11351 #define ShellClearFlag(P,X)  ((P)->shellFlgs&=(~(X)))
11352 
11353 /*
11354 ** These are the allowed modes.
11355 */
11356 #define MODE_Line     0  /* One column per line.  Blank line between records */
11357 #define MODE_Column   1  /* One record per line in neat columns */
11358 #define MODE_List     2  /* One record per line with a separator */
11359 #define MODE_Semi     3  /* Same as MODE_List but append ";" to each line */
11360 #define MODE_Html     4  /* Generate an XHTML table */
11361 #define MODE_Insert   5  /* Generate SQL "insert" statements */
11362 #define MODE_Quote    6  /* Quote values as for SQL */
11363 #define MODE_Tcl      7  /* Generate ANSI-C or TCL quoted elements */
11364 #define MODE_Csv      8  /* Quote strings, numbers are plain */
11365 #define MODE_Explain  9  /* Like MODE_Column, but do not truncate data */
11366 #define MODE_Ascii   10  /* Use ASCII unit and record separators (0x1F/0x1E) */
11367 #define MODE_Pretty  11  /* Pretty-print schemas */
11368 #define MODE_EQP     12  /* Converts EXPLAIN QUERY PLAN output into a graph */
11369 #define MODE_Json    13  /* Output JSON */
11370 #define MODE_Markdown 14 /* Markdown formatting */
11371 #define MODE_Table   15  /* MySQL-style table formatting */
11372 #define MODE_Box     16  /* Unicode box-drawing characters */
11373 
11374 static const char *modeDescr[] = {
11375   "line",
11376   "column",
11377   "list",
11378   "semi",
11379   "html",
11380   "insert",
11381   "quote",
11382   "tcl",
11383   "csv",
11384   "explain",
11385   "ascii",
11386   "prettyprint",
11387   "eqp",
11388   "json",
11389   "markdown",
11390   "table",
11391   "box"
11392 };
11393 
11394 /*
11395 ** These are the column/row/line separators used by the various
11396 ** import/export modes.
11397 */
11398 #define SEP_Column    "|"
11399 #define SEP_Row       "\n"
11400 #define SEP_Tab       "\t"
11401 #define SEP_Space     " "
11402 #define SEP_Comma     ","
11403 #define SEP_CrLf      "\r\n"
11404 #define SEP_Unit      "\x1F"
11405 #define SEP_Record    "\x1E"
11406 
11407 /*
11408 ** A callback for the sqlite3_log() interface.
11409 */
11410 static void shellLog(void *pArg, int iErrCode, const char *zMsg){
11411   ShellState *p = (ShellState*)pArg;
11412   if( p->pLog==0 ) return;
11413   utf8_printf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
11414   fflush(p->pLog);
11415 }
11416 
11417 /*
11418 ** SQL function:  shell_putsnl(X)
11419 **
11420 ** Write the text X to the screen (or whatever output is being directed)
11421 ** adding a newline at the end, and then return X.
11422 */
11423 static void shellPutsFunc(
11424   sqlite3_context *pCtx,
11425   int nVal,
11426   sqlite3_value **apVal
11427 ){
11428   ShellState *p = (ShellState*)sqlite3_user_data(pCtx);
11429   (void)nVal;
11430   utf8_printf(p->out, "%s\n", sqlite3_value_text(apVal[0]));
11431   sqlite3_result_value(pCtx, apVal[0]);
11432 }
11433 
11434 /*
11435 ** SQL function:   edit(VALUE)
11436 **                 edit(VALUE,EDITOR)
11437 **
11438 ** These steps:
11439 **
11440 **     (1) Write VALUE into a temporary file.
11441 **     (2) Run program EDITOR on that temporary file.
11442 **     (3) Read the temporary file back and return its content as the result.
11443 **     (4) Delete the temporary file
11444 **
11445 ** If the EDITOR argument is omitted, use the value in the VISUAL
11446 ** environment variable.  If still there is no EDITOR, through an error.
11447 **
11448 ** Also throw an error if the EDITOR program returns a non-zero exit code.
11449 */
11450 #ifndef SQLITE_NOHAVE_SYSTEM
11451 static void editFunc(
11452   sqlite3_context *context,
11453   int argc,
11454   sqlite3_value **argv
11455 ){
11456   const char *zEditor;
11457   char *zTempFile = 0;
11458   sqlite3 *db;
11459   char *zCmd = 0;
11460   int bBin;
11461   int rc;
11462   int hasCRNL = 0;
11463   FILE *f = 0;
11464   sqlite3_int64 sz;
11465   sqlite3_int64 x;
11466   unsigned char *p = 0;
11467 
11468   if( argc==2 ){
11469     zEditor = (const char*)sqlite3_value_text(argv[1]);
11470   }else{
11471     zEditor = getenv("VISUAL");
11472   }
11473   if( zEditor==0 ){
11474     sqlite3_result_error(context, "no editor for edit()", -1);
11475     return;
11476   }
11477   if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
11478     sqlite3_result_error(context, "NULL input to edit()", -1);
11479     return;
11480   }
11481   db = sqlite3_context_db_handle(context);
11482   zTempFile = 0;
11483   sqlite3_file_control(db, 0, SQLITE_FCNTL_TEMPFILENAME, &zTempFile);
11484   if( zTempFile==0 ){
11485     sqlite3_uint64 r = 0;
11486     sqlite3_randomness(sizeof(r), &r);
11487     zTempFile = sqlite3_mprintf("temp%llx", r);
11488     if( zTempFile==0 ){
11489       sqlite3_result_error_nomem(context);
11490       return;
11491     }
11492   }
11493   bBin = sqlite3_value_type(argv[0])==SQLITE_BLOB;
11494   /* When writing the file to be edited, do \n to \r\n conversions on systems
11495   ** that want \r\n line endings */
11496   f = fopen(zTempFile, bBin ? "wb" : "w");
11497   if( f==0 ){
11498     sqlite3_result_error(context, "edit() cannot open temp file", -1);
11499     goto edit_func_end;
11500   }
11501   sz = sqlite3_value_bytes(argv[0]);
11502   if( bBin ){
11503     x = fwrite(sqlite3_value_blob(argv[0]), 1, (size_t)sz, f);
11504   }else{
11505     const char *z = (const char*)sqlite3_value_text(argv[0]);
11506     /* Remember whether or not the value originally contained \r\n */
11507     if( z && strstr(z,"\r\n")!=0 ) hasCRNL = 1;
11508     x = fwrite(sqlite3_value_text(argv[0]), 1, (size_t)sz, f);
11509   }
11510   fclose(f);
11511   f = 0;
11512   if( x!=sz ){
11513     sqlite3_result_error(context, "edit() could not write the whole file", -1);
11514     goto edit_func_end;
11515   }
11516   zCmd = sqlite3_mprintf("%s \"%s\"", zEditor, zTempFile);
11517   if( zCmd==0 ){
11518     sqlite3_result_error_nomem(context);
11519     goto edit_func_end;
11520   }
11521   rc = system(zCmd);
11522   sqlite3_free(zCmd);
11523   if( rc ){
11524     sqlite3_result_error(context, "EDITOR returned non-zero", -1);
11525     goto edit_func_end;
11526   }
11527   f = fopen(zTempFile, "rb");
11528   if( f==0 ){
11529     sqlite3_result_error(context,
11530       "edit() cannot reopen temp file after edit", -1);
11531     goto edit_func_end;
11532   }
11533   fseek(f, 0, SEEK_END);
11534   sz = ftell(f);
11535   rewind(f);
11536   p = sqlite3_malloc64( sz+1 );
11537   if( p==0 ){
11538     sqlite3_result_error_nomem(context);
11539     goto edit_func_end;
11540   }
11541   x = fread(p, 1, (size_t)sz, f);
11542   fclose(f);
11543   f = 0;
11544   if( x!=sz ){
11545     sqlite3_result_error(context, "could not read back the whole file", -1);
11546     goto edit_func_end;
11547   }
11548   if( bBin ){
11549     sqlite3_result_blob64(context, p, sz, sqlite3_free);
11550   }else{
11551     sqlite3_int64 i, j;
11552     if( hasCRNL ){
11553       /* If the original contains \r\n then do no conversions back to \n */
11554       j = sz;
11555     }else{
11556       /* If the file did not originally contain \r\n then convert any new
11557       ** \r\n back into \n */
11558       for(i=j=0; i<sz; i++){
11559         if( p[i]=='\r' && p[i+1]=='\n' ) i++;
11560         p[j++] = p[i];
11561       }
11562       sz = j;
11563       p[sz] = 0;
11564     }
11565     sqlite3_result_text64(context, (const char*)p, sz,
11566                           sqlite3_free, SQLITE_UTF8);
11567   }
11568   p = 0;
11569 
11570 edit_func_end:
11571   if( f ) fclose(f);
11572   unlink(zTempFile);
11573   sqlite3_free(zTempFile);
11574   sqlite3_free(p);
11575 }
11576 #endif /* SQLITE_NOHAVE_SYSTEM */
11577 
11578 /*
11579 ** Save or restore the current output mode
11580 */
11581 static void outputModePush(ShellState *p){
11582   p->modePrior = p->mode;
11583   p->priorShFlgs = p->shellFlgs;
11584   memcpy(p->colSepPrior, p->colSeparator, sizeof(p->colSeparator));
11585   memcpy(p->rowSepPrior, p->rowSeparator, sizeof(p->rowSeparator));
11586 }
11587 static void outputModePop(ShellState *p){
11588   p->mode = p->modePrior;
11589   p->shellFlgs = p->priorShFlgs;
11590   memcpy(p->colSeparator, p->colSepPrior, sizeof(p->colSeparator));
11591   memcpy(p->rowSeparator, p->rowSepPrior, sizeof(p->rowSeparator));
11592 }
11593 
11594 /*
11595 ** Output the given string as a hex-encoded blob (eg. X'1234' )
11596 */
11597 static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
11598   int i;
11599   char *zBlob = (char *)pBlob;
11600   raw_printf(out,"X'");
11601   for(i=0; i<nBlob; i++){ raw_printf(out,"%02x",zBlob[i]&0xff); }
11602   raw_printf(out,"'");
11603 }
11604 
11605 /*
11606 ** Find a string that is not found anywhere in z[].  Return a pointer
11607 ** to that string.
11608 **
11609 ** Try to use zA and zB first.  If both of those are already found in z[]
11610 ** then make up some string and store it in the buffer zBuf.
11611 */
11612 static const char *unused_string(
11613   const char *z,                    /* Result must not appear anywhere in z */
11614   const char *zA, const char *zB,   /* Try these first */
11615   char *zBuf                        /* Space to store a generated string */
11616 ){
11617   unsigned i = 0;
11618   if( strstr(z, zA)==0 ) return zA;
11619   if( strstr(z, zB)==0 ) return zB;
11620   do{
11621     sqlite3_snprintf(20,zBuf,"(%s%u)", zA, i++);
11622   }while( strstr(z,zBuf)!=0 );
11623   return zBuf;
11624 }
11625 
11626 /*
11627 ** Output the given string as a quoted string using SQL quoting conventions.
11628 **
11629 ** See also: output_quoted_escaped_string()
11630 */
11631 static void output_quoted_string(FILE *out, const char *z){
11632   int i;
11633   char c;
11634   setBinaryMode(out, 1);
11635   for(i=0; (c = z[i])!=0 && c!='\''; i++){}
11636   if( c==0 ){
11637     utf8_printf(out,"'%s'",z);
11638   }else{
11639     raw_printf(out, "'");
11640     while( *z ){
11641       for(i=0; (c = z[i])!=0 && c!='\''; i++){}
11642       if( c=='\'' ) i++;
11643       if( i ){
11644         utf8_printf(out, "%.*s", i, z);
11645         z += i;
11646       }
11647       if( c=='\'' ){
11648         raw_printf(out, "'");
11649         continue;
11650       }
11651       if( c==0 ){
11652         break;
11653       }
11654       z++;
11655     }
11656     raw_printf(out, "'");
11657   }
11658   setTextMode(out, 1);
11659 }
11660 
11661 /*
11662 ** Output the given string as a quoted string using SQL quoting conventions.
11663 ** Additionallly , escape the "\n" and "\r" characters so that they do not
11664 ** get corrupted by end-of-line translation facilities in some operating
11665 ** systems.
11666 **
11667 ** This is like output_quoted_string() but with the addition of the \r\n
11668 ** escape mechanism.
11669 */
11670 static void output_quoted_escaped_string(FILE *out, const char *z){
11671   int i;
11672   char c;
11673   setBinaryMode(out, 1);
11674   for(i=0; (c = z[i])!=0 && c!='\'' && c!='\n' && c!='\r'; i++){}
11675   if( c==0 ){
11676     utf8_printf(out,"'%s'",z);
11677   }else{
11678     const char *zNL = 0;
11679     const char *zCR = 0;
11680     int nNL = 0;
11681     int nCR = 0;
11682     char zBuf1[20], zBuf2[20];
11683     for(i=0; z[i]; i++){
11684       if( z[i]=='\n' ) nNL++;
11685       if( z[i]=='\r' ) nCR++;
11686     }
11687     if( nNL ){
11688       raw_printf(out, "replace(");
11689       zNL = unused_string(z, "\\n", "\\012", zBuf1);
11690     }
11691     if( nCR ){
11692       raw_printf(out, "replace(");
11693       zCR = unused_string(z, "\\r", "\\015", zBuf2);
11694     }
11695     raw_printf(out, "'");
11696     while( *z ){
11697       for(i=0; (c = z[i])!=0 && c!='\n' && c!='\r' && c!='\''; i++){}
11698       if( c=='\'' ) i++;
11699       if( i ){
11700         utf8_printf(out, "%.*s", i, z);
11701         z += i;
11702       }
11703       if( c=='\'' ){
11704         raw_printf(out, "'");
11705         continue;
11706       }
11707       if( c==0 ){
11708         break;
11709       }
11710       z++;
11711       if( c=='\n' ){
11712         raw_printf(out, "%s", zNL);
11713         continue;
11714       }
11715       raw_printf(out, "%s", zCR);
11716     }
11717     raw_printf(out, "'");
11718     if( nCR ){
11719       raw_printf(out, ",'%s',char(13))", zCR);
11720     }
11721     if( nNL ){
11722       raw_printf(out, ",'%s',char(10))", zNL);
11723     }
11724   }
11725   setTextMode(out, 1);
11726 }
11727 
11728 /*
11729 ** Output the given string as a quoted according to C or TCL quoting rules.
11730 */
11731 static void output_c_string(FILE *out, const char *z){
11732   unsigned int c;
11733   fputc('"', out);
11734   while( (c = *(z++))!=0 ){
11735     if( c=='\\' ){
11736       fputc(c, out);
11737       fputc(c, out);
11738     }else if( c=='"' ){
11739       fputc('\\', out);
11740       fputc('"', out);
11741     }else if( c=='\t' ){
11742       fputc('\\', out);
11743       fputc('t', out);
11744     }else if( c=='\n' ){
11745       fputc('\\', out);
11746       fputc('n', out);
11747     }else if( c=='\r' ){
11748       fputc('\\', out);
11749       fputc('r', out);
11750     }else if( !isprint(c&0xff) ){
11751       raw_printf(out, "\\%03o", c&0xff);
11752     }else{
11753       fputc(c, out);
11754     }
11755   }
11756   fputc('"', out);
11757 }
11758 
11759 /*
11760 ** Output the given string as a quoted according to JSON quoting rules.
11761 */
11762 static void output_json_string(FILE *out, const char *z, int n){
11763   unsigned int c;
11764   if( n<0 ) n = (int)strlen(z);
11765   fputc('"', out);
11766   while( n-- ){
11767     c = *(z++);
11768     if( c=='\\' || c=='"' ){
11769       fputc('\\', out);
11770       fputc(c, out);
11771     }else if( c<=0x1f ){
11772       fputc('\\', out);
11773       if( c=='\b' ){
11774         fputc('b', out);
11775       }else if( c=='\f' ){
11776         fputc('f', out);
11777       }else if( c=='\n' ){
11778         fputc('n', out);
11779       }else if( c=='\r' ){
11780         fputc('r', out);
11781       }else if( c=='\t' ){
11782         fputc('t', out);
11783       }else{
11784          raw_printf(out, "u%04x",c);
11785       }
11786     }else{
11787       fputc(c, out);
11788     }
11789   }
11790   fputc('"', out);
11791 }
11792 
11793 /*
11794 ** Output the given string with characters that are special to
11795 ** HTML escaped.
11796 */
11797 static void output_html_string(FILE *out, const char *z){
11798   int i;
11799   if( z==0 ) z = "";
11800   while( *z ){
11801     for(i=0;   z[i]
11802             && z[i]!='<'
11803             && z[i]!='&'
11804             && z[i]!='>'
11805             && z[i]!='\"'
11806             && z[i]!='\'';
11807         i++){}
11808     if( i>0 ){
11809       utf8_printf(out,"%.*s",i,z);
11810     }
11811     if( z[i]=='<' ){
11812       raw_printf(out,"&lt;");
11813     }else if( z[i]=='&' ){
11814       raw_printf(out,"&amp;");
11815     }else if( z[i]=='>' ){
11816       raw_printf(out,"&gt;");
11817     }else if( z[i]=='\"' ){
11818       raw_printf(out,"&quot;");
11819     }else if( z[i]=='\'' ){
11820       raw_printf(out,"&#39;");
11821     }else{
11822       break;
11823     }
11824     z += i + 1;
11825   }
11826 }
11827 
11828 /*
11829 ** If a field contains any character identified by a 1 in the following
11830 ** array, then the string must be quoted for CSV.
11831 */
11832 static const char needCsvQuote[] = {
11833   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
11834   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
11835   1, 0, 1, 0, 0, 0, 0, 1,   0, 0, 0, 0, 0, 0, 0, 0,
11836   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
11837   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
11838   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
11839   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
11840   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 1,
11841   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
11842   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
11843   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
11844   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
11845   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
11846   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
11847   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
11848   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
11849 };
11850 
11851 /*
11852 ** Output a single term of CSV.  Actually, p->colSeparator is used for
11853 ** the separator, which may or may not be a comma.  p->nullValue is
11854 ** the null value.  Strings are quoted if necessary.  The separator
11855 ** is only issued if bSep is true.
11856 */
11857 static void output_csv(ShellState *p, const char *z, int bSep){
11858   FILE *out = p->out;
11859   if( z==0 ){
11860     utf8_printf(out,"%s",p->nullValue);
11861   }else{
11862     int i;
11863     int nSep = strlen30(p->colSeparator);
11864     for(i=0; z[i]; i++){
11865       if( needCsvQuote[((unsigned char*)z)[i]]
11866          || (z[i]==p->colSeparator[0] &&
11867              (nSep==1 || memcmp(z, p->colSeparator, nSep)==0)) ){
11868         i = 0;
11869         break;
11870       }
11871     }
11872     if( i==0 ){
11873       char *zQuoted = sqlite3_mprintf("\"%w\"", z);
11874       utf8_printf(out, "%s", zQuoted);
11875       sqlite3_free(zQuoted);
11876     }else{
11877       utf8_printf(out, "%s", z);
11878     }
11879   }
11880   if( bSep ){
11881     utf8_printf(p->out, "%s", p->colSeparator);
11882   }
11883 }
11884 
11885 /*
11886 ** This routine runs when the user presses Ctrl-C
11887 */
11888 static void interrupt_handler(int NotUsed){
11889   UNUSED_PARAMETER(NotUsed);
11890   seenInterrupt++;
11891   if( seenInterrupt>2 ) exit(1);
11892   if( globalDb ) sqlite3_interrupt(globalDb);
11893 }
11894 
11895 #if (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE)
11896 /*
11897 ** This routine runs for console events (e.g. Ctrl-C) on Win32
11898 */
11899 static BOOL WINAPI ConsoleCtrlHandler(
11900   DWORD dwCtrlType /* One of the CTRL_*_EVENT constants */
11901 ){
11902   if( dwCtrlType==CTRL_C_EVENT ){
11903     interrupt_handler(0);
11904     return TRUE;
11905   }
11906   return FALSE;
11907 }
11908 #endif
11909 
11910 #ifndef SQLITE_OMIT_AUTHORIZATION
11911 /*
11912 ** When the ".auth ON" is set, the following authorizer callback is
11913 ** invoked.  It always returns SQLITE_OK.
11914 */
11915 static int shellAuth(
11916   void *pClientData,
11917   int op,
11918   const char *zA1,
11919   const char *zA2,
11920   const char *zA3,
11921   const char *zA4
11922 ){
11923   ShellState *p = (ShellState*)pClientData;
11924   static const char *azAction[] = { 0,
11925      "CREATE_INDEX",         "CREATE_TABLE",         "CREATE_TEMP_INDEX",
11926      "CREATE_TEMP_TABLE",    "CREATE_TEMP_TRIGGER",  "CREATE_TEMP_VIEW",
11927      "CREATE_TRIGGER",       "CREATE_VIEW",          "DELETE",
11928      "DROP_INDEX",           "DROP_TABLE",           "DROP_TEMP_INDEX",
11929      "DROP_TEMP_TABLE",      "DROP_TEMP_TRIGGER",    "DROP_TEMP_VIEW",
11930      "DROP_TRIGGER",         "DROP_VIEW",            "INSERT",
11931      "PRAGMA",               "READ",                 "SELECT",
11932      "TRANSACTION",          "UPDATE",               "ATTACH",
11933      "DETACH",               "ALTER_TABLE",          "REINDEX",
11934      "ANALYZE",              "CREATE_VTABLE",        "DROP_VTABLE",
11935      "FUNCTION",             "SAVEPOINT",            "RECURSIVE"
11936   };
11937   int i;
11938   const char *az[4];
11939   az[0] = zA1;
11940   az[1] = zA2;
11941   az[2] = zA3;
11942   az[3] = zA4;
11943   utf8_printf(p->out, "authorizer: %s", azAction[op]);
11944   for(i=0; i<4; i++){
11945     raw_printf(p->out, " ");
11946     if( az[i] ){
11947       output_c_string(p->out, az[i]);
11948     }else{
11949       raw_printf(p->out, "NULL");
11950     }
11951   }
11952   raw_printf(p->out, "\n");
11953   return SQLITE_OK;
11954 }
11955 #endif
11956 
11957 /*
11958 ** Print a schema statement.  Part of MODE_Semi and MODE_Pretty output.
11959 **
11960 ** This routine converts some CREATE TABLE statements for shadow tables
11961 ** in FTS3/4/5 into CREATE TABLE IF NOT EXISTS statements.
11962 */
11963 static void printSchemaLine(FILE *out, const char *z, const char *zTail){
11964   if( z==0 ) return;
11965   if( zTail==0 ) return;
11966   if( sqlite3_strglob("CREATE TABLE ['\"]*", z)==0 ){
11967     utf8_printf(out, "CREATE TABLE IF NOT EXISTS %s%s", z+13, zTail);
11968   }else{
11969     utf8_printf(out, "%s%s", z, zTail);
11970   }
11971 }
11972 static void printSchemaLineN(FILE *out, char *z, int n, const char *zTail){
11973   char c = z[n];
11974   z[n] = 0;
11975   printSchemaLine(out, z, zTail);
11976   z[n] = c;
11977 }
11978 
11979 /*
11980 ** Return true if string z[] has nothing but whitespace and comments to the
11981 ** end of the first line.
11982 */
11983 static int wsToEol(const char *z){
11984   int i;
11985   for(i=0; z[i]; i++){
11986     if( z[i]=='\n' ) return 1;
11987     if( IsSpace(z[i]) ) continue;
11988     if( z[i]=='-' && z[i+1]=='-' ) return 1;
11989     return 0;
11990   }
11991   return 1;
11992 }
11993 
11994 /*
11995 ** Add a new entry to the EXPLAIN QUERY PLAN data
11996 */
11997 static void eqp_append(ShellState *p, int iEqpId, int p2, const char *zText){
11998   EQPGraphRow *pNew;
11999   int nText = strlen30(zText);
12000   if( p->autoEQPtest ){
12001     utf8_printf(p->out, "%d,%d,%s\n", iEqpId, p2, zText);
12002   }
12003   pNew = sqlite3_malloc64( sizeof(*pNew) + nText );
12004   if( pNew==0 ) shell_out_of_memory();
12005   pNew->iEqpId = iEqpId;
12006   pNew->iParentId = p2;
12007   memcpy(pNew->zText, zText, nText+1);
12008   pNew->pNext = 0;
12009   if( p->sGraph.pLast ){
12010     p->sGraph.pLast->pNext = pNew;
12011   }else{
12012     p->sGraph.pRow = pNew;
12013   }
12014   p->sGraph.pLast = pNew;
12015 }
12016 
12017 /*
12018 ** Free and reset the EXPLAIN QUERY PLAN data that has been collected
12019 ** in p->sGraph.
12020 */
12021 static void eqp_reset(ShellState *p){
12022   EQPGraphRow *pRow, *pNext;
12023   for(pRow = p->sGraph.pRow; pRow; pRow = pNext){
12024     pNext = pRow->pNext;
12025     sqlite3_free(pRow);
12026   }
12027   memset(&p->sGraph, 0, sizeof(p->sGraph));
12028 }
12029 
12030 /* Return the next EXPLAIN QUERY PLAN line with iEqpId that occurs after
12031 ** pOld, or return the first such line if pOld is NULL
12032 */
12033 static EQPGraphRow *eqp_next_row(ShellState *p, int iEqpId, EQPGraphRow *pOld){
12034   EQPGraphRow *pRow = pOld ? pOld->pNext : p->sGraph.pRow;
12035   while( pRow && pRow->iParentId!=iEqpId ) pRow = pRow->pNext;
12036   return pRow;
12037 }
12038 
12039 /* Render a single level of the graph that has iEqpId as its parent.  Called
12040 ** recursively to render sublevels.
12041 */
12042 static void eqp_render_level(ShellState *p, int iEqpId){
12043   EQPGraphRow *pRow, *pNext;
12044   int n = strlen30(p->sGraph.zPrefix);
12045   char *z;
12046   for(pRow = eqp_next_row(p, iEqpId, 0); pRow; pRow = pNext){
12047     pNext = eqp_next_row(p, iEqpId, pRow);
12048     z = pRow->zText;
12049     utf8_printf(p->out, "%s%s%s\n", p->sGraph.zPrefix,
12050                 pNext ? "|--" : "`--", z);
12051     if( n<(int)sizeof(p->sGraph.zPrefix)-7 ){
12052       memcpy(&p->sGraph.zPrefix[n], pNext ? "|  " : "   ", 4);
12053       eqp_render_level(p, pRow->iEqpId);
12054       p->sGraph.zPrefix[n] = 0;
12055     }
12056   }
12057 }
12058 
12059 /*
12060 ** Display and reset the EXPLAIN QUERY PLAN data
12061 */
12062 static void eqp_render(ShellState *p){
12063   EQPGraphRow *pRow = p->sGraph.pRow;
12064   if( pRow ){
12065     if( pRow->zText[0]=='-' ){
12066       if( pRow->pNext==0 ){
12067         eqp_reset(p);
12068         return;
12069       }
12070       utf8_printf(p->out, "%s\n", pRow->zText+3);
12071       p->sGraph.pRow = pRow->pNext;
12072       sqlite3_free(pRow);
12073     }else{
12074       utf8_printf(p->out, "QUERY PLAN\n");
12075     }
12076     p->sGraph.zPrefix[0] = 0;
12077     eqp_render_level(p, 0);
12078     eqp_reset(p);
12079   }
12080 }
12081 
12082 #ifndef SQLITE_OMIT_PROGRESS_CALLBACK
12083 /*
12084 ** Progress handler callback.
12085 */
12086 static int progress_handler(void *pClientData) {
12087   ShellState *p = (ShellState*)pClientData;
12088   p->nProgress++;
12089   if( p->nProgress>=p->mxProgress && p->mxProgress>0 ){
12090     raw_printf(p->out, "Progress limit reached (%u)\n", p->nProgress);
12091     if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0;
12092     if( p->flgProgress & SHELL_PROGRESS_ONCE ) p->mxProgress = 0;
12093     return 1;
12094   }
12095   if( (p->flgProgress & SHELL_PROGRESS_QUIET)==0 ){
12096     raw_printf(p->out, "Progress %u\n", p->nProgress);
12097   }
12098   return 0;
12099 }
12100 #endif /* SQLITE_OMIT_PROGRESS_CALLBACK */
12101 
12102 /*
12103 ** Print N dashes
12104 */
12105 static void print_dashes(FILE *out, int N){
12106   const char zDash[] = "--------------------------------------------------";
12107   const int nDash = sizeof(zDash) - 1;
12108   while( N>nDash ){
12109     fputs(zDash, out);
12110     N -= nDash;
12111   }
12112   raw_printf(out, "%.*s", N, zDash);
12113 }
12114 
12115 /*
12116 ** Print a markdown or table-style row separator using ascii-art
12117 */
12118 static void print_row_separator(
12119   ShellState *p,
12120   int nArg,
12121   const char *zSep
12122 ){
12123   int i;
12124   if( nArg>0 ){
12125     fputs(zSep, p->out);
12126     print_dashes(p->out, p->actualWidth[0]+2);
12127     for(i=1; i<nArg; i++){
12128       fputs(zSep, p->out);
12129       print_dashes(p->out, p->actualWidth[i]+2);
12130     }
12131     fputs(zSep, p->out);
12132   }
12133   fputs("\n", p->out);
12134 }
12135 
12136 /*
12137 ** This is the callback routine that the shell
12138 ** invokes for each row of a query result.
12139 */
12140 static int shell_callback(
12141   void *pArg,
12142   int nArg,        /* Number of result columns */
12143   char **azArg,    /* Text of each result column */
12144   char **azCol,    /* Column names */
12145   int *aiType      /* Column types.  Might be NULL */
12146 ){
12147   int i;
12148   ShellState *p = (ShellState*)pArg;
12149 
12150   if( azArg==0 ) return 0;
12151   switch( p->cMode ){
12152     case MODE_Line: {
12153       int w = 5;
12154       if( azArg==0 ) break;
12155       for(i=0; i<nArg; i++){
12156         int len = strlen30(azCol[i] ? azCol[i] : "");
12157         if( len>w ) w = len;
12158       }
12159       if( p->cnt++>0 ) utf8_printf(p->out, "%s", p->rowSeparator);
12160       for(i=0; i<nArg; i++){
12161         utf8_printf(p->out,"%*s = %s%s", w, azCol[i],
12162                 azArg[i] ? azArg[i] : p->nullValue, p->rowSeparator);
12163       }
12164       break;
12165     }
12166     case MODE_Explain: {
12167       static const int aExplainWidth[] = {4, 13, 4, 4, 4, 13, 2, 13};
12168       if( nArg>ArraySize(aExplainWidth) ){
12169         nArg = ArraySize(aExplainWidth);
12170       }
12171       if( p->cnt++==0 ){
12172         for(i=0; i<nArg; i++){
12173           int w = aExplainWidth[i];
12174           utf8_width_print(p->out, w, azCol[i]);
12175           fputs(i==nArg-1 ? "\n" : "  ", p->out);
12176         }
12177         for(i=0; i<nArg; i++){
12178           int w = aExplainWidth[i];
12179           print_dashes(p->out, w);
12180           fputs(i==nArg-1 ? "\n" : "  ", p->out);
12181         }
12182       }
12183       if( azArg==0 ) break;
12184       for(i=0; i<nArg; i++){
12185         int w = aExplainWidth[i];
12186         if( i==nArg-1 ) w = 0;
12187         if( azArg[i] && strlenChar(azArg[i])>w ){
12188           w = strlenChar(azArg[i]);
12189         }
12190         if( i==1 && p->aiIndent && p->pStmt ){
12191           if( p->iIndent<p->nIndent ){
12192             utf8_printf(p->out, "%*.s", p->aiIndent[p->iIndent], "");
12193           }
12194           p->iIndent++;
12195         }
12196         utf8_width_print(p->out, w, azArg[i] ? azArg[i] : p->nullValue);
12197         fputs(i==nArg-1 ? "\n" : "  ", p->out);
12198       }
12199       break;
12200     }
12201     case MODE_Semi: {   /* .schema and .fullschema output */
12202       printSchemaLine(p->out, azArg[0], ";\n");
12203       break;
12204     }
12205     case MODE_Pretty: {  /* .schema and .fullschema with --indent */
12206       char *z;
12207       int j;
12208       int nParen = 0;
12209       char cEnd = 0;
12210       char c;
12211       int nLine = 0;
12212       assert( nArg==1 );
12213       if( azArg[0]==0 ) break;
12214       if( sqlite3_strlike("CREATE VIEW%", azArg[0], 0)==0
12215        || sqlite3_strlike("CREATE TRIG%", azArg[0], 0)==0
12216       ){
12217         utf8_printf(p->out, "%s;\n", azArg[0]);
12218         break;
12219       }
12220       z = sqlite3_mprintf("%s", azArg[0]);
12221       j = 0;
12222       for(i=0; IsSpace(z[i]); i++){}
12223       for(; (c = z[i])!=0; i++){
12224         if( IsSpace(c) ){
12225           if( z[j-1]=='\r' ) z[j-1] = '\n';
12226           if( IsSpace(z[j-1]) || z[j-1]=='(' ) continue;
12227         }else if( (c=='(' || c==')') && j>0 && IsSpace(z[j-1]) ){
12228           j--;
12229         }
12230         z[j++] = c;
12231       }
12232       while( j>0 && IsSpace(z[j-1]) ){ j--; }
12233       z[j] = 0;
12234       if( strlen30(z)>=79 ){
12235         for(i=j=0; (c = z[i])!=0; i++){ /* Copy from z[i] back to z[j] */
12236           if( c==cEnd ){
12237             cEnd = 0;
12238           }else if( c=='"' || c=='\'' || c=='`' ){
12239             cEnd = c;
12240           }else if( c=='[' ){
12241             cEnd = ']';
12242           }else if( c=='-' && z[i+1]=='-' ){
12243             cEnd = '\n';
12244           }else if( c=='(' ){
12245             nParen++;
12246           }else if( c==')' ){
12247             nParen--;
12248             if( nLine>0 && nParen==0 && j>0 ){
12249               printSchemaLineN(p->out, z, j, "\n");
12250               j = 0;
12251             }
12252           }
12253           z[j++] = c;
12254           if( nParen==1 && cEnd==0
12255            && (c=='(' || c=='\n' || (c==',' && !wsToEol(z+i+1)))
12256           ){
12257             if( c=='\n' ) j--;
12258             printSchemaLineN(p->out, z, j, "\n  ");
12259             j = 0;
12260             nLine++;
12261             while( IsSpace(z[i+1]) ){ i++; }
12262           }
12263         }
12264         z[j] = 0;
12265       }
12266       printSchemaLine(p->out, z, ";\n");
12267       sqlite3_free(z);
12268       break;
12269     }
12270     case MODE_List: {
12271       if( p->cnt++==0 && p->showHeader ){
12272         for(i=0; i<nArg; i++){
12273           utf8_printf(p->out,"%s%s",azCol[i],
12274                   i==nArg-1 ? p->rowSeparator : p->colSeparator);
12275         }
12276       }
12277       if( azArg==0 ) break;
12278       for(i=0; i<nArg; i++){
12279         char *z = azArg[i];
12280         if( z==0 ) z = p->nullValue;
12281         utf8_printf(p->out, "%s", z);
12282         if( i<nArg-1 ){
12283           utf8_printf(p->out, "%s", p->colSeparator);
12284         }else{
12285           utf8_printf(p->out, "%s", p->rowSeparator);
12286         }
12287       }
12288       break;
12289     }
12290     case MODE_Html: {
12291       if( p->cnt++==0 && p->showHeader ){
12292         raw_printf(p->out,"<TR>");
12293         for(i=0; i<nArg; i++){
12294           raw_printf(p->out,"<TH>");
12295           output_html_string(p->out, azCol[i]);
12296           raw_printf(p->out,"</TH>\n");
12297         }
12298         raw_printf(p->out,"</TR>\n");
12299       }
12300       if( azArg==0 ) break;
12301       raw_printf(p->out,"<TR>");
12302       for(i=0; i<nArg; i++){
12303         raw_printf(p->out,"<TD>");
12304         output_html_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
12305         raw_printf(p->out,"</TD>\n");
12306       }
12307       raw_printf(p->out,"</TR>\n");
12308       break;
12309     }
12310     case MODE_Tcl: {
12311       if( p->cnt++==0 && p->showHeader ){
12312         for(i=0; i<nArg; i++){
12313           output_c_string(p->out,azCol[i] ? azCol[i] : "");
12314           if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
12315         }
12316         utf8_printf(p->out, "%s", p->rowSeparator);
12317       }
12318       if( azArg==0 ) break;
12319       for(i=0; i<nArg; i++){
12320         output_c_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
12321         if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
12322       }
12323       utf8_printf(p->out, "%s", p->rowSeparator);
12324       break;
12325     }
12326     case MODE_Csv: {
12327       setBinaryMode(p->out, 1);
12328       if( p->cnt++==0 && p->showHeader ){
12329         for(i=0; i<nArg; i++){
12330           output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
12331         }
12332         utf8_printf(p->out, "%s", p->rowSeparator);
12333       }
12334       if( nArg>0 ){
12335         for(i=0; i<nArg; i++){
12336           output_csv(p, azArg[i], i<nArg-1);
12337         }
12338         utf8_printf(p->out, "%s", p->rowSeparator);
12339       }
12340       setTextMode(p->out, 1);
12341       break;
12342     }
12343     case MODE_Insert: {
12344       if( azArg==0 ) break;
12345       utf8_printf(p->out,"INSERT INTO %s",p->zDestTable);
12346       if( p->showHeader ){
12347         raw_printf(p->out,"(");
12348         for(i=0; i<nArg; i++){
12349           if( i>0 ) raw_printf(p->out, ",");
12350           if( quoteChar(azCol[i]) ){
12351             char *z = sqlite3_mprintf("\"%w\"", azCol[i]);
12352             utf8_printf(p->out, "%s", z);
12353             sqlite3_free(z);
12354           }else{
12355             raw_printf(p->out, "%s", azCol[i]);
12356           }
12357         }
12358         raw_printf(p->out,")");
12359       }
12360       p->cnt++;
12361       for(i=0; i<nArg; i++){
12362         raw_printf(p->out, i>0 ? "," : " VALUES(");
12363         if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
12364           utf8_printf(p->out,"NULL");
12365         }else if( aiType && aiType[i]==SQLITE_TEXT ){
12366           if( ShellHasFlag(p, SHFLG_Newlines) ){
12367             output_quoted_string(p->out, azArg[i]);
12368           }else{
12369             output_quoted_escaped_string(p->out, azArg[i]);
12370           }
12371         }else if( aiType && aiType[i]==SQLITE_INTEGER ){
12372           utf8_printf(p->out,"%s", azArg[i]);
12373         }else if( aiType && aiType[i]==SQLITE_FLOAT ){
12374           char z[50];
12375           double r = sqlite3_column_double(p->pStmt, i);
12376           sqlite3_uint64 ur;
12377           memcpy(&ur,&r,sizeof(r));
12378           if( ur==0x7ff0000000000000LL ){
12379             raw_printf(p->out, "1e999");
12380           }else if( ur==0xfff0000000000000LL ){
12381             raw_printf(p->out, "-1e999");
12382           }else{
12383             sqlite3_snprintf(50,z,"%!.20g", r);
12384             raw_printf(p->out, "%s", z);
12385           }
12386         }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
12387           const void *pBlob = sqlite3_column_blob(p->pStmt, i);
12388           int nBlob = sqlite3_column_bytes(p->pStmt, i);
12389           output_hex_blob(p->out, pBlob, nBlob);
12390         }else if( isNumber(azArg[i], 0) ){
12391           utf8_printf(p->out,"%s", azArg[i]);
12392         }else if( ShellHasFlag(p, SHFLG_Newlines) ){
12393           output_quoted_string(p->out, azArg[i]);
12394         }else{
12395           output_quoted_escaped_string(p->out, azArg[i]);
12396         }
12397       }
12398       raw_printf(p->out,");\n");
12399       break;
12400     }
12401     case MODE_Json: {
12402       if( azArg==0 ) break;
12403       if( p->cnt==0 ){
12404         fputs("[{", p->out);
12405       }else{
12406         fputs(",\n{", p->out);
12407       }
12408       p->cnt++;
12409       for(i=0; i<nArg; i++){
12410         output_json_string(p->out, azCol[i], -1);
12411         putc(':', p->out);
12412         if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
12413           fputs("null",p->out);
12414         }else if( aiType && aiType[i]==SQLITE_FLOAT ){
12415           char z[50];
12416           double r = sqlite3_column_double(p->pStmt, i);
12417           sqlite3_uint64 ur;
12418           memcpy(&ur,&r,sizeof(r));
12419           if( ur==0x7ff0000000000000LL ){
12420             raw_printf(p->out, "1e999");
12421           }else if( ur==0xfff0000000000000LL ){
12422             raw_printf(p->out, "-1e999");
12423           }else{
12424             sqlite3_snprintf(50,z,"%!.20g", r);
12425             raw_printf(p->out, "%s", z);
12426           }
12427         }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
12428           const void *pBlob = sqlite3_column_blob(p->pStmt, i);
12429           int nBlob = sqlite3_column_bytes(p->pStmt, i);
12430           output_json_string(p->out, pBlob, nBlob);
12431         }else if( aiType && aiType[i]==SQLITE_TEXT ){
12432           output_json_string(p->out, azArg[i], -1);
12433         }else{
12434           utf8_printf(p->out,"%s", azArg[i]);
12435         }
12436         if( i<nArg-1 ){
12437           putc(',', p->out);
12438         }
12439       }
12440       putc('}', p->out);
12441       break;
12442     }
12443     case MODE_Quote: {
12444       if( azArg==0 ) break;
12445       if( p->cnt==0 && p->showHeader ){
12446         for(i=0; i<nArg; i++){
12447           if( i>0 ) fputs(p->colSeparator, p->out);
12448           output_quoted_string(p->out, azCol[i]);
12449         }
12450         fputs(p->rowSeparator, p->out);
12451       }
12452       p->cnt++;
12453       for(i=0; i<nArg; i++){
12454         if( i>0 ) fputs(p->colSeparator, p->out);
12455         if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
12456           utf8_printf(p->out,"NULL");
12457         }else if( aiType && aiType[i]==SQLITE_TEXT ){
12458           output_quoted_string(p->out, azArg[i]);
12459         }else if( aiType && aiType[i]==SQLITE_INTEGER ){
12460           utf8_printf(p->out,"%s", azArg[i]);
12461         }else if( aiType && aiType[i]==SQLITE_FLOAT ){
12462           char z[50];
12463           double r = sqlite3_column_double(p->pStmt, i);
12464           sqlite3_snprintf(50,z,"%!.20g", r);
12465           raw_printf(p->out, "%s", z);
12466         }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
12467           const void *pBlob = sqlite3_column_blob(p->pStmt, i);
12468           int nBlob = sqlite3_column_bytes(p->pStmt, i);
12469           output_hex_blob(p->out, pBlob, nBlob);
12470         }else if( isNumber(azArg[i], 0) ){
12471           utf8_printf(p->out,"%s", azArg[i]);
12472         }else{
12473           output_quoted_string(p->out, azArg[i]);
12474         }
12475       }
12476       fputs(p->rowSeparator, p->out);
12477       break;
12478     }
12479     case MODE_Ascii: {
12480       if( p->cnt++==0 && p->showHeader ){
12481         for(i=0; i<nArg; i++){
12482           if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
12483           utf8_printf(p->out,"%s",azCol[i] ? azCol[i] : "");
12484         }
12485         utf8_printf(p->out, "%s", p->rowSeparator);
12486       }
12487       if( azArg==0 ) break;
12488       for(i=0; i<nArg; i++){
12489         if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
12490         utf8_printf(p->out,"%s",azArg[i] ? azArg[i] : p->nullValue);
12491       }
12492       utf8_printf(p->out, "%s", p->rowSeparator);
12493       break;
12494     }
12495     case MODE_EQP: {
12496       eqp_append(p, atoi(azArg[0]), atoi(azArg[1]), azArg[3]);
12497       break;
12498     }
12499   }
12500   return 0;
12501 }
12502 
12503 /*
12504 ** This is the callback routine that the SQLite library
12505 ** invokes for each row of a query result.
12506 */
12507 static int callback(void *pArg, int nArg, char **azArg, char **azCol){
12508   /* since we don't have type info, call the shell_callback with a NULL value */
12509   return shell_callback(pArg, nArg, azArg, azCol, NULL);
12510 }
12511 
12512 /*
12513 ** This is the callback routine from sqlite3_exec() that appends all
12514 ** output onto the end of a ShellText object.
12515 */
12516 static int captureOutputCallback(void *pArg, int nArg, char **azArg, char **az){
12517   ShellText *p = (ShellText*)pArg;
12518   int i;
12519   UNUSED_PARAMETER(az);
12520   if( azArg==0 ) return 0;
12521   if( p->n ) appendText(p, "|", 0);
12522   for(i=0; i<nArg; i++){
12523     if( i ) appendText(p, ",", 0);
12524     if( azArg[i] ) appendText(p, azArg[i], 0);
12525   }
12526   return 0;
12527 }
12528 
12529 /*
12530 ** Generate an appropriate SELFTEST table in the main database.
12531 */
12532 static void createSelftestTable(ShellState *p){
12533   char *zErrMsg = 0;
12534   sqlite3_exec(p->db,
12535     "SAVEPOINT selftest_init;\n"
12536     "CREATE TABLE IF NOT EXISTS selftest(\n"
12537     "  tno INTEGER PRIMARY KEY,\n"   /* Test number */
12538     "  op TEXT,\n"                   /* Operator:  memo run */
12539     "  cmd TEXT,\n"                  /* Command text */
12540     "  ans TEXT\n"                   /* Desired answer */
12541     ");"
12542     "CREATE TEMP TABLE [_shell$self](op,cmd,ans);\n"
12543     "INSERT INTO [_shell$self](rowid,op,cmd)\n"
12544     "  VALUES(coalesce((SELECT (max(tno)+100)/10 FROM selftest),10),\n"
12545     "         'memo','Tests generated by --init');\n"
12546     "INSERT INTO [_shell$self]\n"
12547     "  SELECT 'run',\n"
12548     "    'SELECT hex(sha3_query(''SELECT type,name,tbl_name,sql "
12549                                  "FROM sqlite_schema ORDER BY 2'',224))',\n"
12550     "    hex(sha3_query('SELECT type,name,tbl_name,sql "
12551                           "FROM sqlite_schema ORDER BY 2',224));\n"
12552     "INSERT INTO [_shell$self]\n"
12553     "  SELECT 'run',"
12554     "    'SELECT hex(sha3_query(''SELECT * FROM \"' ||"
12555     "        printf('%w',name) || '\" NOT INDEXED'',224))',\n"
12556     "    hex(sha3_query(printf('SELECT * FROM \"%w\" NOT INDEXED',name),224))\n"
12557     "  FROM (\n"
12558     "    SELECT name FROM sqlite_schema\n"
12559     "     WHERE type='table'\n"
12560     "       AND name<>'selftest'\n"
12561     "       AND coalesce(rootpage,0)>0\n"
12562     "  )\n"
12563     " ORDER BY name;\n"
12564     "INSERT INTO [_shell$self]\n"
12565     "  VALUES('run','PRAGMA integrity_check','ok');\n"
12566     "INSERT INTO selftest(tno,op,cmd,ans)"
12567     "  SELECT rowid*10,op,cmd,ans FROM [_shell$self];\n"
12568     "DROP TABLE [_shell$self];"
12569     ,0,0,&zErrMsg);
12570   if( zErrMsg ){
12571     utf8_printf(stderr, "SELFTEST initialization failure: %s\n", zErrMsg);
12572     sqlite3_free(zErrMsg);
12573   }
12574   sqlite3_exec(p->db, "RELEASE selftest_init",0,0,0);
12575 }
12576 
12577 
12578 /*
12579 ** Set the destination table field of the ShellState structure to
12580 ** the name of the table given.  Escape any quote characters in the
12581 ** table name.
12582 */
12583 static void set_table_name(ShellState *p, const char *zName){
12584   int i, n;
12585   char cQuote;
12586   char *z;
12587 
12588   if( p->zDestTable ){
12589     free(p->zDestTable);
12590     p->zDestTable = 0;
12591   }
12592   if( zName==0 ) return;
12593   cQuote = quoteChar(zName);
12594   n = strlen30(zName);
12595   if( cQuote ) n += n+2;
12596   z = p->zDestTable = malloc( n+1 );
12597   if( z==0 ) shell_out_of_memory();
12598   n = 0;
12599   if( cQuote ) z[n++] = cQuote;
12600   for(i=0; zName[i]; i++){
12601     z[n++] = zName[i];
12602     if( zName[i]==cQuote ) z[n++] = cQuote;
12603   }
12604   if( cQuote ) z[n++] = cQuote;
12605   z[n] = 0;
12606 }
12607 
12608 
12609 /*
12610 ** Execute a query statement that will generate SQL output.  Print
12611 ** the result columns, comma-separated, on a line and then add a
12612 ** semicolon terminator to the end of that line.
12613 **
12614 ** If the number of columns is 1 and that column contains text "--"
12615 ** then write the semicolon on a separate line.  That way, if a
12616 ** "--" comment occurs at the end of the statement, the comment
12617 ** won't consume the semicolon terminator.
12618 */
12619 static int run_table_dump_query(
12620   ShellState *p,           /* Query context */
12621   const char *zSelect      /* SELECT statement to extract content */
12622 ){
12623   sqlite3_stmt *pSelect;
12624   int rc;
12625   int nResult;
12626   int i;
12627   const char *z;
12628   rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0);
12629   if( rc!=SQLITE_OK || !pSelect ){
12630     utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc,
12631                 sqlite3_errmsg(p->db));
12632     if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
12633     return rc;
12634   }
12635   rc = sqlite3_step(pSelect);
12636   nResult = sqlite3_column_count(pSelect);
12637   while( rc==SQLITE_ROW ){
12638     z = (const char*)sqlite3_column_text(pSelect, 0);
12639     utf8_printf(p->out, "%s", z);
12640     for(i=1; i<nResult; i++){
12641       utf8_printf(p->out, ",%s", sqlite3_column_text(pSelect, i));
12642     }
12643     if( z==0 ) z = "";
12644     while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
12645     if( z[0] ){
12646       raw_printf(p->out, "\n;\n");
12647     }else{
12648       raw_printf(p->out, ";\n");
12649     }
12650     rc = sqlite3_step(pSelect);
12651   }
12652   rc = sqlite3_finalize(pSelect);
12653   if( rc!=SQLITE_OK ){
12654     utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc,
12655                 sqlite3_errmsg(p->db));
12656     if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
12657   }
12658   return rc;
12659 }
12660 
12661 /*
12662 ** Allocate space and save off current error string.
12663 */
12664 static char *save_err_msg(
12665   sqlite3 *db            /* Database to query */
12666 ){
12667   int nErrMsg = 1+strlen30(sqlite3_errmsg(db));
12668   char *zErrMsg = sqlite3_malloc64(nErrMsg);
12669   if( zErrMsg ){
12670     memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg);
12671   }
12672   return zErrMsg;
12673 }
12674 
12675 #ifdef __linux__
12676 /*
12677 ** Attempt to display I/O stats on Linux using /proc/PID/io
12678 */
12679 static void displayLinuxIoStats(FILE *out){
12680   FILE *in;
12681   char z[200];
12682   sqlite3_snprintf(sizeof(z), z, "/proc/%d/io", getpid());
12683   in = fopen(z, "rb");
12684   if( in==0 ) return;
12685   while( fgets(z, sizeof(z), in)!=0 ){
12686     static const struct {
12687       const char *zPattern;
12688       const char *zDesc;
12689     } aTrans[] = {
12690       { "rchar: ",                  "Bytes received by read():" },
12691       { "wchar: ",                  "Bytes sent to write():"    },
12692       { "syscr: ",                  "Read() system calls:"      },
12693       { "syscw: ",                  "Write() system calls:"     },
12694       { "read_bytes: ",             "Bytes read from storage:"  },
12695       { "write_bytes: ",            "Bytes written to storage:" },
12696       { "cancelled_write_bytes: ",  "Cancelled write bytes:"    },
12697     };
12698     int i;
12699     for(i=0; i<ArraySize(aTrans); i++){
12700       int n = strlen30(aTrans[i].zPattern);
12701       if( strncmp(aTrans[i].zPattern, z, n)==0 ){
12702         utf8_printf(out, "%-36s %s", aTrans[i].zDesc, &z[n]);
12703         break;
12704       }
12705     }
12706   }
12707   fclose(in);
12708 }
12709 #endif
12710 
12711 /*
12712 ** Display a single line of status using 64-bit values.
12713 */
12714 static void displayStatLine(
12715   ShellState *p,            /* The shell context */
12716   char *zLabel,             /* Label for this one line */
12717   char *zFormat,            /* Format for the result */
12718   int iStatusCtrl,          /* Which status to display */
12719   int bReset                /* True to reset the stats */
12720 ){
12721   sqlite3_int64 iCur = -1;
12722   sqlite3_int64 iHiwtr = -1;
12723   int i, nPercent;
12724   char zLine[200];
12725   sqlite3_status64(iStatusCtrl, &iCur, &iHiwtr, bReset);
12726   for(i=0, nPercent=0; zFormat[i]; i++){
12727     if( zFormat[i]=='%' ) nPercent++;
12728   }
12729   if( nPercent>1 ){
12730     sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iCur, iHiwtr);
12731   }else{
12732     sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iHiwtr);
12733   }
12734   raw_printf(p->out, "%-36s %s\n", zLabel, zLine);
12735 }
12736 
12737 /*
12738 ** Display memory stats.
12739 */
12740 static int display_stats(
12741   sqlite3 *db,                /* Database to query */
12742   ShellState *pArg,           /* Pointer to ShellState */
12743   int bReset                  /* True to reset the stats */
12744 ){
12745   int iCur;
12746   int iHiwtr;
12747   FILE *out;
12748   if( pArg==0 || pArg->out==0 ) return 0;
12749   out = pArg->out;
12750 
12751   if( pArg->pStmt && pArg->statsOn==2 ){
12752     int nCol, i, x;
12753     sqlite3_stmt *pStmt = pArg->pStmt;
12754     char z[100];
12755     nCol = sqlite3_column_count(pStmt);
12756     raw_printf(out, "%-36s %d\n", "Number of output columns:", nCol);
12757     for(i=0; i<nCol; i++){
12758       sqlite3_snprintf(sizeof(z),z,"Column %d %nname:", i, &x);
12759       utf8_printf(out, "%-36s %s\n", z, sqlite3_column_name(pStmt,i));
12760 #ifndef SQLITE_OMIT_DECLTYPE
12761       sqlite3_snprintf(30, z+x, "declared type:");
12762       utf8_printf(out, "%-36s %s\n", z, sqlite3_column_decltype(pStmt, i));
12763 #endif
12764 #ifdef SQLITE_ENABLE_COLUMN_METADATA
12765       sqlite3_snprintf(30, z+x, "database name:");
12766       utf8_printf(out, "%-36s %s\n", z, sqlite3_column_database_name(pStmt,i));
12767       sqlite3_snprintf(30, z+x, "table name:");
12768       utf8_printf(out, "%-36s %s\n", z, sqlite3_column_table_name(pStmt,i));
12769       sqlite3_snprintf(30, z+x, "origin name:");
12770       utf8_printf(out, "%-36s %s\n", z, sqlite3_column_origin_name(pStmt,i));
12771 #endif
12772     }
12773   }
12774 
12775   if( pArg->statsOn==3 ){
12776     if( pArg->pStmt ){
12777       iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
12778       raw_printf(pArg->out, "VM-steps: %d\n", iCur);
12779     }
12780     return 0;
12781   }
12782 
12783   displayStatLine(pArg, "Memory Used:",
12784      "%lld (max %lld) bytes", SQLITE_STATUS_MEMORY_USED, bReset);
12785   displayStatLine(pArg, "Number of Outstanding Allocations:",
12786      "%lld (max %lld)", SQLITE_STATUS_MALLOC_COUNT, bReset);
12787   if( pArg->shellFlgs & SHFLG_Pagecache ){
12788     displayStatLine(pArg, "Number of Pcache Pages Used:",
12789        "%lld (max %lld) pages", SQLITE_STATUS_PAGECACHE_USED, bReset);
12790   }
12791   displayStatLine(pArg, "Number of Pcache Overflow Bytes:",
12792      "%lld (max %lld) bytes", SQLITE_STATUS_PAGECACHE_OVERFLOW, bReset);
12793   displayStatLine(pArg, "Largest Allocation:",
12794      "%lld bytes", SQLITE_STATUS_MALLOC_SIZE, bReset);
12795   displayStatLine(pArg, "Largest Pcache Allocation:",
12796      "%lld bytes", SQLITE_STATUS_PAGECACHE_SIZE, bReset);
12797 #ifdef YYTRACKMAXSTACKDEPTH
12798   displayStatLine(pArg, "Deepest Parser Stack:",
12799      "%lld (max %lld)", SQLITE_STATUS_PARSER_STACK, bReset);
12800 #endif
12801 
12802   if( db ){
12803     if( pArg->shellFlgs & SHFLG_Lookaside ){
12804       iHiwtr = iCur = -1;
12805       sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED,
12806                         &iCur, &iHiwtr, bReset);
12807       raw_printf(pArg->out,
12808               "Lookaside Slots Used:                %d (max %d)\n",
12809               iCur, iHiwtr);
12810       sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT,
12811                         &iCur, &iHiwtr, bReset);
12812       raw_printf(pArg->out, "Successful lookaside attempts:       %d\n",
12813               iHiwtr);
12814       sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE,
12815                         &iCur, &iHiwtr, bReset);
12816       raw_printf(pArg->out, "Lookaside failures due to size:      %d\n",
12817               iHiwtr);
12818       sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL,
12819                         &iCur, &iHiwtr, bReset);
12820       raw_printf(pArg->out, "Lookaside failures due to OOM:       %d\n",
12821               iHiwtr);
12822     }
12823     iHiwtr = iCur = -1;
12824     sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
12825     raw_printf(pArg->out, "Pager Heap Usage:                    %d bytes\n",
12826             iCur);
12827     iHiwtr = iCur = -1;
12828     sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
12829     raw_printf(pArg->out, "Page cache hits:                     %d\n", iCur);
12830     iHiwtr = iCur = -1;
12831     sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
12832     raw_printf(pArg->out, "Page cache misses:                   %d\n", iCur);
12833     iHiwtr = iCur = -1;
12834     sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
12835     raw_printf(pArg->out, "Page cache writes:                   %d\n", iCur);
12836     iHiwtr = iCur = -1;
12837     sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_SPILL, &iCur, &iHiwtr, 1);
12838     raw_printf(pArg->out, "Page cache spills:                   %d\n", iCur);
12839     iHiwtr = iCur = -1;
12840     sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
12841     raw_printf(pArg->out, "Schema Heap Usage:                   %d bytes\n",
12842             iCur);
12843     iHiwtr = iCur = -1;
12844     sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
12845     raw_printf(pArg->out, "Statement Heap/Lookaside Usage:      %d bytes\n",
12846             iCur);
12847   }
12848 
12849   if( pArg->pStmt ){
12850     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP,
12851                                bReset);
12852     raw_printf(pArg->out, "Fullscan Steps:                      %d\n", iCur);
12853     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
12854     raw_printf(pArg->out, "Sort Operations:                     %d\n", iCur);
12855     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX,bReset);
12856     raw_printf(pArg->out, "Autoindex Inserts:                   %d\n", iCur);
12857     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
12858     raw_printf(pArg->out, "Virtual Machine Steps:               %d\n", iCur);
12859     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_REPREPARE,bReset);
12860     raw_printf(pArg->out, "Reprepare operations:                %d\n", iCur);
12861     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_RUN, bReset);
12862     raw_printf(pArg->out, "Number of times run:                 %d\n", iCur);
12863     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_MEMUSED, bReset);
12864     raw_printf(pArg->out, "Memory used by prepared stmt:        %d\n", iCur);
12865   }
12866 
12867 #ifdef __linux__
12868   displayLinuxIoStats(pArg->out);
12869 #endif
12870 
12871   /* Do not remove this machine readable comment: extra-stats-output-here */
12872 
12873   return 0;
12874 }
12875 
12876 /*
12877 ** Display scan stats.
12878 */
12879 static void display_scanstats(
12880   sqlite3 *db,                    /* Database to query */
12881   ShellState *pArg                /* Pointer to ShellState */
12882 ){
12883 #ifndef SQLITE_ENABLE_STMT_SCANSTATUS
12884   UNUSED_PARAMETER(db);
12885   UNUSED_PARAMETER(pArg);
12886 #else
12887   int i, k, n, mx;
12888   raw_printf(pArg->out, "-------- scanstats --------\n");
12889   mx = 0;
12890   for(k=0; k<=mx; k++){
12891     double rEstLoop = 1.0;
12892     for(i=n=0; 1; i++){
12893       sqlite3_stmt *p = pArg->pStmt;
12894       sqlite3_int64 nLoop, nVisit;
12895       double rEst;
12896       int iSid;
12897       const char *zExplain;
12898       if( sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NLOOP, (void*)&nLoop) ){
12899         break;
12900       }
12901       sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_SELECTID, (void*)&iSid);
12902       if( iSid>mx ) mx = iSid;
12903       if( iSid!=k ) continue;
12904       if( n==0 ){
12905         rEstLoop = (double)nLoop;
12906         if( k>0 ) raw_printf(pArg->out, "-------- subquery %d -------\n", k);
12907       }
12908       n++;
12909       sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NVISIT, (void*)&nVisit);
12910       sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EST, (void*)&rEst);
12911       sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EXPLAIN, (void*)&zExplain);
12912       utf8_printf(pArg->out, "Loop %2d: %s\n", n, zExplain);
12913       rEstLoop *= rEst;
12914       raw_printf(pArg->out,
12915           "         nLoop=%-8lld nRow=%-8lld estRow=%-8lld estRow/Loop=%-8g\n",
12916           nLoop, nVisit, (sqlite3_int64)(rEstLoop+0.5), rEst
12917       );
12918     }
12919   }
12920   raw_printf(pArg->out, "---------------------------\n");
12921 #endif
12922 }
12923 
12924 /*
12925 ** Parameter azArray points to a zero-terminated array of strings. zStr
12926 ** points to a single nul-terminated string. Return non-zero if zStr
12927 ** is equal, according to strcmp(), to any of the strings in the array.
12928 ** Otherwise, return zero.
12929 */
12930 static int str_in_array(const char *zStr, const char **azArray){
12931   int i;
12932   for(i=0; azArray[i]; i++){
12933     if( 0==strcmp(zStr, azArray[i]) ) return 1;
12934   }
12935   return 0;
12936 }
12937 
12938 /*
12939 ** If compiled statement pSql appears to be an EXPLAIN statement, allocate
12940 ** and populate the ShellState.aiIndent[] array with the number of
12941 ** spaces each opcode should be indented before it is output.
12942 **
12943 ** The indenting rules are:
12944 **
12945 **     * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
12946 **       all opcodes that occur between the p2 jump destination and the opcode
12947 **       itself by 2 spaces.
12948 **
12949 **     * For each "Goto", if the jump destination is earlier in the program
12950 **       and ends on one of:
12951 **          Yield  SeekGt  SeekLt  RowSetRead  Rewind
12952 **       or if the P1 parameter is one instead of zero,
12953 **       then indent all opcodes between the earlier instruction
12954 **       and "Goto" by 2 spaces.
12955 */
12956 static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){
12957   const char *zSql;               /* The text of the SQL statement */
12958   const char *z;                  /* Used to check if this is an EXPLAIN */
12959   int *abYield = 0;               /* True if op is an OP_Yield */
12960   int nAlloc = 0;                 /* Allocated size of p->aiIndent[], abYield */
12961   int iOp;                        /* Index of operation in p->aiIndent[] */
12962 
12963   const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext", 0 };
12964   const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead",
12965                             "Rewind", 0 };
12966   const char *azGoto[] = { "Goto", 0 };
12967 
12968   /* Try to figure out if this is really an EXPLAIN statement. If this
12969   ** cannot be verified, return early.  */
12970   if( sqlite3_column_count(pSql)!=8 ){
12971     p->cMode = p->mode;
12972     return;
12973   }
12974   zSql = sqlite3_sql(pSql);
12975   if( zSql==0 ) return;
12976   for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++);
12977   if( sqlite3_strnicmp(z, "explain", 7) ){
12978     p->cMode = p->mode;
12979     return;
12980   }
12981 
12982   for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
12983     int i;
12984     int iAddr = sqlite3_column_int(pSql, 0);
12985     const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
12986 
12987     /* Set p2 to the P2 field of the current opcode. Then, assuming that
12988     ** p2 is an instruction address, set variable p2op to the index of that
12989     ** instruction in the aiIndent[] array. p2 and p2op may be different if
12990     ** the current instruction is part of a sub-program generated by an
12991     ** SQL trigger or foreign key.  */
12992     int p2 = sqlite3_column_int(pSql, 3);
12993     int p2op = (p2 + (iOp-iAddr));
12994 
12995     /* Grow the p->aiIndent array as required */
12996     if( iOp>=nAlloc ){
12997       if( iOp==0 ){
12998         /* Do further verfication that this is explain output.  Abort if
12999         ** it is not */
13000         static const char *explainCols[] = {
13001            "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment" };
13002         int jj;
13003         for(jj=0; jj<ArraySize(explainCols); jj++){
13004           if( strcmp(sqlite3_column_name(pSql,jj),explainCols[jj])!=0 ){
13005             p->cMode = p->mode;
13006             sqlite3_reset(pSql);
13007             return;
13008           }
13009         }
13010       }
13011       nAlloc += 100;
13012       p->aiIndent = (int*)sqlite3_realloc64(p->aiIndent, nAlloc*sizeof(int));
13013       if( p->aiIndent==0 ) shell_out_of_memory();
13014       abYield = (int*)sqlite3_realloc64(abYield, nAlloc*sizeof(int));
13015       if( abYield==0 ) shell_out_of_memory();
13016     }
13017     abYield[iOp] = str_in_array(zOp, azYield);
13018     p->aiIndent[iOp] = 0;
13019     p->nIndent = iOp+1;
13020 
13021     if( str_in_array(zOp, azNext) ){
13022       for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
13023     }
13024     if( str_in_array(zOp, azGoto) && p2op<p->nIndent
13025      && (abYield[p2op] || sqlite3_column_int(pSql, 2))
13026     ){
13027       for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
13028     }
13029   }
13030 
13031   p->iIndent = 0;
13032   sqlite3_free(abYield);
13033   sqlite3_reset(pSql);
13034 }
13035 
13036 /*
13037 ** Free the array allocated by explain_data_prepare().
13038 */
13039 static void explain_data_delete(ShellState *p){
13040   sqlite3_free(p->aiIndent);
13041   p->aiIndent = 0;
13042   p->nIndent = 0;
13043   p->iIndent = 0;
13044 }
13045 
13046 /*
13047 ** Disable and restore .wheretrace and .selecttrace settings.
13048 */
13049 static unsigned int savedSelectTrace;
13050 static unsigned int savedWhereTrace;
13051 static void disable_debug_trace_modes(void){
13052   unsigned int zero = 0;
13053   sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 0, &savedSelectTrace);
13054   sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &zero);
13055   sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 2, &savedWhereTrace);
13056   sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &zero);
13057 }
13058 static void restore_debug_trace_modes(void){
13059   sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &savedSelectTrace);
13060   sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &savedWhereTrace);
13061 }
13062 
13063 /* Create the TEMP table used to store parameter bindings */
13064 static void bind_table_init(ShellState *p){
13065   int wrSchema = 0;
13066   int defensiveMode = 0;
13067   sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, -1, &defensiveMode);
13068   sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, 0, 0);
13069   sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, -1, &wrSchema);
13070   sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, 1, 0);
13071   sqlite3_exec(p->db,
13072     "CREATE TABLE IF NOT EXISTS temp.sqlite_parameters(\n"
13073     "  key TEXT PRIMARY KEY,\n"
13074     "  value ANY\n"
13075     ") WITHOUT ROWID;",
13076     0, 0, 0);
13077   sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, wrSchema, 0);
13078   sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, defensiveMode, 0);
13079 }
13080 
13081 /*
13082 ** Bind parameters on a prepared statement.
13083 **
13084 ** Parameter bindings are taken from a TEMP table of the form:
13085 **
13086 **    CREATE TEMP TABLE sqlite_parameters(key TEXT PRIMARY KEY, value)
13087 **    WITHOUT ROWID;
13088 **
13089 ** No bindings occur if this table does not exist.  The name of the table
13090 ** begins with "sqlite_" so that it will not collide with ordinary application
13091 ** tables.  The table must be in the TEMP schema.
13092 */
13093 static void bind_prepared_stmt(ShellState *pArg, sqlite3_stmt *pStmt){
13094   int nVar;
13095   int i;
13096   int rc;
13097   sqlite3_stmt *pQ = 0;
13098 
13099   nVar = sqlite3_bind_parameter_count(pStmt);
13100   if( nVar==0 ) return;  /* Nothing to do */
13101   if( sqlite3_table_column_metadata(pArg->db, "TEMP", "sqlite_parameters",
13102                                     "key", 0, 0, 0, 0, 0)!=SQLITE_OK ){
13103     return; /* Parameter table does not exist */
13104   }
13105   rc = sqlite3_prepare_v2(pArg->db,
13106           "SELECT value FROM temp.sqlite_parameters"
13107           " WHERE key=?1", -1, &pQ, 0);
13108   if( rc || pQ==0 ) return;
13109   for(i=1; i<=nVar; i++){
13110     char zNum[30];
13111     const char *zVar = sqlite3_bind_parameter_name(pStmt, i);
13112     if( zVar==0 ){
13113       sqlite3_snprintf(sizeof(zNum),zNum,"?%d",i);
13114       zVar = zNum;
13115     }
13116     sqlite3_bind_text(pQ, 1, zVar, -1, SQLITE_STATIC);
13117     if( sqlite3_step(pQ)==SQLITE_ROW ){
13118       sqlite3_bind_value(pStmt, i, sqlite3_column_value(pQ, 0));
13119     }else{
13120       sqlite3_bind_null(pStmt, i);
13121     }
13122     sqlite3_reset(pQ);
13123   }
13124   sqlite3_finalize(pQ);
13125 }
13126 
13127 /*
13128 ** UTF8 box-drawing characters.  Imagine box lines like this:
13129 **
13130 **           1
13131 **           |
13132 **       4 --+-- 2
13133 **           |
13134 **           3
13135 **
13136 ** Each box characters has between 2 and 4 of the lines leading from
13137 ** the center.  The characters are here identified by the numbers of
13138 ** their corresponding lines.
13139 */
13140 #define BOX_24   "\342\224\200"  /* U+2500 --- */
13141 #define BOX_13   "\342\224\202"  /* U+2502  |  */
13142 #define BOX_23   "\342\224\214"  /* U+250c  ,- */
13143 #define BOX_34   "\342\224\220"  /* U+2510 -,  */
13144 #define BOX_12   "\342\224\224"  /* U+2514  '- */
13145 #define BOX_14   "\342\224\230"  /* U+2518 -'  */
13146 #define BOX_123  "\342\224\234"  /* U+251c  |- */
13147 #define BOX_134  "\342\224\244"  /* U+2524 -|  */
13148 #define BOX_234  "\342\224\254"  /* U+252c -,- */
13149 #define BOX_124  "\342\224\264"  /* U+2534 -'- */
13150 #define BOX_1234 "\342\224\274"  /* U+253c -|- */
13151 
13152 /* Draw horizontal line N characters long using unicode box
13153 ** characters
13154 */
13155 static void print_box_line(FILE *out, int N){
13156   const char zDash[] =
13157       BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24
13158       BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24;
13159   const int nDash = sizeof(zDash) - 1;
13160   N *= 3;
13161   while( N>nDash ){
13162     utf8_printf(out, zDash);
13163     N -= nDash;
13164   }
13165   utf8_printf(out, "%.*s", N, zDash);
13166 }
13167 
13168 /*
13169 ** Draw a horizontal separator for a MODE_Box table.
13170 */
13171 static void print_box_row_separator(
13172   ShellState *p,
13173   int nArg,
13174   const char *zSep1,
13175   const char *zSep2,
13176   const char *zSep3
13177 ){
13178   int i;
13179   if( nArg>0 ){
13180     utf8_printf(p->out, "%s", zSep1);
13181     print_box_line(p->out, p->actualWidth[0]+2);
13182     for(i=1; i<nArg; i++){
13183       utf8_printf(p->out, "%s", zSep2);
13184       print_box_line(p->out, p->actualWidth[i]+2);
13185     }
13186     utf8_printf(p->out, "%s", zSep3);
13187   }
13188   fputs("\n", p->out);
13189 }
13190 
13191 
13192 
13193 /*
13194 ** Run a prepared statement and output the result in one of the
13195 ** table-oriented formats: MODE_Column, MODE_Markdown, MODE_Table,
13196 ** or MODE_Box.
13197 **
13198 ** This is different from ordinary exec_prepared_stmt() in that
13199 ** it has to run the entire query and gather the results into memory
13200 ** first, in order to determine column widths, before providing
13201 ** any output.
13202 */
13203 static void exec_prepared_stmt_columnar(
13204   ShellState *p,                        /* Pointer to ShellState */
13205   sqlite3_stmt *pStmt                   /* Statment to run */
13206 ){
13207   sqlite3_int64 nRow = 0;
13208   int nColumn = 0;
13209   char **azData = 0;
13210   sqlite3_int64 nAlloc = 0;
13211   const char *z;
13212   int rc;
13213   sqlite3_int64 i, nData;
13214   int j, nTotal, w, n;
13215   const char *colSep = 0;
13216   const char *rowSep = 0;
13217 
13218   rc = sqlite3_step(pStmt);
13219   if( rc!=SQLITE_ROW ) return;
13220   nColumn = sqlite3_column_count(pStmt);
13221   nAlloc = nColumn*4;
13222   if( nAlloc<=0 ) nAlloc = 1;
13223   azData = sqlite3_malloc64( nAlloc*sizeof(char*) );
13224   if( azData==0 ) shell_out_of_memory();
13225   for(i=0; i<nColumn; i++){
13226     azData[i] = strdup(sqlite3_column_name(pStmt,i));
13227   }
13228   do{
13229     if( (nRow+2)*nColumn >= nAlloc ){
13230       nAlloc *= 2;
13231       azData = sqlite3_realloc64(azData, nAlloc*sizeof(char*));
13232       if( azData==0 ) shell_out_of_memory();
13233     }
13234     nRow++;
13235     for(i=0; i<nColumn; i++){
13236       z = (const char*)sqlite3_column_text(pStmt,i);
13237       azData[nRow*nColumn + i] = z ? strdup(z) : 0;
13238     }
13239   }while( (rc = sqlite3_step(pStmt))==SQLITE_ROW );
13240   if( nColumn>p->nWidth ){
13241     p->colWidth = realloc(p->colWidth, nColumn*2*sizeof(int));
13242     if( p->colWidth==0 ) shell_out_of_memory();
13243     for(i=p->nWidth; i<nColumn; i++) p->colWidth[i] = 0;
13244     p->nWidth = nColumn;
13245     p->actualWidth = &p->colWidth[nColumn];
13246   }
13247   memset(p->actualWidth, 0, nColumn*sizeof(int));
13248   for(i=0; i<nColumn; i++){
13249     w = p->colWidth[i];
13250     if( w<0 ) w = -w;
13251     p->actualWidth[i] = w;
13252   }
13253   nTotal = nColumn*(nRow+1);
13254   for(i=0; i<nTotal; i++){
13255     z = azData[i];
13256     if( z==0 ) z = p->nullValue;
13257     n = strlenChar(z);
13258     j = i%nColumn;
13259     if( n>p->actualWidth[j] ) p->actualWidth[j] = n;
13260   }
13261   if( seenInterrupt ) goto columnar_end;
13262   if( nColumn==0 ) goto columnar_end;
13263   switch( p->cMode ){
13264     case MODE_Column: {
13265       colSep = "  ";
13266       rowSep = "\n";
13267       if( p->showHeader ){
13268         for(i=0; i<nColumn; i++){
13269           w = p->actualWidth[i];
13270           if( p->colWidth[i]<0 ) w = -w;
13271           utf8_width_print(p->out, w, azData[i]);
13272           fputs(i==nColumn-1?"\n":"  ", p->out);
13273         }
13274         for(i=0; i<nColumn; i++){
13275           print_dashes(p->out, p->actualWidth[i]);
13276           fputs(i==nColumn-1?"\n":"  ", p->out);
13277         }
13278       }
13279       break;
13280     }
13281     case MODE_Table: {
13282       colSep = " | ";
13283       rowSep = " |\n";
13284       print_row_separator(p, nColumn, "+");
13285       fputs("| ", p->out);
13286       for(i=0; i<nColumn; i++){
13287         w = p->actualWidth[i];
13288         n = strlenChar(azData[i]);
13289         utf8_printf(p->out, "%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, "");
13290         fputs(i==nColumn-1?" |\n":" | ", p->out);
13291       }
13292       print_row_separator(p, nColumn, "+");
13293       break;
13294     }
13295     case MODE_Markdown: {
13296       colSep = " | ";
13297       rowSep = " |\n";
13298       fputs("| ", p->out);
13299       for(i=0; i<nColumn; i++){
13300         w = p->actualWidth[i];
13301         n = strlenChar(azData[i]);
13302         utf8_printf(p->out, "%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, "");
13303         fputs(i==nColumn-1?" |\n":" | ", p->out);
13304       }
13305       print_row_separator(p, nColumn, "|");
13306       break;
13307     }
13308     case MODE_Box: {
13309       colSep = " " BOX_13 " ";
13310       rowSep = " " BOX_13 "\n";
13311       print_box_row_separator(p, nColumn, BOX_23, BOX_234, BOX_34);
13312       utf8_printf(p->out, BOX_13 " ");
13313       for(i=0; i<nColumn; i++){
13314         w = p->actualWidth[i];
13315         n = strlenChar(azData[i]);
13316         utf8_printf(p->out, "%*s%s%*s%s",
13317             (w-n)/2, "", azData[i], (w-n+1)/2, "",
13318             i==nColumn-1?" "BOX_13"\n":" "BOX_13" ");
13319       }
13320       print_box_row_separator(p, nColumn, BOX_123, BOX_1234, BOX_134);
13321       break;
13322     }
13323   }
13324   for(i=nColumn, j=0; i<nTotal; i++, j++){
13325     if( j==0 && p->cMode!=MODE_Column ){
13326       utf8_printf(p->out, "%s", p->cMode==MODE_Box?BOX_13" ":"| ");
13327     }
13328     z = azData[i];
13329     if( z==0 ) z = p->nullValue;
13330     w = p->actualWidth[j];
13331     if( p->colWidth[j]<0 ) w = -w;
13332     utf8_width_print(p->out, w, z);
13333     if( j==nColumn-1 ){
13334       utf8_printf(p->out, "%s", rowSep);
13335       j = -1;
13336       if( seenInterrupt ) goto columnar_end;
13337     }else{
13338       utf8_printf(p->out, "%s", colSep);
13339     }
13340   }
13341   if( p->cMode==MODE_Table ){
13342     print_row_separator(p, nColumn, "+");
13343   }else if( p->cMode==MODE_Box ){
13344     print_box_row_separator(p, nColumn, BOX_12, BOX_124, BOX_14);
13345   }
13346 columnar_end:
13347   if( seenInterrupt ){
13348     utf8_printf(p->out, "Interrupt\n");
13349   }
13350   nData = (nRow+1)*nColumn;
13351   for(i=0; i<nData; i++) free(azData[i]);
13352   sqlite3_free(azData);
13353 }
13354 
13355 /*
13356 ** Run a prepared statement
13357 */
13358 static void exec_prepared_stmt(
13359   ShellState *pArg,                                /* Pointer to ShellState */
13360   sqlite3_stmt *pStmt                              /* Statment to run */
13361 ){
13362   int rc;
13363 
13364   if( pArg->cMode==MODE_Column
13365    || pArg->cMode==MODE_Table
13366    || pArg->cMode==MODE_Box
13367    || pArg->cMode==MODE_Markdown
13368   ){
13369     exec_prepared_stmt_columnar(pArg, pStmt);
13370     return;
13371   }
13372 
13373   /* perform the first step.  this will tell us if we
13374   ** have a result set or not and how wide it is.
13375   */
13376   rc = sqlite3_step(pStmt);
13377   /* if we have a result set... */
13378   if( SQLITE_ROW == rc ){
13379     /* allocate space for col name ptr, value ptr, and type */
13380     int nCol = sqlite3_column_count(pStmt);
13381     void *pData = sqlite3_malloc64(3*nCol*sizeof(const char*) + 1);
13382     if( !pData ){
13383       rc = SQLITE_NOMEM;
13384     }else{
13385       char **azCols = (char **)pData;      /* Names of result columns */
13386       char **azVals = &azCols[nCol];       /* Results */
13387       int *aiTypes = (int *)&azVals[nCol]; /* Result types */
13388       int i, x;
13389       assert(sizeof(int) <= sizeof(char *));
13390       /* save off ptrs to column names */
13391       for(i=0; i<nCol; i++){
13392         azCols[i] = (char *)sqlite3_column_name(pStmt, i);
13393       }
13394       do{
13395         /* extract the data and data types */
13396         for(i=0; i<nCol; i++){
13397           aiTypes[i] = x = sqlite3_column_type(pStmt, i);
13398           if( x==SQLITE_BLOB && pArg && pArg->cMode==MODE_Insert ){
13399             azVals[i] = "";
13400           }else{
13401             azVals[i] = (char*)sqlite3_column_text(pStmt, i);
13402           }
13403           if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
13404             rc = SQLITE_NOMEM;
13405             break; /* from for */
13406           }
13407         } /* end for */
13408 
13409         /* if data and types extracted successfully... */
13410         if( SQLITE_ROW == rc ){
13411           /* call the supplied callback with the result row data */
13412           if( shell_callback(pArg, nCol, azVals, azCols, aiTypes) ){
13413             rc = SQLITE_ABORT;
13414           }else{
13415             rc = sqlite3_step(pStmt);
13416           }
13417         }
13418       } while( SQLITE_ROW == rc );
13419       sqlite3_free(pData);
13420       if( pArg->cMode==MODE_Json ){
13421         fputs("]\n", pArg->out);
13422       }
13423     }
13424   }
13425 }
13426 
13427 #ifndef SQLITE_OMIT_VIRTUALTABLE
13428 /*
13429 ** This function is called to process SQL if the previous shell command
13430 ** was ".expert". It passes the SQL in the second argument directly to
13431 ** the sqlite3expert object.
13432 **
13433 ** If successful, SQLITE_OK is returned. Otherwise, an SQLite error
13434 ** code. In this case, (*pzErr) may be set to point to a buffer containing
13435 ** an English language error message. It is the responsibility of the
13436 ** caller to eventually free this buffer using sqlite3_free().
13437 */
13438 static int expertHandleSQL(
13439   ShellState *pState,
13440   const char *zSql,
13441   char **pzErr
13442 ){
13443   assert( pState->expert.pExpert );
13444   assert( pzErr==0 || *pzErr==0 );
13445   return sqlite3_expert_sql(pState->expert.pExpert, zSql, pzErr);
13446 }
13447 
13448 /*
13449 ** This function is called either to silently clean up the object
13450 ** created by the ".expert" command (if bCancel==1), or to generate a
13451 ** report from it and then clean it up (if bCancel==0).
13452 **
13453 ** If successful, SQLITE_OK is returned. Otherwise, an SQLite error
13454 ** code. In this case, (*pzErr) may be set to point to a buffer containing
13455 ** an English language error message. It is the responsibility of the
13456 ** caller to eventually free this buffer using sqlite3_free().
13457 */
13458 static int expertFinish(
13459   ShellState *pState,
13460   int bCancel,
13461   char **pzErr
13462 ){
13463   int rc = SQLITE_OK;
13464   sqlite3expert *p = pState->expert.pExpert;
13465   assert( p );
13466   assert( bCancel || pzErr==0 || *pzErr==0 );
13467   if( bCancel==0 ){
13468     FILE *out = pState->out;
13469     int bVerbose = pState->expert.bVerbose;
13470 
13471     rc = sqlite3_expert_analyze(p, pzErr);
13472     if( rc==SQLITE_OK ){
13473       int nQuery = sqlite3_expert_count(p);
13474       int i;
13475 
13476       if( bVerbose ){
13477         const char *zCand = sqlite3_expert_report(p,0,EXPERT_REPORT_CANDIDATES);
13478         raw_printf(out, "-- Candidates -----------------------------\n");
13479         raw_printf(out, "%s\n", zCand);
13480       }
13481       for(i=0; i<nQuery; i++){
13482         const char *zSql = sqlite3_expert_report(p, i, EXPERT_REPORT_SQL);
13483         const char *zIdx = sqlite3_expert_report(p, i, EXPERT_REPORT_INDEXES);
13484         const char *zEQP = sqlite3_expert_report(p, i, EXPERT_REPORT_PLAN);
13485         if( zIdx==0 ) zIdx = "(no new indexes)\n";
13486         if( bVerbose ){
13487           raw_printf(out, "-- Query %d --------------------------------\n",i+1);
13488           raw_printf(out, "%s\n\n", zSql);
13489         }
13490         raw_printf(out, "%s\n", zIdx);
13491         raw_printf(out, "%s\n", zEQP);
13492       }
13493     }
13494   }
13495   sqlite3_expert_destroy(p);
13496   pState->expert.pExpert = 0;
13497   return rc;
13498 }
13499 
13500 /*
13501 ** Implementation of ".expert" dot command.
13502 */
13503 static int expertDotCommand(
13504   ShellState *pState,             /* Current shell tool state */
13505   char **azArg,                   /* Array of arguments passed to dot command */
13506   int nArg                        /* Number of entries in azArg[] */
13507 ){
13508   int rc = SQLITE_OK;
13509   char *zErr = 0;
13510   int i;
13511   int iSample = 0;
13512 
13513   assert( pState->expert.pExpert==0 );
13514   memset(&pState->expert, 0, sizeof(ExpertInfo));
13515 
13516   for(i=1; rc==SQLITE_OK && i<nArg; i++){
13517     char *z = azArg[i];
13518     int n;
13519     if( z[0]=='-' && z[1]=='-' ) z++;
13520     n = strlen30(z);
13521     if( n>=2 && 0==strncmp(z, "-verbose", n) ){
13522       pState->expert.bVerbose = 1;
13523     }
13524     else if( n>=2 && 0==strncmp(z, "-sample", n) ){
13525       if( i==(nArg-1) ){
13526         raw_printf(stderr, "option requires an argument: %s\n", z);
13527         rc = SQLITE_ERROR;
13528       }else{
13529         iSample = (int)integerValue(azArg[++i]);
13530         if( iSample<0 || iSample>100 ){
13531           raw_printf(stderr, "value out of range: %s\n", azArg[i]);
13532           rc = SQLITE_ERROR;
13533         }
13534       }
13535     }
13536     else{
13537       raw_printf(stderr, "unknown option: %s\n", z);
13538       rc = SQLITE_ERROR;
13539     }
13540   }
13541 
13542   if( rc==SQLITE_OK ){
13543     pState->expert.pExpert = sqlite3_expert_new(pState->db, &zErr);
13544     if( pState->expert.pExpert==0 ){
13545       raw_printf(stderr, "sqlite3_expert_new: %s\n", zErr);
13546       rc = SQLITE_ERROR;
13547     }else{
13548       sqlite3_expert_config(
13549           pState->expert.pExpert, EXPERT_CONFIG_SAMPLE, iSample
13550       );
13551     }
13552   }
13553 
13554   return rc;
13555 }
13556 #endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
13557 
13558 /*
13559 ** Execute a statement or set of statements.  Print
13560 ** any result rows/columns depending on the current mode
13561 ** set via the supplied callback.
13562 **
13563 ** This is very similar to SQLite's built-in sqlite3_exec()
13564 ** function except it takes a slightly different callback
13565 ** and callback data argument.
13566 */
13567 static int shell_exec(
13568   ShellState *pArg,                         /* Pointer to ShellState */
13569   const char *zSql,                         /* SQL to be evaluated */
13570   char **pzErrMsg                           /* Error msg written here */
13571 ){
13572   sqlite3_stmt *pStmt = NULL;     /* Statement to execute. */
13573   int rc = SQLITE_OK;             /* Return Code */
13574   int rc2;
13575   const char *zLeftover;          /* Tail of unprocessed SQL */
13576   sqlite3 *db = pArg->db;
13577 
13578   if( pzErrMsg ){
13579     *pzErrMsg = NULL;
13580   }
13581 
13582 #ifndef SQLITE_OMIT_VIRTUALTABLE
13583   if( pArg->expert.pExpert ){
13584     rc = expertHandleSQL(pArg, zSql, pzErrMsg);
13585     return expertFinish(pArg, (rc!=SQLITE_OK), pzErrMsg);
13586   }
13587 #endif
13588 
13589   while( zSql[0] && (SQLITE_OK == rc) ){
13590     static const char *zStmtSql;
13591     rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
13592     if( SQLITE_OK != rc ){
13593       if( pzErrMsg ){
13594         *pzErrMsg = save_err_msg(db);
13595       }
13596     }else{
13597       if( !pStmt ){
13598         /* this happens for a comment or white-space */
13599         zSql = zLeftover;
13600         while( IsSpace(zSql[0]) ) zSql++;
13601         continue;
13602       }
13603       zStmtSql = sqlite3_sql(pStmt);
13604       if( zStmtSql==0 ) zStmtSql = "";
13605       while( IsSpace(zStmtSql[0]) ) zStmtSql++;
13606 
13607       /* save off the prepared statment handle and reset row count */
13608       if( pArg ){
13609         pArg->pStmt = pStmt;
13610         pArg->cnt = 0;
13611       }
13612 
13613       /* echo the sql statement if echo on */
13614       if( pArg && ShellHasFlag(pArg, SHFLG_Echo) ){
13615         utf8_printf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
13616       }
13617 
13618       /* Show the EXPLAIN QUERY PLAN if .eqp is on */
13619       if( pArg && pArg->autoEQP && sqlite3_stmt_isexplain(pStmt)==0 ){
13620         sqlite3_stmt *pExplain;
13621         char *zEQP;
13622         int triggerEQP = 0;
13623         disable_debug_trace_modes();
13624         sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, -1, &triggerEQP);
13625         if( pArg->autoEQP>=AUTOEQP_trigger ){
13626           sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 1, 0);
13627         }
13628         zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s", zStmtSql);
13629         rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
13630         if( rc==SQLITE_OK ){
13631           while( sqlite3_step(pExplain)==SQLITE_ROW ){
13632             const char *zEQPLine = (const char*)sqlite3_column_text(pExplain,3);
13633             int iEqpId = sqlite3_column_int(pExplain, 0);
13634             int iParentId = sqlite3_column_int(pExplain, 1);
13635             if( zEQPLine==0 ) zEQPLine = "";
13636             if( zEQPLine[0]=='-' ) eqp_render(pArg);
13637             eqp_append(pArg, iEqpId, iParentId, zEQPLine);
13638           }
13639           eqp_render(pArg);
13640         }
13641         sqlite3_finalize(pExplain);
13642         sqlite3_free(zEQP);
13643         if( pArg->autoEQP>=AUTOEQP_full ){
13644           /* Also do an EXPLAIN for ".eqp full" mode */
13645           zEQP = sqlite3_mprintf("EXPLAIN %s", zStmtSql);
13646           rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
13647           if( rc==SQLITE_OK ){
13648             pArg->cMode = MODE_Explain;
13649             explain_data_prepare(pArg, pExplain);
13650             exec_prepared_stmt(pArg, pExplain);
13651             explain_data_delete(pArg);
13652           }
13653           sqlite3_finalize(pExplain);
13654           sqlite3_free(zEQP);
13655         }
13656         if( pArg->autoEQP>=AUTOEQP_trigger && triggerEQP==0 ){
13657           sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 0, 0);
13658           /* Reprepare pStmt before reactiving trace modes */
13659           sqlite3_finalize(pStmt);
13660           sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
13661           if( pArg ) pArg->pStmt = pStmt;
13662         }
13663         restore_debug_trace_modes();
13664       }
13665 
13666       if( pArg ){
13667         pArg->cMode = pArg->mode;
13668         if( pArg->autoExplain ){
13669           if( sqlite3_stmt_isexplain(pStmt)==1 ){
13670             pArg->cMode = MODE_Explain;
13671           }
13672           if( sqlite3_stmt_isexplain(pStmt)==2 ){
13673             pArg->cMode = MODE_EQP;
13674           }
13675         }
13676 
13677         /* If the shell is currently in ".explain" mode, gather the extra
13678         ** data required to add indents to the output.*/
13679         if( pArg->cMode==MODE_Explain ){
13680           explain_data_prepare(pArg, pStmt);
13681         }
13682       }
13683 
13684       bind_prepared_stmt(pArg, pStmt);
13685       exec_prepared_stmt(pArg, pStmt);
13686       explain_data_delete(pArg);
13687       eqp_render(pArg);
13688 
13689       /* print usage stats if stats on */
13690       if( pArg && pArg->statsOn ){
13691         display_stats(db, pArg, 0);
13692       }
13693 
13694       /* print loop-counters if required */
13695       if( pArg && pArg->scanstatsOn ){
13696         display_scanstats(db, pArg);
13697       }
13698 
13699       /* Finalize the statement just executed. If this fails, save a
13700       ** copy of the error message. Otherwise, set zSql to point to the
13701       ** next statement to execute. */
13702       rc2 = sqlite3_finalize(pStmt);
13703       if( rc!=SQLITE_NOMEM ) rc = rc2;
13704       if( rc==SQLITE_OK ){
13705         zSql = zLeftover;
13706         while( IsSpace(zSql[0]) ) zSql++;
13707       }else if( pzErrMsg ){
13708         *pzErrMsg = save_err_msg(db);
13709       }
13710 
13711       /* clear saved stmt handle */
13712       if( pArg ){
13713         pArg->pStmt = NULL;
13714       }
13715     }
13716   } /* end while */
13717 
13718   return rc;
13719 }
13720 
13721 /*
13722 ** Release memory previously allocated by tableColumnList().
13723 */
13724 static void freeColumnList(char **azCol){
13725   int i;
13726   for(i=1; azCol[i]; i++){
13727     sqlite3_free(azCol[i]);
13728   }
13729   /* azCol[0] is a static string */
13730   sqlite3_free(azCol);
13731 }
13732 
13733 /*
13734 ** Return a list of pointers to strings which are the names of all
13735 ** columns in table zTab.   The memory to hold the names is dynamically
13736 ** allocated and must be released by the caller using a subsequent call
13737 ** to freeColumnList().
13738 **
13739 ** The azCol[0] entry is usually NULL.  However, if zTab contains a rowid
13740 ** value that needs to be preserved, then azCol[0] is filled in with the
13741 ** name of the rowid column.
13742 **
13743 ** The first regular column in the table is azCol[1].  The list is terminated
13744 ** by an entry with azCol[i]==0.
13745 */
13746 static char **tableColumnList(ShellState *p, const char *zTab){
13747   char **azCol = 0;
13748   sqlite3_stmt *pStmt;
13749   char *zSql;
13750   int nCol = 0;
13751   int nAlloc = 0;
13752   int nPK = 0;       /* Number of PRIMARY KEY columns seen */
13753   int isIPK = 0;     /* True if one PRIMARY KEY column of type INTEGER */
13754   int preserveRowid = ShellHasFlag(p, SHFLG_PreserveRowid);
13755   int rc;
13756 
13757   zSql = sqlite3_mprintf("PRAGMA table_info=%Q", zTab);
13758   rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
13759   sqlite3_free(zSql);
13760   if( rc ) return 0;
13761   while( sqlite3_step(pStmt)==SQLITE_ROW ){
13762     if( nCol>=nAlloc-2 ){
13763       nAlloc = nAlloc*2 + nCol + 10;
13764       azCol = sqlite3_realloc(azCol, nAlloc*sizeof(azCol[0]));
13765       if( azCol==0 ) shell_out_of_memory();
13766     }
13767     azCol[++nCol] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 1));
13768     if( sqlite3_column_int(pStmt, 5) ){
13769       nPK++;
13770       if( nPK==1
13771        && sqlite3_stricmp((const char*)sqlite3_column_text(pStmt,2),
13772                           "INTEGER")==0
13773       ){
13774         isIPK = 1;
13775       }else{
13776         isIPK = 0;
13777       }
13778     }
13779   }
13780   sqlite3_finalize(pStmt);
13781   if( azCol==0 ) return 0;
13782   azCol[0] = 0;
13783   azCol[nCol+1] = 0;
13784 
13785   /* The decision of whether or not a rowid really needs to be preserved
13786   ** is tricky.  We never need to preserve a rowid for a WITHOUT ROWID table
13787   ** or a table with an INTEGER PRIMARY KEY.  We are unable to preserve
13788   ** rowids on tables where the rowid is inaccessible because there are other
13789   ** columns in the table named "rowid", "_rowid_", and "oid".
13790   */
13791   if( preserveRowid && isIPK ){
13792     /* If a single PRIMARY KEY column with type INTEGER was seen, then it
13793     ** might be an alise for the ROWID.  But it might also be a WITHOUT ROWID
13794     ** table or a INTEGER PRIMARY KEY DESC column, neither of which are
13795     ** ROWID aliases.  To distinguish these cases, check to see if
13796     ** there is a "pk" entry in "PRAGMA index_list".  There will be
13797     ** no "pk" index if the PRIMARY KEY really is an alias for the ROWID.
13798     */
13799     zSql = sqlite3_mprintf("SELECT 1 FROM pragma_index_list(%Q)"
13800                            " WHERE origin='pk'", zTab);
13801     rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
13802     sqlite3_free(zSql);
13803     if( rc ){
13804       freeColumnList(azCol);
13805       return 0;
13806     }
13807     rc = sqlite3_step(pStmt);
13808     sqlite3_finalize(pStmt);
13809     preserveRowid = rc==SQLITE_ROW;
13810   }
13811   if( preserveRowid ){
13812     /* Only preserve the rowid if we can find a name to use for the
13813     ** rowid */
13814     static char *azRowid[] = { "rowid", "_rowid_", "oid" };
13815     int i, j;
13816     for(j=0; j<3; j++){
13817       for(i=1; i<=nCol; i++){
13818         if( sqlite3_stricmp(azRowid[j],azCol[i])==0 ) break;
13819       }
13820       if( i>nCol ){
13821         /* At this point, we know that azRowid[j] is not the name of any
13822         ** ordinary column in the table.  Verify that azRowid[j] is a valid
13823         ** name for the rowid before adding it to azCol[0].  WITHOUT ROWID
13824         ** tables will fail this last check */
13825         rc = sqlite3_table_column_metadata(p->db,0,zTab,azRowid[j],0,0,0,0,0);
13826         if( rc==SQLITE_OK ) azCol[0] = azRowid[j];
13827         break;
13828       }
13829     }
13830   }
13831   return azCol;
13832 }
13833 
13834 /*
13835 ** Toggle the reverse_unordered_selects setting.
13836 */
13837 static void toggleSelectOrder(sqlite3 *db){
13838   sqlite3_stmt *pStmt = 0;
13839   int iSetting = 0;
13840   char zStmt[100];
13841   sqlite3_prepare_v2(db, "PRAGMA reverse_unordered_selects", -1, &pStmt, 0);
13842   if( sqlite3_step(pStmt)==SQLITE_ROW ){
13843     iSetting = sqlite3_column_int(pStmt, 0);
13844   }
13845   sqlite3_finalize(pStmt);
13846   sqlite3_snprintf(sizeof(zStmt), zStmt,
13847        "PRAGMA reverse_unordered_selects(%d)", !iSetting);
13848   sqlite3_exec(db, zStmt, 0, 0, 0);
13849 }
13850 
13851 /*
13852 ** This is a different callback routine used for dumping the database.
13853 ** Each row received by this callback consists of a table name,
13854 ** the table type ("index" or "table") and SQL to create the table.
13855 ** This routine should print text sufficient to recreate the table.
13856 */
13857 static int dump_callback(void *pArg, int nArg, char **azArg, char **azNotUsed){
13858   int rc;
13859   const char *zTable;
13860   const char *zType;
13861   const char *zSql;
13862   ShellState *p = (ShellState *)pArg;
13863   int dataOnly;
13864   int noSys;
13865 
13866   UNUSED_PARAMETER(azNotUsed);
13867   if( nArg!=3 || azArg==0 ) return 0;
13868   zTable = azArg[0];
13869   zType = azArg[1];
13870   zSql = azArg[2];
13871   dataOnly = (p->shellFlgs & SHFLG_DumpDataOnly)!=0;
13872   noSys    = (p->shellFlgs & SHFLG_DumpNoSys)!=0;
13873 
13874   if( strcmp(zTable, "sqlite_sequence")==0 && !noSys ){
13875     if( !dataOnly ) raw_printf(p->out, "DELETE FROM sqlite_sequence;\n");
13876   }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 && !noSys ){
13877     if( !dataOnly ) raw_printf(p->out, "ANALYZE sqlite_schema;\n");
13878   }else if( strncmp(zTable, "sqlite_", 7)==0 ){
13879     return 0;
13880   }else if( dataOnly ){
13881     /* no-op */
13882   }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
13883     char *zIns;
13884     if( !p->writableSchema ){
13885       raw_printf(p->out, "PRAGMA writable_schema=ON;\n");
13886       p->writableSchema = 1;
13887     }
13888     zIns = sqlite3_mprintf(
13889        "INSERT INTO sqlite_schema(type,name,tbl_name,rootpage,sql)"
13890        "VALUES('table','%q','%q',0,'%q');",
13891        zTable, zTable, zSql);
13892     utf8_printf(p->out, "%s\n", zIns);
13893     sqlite3_free(zIns);
13894     return 0;
13895   }else{
13896     printSchemaLine(p->out, zSql, ";\n");
13897   }
13898 
13899   if( strcmp(zType, "table")==0 ){
13900     ShellText sSelect;
13901     ShellText sTable;
13902     char **azCol;
13903     int i;
13904     char *savedDestTable;
13905     int savedMode;
13906 
13907     azCol = tableColumnList(p, zTable);
13908     if( azCol==0 ){
13909       p->nErr++;
13910       return 0;
13911     }
13912 
13913     /* Always quote the table name, even if it appears to be pure ascii,
13914     ** in case it is a keyword. Ex:  INSERT INTO "table" ... */
13915     initText(&sTable);
13916     appendText(&sTable, zTable, quoteChar(zTable));
13917     /* If preserving the rowid, add a column list after the table name.
13918     ** In other words:  "INSERT INTO tab(rowid,a,b,c,...) VALUES(...)"
13919     ** instead of the usual "INSERT INTO tab VALUES(...)".
13920     */
13921     if( azCol[0] ){
13922       appendText(&sTable, "(", 0);
13923       appendText(&sTable, azCol[0], 0);
13924       for(i=1; azCol[i]; i++){
13925         appendText(&sTable, ",", 0);
13926         appendText(&sTable, azCol[i], quoteChar(azCol[i]));
13927       }
13928       appendText(&sTable, ")", 0);
13929     }
13930 
13931     /* Build an appropriate SELECT statement */
13932     initText(&sSelect);
13933     appendText(&sSelect, "SELECT ", 0);
13934     if( azCol[0] ){
13935       appendText(&sSelect, azCol[0], 0);
13936       appendText(&sSelect, ",", 0);
13937     }
13938     for(i=1; azCol[i]; i++){
13939       appendText(&sSelect, azCol[i], quoteChar(azCol[i]));
13940       if( azCol[i+1] ){
13941         appendText(&sSelect, ",", 0);
13942       }
13943     }
13944     freeColumnList(azCol);
13945     appendText(&sSelect, " FROM ", 0);
13946     appendText(&sSelect, zTable, quoteChar(zTable));
13947 
13948     savedDestTable = p->zDestTable;
13949     savedMode = p->mode;
13950     p->zDestTable = sTable.z;
13951     p->mode = p->cMode = MODE_Insert;
13952     rc = shell_exec(p, sSelect.z, 0);
13953     if( (rc&0xff)==SQLITE_CORRUPT ){
13954       raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n");
13955       toggleSelectOrder(p->db);
13956       shell_exec(p, sSelect.z, 0);
13957       toggleSelectOrder(p->db);
13958     }
13959     p->zDestTable = savedDestTable;
13960     p->mode = savedMode;
13961     freeText(&sTable);
13962     freeText(&sSelect);
13963     if( rc ) p->nErr++;
13964   }
13965   return 0;
13966 }
13967 
13968 /*
13969 ** Run zQuery.  Use dump_callback() as the callback routine so that
13970 ** the contents of the query are output as SQL statements.
13971 **
13972 ** If we get a SQLITE_CORRUPT error, rerun the query after appending
13973 ** "ORDER BY rowid DESC" to the end.
13974 */
13975 static int run_schema_dump_query(
13976   ShellState *p,
13977   const char *zQuery
13978 ){
13979   int rc;
13980   char *zErr = 0;
13981   rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
13982   if( rc==SQLITE_CORRUPT ){
13983     char *zQ2;
13984     int len = strlen30(zQuery);
13985     raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n");
13986     if( zErr ){
13987       utf8_printf(p->out, "/****** %s ******/\n", zErr);
13988       sqlite3_free(zErr);
13989       zErr = 0;
13990     }
13991     zQ2 = malloc( len+100 );
13992     if( zQ2==0 ) return rc;
13993     sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
13994     rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
13995     if( rc ){
13996       utf8_printf(p->out, "/****** ERROR: %s ******/\n", zErr);
13997     }else{
13998       rc = SQLITE_CORRUPT;
13999     }
14000     sqlite3_free(zErr);
14001     free(zQ2);
14002   }
14003   return rc;
14004 }
14005 
14006 /*
14007 ** Text of help messages.
14008 **
14009 ** The help text for each individual command begins with a line that starts
14010 ** with ".".  Subsequent lines are supplimental information.
14011 **
14012 ** There must be two or more spaces between the end of the command and the
14013 ** start of the description of what that command does.
14014 */
14015 static const char *(azHelp[]) = {
14016 #if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE)
14017   ".archive ...             Manage SQL archives",
14018   "   Each command must have exactly one of the following options:",
14019   "     -c, --create               Create a new archive",
14020   "     -u, --update               Add or update files with changed mtime",
14021   "     -i, --insert               Like -u but always add even if unchanged",
14022   "     -t, --list                 List contents of archive",
14023   "     -x, --extract              Extract files from archive",
14024   "   Optional arguments:",
14025   "     -v, --verbose              Print each filename as it is processed",
14026   "     -f FILE, --file FILE       Use archive FILE (default is current db)",
14027   "     -a FILE, --append FILE     Open FILE using the apndvfs VFS",
14028   "     -C DIR, --directory DIR    Read/extract files from directory DIR",
14029   "     -n, --dryrun               Show the SQL that would have occurred",
14030   "   Examples:",
14031   "     .ar -cf ARCHIVE foo bar  # Create ARCHIVE from files foo and bar",
14032   "     .ar -tf ARCHIVE          # List members of ARCHIVE",
14033   "     .ar -xvf ARCHIVE         # Verbosely extract files from ARCHIVE",
14034   "   See also:",
14035   "      http://sqlite.org/cli.html#sqlar_archive_support",
14036 #endif
14037 #ifndef SQLITE_OMIT_AUTHORIZATION
14038   ".auth ON|OFF             Show authorizer callbacks",
14039 #endif
14040   ".backup ?DB? FILE        Backup DB (default \"main\") to FILE",
14041   "       --append            Use the appendvfs",
14042   "       --async             Write to FILE without journal and fsync()",
14043   ".bail on|off             Stop after hitting an error.  Default OFF",
14044   ".binary on|off           Turn binary output on or off.  Default OFF",
14045   ".cd DIRECTORY            Change the working directory to DIRECTORY",
14046   ".changes on|off          Show number of rows changed by SQL",
14047   ".check GLOB              Fail if output since .testcase does not match",
14048   ".clone NEWDB             Clone data into NEWDB from the existing database",
14049   ".databases               List names and files of attached databases",
14050   ".dbconfig ?op? ?val?     List or change sqlite3_db_config() options",
14051   ".dbinfo ?DB?             Show status information about the database",
14052   ".dump ?OBJECTS?          Render database content as SQL",
14053   "   Options:",
14054   "     --data-only            Output only INSERT statements",
14055   "     --newlines             Allow unescaped newline characters in output",
14056   "     --nosys                Omit system tables (ex: \"sqlite_stat1\")",
14057   "     --preserve-rowids      Include ROWID values in the output",
14058   "   OBJECTS is a LIKE pattern for tables, indexes, triggers or views to dump",
14059   "   Additional LIKE patterns can be given in subsequent arguments",
14060   ".echo on|off             Turn command echo on or off",
14061   ".eqp on|off|full|...     Enable or disable automatic EXPLAIN QUERY PLAN",
14062   "   Other Modes:",
14063 #ifdef SQLITE_DEBUG
14064   "      test                  Show raw EXPLAIN QUERY PLAN output",
14065   "      trace                 Like \"full\" but enable \"PRAGMA vdbe_trace\"",
14066 #endif
14067   "      trigger               Like \"full\" but also show trigger bytecode",
14068   ".excel                   Display the output of next command in spreadsheet",
14069   "   --bom                   Put a UTF8 byte-order mark on intermediate file",
14070   ".exit ?CODE?             Exit this program with return-code CODE",
14071   ".expert                  EXPERIMENTAL. Suggest indexes for queries",
14072   ".explain ?on|off|auto?   Change the EXPLAIN formatting mode.  Default: auto",
14073   ".filectrl CMD ...        Run various sqlite3_file_control() operations",
14074   "   --schema SCHEMA         Use SCHEMA instead of \"main\"",
14075   "   --help                  Show CMD details",
14076   ".fullschema ?--indent?   Show schema and the content of sqlite_stat tables",
14077   ".headers on|off          Turn display of headers on or off",
14078   ".help ?-all? ?PATTERN?   Show help text for PATTERN",
14079   ".import FILE TABLE       Import data from FILE into TABLE",
14080   "   Options:",
14081   "     --ascii               Use \\037 and \\036 as column and row separators",
14082   "     --csv                 Use , and \\n as column and row separators",
14083   "     --skip N              Skip the first N rows of input",
14084   "     -v                    \"Verbose\" - increase auxiliary output",
14085   "   Notes:",
14086   "     *  If TABLE does not exist, it is created.  The first row of input",
14087   "        determines the column names.",
14088   "     *  If neither --csv or --ascii are used, the input mode is derived",
14089   "        from the \".mode\" output mode",
14090   "     *  If FILE begins with \"|\" then it is a command that generates the",
14091   "        input text.",
14092 #ifndef SQLITE_OMIT_TEST_CONTROL
14093   ".imposter INDEX TABLE    Create imposter table TABLE on index INDEX",
14094 #endif
14095   ".indexes ?TABLE?         Show names of indexes",
14096   "                           If TABLE is specified, only show indexes for",
14097   "                           tables matching TABLE using the LIKE operator.",
14098 #ifdef SQLITE_ENABLE_IOTRACE
14099   ".iotrace FILE            Enable I/O diagnostic logging to FILE",
14100 #endif
14101   ".limit ?LIMIT? ?VAL?     Display or change the value of an SQLITE_LIMIT",
14102   ".lint OPTIONS            Report potential schema issues.",
14103   "     Options:",
14104   "        fkey-indexes     Find missing foreign key indexes",
14105 #ifndef SQLITE_OMIT_LOAD_EXTENSION
14106   ".load FILE ?ENTRY?       Load an extension library",
14107 #endif
14108   ".log FILE|off            Turn logging on or off.  FILE can be stderr/stdout",
14109   ".mode MODE ?TABLE?       Set output mode",
14110   "   MODE is one of:",
14111   "     ascii     Columns/rows delimited by 0x1F and 0x1E",
14112   "     box       Tables using unicode box-drawing characters",
14113   "     csv       Comma-separated values",
14114   "     column    Output in columns.  (See .width)",
14115   "     html      HTML <table> code",
14116   "     insert    SQL insert statements for TABLE",
14117   "     json      Results in a JSON array",
14118   "     line      One value per line",
14119   "     list      Values delimited by \"|\"",
14120   "     markdown  Markdown table format",
14121   "     quote     Escape answers as for SQL",
14122   "     table     ASCII-art table",
14123   "     tabs      Tab-separated values",
14124   "     tcl       TCL list elements",
14125   ".nullvalue STRING        Use STRING in place of NULL values",
14126   ".once ?OPTIONS? ?FILE?   Output for the next SQL command only to FILE",
14127   "     If FILE begins with '|' then open as a pipe",
14128   "       --bom  Put a UTF8 byte-order mark at the beginning",
14129   "       -e     Send output to the system text editor",
14130   "       -x     Send output as CSV to a spreadsheet (same as \".excel\")",
14131 #ifdef SQLITE_DEBUG
14132   ".oom ?--repeat M? ?N?    Simulate an OOM error on the N-th allocation",
14133 #endif
14134   ".open ?OPTIONS? ?FILE?   Close existing database and reopen FILE",
14135   "     Options:",
14136   "        --append        Use appendvfs to append database to the end of FILE",
14137 #ifdef SQLITE_ENABLE_DESERIALIZE
14138   "        --deserialize   Load into memory useing sqlite3_deserialize()",
14139   "        --hexdb         Load the output of \"dbtotxt\" as an in-memory db",
14140   "        --maxsize N     Maximum size for --hexdb or --deserialized database",
14141 #endif
14142   "        --new           Initialize FILE to an empty database",
14143   "        --nofollow      Do not follow symbolic links",
14144   "        --readonly      Open FILE readonly",
14145   "        --zip           FILE is a ZIP archive",
14146   ".output ?FILE?           Send output to FILE or stdout if FILE is omitted",
14147   "   If FILE begins with '|' then open it as a pipe.",
14148   "   Options:",
14149   "     --bom                 Prefix output with a UTF8 byte-order mark",
14150   "     -e                    Send output to the system text editor",
14151   "     -x                    Send output as CSV to a spreadsheet",
14152   ".parameter CMD ...       Manage SQL parameter bindings",
14153   "   clear                   Erase all bindings",
14154   "   init                    Initialize the TEMP table that holds bindings",
14155   "   list                    List the current parameter bindings",
14156   "   set PARAMETER VALUE     Given SQL parameter PARAMETER a value of VALUE",
14157   "                           PARAMETER should start with one of: $ : @ ?",
14158   "   unset PARAMETER         Remove PARAMETER from the binding table",
14159   ".print STRING...         Print literal STRING",
14160 #ifndef SQLITE_OMIT_PROGRESS_CALLBACK
14161   ".progress N              Invoke progress handler after every N opcodes",
14162   "   --limit N                 Interrupt after N progress callbacks",
14163   "   --once                    Do no more than one progress interrupt",
14164   "   --quiet|-q                No output except at interrupts",
14165   "   --reset                   Reset the count for each input and interrupt",
14166 #endif
14167   ".prompt MAIN CONTINUE    Replace the standard prompts",
14168   ".quit                    Exit this program",
14169   ".read FILE               Read input from FILE",
14170 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
14171   ".recover                 Recover as much data as possible from corrupt db.",
14172   "   --freelist-corrupt       Assume the freelist is corrupt",
14173   "   --recovery-db NAME       Store recovery metadata in database file NAME",
14174   "   --lost-and-found TABLE   Alternative name for the lost-and-found table",
14175   "   --no-rowids              Do not attempt to recover rowid values",
14176   "                            that are not also INTEGER PRIMARY KEYs",
14177 #endif
14178   ".restore ?DB? FILE       Restore content of DB (default \"main\") from FILE",
14179   ".save FILE               Write in-memory database into FILE",
14180   ".scanstats on|off        Turn sqlite3_stmt_scanstatus() metrics on or off",
14181   ".schema ?PATTERN?        Show the CREATE statements matching PATTERN",
14182   "   Options:",
14183   "      --indent             Try to pretty-print the schema",
14184   "      --nosys              Omit objects whose names start with \"sqlite_\"",
14185   ".selftest ?OPTIONS?      Run tests defined in the SELFTEST table",
14186   "    Options:",
14187   "       --init               Create a new SELFTEST table",
14188   "       -v                   Verbose output",
14189   ".separator COL ?ROW?     Change the column and row separators",
14190 #if defined(SQLITE_ENABLE_SESSION)
14191   ".session ?NAME? CMD ...  Create or control sessions",
14192   "   Subcommands:",
14193   "     attach TABLE             Attach TABLE",
14194   "     changeset FILE           Write a changeset into FILE",
14195   "     close                    Close one session",
14196   "     enable ?BOOLEAN?         Set or query the enable bit",
14197   "     filter GLOB...           Reject tables matching GLOBs",
14198   "     indirect ?BOOLEAN?       Mark or query the indirect status",
14199   "     isempty                  Query whether the session is empty",
14200   "     list                     List currently open session names",
14201   "     open DB NAME             Open a new session on DB",
14202   "     patchset FILE            Write a patchset into FILE",
14203   "   If ?NAME? is omitted, the first defined session is used.",
14204 #endif
14205   ".sha3sum ...             Compute a SHA3 hash of database content",
14206   "    Options:",
14207   "      --schema              Also hash the sqlite_schema table",
14208   "      --sha3-224            Use the sha3-224 algorithm",
14209   "      --sha3-256            Use the sha3-256 algorithm (default)",
14210   "      --sha3-384            Use the sha3-384 algorithm",
14211   "      --sha3-512            Use the sha3-512 algorithm",
14212   "    Any other argument is a LIKE pattern for tables to hash",
14213 #ifndef SQLITE_NOHAVE_SYSTEM
14214   ".shell CMD ARGS...       Run CMD ARGS... in a system shell",
14215 #endif
14216   ".show                    Show the current values for various settings",
14217   ".stats ?ARG?             Show stats or turn stats on or off",
14218   "   off                      Turn off automatic stat display",
14219   "   on                       Turn on automatic stat display",
14220   "   stmt                     Show statement stats",
14221   "   vmstep                   Show the virtual machine step count only",
14222 #ifndef SQLITE_NOHAVE_SYSTEM
14223   ".system CMD ARGS...      Run CMD ARGS... in a system shell",
14224 #endif
14225   ".tables ?TABLE?          List names of tables matching LIKE pattern TABLE",
14226   ".testcase NAME           Begin redirecting output to 'testcase-out.txt'",
14227   ".testctrl CMD ...        Run various sqlite3_test_control() operations",
14228   "                           Run \".testctrl\" with no arguments for details",
14229   ".timeout MS              Try opening locked tables for MS milliseconds",
14230   ".timer on|off            Turn SQL timer on or off",
14231 #ifndef SQLITE_OMIT_TRACE
14232   ".trace ?OPTIONS?         Output each SQL statement as it is run",
14233   "    FILE                    Send output to FILE",
14234   "    stdout                  Send output to stdout",
14235   "    stderr                  Send output to stderr",
14236   "    off                     Disable tracing",
14237   "    --expanded              Expand query parameters",
14238 #ifdef SQLITE_ENABLE_NORMALIZE
14239   "    --normalized            Normal the SQL statements",
14240 #endif
14241   "    --plain                 Show SQL as it is input",
14242   "    --stmt                  Trace statement execution (SQLITE_TRACE_STMT)",
14243   "    --profile               Profile statements (SQLITE_TRACE_PROFILE)",
14244   "    --row                   Trace each row (SQLITE_TRACE_ROW)",
14245   "    --close                 Trace connection close (SQLITE_TRACE_CLOSE)",
14246 #endif /* SQLITE_OMIT_TRACE */
14247 #ifdef SQLITE_DEBUG
14248   ".unmodule NAME ...       Unregister virtual table modules",
14249   "    --allexcept             Unregister everything except those named",
14250 #endif
14251   ".vfsinfo ?AUX?           Information about the top-level VFS",
14252   ".vfslist                 List all available VFSes",
14253   ".vfsname ?AUX?           Print the name of the VFS stack",
14254   ".width NUM1 NUM2 ...     Set minimum column widths for columnar output",
14255   "     Negative values right-justify",
14256 };
14257 
14258 /*
14259 ** Output help text.
14260 **
14261 ** zPattern describes the set of commands for which help text is provided.
14262 ** If zPattern is NULL, then show all commands, but only give a one-line
14263 ** description of each.
14264 **
14265 ** Return the number of matches.
14266 */
14267 static int showHelp(FILE *out, const char *zPattern){
14268   int i = 0;
14269   int j = 0;
14270   int n = 0;
14271   char *zPat;
14272   if( zPattern==0
14273    || zPattern[0]=='0'
14274    || strcmp(zPattern,"-a")==0
14275    || strcmp(zPattern,"-all")==0
14276    || strcmp(zPattern,"--all")==0
14277   ){
14278     /* Show all commands, but only one line per command */
14279     if( zPattern==0 ) zPattern = "";
14280     for(i=0; i<ArraySize(azHelp); i++){
14281       if( azHelp[i][0]=='.' || zPattern[0] ){
14282         utf8_printf(out, "%s\n", azHelp[i]);
14283         n++;
14284       }
14285     }
14286   }else{
14287     /* Look for commands that for which zPattern is an exact prefix */
14288     zPat = sqlite3_mprintf(".%s*", zPattern);
14289     for(i=0; i<ArraySize(azHelp); i++){
14290       if( sqlite3_strglob(zPat, azHelp[i])==0 ){
14291         utf8_printf(out, "%s\n", azHelp[i]);
14292         j = i+1;
14293         n++;
14294       }
14295     }
14296     sqlite3_free(zPat);
14297     if( n ){
14298       if( n==1 ){
14299         /* when zPattern is a prefix of exactly one command, then include the
14300         ** details of that command, which should begin at offset j */
14301         while( j<ArraySize(azHelp)-1 && azHelp[j][0]!='.' ){
14302           utf8_printf(out, "%s\n", azHelp[j]);
14303           j++;
14304         }
14305       }
14306       return n;
14307     }
14308     /* Look for commands that contain zPattern anywhere.  Show the complete
14309     ** text of all commands that match. */
14310     zPat = sqlite3_mprintf("%%%s%%", zPattern);
14311     for(i=0; i<ArraySize(azHelp); i++){
14312       if( azHelp[i][0]=='.' ) j = i;
14313       if( sqlite3_strlike(zPat, azHelp[i], 0)==0 ){
14314         utf8_printf(out, "%s\n", azHelp[j]);
14315         while( j<ArraySize(azHelp)-1 && azHelp[j+1][0]!='.' ){
14316           j++;
14317           utf8_printf(out, "%s\n", azHelp[j]);
14318         }
14319         i = j;
14320         n++;
14321       }
14322     }
14323     sqlite3_free(zPat);
14324   }
14325   return n;
14326 }
14327 
14328 /* Forward reference */
14329 static int process_input(ShellState *p);
14330 
14331 /*
14332 ** Read the content of file zName into memory obtained from sqlite3_malloc64()
14333 ** and return a pointer to the buffer. The caller is responsible for freeing
14334 ** the memory.
14335 **
14336 ** If parameter pnByte is not NULL, (*pnByte) is set to the number of bytes
14337 ** read.
14338 **
14339 ** For convenience, a nul-terminator byte is always appended to the data read
14340 ** from the file before the buffer is returned. This byte is not included in
14341 ** the final value of (*pnByte), if applicable.
14342 **
14343 ** NULL is returned if any error is encountered. The final value of *pnByte
14344 ** is undefined in this case.
14345 */
14346 static char *readFile(const char *zName, int *pnByte){
14347   FILE *in = fopen(zName, "rb");
14348   long nIn;
14349   size_t nRead;
14350   char *pBuf;
14351   if( in==0 ) return 0;
14352   fseek(in, 0, SEEK_END);
14353   nIn = ftell(in);
14354   rewind(in);
14355   pBuf = sqlite3_malloc64( nIn+1 );
14356   if( pBuf==0 ){ fclose(in); return 0; }
14357   nRead = fread(pBuf, nIn, 1, in);
14358   fclose(in);
14359   if( nRead!=1 ){
14360     sqlite3_free(pBuf);
14361     return 0;
14362   }
14363   pBuf[nIn] = 0;
14364   if( pnByte ) *pnByte = nIn;
14365   return pBuf;
14366 }
14367 
14368 #if defined(SQLITE_ENABLE_SESSION)
14369 /*
14370 ** Close a single OpenSession object and release all of its associated
14371 ** resources.
14372 */
14373 static void session_close(OpenSession *pSession){
14374   int i;
14375   sqlite3session_delete(pSession->p);
14376   sqlite3_free(pSession->zName);
14377   for(i=0; i<pSession->nFilter; i++){
14378     sqlite3_free(pSession->azFilter[i]);
14379   }
14380   sqlite3_free(pSession->azFilter);
14381   memset(pSession, 0, sizeof(OpenSession));
14382 }
14383 #endif
14384 
14385 /*
14386 ** Close all OpenSession objects and release all associated resources.
14387 */
14388 #if defined(SQLITE_ENABLE_SESSION)
14389 static void session_close_all(ShellState *p){
14390   int i;
14391   for(i=0; i<p->nSession; i++){
14392     session_close(&p->aSession[i]);
14393   }
14394   p->nSession = 0;
14395 }
14396 #else
14397 # define session_close_all(X)
14398 #endif
14399 
14400 /*
14401 ** Implementation of the xFilter function for an open session.  Omit
14402 ** any tables named by ".session filter" but let all other table through.
14403 */
14404 #if defined(SQLITE_ENABLE_SESSION)
14405 static int session_filter(void *pCtx, const char *zTab){
14406   OpenSession *pSession = (OpenSession*)pCtx;
14407   int i;
14408   for(i=0; i<pSession->nFilter; i++){
14409     if( sqlite3_strglob(pSession->azFilter[i], zTab)==0 ) return 0;
14410   }
14411   return 1;
14412 }
14413 #endif
14414 
14415 /*
14416 ** Try to deduce the type of file for zName based on its content.  Return
14417 ** one of the SHELL_OPEN_* constants.
14418 **
14419 ** If the file does not exist or is empty but its name looks like a ZIP
14420 ** archive and the dfltZip flag is true, then assume it is a ZIP archive.
14421 ** Otherwise, assume an ordinary database regardless of the filename if
14422 ** the type cannot be determined from content.
14423 */
14424 int deduceDatabaseType(const char *zName, int dfltZip){
14425   FILE *f = fopen(zName, "rb");
14426   size_t n;
14427   int rc = SHELL_OPEN_UNSPEC;
14428   char zBuf[100];
14429   if( f==0 ){
14430     if( dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){
14431        return SHELL_OPEN_ZIPFILE;
14432     }else{
14433        return SHELL_OPEN_NORMAL;
14434     }
14435   }
14436   n = fread(zBuf, 16, 1, f);
14437   if( n==1 && memcmp(zBuf, "SQLite format 3", 16)==0 ){
14438     fclose(f);
14439     return SHELL_OPEN_NORMAL;
14440   }
14441   fseek(f, -25, SEEK_END);
14442   n = fread(zBuf, 25, 1, f);
14443   if( n==1 && memcmp(zBuf, "Start-Of-SQLite3-", 17)==0 ){
14444     rc = SHELL_OPEN_APPENDVFS;
14445   }else{
14446     fseek(f, -22, SEEK_END);
14447     n = fread(zBuf, 22, 1, f);
14448     if( n==1 && zBuf[0]==0x50 && zBuf[1]==0x4b && zBuf[2]==0x05
14449        && zBuf[3]==0x06 ){
14450       rc = SHELL_OPEN_ZIPFILE;
14451     }else if( n==0 && dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){
14452       rc = SHELL_OPEN_ZIPFILE;
14453     }
14454   }
14455   fclose(f);
14456   return rc;
14457 }
14458 
14459 #ifdef SQLITE_ENABLE_DESERIALIZE
14460 /*
14461 ** Reconstruct an in-memory database using the output from the "dbtotxt"
14462 ** program.  Read content from the file in p->zDbFilename.  If p->zDbFilename
14463 ** is 0, then read from standard input.
14464 */
14465 static unsigned char *readHexDb(ShellState *p, int *pnData){
14466   unsigned char *a = 0;
14467   int nLine;
14468   int n = 0;
14469   int pgsz = 0;
14470   int iOffset = 0;
14471   int j, k;
14472   int rc;
14473   FILE *in;
14474   unsigned int x[16];
14475   char zLine[1000];
14476   if( p->zDbFilename ){
14477     in = fopen(p->zDbFilename, "r");
14478     if( in==0 ){
14479       utf8_printf(stderr, "cannot open \"%s\" for reading\n", p->zDbFilename);
14480       return 0;
14481     }
14482     nLine = 0;
14483   }else{
14484     in = p->in;
14485     nLine = p->lineno;
14486     if( in==0 ) in = stdin;
14487   }
14488   *pnData = 0;
14489   nLine++;
14490   if( fgets(zLine, sizeof(zLine), in)==0 ) goto readHexDb_error;
14491   rc = sscanf(zLine, "| size %d pagesize %d", &n, &pgsz);
14492   if( rc!=2 ) goto readHexDb_error;
14493   if( n<0 ) goto readHexDb_error;
14494   if( pgsz<512 || pgsz>65536 || (pgsz&(pgsz-1))!=0 ) goto readHexDb_error;
14495   n = (n+pgsz-1)&~(pgsz-1);  /* Round n up to the next multiple of pgsz */
14496   a = sqlite3_malloc( n ? n : 1 );
14497   if( a==0 ){
14498     utf8_printf(stderr, "Out of memory!\n");
14499     goto readHexDb_error;
14500   }
14501   memset(a, 0, n);
14502   if( pgsz<512 || pgsz>65536 || (pgsz & (pgsz-1))!=0 ){
14503     utf8_printf(stderr, "invalid pagesize\n");
14504     goto readHexDb_error;
14505   }
14506   for(nLine++; fgets(zLine, sizeof(zLine), in)!=0; nLine++){
14507     rc = sscanf(zLine, "| page %d offset %d", &j, &k);
14508     if( rc==2 ){
14509       iOffset = k;
14510       continue;
14511     }
14512     if( strncmp(zLine, "| end ", 6)==0 ){
14513       break;
14514     }
14515     rc = sscanf(zLine,"| %d: %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x",
14516                 &j, &x[0], &x[1], &x[2], &x[3], &x[4], &x[5], &x[6], &x[7],
14517                 &x[8], &x[9], &x[10], &x[11], &x[12], &x[13], &x[14], &x[15]);
14518     if( rc==17 ){
14519       k = iOffset+j;
14520       if( k+16<=n ){
14521         int ii;
14522         for(ii=0; ii<16; ii++) a[k+ii] = x[ii]&0xff;
14523       }
14524     }
14525   }
14526   *pnData = n;
14527   if( in!=p->in ){
14528     fclose(in);
14529   }else{
14530     p->lineno = nLine;
14531   }
14532   return a;
14533 
14534 readHexDb_error:
14535   if( in!=p->in ){
14536     fclose(in);
14537   }else{
14538     while( fgets(zLine, sizeof(zLine), p->in)!=0 ){
14539       nLine++;
14540       if(strncmp(zLine, "| end ", 6)==0 ) break;
14541     }
14542     p->lineno = nLine;
14543   }
14544   sqlite3_free(a);
14545   utf8_printf(stderr,"Error on line %d of --hexdb input\n", nLine);
14546   return 0;
14547 }
14548 #endif /* SQLITE_ENABLE_DESERIALIZE */
14549 
14550 /*
14551 ** Scalar function "shell_int32". The first argument to this function
14552 ** must be a blob. The second a non-negative integer. This function
14553 ** reads and returns a 32-bit big-endian integer from byte
14554 ** offset (4*<arg2>) of the blob.
14555 */
14556 static void shellInt32(
14557   sqlite3_context *context,
14558   int argc,
14559   sqlite3_value **argv
14560 ){
14561   const unsigned char *pBlob;
14562   int nBlob;
14563   int iInt;
14564 
14565   UNUSED_PARAMETER(argc);
14566   nBlob = sqlite3_value_bytes(argv[0]);
14567   pBlob = (const unsigned char*)sqlite3_value_blob(argv[0]);
14568   iInt = sqlite3_value_int(argv[1]);
14569 
14570   if( iInt>=0 && (iInt+1)*4<=nBlob ){
14571     const unsigned char *a = &pBlob[iInt*4];
14572     sqlite3_int64 iVal = ((sqlite3_int64)a[0]<<24)
14573                        + ((sqlite3_int64)a[1]<<16)
14574                        + ((sqlite3_int64)a[2]<< 8)
14575                        + ((sqlite3_int64)a[3]<< 0);
14576     sqlite3_result_int64(context, iVal);
14577   }
14578 }
14579 
14580 /*
14581 ** Scalar function "shell_idquote(X)" returns string X quoted as an identifier,
14582 ** using "..." with internal double-quote characters doubled.
14583 */
14584 static void shellIdQuote(
14585   sqlite3_context *context,
14586   int argc,
14587   sqlite3_value **argv
14588 ){
14589   const char *zName = (const char*)sqlite3_value_text(argv[0]);
14590   UNUSED_PARAMETER(argc);
14591   if( zName ){
14592     char *z = sqlite3_mprintf("\"%w\"", zName);
14593     sqlite3_result_text(context, z, -1, sqlite3_free);
14594   }
14595 }
14596 
14597 /*
14598 ** Scalar function "usleep(X)" invokes sqlite3_sleep(X) and returns X.
14599 */
14600 static void shellUSleepFunc(
14601   sqlite3_context *context,
14602   int argcUnused,
14603   sqlite3_value **argv
14604 ){
14605   int sleep = sqlite3_value_int(argv[0]);
14606   (void)argcUnused;
14607   sqlite3_sleep(sleep/1000);
14608   sqlite3_result_int(context, sleep);
14609 }
14610 
14611 /*
14612 ** Scalar function "shell_escape_crnl" used by the .recover command.
14613 ** The argument passed to this function is the output of built-in
14614 ** function quote(). If the first character of the input is "'",
14615 ** indicating that the value passed to quote() was a text value,
14616 ** then this function searches the input for "\n" and "\r" characters
14617 ** and adds a wrapper similar to the following:
14618 **
14619 **   replace(replace(<input>, '\n', char(10), '\r', char(13));
14620 **
14621 ** Or, if the first character of the input is not "'", then a copy
14622 ** of the input is returned.
14623 */
14624 static void shellEscapeCrnl(
14625   sqlite3_context *context,
14626   int argc,
14627   sqlite3_value **argv
14628 ){
14629   const char *zText = (const char*)sqlite3_value_text(argv[0]);
14630   UNUSED_PARAMETER(argc);
14631   if( zText[0]=='\'' ){
14632     int nText = sqlite3_value_bytes(argv[0]);
14633     int i;
14634     char zBuf1[20];
14635     char zBuf2[20];
14636     const char *zNL = 0;
14637     const char *zCR = 0;
14638     int nCR = 0;
14639     int nNL = 0;
14640 
14641     for(i=0; zText[i]; i++){
14642       if( zNL==0 && zText[i]=='\n' ){
14643         zNL = unused_string(zText, "\\n", "\\012", zBuf1);
14644         nNL = (int)strlen(zNL);
14645       }
14646       if( zCR==0 && zText[i]=='\r' ){
14647         zCR = unused_string(zText, "\\r", "\\015", zBuf2);
14648         nCR = (int)strlen(zCR);
14649       }
14650     }
14651 
14652     if( zNL || zCR ){
14653       int iOut = 0;
14654       i64 nMax = (nNL > nCR) ? nNL : nCR;
14655       i64 nAlloc = nMax * nText + (nMax+64)*2;
14656       char *zOut = (char*)sqlite3_malloc64(nAlloc);
14657       if( zOut==0 ){
14658         sqlite3_result_error_nomem(context);
14659         return;
14660       }
14661 
14662       if( zNL && zCR ){
14663         memcpy(&zOut[iOut], "replace(replace(", 16);
14664         iOut += 16;
14665       }else{
14666         memcpy(&zOut[iOut], "replace(", 8);
14667         iOut += 8;
14668       }
14669       for(i=0; zText[i]; i++){
14670         if( zText[i]=='\n' ){
14671           memcpy(&zOut[iOut], zNL, nNL);
14672           iOut += nNL;
14673         }else if( zText[i]=='\r' ){
14674           memcpy(&zOut[iOut], zCR, nCR);
14675           iOut += nCR;
14676         }else{
14677           zOut[iOut] = zText[i];
14678           iOut++;
14679         }
14680       }
14681 
14682       if( zNL ){
14683         memcpy(&zOut[iOut], ",'", 2); iOut += 2;
14684         memcpy(&zOut[iOut], zNL, nNL); iOut += nNL;
14685         memcpy(&zOut[iOut], "', char(10))", 12); iOut += 12;
14686       }
14687       if( zCR ){
14688         memcpy(&zOut[iOut], ",'", 2); iOut += 2;
14689         memcpy(&zOut[iOut], zCR, nCR); iOut += nCR;
14690         memcpy(&zOut[iOut], "', char(13))", 12); iOut += 12;
14691       }
14692 
14693       sqlite3_result_text(context, zOut, iOut, SQLITE_TRANSIENT);
14694       sqlite3_free(zOut);
14695       return;
14696     }
14697   }
14698 
14699   sqlite3_result_value(context, argv[0]);
14700 }
14701 
14702 /* Flags for open_db().
14703 **
14704 ** The default behavior of open_db() is to exit(1) if the database fails to
14705 ** open.  The OPEN_DB_KEEPALIVE flag changes that so that it prints an error
14706 ** but still returns without calling exit.
14707 **
14708 ** The OPEN_DB_ZIPFILE flag causes open_db() to prefer to open files as a
14709 ** ZIP archive if the file does not exist or is empty and its name matches
14710 ** the *.zip pattern.
14711 */
14712 #define OPEN_DB_KEEPALIVE   0x001   /* Return after error if true */
14713 #define OPEN_DB_ZIPFILE     0x002   /* Open as ZIP if name matches *.zip */
14714 
14715 /*
14716 ** Make sure the database is open.  If it is not, then open it.  If
14717 ** the database fails to open, print an error message and exit.
14718 */
14719 static void open_db(ShellState *p, int openFlags){
14720   if( p->db==0 ){
14721     if( p->openMode==SHELL_OPEN_UNSPEC ){
14722       if( p->zDbFilename==0 || p->zDbFilename[0]==0 ){
14723         p->openMode = SHELL_OPEN_NORMAL;
14724       }else{
14725         p->openMode = (u8)deduceDatabaseType(p->zDbFilename,
14726                              (openFlags & OPEN_DB_ZIPFILE)!=0);
14727       }
14728     }
14729     switch( p->openMode ){
14730       case SHELL_OPEN_APPENDVFS: {
14731         sqlite3_open_v2(p->zDbFilename, &p->db,
14732            SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, "apndvfs");
14733         break;
14734       }
14735       case SHELL_OPEN_HEXDB:
14736       case SHELL_OPEN_DESERIALIZE: {
14737         sqlite3_open(0, &p->db);
14738         break;
14739       }
14740       case SHELL_OPEN_ZIPFILE: {
14741         sqlite3_open(":memory:", &p->db);
14742         break;
14743       }
14744       case SHELL_OPEN_READONLY: {
14745         sqlite3_open_v2(p->zDbFilename, &p->db,
14746             SQLITE_OPEN_READONLY|p->openFlags, 0);
14747         break;
14748       }
14749       case SHELL_OPEN_UNSPEC:
14750       case SHELL_OPEN_NORMAL: {
14751         sqlite3_open_v2(p->zDbFilename, &p->db,
14752            SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, 0);
14753         break;
14754       }
14755     }
14756     globalDb = p->db;
14757     if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){
14758       utf8_printf(stderr,"Error: unable to open database \"%s\": %s\n",
14759           p->zDbFilename, sqlite3_errmsg(p->db));
14760       if( openFlags & OPEN_DB_KEEPALIVE ){
14761         sqlite3_open(":memory:", &p->db);
14762         return;
14763       }
14764       exit(1);
14765     }
14766 #ifndef SQLITE_OMIT_LOAD_EXTENSION
14767     sqlite3_enable_load_extension(p->db, 1);
14768 #endif
14769     sqlite3_fileio_init(p->db, 0, 0);
14770     sqlite3_shathree_init(p->db, 0, 0);
14771     sqlite3_completion_init(p->db, 0, 0);
14772     sqlite3_uint_init(p->db, 0, 0);
14773     sqlite3_decimal_init(p->db, 0, 0);
14774     sqlite3_ieee_init(p->db, 0, 0);
14775     sqlite3_series_init(p->db, 0, 0);
14776 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
14777     sqlite3_dbdata_init(p->db, 0, 0);
14778 #endif
14779 #ifdef SQLITE_HAVE_ZLIB
14780     sqlite3_zipfile_init(p->db, 0, 0);
14781     sqlite3_sqlar_init(p->db, 0, 0);
14782 #endif
14783     sqlite3_create_function(p->db, "shell_add_schema", 3, SQLITE_UTF8, 0,
14784                             shellAddSchemaName, 0, 0);
14785     sqlite3_create_function(p->db, "shell_module_schema", 1, SQLITE_UTF8, 0,
14786                             shellModuleSchema, 0, 0);
14787     sqlite3_create_function(p->db, "shell_putsnl", 1, SQLITE_UTF8, p,
14788                             shellPutsFunc, 0, 0);
14789     sqlite3_create_function(p->db, "shell_escape_crnl", 1, SQLITE_UTF8, 0,
14790                             shellEscapeCrnl, 0, 0);
14791     sqlite3_create_function(p->db, "shell_int32", 2, SQLITE_UTF8, 0,
14792                             shellInt32, 0, 0);
14793     sqlite3_create_function(p->db, "shell_idquote", 1, SQLITE_UTF8, 0,
14794                             shellIdQuote, 0, 0);
14795     sqlite3_create_function(p->db, "usleep",1,SQLITE_UTF8,0,
14796                             shellUSleepFunc, 0, 0);
14797 #ifndef SQLITE_NOHAVE_SYSTEM
14798     sqlite3_create_function(p->db, "edit", 1, SQLITE_UTF8, 0,
14799                             editFunc, 0, 0);
14800     sqlite3_create_function(p->db, "edit", 2, SQLITE_UTF8, 0,
14801                             editFunc, 0, 0);
14802 #endif
14803     if( p->openMode==SHELL_OPEN_ZIPFILE ){
14804       char *zSql = sqlite3_mprintf(
14805          "CREATE VIRTUAL TABLE zip USING zipfile(%Q);", p->zDbFilename);
14806       sqlite3_exec(p->db, zSql, 0, 0, 0);
14807       sqlite3_free(zSql);
14808     }
14809 #ifdef SQLITE_ENABLE_DESERIALIZE
14810     else
14811     if( p->openMode==SHELL_OPEN_DESERIALIZE || p->openMode==SHELL_OPEN_HEXDB ){
14812       int rc;
14813       int nData = 0;
14814       unsigned char *aData;
14815       if( p->openMode==SHELL_OPEN_DESERIALIZE ){
14816         aData = (unsigned char*)readFile(p->zDbFilename, &nData);
14817       }else{
14818         aData = readHexDb(p, &nData);
14819         if( aData==0 ){
14820           return;
14821         }
14822       }
14823       rc = sqlite3_deserialize(p->db, "main", aData, nData, nData,
14824                    SQLITE_DESERIALIZE_RESIZEABLE |
14825                    SQLITE_DESERIALIZE_FREEONCLOSE);
14826       if( rc ){
14827         utf8_printf(stderr, "Error: sqlite3_deserialize() returns %d\n", rc);
14828       }
14829       if( p->szMax>0 ){
14830         sqlite3_file_control(p->db, "main", SQLITE_FCNTL_SIZE_LIMIT, &p->szMax);
14831       }
14832     }
14833 #endif
14834   }
14835 }
14836 
14837 /*
14838 ** Attempt to close the databaes connection.  Report errors.
14839 */
14840 void close_db(sqlite3 *db){
14841   int rc = sqlite3_close(db);
14842   if( rc ){
14843     utf8_printf(stderr, "Error: sqlite3_close() returns %d: %s\n",
14844         rc, sqlite3_errmsg(db));
14845   }
14846 }
14847 
14848 #if HAVE_READLINE || HAVE_EDITLINE
14849 /*
14850 ** Readline completion callbacks
14851 */
14852 static char *readline_completion_generator(const char *text, int state){
14853   static sqlite3_stmt *pStmt = 0;
14854   char *zRet;
14855   if( state==0 ){
14856     char *zSql;
14857     sqlite3_finalize(pStmt);
14858     zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
14859                            "  FROM completion(%Q) ORDER BY 1", text);
14860     sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
14861     sqlite3_free(zSql);
14862   }
14863   if( sqlite3_step(pStmt)==SQLITE_ROW ){
14864     zRet = strdup((const char*)sqlite3_column_text(pStmt, 0));
14865   }else{
14866     sqlite3_finalize(pStmt);
14867     pStmt = 0;
14868     zRet = 0;
14869   }
14870   return zRet;
14871 }
14872 static char **readline_completion(const char *zText, int iStart, int iEnd){
14873   rl_attempted_completion_over = 1;
14874   return rl_completion_matches(zText, readline_completion_generator);
14875 }
14876 
14877 #elif HAVE_LINENOISE
14878 /*
14879 ** Linenoise completion callback
14880 */
14881 static void linenoise_completion(const char *zLine, linenoiseCompletions *lc){
14882   int nLine = strlen30(zLine);
14883   int i, iStart;
14884   sqlite3_stmt *pStmt = 0;
14885   char *zSql;
14886   char zBuf[1000];
14887 
14888   if( nLine>sizeof(zBuf)-30 ) return;
14889   if( zLine[0]=='.' || zLine[0]=='#') return;
14890   for(i=nLine-1; i>=0 && (isalnum(zLine[i]) || zLine[i]=='_'); i--){}
14891   if( i==nLine-1 ) return;
14892   iStart = i+1;
14893   memcpy(zBuf, zLine, iStart);
14894   zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
14895                          "  FROM completion(%Q,%Q) ORDER BY 1",
14896                          &zLine[iStart], zLine);
14897   sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
14898   sqlite3_free(zSql);
14899   sqlite3_exec(globalDb, "PRAGMA page_count", 0, 0, 0); /* Load the schema */
14900   while( sqlite3_step(pStmt)==SQLITE_ROW ){
14901     const char *zCompletion = (const char*)sqlite3_column_text(pStmt, 0);
14902     int nCompletion = sqlite3_column_bytes(pStmt, 0);
14903     if( iStart+nCompletion < sizeof(zBuf)-1 ){
14904       memcpy(zBuf+iStart, zCompletion, nCompletion+1);
14905       linenoiseAddCompletion(lc, zBuf);
14906     }
14907   }
14908   sqlite3_finalize(pStmt);
14909 }
14910 #endif
14911 
14912 /*
14913 ** Do C-language style dequoting.
14914 **
14915 **    \a    -> alarm
14916 **    \b    -> backspace
14917 **    \t    -> tab
14918 **    \n    -> newline
14919 **    \v    -> vertical tab
14920 **    \f    -> form feed
14921 **    \r    -> carriage return
14922 **    \s    -> space
14923 **    \"    -> "
14924 **    \'    -> '
14925 **    \\    -> backslash
14926 **    \NNN  -> ascii character NNN in octal
14927 */
14928 static void resolve_backslashes(char *z){
14929   int i, j;
14930   char c;
14931   while( *z && *z!='\\' ) z++;
14932   for(i=j=0; (c = z[i])!=0; i++, j++){
14933     if( c=='\\' && z[i+1]!=0 ){
14934       c = z[++i];
14935       if( c=='a' ){
14936         c = '\a';
14937       }else if( c=='b' ){
14938         c = '\b';
14939       }else if( c=='t' ){
14940         c = '\t';
14941       }else if( c=='n' ){
14942         c = '\n';
14943       }else if( c=='v' ){
14944         c = '\v';
14945       }else if( c=='f' ){
14946         c = '\f';
14947       }else if( c=='r' ){
14948         c = '\r';
14949       }else if( c=='"' ){
14950         c = '"';
14951       }else if( c=='\'' ){
14952         c = '\'';
14953       }else if( c=='\\' ){
14954         c = '\\';
14955       }else if( c>='0' && c<='7' ){
14956         c -= '0';
14957         if( z[i+1]>='0' && z[i+1]<='7' ){
14958           i++;
14959           c = (c<<3) + z[i] - '0';
14960           if( z[i+1]>='0' && z[i+1]<='7' ){
14961             i++;
14962             c = (c<<3) + z[i] - '0';
14963           }
14964         }
14965       }
14966     }
14967     z[j] = c;
14968   }
14969   if( j<i ) z[j] = 0;
14970 }
14971 
14972 /*
14973 ** Interpret zArg as either an integer or a boolean value.  Return 1 or 0
14974 ** for TRUE and FALSE.  Return the integer value if appropriate.
14975 */
14976 static int booleanValue(const char *zArg){
14977   int i;
14978   if( zArg[0]=='0' && zArg[1]=='x' ){
14979     for(i=2; hexDigitValue(zArg[i])>=0; i++){}
14980   }else{
14981     for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
14982   }
14983   if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
14984   if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
14985     return 1;
14986   }
14987   if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
14988     return 0;
14989   }
14990   utf8_printf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
14991           zArg);
14992   return 0;
14993 }
14994 
14995 /*
14996 ** Set or clear a shell flag according to a boolean value.
14997 */
14998 static void setOrClearFlag(ShellState *p, unsigned mFlag, const char *zArg){
14999   if( booleanValue(zArg) ){
15000     ShellSetFlag(p, mFlag);
15001   }else{
15002     ShellClearFlag(p, mFlag);
15003   }
15004 }
15005 
15006 /*
15007 ** Close an output file, assuming it is not stderr or stdout
15008 */
15009 static void output_file_close(FILE *f){
15010   if( f && f!=stdout && f!=stderr ) fclose(f);
15011 }
15012 
15013 /*
15014 ** Try to open an output file.   The names "stdout" and "stderr" are
15015 ** recognized and do the right thing.  NULL is returned if the output
15016 ** filename is "off".
15017 */
15018 static FILE *output_file_open(const char *zFile, int bTextMode){
15019   FILE *f;
15020   if( strcmp(zFile,"stdout")==0 ){
15021     f = stdout;
15022   }else if( strcmp(zFile, "stderr")==0 ){
15023     f = stderr;
15024   }else if( strcmp(zFile, "off")==0 ){
15025     f = 0;
15026   }else{
15027     f = fopen(zFile, bTextMode ? "w" : "wb");
15028     if( f==0 ){
15029       utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
15030     }
15031   }
15032   return f;
15033 }
15034 
15035 #ifndef SQLITE_OMIT_TRACE
15036 /*
15037 ** A routine for handling output from sqlite3_trace().
15038 */
15039 static int sql_trace_callback(
15040   unsigned mType,         /* The trace type */
15041   void *pArg,             /* The ShellState pointer */
15042   void *pP,               /* Usually a pointer to sqlite_stmt */
15043   void *pX                /* Auxiliary output */
15044 ){
15045   ShellState *p = (ShellState*)pArg;
15046   sqlite3_stmt *pStmt;
15047   const char *zSql;
15048   int nSql;
15049   if( p->traceOut==0 ) return 0;
15050   if( mType==SQLITE_TRACE_CLOSE ){
15051     utf8_printf(p->traceOut, "-- closing database connection\n");
15052     return 0;
15053   }
15054   if( mType!=SQLITE_TRACE_ROW && ((const char*)pX)[0]=='-' ){
15055     zSql = (const char*)pX;
15056   }else{
15057     pStmt = (sqlite3_stmt*)pP;
15058     switch( p->eTraceType ){
15059       case SHELL_TRACE_EXPANDED: {
15060         zSql = sqlite3_expanded_sql(pStmt);
15061         break;
15062       }
15063 #ifdef SQLITE_ENABLE_NORMALIZE
15064       case SHELL_TRACE_NORMALIZED: {
15065         zSql = sqlite3_normalized_sql(pStmt);
15066         break;
15067       }
15068 #endif
15069       default: {
15070         zSql = sqlite3_sql(pStmt);
15071         break;
15072       }
15073     }
15074   }
15075   if( zSql==0 ) return 0;
15076   nSql = strlen30(zSql);
15077   while( nSql>0 && zSql[nSql-1]==';' ){ nSql--; }
15078   switch( mType ){
15079     case SQLITE_TRACE_ROW:
15080     case SQLITE_TRACE_STMT: {
15081       utf8_printf(p->traceOut, "%.*s;\n", nSql, zSql);
15082       break;
15083     }
15084     case SQLITE_TRACE_PROFILE: {
15085       sqlite3_int64 nNanosec = *(sqlite3_int64*)pX;
15086       utf8_printf(p->traceOut, "%.*s; -- %lld ns\n", nSql, zSql, nNanosec);
15087       break;
15088     }
15089   }
15090   return 0;
15091 }
15092 #endif
15093 
15094 /*
15095 ** A no-op routine that runs with the ".breakpoint" doc-command.  This is
15096 ** a useful spot to set a debugger breakpoint.
15097 */
15098 static void test_breakpoint(void){
15099   static int nCall = 0;
15100   nCall++;
15101 }
15102 
15103 /*
15104 ** An object used to read a CSV and other files for import.
15105 */
15106 typedef struct ImportCtx ImportCtx;
15107 struct ImportCtx {
15108   const char *zFile;  /* Name of the input file */
15109   FILE *in;           /* Read the CSV text from this input stream */
15110   int (SQLITE_CDECL *xCloser)(FILE*);      /* Func to close in */
15111   char *z;            /* Accumulated text for a field */
15112   int n;              /* Number of bytes in z */
15113   int nAlloc;         /* Space allocated for z[] */
15114   int nLine;          /* Current line number */
15115   int nRow;           /* Number of rows imported */
15116   int nErr;           /* Number of errors encountered */
15117   int bNotFirst;      /* True if one or more bytes already read */
15118   int cTerm;          /* Character that terminated the most recent field */
15119   int cColSep;        /* The column separator character.  (Usually ",") */
15120   int cRowSep;        /* The row separator character.  (Usually "\n") */
15121 };
15122 
15123 /* Clean up resourced used by an ImportCtx */
15124 static void import_cleanup(ImportCtx *p){
15125   if( p->in!=0 && p->xCloser!=0 ){
15126     p->xCloser(p->in);
15127     p->in = 0;
15128   }
15129   sqlite3_free(p->z);
15130   p->z = 0;
15131 }
15132 
15133 /* Append a single byte to z[] */
15134 static void import_append_char(ImportCtx *p, int c){
15135   if( p->n+1>=p->nAlloc ){
15136     p->nAlloc += p->nAlloc + 100;
15137     p->z = sqlite3_realloc64(p->z, p->nAlloc);
15138     if( p->z==0 ) shell_out_of_memory();
15139   }
15140   p->z[p->n++] = (char)c;
15141 }
15142 
15143 /* Read a single field of CSV text.  Compatible with rfc4180 and extended
15144 ** with the option of having a separator other than ",".
15145 **
15146 **   +  Input comes from p->in.
15147 **   +  Store results in p->z of length p->n.  Space to hold p->z comes
15148 **      from sqlite3_malloc64().
15149 **   +  Use p->cSep as the column separator.  The default is ",".
15150 **   +  Use p->rSep as the row separator.  The default is "\n".
15151 **   +  Keep track of the line number in p->nLine.
15152 **   +  Store the character that terminates the field in p->cTerm.  Store
15153 **      EOF on end-of-file.
15154 **   +  Report syntax errors on stderr
15155 */
15156 static char *SQLITE_CDECL csv_read_one_field(ImportCtx *p){
15157   int c;
15158   int cSep = p->cColSep;
15159   int rSep = p->cRowSep;
15160   p->n = 0;
15161   c = fgetc(p->in);
15162   if( c==EOF || seenInterrupt ){
15163     p->cTerm = EOF;
15164     return 0;
15165   }
15166   if( c=='"' ){
15167     int pc, ppc;
15168     int startLine = p->nLine;
15169     int cQuote = c;
15170     pc = ppc = 0;
15171     while( 1 ){
15172       c = fgetc(p->in);
15173       if( c==rSep ) p->nLine++;
15174       if( c==cQuote ){
15175         if( pc==cQuote ){
15176           pc = 0;
15177           continue;
15178         }
15179       }
15180       if( (c==cSep && pc==cQuote)
15181        || (c==rSep && pc==cQuote)
15182        || (c==rSep && pc=='\r' && ppc==cQuote)
15183        || (c==EOF && pc==cQuote)
15184       ){
15185         do{ p->n--; }while( p->z[p->n]!=cQuote );
15186         p->cTerm = c;
15187         break;
15188       }
15189       if( pc==cQuote && c!='\r' ){
15190         utf8_printf(stderr, "%s:%d: unescaped %c character\n",
15191                 p->zFile, p->nLine, cQuote);
15192       }
15193       if( c==EOF ){
15194         utf8_printf(stderr, "%s:%d: unterminated %c-quoted field\n",
15195                 p->zFile, startLine, cQuote);
15196         p->cTerm = c;
15197         break;
15198       }
15199       import_append_char(p, c);
15200       ppc = pc;
15201       pc = c;
15202     }
15203   }else{
15204     /* If this is the first field being parsed and it begins with the
15205     ** UTF-8 BOM  (0xEF BB BF) then skip the BOM */
15206     if( (c&0xff)==0xef && p->bNotFirst==0 ){
15207       import_append_char(p, c);
15208       c = fgetc(p->in);
15209       if( (c&0xff)==0xbb ){
15210         import_append_char(p, c);
15211         c = fgetc(p->in);
15212         if( (c&0xff)==0xbf ){
15213           p->bNotFirst = 1;
15214           p->n = 0;
15215           return csv_read_one_field(p);
15216         }
15217       }
15218     }
15219     while( c!=EOF && c!=cSep && c!=rSep ){
15220       import_append_char(p, c);
15221       c = fgetc(p->in);
15222     }
15223     if( c==rSep ){
15224       p->nLine++;
15225       if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
15226     }
15227     p->cTerm = c;
15228   }
15229   if( p->z ) p->z[p->n] = 0;
15230   p->bNotFirst = 1;
15231   return p->z;
15232 }
15233 
15234 /* Read a single field of ASCII delimited text.
15235 **
15236 **   +  Input comes from p->in.
15237 **   +  Store results in p->z of length p->n.  Space to hold p->z comes
15238 **      from sqlite3_malloc64().
15239 **   +  Use p->cSep as the column separator.  The default is "\x1F".
15240 **   +  Use p->rSep as the row separator.  The default is "\x1E".
15241 **   +  Keep track of the row number in p->nLine.
15242 **   +  Store the character that terminates the field in p->cTerm.  Store
15243 **      EOF on end-of-file.
15244 **   +  Report syntax errors on stderr
15245 */
15246 static char *SQLITE_CDECL ascii_read_one_field(ImportCtx *p){
15247   int c;
15248   int cSep = p->cColSep;
15249   int rSep = p->cRowSep;
15250   p->n = 0;
15251   c = fgetc(p->in);
15252   if( c==EOF || seenInterrupt ){
15253     p->cTerm = EOF;
15254     return 0;
15255   }
15256   while( c!=EOF && c!=cSep && c!=rSep ){
15257     import_append_char(p, c);
15258     c = fgetc(p->in);
15259   }
15260   if( c==rSep ){
15261     p->nLine++;
15262   }
15263   p->cTerm = c;
15264   if( p->z ) p->z[p->n] = 0;
15265   return p->z;
15266 }
15267 
15268 /*
15269 ** Try to transfer data for table zTable.  If an error is seen while
15270 ** moving forward, try to go backwards.  The backwards movement won't
15271 ** work for WITHOUT ROWID tables.
15272 */
15273 static void tryToCloneData(
15274   ShellState *p,
15275   sqlite3 *newDb,
15276   const char *zTable
15277 ){
15278   sqlite3_stmt *pQuery = 0;
15279   sqlite3_stmt *pInsert = 0;
15280   char *zQuery = 0;
15281   char *zInsert = 0;
15282   int rc;
15283   int i, j, n;
15284   int nTable = strlen30(zTable);
15285   int k = 0;
15286   int cnt = 0;
15287   const int spinRate = 10000;
15288 
15289   zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
15290   rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
15291   if( rc ){
15292     utf8_printf(stderr, "Error %d: %s on [%s]\n",
15293             sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
15294             zQuery);
15295     goto end_data_xfer;
15296   }
15297   n = sqlite3_column_count(pQuery);
15298   zInsert = sqlite3_malloc64(200 + nTable + n*3);
15299   if( zInsert==0 ) shell_out_of_memory();
15300   sqlite3_snprintf(200+nTable,zInsert,
15301                    "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
15302   i = strlen30(zInsert);
15303   for(j=1; j<n; j++){
15304     memcpy(zInsert+i, ",?", 2);
15305     i += 2;
15306   }
15307   memcpy(zInsert+i, ");", 3);
15308   rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
15309   if( rc ){
15310     utf8_printf(stderr, "Error %d: %s on [%s]\n",
15311             sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
15312             zQuery);
15313     goto end_data_xfer;
15314   }
15315   for(k=0; k<2; k++){
15316     while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
15317       for(i=0; i<n; i++){
15318         switch( sqlite3_column_type(pQuery, i) ){
15319           case SQLITE_NULL: {
15320             sqlite3_bind_null(pInsert, i+1);
15321             break;
15322           }
15323           case SQLITE_INTEGER: {
15324             sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
15325             break;
15326           }
15327           case SQLITE_FLOAT: {
15328             sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
15329             break;
15330           }
15331           case SQLITE_TEXT: {
15332             sqlite3_bind_text(pInsert, i+1,
15333                              (const char*)sqlite3_column_text(pQuery,i),
15334                              -1, SQLITE_STATIC);
15335             break;
15336           }
15337           case SQLITE_BLOB: {
15338             sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
15339                                             sqlite3_column_bytes(pQuery,i),
15340                                             SQLITE_STATIC);
15341             break;
15342           }
15343         }
15344       } /* End for */
15345       rc = sqlite3_step(pInsert);
15346       if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
15347         utf8_printf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
15348                         sqlite3_errmsg(newDb));
15349       }
15350       sqlite3_reset(pInsert);
15351       cnt++;
15352       if( (cnt%spinRate)==0 ){
15353         printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
15354         fflush(stdout);
15355       }
15356     } /* End while */
15357     if( rc==SQLITE_DONE ) break;
15358     sqlite3_finalize(pQuery);
15359     sqlite3_free(zQuery);
15360     zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
15361                              zTable);
15362     rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
15363     if( rc ){
15364       utf8_printf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
15365       break;
15366     }
15367   } /* End for(k=0...) */
15368 
15369 end_data_xfer:
15370   sqlite3_finalize(pQuery);
15371   sqlite3_finalize(pInsert);
15372   sqlite3_free(zQuery);
15373   sqlite3_free(zInsert);
15374 }
15375 
15376 
15377 /*
15378 ** Try to transfer all rows of the schema that match zWhere.  For
15379 ** each row, invoke xForEach() on the object defined by that row.
15380 ** If an error is encountered while moving forward through the
15381 ** sqlite_schema table, try again moving backwards.
15382 */
15383 static void tryToCloneSchema(
15384   ShellState *p,
15385   sqlite3 *newDb,
15386   const char *zWhere,
15387   void (*xForEach)(ShellState*,sqlite3*,const char*)
15388 ){
15389   sqlite3_stmt *pQuery = 0;
15390   char *zQuery = 0;
15391   int rc;
15392   const unsigned char *zName;
15393   const unsigned char *zSql;
15394   char *zErrMsg = 0;
15395 
15396   zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_schema"
15397                            " WHERE %s", zWhere);
15398   rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
15399   if( rc ){
15400     utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
15401                     sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
15402                     zQuery);
15403     goto end_schema_xfer;
15404   }
15405   while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
15406     zName = sqlite3_column_text(pQuery, 0);
15407     zSql = sqlite3_column_text(pQuery, 1);
15408     printf("%s... ", zName); fflush(stdout);
15409     sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
15410     if( zErrMsg ){
15411       utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
15412       sqlite3_free(zErrMsg);
15413       zErrMsg = 0;
15414     }
15415     if( xForEach ){
15416       xForEach(p, newDb, (const char*)zName);
15417     }
15418     printf("done\n");
15419   }
15420   if( rc!=SQLITE_DONE ){
15421     sqlite3_finalize(pQuery);
15422     sqlite3_free(zQuery);
15423     zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_schema"
15424                              " WHERE %s ORDER BY rowid DESC", zWhere);
15425     rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
15426     if( rc ){
15427       utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
15428                       sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
15429                       zQuery);
15430       goto end_schema_xfer;
15431     }
15432     while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
15433       zName = sqlite3_column_text(pQuery, 0);
15434       zSql = sqlite3_column_text(pQuery, 1);
15435       printf("%s... ", zName); fflush(stdout);
15436       sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
15437       if( zErrMsg ){
15438         utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
15439         sqlite3_free(zErrMsg);
15440         zErrMsg = 0;
15441       }
15442       if( xForEach ){
15443         xForEach(p, newDb, (const char*)zName);
15444       }
15445       printf("done\n");
15446     }
15447   }
15448 end_schema_xfer:
15449   sqlite3_finalize(pQuery);
15450   sqlite3_free(zQuery);
15451 }
15452 
15453 /*
15454 ** Open a new database file named "zNewDb".  Try to recover as much information
15455 ** as possible out of the main database (which might be corrupt) and write it
15456 ** into zNewDb.
15457 */
15458 static void tryToClone(ShellState *p, const char *zNewDb){
15459   int rc;
15460   sqlite3 *newDb = 0;
15461   if( access(zNewDb,0)==0 ){
15462     utf8_printf(stderr, "File \"%s\" already exists.\n", zNewDb);
15463     return;
15464   }
15465   rc = sqlite3_open(zNewDb, &newDb);
15466   if( rc ){
15467     utf8_printf(stderr, "Cannot create output database: %s\n",
15468             sqlite3_errmsg(newDb));
15469   }else{
15470     sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0);
15471     sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
15472     tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
15473     tryToCloneSchema(p, newDb, "type!='table'", 0);
15474     sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
15475     sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
15476   }
15477   close_db(newDb);
15478 }
15479 
15480 /*
15481 ** Change the output file back to stdout.
15482 **
15483 ** If the p->doXdgOpen flag is set, that means the output was being
15484 ** redirected to a temporary file named by p->zTempFile.  In that case,
15485 ** launch start/open/xdg-open on that temporary file.
15486 */
15487 static void output_reset(ShellState *p){
15488   if( p->outfile[0]=='|' ){
15489 #ifndef SQLITE_OMIT_POPEN
15490     pclose(p->out);
15491 #endif
15492   }else{
15493     output_file_close(p->out);
15494 #ifndef SQLITE_NOHAVE_SYSTEM
15495     if( p->doXdgOpen ){
15496       const char *zXdgOpenCmd =
15497 #if defined(_WIN32)
15498       "start";
15499 #elif defined(__APPLE__)
15500       "open";
15501 #else
15502       "xdg-open";
15503 #endif
15504       char *zCmd;
15505       zCmd = sqlite3_mprintf("%s %s", zXdgOpenCmd, p->zTempFile);
15506       if( system(zCmd) ){
15507         utf8_printf(stderr, "Failed: [%s]\n", zCmd);
15508       }else{
15509         /* Give the start/open/xdg-open command some time to get
15510         ** going before we continue, and potential delete the
15511         ** p->zTempFile data file out from under it */
15512         sqlite3_sleep(2000);
15513       }
15514       sqlite3_free(zCmd);
15515       outputModePop(p);
15516       p->doXdgOpen = 0;
15517     }
15518 #endif /* !defined(SQLITE_NOHAVE_SYSTEM) */
15519   }
15520   p->outfile[0] = 0;
15521   p->out = stdout;
15522 }
15523 
15524 /*
15525 ** Run an SQL command and return the single integer result.
15526 */
15527 static int db_int(ShellState *p, const char *zSql){
15528   sqlite3_stmt *pStmt;
15529   int res = 0;
15530   sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
15531   if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){
15532     res = sqlite3_column_int(pStmt,0);
15533   }
15534   sqlite3_finalize(pStmt);
15535   return res;
15536 }
15537 
15538 /*
15539 ** Convert a 2-byte or 4-byte big-endian integer into a native integer
15540 */
15541 static unsigned int get2byteInt(unsigned char *a){
15542   return (a[0]<<8) + a[1];
15543 }
15544 static unsigned int get4byteInt(unsigned char *a){
15545   return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3];
15546 }
15547 
15548 /*
15549 ** Implementation of the ".dbinfo" command.
15550 **
15551 ** Return 1 on error, 2 to exit, and 0 otherwise.
15552 */
15553 static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){
15554   static const struct { const char *zName; int ofst; } aField[] = {
15555      { "file change counter:",  24  },
15556      { "database page count:",  28  },
15557      { "freelist page count:",  36  },
15558      { "schema cookie:",        40  },
15559      { "schema format:",        44  },
15560      { "default cache size:",   48  },
15561      { "autovacuum top root:",  52  },
15562      { "incremental vacuum:",   64  },
15563      { "text encoding:",        56  },
15564      { "user version:",         60  },
15565      { "application id:",       68  },
15566      { "software version:",     96  },
15567   };
15568   static const struct { const char *zName; const char *zSql; } aQuery[] = {
15569      { "number of tables:",
15570        "SELECT count(*) FROM %s WHERE type='table'" },
15571      { "number of indexes:",
15572        "SELECT count(*) FROM %s WHERE type='index'" },
15573      { "number of triggers:",
15574        "SELECT count(*) FROM %s WHERE type='trigger'" },
15575      { "number of views:",
15576        "SELECT count(*) FROM %s WHERE type='view'" },
15577      { "schema size:",
15578        "SELECT total(length(sql)) FROM %s" },
15579   };
15580   int i, rc;
15581   unsigned iDataVersion;
15582   char *zSchemaTab;
15583   char *zDb = nArg>=2 ? azArg[1] : "main";
15584   sqlite3_stmt *pStmt = 0;
15585   unsigned char aHdr[100];
15586   open_db(p, 0);
15587   if( p->db==0 ) return 1;
15588   rc = sqlite3_prepare_v2(p->db,
15589              "SELECT data FROM sqlite_dbpage(?1) WHERE pgno=1",
15590              -1, &pStmt, 0);
15591   if( rc ){
15592     utf8_printf(stderr, "error: %s\n", sqlite3_errmsg(p->db));
15593     sqlite3_finalize(pStmt);
15594     return 1;
15595   }
15596   sqlite3_bind_text(pStmt, 1, zDb, -1, SQLITE_STATIC);
15597   if( sqlite3_step(pStmt)==SQLITE_ROW
15598    && sqlite3_column_bytes(pStmt,0)>100
15599   ){
15600     memcpy(aHdr, sqlite3_column_blob(pStmt,0), 100);
15601     sqlite3_finalize(pStmt);
15602   }else{
15603     raw_printf(stderr, "unable to read database header\n");
15604     sqlite3_finalize(pStmt);
15605     return 1;
15606   }
15607   i = get2byteInt(aHdr+16);
15608   if( i==1 ) i = 65536;
15609   utf8_printf(p->out, "%-20s %d\n", "database page size:", i);
15610   utf8_printf(p->out, "%-20s %d\n", "write format:", aHdr[18]);
15611   utf8_printf(p->out, "%-20s %d\n", "read format:", aHdr[19]);
15612   utf8_printf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]);
15613   for(i=0; i<ArraySize(aField); i++){
15614     int ofst = aField[i].ofst;
15615     unsigned int val = get4byteInt(aHdr + ofst);
15616     utf8_printf(p->out, "%-20s %u", aField[i].zName, val);
15617     switch( ofst ){
15618       case 56: {
15619         if( val==1 ) raw_printf(p->out, " (utf8)");
15620         if( val==2 ) raw_printf(p->out, " (utf16le)");
15621         if( val==3 ) raw_printf(p->out, " (utf16be)");
15622       }
15623     }
15624     raw_printf(p->out, "\n");
15625   }
15626   if( zDb==0 ){
15627     zSchemaTab = sqlite3_mprintf("main.sqlite_schema");
15628   }else if( strcmp(zDb,"temp")==0 ){
15629     zSchemaTab = sqlite3_mprintf("%s", "sqlite_temp_schema");
15630   }else{
15631     zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_schema", zDb);
15632   }
15633   for(i=0; i<ArraySize(aQuery); i++){
15634     char *zSql = sqlite3_mprintf(aQuery[i].zSql, zSchemaTab);
15635     int val = db_int(p, zSql);
15636     sqlite3_free(zSql);
15637     utf8_printf(p->out, "%-20s %d\n", aQuery[i].zName, val);
15638   }
15639   sqlite3_free(zSchemaTab);
15640   sqlite3_file_control(p->db, zDb, SQLITE_FCNTL_DATA_VERSION, &iDataVersion);
15641   utf8_printf(p->out, "%-20s %u\n", "data version", iDataVersion);
15642   return 0;
15643 }
15644 
15645 /*
15646 ** Print the current sqlite3_errmsg() value to stderr and return 1.
15647 */
15648 static int shellDatabaseError(sqlite3 *db){
15649   const char *zErr = sqlite3_errmsg(db);
15650   utf8_printf(stderr, "Error: %s\n", zErr);
15651   return 1;
15652 }
15653 
15654 /*
15655 ** Compare the pattern in zGlob[] against the text in z[].  Return TRUE
15656 ** if they match and FALSE (0) if they do not match.
15657 **
15658 ** Globbing rules:
15659 **
15660 **      '*'       Matches any sequence of zero or more characters.
15661 **
15662 **      '?'       Matches exactly one character.
15663 **
15664 **     [...]      Matches one character from the enclosed list of
15665 **                characters.
15666 **
15667 **     [^...]     Matches one character not in the enclosed list.
15668 **
15669 **      '#'       Matches any sequence of one or more digits with an
15670 **                optional + or - sign in front
15671 **
15672 **      ' '       Any span of whitespace matches any other span of
15673 **                whitespace.
15674 **
15675 ** Extra whitespace at the end of z[] is ignored.
15676 */
15677 static int testcase_glob(const char *zGlob, const char *z){
15678   int c, c2;
15679   int invert;
15680   int seen;
15681 
15682   while( (c = (*(zGlob++)))!=0 ){
15683     if( IsSpace(c) ){
15684       if( !IsSpace(*z) ) return 0;
15685       while( IsSpace(*zGlob) ) zGlob++;
15686       while( IsSpace(*z) ) z++;
15687     }else if( c=='*' ){
15688       while( (c=(*(zGlob++))) == '*' || c=='?' ){
15689         if( c=='?' && (*(z++))==0 ) return 0;
15690       }
15691       if( c==0 ){
15692         return 1;
15693       }else if( c=='[' ){
15694         while( *z && testcase_glob(zGlob-1,z)==0 ){
15695           z++;
15696         }
15697         return (*z)!=0;
15698       }
15699       while( (c2 = (*(z++)))!=0 ){
15700         while( c2!=c ){
15701           c2 = *(z++);
15702           if( c2==0 ) return 0;
15703         }
15704         if( testcase_glob(zGlob,z) ) return 1;
15705       }
15706       return 0;
15707     }else if( c=='?' ){
15708       if( (*(z++))==0 ) return 0;
15709     }else if( c=='[' ){
15710       int prior_c = 0;
15711       seen = 0;
15712       invert = 0;
15713       c = *(z++);
15714       if( c==0 ) return 0;
15715       c2 = *(zGlob++);
15716       if( c2=='^' ){
15717         invert = 1;
15718         c2 = *(zGlob++);
15719       }
15720       if( c2==']' ){
15721         if( c==']' ) seen = 1;
15722         c2 = *(zGlob++);
15723       }
15724       while( c2 && c2!=']' ){
15725         if( c2=='-' && zGlob[0]!=']' && zGlob[0]!=0 && prior_c>0 ){
15726           c2 = *(zGlob++);
15727           if( c>=prior_c && c<=c2 ) seen = 1;
15728           prior_c = 0;
15729         }else{
15730           if( c==c2 ){
15731             seen = 1;
15732           }
15733           prior_c = c2;
15734         }
15735         c2 = *(zGlob++);
15736       }
15737       if( c2==0 || (seen ^ invert)==0 ) return 0;
15738     }else if( c=='#' ){
15739       if( (z[0]=='-' || z[0]=='+') && IsDigit(z[1]) ) z++;
15740       if( !IsDigit(z[0]) ) return 0;
15741       z++;
15742       while( IsDigit(z[0]) ){ z++; }
15743     }else{
15744       if( c!=(*(z++)) ) return 0;
15745     }
15746   }
15747   while( IsSpace(*z) ){ z++; }
15748   return *z==0;
15749 }
15750 
15751 
15752 /*
15753 ** Compare the string as a command-line option with either one or two
15754 ** initial "-" characters.
15755 */
15756 static int optionMatch(const char *zStr, const char *zOpt){
15757   if( zStr[0]!='-' ) return 0;
15758   zStr++;
15759   if( zStr[0]=='-' ) zStr++;
15760   return strcmp(zStr, zOpt)==0;
15761 }
15762 
15763 /*
15764 ** Delete a file.
15765 */
15766 int shellDeleteFile(const char *zFilename){
15767   int rc;
15768 #ifdef _WIN32
15769   wchar_t *z = sqlite3_win32_utf8_to_unicode(zFilename);
15770   rc = _wunlink(z);
15771   sqlite3_free(z);
15772 #else
15773   rc = unlink(zFilename);
15774 #endif
15775   return rc;
15776 }
15777 
15778 /*
15779 ** Try to delete the temporary file (if there is one) and free the
15780 ** memory used to hold the name of the temp file.
15781 */
15782 static void clearTempFile(ShellState *p){
15783   if( p->zTempFile==0 ) return;
15784   if( p->doXdgOpen ) return;
15785   if( shellDeleteFile(p->zTempFile) ) return;
15786   sqlite3_free(p->zTempFile);
15787   p->zTempFile = 0;
15788 }
15789 
15790 /*
15791 ** Create a new temp file name with the given suffix.
15792 */
15793 static void newTempFile(ShellState *p, const char *zSuffix){
15794   clearTempFile(p);
15795   sqlite3_free(p->zTempFile);
15796   p->zTempFile = 0;
15797   if( p->db ){
15798     sqlite3_file_control(p->db, 0, SQLITE_FCNTL_TEMPFILENAME, &p->zTempFile);
15799   }
15800   if( p->zTempFile==0 ){
15801     /* If p->db is an in-memory database then the TEMPFILENAME file-control
15802     ** will not work and we will need to fallback to guessing */
15803     char *zTemp;
15804     sqlite3_uint64 r;
15805     sqlite3_randomness(sizeof(r), &r);
15806     zTemp = getenv("TEMP");
15807     if( zTemp==0 ) zTemp = getenv("TMP");
15808     if( zTemp==0 ){
15809 #ifdef _WIN32
15810       zTemp = "\\tmp";
15811 #else
15812       zTemp = "/tmp";
15813 #endif
15814     }
15815     p->zTempFile = sqlite3_mprintf("%s/temp%llx.%s", zTemp, r, zSuffix);
15816   }else{
15817     p->zTempFile = sqlite3_mprintf("%z.%s", p->zTempFile, zSuffix);
15818   }
15819   if( p->zTempFile==0 ){
15820     raw_printf(stderr, "out of memory\n");
15821     exit(1);
15822   }
15823 }
15824 
15825 
15826 /*
15827 ** The implementation of SQL scalar function fkey_collate_clause(), used
15828 ** by the ".lint fkey-indexes" command. This scalar function is always
15829 ** called with four arguments - the parent table name, the parent column name,
15830 ** the child table name and the child column name.
15831 **
15832 **   fkey_collate_clause('parent-tab', 'parent-col', 'child-tab', 'child-col')
15833 **
15834 ** If either of the named tables or columns do not exist, this function
15835 ** returns an empty string. An empty string is also returned if both tables
15836 ** and columns exist but have the same default collation sequence. Or,
15837 ** if both exist but the default collation sequences are different, this
15838 ** function returns the string " COLLATE <parent-collation>", where
15839 ** <parent-collation> is the default collation sequence of the parent column.
15840 */
15841 static void shellFkeyCollateClause(
15842   sqlite3_context *pCtx,
15843   int nVal,
15844   sqlite3_value **apVal
15845 ){
15846   sqlite3 *db = sqlite3_context_db_handle(pCtx);
15847   const char *zParent;
15848   const char *zParentCol;
15849   const char *zParentSeq;
15850   const char *zChild;
15851   const char *zChildCol;
15852   const char *zChildSeq = 0;  /* Initialize to avoid false-positive warning */
15853   int rc;
15854 
15855   assert( nVal==4 );
15856   zParent = (const char*)sqlite3_value_text(apVal[0]);
15857   zParentCol = (const char*)sqlite3_value_text(apVal[1]);
15858   zChild = (const char*)sqlite3_value_text(apVal[2]);
15859   zChildCol = (const char*)sqlite3_value_text(apVal[3]);
15860 
15861   sqlite3_result_text(pCtx, "", -1, SQLITE_STATIC);
15862   rc = sqlite3_table_column_metadata(
15863       db, "main", zParent, zParentCol, 0, &zParentSeq, 0, 0, 0
15864   );
15865   if( rc==SQLITE_OK ){
15866     rc = sqlite3_table_column_metadata(
15867         db, "main", zChild, zChildCol, 0, &zChildSeq, 0, 0, 0
15868     );
15869   }
15870 
15871   if( rc==SQLITE_OK && sqlite3_stricmp(zParentSeq, zChildSeq) ){
15872     char *z = sqlite3_mprintf(" COLLATE %s", zParentSeq);
15873     sqlite3_result_text(pCtx, z, -1, SQLITE_TRANSIENT);
15874     sqlite3_free(z);
15875   }
15876 }
15877 
15878 
15879 /*
15880 ** The implementation of dot-command ".lint fkey-indexes".
15881 */
15882 static int lintFkeyIndexes(
15883   ShellState *pState,             /* Current shell tool state */
15884   char **azArg,                   /* Array of arguments passed to dot command */
15885   int nArg                        /* Number of entries in azArg[] */
15886 ){
15887   sqlite3 *db = pState->db;       /* Database handle to query "main" db of */
15888   FILE *out = pState->out;        /* Stream to write non-error output to */
15889   int bVerbose = 0;               /* If -verbose is present */
15890   int bGroupByParent = 0;         /* If -groupbyparent is present */
15891   int i;                          /* To iterate through azArg[] */
15892   const char *zIndent = "";       /* How much to indent CREATE INDEX by */
15893   int rc;                         /* Return code */
15894   sqlite3_stmt *pSql = 0;         /* Compiled version of SQL statement below */
15895 
15896   /*
15897   ** This SELECT statement returns one row for each foreign key constraint
15898   ** in the schema of the main database. The column values are:
15899   **
15900   ** 0. The text of an SQL statement similar to:
15901   **
15902   **      "EXPLAIN QUERY PLAN SELECT 1 FROM child_table WHERE child_key=?"
15903   **
15904   **    This SELECT is similar to the one that the foreign keys implementation
15905   **    needs to run internally on child tables. If there is an index that can
15906   **    be used to optimize this query, then it can also be used by the FK
15907   **    implementation to optimize DELETE or UPDATE statements on the parent
15908   **    table.
15909   **
15910   ** 1. A GLOB pattern suitable for sqlite3_strglob(). If the plan output by
15911   **    the EXPLAIN QUERY PLAN command matches this pattern, then the schema
15912   **    contains an index that can be used to optimize the query.
15913   **
15914   ** 2. Human readable text that describes the child table and columns. e.g.
15915   **
15916   **       "child_table(child_key1, child_key2)"
15917   **
15918   ** 3. Human readable text that describes the parent table and columns. e.g.
15919   **
15920   **       "parent_table(parent_key1, parent_key2)"
15921   **
15922   ** 4. A full CREATE INDEX statement for an index that could be used to
15923   **    optimize DELETE or UPDATE statements on the parent table. e.g.
15924   **
15925   **       "CREATE INDEX child_table_child_key ON child_table(child_key)"
15926   **
15927   ** 5. The name of the parent table.
15928   **
15929   ** These six values are used by the C logic below to generate the report.
15930   */
15931   const char *zSql =
15932   "SELECT "
15933     "     'EXPLAIN QUERY PLAN SELECT 1 FROM ' || quote(s.name) || ' WHERE '"
15934     "  || group_concat(quote(s.name) || '.' || quote(f.[from]) || '=?' "
15935     "  || fkey_collate_clause("
15936     "       f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]),' AND ')"
15937     ", "
15938     "     'SEARCH TABLE ' || s.name || ' USING COVERING INDEX*('"
15939     "  || group_concat('*=?', ' AND ') || ')'"
15940     ", "
15941     "     s.name  || '(' || group_concat(f.[from],  ', ') || ')'"
15942     ", "
15943     "     f.[table] || '(' || group_concat(COALESCE(f.[to], p.[name])) || ')'"
15944     ", "
15945     "     'CREATE INDEX ' || quote(s.name ||'_'|| group_concat(f.[from], '_'))"
15946     "  || ' ON ' || quote(s.name) || '('"
15947     "  || group_concat(quote(f.[from]) ||"
15948     "        fkey_collate_clause("
15949     "          f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]), ', ')"
15950     "  || ');'"
15951     ", "
15952     "     f.[table] "
15953     "FROM sqlite_schema AS s, pragma_foreign_key_list(s.name) AS f "
15954     "LEFT JOIN pragma_table_info AS p ON (pk-1=seq AND p.arg=f.[table]) "
15955     "GROUP BY s.name, f.id "
15956     "ORDER BY (CASE WHEN ? THEN f.[table] ELSE s.name END)"
15957   ;
15958   const char *zGlobIPK = "SEARCH TABLE * USING INTEGER PRIMARY KEY (rowid=?)";
15959 
15960   for(i=2; i<nArg; i++){
15961     int n = strlen30(azArg[i]);
15962     if( n>1 && sqlite3_strnicmp("-verbose", azArg[i], n)==0 ){
15963       bVerbose = 1;
15964     }
15965     else if( n>1 && sqlite3_strnicmp("-groupbyparent", azArg[i], n)==0 ){
15966       bGroupByParent = 1;
15967       zIndent = "    ";
15968     }
15969     else{
15970       raw_printf(stderr, "Usage: %s %s ?-verbose? ?-groupbyparent?\n",
15971           azArg[0], azArg[1]
15972       );
15973       return SQLITE_ERROR;
15974     }
15975   }
15976 
15977   /* Register the fkey_collate_clause() SQL function */
15978   rc = sqlite3_create_function(db, "fkey_collate_clause", 4, SQLITE_UTF8,
15979       0, shellFkeyCollateClause, 0, 0
15980   );
15981 
15982 
15983   if( rc==SQLITE_OK ){
15984     rc = sqlite3_prepare_v2(db, zSql, -1, &pSql, 0);
15985   }
15986   if( rc==SQLITE_OK ){
15987     sqlite3_bind_int(pSql, 1, bGroupByParent);
15988   }
15989 
15990   if( rc==SQLITE_OK ){
15991     int rc2;
15992     char *zPrev = 0;
15993     while( SQLITE_ROW==sqlite3_step(pSql) ){
15994       int res = -1;
15995       sqlite3_stmt *pExplain = 0;
15996       const char *zEQP = (const char*)sqlite3_column_text(pSql, 0);
15997       const char *zGlob = (const char*)sqlite3_column_text(pSql, 1);
15998       const char *zFrom = (const char*)sqlite3_column_text(pSql, 2);
15999       const char *zTarget = (const char*)sqlite3_column_text(pSql, 3);
16000       const char *zCI = (const char*)sqlite3_column_text(pSql, 4);
16001       const char *zParent = (const char*)sqlite3_column_text(pSql, 5);
16002 
16003       rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
16004       if( rc!=SQLITE_OK ) break;
16005       if( SQLITE_ROW==sqlite3_step(pExplain) ){
16006         const char *zPlan = (const char*)sqlite3_column_text(pExplain, 3);
16007         res = (
16008               0==sqlite3_strglob(zGlob, zPlan)
16009            || 0==sqlite3_strglob(zGlobIPK, zPlan)
16010         );
16011       }
16012       rc = sqlite3_finalize(pExplain);
16013       if( rc!=SQLITE_OK ) break;
16014 
16015       if( res<0 ){
16016         raw_printf(stderr, "Error: internal error");
16017         break;
16018       }else{
16019         if( bGroupByParent
16020         && (bVerbose || res==0)
16021         && (zPrev==0 || sqlite3_stricmp(zParent, zPrev))
16022         ){
16023           raw_printf(out, "-- Parent table %s\n", zParent);
16024           sqlite3_free(zPrev);
16025           zPrev = sqlite3_mprintf("%s", zParent);
16026         }
16027 
16028         if( res==0 ){
16029           raw_printf(out, "%s%s --> %s\n", zIndent, zCI, zTarget);
16030         }else if( bVerbose ){
16031           raw_printf(out, "%s/* no extra indexes required for %s -> %s */\n",
16032               zIndent, zFrom, zTarget
16033           );
16034         }
16035       }
16036     }
16037     sqlite3_free(zPrev);
16038 
16039     if( rc!=SQLITE_OK ){
16040       raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
16041     }
16042 
16043     rc2 = sqlite3_finalize(pSql);
16044     if( rc==SQLITE_OK && rc2!=SQLITE_OK ){
16045       rc = rc2;
16046       raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
16047     }
16048   }else{
16049     raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
16050   }
16051 
16052   return rc;
16053 }
16054 
16055 /*
16056 ** Implementation of ".lint" dot command.
16057 */
16058 static int lintDotCommand(
16059   ShellState *pState,             /* Current shell tool state */
16060   char **azArg,                   /* Array of arguments passed to dot command */
16061   int nArg                        /* Number of entries in azArg[] */
16062 ){
16063   int n;
16064   n = (nArg>=2 ? strlen30(azArg[1]) : 0);
16065   if( n<1 || sqlite3_strnicmp(azArg[1], "fkey-indexes", n) ) goto usage;
16066   return lintFkeyIndexes(pState, azArg, nArg);
16067 
16068  usage:
16069   raw_printf(stderr, "Usage %s sub-command ?switches...?\n", azArg[0]);
16070   raw_printf(stderr, "Where sub-commands are:\n");
16071   raw_printf(stderr, "    fkey-indexes\n");
16072   return SQLITE_ERROR;
16073 }
16074 
16075 #if !defined SQLITE_OMIT_VIRTUALTABLE
16076 static void shellPrepare(
16077   sqlite3 *db,
16078   int *pRc,
16079   const char *zSql,
16080   sqlite3_stmt **ppStmt
16081 ){
16082   *ppStmt = 0;
16083   if( *pRc==SQLITE_OK ){
16084     int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0);
16085     if( rc!=SQLITE_OK ){
16086       raw_printf(stderr, "sql error: %s (%d)\n",
16087           sqlite3_errmsg(db), sqlite3_errcode(db)
16088       );
16089       *pRc = rc;
16090     }
16091   }
16092 }
16093 
16094 /*
16095 ** Create a prepared statement using printf-style arguments for the SQL.
16096 **
16097 ** This routine is could be marked "static".  But it is not always used,
16098 ** depending on compile-time options.  By omitting the "static", we avoid
16099 ** nuisance compiler warnings about "defined but not used".
16100 */
16101 void shellPreparePrintf(
16102   sqlite3 *db,
16103   int *pRc,
16104   sqlite3_stmt **ppStmt,
16105   const char *zFmt,
16106   ...
16107 ){
16108   *ppStmt = 0;
16109   if( *pRc==SQLITE_OK ){
16110     va_list ap;
16111     char *z;
16112     va_start(ap, zFmt);
16113     z = sqlite3_vmprintf(zFmt, ap);
16114     va_end(ap);
16115     if( z==0 ){
16116       *pRc = SQLITE_NOMEM;
16117     }else{
16118       shellPrepare(db, pRc, z, ppStmt);
16119       sqlite3_free(z);
16120     }
16121   }
16122 }
16123 
16124 /* Finalize the prepared statement created using shellPreparePrintf().
16125 **
16126 ** This routine is could be marked "static".  But it is not always used,
16127 ** depending on compile-time options.  By omitting the "static", we avoid
16128 ** nuisance compiler warnings about "defined but not used".
16129 */
16130 void shellFinalize(
16131   int *pRc,
16132   sqlite3_stmt *pStmt
16133 ){
16134   if( pStmt ){
16135     sqlite3 *db = sqlite3_db_handle(pStmt);
16136     int rc = sqlite3_finalize(pStmt);
16137     if( *pRc==SQLITE_OK ){
16138       if( rc!=SQLITE_OK ){
16139         raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));
16140       }
16141       *pRc = rc;
16142     }
16143   }
16144 }
16145 
16146 /* Reset the prepared statement created using shellPreparePrintf().
16147 **
16148 ** This routine is could be marked "static".  But it is not always used,
16149 ** depending on compile-time options.  By omitting the "static", we avoid
16150 ** nuisance compiler warnings about "defined but not used".
16151 */
16152 void shellReset(
16153   int *pRc,
16154   sqlite3_stmt *pStmt
16155 ){
16156   int rc = sqlite3_reset(pStmt);
16157   if( *pRc==SQLITE_OK ){
16158     if( rc!=SQLITE_OK ){
16159       sqlite3 *db = sqlite3_db_handle(pStmt);
16160       raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));
16161     }
16162     *pRc = rc;
16163   }
16164 }
16165 #endif /* !defined SQLITE_OMIT_VIRTUALTABLE */
16166 
16167 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
16168 /******************************************************************************
16169 ** The ".archive" or ".ar" command.
16170 */
16171 /*
16172 ** Structure representing a single ".ar" command.
16173 */
16174 typedef struct ArCommand ArCommand;
16175 struct ArCommand {
16176   u8 eCmd;                        /* An AR_CMD_* value */
16177   u8 bVerbose;                    /* True if --verbose */
16178   u8 bZip;                        /* True if the archive is a ZIP */
16179   u8 bDryRun;                     /* True if --dry-run */
16180   u8 bAppend;                     /* True if --append */
16181   u8 fromCmdLine;                 /* Run from -A instead of .archive */
16182   int nArg;                       /* Number of command arguments */
16183   char *zSrcTable;                /* "sqlar", "zipfile($file)" or "zip" */
16184   const char *zFile;              /* --file argument, or NULL */
16185   const char *zDir;               /* --directory argument, or NULL */
16186   char **azArg;                   /* Array of command arguments */
16187   ShellState *p;                  /* Shell state */
16188   sqlite3 *db;                    /* Database containing the archive */
16189 };
16190 
16191 /*
16192 ** Print a usage message for the .ar command to stderr and return SQLITE_ERROR.
16193 */
16194 static int arUsage(FILE *f){
16195   showHelp(f,"archive");
16196   return SQLITE_ERROR;
16197 }
16198 
16199 /*
16200 ** Print an error message for the .ar command to stderr and return
16201 ** SQLITE_ERROR.
16202 */
16203 static int arErrorMsg(ArCommand *pAr, const char *zFmt, ...){
16204   va_list ap;
16205   char *z;
16206   va_start(ap, zFmt);
16207   z = sqlite3_vmprintf(zFmt, ap);
16208   va_end(ap);
16209   utf8_printf(stderr, "Error: %s\n", z);
16210   if( pAr->fromCmdLine ){
16211     utf8_printf(stderr, "Use \"-A\" for more help\n");
16212   }else{
16213     utf8_printf(stderr, "Use \".archive --help\" for more help\n");
16214   }
16215   sqlite3_free(z);
16216   return SQLITE_ERROR;
16217 }
16218 
16219 /*
16220 ** Values for ArCommand.eCmd.
16221 */
16222 #define AR_CMD_CREATE       1
16223 #define AR_CMD_UPDATE       2
16224 #define AR_CMD_INSERT       3
16225 #define AR_CMD_EXTRACT      4
16226 #define AR_CMD_LIST         5
16227 #define AR_CMD_HELP         6
16228 
16229 /*
16230 ** Other (non-command) switches.
16231 */
16232 #define AR_SWITCH_VERBOSE     7
16233 #define AR_SWITCH_FILE        8
16234 #define AR_SWITCH_DIRECTORY   9
16235 #define AR_SWITCH_APPEND     10
16236 #define AR_SWITCH_DRYRUN     11
16237 
16238 static int arProcessSwitch(ArCommand *pAr, int eSwitch, const char *zArg){
16239   switch( eSwitch ){
16240     case AR_CMD_CREATE:
16241     case AR_CMD_EXTRACT:
16242     case AR_CMD_LIST:
16243     case AR_CMD_UPDATE:
16244     case AR_CMD_INSERT:
16245     case AR_CMD_HELP:
16246       if( pAr->eCmd ){
16247         return arErrorMsg(pAr, "multiple command options");
16248       }
16249       pAr->eCmd = eSwitch;
16250       break;
16251 
16252     case AR_SWITCH_DRYRUN:
16253       pAr->bDryRun = 1;
16254       break;
16255     case AR_SWITCH_VERBOSE:
16256       pAr->bVerbose = 1;
16257       break;
16258     case AR_SWITCH_APPEND:
16259       pAr->bAppend = 1;
16260       /* Fall thru into --file */
16261     case AR_SWITCH_FILE:
16262       pAr->zFile = zArg;
16263       break;
16264     case AR_SWITCH_DIRECTORY:
16265       pAr->zDir = zArg;
16266       break;
16267   }
16268 
16269   return SQLITE_OK;
16270 }
16271 
16272 /*
16273 ** Parse the command line for an ".ar" command. The results are written into
16274 ** structure (*pAr). SQLITE_OK is returned if the command line is parsed
16275 ** successfully, otherwise an error message is written to stderr and
16276 ** SQLITE_ERROR returned.
16277 */
16278 static int arParseCommand(
16279   char **azArg,                   /* Array of arguments passed to dot command */
16280   int nArg,                       /* Number of entries in azArg[] */
16281   ArCommand *pAr                  /* Populate this object */
16282 ){
16283   struct ArSwitch {
16284     const char *zLong;
16285     char cShort;
16286     u8 eSwitch;
16287     u8 bArg;
16288   } aSwitch[] = {
16289     { "create",    'c', AR_CMD_CREATE,       0 },
16290     { "extract",   'x', AR_CMD_EXTRACT,      0 },
16291     { "insert",    'i', AR_CMD_INSERT,       0 },
16292     { "list",      't', AR_CMD_LIST,         0 },
16293     { "update",    'u', AR_CMD_UPDATE,       0 },
16294     { "help",      'h', AR_CMD_HELP,         0 },
16295     { "verbose",   'v', AR_SWITCH_VERBOSE,   0 },
16296     { "file",      'f', AR_SWITCH_FILE,      1 },
16297     { "append",    'a', AR_SWITCH_APPEND,    1 },
16298     { "directory", 'C', AR_SWITCH_DIRECTORY, 1 },
16299     { "dryrun",    'n', AR_SWITCH_DRYRUN,    0 },
16300   };
16301   int nSwitch = sizeof(aSwitch) / sizeof(struct ArSwitch);
16302   struct ArSwitch *pEnd = &aSwitch[nSwitch];
16303 
16304   if( nArg<=1 ){
16305     utf8_printf(stderr, "Wrong number of arguments.  Usage:\n");
16306     return arUsage(stderr);
16307   }else{
16308     char *z = azArg[1];
16309     if( z[0]!='-' ){
16310       /* Traditional style [tar] invocation */
16311       int i;
16312       int iArg = 2;
16313       for(i=0; z[i]; i++){
16314         const char *zArg = 0;
16315         struct ArSwitch *pOpt;
16316         for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
16317           if( z[i]==pOpt->cShort ) break;
16318         }
16319         if( pOpt==pEnd ){
16320           return arErrorMsg(pAr, "unrecognized option: %c", z[i]);
16321         }
16322         if( pOpt->bArg ){
16323           if( iArg>=nArg ){
16324             return arErrorMsg(pAr, "option requires an argument: %c",z[i]);
16325           }
16326           zArg = azArg[iArg++];
16327         }
16328         if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR;
16329       }
16330       pAr->nArg = nArg-iArg;
16331       if( pAr->nArg>0 ){
16332         pAr->azArg = &azArg[iArg];
16333       }
16334     }else{
16335       /* Non-traditional invocation */
16336       int iArg;
16337       for(iArg=1; iArg<nArg; iArg++){
16338         int n;
16339         z = azArg[iArg];
16340         if( z[0]!='-' ){
16341           /* All remaining command line words are command arguments. */
16342           pAr->azArg = &azArg[iArg];
16343           pAr->nArg = nArg-iArg;
16344           break;
16345         }
16346         n = strlen30(z);
16347 
16348         if( z[1]!='-' ){
16349           int i;
16350           /* One or more short options */
16351           for(i=1; i<n; i++){
16352             const char *zArg = 0;
16353             struct ArSwitch *pOpt;
16354             for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
16355               if( z[i]==pOpt->cShort ) break;
16356             }
16357             if( pOpt==pEnd ){
16358               return arErrorMsg(pAr, "unrecognized option: %c", z[i]);
16359             }
16360             if( pOpt->bArg ){
16361               if( i<(n-1) ){
16362                 zArg = &z[i+1];
16363                 i = n;
16364               }else{
16365                 if( iArg>=(nArg-1) ){
16366                   return arErrorMsg(pAr, "option requires an argument: %c",
16367                                     z[i]);
16368                 }
16369                 zArg = azArg[++iArg];
16370               }
16371             }
16372             if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR;
16373           }
16374         }else if( z[2]=='\0' ){
16375           /* A -- option, indicating that all remaining command line words
16376           ** are command arguments.  */
16377           pAr->azArg = &azArg[iArg+1];
16378           pAr->nArg = nArg-iArg-1;
16379           break;
16380         }else{
16381           /* A long option */
16382           const char *zArg = 0;             /* Argument for option, if any */
16383           struct ArSwitch *pMatch = 0;      /* Matching option */
16384           struct ArSwitch *pOpt;            /* Iterator */
16385           for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
16386             const char *zLong = pOpt->zLong;
16387             if( (n-2)<=strlen30(zLong) && 0==memcmp(&z[2], zLong, n-2) ){
16388               if( pMatch ){
16389                 return arErrorMsg(pAr, "ambiguous option: %s",z);
16390               }else{
16391                 pMatch = pOpt;
16392               }
16393             }
16394           }
16395 
16396           if( pMatch==0 ){
16397             return arErrorMsg(pAr, "unrecognized option: %s", z);
16398           }
16399           if( pMatch->bArg ){
16400             if( iArg>=(nArg-1) ){
16401               return arErrorMsg(pAr, "option requires an argument: %s", z);
16402             }
16403             zArg = azArg[++iArg];
16404           }
16405           if( arProcessSwitch(pAr, pMatch->eSwitch, zArg) ) return SQLITE_ERROR;
16406         }
16407       }
16408     }
16409   }
16410 
16411   return SQLITE_OK;
16412 }
16413 
16414 /*
16415 ** This function assumes that all arguments within the ArCommand.azArg[]
16416 ** array refer to archive members, as for the --extract or --list commands.
16417 ** It checks that each of them are present. If any specified file is not
16418 ** present in the archive, an error is printed to stderr and an error
16419 ** code returned. Otherwise, if all specified arguments are present in
16420 ** the archive, SQLITE_OK is returned.
16421 **
16422 ** This function strips any trailing '/' characters from each argument.
16423 ** This is consistent with the way the [tar] command seems to work on
16424 ** Linux.
16425 */
16426 static int arCheckEntries(ArCommand *pAr){
16427   int rc = SQLITE_OK;
16428   if( pAr->nArg ){
16429     int i, j;
16430     sqlite3_stmt *pTest = 0;
16431 
16432     shellPreparePrintf(pAr->db, &rc, &pTest,
16433         "SELECT name FROM %s WHERE name=$name",
16434         pAr->zSrcTable
16435     );
16436     j = sqlite3_bind_parameter_index(pTest, "$name");
16437     for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){
16438       char *z = pAr->azArg[i];
16439       int n = strlen30(z);
16440       int bOk = 0;
16441       while( n>0 && z[n-1]=='/' ) n--;
16442       z[n] = '\0';
16443       sqlite3_bind_text(pTest, j, z, -1, SQLITE_STATIC);
16444       if( SQLITE_ROW==sqlite3_step(pTest) ){
16445         bOk = 1;
16446       }
16447       shellReset(&rc, pTest);
16448       if( rc==SQLITE_OK && bOk==0 ){
16449         utf8_printf(stderr, "not found in archive: %s\n", z);
16450         rc = SQLITE_ERROR;
16451       }
16452     }
16453     shellFinalize(&rc, pTest);
16454   }
16455   return rc;
16456 }
16457 
16458 /*
16459 ** Format a WHERE clause that can be used against the "sqlar" table to
16460 ** identify all archive members that match the command arguments held
16461 ** in (*pAr). Leave this WHERE clause in (*pzWhere) before returning.
16462 ** The caller is responsible for eventually calling sqlite3_free() on
16463 ** any non-NULL (*pzWhere) value.
16464 */
16465 static void arWhereClause(
16466   int *pRc,
16467   ArCommand *pAr,
16468   char **pzWhere                  /* OUT: New WHERE clause */
16469 ){
16470   char *zWhere = 0;
16471   if( *pRc==SQLITE_OK ){
16472     if( pAr->nArg==0 ){
16473       zWhere = sqlite3_mprintf("1");
16474     }else{
16475       int i;
16476       const char *zSep = "";
16477       for(i=0; i<pAr->nArg; i++){
16478         const char *z = pAr->azArg[i];
16479         zWhere = sqlite3_mprintf(
16480           "%z%s name = '%q' OR substr(name,1,%d) = '%q/'",
16481           zWhere, zSep, z, strlen30(z)+1, z
16482         );
16483         if( zWhere==0 ){
16484           *pRc = SQLITE_NOMEM;
16485           break;
16486         }
16487         zSep = " OR ";
16488       }
16489     }
16490   }
16491   *pzWhere = zWhere;
16492 }
16493 
16494 /*
16495 ** Implementation of .ar "lisT" command.
16496 */
16497 static int arListCommand(ArCommand *pAr){
16498   const char *zSql = "SELECT %s FROM %s WHERE %s";
16499   const char *azCols[] = {
16500     "name",
16501     "lsmode(mode), sz, datetime(mtime, 'unixepoch'), name"
16502   };
16503 
16504   char *zWhere = 0;
16505   sqlite3_stmt *pSql = 0;
16506   int rc;
16507 
16508   rc = arCheckEntries(pAr);
16509   arWhereClause(&rc, pAr, &zWhere);
16510 
16511   shellPreparePrintf(pAr->db, &rc, &pSql, zSql, azCols[pAr->bVerbose],
16512                      pAr->zSrcTable, zWhere);
16513   if( pAr->bDryRun ){
16514     utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql));
16515   }else{
16516     while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
16517       if( pAr->bVerbose ){
16518         utf8_printf(pAr->p->out, "%s % 10d  %s  %s\n",
16519             sqlite3_column_text(pSql, 0),
16520             sqlite3_column_int(pSql, 1),
16521             sqlite3_column_text(pSql, 2),
16522             sqlite3_column_text(pSql, 3)
16523         );
16524       }else{
16525         utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0));
16526       }
16527     }
16528   }
16529   shellFinalize(&rc, pSql);
16530   sqlite3_free(zWhere);
16531   return rc;
16532 }
16533 
16534 
16535 /*
16536 ** Implementation of .ar "eXtract" command.
16537 */
16538 static int arExtractCommand(ArCommand *pAr){
16539   const char *zSql1 =
16540     "SELECT "
16541     " ($dir || name),"
16542     " writefile(($dir || name), %s, mode, mtime) "
16543     "FROM %s WHERE (%s) AND (data IS NULL OR $dirOnly = 0)"
16544     " AND name NOT GLOB '*..[/\\]*'";
16545 
16546   const char *azExtraArg[] = {
16547     "sqlar_uncompress(data, sz)",
16548     "data"
16549   };
16550 
16551   sqlite3_stmt *pSql = 0;
16552   int rc = SQLITE_OK;
16553   char *zDir = 0;
16554   char *zWhere = 0;
16555   int i, j;
16556 
16557   /* If arguments are specified, check that they actually exist within
16558   ** the archive before proceeding. And formulate a WHERE clause to
16559   ** match them.  */
16560   rc = arCheckEntries(pAr);
16561   arWhereClause(&rc, pAr, &zWhere);
16562 
16563   if( rc==SQLITE_OK ){
16564     if( pAr->zDir ){
16565       zDir = sqlite3_mprintf("%s/", pAr->zDir);
16566     }else{
16567       zDir = sqlite3_mprintf("");
16568     }
16569     if( zDir==0 ) rc = SQLITE_NOMEM;
16570   }
16571 
16572   shellPreparePrintf(pAr->db, &rc, &pSql, zSql1,
16573       azExtraArg[pAr->bZip], pAr->zSrcTable, zWhere
16574   );
16575 
16576   if( rc==SQLITE_OK ){
16577     j = sqlite3_bind_parameter_index(pSql, "$dir");
16578     sqlite3_bind_text(pSql, j, zDir, -1, SQLITE_STATIC);
16579 
16580     /* Run the SELECT statement twice. The first time, writefile() is called
16581     ** for all archive members that should be extracted. The second time,
16582     ** only for the directories. This is because the timestamps for
16583     ** extracted directories must be reset after they are populated (as
16584     ** populating them changes the timestamp).  */
16585     for(i=0; i<2; i++){
16586       j = sqlite3_bind_parameter_index(pSql, "$dirOnly");
16587       sqlite3_bind_int(pSql, j, i);
16588       if( pAr->bDryRun ){
16589         utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql));
16590       }else{
16591         while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
16592           if( i==0 && pAr->bVerbose ){
16593             utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0));
16594           }
16595         }
16596       }
16597       shellReset(&rc, pSql);
16598     }
16599     shellFinalize(&rc, pSql);
16600   }
16601 
16602   sqlite3_free(zDir);
16603   sqlite3_free(zWhere);
16604   return rc;
16605 }
16606 
16607 /*
16608 ** Run the SQL statement in zSql.  Or if doing a --dryrun, merely print it out.
16609 */
16610 static int arExecSql(ArCommand *pAr, const char *zSql){
16611   int rc;
16612   if( pAr->bDryRun ){
16613     utf8_printf(pAr->p->out, "%s\n", zSql);
16614     rc = SQLITE_OK;
16615   }else{
16616     char *zErr = 0;
16617     rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr);
16618     if( zErr ){
16619       utf8_printf(stdout, "ERROR: %s\n", zErr);
16620       sqlite3_free(zErr);
16621     }
16622   }
16623   return rc;
16624 }
16625 
16626 
16627 /*
16628 ** Implementation of .ar "create", "insert", and "update" commands.
16629 **
16630 **     create    ->     Create a new SQL archive
16631 **     insert    ->     Insert or reinsert all files listed
16632 **     update    ->     Insert files that have changed or that were not
16633 **                      previously in the archive
16634 **
16635 ** Create the "sqlar" table in the database if it does not already exist.
16636 ** Then add each file in the azFile[] array to the archive. Directories
16637 ** are added recursively. If argument bVerbose is non-zero, a message is
16638 ** printed on stdout for each file archived.
16639 **
16640 ** The create command is the same as update, except that it drops
16641 ** any existing "sqlar" table before beginning.  The "insert" command
16642 ** always overwrites every file named on the command-line, where as
16643 ** "update" only overwrites if the size or mtime or mode has changed.
16644 */
16645 static int arCreateOrUpdateCommand(
16646   ArCommand *pAr,                 /* Command arguments and options */
16647   int bUpdate,                    /* true for a --create. */
16648   int bOnlyIfChanged              /* Only update if file has changed */
16649 ){
16650   const char *zCreate =
16651       "CREATE TABLE IF NOT EXISTS sqlar(\n"
16652       "  name TEXT PRIMARY KEY,  -- name of the file\n"
16653       "  mode INT,               -- access permissions\n"
16654       "  mtime INT,              -- last modification time\n"
16655       "  sz INT,                 -- original file size\n"
16656       "  data BLOB               -- compressed content\n"
16657       ")";
16658   const char *zDrop = "DROP TABLE IF EXISTS sqlar";
16659   const char *zInsertFmt[2] = {
16660      "REPLACE INTO %s(name,mode,mtime,sz,data)\n"
16661      "  SELECT\n"
16662      "    %s,\n"
16663      "    mode,\n"
16664      "    mtime,\n"
16665      "    CASE substr(lsmode(mode),1,1)\n"
16666      "      WHEN '-' THEN length(data)\n"
16667      "      WHEN 'd' THEN 0\n"
16668      "      ELSE -1 END,\n"
16669      "    sqlar_compress(data)\n"
16670      "  FROM fsdir(%Q,%Q) AS disk\n"
16671      "  WHERE lsmode(mode) NOT LIKE '?%%'%s;"
16672      ,
16673      "REPLACE INTO %s(name,mode,mtime,data)\n"
16674      "  SELECT\n"
16675      "    %s,\n"
16676      "    mode,\n"
16677      "    mtime,\n"
16678      "    data\n"
16679      "  FROM fsdir(%Q,%Q) AS disk\n"
16680      "  WHERE lsmode(mode) NOT LIKE '?%%'%s;"
16681   };
16682   int i;                          /* For iterating through azFile[] */
16683   int rc;                         /* Return code */
16684   const char *zTab = 0;           /* SQL table into which to insert */
16685   char *zSql;
16686   char zTemp[50];
16687   char *zExists = 0;
16688 
16689   arExecSql(pAr, "PRAGMA page_size=512");
16690   rc = arExecSql(pAr, "SAVEPOINT ar;");
16691   if( rc!=SQLITE_OK ) return rc;
16692   zTemp[0] = 0;
16693   if( pAr->bZip ){
16694     /* Initialize the zipfile virtual table, if necessary */
16695     if( pAr->zFile ){
16696       sqlite3_uint64 r;
16697       sqlite3_randomness(sizeof(r),&r);
16698       sqlite3_snprintf(sizeof(zTemp),zTemp,"zip%016llx",r);
16699       zTab = zTemp;
16700       zSql = sqlite3_mprintf(
16701          "CREATE VIRTUAL TABLE temp.%s USING zipfile(%Q)",
16702          zTab, pAr->zFile
16703       );
16704       rc = arExecSql(pAr, zSql);
16705       sqlite3_free(zSql);
16706     }else{
16707       zTab = "zip";
16708     }
16709   }else{
16710     /* Initialize the table for an SQLAR */
16711     zTab = "sqlar";
16712     if( bUpdate==0 ){
16713       rc = arExecSql(pAr, zDrop);
16714       if( rc!=SQLITE_OK ) goto end_ar_transaction;
16715     }
16716     rc = arExecSql(pAr, zCreate);
16717   }
16718   if( bOnlyIfChanged ){
16719     zExists = sqlite3_mprintf(
16720       " AND NOT EXISTS("
16721           "SELECT 1 FROM %s AS mem"
16722           " WHERE mem.name=disk.name"
16723           " AND mem.mtime=disk.mtime"
16724           " AND mem.mode=disk.mode)", zTab);
16725   }else{
16726     zExists = sqlite3_mprintf("");
16727   }
16728   if( zExists==0 ) rc = SQLITE_NOMEM;
16729   for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){
16730     char *zSql2 = sqlite3_mprintf(zInsertFmt[pAr->bZip], zTab,
16731         pAr->bVerbose ? "shell_putsnl(name)" : "name",
16732         pAr->azArg[i], pAr->zDir, zExists);
16733     rc = arExecSql(pAr, zSql2);
16734     sqlite3_free(zSql2);
16735   }
16736 end_ar_transaction:
16737   if( rc!=SQLITE_OK ){
16738     sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0);
16739   }else{
16740     rc = arExecSql(pAr, "RELEASE ar;");
16741     if( pAr->bZip && pAr->zFile ){
16742       zSql = sqlite3_mprintf("DROP TABLE %s", zTemp);
16743       arExecSql(pAr, zSql);
16744       sqlite3_free(zSql);
16745     }
16746   }
16747   sqlite3_free(zExists);
16748   return rc;
16749 }
16750 
16751 /*
16752 ** Implementation of ".ar" dot command.
16753 */
16754 static int arDotCommand(
16755   ShellState *pState,          /* Current shell tool state */
16756   int fromCmdLine,             /* True if -A command-line option, not .ar cmd */
16757   char **azArg,                /* Array of arguments passed to dot command */
16758   int nArg                     /* Number of entries in azArg[] */
16759 ){
16760   ArCommand cmd;
16761   int rc;
16762   memset(&cmd, 0, sizeof(cmd));
16763   cmd.fromCmdLine = fromCmdLine;
16764   rc = arParseCommand(azArg, nArg, &cmd);
16765   if( rc==SQLITE_OK ){
16766     int eDbType = SHELL_OPEN_UNSPEC;
16767     cmd.p = pState;
16768     cmd.db = pState->db;
16769     if( cmd.zFile ){
16770       eDbType = deduceDatabaseType(cmd.zFile, 1);
16771     }else{
16772       eDbType = pState->openMode;
16773     }
16774     if( eDbType==SHELL_OPEN_ZIPFILE ){
16775       if( cmd.eCmd==AR_CMD_EXTRACT || cmd.eCmd==AR_CMD_LIST ){
16776         if( cmd.zFile==0 ){
16777           cmd.zSrcTable = sqlite3_mprintf("zip");
16778         }else{
16779           cmd.zSrcTable = sqlite3_mprintf("zipfile(%Q)", cmd.zFile);
16780         }
16781       }
16782       cmd.bZip = 1;
16783     }else if( cmd.zFile ){
16784       int flags;
16785       if( cmd.bAppend ) eDbType = SHELL_OPEN_APPENDVFS;
16786       if( cmd.eCmd==AR_CMD_CREATE || cmd.eCmd==AR_CMD_INSERT
16787            || cmd.eCmd==AR_CMD_UPDATE ){
16788         flags = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE;
16789       }else{
16790         flags = SQLITE_OPEN_READONLY;
16791       }
16792       cmd.db = 0;
16793       if( cmd.bDryRun ){
16794         utf8_printf(pState->out, "-- open database '%s'%s\n", cmd.zFile,
16795              eDbType==SHELL_OPEN_APPENDVFS ? " using 'apndvfs'" : "");
16796       }
16797       rc = sqlite3_open_v2(cmd.zFile, &cmd.db, flags,
16798              eDbType==SHELL_OPEN_APPENDVFS ? "apndvfs" : 0);
16799       if( rc!=SQLITE_OK ){
16800         utf8_printf(stderr, "cannot open file: %s (%s)\n",
16801             cmd.zFile, sqlite3_errmsg(cmd.db)
16802         );
16803         goto end_ar_command;
16804       }
16805       sqlite3_fileio_init(cmd.db, 0, 0);
16806       sqlite3_sqlar_init(cmd.db, 0, 0);
16807       sqlite3_create_function(cmd.db, "shell_putsnl", 1, SQLITE_UTF8, cmd.p,
16808                               shellPutsFunc, 0, 0);
16809 
16810     }
16811     if( cmd.zSrcTable==0 && cmd.bZip==0 && cmd.eCmd!=AR_CMD_HELP ){
16812       if( cmd.eCmd!=AR_CMD_CREATE
16813        && sqlite3_table_column_metadata(cmd.db,0,"sqlar","name",0,0,0,0,0)
16814       ){
16815         utf8_printf(stderr, "database does not contain an 'sqlar' table\n");
16816         rc = SQLITE_ERROR;
16817         goto end_ar_command;
16818       }
16819       cmd.zSrcTable = sqlite3_mprintf("sqlar");
16820     }
16821 
16822     switch( cmd.eCmd ){
16823       case AR_CMD_CREATE:
16824         rc = arCreateOrUpdateCommand(&cmd, 0, 0);
16825         break;
16826 
16827       case AR_CMD_EXTRACT:
16828         rc = arExtractCommand(&cmd);
16829         break;
16830 
16831       case AR_CMD_LIST:
16832         rc = arListCommand(&cmd);
16833         break;
16834 
16835       case AR_CMD_HELP:
16836         arUsage(pState->out);
16837         break;
16838 
16839       case AR_CMD_INSERT:
16840         rc = arCreateOrUpdateCommand(&cmd, 1, 0);
16841         break;
16842 
16843       default:
16844         assert( cmd.eCmd==AR_CMD_UPDATE );
16845         rc = arCreateOrUpdateCommand(&cmd, 1, 1);
16846         break;
16847     }
16848   }
16849 end_ar_command:
16850   if( cmd.db!=pState->db ){
16851     close_db(cmd.db);
16852   }
16853   sqlite3_free(cmd.zSrcTable);
16854 
16855   return rc;
16856 }
16857 /* End of the ".archive" or ".ar" command logic
16858 *******************************************************************************/
16859 #endif /* !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) */
16860 
16861 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
16862 /*
16863 ** If (*pRc) is not SQLITE_OK when this function is called, it is a no-op.
16864 ** Otherwise, the SQL statement or statements in zSql are executed using
16865 ** database connection db and the error code written to *pRc before
16866 ** this function returns.
16867 */
16868 static void shellExec(sqlite3 *db, int *pRc, const char *zSql){
16869   int rc = *pRc;
16870   if( rc==SQLITE_OK ){
16871     char *zErr = 0;
16872     rc = sqlite3_exec(db, zSql, 0, 0, &zErr);
16873     if( rc!=SQLITE_OK ){
16874       raw_printf(stderr, "SQL error: %s\n", zErr);
16875     }
16876     *pRc = rc;
16877   }
16878 }
16879 
16880 /*
16881 ** Like shellExec(), except that zFmt is a printf() style format string.
16882 */
16883 static void shellExecPrintf(sqlite3 *db, int *pRc, const char *zFmt, ...){
16884   char *z = 0;
16885   if( *pRc==SQLITE_OK ){
16886     va_list ap;
16887     va_start(ap, zFmt);
16888     z = sqlite3_vmprintf(zFmt, ap);
16889     va_end(ap);
16890     if( z==0 ){
16891       *pRc = SQLITE_NOMEM;
16892     }else{
16893       shellExec(db, pRc, z);
16894     }
16895     sqlite3_free(z);
16896   }
16897 }
16898 
16899 /*
16900 ** If *pRc is not SQLITE_OK when this function is called, it is a no-op.
16901 ** Otherwise, an attempt is made to allocate, zero and return a pointer
16902 ** to a buffer nByte bytes in size. If an OOM error occurs, *pRc is set
16903 ** to SQLITE_NOMEM and NULL returned.
16904 */
16905 static void *shellMalloc(int *pRc, sqlite3_int64 nByte){
16906   void *pRet = 0;
16907   if( *pRc==SQLITE_OK ){
16908     pRet = sqlite3_malloc64(nByte);
16909     if( pRet==0 ){
16910       *pRc = SQLITE_NOMEM;
16911     }else{
16912       memset(pRet, 0, nByte);
16913     }
16914   }
16915   return pRet;
16916 }
16917 
16918 /*
16919 ** If *pRc is not SQLITE_OK when this function is called, it is a no-op.
16920 ** Otherwise, zFmt is treated as a printf() style string. The result of
16921 ** formatting it along with any trailing arguments is written into a
16922 ** buffer obtained from sqlite3_malloc(), and pointer to which is returned.
16923 ** It is the responsibility of the caller to eventually free this buffer
16924 ** using a call to sqlite3_free().
16925 **
16926 ** If an OOM error occurs, (*pRc) is set to SQLITE_NOMEM and a NULL
16927 ** pointer returned.
16928 */
16929 static char *shellMPrintf(int *pRc, const char *zFmt, ...){
16930   char *z = 0;
16931   if( *pRc==SQLITE_OK ){
16932     va_list ap;
16933     va_start(ap, zFmt);
16934     z = sqlite3_vmprintf(zFmt, ap);
16935     va_end(ap);
16936     if( z==0 ){
16937       *pRc = SQLITE_NOMEM;
16938     }
16939   }
16940   return z;
16941 }
16942 
16943 /*
16944 ** When running the ".recover" command, each output table, and the special
16945 ** orphaned row table if it is required, is represented by an instance
16946 ** of the following struct.
16947 */
16948 typedef struct RecoverTable RecoverTable;
16949 struct RecoverTable {
16950   char *zQuoted;                  /* Quoted version of table name */
16951   int nCol;                       /* Number of columns in table */
16952   char **azlCol;                  /* Array of column lists */
16953   int iPk;                        /* Index of IPK column */
16954 };
16955 
16956 /*
16957 ** Free a RecoverTable object allocated by recoverFindTable() or
16958 ** recoverOrphanTable().
16959 */
16960 static void recoverFreeTable(RecoverTable *pTab){
16961   if( pTab ){
16962     sqlite3_free(pTab->zQuoted);
16963     if( pTab->azlCol ){
16964       int i;
16965       for(i=0; i<=pTab->nCol; i++){
16966         sqlite3_free(pTab->azlCol[i]);
16967       }
16968       sqlite3_free(pTab->azlCol);
16969     }
16970     sqlite3_free(pTab);
16971   }
16972 }
16973 
16974 /*
16975 ** This function is a no-op if (*pRc) is not SQLITE_OK when it is called.
16976 ** Otherwise, it allocates and returns a RecoverTable object based on the
16977 ** final four arguments passed to this function. It is the responsibility
16978 ** of the caller to eventually free the returned object using
16979 ** recoverFreeTable().
16980 */
16981 static RecoverTable *recoverNewTable(
16982   int *pRc,                       /* IN/OUT: Error code */
16983   const char *zName,              /* Name of table */
16984   const char *zSql,               /* CREATE TABLE statement */
16985   int bIntkey,
16986   int nCol
16987 ){
16988   sqlite3 *dbtmp = 0;             /* sqlite3 handle for testing CREATE TABLE */
16989   int rc = *pRc;
16990   RecoverTable *pTab = 0;
16991 
16992   pTab = (RecoverTable*)shellMalloc(&rc, sizeof(RecoverTable));
16993   if( rc==SQLITE_OK ){
16994     int nSqlCol = 0;
16995     int bSqlIntkey = 0;
16996     sqlite3_stmt *pStmt = 0;
16997 
16998     rc = sqlite3_open("", &dbtmp);
16999     if( rc==SQLITE_OK ){
17000       sqlite3_create_function(dbtmp, "shell_idquote", 1, SQLITE_UTF8, 0,
17001                               shellIdQuote, 0, 0);
17002     }
17003     if( rc==SQLITE_OK ){
17004       rc = sqlite3_exec(dbtmp, "PRAGMA writable_schema = on", 0, 0, 0);
17005     }
17006     if( rc==SQLITE_OK ){
17007       rc = sqlite3_exec(dbtmp, zSql, 0, 0, 0);
17008       if( rc==SQLITE_ERROR ){
17009         rc = SQLITE_OK;
17010         goto finished;
17011       }
17012     }
17013     shellPreparePrintf(dbtmp, &rc, &pStmt,
17014         "SELECT count(*) FROM pragma_table_info(%Q)", zName
17015     );
17016     if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
17017       nSqlCol = sqlite3_column_int(pStmt, 0);
17018     }
17019     shellFinalize(&rc, pStmt);
17020 
17021     if( rc!=SQLITE_OK || nSqlCol<nCol ){
17022       goto finished;
17023     }
17024 
17025     shellPreparePrintf(dbtmp, &rc, &pStmt,
17026       "SELECT ("
17027       "  SELECT substr(data,1,1)==X'0D' FROM sqlite_dbpage WHERE pgno=rootpage"
17028       ") FROM sqlite_schema WHERE name = %Q", zName
17029     );
17030     if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
17031       bSqlIntkey = sqlite3_column_int(pStmt, 0);
17032     }
17033     shellFinalize(&rc, pStmt);
17034 
17035     if( bIntkey==bSqlIntkey ){
17036       int i;
17037       const char *zPk = "_rowid_";
17038       sqlite3_stmt *pPkFinder = 0;
17039 
17040       /* If this is an intkey table and there is an INTEGER PRIMARY KEY,
17041       ** set zPk to the name of the PK column, and pTab->iPk to the index
17042       ** of the column, where columns are 0-numbered from left to right.
17043       ** Or, if this is a WITHOUT ROWID table or if there is no IPK column,
17044       ** leave zPk as "_rowid_" and pTab->iPk at -2.  */
17045       pTab->iPk = -2;
17046       if( bIntkey ){
17047         shellPreparePrintf(dbtmp, &rc, &pPkFinder,
17048           "SELECT cid, name FROM pragma_table_info(%Q) "
17049           "  WHERE pk=1 AND type='integer' COLLATE nocase"
17050           "  AND NOT EXISTS (SELECT cid FROM pragma_table_info(%Q) WHERE pk=2)"
17051           , zName, zName
17052         );
17053         if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pPkFinder) ){
17054           pTab->iPk = sqlite3_column_int(pPkFinder, 0);
17055           zPk = (const char*)sqlite3_column_text(pPkFinder, 1);
17056         }
17057       }
17058 
17059       pTab->zQuoted = shellMPrintf(&rc, "\"%w\"", zName);
17060       pTab->azlCol = (char**)shellMalloc(&rc, sizeof(char*) * (nSqlCol+1));
17061       pTab->nCol = nSqlCol;
17062 
17063       if( bIntkey ){
17064         pTab->azlCol[0] = shellMPrintf(&rc, "\"%w\"", zPk);
17065       }else{
17066         pTab->azlCol[0] = shellMPrintf(&rc, "");
17067       }
17068       i = 1;
17069       shellPreparePrintf(dbtmp, &rc, &pStmt,
17070           "SELECT %Q || group_concat(shell_idquote(name), ', ') "
17071           "  FILTER (WHERE cid!=%d) OVER (ORDER BY %s cid) "
17072           "FROM pragma_table_info(%Q)",
17073           bIntkey ? ", " : "", pTab->iPk,
17074           bIntkey ? "" : "(CASE WHEN pk=0 THEN 1000000 ELSE pk END), ",
17075           zName
17076       );
17077       while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
17078         const char *zText = (const char*)sqlite3_column_text(pStmt, 0);
17079         pTab->azlCol[i] = shellMPrintf(&rc, "%s%s", pTab->azlCol[0], zText);
17080         i++;
17081       }
17082       shellFinalize(&rc, pStmt);
17083 
17084       shellFinalize(&rc, pPkFinder);
17085     }
17086   }
17087 
17088  finished:
17089   sqlite3_close(dbtmp);
17090   *pRc = rc;
17091   if( rc!=SQLITE_OK || (pTab && pTab->zQuoted==0) ){
17092     recoverFreeTable(pTab);
17093     pTab = 0;
17094   }
17095   return pTab;
17096 }
17097 
17098 /*
17099 ** This function is called to search the schema recovered from the
17100 ** sqlite_schema table of the (possibly) corrupt database as part
17101 ** of a ".recover" command. Specifically, for a table with root page
17102 ** iRoot and at least nCol columns. Additionally, if bIntkey is 0, the
17103 ** table must be a WITHOUT ROWID table, or if non-zero, not one of
17104 ** those.
17105 **
17106 ** If a table is found, a (RecoverTable*) object is returned. Or, if
17107 ** no such table is found, but bIntkey is false and iRoot is the
17108 ** root page of an index in the recovered schema, then (*pbNoop) is
17109 ** set to true and NULL returned. Or, if there is no such table or
17110 ** index, NULL is returned and (*pbNoop) set to 0, indicating that
17111 ** the caller should write data to the orphans table.
17112 */
17113 static RecoverTable *recoverFindTable(
17114   ShellState *pState,             /* Shell state object */
17115   int *pRc,                       /* IN/OUT: Error code */
17116   int iRoot,                      /* Root page of table */
17117   int bIntkey,                    /* True for an intkey table */
17118   int nCol,                       /* Number of columns in table */
17119   int *pbNoop                     /* OUT: True if iRoot is root of index */
17120 ){
17121   sqlite3_stmt *pStmt = 0;
17122   RecoverTable *pRet = 0;
17123   int bNoop = 0;
17124   const char *zSql = 0;
17125   const char *zName = 0;
17126 
17127   /* Search the recovered schema for an object with root page iRoot. */
17128   shellPreparePrintf(pState->db, pRc, &pStmt,
17129       "SELECT type, name, sql FROM recovery.schema WHERE rootpage=%d", iRoot
17130   );
17131   while( *pRc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
17132     const char *zType = (const char*)sqlite3_column_text(pStmt, 0);
17133     if( bIntkey==0 && sqlite3_stricmp(zType, "index")==0 ){
17134       bNoop = 1;
17135       break;
17136     }
17137     if( sqlite3_stricmp(zType, "table")==0 ){
17138       zName = (const char*)sqlite3_column_text(pStmt, 1);
17139       zSql = (const char*)sqlite3_column_text(pStmt, 2);
17140       pRet = recoverNewTable(pRc, zName, zSql, bIntkey, nCol);
17141       break;
17142     }
17143   }
17144 
17145   shellFinalize(pRc, pStmt);
17146   *pbNoop = bNoop;
17147   return pRet;
17148 }
17149 
17150 /*
17151 ** Return a RecoverTable object representing the orphans table.
17152 */
17153 static RecoverTable *recoverOrphanTable(
17154   ShellState *pState,             /* Shell state object */
17155   int *pRc,                       /* IN/OUT: Error code */
17156   const char *zLostAndFound,      /* Base name for orphans table */
17157   int nCol                        /* Number of user data columns */
17158 ){
17159   RecoverTable *pTab = 0;
17160   if( nCol>=0 && *pRc==SQLITE_OK ){
17161     int i;
17162 
17163     /* This block determines the name of the orphan table. The prefered
17164     ** name is zLostAndFound. But if that clashes with another name
17165     ** in the recovered schema, try zLostAndFound_0, zLostAndFound_1
17166     ** and so on until a non-clashing name is found.  */
17167     int iTab = 0;
17168     char *zTab = shellMPrintf(pRc, "%s", zLostAndFound);
17169     sqlite3_stmt *pTest = 0;
17170     shellPrepare(pState->db, pRc,
17171         "SELECT 1 FROM recovery.schema WHERE name=?", &pTest
17172     );
17173     if( pTest ) sqlite3_bind_text(pTest, 1, zTab, -1, SQLITE_TRANSIENT);
17174     while( *pRc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pTest) ){
17175       shellReset(pRc, pTest);
17176       sqlite3_free(zTab);
17177       zTab = shellMPrintf(pRc, "%s_%d", zLostAndFound, iTab++);
17178       sqlite3_bind_text(pTest, 1, zTab, -1, SQLITE_TRANSIENT);
17179     }
17180     shellFinalize(pRc, pTest);
17181 
17182     pTab = (RecoverTable*)shellMalloc(pRc, sizeof(RecoverTable));
17183     if( pTab ){
17184       pTab->zQuoted = shellMPrintf(pRc, "\"%w\"", zTab);
17185       pTab->nCol = nCol;
17186       pTab->iPk = -2;
17187       if( nCol>0 ){
17188         pTab->azlCol = (char**)shellMalloc(pRc, sizeof(char*) * (nCol+1));
17189         if( pTab->azlCol ){
17190           pTab->azlCol[nCol] = shellMPrintf(pRc, "");
17191           for(i=nCol-1; i>=0; i--){
17192             pTab->azlCol[i] = shellMPrintf(pRc, "%s, NULL", pTab->azlCol[i+1]);
17193           }
17194         }
17195       }
17196 
17197       if( *pRc!=SQLITE_OK ){
17198         recoverFreeTable(pTab);
17199         pTab = 0;
17200       }else{
17201         raw_printf(pState->out,
17202             "CREATE TABLE %s(rootpgno INTEGER, "
17203             "pgno INTEGER, nfield INTEGER, id INTEGER", pTab->zQuoted
17204         );
17205         for(i=0; i<nCol; i++){
17206           raw_printf(pState->out, ", c%d", i);
17207         }
17208         raw_printf(pState->out, ");\n");
17209       }
17210     }
17211     sqlite3_free(zTab);
17212   }
17213   return pTab;
17214 }
17215 
17216 /*
17217 ** This function is called to recover data from the database. A script
17218 ** to construct a new database containing all recovered data is output
17219 ** on stream pState->out.
17220 */
17221 static int recoverDatabaseCmd(ShellState *pState, int nArg, char **azArg){
17222   int rc = SQLITE_OK;
17223   sqlite3_stmt *pLoop = 0;        /* Loop through all root pages */
17224   sqlite3_stmt *pPages = 0;       /* Loop through all pages in a group */
17225   sqlite3_stmt *pCells = 0;       /* Loop through all cells in a page */
17226   const char *zRecoveryDb = "";   /* Name of "recovery" database */
17227   const char *zLostAndFound = "lost_and_found";
17228   int i;
17229   int nOrphan = -1;
17230   RecoverTable *pOrphan = 0;
17231 
17232   int bFreelist = 1;              /* 0 if --freelist-corrupt is specified */
17233   int bRowids = 1;                /* 0 if --no-rowids */
17234   for(i=1; i<nArg; i++){
17235     char *z = azArg[i];
17236     int n;
17237     if( z[0]=='-' && z[1]=='-' ) z++;
17238     n = strlen30(z);
17239     if( n<=17 && memcmp("-freelist-corrupt", z, n)==0 ){
17240       bFreelist = 0;
17241     }else
17242     if( n<=12 && memcmp("-recovery-db", z, n)==0 && i<(nArg-1) ){
17243       i++;
17244       zRecoveryDb = azArg[i];
17245     }else
17246     if( n<=15 && memcmp("-lost-and-found", z, n)==0 && i<(nArg-1) ){
17247       i++;
17248       zLostAndFound = azArg[i];
17249     }else
17250     if( n<=10 && memcmp("-no-rowids", z, n)==0 ){
17251       bRowids = 0;
17252     }
17253     else{
17254       utf8_printf(stderr, "unexpected option: %s\n", azArg[i]);
17255       showHelp(pState->out, azArg[0]);
17256       return 1;
17257     }
17258   }
17259 
17260   shellExecPrintf(pState->db, &rc,
17261     /* Attach an in-memory database named 'recovery'. Create an indexed
17262     ** cache of the sqlite_dbptr virtual table. */
17263     "PRAGMA writable_schema = on;"
17264     "ATTACH %Q AS recovery;"
17265     "DROP TABLE IF EXISTS recovery.dbptr;"
17266     "DROP TABLE IF EXISTS recovery.freelist;"
17267     "DROP TABLE IF EXISTS recovery.map;"
17268     "DROP TABLE IF EXISTS recovery.schema;"
17269     "CREATE TABLE recovery.freelist(pgno INTEGER PRIMARY KEY);", zRecoveryDb
17270   );
17271 
17272   if( bFreelist ){
17273     shellExec(pState->db, &rc,
17274       "WITH trunk(pgno) AS ("
17275       "  SELECT shell_int32("
17276       "      (SELECT data FROM sqlite_dbpage WHERE pgno=1), 8) AS x "
17277       "      WHERE x>0"
17278       "    UNION"
17279       "  SELECT shell_int32("
17280       "      (SELECT data FROM sqlite_dbpage WHERE pgno=trunk.pgno), 0) AS x "
17281       "      FROM trunk WHERE x>0"
17282       "),"
17283       "freelist(data, n, freepgno) AS ("
17284       "  SELECT data, min(16384, shell_int32(data, 1)-1), t.pgno "
17285       "      FROM trunk t, sqlite_dbpage s WHERE s.pgno=t.pgno"
17286       "    UNION ALL"
17287       "  SELECT data, n-1, shell_int32(data, 2+n) "
17288       "      FROM freelist WHERE n>=0"
17289       ")"
17290       "REPLACE INTO recovery.freelist SELECT freepgno FROM freelist;"
17291     );
17292   }
17293 
17294   /* If this is an auto-vacuum database, add all pointer-map pages to
17295   ** the freelist table. Do this regardless of whether or not
17296   ** --freelist-corrupt was specified.  */
17297   shellExec(pState->db, &rc,
17298     "WITH ptrmap(pgno) AS ("
17299     "  SELECT 2 WHERE shell_int32("
17300     "    (SELECT data FROM sqlite_dbpage WHERE pgno=1), 13"
17301     "  )"
17302     "    UNION ALL "
17303     "  SELECT pgno+1+(SELECT page_size FROM pragma_page_size)/5 AS pp "
17304     "  FROM ptrmap WHERE pp<=(SELECT page_count FROM pragma_page_count)"
17305     ")"
17306     "REPLACE INTO recovery.freelist SELECT pgno FROM ptrmap"
17307   );
17308 
17309   shellExec(pState->db, &rc,
17310     "CREATE TABLE recovery.dbptr("
17311     "      pgno, child, PRIMARY KEY(child, pgno)"
17312     ") WITHOUT ROWID;"
17313     "INSERT OR IGNORE INTO recovery.dbptr(pgno, child) "
17314     "    SELECT * FROM sqlite_dbptr"
17315     "      WHERE pgno NOT IN freelist AND child NOT IN freelist;"
17316 
17317     /* Delete any pointer to page 1. This ensures that page 1 is considered
17318     ** a root page, regardless of how corrupt the db is. */
17319     "DELETE FROM recovery.dbptr WHERE child = 1;"
17320 
17321     /* Delete all pointers to any pages that have more than one pointer
17322     ** to them. Such pages will be treated as root pages when recovering
17323     ** data.  */
17324     "DELETE FROM recovery.dbptr WHERE child IN ("
17325     "  SELECT child FROM recovery.dbptr GROUP BY child HAVING count(*)>1"
17326     ");"
17327 
17328     /* Create the "map" table that will (eventually) contain instructions
17329     ** for dealing with each page in the db that contains one or more
17330     ** records. */
17331     "CREATE TABLE recovery.map("
17332       "pgno INTEGER PRIMARY KEY, maxlen INT, intkey, root INT"
17333     ");"
17334 
17335     /* Populate table [map]. If there are circular loops of pages in the
17336     ** database, the following adds all pages in such a loop to the map
17337     ** as individual root pages. This could be handled better.  */
17338     "WITH pages(i, maxlen) AS ("
17339     "  SELECT page_count, ("
17340     "    SELECT max(field+1) FROM sqlite_dbdata WHERE pgno=page_count"
17341     "  ) FROM pragma_page_count WHERE page_count>0"
17342     "    UNION ALL"
17343     "  SELECT i-1, ("
17344     "    SELECT max(field+1) FROM sqlite_dbdata WHERE pgno=i-1"
17345     "  ) FROM pages WHERE i>=2"
17346     ")"
17347     "INSERT INTO recovery.map(pgno, maxlen, intkey, root) "
17348     "  SELECT i, maxlen, NULL, ("
17349     "    WITH p(orig, pgno, parent) AS ("
17350     "      SELECT 0, i, (SELECT pgno FROM recovery.dbptr WHERE child=i)"
17351     "        UNION "
17352     "      SELECT i, p.parent, "
17353     "        (SELECT pgno FROM recovery.dbptr WHERE child=p.parent) FROM p"
17354     "    )"
17355     "    SELECT pgno FROM p WHERE (parent IS NULL OR pgno = orig)"
17356     ") "
17357     "FROM pages WHERE maxlen IS NOT NULL AND i NOT IN freelist;"
17358     "UPDATE recovery.map AS o SET intkey = ("
17359     "  SELECT substr(data, 1, 1)==X'0D' FROM sqlite_dbpage WHERE pgno=o.pgno"
17360     ");"
17361 
17362     /* Extract data from page 1 and any linked pages into table
17363     ** recovery.schema. With the same schema as an sqlite_schema table.  */
17364     "CREATE TABLE recovery.schema(type, name, tbl_name, rootpage, sql);"
17365     "INSERT INTO recovery.schema SELECT "
17366     "  max(CASE WHEN field=0 THEN value ELSE NULL END),"
17367     "  max(CASE WHEN field=1 THEN value ELSE NULL END),"
17368     "  max(CASE WHEN field=2 THEN value ELSE NULL END),"
17369     "  max(CASE WHEN field=3 THEN value ELSE NULL END),"
17370     "  max(CASE WHEN field=4 THEN value ELSE NULL END)"
17371     "FROM sqlite_dbdata WHERE pgno IN ("
17372     "  SELECT pgno FROM recovery.map WHERE root=1"
17373     ")"
17374     "GROUP BY pgno, cell;"
17375     "CREATE INDEX recovery.schema_rootpage ON schema(rootpage);"
17376   );
17377 
17378   /* Open a transaction, then print out all non-virtual, non-"sqlite_%"
17379   ** CREATE TABLE statements that extracted from the existing schema.  */
17380   if( rc==SQLITE_OK ){
17381     sqlite3_stmt *pStmt = 0;
17382     /* ".recover" might output content in an order which causes immediate
17383     ** foreign key constraints to be violated. So disable foreign-key
17384     ** constraint enforcement to prevent problems when running the output
17385     ** script. */
17386     raw_printf(pState->out, "PRAGMA foreign_keys=OFF;\n");
17387     raw_printf(pState->out, "BEGIN;\n");
17388     raw_printf(pState->out, "PRAGMA writable_schema = on;\n");
17389     shellPrepare(pState->db, &rc,
17390         "SELECT sql FROM recovery.schema "
17391         "WHERE type='table' AND sql LIKE 'create table%'", &pStmt
17392     );
17393     while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
17394       const char *zCreateTable = (const char*)sqlite3_column_text(pStmt, 0);
17395       raw_printf(pState->out, "CREATE TABLE IF NOT EXISTS %s;\n",
17396           &zCreateTable[12]
17397       );
17398     }
17399     shellFinalize(&rc, pStmt);
17400   }
17401 
17402   /* Figure out if an orphan table will be required. And if so, how many
17403   ** user columns it should contain */
17404   shellPrepare(pState->db, &rc,
17405       "SELECT coalesce(max(maxlen), -2) FROM recovery.map WHERE root>1"
17406       , &pLoop
17407   );
17408   if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pLoop) ){
17409     nOrphan = sqlite3_column_int(pLoop, 0);
17410   }
17411   shellFinalize(&rc, pLoop);
17412   pLoop = 0;
17413 
17414   shellPrepare(pState->db, &rc,
17415       "SELECT pgno FROM recovery.map WHERE root=?", &pPages
17416   );
17417 
17418   shellPrepare(pState->db, &rc,
17419       "SELECT max(field), group_concat(shell_escape_crnl(quote"
17420       "(case when (? AND field<0) then NULL else value end)"
17421       "), ', ')"
17422       ", min(field) "
17423       "FROM sqlite_dbdata WHERE pgno = ? AND field != ?"
17424       "GROUP BY cell", &pCells
17425   );
17426 
17427   /* Loop through each root page. */
17428   shellPrepare(pState->db, &rc,
17429       "SELECT root, intkey, max(maxlen) FROM recovery.map"
17430       " WHERE root>1 GROUP BY root, intkey ORDER BY root=("
17431       "  SELECT rootpage FROM recovery.schema WHERE name='sqlite_sequence'"
17432       ")", &pLoop
17433   );
17434   while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pLoop) ){
17435     int iRoot = sqlite3_column_int(pLoop, 0);
17436     int bIntkey = sqlite3_column_int(pLoop, 1);
17437     int nCol = sqlite3_column_int(pLoop, 2);
17438     int bNoop = 0;
17439     RecoverTable *pTab;
17440 
17441     assert( bIntkey==0 || bIntkey==1 );
17442     pTab = recoverFindTable(pState, &rc, iRoot, bIntkey, nCol, &bNoop);
17443     if( bNoop || rc ) continue;
17444     if( pTab==0 ){
17445       if( pOrphan==0 ){
17446         pOrphan = recoverOrphanTable(pState, &rc, zLostAndFound, nOrphan);
17447       }
17448       pTab = pOrphan;
17449       if( pTab==0 ) break;
17450     }
17451 
17452     if( 0==sqlite3_stricmp(pTab->zQuoted, "\"sqlite_sequence\"") ){
17453       raw_printf(pState->out, "DELETE FROM sqlite_sequence;\n");
17454     }
17455     sqlite3_bind_int(pPages, 1, iRoot);
17456     if( bRowids==0 && pTab->iPk<0 ){
17457       sqlite3_bind_int(pCells, 1, 1);
17458     }else{
17459       sqlite3_bind_int(pCells, 1, 0);
17460     }
17461     sqlite3_bind_int(pCells, 3, pTab->iPk);
17462 
17463     while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pPages) ){
17464       int iPgno = sqlite3_column_int(pPages, 0);
17465       sqlite3_bind_int(pCells, 2, iPgno);
17466       while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pCells) ){
17467         int nField = sqlite3_column_int(pCells, 0);
17468         int iMin = sqlite3_column_int(pCells, 2);
17469         const char *zVal = (const char*)sqlite3_column_text(pCells, 1);
17470 
17471         RecoverTable *pTab2 = pTab;
17472         if( pTab!=pOrphan && (iMin<0)!=bIntkey ){
17473           if( pOrphan==0 ){
17474             pOrphan = recoverOrphanTable(pState, &rc, zLostAndFound, nOrphan);
17475           }
17476           pTab2 = pOrphan;
17477           if( pTab2==0 ) break;
17478         }
17479 
17480         nField = nField+1;
17481         if( pTab2==pOrphan ){
17482           raw_printf(pState->out,
17483               "INSERT INTO %s VALUES(%d, %d, %d, %s%s%s);\n",
17484               pTab2->zQuoted, iRoot, iPgno, nField,
17485               iMin<0 ? "" : "NULL, ", zVal, pTab2->azlCol[nField]
17486           );
17487         }else{
17488           raw_printf(pState->out, "INSERT INTO %s(%s) VALUES( %s );\n",
17489               pTab2->zQuoted, pTab2->azlCol[nField], zVal
17490           );
17491         }
17492       }
17493       shellReset(&rc, pCells);
17494     }
17495     shellReset(&rc, pPages);
17496     if( pTab!=pOrphan ) recoverFreeTable(pTab);
17497   }
17498   shellFinalize(&rc, pLoop);
17499   shellFinalize(&rc, pPages);
17500   shellFinalize(&rc, pCells);
17501   recoverFreeTable(pOrphan);
17502 
17503   /* The rest of the schema */
17504   if( rc==SQLITE_OK ){
17505     sqlite3_stmt *pStmt = 0;
17506     shellPrepare(pState->db, &rc,
17507         "SELECT sql, name FROM recovery.schema "
17508         "WHERE sql NOT LIKE 'create table%'", &pStmt
17509     );
17510     while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
17511       const char *zSql = (const char*)sqlite3_column_text(pStmt, 0);
17512       if( sqlite3_strnicmp(zSql, "create virt", 11)==0 ){
17513         const char *zName = (const char*)sqlite3_column_text(pStmt, 1);
17514         char *zPrint = shellMPrintf(&rc,
17515           "INSERT INTO sqlite_schema VALUES('table', %Q, %Q, 0, %Q)",
17516           zName, zName, zSql
17517         );
17518         raw_printf(pState->out, "%s;\n", zPrint);
17519         sqlite3_free(zPrint);
17520       }else{
17521         raw_printf(pState->out, "%s;\n", zSql);
17522       }
17523     }
17524     shellFinalize(&rc, pStmt);
17525   }
17526 
17527   if( rc==SQLITE_OK ){
17528     raw_printf(pState->out, "PRAGMA writable_schema = off;\n");
17529     raw_printf(pState->out, "COMMIT;\n");
17530   }
17531   sqlite3_exec(pState->db, "DETACH recovery", 0, 0, 0);
17532   return rc;
17533 }
17534 #endif /* !(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) */
17535 
17536 
17537 /*
17538 ** If an input line begins with "." then invoke this routine to
17539 ** process that line.
17540 **
17541 ** Return 1 on error, 2 to exit, and 0 otherwise.
17542 */
17543 static int do_meta_command(char *zLine, ShellState *p){
17544   int h = 1;
17545   int nArg = 0;
17546   int n, c;
17547   int rc = 0;
17548   char *azArg[52];
17549 
17550 #ifndef SQLITE_OMIT_VIRTUALTABLE
17551   if( p->expert.pExpert ){
17552     expertFinish(p, 1, 0);
17553   }
17554 #endif
17555 
17556   /* Parse the input line into tokens.
17557   */
17558   while( zLine[h] && nArg<ArraySize(azArg)-1 ){
17559     while( IsSpace(zLine[h]) ){ h++; }
17560     if( zLine[h]==0 ) break;
17561     if( zLine[h]=='\'' || zLine[h]=='"' ){
17562       int delim = zLine[h++];
17563       azArg[nArg++] = &zLine[h];
17564       while( zLine[h] && zLine[h]!=delim ){
17565         if( zLine[h]=='\\' && delim=='"' && zLine[h+1]!=0 ) h++;
17566         h++;
17567       }
17568       if( zLine[h]==delim ){
17569         zLine[h++] = 0;
17570       }
17571       if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
17572     }else{
17573       azArg[nArg++] = &zLine[h];
17574       while( zLine[h] && !IsSpace(zLine[h]) ){ h++; }
17575       if( zLine[h] ) zLine[h++] = 0;
17576       resolve_backslashes(azArg[nArg-1]);
17577     }
17578   }
17579   azArg[nArg] = 0;
17580 
17581   /* Process the input line.
17582   */
17583   if( nArg==0 ) return 0; /* no tokens, no error */
17584   n = strlen30(azArg[0]);
17585   c = azArg[0][0];
17586   clearTempFile(p);
17587 
17588 #ifndef SQLITE_OMIT_AUTHORIZATION
17589   if( c=='a' && strncmp(azArg[0], "auth", n)==0 ){
17590     if( nArg!=2 ){
17591       raw_printf(stderr, "Usage: .auth ON|OFF\n");
17592       rc = 1;
17593       goto meta_command_exit;
17594     }
17595     open_db(p, 0);
17596     if( booleanValue(azArg[1]) ){
17597       sqlite3_set_authorizer(p->db, shellAuth, p);
17598     }else{
17599       sqlite3_set_authorizer(p->db, 0, 0);
17600     }
17601   }else
17602 #endif
17603 
17604 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
17605   if( c=='a' && strncmp(azArg[0], "archive", n)==0 ){
17606     open_db(p, 0);
17607     rc = arDotCommand(p, 0, azArg, nArg);
17608   }else
17609 #endif
17610 
17611   if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0)
17612    || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0)
17613   ){
17614     const char *zDestFile = 0;
17615     const char *zDb = 0;
17616     sqlite3 *pDest;
17617     sqlite3_backup *pBackup;
17618     int j;
17619     int bAsync = 0;
17620     const char *zVfs = 0;
17621     for(j=1; j<nArg; j++){
17622       const char *z = azArg[j];
17623       if( z[0]=='-' ){
17624         if( z[1]=='-' ) z++;
17625         if( strcmp(z, "-append")==0 ){
17626           zVfs = "apndvfs";
17627         }else
17628         if( strcmp(z, "-async")==0 ){
17629           bAsync = 1;
17630         }else
17631         {
17632           utf8_printf(stderr, "unknown option: %s\n", azArg[j]);
17633           return 1;
17634         }
17635       }else if( zDestFile==0 ){
17636         zDestFile = azArg[j];
17637       }else if( zDb==0 ){
17638         zDb = zDestFile;
17639         zDestFile = azArg[j];
17640       }else{
17641         raw_printf(stderr, "Usage: .backup ?DB? ?OPTIONS? FILENAME\n");
17642         return 1;
17643       }
17644     }
17645     if( zDestFile==0 ){
17646       raw_printf(stderr, "missing FILENAME argument on .backup\n");
17647       return 1;
17648     }
17649     if( zDb==0 ) zDb = "main";
17650     rc = sqlite3_open_v2(zDestFile, &pDest,
17651                   SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE, zVfs);
17652     if( rc!=SQLITE_OK ){
17653       utf8_printf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
17654       close_db(pDest);
17655       return 1;
17656     }
17657     if( bAsync ){
17658       sqlite3_exec(pDest, "PRAGMA synchronous=OFF; PRAGMA journal_mode=OFF;",
17659                    0, 0, 0);
17660     }
17661     open_db(p, 0);
17662     pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
17663     if( pBackup==0 ){
17664       utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
17665       close_db(pDest);
17666       return 1;
17667     }
17668     while(  (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
17669     sqlite3_backup_finish(pBackup);
17670     if( rc==SQLITE_DONE ){
17671       rc = 0;
17672     }else{
17673       utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
17674       rc = 1;
17675     }
17676     close_db(pDest);
17677   }else
17678 
17679   if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 ){
17680     if( nArg==2 ){
17681       bail_on_error = booleanValue(azArg[1]);
17682     }else{
17683       raw_printf(stderr, "Usage: .bail on|off\n");
17684       rc = 1;
17685     }
17686   }else
17687 
17688   if( c=='b' && n>=3 && strncmp(azArg[0], "binary", n)==0 ){
17689     if( nArg==2 ){
17690       if( booleanValue(azArg[1]) ){
17691         setBinaryMode(p->out, 1);
17692       }else{
17693         setTextMode(p->out, 1);
17694       }
17695     }else{
17696       raw_printf(stderr, "Usage: .binary on|off\n");
17697       rc = 1;
17698     }
17699   }else
17700 
17701   if( c=='c' && strcmp(azArg[0],"cd")==0 ){
17702     if( nArg==2 ){
17703 #if defined(_WIN32) || defined(WIN32)
17704       wchar_t *z = sqlite3_win32_utf8_to_unicode(azArg[1]);
17705       rc = !SetCurrentDirectoryW(z);
17706       sqlite3_free(z);
17707 #else
17708       rc = chdir(azArg[1]);
17709 #endif
17710       if( rc ){
17711         utf8_printf(stderr, "Cannot change to directory \"%s\"\n", azArg[1]);
17712         rc = 1;
17713       }
17714     }else{
17715       raw_printf(stderr, "Usage: .cd DIRECTORY\n");
17716       rc = 1;
17717     }
17718   }else
17719 
17720   /* The undocumented ".breakpoint" command causes a call to the no-op
17721   ** routine named test_breakpoint().
17722   */
17723   if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
17724     test_breakpoint();
17725   }else
17726 
17727   if( c=='c' && n>=3 && strncmp(azArg[0], "changes", n)==0 ){
17728     if( nArg==2 ){
17729       setOrClearFlag(p, SHFLG_CountChanges, azArg[1]);
17730     }else{
17731       raw_printf(stderr, "Usage: .changes on|off\n");
17732       rc = 1;
17733     }
17734   }else
17735 
17736   /* Cancel output redirection, if it is currently set (by .testcase)
17737   ** Then read the content of the testcase-out.txt file and compare against
17738   ** azArg[1].  If there are differences, report an error and exit.
17739   */
17740   if( c=='c' && n>=3 && strncmp(azArg[0], "check", n)==0 ){
17741     char *zRes = 0;
17742     output_reset(p);
17743     if( nArg!=2 ){
17744       raw_printf(stderr, "Usage: .check GLOB-PATTERN\n");
17745       rc = 2;
17746     }else if( (zRes = readFile("testcase-out.txt", 0))==0 ){
17747       raw_printf(stderr, "Error: cannot read 'testcase-out.txt'\n");
17748       rc = 2;
17749     }else if( testcase_glob(azArg[1],zRes)==0 ){
17750       utf8_printf(stderr,
17751                  "testcase-%s FAILED\n Expected: [%s]\n      Got: [%s]\n",
17752                  p->zTestcase, azArg[1], zRes);
17753       rc = 1;
17754     }else{
17755       utf8_printf(stdout, "testcase-%s ok\n", p->zTestcase);
17756       p->nCheck++;
17757     }
17758     sqlite3_free(zRes);
17759   }else
17760 
17761   if( c=='c' && strncmp(azArg[0], "clone", n)==0 ){
17762     if( nArg==2 ){
17763       tryToClone(p, azArg[1]);
17764     }else{
17765       raw_printf(stderr, "Usage: .clone FILENAME\n");
17766       rc = 1;
17767     }
17768   }else
17769 
17770   if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){
17771     char **azName = 0;
17772     int nName = 0;
17773     sqlite3_stmt *pStmt;
17774     int i;
17775     open_db(p, 0);
17776     rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
17777     if( rc ){
17778       utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
17779       rc = 1;
17780     }else{
17781       while( sqlite3_step(pStmt)==SQLITE_ROW ){
17782         const char *zSchema = (const char *)sqlite3_column_text(pStmt,1);
17783         const char *zFile = (const char*)sqlite3_column_text(pStmt,2);
17784         azName = sqlite3_realloc(azName, (nName+1)*2*sizeof(char*));
17785         if( azName==0 ){ shell_out_of_memory();  /* Does not return */ }
17786         azName[nName*2] = strdup(zSchema);
17787         azName[nName*2+1] = strdup(zFile);
17788         nName++;
17789       }
17790     }
17791     sqlite3_finalize(pStmt);
17792     for(i=0; i<nName; i++){
17793       int eTxn = sqlite3_txn_state(p->db, azName[i*2]);
17794       int bRdonly = sqlite3_db_readonly(p->db, azName[i*2]);
17795       const char *z = azName[i*2+1];
17796       utf8_printf(p->out, "%s: %s %s%s\n",
17797          azName[i*2],
17798          z && z[0] ? z : "\"\"",
17799          bRdonly ? "r/o" : "r/w",
17800          eTxn==SQLITE_TXN_NONE ? "" :
17801             eTxn==SQLITE_TXN_READ ? " read-txn" : " write-txn");
17802       free(azName[i*2]);
17803       free(azName[i*2+1]);
17804     }
17805     sqlite3_free(azName);
17806   }else
17807 
17808   if( c=='d' && n>=3 && strncmp(azArg[0], "dbconfig", n)==0 ){
17809     static const struct DbConfigChoices {
17810       const char *zName;
17811       int op;
17812     } aDbConfig[] = {
17813         { "defensive",          SQLITE_DBCONFIG_DEFENSIVE             },
17814         { "dqs_ddl",            SQLITE_DBCONFIG_DQS_DDL               },
17815         { "dqs_dml",            SQLITE_DBCONFIG_DQS_DML               },
17816         { "enable_fkey",        SQLITE_DBCONFIG_ENABLE_FKEY           },
17817         { "enable_qpsg",        SQLITE_DBCONFIG_ENABLE_QPSG           },
17818         { "enable_trigger",     SQLITE_DBCONFIG_ENABLE_TRIGGER        },
17819         { "enable_view",        SQLITE_DBCONFIG_ENABLE_VIEW           },
17820         { "fts3_tokenizer",     SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER },
17821         { "legacy_alter_table", SQLITE_DBCONFIG_LEGACY_ALTER_TABLE    },
17822         { "legacy_file_format", SQLITE_DBCONFIG_LEGACY_FILE_FORMAT    },
17823         { "load_extension",     SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION },
17824         { "no_ckpt_on_close",   SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE      },
17825         { "reset_database",     SQLITE_DBCONFIG_RESET_DATABASE        },
17826         { "trigger_eqp",        SQLITE_DBCONFIG_TRIGGER_EQP           },
17827         { "trusted_schema",     SQLITE_DBCONFIG_TRUSTED_SCHEMA        },
17828         { "writable_schema",    SQLITE_DBCONFIG_WRITABLE_SCHEMA       },
17829     };
17830     int ii, v;
17831     open_db(p, 0);
17832     for(ii=0; ii<ArraySize(aDbConfig); ii++){
17833       if( nArg>1 && strcmp(azArg[1], aDbConfig[ii].zName)!=0 ) continue;
17834       if( nArg>=3 ){
17835         sqlite3_db_config(p->db, aDbConfig[ii].op, booleanValue(azArg[2]), 0);
17836       }
17837       sqlite3_db_config(p->db, aDbConfig[ii].op, -1, &v);
17838       utf8_printf(p->out, "%19s %s\n", aDbConfig[ii].zName, v ? "on" : "off");
17839       if( nArg>1 ) break;
17840     }
17841     if( nArg>1 && ii==ArraySize(aDbConfig) ){
17842       utf8_printf(stderr, "Error: unknown dbconfig \"%s\"\n", azArg[1]);
17843       utf8_printf(stderr, "Enter \".dbconfig\" with no arguments for a list\n");
17844     }
17845   }else
17846 
17847   if( c=='d' && n>=3 && strncmp(azArg[0], "dbinfo", n)==0 ){
17848     rc = shell_dbinfo_command(p, nArg, azArg);
17849   }else
17850 
17851 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
17852   if( c=='r' && strncmp(azArg[0], "recover", n)==0 ){
17853     open_db(p, 0);
17854     rc = recoverDatabaseCmd(p, nArg, azArg);
17855   }else
17856 #endif /* !(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) */
17857 
17858   if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){
17859     char *zLike = 0;
17860     char *zSql;
17861     int i;
17862     int savedShowHeader = p->showHeader;
17863     int savedShellFlags = p->shellFlgs;
17864     ShellClearFlag(p,
17865        SHFLG_PreserveRowid|SHFLG_Newlines|SHFLG_Echo
17866        |SHFLG_DumpDataOnly|SHFLG_DumpNoSys);
17867     for(i=1; i<nArg; i++){
17868       if( azArg[i][0]=='-' ){
17869         const char *z = azArg[i]+1;
17870         if( z[0]=='-' ) z++;
17871         if( strcmp(z,"preserve-rowids")==0 ){
17872 #ifdef SQLITE_OMIT_VIRTUALTABLE
17873           raw_printf(stderr, "The --preserve-rowids option is not compatible"
17874                              " with SQLITE_OMIT_VIRTUALTABLE\n");
17875           rc = 1;
17876           sqlite3_free(zLike);
17877           goto meta_command_exit;
17878 #else
17879           ShellSetFlag(p, SHFLG_PreserveRowid);
17880 #endif
17881         }else
17882         if( strcmp(z,"newlines")==0 ){
17883           ShellSetFlag(p, SHFLG_Newlines);
17884         }else
17885         if( strcmp(z,"data-only")==0 ){
17886           ShellSetFlag(p, SHFLG_DumpDataOnly);
17887         }else
17888         if( strcmp(z,"nosys")==0 ){
17889           ShellSetFlag(p, SHFLG_DumpNoSys);
17890         }else
17891         {
17892           raw_printf(stderr, "Unknown option \"%s\" on \".dump\"\n", azArg[i]);
17893           rc = 1;
17894           sqlite3_free(zLike);
17895           goto meta_command_exit;
17896         }
17897       }else if( zLike ){
17898         zLike = sqlite3_mprintf("%z OR name LIKE %Q ESCAPE '\\'",
17899                 zLike, azArg[i]);
17900       }else{
17901         zLike = sqlite3_mprintf("name LIKE %Q ESCAPE '\\'", azArg[i]);
17902       }
17903     }
17904 
17905     open_db(p, 0);
17906 
17907     if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
17908       /* When playing back a "dump", the content might appear in an order
17909       ** which causes immediate foreign key constraints to be violated.
17910       ** So disable foreign-key constraint enforcement to prevent problems. */
17911       raw_printf(p->out, "PRAGMA foreign_keys=OFF;\n");
17912       raw_printf(p->out, "BEGIN TRANSACTION;\n");
17913     }
17914     p->writableSchema = 0;
17915     p->showHeader = 0;
17916     /* Set writable_schema=ON since doing so forces SQLite to initialize
17917     ** as much of the schema as it can even if the sqlite_schema table is
17918     ** corrupt. */
17919     sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
17920     p->nErr = 0;
17921     if( zLike==0 ) zLike = sqlite3_mprintf("true");
17922     zSql = sqlite3_mprintf(
17923       "SELECT name, type, sql FROM sqlite_schema "
17924       "WHERE (%s) AND type=='table'"
17925       "  AND sql NOT NULL"
17926       " ORDER BY tbl_name='sqlite_sequence', rowid",
17927       zLike
17928     );
17929     run_schema_dump_query(p,zSql);
17930     sqlite3_free(zSql);
17931     if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
17932       zSql = sqlite3_mprintf(
17933         "SELECT sql FROM sqlite_schema "
17934         "WHERE (%s) AND sql NOT NULL"
17935         "  AND type IN ('index','trigger','view')",
17936         zLike
17937       );
17938       run_table_dump_query(p, zSql);
17939       sqlite3_free(zSql);
17940     }
17941     sqlite3_free(zLike);
17942     if( p->writableSchema ){
17943       raw_printf(p->out, "PRAGMA writable_schema=OFF;\n");
17944       p->writableSchema = 0;
17945     }
17946     sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
17947     sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
17948     if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
17949       raw_printf(p->out, p->nErr?"ROLLBACK; -- due to errors\n":"COMMIT;\n");
17950     }
17951     p->showHeader = savedShowHeader;
17952     p->shellFlgs = savedShellFlags;
17953   }else
17954 
17955   if( c=='e' && strncmp(azArg[0], "echo", n)==0 ){
17956     if( nArg==2 ){
17957       setOrClearFlag(p, SHFLG_Echo, azArg[1]);
17958     }else{
17959       raw_printf(stderr, "Usage: .echo on|off\n");
17960       rc = 1;
17961     }
17962   }else
17963 
17964   if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){
17965     if( nArg==2 ){
17966       p->autoEQPtest = 0;
17967       if( p->autoEQPtrace ){
17968         if( p->db ) sqlite3_exec(p->db, "PRAGMA vdbe_trace=OFF;", 0, 0, 0);
17969         p->autoEQPtrace = 0;
17970       }
17971       if( strcmp(azArg[1],"full")==0 ){
17972         p->autoEQP = AUTOEQP_full;
17973       }else if( strcmp(azArg[1],"trigger")==0 ){
17974         p->autoEQP = AUTOEQP_trigger;
17975 #ifdef SQLITE_DEBUG
17976       }else if( strcmp(azArg[1],"test")==0 ){
17977         p->autoEQP = AUTOEQP_on;
17978         p->autoEQPtest = 1;
17979       }else if( strcmp(azArg[1],"trace")==0 ){
17980         p->autoEQP = AUTOEQP_full;
17981         p->autoEQPtrace = 1;
17982         open_db(p, 0);
17983         sqlite3_exec(p->db, "SELECT name FROM sqlite_schema LIMIT 1", 0, 0, 0);
17984         sqlite3_exec(p->db, "PRAGMA vdbe_trace=ON;", 0, 0, 0);
17985 #endif
17986       }else{
17987         p->autoEQP = (u8)booleanValue(azArg[1]);
17988       }
17989     }else{
17990       raw_printf(stderr, "Usage: .eqp off|on|trace|trigger|full\n");
17991       rc = 1;
17992     }
17993   }else
17994 
17995   if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
17996     if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
17997     rc = 2;
17998   }else
17999 
18000   /* The ".explain" command is automatic now.  It is largely pointless.  It
18001   ** retained purely for backwards compatibility */
18002   if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){
18003     int val = 1;
18004     if( nArg>=2 ){
18005       if( strcmp(azArg[1],"auto")==0 ){
18006         val = 99;
18007       }else{
18008         val =  booleanValue(azArg[1]);
18009       }
18010     }
18011     if( val==1 && p->mode!=MODE_Explain ){
18012       p->normalMode = p->mode;
18013       p->mode = MODE_Explain;
18014       p->autoExplain = 0;
18015     }else if( val==0 ){
18016       if( p->mode==MODE_Explain ) p->mode = p->normalMode;
18017       p->autoExplain = 0;
18018     }else if( val==99 ){
18019       if( p->mode==MODE_Explain ) p->mode = p->normalMode;
18020       p->autoExplain = 1;
18021     }
18022   }else
18023 
18024 #ifndef SQLITE_OMIT_VIRTUALTABLE
18025   if( c=='e' && strncmp(azArg[0], "expert", n)==0 ){
18026     open_db(p, 0);
18027     expertDotCommand(p, azArg, nArg);
18028   }else
18029 #endif
18030 
18031   if( c=='f' && strncmp(azArg[0], "filectrl", n)==0 ){
18032     static const struct {
18033        const char *zCtrlName;   /* Name of a test-control option */
18034        int ctrlCode;            /* Integer code for that option */
18035        const char *zUsage;      /* Usage notes */
18036     } aCtrl[] = {
18037       { "chunk_size",     SQLITE_FCNTL_CHUNK_SIZE,      "SIZE"           },
18038       { "data_version",   SQLITE_FCNTL_DATA_VERSION,    ""               },
18039       { "has_moved",      SQLITE_FCNTL_HAS_MOVED,       ""               },
18040       { "lock_timeout",   SQLITE_FCNTL_LOCK_TIMEOUT,    "MILLISEC"       },
18041       { "persist_wal",    SQLITE_FCNTL_PERSIST_WAL,     "[BOOLEAN]"      },
18042    /* { "pragma",         SQLITE_FCNTL_PRAGMA,          "NAME ARG"       },*/
18043       { "psow",       SQLITE_FCNTL_POWERSAFE_OVERWRITE, "[BOOLEAN]"      },
18044       { "reserve_bytes",  SQLITE_FCNTL_RESERVE_BYTES,   "[N]"            },
18045       { "size_limit",     SQLITE_FCNTL_SIZE_LIMIT,      "[LIMIT]"        },
18046       { "tempfilename",   SQLITE_FCNTL_TEMPFILENAME,    ""               },
18047    /* { "win32_av_retry", SQLITE_FCNTL_WIN32_AV_RETRY,  "COUNT DELAY"    },*/
18048     };
18049     int filectrl = -1;
18050     int iCtrl = -1;
18051     sqlite3_int64 iRes = 0;  /* Integer result to display if rc2==1 */
18052     int isOk = 0;            /* 0: usage  1: %lld  2: no-result */
18053     int n2, i;
18054     const char *zCmd = 0;
18055     const char *zSchema = 0;
18056 
18057     open_db(p, 0);
18058     zCmd = nArg>=2 ? azArg[1] : "help";
18059 
18060     if( zCmd[0]=='-'
18061      && (strcmp(zCmd,"--schema")==0 || strcmp(zCmd,"-schema")==0)
18062      && nArg>=4
18063     ){
18064       zSchema = azArg[2];
18065       for(i=3; i<nArg; i++) azArg[i-2] = azArg[i];
18066       nArg -= 2;
18067       zCmd = azArg[1];
18068     }
18069 
18070     /* The argument can optionally begin with "-" or "--" */
18071     if( zCmd[0]=='-' && zCmd[1] ){
18072       zCmd++;
18073       if( zCmd[0]=='-' && zCmd[1] ) zCmd++;
18074     }
18075 
18076     /* --help lists all file-controls */
18077     if( strcmp(zCmd,"help")==0 ){
18078       utf8_printf(p->out, "Available file-controls:\n");
18079       for(i=0; i<ArraySize(aCtrl); i++){
18080         utf8_printf(p->out, "  .filectrl %s %s\n",
18081                     aCtrl[i].zCtrlName, aCtrl[i].zUsage);
18082       }
18083       rc = 1;
18084       goto meta_command_exit;
18085     }
18086 
18087     /* convert filectrl text option to value. allow any unique prefix
18088     ** of the option name, or a numerical value. */
18089     n2 = strlen30(zCmd);
18090     for(i=0; i<ArraySize(aCtrl); i++){
18091       if( strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){
18092         if( filectrl<0 ){
18093           filectrl = aCtrl[i].ctrlCode;
18094           iCtrl = i;
18095         }else{
18096           utf8_printf(stderr, "Error: ambiguous file-control: \"%s\"\n"
18097                               "Use \".filectrl --help\" for help\n", zCmd);
18098           rc = 1;
18099           goto meta_command_exit;
18100         }
18101       }
18102     }
18103     if( filectrl<0 ){
18104       utf8_printf(stderr,"Error: unknown file-control: %s\n"
18105                          "Use \".filectrl --help\" for help\n", zCmd);
18106     }else{
18107       switch(filectrl){
18108         case SQLITE_FCNTL_SIZE_LIMIT: {
18109           if( nArg!=2 && nArg!=3 ) break;
18110           iRes = nArg==3 ? integerValue(azArg[2]) : -1;
18111           sqlite3_file_control(p->db, zSchema, SQLITE_FCNTL_SIZE_LIMIT, &iRes);
18112           isOk = 1;
18113           break;
18114         }
18115         case SQLITE_FCNTL_LOCK_TIMEOUT:
18116         case SQLITE_FCNTL_CHUNK_SIZE: {
18117           int x;
18118           if( nArg!=3 ) break;
18119           x = (int)integerValue(azArg[2]);
18120           sqlite3_file_control(p->db, zSchema, filectrl, &x);
18121           isOk = 2;
18122           break;
18123         }
18124         case SQLITE_FCNTL_PERSIST_WAL:
18125         case SQLITE_FCNTL_POWERSAFE_OVERWRITE: {
18126           int x;
18127           if( nArg!=2 && nArg!=3 ) break;
18128           x = nArg==3 ? booleanValue(azArg[2]) : -1;
18129           sqlite3_file_control(p->db, zSchema, filectrl, &x);
18130           iRes = x;
18131           isOk = 1;
18132           break;
18133         }
18134         case SQLITE_FCNTL_DATA_VERSION:
18135         case SQLITE_FCNTL_HAS_MOVED: {
18136           int x;
18137           if( nArg!=2 ) break;
18138           sqlite3_file_control(p->db, zSchema, filectrl, &x);
18139           iRes = x;
18140           isOk = 1;
18141           break;
18142         }
18143         case SQLITE_FCNTL_TEMPFILENAME: {
18144           char *z = 0;
18145           if( nArg!=2 ) break;
18146           sqlite3_file_control(p->db, zSchema, filectrl, &z);
18147           if( z ){
18148             utf8_printf(p->out, "%s\n", z);
18149             sqlite3_free(z);
18150           }
18151           isOk = 2;
18152           break;
18153         }
18154         case SQLITE_FCNTL_RESERVE_BYTES: {
18155           int x;
18156           if( nArg>=3 ){
18157             x = atoi(azArg[2]);
18158             sqlite3_file_control(p->db, zSchema, filectrl, &x);
18159           }
18160           x = -1;
18161           sqlite3_file_control(p->db, zSchema, filectrl, &x);
18162           utf8_printf(p->out,"%d\n", x);
18163           isOk = 2;
18164           break;
18165         }
18166       }
18167     }
18168     if( isOk==0 && iCtrl>=0 ){
18169       utf8_printf(p->out, "Usage: .filectrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage);
18170       rc = 1;
18171     }else if( isOk==1 ){
18172       char zBuf[100];
18173       sqlite3_snprintf(sizeof(zBuf), zBuf, "%lld", iRes);
18174       raw_printf(p->out, "%s\n", zBuf);
18175     }
18176   }else
18177 
18178   if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){
18179     ShellState data;
18180     char *zErrMsg = 0;
18181     int doStats = 0;
18182     memcpy(&data, p, sizeof(data));
18183     data.showHeader = 0;
18184     data.cMode = data.mode = MODE_Semi;
18185     if( nArg==2 && optionMatch(azArg[1], "indent") ){
18186       data.cMode = data.mode = MODE_Pretty;
18187       nArg = 1;
18188     }
18189     if( nArg!=1 ){
18190       raw_printf(stderr, "Usage: .fullschema ?--indent?\n");
18191       rc = 1;
18192       goto meta_command_exit;
18193     }
18194     open_db(p, 0);
18195     rc = sqlite3_exec(p->db,
18196        "SELECT sql FROM"
18197        "  (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
18198        "     FROM sqlite_schema UNION ALL"
18199        "   SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_schema) "
18200        "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
18201        "ORDER BY rowid",
18202        callback, &data, &zErrMsg
18203     );
18204     if( rc==SQLITE_OK ){
18205       sqlite3_stmt *pStmt;
18206       rc = sqlite3_prepare_v2(p->db,
18207                "SELECT rowid FROM sqlite_schema"
18208                " WHERE name GLOB 'sqlite_stat[134]'",
18209                -1, &pStmt, 0);
18210       doStats = sqlite3_step(pStmt)==SQLITE_ROW;
18211       sqlite3_finalize(pStmt);
18212     }
18213     if( doStats==0 ){
18214       raw_printf(p->out, "/* No STAT tables available */\n");
18215     }else{
18216       raw_printf(p->out, "ANALYZE sqlite_schema;\n");
18217       sqlite3_exec(p->db, "SELECT 'ANALYZE sqlite_schema'",
18218                    callback, &data, &zErrMsg);
18219       data.cMode = data.mode = MODE_Insert;
18220       data.zDestTable = "sqlite_stat1";
18221       shell_exec(&data, "SELECT * FROM sqlite_stat1", &zErrMsg);
18222       data.zDestTable = "sqlite_stat4";
18223       shell_exec(&data, "SELECT * FROM sqlite_stat4", &zErrMsg);
18224       raw_printf(p->out, "ANALYZE sqlite_schema;\n");
18225     }
18226   }else
18227 
18228   if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){
18229     if( nArg==2 ){
18230       p->showHeader = booleanValue(azArg[1]);
18231       p->shellFlgs |= SHFLG_HeaderSet;
18232     }else{
18233       raw_printf(stderr, "Usage: .headers on|off\n");
18234       rc = 1;
18235     }
18236   }else
18237 
18238   if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
18239     if( nArg>=2 ){
18240       n = showHelp(p->out, azArg[1]);
18241       if( n==0 ){
18242         utf8_printf(p->out, "Nothing matches '%s'\n", azArg[1]);
18243       }
18244     }else{
18245       showHelp(p->out, 0);
18246     }
18247   }else
18248 
18249   if( c=='i' && strncmp(azArg[0], "import", n)==0 ){
18250     char *zTable = 0;           /* Insert data into this table */
18251     char *zFile = 0;            /* Name of file to extra content from */
18252     sqlite3_stmt *pStmt = NULL; /* A statement */
18253     int nCol;                   /* Number of columns in the table */
18254     int nByte;                  /* Number of bytes in an SQL string */
18255     int i, j;                   /* Loop counters */
18256     int needCommit;             /* True to COMMIT or ROLLBACK at end */
18257     int nSep;                   /* Number of bytes in p->colSeparator[] */
18258     char *zSql;                 /* An SQL statement */
18259     ImportCtx sCtx;             /* Reader context */
18260     char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */
18261     int eVerbose = 0;           /* Larger for more console output */
18262     int nSkip = 0;              /* Initial lines to skip */
18263     int useOutputMode = 1;      /* Use output mode to determine separators */
18264 
18265     memset(&sCtx, 0, sizeof(sCtx));
18266     if( p->mode==MODE_Ascii ){
18267       xRead = ascii_read_one_field;
18268     }else{
18269       xRead = csv_read_one_field;
18270     }
18271     for(i=1; i<nArg; i++){
18272       char *z = azArg[i];
18273       if( z[0]=='-' && z[1]=='-' ) z++;
18274       if( z[0]!='-' ){
18275         if( zFile==0 ){
18276           zFile = z;
18277         }else if( zTable==0 ){
18278           zTable = z;
18279         }else{
18280           utf8_printf(p->out, "ERROR: extra argument: \"%s\".  Usage:\n", z);
18281           showHelp(p->out, "import");
18282           rc = 1;
18283           goto meta_command_exit;
18284         }
18285       }else if( strcmp(z,"-v")==0 ){
18286         eVerbose++;
18287       }else if( strcmp(z,"-skip")==0 && i<nArg-1 ){
18288         nSkip = integerValue(azArg[++i]);
18289       }else if( strcmp(z,"-ascii")==0 ){
18290         sCtx.cColSep = SEP_Unit[0];
18291         sCtx.cRowSep = SEP_Record[0];
18292         xRead = ascii_read_one_field;
18293         useOutputMode = 0;
18294       }else if( strcmp(z,"-csv")==0 ){
18295         sCtx.cColSep = ',';
18296         sCtx.cRowSep = '\n';
18297         xRead = csv_read_one_field;
18298         useOutputMode = 0;
18299       }else{
18300         utf8_printf(p->out, "ERROR: unknown option: \"%s\".  Usage:\n", z);
18301         showHelp(p->out, "import");
18302         rc = 1;
18303         goto meta_command_exit;
18304       }
18305     }
18306     if( zTable==0 ){
18307       utf8_printf(p->out, "ERROR: missing %s argument. Usage:\n",
18308                   zFile==0 ? "FILE" : "TABLE");
18309       showHelp(p->out, "import");
18310       rc = 1;
18311       goto meta_command_exit;
18312     }
18313     seenInterrupt = 0;
18314     open_db(p, 0);
18315     if( useOutputMode ){
18316       /* If neither the --csv or --ascii options are specified, then set
18317       ** the column and row separator characters from the output mode. */
18318       nSep = strlen30(p->colSeparator);
18319       if( nSep==0 ){
18320         raw_printf(stderr,
18321                    "Error: non-null column separator required for import\n");
18322         rc = 1;
18323         goto meta_command_exit;
18324       }
18325       if( nSep>1 ){
18326         raw_printf(stderr,
18327               "Error: multi-character column separators not allowed"
18328               " for import\n");
18329         rc = 1;
18330         goto meta_command_exit;
18331       }
18332       nSep = strlen30(p->rowSeparator);
18333       if( nSep==0 ){
18334         raw_printf(stderr,
18335             "Error: non-null row separator required for import\n");
18336         rc = 1;
18337         goto meta_command_exit;
18338       }
18339       if( nSep==2 && p->mode==MODE_Csv && strcmp(p->rowSeparator,SEP_CrLf)==0 ){
18340         /* When importing CSV (only), if the row separator is set to the
18341         ** default output row separator, change it to the default input
18342         ** row separator.  This avoids having to maintain different input
18343         ** and output row separators. */
18344         sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
18345         nSep = strlen30(p->rowSeparator);
18346       }
18347       if( nSep>1 ){
18348         raw_printf(stderr, "Error: multi-character row separators not allowed"
18349                            " for import\n");
18350         rc = 1;
18351         goto meta_command_exit;
18352       }
18353       sCtx.cColSep = p->colSeparator[0];
18354       sCtx.cRowSep = p->rowSeparator[0];
18355     }
18356     sCtx.zFile = zFile;
18357     sCtx.nLine = 1;
18358     if( sCtx.zFile[0]=='|' ){
18359 #ifdef SQLITE_OMIT_POPEN
18360       raw_printf(stderr, "Error: pipes are not supported in this OS\n");
18361       rc = 1;
18362       goto meta_command_exit;
18363 #else
18364       sCtx.in = popen(sCtx.zFile+1, "r");
18365       sCtx.zFile = "<pipe>";
18366       sCtx.xCloser = pclose;
18367 #endif
18368     }else{
18369       sCtx.in = fopen(sCtx.zFile, "rb");
18370       sCtx.xCloser = fclose;
18371     }
18372     if( sCtx.in==0 ){
18373       utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
18374       rc = 1;
18375       goto meta_command_exit;
18376     }
18377     if( eVerbose>=2 || (eVerbose>=1 && useOutputMode) ){
18378       char zSep[2];
18379       zSep[1] = 0;
18380       zSep[0] = sCtx.cColSep;
18381       utf8_printf(p->out, "Column separator ");
18382       output_c_string(p->out, zSep);
18383       utf8_printf(p->out, ", row separator ");
18384       zSep[0] = sCtx.cRowSep;
18385       output_c_string(p->out, zSep);
18386       utf8_printf(p->out, "\n");
18387     }
18388     while( (nSkip--)>0 ){
18389       while( xRead(&sCtx) && sCtx.cTerm==sCtx.cColSep ){}
18390     }
18391     zSql = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
18392     if( zSql==0 ){
18393       import_cleanup(&sCtx);
18394       shell_out_of_memory();
18395     }
18396     nByte = strlen30(zSql);
18397     rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
18398     import_append_char(&sCtx, 0);    /* To ensure sCtx.z is allocated */
18399     if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(p->db))==0 ){
18400       char *zCreate = sqlite3_mprintf("CREATE TABLE \"%w\"", zTable);
18401       char cSep = '(';
18402       while( xRead(&sCtx) ){
18403         zCreate = sqlite3_mprintf("%z%c\n  \"%w\" TEXT", zCreate, cSep, sCtx.z);
18404         cSep = ',';
18405         if( sCtx.cTerm!=sCtx.cColSep ) break;
18406       }
18407       if( cSep=='(' ){
18408         sqlite3_free(zCreate);
18409         import_cleanup(&sCtx);
18410         utf8_printf(stderr,"%s: empty file\n", sCtx.zFile);
18411         rc = 1;
18412         goto meta_command_exit;
18413       }
18414       zCreate = sqlite3_mprintf("%z\n)", zCreate);
18415       if( eVerbose>=1 ){
18416         utf8_printf(p->out, "%s\n", zCreate);
18417       }
18418       rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
18419       sqlite3_free(zCreate);
18420       if( rc ){
18421         utf8_printf(stderr, "CREATE TABLE \"%s\"(...) failed: %s\n", zTable,
18422                 sqlite3_errmsg(p->db));
18423         import_cleanup(&sCtx);
18424         rc = 1;
18425         goto meta_command_exit;
18426       }
18427       rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
18428     }
18429     sqlite3_free(zSql);
18430     if( rc ){
18431       if (pStmt) sqlite3_finalize(pStmt);
18432       utf8_printf(stderr,"Error: %s\n", sqlite3_errmsg(p->db));
18433       import_cleanup(&sCtx);
18434       rc = 1;
18435       goto meta_command_exit;
18436     }
18437     nCol = sqlite3_column_count(pStmt);
18438     sqlite3_finalize(pStmt);
18439     pStmt = 0;
18440     if( nCol==0 ) return 0; /* no columns, no error */
18441     zSql = sqlite3_malloc64( nByte*2 + 20 + nCol*2 );
18442     if( zSql==0 ){
18443       import_cleanup(&sCtx);
18444       shell_out_of_memory();
18445     }
18446     sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
18447     j = strlen30(zSql);
18448     for(i=1; i<nCol; i++){
18449       zSql[j++] = ',';
18450       zSql[j++] = '?';
18451     }
18452     zSql[j++] = ')';
18453     zSql[j] = 0;
18454     if( eVerbose>=2 ){
18455       utf8_printf(p->out, "Insert using: %s\n", zSql);
18456     }
18457     rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
18458     sqlite3_free(zSql);
18459     if( rc ){
18460       utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
18461       if (pStmt) sqlite3_finalize(pStmt);
18462       import_cleanup(&sCtx);
18463       rc = 1;
18464       goto meta_command_exit;
18465     }
18466     needCommit = sqlite3_get_autocommit(p->db);
18467     if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
18468     do{
18469       int startLine = sCtx.nLine;
18470       for(i=0; i<nCol; i++){
18471         char *z = xRead(&sCtx);
18472         /*
18473         ** Did we reach end-of-file before finding any columns?
18474         ** If so, stop instead of NULL filling the remaining columns.
18475         */
18476         if( z==0 && i==0 ) break;
18477         /*
18478         ** Did we reach end-of-file OR end-of-line before finding any
18479         ** columns in ASCII mode?  If so, stop instead of NULL filling
18480         ** the remaining columns.
18481         */
18482         if( p->mode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break;
18483         sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
18484         if( i<nCol-1 && sCtx.cTerm!=sCtx.cColSep ){
18485           utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
18486                           "filling the rest with NULL\n",
18487                           sCtx.zFile, startLine, nCol, i+1);
18488           i += 2;
18489           while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; }
18490         }
18491       }
18492       if( sCtx.cTerm==sCtx.cColSep ){
18493         do{
18494           xRead(&sCtx);
18495           i++;
18496         }while( sCtx.cTerm==sCtx.cColSep );
18497         utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
18498                         "extras ignored\n",
18499                         sCtx.zFile, startLine, nCol, i);
18500       }
18501       if( i>=nCol ){
18502         sqlite3_step(pStmt);
18503         rc = sqlite3_reset(pStmt);
18504         if( rc!=SQLITE_OK ){
18505           utf8_printf(stderr, "%s:%d: INSERT failed: %s\n", sCtx.zFile,
18506                       startLine, sqlite3_errmsg(p->db));
18507           sCtx.nErr++;
18508         }else{
18509           sCtx.nRow++;
18510         }
18511       }
18512     }while( sCtx.cTerm!=EOF );
18513 
18514     import_cleanup(&sCtx);
18515     sqlite3_finalize(pStmt);
18516     if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0);
18517     if( eVerbose>0 ){
18518       utf8_printf(p->out,
18519           "Added %d rows with %d errors using %d lines of input\n",
18520           sCtx.nRow, sCtx.nErr, sCtx.nLine-1);
18521     }
18522   }else
18523 
18524 #ifndef SQLITE_UNTESTABLE
18525   if( c=='i' && strncmp(azArg[0], "imposter", n)==0 ){
18526     char *zSql;
18527     char *zCollist = 0;
18528     sqlite3_stmt *pStmt;
18529     int tnum = 0;
18530     int isWO = 0;  /* True if making an imposter of a WITHOUT ROWID table */
18531     int lenPK = 0; /* Length of the PRIMARY KEY string for isWO tables */
18532     int i;
18533     if( !(nArg==3 || (nArg==2 && sqlite3_stricmp(azArg[1],"off")==0)) ){
18534       utf8_printf(stderr, "Usage: .imposter INDEX IMPOSTER\n"
18535                           "       .imposter off\n");
18536       /* Also allowed, but not documented:
18537       **
18538       **    .imposter TABLE IMPOSTER
18539       **
18540       ** where TABLE is a WITHOUT ROWID table.  In that case, the
18541       ** imposter is another WITHOUT ROWID table with the columns in
18542       ** storage order. */
18543       rc = 1;
18544       goto meta_command_exit;
18545     }
18546     open_db(p, 0);
18547     if( nArg==2 ){
18548       sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 1);
18549       goto meta_command_exit;
18550     }
18551     zSql = sqlite3_mprintf(
18552       "SELECT rootpage, 0 FROM sqlite_schema"
18553       " WHERE name='%q' AND type='index'"
18554       "UNION ALL "
18555       "SELECT rootpage, 1 FROM sqlite_schema"
18556       " WHERE name='%q' AND type='table'"
18557       "   AND sql LIKE '%%without%%rowid%%'",
18558       azArg[1], azArg[1]
18559     );
18560     sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
18561     sqlite3_free(zSql);
18562     if( sqlite3_step(pStmt)==SQLITE_ROW ){
18563       tnum = sqlite3_column_int(pStmt, 0);
18564       isWO = sqlite3_column_int(pStmt, 1);
18565     }
18566     sqlite3_finalize(pStmt);
18567     zSql = sqlite3_mprintf("PRAGMA index_xinfo='%q'", azArg[1]);
18568     rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
18569     sqlite3_free(zSql);
18570     i = 0;
18571     while( sqlite3_step(pStmt)==SQLITE_ROW ){
18572       char zLabel[20];
18573       const char *zCol = (const char*)sqlite3_column_text(pStmt,2);
18574       i++;
18575       if( zCol==0 ){
18576         if( sqlite3_column_int(pStmt,1)==-1 ){
18577           zCol = "_ROWID_";
18578         }else{
18579           sqlite3_snprintf(sizeof(zLabel),zLabel,"expr%d",i);
18580           zCol = zLabel;
18581         }
18582       }
18583       if( isWO && lenPK==0 && sqlite3_column_int(pStmt,5)==0 && zCollist ){
18584         lenPK = (int)strlen(zCollist);
18585       }
18586       if( zCollist==0 ){
18587         zCollist = sqlite3_mprintf("\"%w\"", zCol);
18588       }else{
18589         zCollist = sqlite3_mprintf("%z,\"%w\"", zCollist, zCol);
18590       }
18591     }
18592     sqlite3_finalize(pStmt);
18593     if( i==0 || tnum==0 ){
18594       utf8_printf(stderr, "no such index: \"%s\"\n", azArg[1]);
18595       rc = 1;
18596       sqlite3_free(zCollist);
18597       goto meta_command_exit;
18598     }
18599     if( lenPK==0 ) lenPK = 100000;
18600     zSql = sqlite3_mprintf(
18601           "CREATE TABLE \"%w\"(%s,PRIMARY KEY(%.*s))WITHOUT ROWID",
18602           azArg[2], zCollist, lenPK, zCollist);
18603     sqlite3_free(zCollist);
18604     rc = sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 1, tnum);
18605     if( rc==SQLITE_OK ){
18606       rc = sqlite3_exec(p->db, zSql, 0, 0, 0);
18607       sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 0);
18608       if( rc ){
18609         utf8_printf(stderr, "Error in [%s]: %s\n", zSql, sqlite3_errmsg(p->db));
18610       }else{
18611         utf8_printf(stdout, "%s;\n", zSql);
18612         raw_printf(stdout,
18613           "WARNING: writing to an imposter table will corrupt the \"%s\" %s!\n",
18614           azArg[1], isWO ? "table" : "index"
18615         );
18616       }
18617     }else{
18618       raw_printf(stderr, "SQLITE_TESTCTRL_IMPOSTER returns %d\n", rc);
18619       rc = 1;
18620     }
18621     sqlite3_free(zSql);
18622   }else
18623 #endif /* !defined(SQLITE_OMIT_TEST_CONTROL) */
18624 
18625 #ifdef SQLITE_ENABLE_IOTRACE
18626   if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
18627     SQLITE_API extern void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...);
18628     if( iotrace && iotrace!=stdout ) fclose(iotrace);
18629     iotrace = 0;
18630     if( nArg<2 ){
18631       sqlite3IoTrace = 0;
18632     }else if( strcmp(azArg[1], "-")==0 ){
18633       sqlite3IoTrace = iotracePrintf;
18634       iotrace = stdout;
18635     }else{
18636       iotrace = fopen(azArg[1], "w");
18637       if( iotrace==0 ){
18638         utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
18639         sqlite3IoTrace = 0;
18640         rc = 1;
18641       }else{
18642         sqlite3IoTrace = iotracePrintf;
18643       }
18644     }
18645   }else
18646 #endif
18647 
18648   if( c=='l' && n>=5 && strncmp(azArg[0], "limits", n)==0 ){
18649     static const struct {
18650        const char *zLimitName;   /* Name of a limit */
18651        int limitCode;            /* Integer code for that limit */
18652     } aLimit[] = {
18653       { "length",                SQLITE_LIMIT_LENGTH                    },
18654       { "sql_length",            SQLITE_LIMIT_SQL_LENGTH                },
18655       { "column",                SQLITE_LIMIT_COLUMN                    },
18656       { "expr_depth",            SQLITE_LIMIT_EXPR_DEPTH                },
18657       { "compound_select",       SQLITE_LIMIT_COMPOUND_SELECT           },
18658       { "vdbe_op",               SQLITE_LIMIT_VDBE_OP                   },
18659       { "function_arg",          SQLITE_LIMIT_FUNCTION_ARG              },
18660       { "attached",              SQLITE_LIMIT_ATTACHED                  },
18661       { "like_pattern_length",   SQLITE_LIMIT_LIKE_PATTERN_LENGTH       },
18662       { "variable_number",       SQLITE_LIMIT_VARIABLE_NUMBER           },
18663       { "trigger_depth",         SQLITE_LIMIT_TRIGGER_DEPTH             },
18664       { "worker_threads",        SQLITE_LIMIT_WORKER_THREADS            },
18665     };
18666     int i, n2;
18667     open_db(p, 0);
18668     if( nArg==1 ){
18669       for(i=0; i<ArraySize(aLimit); i++){
18670         printf("%20s %d\n", aLimit[i].zLimitName,
18671                sqlite3_limit(p->db, aLimit[i].limitCode, -1));
18672       }
18673     }else if( nArg>3 ){
18674       raw_printf(stderr, "Usage: .limit NAME ?NEW-VALUE?\n");
18675       rc = 1;
18676       goto meta_command_exit;
18677     }else{
18678       int iLimit = -1;
18679       n2 = strlen30(azArg[1]);
18680       for(i=0; i<ArraySize(aLimit); i++){
18681         if( sqlite3_strnicmp(aLimit[i].zLimitName, azArg[1], n2)==0 ){
18682           if( iLimit<0 ){
18683             iLimit = i;
18684           }else{
18685             utf8_printf(stderr, "ambiguous limit: \"%s\"\n", azArg[1]);
18686             rc = 1;
18687             goto meta_command_exit;
18688           }
18689         }
18690       }
18691       if( iLimit<0 ){
18692         utf8_printf(stderr, "unknown limit: \"%s\"\n"
18693                         "enter \".limits\" with no arguments for a list.\n",
18694                          azArg[1]);
18695         rc = 1;
18696         goto meta_command_exit;
18697       }
18698       if( nArg==3 ){
18699         sqlite3_limit(p->db, aLimit[iLimit].limitCode,
18700                       (int)integerValue(azArg[2]));
18701       }
18702       printf("%20s %d\n", aLimit[iLimit].zLimitName,
18703              sqlite3_limit(p->db, aLimit[iLimit].limitCode, -1));
18704     }
18705   }else
18706 
18707   if( c=='l' && n>2 && strncmp(azArg[0], "lint", n)==0 ){
18708     open_db(p, 0);
18709     lintDotCommand(p, azArg, nArg);
18710   }else
18711 
18712 #ifndef SQLITE_OMIT_LOAD_EXTENSION
18713   if( c=='l' && strncmp(azArg[0], "load", n)==0 ){
18714     const char *zFile, *zProc;
18715     char *zErrMsg = 0;
18716     if( nArg<2 ){
18717       raw_printf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n");
18718       rc = 1;
18719       goto meta_command_exit;
18720     }
18721     zFile = azArg[1];
18722     zProc = nArg>=3 ? azArg[2] : 0;
18723     open_db(p, 0);
18724     rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
18725     if( rc!=SQLITE_OK ){
18726       utf8_printf(stderr, "Error: %s\n", zErrMsg);
18727       sqlite3_free(zErrMsg);
18728       rc = 1;
18729     }
18730   }else
18731 #endif
18732 
18733   if( c=='l' && strncmp(azArg[0], "log", n)==0 ){
18734     if( nArg!=2 ){
18735       raw_printf(stderr, "Usage: .log FILENAME\n");
18736       rc = 1;
18737     }else{
18738       const char *zFile = azArg[1];
18739       output_file_close(p->pLog);
18740       p->pLog = output_file_open(zFile, 0);
18741     }
18742   }else
18743 
18744   if( c=='m' && strncmp(azArg[0], "mode", n)==0 ){
18745     const char *zMode = nArg>=2 ? azArg[1] : "";
18746     int n2 = strlen30(zMode);
18747     int c2 = zMode[0];
18748     if( c2=='l' && n2>2 && strncmp(azArg[1],"lines",n2)==0 ){
18749       p->mode = MODE_Line;
18750       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
18751     }else if( c2=='c' && strncmp(azArg[1],"columns",n2)==0 ){
18752       p->mode = MODE_Column;
18753       if( (p->shellFlgs & SHFLG_HeaderSet)==0 ){
18754         p->showHeader = 1;
18755       }
18756       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
18757     }else if( c2=='l' && n2>2 && strncmp(azArg[1],"list",n2)==0 ){
18758       p->mode = MODE_List;
18759       sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Column);
18760       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
18761     }else if( c2=='h' && strncmp(azArg[1],"html",n2)==0 ){
18762       p->mode = MODE_Html;
18763     }else if( c2=='t' && strncmp(azArg[1],"tcl",n2)==0 ){
18764       p->mode = MODE_Tcl;
18765       sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Space);
18766       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
18767     }else if( c2=='c' && strncmp(azArg[1],"csv",n2)==0 ){
18768       p->mode = MODE_Csv;
18769       sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
18770       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
18771     }else if( c2=='t' && strncmp(azArg[1],"tabs",n2)==0 ){
18772       p->mode = MODE_List;
18773       sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Tab);
18774     }else if( c2=='i' && strncmp(azArg[1],"insert",n2)==0 ){
18775       p->mode = MODE_Insert;
18776       set_table_name(p, nArg>=3 ? azArg[2] : "table");
18777     }else if( c2=='q' && strncmp(azArg[1],"quote",n2)==0 ){
18778       p->mode = MODE_Quote;
18779       sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
18780       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
18781     }else if( c2=='a' && strncmp(azArg[1],"ascii",n2)==0 ){
18782       p->mode = MODE_Ascii;
18783       sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit);
18784       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record);
18785     }else if( c2=='m' && strncmp(azArg[1],"markdown",n2)==0 ){
18786       p->mode = MODE_Markdown;
18787     }else if( c2=='t' && strncmp(azArg[1],"table",n2)==0 ){
18788       p->mode = MODE_Table;
18789     }else if( c2=='b' && strncmp(azArg[1],"box",n2)==0 ){
18790       p->mode = MODE_Box;
18791     }else if( c2=='j' && strncmp(azArg[1],"json",n2)==0 ){
18792       p->mode = MODE_Json;
18793     }else if( nArg==1 ){
18794       raw_printf(p->out, "current output mode: %s\n", modeDescr[p->mode]);
18795     }else{
18796       raw_printf(stderr, "Error: mode should be one of: "
18797          "ascii box column csv html insert json line list markdown "
18798          "quote table tabs tcl\n");
18799       rc = 1;
18800     }
18801     p->cMode = p->mode;
18802   }else
18803 
18804   if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){
18805     if( nArg==2 ){
18806       sqlite3_snprintf(sizeof(p->nullValue), p->nullValue,
18807                        "%.*s", (int)ArraySize(p->nullValue)-1, azArg[1]);
18808     }else{
18809       raw_printf(stderr, "Usage: .nullvalue STRING\n");
18810       rc = 1;
18811     }
18812   }else
18813 
18814 #ifdef SQLITE_DEBUG
18815   if( c=='o' && strcmp(azArg[0],"oom")==0 ){
18816     int i;
18817     for(i=1; i<nArg; i++){
18818       const char *z = azArg[i];
18819       if( z[0]=='-' && z[1]=='-' ) z++;
18820       if( strcmp(z,"-repeat")==0 ){
18821         if( i==nArg-1 ){
18822           raw_printf(p->out, "missing argument on \"%s\"\n", azArg[i]);
18823           rc = 1;
18824         }else{
18825           oomRepeat = (int)integerValue(azArg[++i]);
18826         }
18827       }else if( IsDigit(z[0]) ){
18828         oomCounter = (int)integerValue(azArg[i]);
18829       }else{
18830         raw_printf(p->out, "unknown argument: \"%s\"\n", azArg[i]);
18831         raw_printf(p->out, "Usage: .oom [--repeat N] [M]\n");
18832         rc = 1;
18833       }
18834     }
18835     if( rc==0 ){
18836       raw_printf(p->out, "oomCounter = %d\n", oomCounter);
18837       raw_printf(p->out, "oomRepeat  = %d\n", oomRepeat);
18838     }
18839   }else
18840 #endif /* SQLITE_DEBUG */
18841 
18842   if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
18843     char *zNewFilename = 0;  /* Name of the database file to open */
18844     int iName = 1;           /* Index in azArg[] of the filename */
18845     int newFlag = 0;         /* True to delete file before opening */
18846     /* Close the existing database */
18847     session_close_all(p);
18848     close_db(p->db);
18849     p->db = 0;
18850     p->zDbFilename = 0;
18851     sqlite3_free(p->zFreeOnClose);
18852     p->zFreeOnClose = 0;
18853     p->openMode = SHELL_OPEN_UNSPEC;
18854     p->openFlags = 0;
18855     p->szMax = 0;
18856     /* Check for command-line arguments */
18857     for(iName=1; iName<nArg; iName++){
18858       const char *z = azArg[iName];
18859       if( optionMatch(z,"new") ){
18860         newFlag = 1;
18861 #ifdef SQLITE_HAVE_ZLIB
18862       }else if( optionMatch(z, "zip") ){
18863         p->openMode = SHELL_OPEN_ZIPFILE;
18864 #endif
18865       }else if( optionMatch(z, "append") ){
18866         p->openMode = SHELL_OPEN_APPENDVFS;
18867       }else if( optionMatch(z, "readonly") ){
18868         p->openMode = SHELL_OPEN_READONLY;
18869       }else if( optionMatch(z, "nofollow") ){
18870         p->openFlags |= SQLITE_OPEN_NOFOLLOW;
18871 #ifdef SQLITE_ENABLE_DESERIALIZE
18872       }else if( optionMatch(z, "deserialize") ){
18873         p->openMode = SHELL_OPEN_DESERIALIZE;
18874       }else if( optionMatch(z, "hexdb") ){
18875         p->openMode = SHELL_OPEN_HEXDB;
18876       }else if( optionMatch(z, "maxsize") && iName+1<nArg ){
18877         p->szMax = integerValue(azArg[++iName]);
18878 #endif /* SQLITE_ENABLE_DESERIALIZE */
18879       }else if( z[0]=='-' ){
18880         utf8_printf(stderr, "unknown option: %s\n", z);
18881         rc = 1;
18882         goto meta_command_exit;
18883       }else if( zNewFilename ){
18884         utf8_printf(stderr, "extra argument: \"%s\"\n", z);
18885         rc = 1;
18886         goto meta_command_exit;
18887       }else{
18888         zNewFilename = sqlite3_mprintf("%s", z);
18889       }
18890     }
18891     /* If a filename is specified, try to open it first */
18892     if( zNewFilename || p->openMode==SHELL_OPEN_HEXDB ){
18893       if( newFlag ) shellDeleteFile(zNewFilename);
18894       p->zDbFilename = zNewFilename;
18895       open_db(p, OPEN_DB_KEEPALIVE);
18896       if( p->db==0 ){
18897         utf8_printf(stderr, "Error: cannot open '%s'\n", zNewFilename);
18898         sqlite3_free(zNewFilename);
18899       }else{
18900         p->zFreeOnClose = zNewFilename;
18901       }
18902     }
18903     if( p->db==0 ){
18904       /* As a fall-back open a TEMP database */
18905       p->zDbFilename = 0;
18906       open_db(p, 0);
18907     }
18908   }else
18909 
18910   if( (c=='o'
18911         && (strncmp(azArg[0], "output", n)==0||strncmp(azArg[0], "once", n)==0))
18912    || (c=='e' && n==5 && strcmp(azArg[0],"excel")==0)
18913   ){
18914     char *zFile = 0;
18915     int bTxtMode = 0;
18916     int i;
18917     int eMode = 0;
18918     int bBOM = 0;
18919     int bOnce = 0;  /* 0: .output, 1: .once, 2: .excel */
18920 
18921     if( c=='e' ){
18922       eMode = 'x';
18923       bOnce = 2;
18924     }else if( strncmp(azArg[0],"once",n)==0 ){
18925       bOnce = 1;
18926     }
18927     for(i=1; i<nArg; i++){
18928       char *z = azArg[i];
18929       if( z[0]=='-' ){
18930         if( z[1]=='-' ) z++;
18931         if( strcmp(z,"-bom")==0 ){
18932           bBOM = 1;
18933         }else if( c!='e' && strcmp(z,"-x")==0 ){
18934           eMode = 'x';  /* spreadsheet */
18935         }else if( c!='e' && strcmp(z,"-e")==0 ){
18936           eMode = 'e';  /* text editor */
18937         }else{
18938           utf8_printf(p->out, "ERROR: unknown option: \"%s\".  Usage:\n",
18939                       azArg[i]);
18940           showHelp(p->out, azArg[0]);
18941           rc = 1;
18942           goto meta_command_exit;
18943         }
18944       }else if( zFile==0 && eMode!='e' && eMode!='x' ){
18945         zFile = sqlite3_mprintf("%s", z);
18946         if( zFile[0]=='|' ){
18947           while( i+1<nArg ) zFile = sqlite3_mprintf("%z %s", zFile, azArg[++i]);
18948           break;
18949         }
18950       }else{
18951         utf8_printf(p->out,"ERROR: extra parameter: \"%s\".  Usage:\n",
18952                     azArg[i]);
18953         showHelp(p->out, azArg[0]);
18954         rc = 1;
18955         sqlite3_free(zFile);
18956         goto meta_command_exit;
18957       }
18958     }
18959     if( zFile==0 ) zFile = sqlite3_mprintf("stdout");
18960     if( bOnce ){
18961       p->outCount = 2;
18962     }else{
18963       p->outCount = 0;
18964     }
18965     output_reset(p);
18966 #ifndef SQLITE_NOHAVE_SYSTEM
18967     if( eMode=='e' || eMode=='x' ){
18968       p->doXdgOpen = 1;
18969       outputModePush(p);
18970       if( eMode=='x' ){
18971         /* spreadsheet mode.  Output as CSV. */
18972         newTempFile(p, "csv");
18973         ShellClearFlag(p, SHFLG_Echo);
18974         p->mode = MODE_Csv;
18975         sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
18976         sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
18977       }else{
18978         /* text editor mode */
18979         newTempFile(p, "txt");
18980         bTxtMode = 1;
18981       }
18982       sqlite3_free(zFile);
18983       zFile = sqlite3_mprintf("%s", p->zTempFile);
18984     }
18985 #endif /* SQLITE_NOHAVE_SYSTEM */
18986     if( zFile[0]=='|' ){
18987 #ifdef SQLITE_OMIT_POPEN
18988       raw_printf(stderr, "Error: pipes are not supported in this OS\n");
18989       rc = 1;
18990       p->out = stdout;
18991 #else
18992       p->out = popen(zFile + 1, "w");
18993       if( p->out==0 ){
18994         utf8_printf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1);
18995         p->out = stdout;
18996         rc = 1;
18997       }else{
18998         if( bBOM ) fprintf(p->out,"\357\273\277");
18999         sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
19000       }
19001 #endif
19002     }else{
19003       p->out = output_file_open(zFile, bTxtMode);
19004       if( p->out==0 ){
19005         if( strcmp(zFile,"off")!=0 ){
19006           utf8_printf(stderr,"Error: cannot write to \"%s\"\n", zFile);
19007         }
19008         p->out = stdout;
19009         rc = 1;
19010       } else {
19011         if( bBOM ) fprintf(p->out,"\357\273\277");
19012         sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
19013       }
19014     }
19015     sqlite3_free(zFile);
19016   }else
19017 
19018   if( c=='p' && n>=3 && strncmp(azArg[0], "parameter", n)==0 ){
19019     open_db(p,0);
19020     if( nArg<=1 ) goto parameter_syntax_error;
19021 
19022     /* .parameter clear
19023     ** Clear all bind parameters by dropping the TEMP table that holds them.
19024     */
19025     if( nArg==2 && strcmp(azArg[1],"clear")==0 ){
19026       sqlite3_exec(p->db, "DROP TABLE IF EXISTS temp.sqlite_parameters;",
19027                    0, 0, 0);
19028     }else
19029 
19030     /* .parameter list
19031     ** List all bind parameters.
19032     */
19033     if( nArg==2 && strcmp(azArg[1],"list")==0 ){
19034       sqlite3_stmt *pStmt = 0;
19035       int rx;
19036       int len = 0;
19037       rx = sqlite3_prepare_v2(p->db,
19038              "SELECT max(length(key)) "
19039              "FROM temp.sqlite_parameters;", -1, &pStmt, 0);
19040       if( rx==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
19041         len = sqlite3_column_int(pStmt, 0);
19042         if( len>40 ) len = 40;
19043       }
19044       sqlite3_finalize(pStmt);
19045       pStmt = 0;
19046       if( len ){
19047         rx = sqlite3_prepare_v2(p->db,
19048              "SELECT key, quote(value) "
19049              "FROM temp.sqlite_parameters;", -1, &pStmt, 0);
19050         while( sqlite3_step(pStmt)==SQLITE_ROW ){
19051           utf8_printf(p->out, "%-*s %s\n", len, sqlite3_column_text(pStmt,0),
19052                       sqlite3_column_text(pStmt,1));
19053         }
19054         sqlite3_finalize(pStmt);
19055       }
19056     }else
19057 
19058     /* .parameter init
19059     ** Make sure the TEMP table used to hold bind parameters exists.
19060     ** Create it if necessary.
19061     */
19062     if( nArg==2 && strcmp(azArg[1],"init")==0 ){
19063       bind_table_init(p);
19064     }else
19065 
19066     /* .parameter set NAME VALUE
19067     ** Set or reset a bind parameter.  NAME should be the full parameter
19068     ** name exactly as it appears in the query.  (ex: $abc, @def).  The
19069     ** VALUE can be in either SQL literal notation, or if not it will be
19070     ** understood to be a text string.
19071     */
19072     if( nArg==4 && strcmp(azArg[1],"set")==0 ){
19073       int rx;
19074       char *zSql;
19075       sqlite3_stmt *pStmt;
19076       const char *zKey = azArg[2];
19077       const char *zValue = azArg[3];
19078       bind_table_init(p);
19079       zSql = sqlite3_mprintf(
19080                   "REPLACE INTO temp.sqlite_parameters(key,value)"
19081                   "VALUES(%Q,%s);", zKey, zValue);
19082       if( zSql==0 ) shell_out_of_memory();
19083       pStmt = 0;
19084       rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
19085       sqlite3_free(zSql);
19086       if( rx!=SQLITE_OK ){
19087         sqlite3_finalize(pStmt);
19088         pStmt = 0;
19089         zSql = sqlite3_mprintf(
19090                    "REPLACE INTO temp.sqlite_parameters(key,value)"
19091                    "VALUES(%Q,%Q);", zKey, zValue);
19092         if( zSql==0 ) shell_out_of_memory();
19093         rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
19094         sqlite3_free(zSql);
19095         if( rx!=SQLITE_OK ){
19096           utf8_printf(p->out, "Error: %s\n", sqlite3_errmsg(p->db));
19097           sqlite3_finalize(pStmt);
19098           pStmt = 0;
19099           rc = 1;
19100         }
19101       }
19102       sqlite3_step(pStmt);
19103       sqlite3_finalize(pStmt);
19104     }else
19105 
19106     /* .parameter unset NAME
19107     ** Remove the NAME binding from the parameter binding table, if it
19108     ** exists.
19109     */
19110     if( nArg==3 && strcmp(azArg[1],"unset")==0 ){
19111       char *zSql = sqlite3_mprintf(
19112           "DELETE FROM temp.sqlite_parameters WHERE key=%Q", azArg[2]);
19113       if( zSql==0 ) shell_out_of_memory();
19114       sqlite3_exec(p->db, zSql, 0, 0, 0);
19115       sqlite3_free(zSql);
19116     }else
19117     /* If no command name matches, show a syntax error */
19118     parameter_syntax_error:
19119     showHelp(p->out, "parameter");
19120   }else
19121 
19122   if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
19123     int i;
19124     for(i=1; i<nArg; i++){
19125       if( i>1 ) raw_printf(p->out, " ");
19126       utf8_printf(p->out, "%s", azArg[i]);
19127     }
19128     raw_printf(p->out, "\n");
19129   }else
19130 
19131 #ifndef SQLITE_OMIT_PROGRESS_CALLBACK
19132   if( c=='p' && n>=3 && strncmp(azArg[0], "progress", n)==0 ){
19133     int i;
19134     int nn = 0;
19135     p->flgProgress = 0;
19136     p->mxProgress = 0;
19137     p->nProgress = 0;
19138     for(i=1; i<nArg; i++){
19139       const char *z = azArg[i];
19140       if( z[0]=='-' ){
19141         z++;
19142         if( z[0]=='-' ) z++;
19143         if( strcmp(z,"quiet")==0 || strcmp(z,"q")==0 ){
19144           p->flgProgress |= SHELL_PROGRESS_QUIET;
19145           continue;
19146         }
19147         if( strcmp(z,"reset")==0 ){
19148           p->flgProgress |= SHELL_PROGRESS_RESET;
19149           continue;
19150         }
19151         if( strcmp(z,"once")==0 ){
19152           p->flgProgress |= SHELL_PROGRESS_ONCE;
19153           continue;
19154         }
19155         if( strcmp(z,"limit")==0 ){
19156           if( i+1>=nArg ){
19157             utf8_printf(stderr, "Error: missing argument on --limit\n");
19158             rc = 1;
19159             goto meta_command_exit;
19160           }else{
19161             p->mxProgress = (int)integerValue(azArg[++i]);
19162           }
19163           continue;
19164         }
19165         utf8_printf(stderr, "Error: unknown option: \"%s\"\n", azArg[i]);
19166         rc = 1;
19167         goto meta_command_exit;
19168       }else{
19169         nn = (int)integerValue(z);
19170       }
19171     }
19172     open_db(p, 0);
19173     sqlite3_progress_handler(p->db, nn, progress_handler, p);
19174   }else
19175 #endif /* SQLITE_OMIT_PROGRESS_CALLBACK */
19176 
19177   if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){
19178     if( nArg >= 2) {
19179       strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
19180     }
19181     if( nArg >= 3) {
19182       strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
19183     }
19184   }else
19185 
19186   if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){
19187     rc = 2;
19188   }else
19189 
19190   if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){
19191     FILE *inSaved = p->in;
19192     int savedLineno = p->lineno;
19193     if( nArg!=2 ){
19194       raw_printf(stderr, "Usage: .read FILE\n");
19195       rc = 1;
19196       goto meta_command_exit;
19197     }
19198     if( azArg[1][0]=='|' ){
19199 #ifdef SQLITE_OMIT_POPEN
19200       raw_printf(stderr, "Error: pipes are not supported in this OS\n");
19201       rc = 1;
19202       p->out = stdout;
19203 #else
19204       p->in = popen(azArg[1]+1, "r");
19205       if( p->in==0 ){
19206         utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
19207         rc = 1;
19208       }else{
19209         rc = process_input(p);
19210         pclose(p->in);
19211       }
19212 #endif
19213     }else if( notNormalFile(azArg[1]) || (p->in = fopen(azArg[1], "rb"))==0 ){
19214       utf8_printf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
19215       rc = 1;
19216     }else{
19217       rc = process_input(p);
19218       fclose(p->in);
19219     }
19220     p->in = inSaved;
19221     p->lineno = savedLineno;
19222   }else
19223 
19224   if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){
19225     const char *zSrcFile;
19226     const char *zDb;
19227     sqlite3 *pSrc;
19228     sqlite3_backup *pBackup;
19229     int nTimeout = 0;
19230 
19231     if( nArg==2 ){
19232       zSrcFile = azArg[1];
19233       zDb = "main";
19234     }else if( nArg==3 ){
19235       zSrcFile = azArg[2];
19236       zDb = azArg[1];
19237     }else{
19238       raw_printf(stderr, "Usage: .restore ?DB? FILE\n");
19239       rc = 1;
19240       goto meta_command_exit;
19241     }
19242     rc = sqlite3_open(zSrcFile, &pSrc);
19243     if( rc!=SQLITE_OK ){
19244       utf8_printf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
19245       close_db(pSrc);
19246       return 1;
19247     }
19248     open_db(p, 0);
19249     pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
19250     if( pBackup==0 ){
19251       utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
19252       close_db(pSrc);
19253       return 1;
19254     }
19255     while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
19256           || rc==SQLITE_BUSY  ){
19257       if( rc==SQLITE_BUSY ){
19258         if( nTimeout++ >= 3 ) break;
19259         sqlite3_sleep(100);
19260       }
19261     }
19262     sqlite3_backup_finish(pBackup);
19263     if( rc==SQLITE_DONE ){
19264       rc = 0;
19265     }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
19266       raw_printf(stderr, "Error: source database is busy\n");
19267       rc = 1;
19268     }else{
19269       utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
19270       rc = 1;
19271     }
19272     close_db(pSrc);
19273   }else
19274 
19275   if( c=='s' && strncmp(azArg[0], "scanstats", n)==0 ){
19276     if( nArg==2 ){
19277       p->scanstatsOn = (u8)booleanValue(azArg[1]);
19278 #ifndef SQLITE_ENABLE_STMT_SCANSTATUS
19279       raw_printf(stderr, "Warning: .scanstats not available in this build.\n");
19280 #endif
19281     }else{
19282       raw_printf(stderr, "Usage: .scanstats on|off\n");
19283       rc = 1;
19284     }
19285   }else
19286 
19287   if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){
19288     ShellText sSelect;
19289     ShellState data;
19290     char *zErrMsg = 0;
19291     const char *zDiv = "(";
19292     const char *zName = 0;
19293     int iSchema = 0;
19294     int bDebug = 0;
19295     int bNoSystemTabs = 0;
19296     int ii;
19297 
19298     open_db(p, 0);
19299     memcpy(&data, p, sizeof(data));
19300     data.showHeader = 0;
19301     data.cMode = data.mode = MODE_Semi;
19302     initText(&sSelect);
19303     for(ii=1; ii<nArg; ii++){
19304       if( optionMatch(azArg[ii],"indent") ){
19305         data.cMode = data.mode = MODE_Pretty;
19306       }else if( optionMatch(azArg[ii],"debug") ){
19307         bDebug = 1;
19308       }else if( optionMatch(azArg[ii],"nosys") ){
19309         bNoSystemTabs = 1;
19310       }else if( azArg[ii][0]=='-' ){
19311         utf8_printf(stderr, "Unknown option: \"%s\"\n", azArg[ii]);
19312         rc = 1;
19313         goto meta_command_exit;
19314       }else if( zName==0 ){
19315         zName = azArg[ii];
19316       }else{
19317         raw_printf(stderr, "Usage: .schema ?--indent? ?--nosys? ?LIKE-PATTERN?\n");
19318         rc = 1;
19319         goto meta_command_exit;
19320       }
19321     }
19322     if( zName!=0 ){
19323       int isSchema = sqlite3_strlike(zName, "sqlite_master", '\\')==0
19324                   || sqlite3_strlike(zName, "sqlite_schema", '\\')==0
19325                   || sqlite3_strlike(zName,"sqlite_temp_master", '\\')==0
19326                   || sqlite3_strlike(zName,"sqlite_temp_schema", '\\')==0;
19327       if( isSchema ){
19328         char *new_argv[2], *new_colv[2];
19329         new_argv[0] = sqlite3_mprintf(
19330                       "CREATE TABLE %s (\n"
19331                       "  type text,\n"
19332                       "  name text,\n"
19333                       "  tbl_name text,\n"
19334                       "  rootpage integer,\n"
19335                       "  sql text\n"
19336                       ")", zName);
19337         new_argv[1] = 0;
19338         new_colv[0] = "sql";
19339         new_colv[1] = 0;
19340         callback(&data, 1, new_argv, new_colv);
19341         sqlite3_free(new_argv[0]);
19342       }
19343     }
19344     if( zDiv ){
19345       sqlite3_stmt *pStmt = 0;
19346       rc = sqlite3_prepare_v2(p->db, "SELECT name FROM pragma_database_list",
19347                               -1, &pStmt, 0);
19348       if( rc ){
19349         utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
19350         sqlite3_finalize(pStmt);
19351         rc = 1;
19352         goto meta_command_exit;
19353       }
19354       appendText(&sSelect, "SELECT sql FROM", 0);
19355       iSchema = 0;
19356       while( sqlite3_step(pStmt)==SQLITE_ROW ){
19357         const char *zDb = (const char*)sqlite3_column_text(pStmt, 0);
19358         char zScNum[30];
19359         sqlite3_snprintf(sizeof(zScNum), zScNum, "%d", ++iSchema);
19360         appendText(&sSelect, zDiv, 0);
19361         zDiv = " UNION ALL ";
19362         appendText(&sSelect, "SELECT shell_add_schema(sql,", 0);
19363         if( sqlite3_stricmp(zDb, "main")!=0 ){
19364           appendText(&sSelect, zDb, '\'');
19365         }else{
19366           appendText(&sSelect, "NULL", 0);
19367         }
19368         appendText(&sSelect, ",name) AS sql, type, tbl_name, name, rowid,", 0);
19369         appendText(&sSelect, zScNum, 0);
19370         appendText(&sSelect, " AS snum, ", 0);
19371         appendText(&sSelect, zDb, '\'');
19372         appendText(&sSelect, " AS sname FROM ", 0);
19373         appendText(&sSelect, zDb, quoteChar(zDb));
19374         appendText(&sSelect, ".sqlite_schema", 0);
19375       }
19376       sqlite3_finalize(pStmt);
19377 #ifndef SQLITE_OMIT_INTROSPECTION_PRAGMAS
19378       if( zName ){
19379         appendText(&sSelect,
19380            " UNION ALL SELECT shell_module_schema(name),"
19381            " 'table', name, name, name, 9e+99, 'main' FROM pragma_module_list",
19382         0);
19383       }
19384 #endif
19385       appendText(&sSelect, ") WHERE ", 0);
19386       if( zName ){
19387         char *zQarg = sqlite3_mprintf("%Q", zName);
19388         int bGlob = strchr(zName, '*') != 0 || strchr(zName, '?') != 0 ||
19389                     strchr(zName, '[') != 0;
19390         if( strchr(zName, '.') ){
19391           appendText(&sSelect, "lower(printf('%s.%s',sname,tbl_name))", 0);
19392         }else{
19393           appendText(&sSelect, "lower(tbl_name)", 0);
19394         }
19395         appendText(&sSelect, bGlob ? " GLOB " : " LIKE ", 0);
19396         appendText(&sSelect, zQarg, 0);
19397         if( !bGlob ){
19398           appendText(&sSelect, " ESCAPE '\\' ", 0);
19399         }
19400         appendText(&sSelect, " AND ", 0);
19401         sqlite3_free(zQarg);
19402       }
19403       if( bNoSystemTabs ){
19404         appendText(&sSelect, "name NOT LIKE 'sqlite_%%' AND ", 0);
19405       }
19406       appendText(&sSelect, "sql IS NOT NULL"
19407                            " ORDER BY snum, rowid", 0);
19408       if( bDebug ){
19409         utf8_printf(p->out, "SQL: %s;\n", sSelect.z);
19410       }else{
19411         rc = sqlite3_exec(p->db, sSelect.z, callback, &data, &zErrMsg);
19412       }
19413       freeText(&sSelect);
19414     }
19415     if( zErrMsg ){
19416       utf8_printf(stderr,"Error: %s\n", zErrMsg);
19417       sqlite3_free(zErrMsg);
19418       rc = 1;
19419     }else if( rc != SQLITE_OK ){
19420       raw_printf(stderr,"Error: querying schema information\n");
19421       rc = 1;
19422     }else{
19423       rc = 0;
19424     }
19425   }else
19426 
19427   if( c=='s' && n==11 && strncmp(azArg[0], "selecttrace", n)==0 ){
19428     unsigned int x = nArg>=2 ? (unsigned int)integerValue(azArg[1]) : 0xffffffff;
19429     sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &x);
19430   }else
19431 
19432 #if defined(SQLITE_ENABLE_SESSION)
19433   if( c=='s' && strncmp(azArg[0],"session",n)==0 && n>=3 ){
19434     OpenSession *pSession = &p->aSession[0];
19435     char **azCmd = &azArg[1];
19436     int iSes = 0;
19437     int nCmd = nArg - 1;
19438     int i;
19439     if( nArg<=1 ) goto session_syntax_error;
19440     open_db(p, 0);
19441     if( nArg>=3 ){
19442       for(iSes=0; iSes<p->nSession; iSes++){
19443         if( strcmp(p->aSession[iSes].zName, azArg[1])==0 ) break;
19444       }
19445       if( iSes<p->nSession ){
19446         pSession = &p->aSession[iSes];
19447         azCmd++;
19448         nCmd--;
19449       }else{
19450         pSession = &p->aSession[0];
19451         iSes = 0;
19452       }
19453     }
19454 
19455     /* .session attach TABLE
19456     ** Invoke the sqlite3session_attach() interface to attach a particular
19457     ** table so that it is never filtered.
19458     */
19459     if( strcmp(azCmd[0],"attach")==0 ){
19460       if( nCmd!=2 ) goto session_syntax_error;
19461       if( pSession->p==0 ){
19462         session_not_open:
19463         raw_printf(stderr, "ERROR: No sessions are open\n");
19464       }else{
19465         rc = sqlite3session_attach(pSession->p, azCmd[1]);
19466         if( rc ){
19467           raw_printf(stderr, "ERROR: sqlite3session_attach() returns %d\n", rc);
19468           rc = 0;
19469         }
19470       }
19471     }else
19472 
19473     /* .session changeset FILE
19474     ** .session patchset FILE
19475     ** Write a changeset or patchset into a file.  The file is overwritten.
19476     */
19477     if( strcmp(azCmd[0],"changeset")==0 || strcmp(azCmd[0],"patchset")==0 ){
19478       FILE *out = 0;
19479       if( nCmd!=2 ) goto session_syntax_error;
19480       if( pSession->p==0 ) goto session_not_open;
19481       out = fopen(azCmd[1], "wb");
19482       if( out==0 ){
19483         utf8_printf(stderr, "ERROR: cannot open \"%s\" for writing\n",
19484                     azCmd[1]);
19485       }else{
19486         int szChng;
19487         void *pChng;
19488         if( azCmd[0][0]=='c' ){
19489           rc = sqlite3session_changeset(pSession->p, &szChng, &pChng);
19490         }else{
19491           rc = sqlite3session_patchset(pSession->p, &szChng, &pChng);
19492         }
19493         if( rc ){
19494           printf("Error: error code %d\n", rc);
19495           rc = 0;
19496         }
19497         if( pChng
19498           && fwrite(pChng, szChng, 1, out)!=1 ){
19499           raw_printf(stderr, "ERROR: Failed to write entire %d-byte output\n",
19500                   szChng);
19501         }
19502         sqlite3_free(pChng);
19503         fclose(out);
19504       }
19505     }else
19506 
19507     /* .session close
19508     ** Close the identified session
19509     */
19510     if( strcmp(azCmd[0], "close")==0 ){
19511       if( nCmd!=1 ) goto session_syntax_error;
19512       if( p->nSession ){
19513         session_close(pSession);
19514         p->aSession[iSes] = p->aSession[--p->nSession];
19515       }
19516     }else
19517 
19518     /* .session enable ?BOOLEAN?
19519     ** Query or set the enable flag
19520     */
19521     if( strcmp(azCmd[0], "enable")==0 ){
19522       int ii;
19523       if( nCmd>2 ) goto session_syntax_error;
19524       ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
19525       if( p->nSession ){
19526         ii = sqlite3session_enable(pSession->p, ii);
19527         utf8_printf(p->out, "session %s enable flag = %d\n",
19528                     pSession->zName, ii);
19529       }
19530     }else
19531 
19532     /* .session filter GLOB ....
19533     ** Set a list of GLOB patterns of table names to be excluded.
19534     */
19535     if( strcmp(azCmd[0], "filter")==0 ){
19536       int ii, nByte;
19537       if( nCmd<2 ) goto session_syntax_error;
19538       if( p->nSession ){
19539         for(ii=0; ii<pSession->nFilter; ii++){
19540           sqlite3_free(pSession->azFilter[ii]);
19541         }
19542         sqlite3_free(pSession->azFilter);
19543         nByte = sizeof(pSession->azFilter[0])*(nCmd-1);
19544         pSession->azFilter = sqlite3_malloc( nByte );
19545         if( pSession->azFilter==0 ){
19546           raw_printf(stderr, "Error: out or memory\n");
19547           exit(1);
19548         }
19549         for(ii=1; ii<nCmd; ii++){
19550           pSession->azFilter[ii-1] = sqlite3_mprintf("%s", azCmd[ii]);
19551         }
19552         pSession->nFilter = ii-1;
19553       }
19554     }else
19555 
19556     /* .session indirect ?BOOLEAN?
19557     ** Query or set the indirect flag
19558     */
19559     if( strcmp(azCmd[0], "indirect")==0 ){
19560       int ii;
19561       if( nCmd>2 ) goto session_syntax_error;
19562       ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
19563       if( p->nSession ){
19564         ii = sqlite3session_indirect(pSession->p, ii);
19565         utf8_printf(p->out, "session %s indirect flag = %d\n",
19566                     pSession->zName, ii);
19567       }
19568     }else
19569 
19570     /* .session isempty
19571     ** Determine if the session is empty
19572     */
19573     if( strcmp(azCmd[0], "isempty")==0 ){
19574       int ii;
19575       if( nCmd!=1 ) goto session_syntax_error;
19576       if( p->nSession ){
19577         ii = sqlite3session_isempty(pSession->p);
19578         utf8_printf(p->out, "session %s isempty flag = %d\n",
19579                     pSession->zName, ii);
19580       }
19581     }else
19582 
19583     /* .session list
19584     ** List all currently open sessions
19585     */
19586     if( strcmp(azCmd[0],"list")==0 ){
19587       for(i=0; i<p->nSession; i++){
19588         utf8_printf(p->out, "%d %s\n", i, p->aSession[i].zName);
19589       }
19590     }else
19591 
19592     /* .session open DB NAME
19593     ** Open a new session called NAME on the attached database DB.
19594     ** DB is normally "main".
19595     */
19596     if( strcmp(azCmd[0],"open")==0 ){
19597       char *zName;
19598       if( nCmd!=3 ) goto session_syntax_error;
19599       zName = azCmd[2];
19600       if( zName[0]==0 ) goto session_syntax_error;
19601       for(i=0; i<p->nSession; i++){
19602         if( strcmp(p->aSession[i].zName,zName)==0 ){
19603           utf8_printf(stderr, "Session \"%s\" already exists\n", zName);
19604           goto meta_command_exit;
19605         }
19606       }
19607       if( p->nSession>=ArraySize(p->aSession) ){
19608         raw_printf(stderr, "Maximum of %d sessions\n", ArraySize(p->aSession));
19609         goto meta_command_exit;
19610       }
19611       pSession = &p->aSession[p->nSession];
19612       rc = sqlite3session_create(p->db, azCmd[1], &pSession->p);
19613       if( rc ){
19614         raw_printf(stderr, "Cannot open session: error code=%d\n", rc);
19615         rc = 0;
19616         goto meta_command_exit;
19617       }
19618       pSession->nFilter = 0;
19619       sqlite3session_table_filter(pSession->p, session_filter, pSession);
19620       p->nSession++;
19621       pSession->zName = sqlite3_mprintf("%s", zName);
19622     }else
19623     /* If no command name matches, show a syntax error */
19624     session_syntax_error:
19625     showHelp(p->out, "session");
19626   }else
19627 #endif
19628 
19629 #ifdef SQLITE_DEBUG
19630   /* Undocumented commands for internal testing.  Subject to change
19631   ** without notice. */
19632   if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
19633     if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
19634       int i, v;
19635       for(i=1; i<nArg; i++){
19636         v = booleanValue(azArg[i]);
19637         utf8_printf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
19638       }
19639     }
19640     if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
19641       int i; sqlite3_int64 v;
19642       for(i=1; i<nArg; i++){
19643         char zBuf[200];
19644         v = integerValue(azArg[i]);
19645         sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v);
19646         utf8_printf(p->out, "%s", zBuf);
19647       }
19648     }
19649   }else
19650 #endif
19651 
19652   if( c=='s' && n>=4 && strncmp(azArg[0],"selftest",n)==0 ){
19653     int bIsInit = 0;         /* True to initialize the SELFTEST table */
19654     int bVerbose = 0;        /* Verbose output */
19655     int bSelftestExists;     /* True if SELFTEST already exists */
19656     int i, k;                /* Loop counters */
19657     int nTest = 0;           /* Number of tests runs */
19658     int nErr = 0;            /* Number of errors seen */
19659     ShellText str;           /* Answer for a query */
19660     sqlite3_stmt *pStmt = 0; /* Query against the SELFTEST table */
19661 
19662     open_db(p,0);
19663     for(i=1; i<nArg; i++){
19664       const char *z = azArg[i];
19665       if( z[0]=='-' && z[1]=='-' ) z++;
19666       if( strcmp(z,"-init")==0 ){
19667         bIsInit = 1;
19668       }else
19669       if( strcmp(z,"-v")==0 ){
19670         bVerbose++;
19671       }else
19672       {
19673         utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n",
19674                     azArg[i], azArg[0]);
19675         raw_printf(stderr, "Should be one of: --init -v\n");
19676         rc = 1;
19677         goto meta_command_exit;
19678       }
19679     }
19680     if( sqlite3_table_column_metadata(p->db,"main","selftest",0,0,0,0,0,0)
19681            != SQLITE_OK ){
19682       bSelftestExists = 0;
19683     }else{
19684       bSelftestExists = 1;
19685     }
19686     if( bIsInit ){
19687       createSelftestTable(p);
19688       bSelftestExists = 1;
19689     }
19690     initText(&str);
19691     appendText(&str, "x", 0);
19692     for(k=bSelftestExists; k>=0; k--){
19693       if( k==1 ){
19694         rc = sqlite3_prepare_v2(p->db,
19695             "SELECT tno,op,cmd,ans FROM selftest ORDER BY tno",
19696             -1, &pStmt, 0);
19697       }else{
19698         rc = sqlite3_prepare_v2(p->db,
19699           "VALUES(0,'memo','Missing SELFTEST table - default checks only',''),"
19700           "      (1,'run','PRAGMA integrity_check','ok')",
19701           -1, &pStmt, 0);
19702       }
19703       if( rc ){
19704         raw_printf(stderr, "Error querying the selftest table\n");
19705         rc = 1;
19706         sqlite3_finalize(pStmt);
19707         goto meta_command_exit;
19708       }
19709       for(i=1; sqlite3_step(pStmt)==SQLITE_ROW; i++){
19710         int tno = sqlite3_column_int(pStmt, 0);
19711         const char *zOp = (const char*)sqlite3_column_text(pStmt, 1);
19712         const char *zSql = (const char*)sqlite3_column_text(pStmt, 2);
19713         const char *zAns = (const char*)sqlite3_column_text(pStmt, 3);
19714 
19715         k = 0;
19716         if( bVerbose>0 ){
19717           char *zQuote = sqlite3_mprintf("%q", zSql);
19718           printf("%d: %s %s\n", tno, zOp, zSql);
19719           sqlite3_free(zQuote);
19720         }
19721         if( strcmp(zOp,"memo")==0 ){
19722           utf8_printf(p->out, "%s\n", zSql);
19723         }else
19724         if( strcmp(zOp,"run")==0 ){
19725           char *zErrMsg = 0;
19726           str.n = 0;
19727           str.z[0] = 0;
19728           rc = sqlite3_exec(p->db, zSql, captureOutputCallback, &str, &zErrMsg);
19729           nTest++;
19730           if( bVerbose ){
19731             utf8_printf(p->out, "Result: %s\n", str.z);
19732           }
19733           if( rc || zErrMsg ){
19734             nErr++;
19735             rc = 1;
19736             utf8_printf(p->out, "%d: error-code-%d: %s\n", tno, rc, zErrMsg);
19737             sqlite3_free(zErrMsg);
19738           }else if( strcmp(zAns,str.z)!=0 ){
19739             nErr++;
19740             rc = 1;
19741             utf8_printf(p->out, "%d: Expected: [%s]\n", tno, zAns);
19742             utf8_printf(p->out, "%d:      Got: [%s]\n", tno, str.z);
19743           }
19744         }else
19745         {
19746           utf8_printf(stderr,
19747             "Unknown operation \"%s\" on selftest line %d\n", zOp, tno);
19748           rc = 1;
19749           break;
19750         }
19751       } /* End loop over rows of content from SELFTEST */
19752       sqlite3_finalize(pStmt);
19753     } /* End loop over k */
19754     freeText(&str);
19755     utf8_printf(p->out, "%d errors out of %d tests\n", nErr, nTest);
19756   }else
19757 
19758   if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){
19759     if( nArg<2 || nArg>3 ){
19760       raw_printf(stderr, "Usage: .separator COL ?ROW?\n");
19761       rc = 1;
19762     }
19763     if( nArg>=2 ){
19764       sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator,
19765                        "%.*s", (int)ArraySize(p->colSeparator)-1, azArg[1]);
19766     }
19767     if( nArg>=3 ){
19768       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator,
19769                        "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]);
19770     }
19771   }else
19772 
19773   if( c=='s' && n>=4 && strncmp(azArg[0],"sha3sum",n)==0 ){
19774     const char *zLike = 0;   /* Which table to checksum. 0 means everything */
19775     int i;                   /* Loop counter */
19776     int bSchema = 0;         /* Also hash the schema */
19777     int bSeparate = 0;       /* Hash each table separately */
19778     int iSize = 224;         /* Hash algorithm to use */
19779     int bDebug = 0;          /* Only show the query that would have run */
19780     sqlite3_stmt *pStmt;     /* For querying tables names */
19781     char *zSql;              /* SQL to be run */
19782     char *zSep;              /* Separator */
19783     ShellText sSql;          /* Complete SQL for the query to run the hash */
19784     ShellText sQuery;        /* Set of queries used to read all content */
19785     open_db(p, 0);
19786     for(i=1; i<nArg; i++){
19787       const char *z = azArg[i];
19788       if( z[0]=='-' ){
19789         z++;
19790         if( z[0]=='-' ) z++;
19791         if( strcmp(z,"schema")==0 ){
19792           bSchema = 1;
19793         }else
19794         if( strcmp(z,"sha3-224")==0 || strcmp(z,"sha3-256")==0
19795          || strcmp(z,"sha3-384")==0 || strcmp(z,"sha3-512")==0
19796         ){
19797           iSize = atoi(&z[5]);
19798         }else
19799         if( strcmp(z,"debug")==0 ){
19800           bDebug = 1;
19801         }else
19802         {
19803           utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n",
19804                       azArg[i], azArg[0]);
19805           showHelp(p->out, azArg[0]);
19806           rc = 1;
19807           goto meta_command_exit;
19808         }
19809       }else if( zLike ){
19810         raw_printf(stderr, "Usage: .sha3sum ?OPTIONS? ?LIKE-PATTERN?\n");
19811         rc = 1;
19812         goto meta_command_exit;
19813       }else{
19814         zLike = z;
19815         bSeparate = 1;
19816         if( sqlite3_strlike("sqlite\\_%", zLike, '\\')==0 ) bSchema = 1;
19817       }
19818     }
19819     if( bSchema ){
19820       zSql = "SELECT lower(name) FROM sqlite_schema"
19821              " WHERE type='table' AND coalesce(rootpage,0)>1"
19822              " UNION ALL SELECT 'sqlite_schema'"
19823              " ORDER BY 1 collate nocase";
19824     }else{
19825       zSql = "SELECT lower(name) FROM sqlite_schema"
19826              " WHERE type='table' AND coalesce(rootpage,0)>1"
19827              " AND name NOT LIKE 'sqlite_%'"
19828              " ORDER BY 1 collate nocase";
19829     }
19830     sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
19831     initText(&sQuery);
19832     initText(&sSql);
19833     appendText(&sSql, "WITH [sha3sum$query](a,b) AS(",0);
19834     zSep = "VALUES(";
19835     while( SQLITE_ROW==sqlite3_step(pStmt) ){
19836       const char *zTab = (const char*)sqlite3_column_text(pStmt,0);
19837       if( zLike && sqlite3_strlike(zLike, zTab, 0)!=0 ) continue;
19838       if( strncmp(zTab, "sqlite_",7)!=0 ){
19839         appendText(&sQuery,"SELECT * FROM ", 0);
19840         appendText(&sQuery,zTab,'"');
19841         appendText(&sQuery," NOT INDEXED;", 0);
19842       }else if( strcmp(zTab, "sqlite_schema")==0 ){
19843         appendText(&sQuery,"SELECT type,name,tbl_name,sql FROM sqlite_schema"
19844                            " ORDER BY name;", 0);
19845       }else if( strcmp(zTab, "sqlite_sequence")==0 ){
19846         appendText(&sQuery,"SELECT name,seq FROM sqlite_sequence"
19847                            " ORDER BY name;", 0);
19848       }else if( strcmp(zTab, "sqlite_stat1")==0 ){
19849         appendText(&sQuery,"SELECT tbl,idx,stat FROM sqlite_stat1"
19850                            " ORDER BY tbl,idx;", 0);
19851       }else if( strcmp(zTab, "sqlite_stat4")==0 ){
19852         appendText(&sQuery, "SELECT * FROM ", 0);
19853         appendText(&sQuery, zTab, 0);
19854         appendText(&sQuery, " ORDER BY tbl, idx, rowid;\n", 0);
19855       }
19856       appendText(&sSql, zSep, 0);
19857       appendText(&sSql, sQuery.z, '\'');
19858       sQuery.n = 0;
19859       appendText(&sSql, ",", 0);
19860       appendText(&sSql, zTab, '\'');
19861       zSep = "),(";
19862     }
19863     sqlite3_finalize(pStmt);
19864     if( bSeparate ){
19865       zSql = sqlite3_mprintf(
19866           "%s))"
19867           " SELECT lower(hex(sha3_query(a,%d))) AS hash, b AS label"
19868           "   FROM [sha3sum$query]",
19869           sSql.z, iSize);
19870     }else{
19871       zSql = sqlite3_mprintf(
19872           "%s))"
19873           " SELECT lower(hex(sha3_query(group_concat(a,''),%d))) AS hash"
19874           "   FROM [sha3sum$query]",
19875           sSql.z, iSize);
19876     }
19877     freeText(&sQuery);
19878     freeText(&sSql);
19879     if( bDebug ){
19880       utf8_printf(p->out, "%s\n", zSql);
19881     }else{
19882       shell_exec(p, zSql, 0);
19883     }
19884     sqlite3_free(zSql);
19885   }else
19886 
19887 #ifndef SQLITE_NOHAVE_SYSTEM
19888   if( c=='s'
19889    && (strncmp(azArg[0], "shell", n)==0 || strncmp(azArg[0],"system",n)==0)
19890   ){
19891     char *zCmd;
19892     int i, x;
19893     if( nArg<2 ){
19894       raw_printf(stderr, "Usage: .system COMMAND\n");
19895       rc = 1;
19896       goto meta_command_exit;
19897     }
19898     zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]);
19899     for(i=2; i<nArg; i++){
19900       zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"",
19901                              zCmd, azArg[i]);
19902     }
19903     x = system(zCmd);
19904     sqlite3_free(zCmd);
19905     if( x ) raw_printf(stderr, "System command returns %d\n", x);
19906   }else
19907 #endif /* !defined(SQLITE_NOHAVE_SYSTEM) */
19908 
19909   if( c=='s' && strncmp(azArg[0], "show", n)==0 ){
19910     static const char *azBool[] = { "off", "on", "trigger", "full"};
19911     const char *zOut;
19912     int i;
19913     if( nArg!=1 ){
19914       raw_printf(stderr, "Usage: .show\n");
19915       rc = 1;
19916       goto meta_command_exit;
19917     }
19918     utf8_printf(p->out, "%12.12s: %s\n","echo",
19919                                   azBool[ShellHasFlag(p, SHFLG_Echo)]);
19920     utf8_printf(p->out, "%12.12s: %s\n","eqp", azBool[p->autoEQP&3]);
19921     utf8_printf(p->out, "%12.12s: %s\n","explain",
19922          p->mode==MODE_Explain ? "on" : p->autoExplain ? "auto" : "off");
19923     utf8_printf(p->out,"%12.12s: %s\n","headers", azBool[p->showHeader!=0]);
19924     utf8_printf(p->out, "%12.12s: %s\n","mode", modeDescr[p->mode]);
19925     utf8_printf(p->out, "%12.12s: ", "nullvalue");
19926       output_c_string(p->out, p->nullValue);
19927       raw_printf(p->out, "\n");
19928     utf8_printf(p->out,"%12.12s: %s\n","output",
19929             strlen30(p->outfile) ? p->outfile : "stdout");
19930     utf8_printf(p->out,"%12.12s: ", "colseparator");
19931       output_c_string(p->out, p->colSeparator);
19932       raw_printf(p->out, "\n");
19933     utf8_printf(p->out,"%12.12s: ", "rowseparator");
19934       output_c_string(p->out, p->rowSeparator);
19935       raw_printf(p->out, "\n");
19936     switch( p->statsOn ){
19937       case 0:  zOut = "off";     break;
19938       default: zOut = "on";      break;
19939       case 2:  zOut = "stmt";    break;
19940       case 3:  zOut = "vmstep";  break;
19941     }
19942     utf8_printf(p->out, "%12.12s: %s\n","stats", zOut);
19943     utf8_printf(p->out, "%12.12s: ", "width");
19944     for (i=0;i<p->nWidth;i++) {
19945       raw_printf(p->out, "%d ", p->colWidth[i]);
19946     }
19947     raw_printf(p->out, "\n");
19948     utf8_printf(p->out, "%12.12s: %s\n", "filename",
19949                 p->zDbFilename ? p->zDbFilename : "");
19950   }else
19951 
19952   if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){
19953     if( nArg==2 ){
19954       if( strcmp(azArg[1],"stmt")==0 ){
19955         p->statsOn = 2;
19956       }else if( strcmp(azArg[1],"vmstep")==0 ){
19957         p->statsOn = 3;
19958       }else{
19959         p->statsOn = (u8)booleanValue(azArg[1]);
19960       }
19961     }else if( nArg==1 ){
19962       display_stats(p->db, p, 0);
19963     }else{
19964       raw_printf(stderr, "Usage: .stats ?on|off|stmt|vmstep?\n");
19965       rc = 1;
19966     }
19967   }else
19968 
19969   if( (c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0)
19970    || (c=='i' && (strncmp(azArg[0], "indices", n)==0
19971                  || strncmp(azArg[0], "indexes", n)==0) )
19972   ){
19973     sqlite3_stmt *pStmt;
19974     char **azResult;
19975     int nRow, nAlloc;
19976     int ii;
19977     ShellText s;
19978     initText(&s);
19979     open_db(p, 0);
19980     rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
19981     if( rc ){
19982       sqlite3_finalize(pStmt);
19983       return shellDatabaseError(p->db);
19984     }
19985 
19986     if( nArg>2 && c=='i' ){
19987       /* It is an historical accident that the .indexes command shows an error
19988       ** when called with the wrong number of arguments whereas the .tables
19989       ** command does not. */
19990       raw_printf(stderr, "Usage: .indexes ?LIKE-PATTERN?\n");
19991       rc = 1;
19992       sqlite3_finalize(pStmt);
19993       goto meta_command_exit;
19994     }
19995     for(ii=0; sqlite3_step(pStmt)==SQLITE_ROW; ii++){
19996       const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
19997       if( zDbName==0 ) continue;
19998       if( s.z && s.z[0] ) appendText(&s, " UNION ALL ", 0);
19999       if( sqlite3_stricmp(zDbName, "main")==0 ){
20000         appendText(&s, "SELECT name FROM ", 0);
20001       }else{
20002         appendText(&s, "SELECT ", 0);
20003         appendText(&s, zDbName, '\'');
20004         appendText(&s, "||'.'||name FROM ", 0);
20005       }
20006       appendText(&s, zDbName, '"');
20007       appendText(&s, ".sqlite_schema ", 0);
20008       if( c=='t' ){
20009         appendText(&s," WHERE type IN ('table','view')"
20010                       "   AND name NOT LIKE 'sqlite_%'"
20011                       "   AND name LIKE ?1", 0);
20012       }else{
20013         appendText(&s," WHERE type='index'"
20014                       "   AND tbl_name LIKE ?1", 0);
20015       }
20016     }
20017     rc = sqlite3_finalize(pStmt);
20018     appendText(&s, " ORDER BY 1", 0);
20019     rc = sqlite3_prepare_v2(p->db, s.z, -1, &pStmt, 0);
20020     freeText(&s);
20021     if( rc ) return shellDatabaseError(p->db);
20022 
20023     /* Run the SQL statement prepared by the above block. Store the results
20024     ** as an array of nul-terminated strings in azResult[].  */
20025     nRow = nAlloc = 0;
20026     azResult = 0;
20027     if( nArg>1 ){
20028       sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
20029     }else{
20030       sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
20031     }
20032     while( sqlite3_step(pStmt)==SQLITE_ROW ){
20033       if( nRow>=nAlloc ){
20034         char **azNew;
20035         int n2 = nAlloc*2 + 10;
20036         azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2);
20037         if( azNew==0 ) shell_out_of_memory();
20038         nAlloc = n2;
20039         azResult = azNew;
20040       }
20041       azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
20042       if( 0==azResult[nRow] ) shell_out_of_memory();
20043       nRow++;
20044     }
20045     if( sqlite3_finalize(pStmt)!=SQLITE_OK ){
20046       rc = shellDatabaseError(p->db);
20047     }
20048 
20049     /* Pretty-print the contents of array azResult[] to the output */
20050     if( rc==0 && nRow>0 ){
20051       int len, maxlen = 0;
20052       int i, j;
20053       int nPrintCol, nPrintRow;
20054       for(i=0; i<nRow; i++){
20055         len = strlen30(azResult[i]);
20056         if( len>maxlen ) maxlen = len;
20057       }
20058       nPrintCol = 80/(maxlen+2);
20059       if( nPrintCol<1 ) nPrintCol = 1;
20060       nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
20061       for(i=0; i<nPrintRow; i++){
20062         for(j=i; j<nRow; j+=nPrintRow){
20063           char *zSp = j<nPrintRow ? "" : "  ";
20064           utf8_printf(p->out, "%s%-*s", zSp, maxlen,
20065                       azResult[j] ? azResult[j]:"");
20066         }
20067         raw_printf(p->out, "\n");
20068       }
20069     }
20070 
20071     for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
20072     sqlite3_free(azResult);
20073   }else
20074 
20075   /* Begin redirecting output to the file "testcase-out.txt" */
20076   if( c=='t' && strcmp(azArg[0],"testcase")==0 ){
20077     output_reset(p);
20078     p->out = output_file_open("testcase-out.txt", 0);
20079     if( p->out==0 ){
20080       raw_printf(stderr, "Error: cannot open 'testcase-out.txt'\n");
20081     }
20082     if( nArg>=2 ){
20083       sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "%s", azArg[1]);
20084     }else{
20085       sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "?");
20086     }
20087   }else
20088 
20089 #ifndef SQLITE_UNTESTABLE
20090   if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 ){
20091     static const struct {
20092        const char *zCtrlName;   /* Name of a test-control option */
20093        int ctrlCode;            /* Integer code for that option */
20094        const char *zUsage;      /* Usage notes */
20095     } aCtrl[] = {
20096       { "always",             SQLITE_TESTCTRL_ALWAYS,        "BOOLEAN"        },
20097       { "assert",             SQLITE_TESTCTRL_ASSERT,        "BOOLEAN"        },
20098     /*{ "benign_malloc_hooks",SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS, ""       },*/
20099     /*{ "bitvec_test",        SQLITE_TESTCTRL_BITVEC_TEST,   ""             },*/
20100       { "byteorder",          SQLITE_TESTCTRL_BYTEORDER,     ""               },
20101       { "extra_schema_checks",SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS,"BOOLEAN"   },
20102     /*{ "fault_install",      SQLITE_TESTCTRL_FAULT_INSTALL, ""             },*/
20103       { "imposter",         SQLITE_TESTCTRL_IMPOSTER, "SCHEMA ON/OFF ROOTPAGE"},
20104       { "internal_functions", SQLITE_TESTCTRL_INTERNAL_FUNCTIONS, "" },
20105       { "localtime_fault",    SQLITE_TESTCTRL_LOCALTIME_FAULT,"BOOLEAN"       },
20106       { "never_corrupt",      SQLITE_TESTCTRL_NEVER_CORRUPT, "BOOLEAN"        },
20107       { "optimizations",      SQLITE_TESTCTRL_OPTIMIZATIONS, "DISABLE-MASK"   },
20108 #ifdef YYCOVERAGE
20109       { "parser_coverage",    SQLITE_TESTCTRL_PARSER_COVERAGE, ""             },
20110 #endif
20111       { "pending_byte",       SQLITE_TESTCTRL_PENDING_BYTE,  "OFFSET  "       },
20112       { "prng_restore",       SQLITE_TESTCTRL_PRNG_RESTORE,  ""               },
20113       { "prng_save",          SQLITE_TESTCTRL_PRNG_SAVE,     ""               },
20114       { "prng_seed",          SQLITE_TESTCTRL_PRNG_SEED,     "SEED ?db?"      },
20115       { "seek_count",         SQLITE_TESTCTRL_SEEK_COUNT,    ""               },
20116     };
20117     int testctrl = -1;
20118     int iCtrl = -1;
20119     int rc2 = 0;    /* 0: usage.  1: %d  2: %x  3: no-output */
20120     int isOk = 0;
20121     int i, n2;
20122     const char *zCmd = 0;
20123 
20124     open_db(p, 0);
20125     zCmd = nArg>=2 ? azArg[1] : "help";
20126 
20127     /* The argument can optionally begin with "-" or "--" */
20128     if( zCmd[0]=='-' && zCmd[1] ){
20129       zCmd++;
20130       if( zCmd[0]=='-' && zCmd[1] ) zCmd++;
20131     }
20132 
20133     /* --help lists all test-controls */
20134     if( strcmp(zCmd,"help")==0 ){
20135       utf8_printf(p->out, "Available test-controls:\n");
20136       for(i=0; i<ArraySize(aCtrl); i++){
20137         utf8_printf(p->out, "  .testctrl %s %s\n",
20138                     aCtrl[i].zCtrlName, aCtrl[i].zUsage);
20139       }
20140       rc = 1;
20141       goto meta_command_exit;
20142     }
20143 
20144     /* convert testctrl text option to value. allow any unique prefix
20145     ** of the option name, or a numerical value. */
20146     n2 = strlen30(zCmd);
20147     for(i=0; i<ArraySize(aCtrl); i++){
20148       if( strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){
20149         if( testctrl<0 ){
20150           testctrl = aCtrl[i].ctrlCode;
20151           iCtrl = i;
20152         }else{
20153           utf8_printf(stderr, "Error: ambiguous test-control: \"%s\"\n"
20154                               "Use \".testctrl --help\" for help\n", zCmd);
20155           rc = 1;
20156           goto meta_command_exit;
20157         }
20158       }
20159     }
20160     if( testctrl<0 ){
20161       utf8_printf(stderr,"Error: unknown test-control: %s\n"
20162                          "Use \".testctrl --help\" for help\n", zCmd);
20163     }else{
20164       switch(testctrl){
20165 
20166         /* sqlite3_test_control(int, db, int) */
20167         case SQLITE_TESTCTRL_OPTIMIZATIONS:
20168           if( nArg==3 ){
20169             unsigned int opt = (unsigned int)strtol(azArg[2], 0, 0);
20170             rc2 = sqlite3_test_control(testctrl, p->db, opt);
20171             isOk = 3;
20172           }
20173           break;
20174 
20175         /* sqlite3_test_control(int) */
20176         case SQLITE_TESTCTRL_PRNG_SAVE:
20177         case SQLITE_TESTCTRL_PRNG_RESTORE:
20178         case SQLITE_TESTCTRL_BYTEORDER:
20179           if( nArg==2 ){
20180             rc2 = sqlite3_test_control(testctrl);
20181             isOk = testctrl==SQLITE_TESTCTRL_BYTEORDER ? 1 : 3;
20182           }
20183           break;
20184 
20185         /* sqlite3_test_control(int, uint) */
20186         case SQLITE_TESTCTRL_PENDING_BYTE:
20187           if( nArg==3 ){
20188             unsigned int opt = (unsigned int)integerValue(azArg[2]);
20189             rc2 = sqlite3_test_control(testctrl, opt);
20190             isOk = 3;
20191           }
20192           break;
20193 
20194         /* sqlite3_test_control(int, int, sqlite3*) */
20195         case SQLITE_TESTCTRL_PRNG_SEED:
20196           if( nArg==3 || nArg==4 ){
20197             int ii = (int)integerValue(azArg[2]);
20198             sqlite3 *db;
20199             if( ii==0 && strcmp(azArg[2],"random")==0 ){
20200               sqlite3_randomness(sizeof(ii),&ii);
20201               printf("-- random seed: %d\n", ii);
20202             }
20203             if( nArg==3 ){
20204               db = 0;
20205             }else{
20206               db = p->db;
20207               /* Make sure the schema has been loaded */
20208               sqlite3_table_column_metadata(db, 0, "x", 0, 0, 0, 0, 0, 0);
20209             }
20210             rc2 = sqlite3_test_control(testctrl, ii, db);
20211             isOk = 3;
20212           }
20213           break;
20214 
20215         /* sqlite3_test_control(int, int) */
20216         case SQLITE_TESTCTRL_ASSERT:
20217         case SQLITE_TESTCTRL_ALWAYS:
20218           if( nArg==3 ){
20219             int opt = booleanValue(azArg[2]);
20220             rc2 = sqlite3_test_control(testctrl, opt);
20221             isOk = 1;
20222           }
20223           break;
20224 
20225         /* sqlite3_test_control(int, int) */
20226         case SQLITE_TESTCTRL_LOCALTIME_FAULT:
20227         case SQLITE_TESTCTRL_NEVER_CORRUPT:
20228           if( nArg==3 ){
20229             int opt = booleanValue(azArg[2]);
20230             rc2 = sqlite3_test_control(testctrl, opt);
20231             isOk = 3;
20232           }
20233           break;
20234 
20235         /* sqlite3_test_control(sqlite3*) */
20236         case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS:
20237           rc2 = sqlite3_test_control(testctrl, p->db);
20238           isOk = 3;
20239           break;
20240 
20241         case SQLITE_TESTCTRL_IMPOSTER:
20242           if( nArg==5 ){
20243             rc2 = sqlite3_test_control(testctrl, p->db,
20244                           azArg[2],
20245                           integerValue(azArg[3]),
20246                           integerValue(azArg[4]));
20247             isOk = 3;
20248           }
20249           break;
20250 
20251         case SQLITE_TESTCTRL_SEEK_COUNT: {
20252           u64 x = 0;
20253           rc2 = sqlite3_test_control(testctrl, p->db, &x);
20254           utf8_printf(p->out, "%llu\n", x);
20255           isOk = 3;
20256           break;
20257         }
20258 
20259 #ifdef YYCOVERAGE
20260         case SQLITE_TESTCTRL_PARSER_COVERAGE:
20261           if( nArg==2 ){
20262             sqlite3_test_control(testctrl, p->out);
20263             isOk = 3;
20264           }
20265 #endif
20266       }
20267     }
20268     if( isOk==0 && iCtrl>=0 ){
20269       utf8_printf(p->out, "Usage: .testctrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage);
20270       rc = 1;
20271     }else if( isOk==1 ){
20272       raw_printf(p->out, "%d\n", rc2);
20273     }else if( isOk==2 ){
20274       raw_printf(p->out, "0x%08x\n", rc2);
20275     }
20276   }else
20277 #endif /* !defined(SQLITE_UNTESTABLE) */
20278 
20279   if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 ){
20280     open_db(p, 0);
20281     sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0);
20282   }else
20283 
20284   if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 ){
20285     if( nArg==2 ){
20286       enableTimer = booleanValue(azArg[1]);
20287       if( enableTimer && !HAS_TIMER ){
20288         raw_printf(stderr, "Error: timer not available on this system.\n");
20289         enableTimer = 0;
20290       }
20291     }else{
20292       raw_printf(stderr, "Usage: .timer on|off\n");
20293       rc = 1;
20294     }
20295   }else
20296 
20297 #ifndef SQLITE_OMIT_TRACE
20298   if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){
20299     int mType = 0;
20300     int jj;
20301     open_db(p, 0);
20302     for(jj=1; jj<nArg; jj++){
20303       const char *z = azArg[jj];
20304       if( z[0]=='-' ){
20305         if( optionMatch(z, "expanded") ){
20306           p->eTraceType = SHELL_TRACE_EXPANDED;
20307         }
20308 #ifdef SQLITE_ENABLE_NORMALIZE
20309         else if( optionMatch(z, "normalized") ){
20310           p->eTraceType = SHELL_TRACE_NORMALIZED;
20311         }
20312 #endif
20313         else if( optionMatch(z, "plain") ){
20314           p->eTraceType = SHELL_TRACE_PLAIN;
20315         }
20316         else if( optionMatch(z, "profile") ){
20317           mType |= SQLITE_TRACE_PROFILE;
20318         }
20319         else if( optionMatch(z, "row") ){
20320           mType |= SQLITE_TRACE_ROW;
20321         }
20322         else if( optionMatch(z, "stmt") ){
20323           mType |= SQLITE_TRACE_STMT;
20324         }
20325         else if( optionMatch(z, "close") ){
20326           mType |= SQLITE_TRACE_CLOSE;
20327         }
20328         else {
20329           raw_printf(stderr, "Unknown option \"%s\" on \".trace\"\n", z);
20330           rc = 1;
20331           goto meta_command_exit;
20332         }
20333       }else{
20334         output_file_close(p->traceOut);
20335         p->traceOut = output_file_open(azArg[1], 0);
20336       }
20337     }
20338     if( p->traceOut==0 ){
20339       sqlite3_trace_v2(p->db, 0, 0, 0);
20340     }else{
20341       if( mType==0 ) mType = SQLITE_TRACE_STMT;
20342       sqlite3_trace_v2(p->db, mType, sql_trace_callback, p);
20343     }
20344   }else
20345 #endif /* !defined(SQLITE_OMIT_TRACE) */
20346 
20347 #if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_VIRTUALTABLE)
20348   if( c=='u' && strncmp(azArg[0], "unmodule", n)==0 ){
20349     int ii;
20350     int lenOpt;
20351     char *zOpt;
20352     if( nArg<2 ){
20353       raw_printf(stderr, "Usage: .unmodule [--allexcept] NAME ...\n");
20354       rc = 1;
20355       goto meta_command_exit;
20356     }
20357     open_db(p, 0);
20358     zOpt = azArg[1];
20359     if( zOpt[0]=='-' && zOpt[1]=='-' && zOpt[2]!=0 ) zOpt++;
20360     lenOpt = (int)strlen(zOpt);
20361     if( lenOpt>=3 && strncmp(zOpt, "-allexcept",lenOpt)==0 ){
20362       assert( azArg[nArg]==0 );
20363       sqlite3_drop_modules(p->db, nArg>2 ? (const char**)(azArg+2) : 0);
20364     }else{
20365       for(ii=1; ii<nArg; ii++){
20366         sqlite3_create_module(p->db, azArg[ii], 0, 0);
20367       }
20368     }
20369   }else
20370 #endif
20371 
20372 #if SQLITE_USER_AUTHENTICATION
20373   if( c=='u' && strncmp(azArg[0], "user", n)==0 ){
20374     if( nArg<2 ){
20375       raw_printf(stderr, "Usage: .user SUBCOMMAND ...\n");
20376       rc = 1;
20377       goto meta_command_exit;
20378     }
20379     open_db(p, 0);
20380     if( strcmp(azArg[1],"login")==0 ){
20381       if( nArg!=4 ){
20382         raw_printf(stderr, "Usage: .user login USER PASSWORD\n");
20383         rc = 1;
20384         goto meta_command_exit;
20385       }
20386       rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3],
20387                                      strlen30(azArg[3]));
20388       if( rc ){
20389         utf8_printf(stderr, "Authentication failed for user %s\n", azArg[2]);
20390         rc = 1;
20391       }
20392     }else if( strcmp(azArg[1],"add")==0 ){
20393       if( nArg!=5 ){
20394         raw_printf(stderr, "Usage: .user add USER PASSWORD ISADMIN\n");
20395         rc = 1;
20396         goto meta_command_exit;
20397       }
20398       rc = sqlite3_user_add(p->db, azArg[2], azArg[3], strlen30(azArg[3]),
20399                             booleanValue(azArg[4]));
20400       if( rc ){
20401         raw_printf(stderr, "User-Add failed: %d\n", rc);
20402         rc = 1;
20403       }
20404     }else if( strcmp(azArg[1],"edit")==0 ){
20405       if( nArg!=5 ){
20406         raw_printf(stderr, "Usage: .user edit USER PASSWORD ISADMIN\n");
20407         rc = 1;
20408         goto meta_command_exit;
20409       }
20410       rc = sqlite3_user_change(p->db, azArg[2], azArg[3], strlen30(azArg[3]),
20411                               booleanValue(azArg[4]));
20412       if( rc ){
20413         raw_printf(stderr, "User-Edit failed: %d\n", rc);
20414         rc = 1;
20415       }
20416     }else if( strcmp(azArg[1],"delete")==0 ){
20417       if( nArg!=3 ){
20418         raw_printf(stderr, "Usage: .user delete USER\n");
20419         rc = 1;
20420         goto meta_command_exit;
20421       }
20422       rc = sqlite3_user_delete(p->db, azArg[2]);
20423       if( rc ){
20424         raw_printf(stderr, "User-Delete failed: %d\n", rc);
20425         rc = 1;
20426       }
20427     }else{
20428       raw_printf(stderr, "Usage: .user login|add|edit|delete ...\n");
20429       rc = 1;
20430       goto meta_command_exit;
20431     }
20432   }else
20433 #endif /* SQLITE_USER_AUTHENTICATION */
20434 
20435   if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
20436     utf8_printf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
20437         sqlite3_libversion(), sqlite3_sourceid());
20438 #if SQLITE_HAVE_ZLIB
20439     utf8_printf(p->out, "zlib version %s\n", zlibVersion());
20440 #endif
20441 #define CTIMEOPT_VAL_(opt) #opt
20442 #define CTIMEOPT_VAL(opt) CTIMEOPT_VAL_(opt)
20443 #if defined(__clang__) && defined(__clang_major__)
20444     utf8_printf(p->out, "clang-" CTIMEOPT_VAL(__clang_major__) "."
20445                     CTIMEOPT_VAL(__clang_minor__) "."
20446                     CTIMEOPT_VAL(__clang_patchlevel__) "\n");
20447 #elif defined(_MSC_VER)
20448     utf8_printf(p->out, "msvc-" CTIMEOPT_VAL(_MSC_VER) "\n");
20449 #elif defined(__GNUC__) && defined(__VERSION__)
20450     utf8_printf(p->out, "gcc-" __VERSION__ "\n");
20451 #endif
20452   }else
20453 
20454   if( c=='v' && strncmp(azArg[0], "vfsinfo", n)==0 ){
20455     const char *zDbName = nArg==2 ? azArg[1] : "main";
20456     sqlite3_vfs *pVfs = 0;
20457     if( p->db ){
20458       sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFS_POINTER, &pVfs);
20459       if( pVfs ){
20460         utf8_printf(p->out, "vfs.zName      = \"%s\"\n", pVfs->zName);
20461         raw_printf(p->out, "vfs.iVersion   = %d\n", pVfs->iVersion);
20462         raw_printf(p->out, "vfs.szOsFile   = %d\n", pVfs->szOsFile);
20463         raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
20464       }
20465     }
20466   }else
20467 
20468   if( c=='v' && strncmp(azArg[0], "vfslist", n)==0 ){
20469     sqlite3_vfs *pVfs;
20470     sqlite3_vfs *pCurrent = 0;
20471     if( p->db ){
20472       sqlite3_file_control(p->db, "main", SQLITE_FCNTL_VFS_POINTER, &pCurrent);
20473     }
20474     for(pVfs=sqlite3_vfs_find(0); pVfs; pVfs=pVfs->pNext){
20475       utf8_printf(p->out, "vfs.zName      = \"%s\"%s\n", pVfs->zName,
20476            pVfs==pCurrent ? "  <--- CURRENT" : "");
20477       raw_printf(p->out, "vfs.iVersion   = %d\n", pVfs->iVersion);
20478       raw_printf(p->out, "vfs.szOsFile   = %d\n", pVfs->szOsFile);
20479       raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
20480       if( pVfs->pNext ){
20481         raw_printf(p->out, "-----------------------------------\n");
20482       }
20483     }
20484   }else
20485 
20486   if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
20487     const char *zDbName = nArg==2 ? azArg[1] : "main";
20488     char *zVfsName = 0;
20489     if( p->db ){
20490       sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
20491       if( zVfsName ){
20492         utf8_printf(p->out, "%s\n", zVfsName);
20493         sqlite3_free(zVfsName);
20494       }
20495     }
20496   }else
20497 
20498   if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
20499     unsigned int x = nArg>=2 ? (unsigned int)integerValue(azArg[1]) : 0xffffffff;
20500     sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &x);
20501   }else
20502 
20503   if( c=='w' && strncmp(azArg[0], "width", n)==0 ){
20504     int j;
20505     assert( nArg<=ArraySize(azArg) );
20506     p->nWidth = nArg-1;
20507     p->colWidth = realloc(p->colWidth, p->nWidth*sizeof(int)*2);
20508     if( p->colWidth==0 && p->nWidth>0 ) shell_out_of_memory();
20509     if( p->nWidth ) p->actualWidth = &p->colWidth[p->nWidth];
20510     for(j=1; j<nArg; j++){
20511       p->colWidth[j-1] = (int)integerValue(azArg[j]);
20512     }
20513   }else
20514 
20515   {
20516     utf8_printf(stderr, "Error: unknown command or invalid arguments: "
20517       " \"%s\". Enter \".help\" for help\n", azArg[0]);
20518     rc = 1;
20519   }
20520 
20521 meta_command_exit:
20522   if( p->outCount ){
20523     p->outCount--;
20524     if( p->outCount==0 ) output_reset(p);
20525   }
20526   return rc;
20527 }
20528 
20529 /*
20530 ** Return TRUE if a semicolon occurs anywhere in the first N characters
20531 ** of string z[].
20532 */
20533 static int line_contains_semicolon(const char *z, int N){
20534   int i;
20535   for(i=0; i<N; i++){  if( z[i]==';' ) return 1; }
20536   return 0;
20537 }
20538 
20539 /*
20540 ** Test to see if a line consists entirely of whitespace.
20541 */
20542 static int _all_whitespace(const char *z){
20543   for(; *z; z++){
20544     if( IsSpace(z[0]) ) continue;
20545     if( *z=='/' && z[1]=='*' ){
20546       z += 2;
20547       while( *z && (*z!='*' || z[1]!='/') ){ z++; }
20548       if( *z==0 ) return 0;
20549       z++;
20550       continue;
20551     }
20552     if( *z=='-' && z[1]=='-' ){
20553       z += 2;
20554       while( *z && *z!='\n' ){ z++; }
20555       if( *z==0 ) return 1;
20556       continue;
20557     }
20558     return 0;
20559   }
20560   return 1;
20561 }
20562 
20563 /*
20564 ** Return TRUE if the line typed in is an SQL command terminator other
20565 ** than a semi-colon.  The SQL Server style "go" command is understood
20566 ** as is the Oracle "/".
20567 */
20568 static int line_is_command_terminator(const char *zLine){
20569   while( IsSpace(zLine[0]) ){ zLine++; };
20570   if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){
20571     return 1;  /* Oracle */
20572   }
20573   if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o'
20574          && _all_whitespace(&zLine[2]) ){
20575     return 1;  /* SQL Server */
20576   }
20577   return 0;
20578 }
20579 
20580 /*
20581 ** We need a default sqlite3_complete() implementation to use in case
20582 ** the shell is compiled with SQLITE_OMIT_COMPLETE.  The default assumes
20583 ** any arbitrary text is a complete SQL statement.  This is not very
20584 ** user-friendly, but it does seem to work.
20585 */
20586 #ifdef SQLITE_OMIT_COMPLETE
20587 #define sqlite3_complete(x) 1
20588 #endif
20589 
20590 /*
20591 ** Return true if zSql is a complete SQL statement.  Return false if it
20592 ** ends in the middle of a string literal or C-style comment.
20593 */
20594 static int line_is_complete(char *zSql, int nSql){
20595   int rc;
20596   if( zSql==0 ) return 1;
20597   zSql[nSql] = ';';
20598   zSql[nSql+1] = 0;
20599   rc = sqlite3_complete(zSql);
20600   zSql[nSql] = 0;
20601   return rc;
20602 }
20603 
20604 /*
20605 ** Run a single line of SQL.  Return the number of errors.
20606 */
20607 static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){
20608   int rc;
20609   char *zErrMsg = 0;
20610 
20611   open_db(p, 0);
20612   if( ShellHasFlag(p,SHFLG_Backslash) ) resolve_backslashes(zSql);
20613   if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0;
20614   BEGIN_TIMER;
20615   rc = shell_exec(p, zSql, &zErrMsg);
20616   END_TIMER;
20617   if( rc || zErrMsg ){
20618     char zPrefix[100];
20619     if( in!=0 || !stdin_is_interactive ){
20620       sqlite3_snprintf(sizeof(zPrefix), zPrefix,
20621                        "Error: near line %d:", startline);
20622     }else{
20623       sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
20624     }
20625     if( zErrMsg!=0 ){
20626       utf8_printf(stderr, "%s %s\n", zPrefix, zErrMsg);
20627       sqlite3_free(zErrMsg);
20628       zErrMsg = 0;
20629     }else{
20630       utf8_printf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
20631     }
20632     return 1;
20633   }else if( ShellHasFlag(p, SHFLG_CountChanges) ){
20634     raw_printf(p->out, "changes: %3d   total_changes: %d\n",
20635             sqlite3_changes(p->db), sqlite3_total_changes(p->db));
20636   }
20637   return 0;
20638 }
20639 
20640 
20641 /*
20642 ** Read input from *in and process it.  If *in==0 then input
20643 ** is interactive - the user is typing it it.  Otherwise, input
20644 ** is coming from a file or device.  A prompt is issued and history
20645 ** is saved only if input is interactive.  An interrupt signal will
20646 ** cause this routine to exit immediately, unless input is interactive.
20647 **
20648 ** Return the number of errors.
20649 */
20650 static int process_input(ShellState *p){
20651   char *zLine = 0;          /* A single input line */
20652   char *zSql = 0;           /* Accumulated SQL text */
20653   int nLine;                /* Length of current line */
20654   int nSql = 0;             /* Bytes of zSql[] used */
20655   int nAlloc = 0;           /* Allocated zSql[] space */
20656   int nSqlPrior = 0;        /* Bytes of zSql[] used by prior line */
20657   int rc;                   /* Error code */
20658   int errCnt = 0;           /* Number of errors seen */
20659   int startline = 0;        /* Line number for start of current input */
20660 
20661   p->lineno = 0;
20662   while( errCnt==0 || !bail_on_error || (p->in==0 && stdin_is_interactive) ){
20663     fflush(p->out);
20664     zLine = one_input_line(p->in, zLine, nSql>0);
20665     if( zLine==0 ){
20666       /* End of input */
20667       if( p->in==0 && stdin_is_interactive ) printf("\n");
20668       break;
20669     }
20670     if( seenInterrupt ){
20671       if( p->in!=0 ) break;
20672       seenInterrupt = 0;
20673     }
20674     p->lineno++;
20675     if( nSql==0 && _all_whitespace(zLine) ){
20676       if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine);
20677       continue;
20678     }
20679     if( zLine && (zLine[0]=='.' || zLine[0]=='#') && nSql==0 ){
20680       if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine);
20681       if( zLine[0]=='.' ){
20682         rc = do_meta_command(zLine, p);
20683         if( rc==2 ){ /* exit requested */
20684           break;
20685         }else if( rc ){
20686           errCnt++;
20687         }
20688       }
20689       continue;
20690     }
20691     if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){
20692       memcpy(zLine,";",2);
20693     }
20694     nLine = strlen30(zLine);
20695     if( nSql+nLine+2>=nAlloc ){
20696       nAlloc = nSql+nLine+100;
20697       zSql = realloc(zSql, nAlloc);
20698       if( zSql==0 ) shell_out_of_memory();
20699     }
20700     nSqlPrior = nSql;
20701     if( nSql==0 ){
20702       int i;
20703       for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
20704       assert( nAlloc>0 && zSql!=0 );
20705       memcpy(zSql, zLine+i, nLine+1-i);
20706       startline = p->lineno;
20707       nSql = nLine-i;
20708     }else{
20709       zSql[nSql++] = '\n';
20710       memcpy(zSql+nSql, zLine, nLine+1);
20711       nSql += nLine;
20712     }
20713     if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
20714                 && sqlite3_complete(zSql) ){
20715       errCnt += runOneSqlLine(p, zSql, p->in, startline);
20716       nSql = 0;
20717       if( p->outCount ){
20718         output_reset(p);
20719         p->outCount = 0;
20720       }else{
20721         clearTempFile(p);
20722       }
20723     }else if( nSql && _all_whitespace(zSql) ){
20724       if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zSql);
20725       nSql = 0;
20726     }
20727   }
20728   if( nSql && !_all_whitespace(zSql) ){
20729     errCnt += runOneSqlLine(p, zSql, p->in, startline);
20730   }
20731   free(zSql);
20732   free(zLine);
20733   return errCnt>0;
20734 }
20735 
20736 /*
20737 ** Return a pathname which is the user's home directory.  A
20738 ** 0 return indicates an error of some kind.
20739 */
20740 static char *find_home_dir(int clearFlag){
20741   static char *home_dir = NULL;
20742   if( clearFlag ){
20743     free(home_dir);
20744     home_dir = 0;
20745     return 0;
20746   }
20747   if( home_dir ) return home_dir;
20748 
20749 #if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) \
20750      && !defined(__RTP__) && !defined(_WRS_KERNEL)
20751   {
20752     struct passwd *pwent;
20753     uid_t uid = getuid();
20754     if( (pwent=getpwuid(uid)) != NULL) {
20755       home_dir = pwent->pw_dir;
20756     }
20757   }
20758 #endif
20759 
20760 #if defined(_WIN32_WCE)
20761   /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
20762    */
20763   home_dir = "/";
20764 #else
20765 
20766 #if defined(_WIN32) || defined(WIN32)
20767   if (!home_dir) {
20768     home_dir = getenv("USERPROFILE");
20769   }
20770 #endif
20771 
20772   if (!home_dir) {
20773     home_dir = getenv("HOME");
20774   }
20775 
20776 #if defined(_WIN32) || defined(WIN32)
20777   if (!home_dir) {
20778     char *zDrive, *zPath;
20779     int n;
20780     zDrive = getenv("HOMEDRIVE");
20781     zPath = getenv("HOMEPATH");
20782     if( zDrive && zPath ){
20783       n = strlen30(zDrive) + strlen30(zPath) + 1;
20784       home_dir = malloc( n );
20785       if( home_dir==0 ) return 0;
20786       sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
20787       return home_dir;
20788     }
20789     home_dir = "c:\\";
20790   }
20791 #endif
20792 
20793 #endif /* !_WIN32_WCE */
20794 
20795   if( home_dir ){
20796     int n = strlen30(home_dir) + 1;
20797     char *z = malloc( n );
20798     if( z ) memcpy(z, home_dir, n);
20799     home_dir = z;
20800   }
20801 
20802   return home_dir;
20803 }
20804 
20805 /*
20806 ** Read input from the file given by sqliterc_override.  Or if that
20807 ** parameter is NULL, take input from ~/.sqliterc
20808 **
20809 ** Returns the number of errors.
20810 */
20811 static void process_sqliterc(
20812   ShellState *p,                  /* Configuration data */
20813   const char *sqliterc_override   /* Name of config file. NULL to use default */
20814 ){
20815   char *home_dir = NULL;
20816   const char *sqliterc = sqliterc_override;
20817   char *zBuf = 0;
20818   FILE *inSaved = p->in;
20819   int savedLineno = p->lineno;
20820 
20821   if (sqliterc == NULL) {
20822     home_dir = find_home_dir(0);
20823     if( home_dir==0 ){
20824       raw_printf(stderr, "-- warning: cannot find home directory;"
20825                       " cannot read ~/.sqliterc\n");
20826       return;
20827     }
20828     zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
20829     sqliterc = zBuf;
20830   }
20831   p->in = fopen(sqliterc,"rb");
20832   if( p->in ){
20833     if( stdin_is_interactive ){
20834       utf8_printf(stderr,"-- Loading resources from %s\n",sqliterc);
20835     }
20836     if( process_input(p) && bail_on_error ) exit(1);
20837     fclose(p->in);
20838   }else if( sqliterc_override!=0 ){
20839     utf8_printf(stderr,"cannot open: \"%s\"\n", sqliterc);
20840     if( bail_on_error ) exit(1);
20841   }
20842   p->in = inSaved;
20843   p->lineno = savedLineno;
20844   sqlite3_free(zBuf);
20845 }
20846 
20847 /*
20848 ** Show available command line options
20849 */
20850 static const char zOptions[] =
20851 #if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE)
20852   "   -A ARGS...           run \".archive ARGS\" and exit\n"
20853 #endif
20854   "   -append              append the database to the end of the file\n"
20855   "   -ascii               set output mode to 'ascii'\n"
20856   "   -bail                stop after hitting an error\n"
20857   "   -batch               force batch I/O\n"
20858   "   -box                 set output mode to 'box'\n"
20859   "   -column              set output mode to 'column'\n"
20860   "   -cmd COMMAND         run \"COMMAND\" before reading stdin\n"
20861   "   -csv                 set output mode to 'csv'\n"
20862 #if defined(SQLITE_ENABLE_DESERIALIZE)
20863   "   -deserialize         open the database using sqlite3_deserialize()\n"
20864 #endif
20865   "   -echo                print commands before execution\n"
20866   "   -init FILENAME       read/process named file\n"
20867   "   -[no]header          turn headers on or off\n"
20868 #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
20869   "   -heap SIZE           Size of heap for memsys3 or memsys5\n"
20870 #endif
20871   "   -help                show this message\n"
20872   "   -html                set output mode to HTML\n"
20873   "   -interactive         force interactive I/O\n"
20874   "   -json                set output mode to 'json'\n"
20875   "   -line                set output mode to 'line'\n"
20876   "   -list                set output mode to 'list'\n"
20877   "   -lookaside SIZE N    use N entries of SZ bytes for lookaside memory\n"
20878   "   -markdown            set output mode to 'markdown'\n"
20879 #if defined(SQLITE_ENABLE_DESERIALIZE)
20880   "   -maxsize N           maximum size for a --deserialize database\n"
20881 #endif
20882   "   -memtrace            trace all memory allocations and deallocations\n"
20883   "   -mmap N              default mmap size set to N\n"
20884 #ifdef SQLITE_ENABLE_MULTIPLEX
20885   "   -multiplex           enable the multiplexor VFS\n"
20886 #endif
20887   "   -newline SEP         set output row separator. Default: '\\n'\n"
20888   "   -nofollow            refuse to open symbolic links to database files\n"
20889   "   -nullvalue TEXT      set text string for NULL values. Default ''\n"
20890   "   -pagecache SIZE N    use N slots of SZ bytes each for page cache memory\n"
20891   "   -quote               set output mode to 'quote'\n"
20892   "   -readonly            open the database read-only\n"
20893   "   -separator SEP       set output column separator. Default: '|'\n"
20894 #ifdef SQLITE_ENABLE_SORTER_REFERENCES
20895   "   -sorterref SIZE      sorter references threshold size\n"
20896 #endif
20897   "   -stats               print memory stats before each finalize\n"
20898   "   -table               set output mode to 'table'\n"
20899   "   -tabs                set output mode to 'tabs'\n"
20900   "   -version             show SQLite version\n"
20901   "   -vfs NAME            use NAME as the default VFS\n"
20902 #ifdef SQLITE_ENABLE_VFSTRACE
20903   "   -vfstrace            enable tracing of all VFS calls\n"
20904 #endif
20905 #ifdef SQLITE_HAVE_ZLIB
20906   "   -zip                 open the file as a ZIP Archive\n"
20907 #endif
20908 ;
20909 static void usage(int showDetail){
20910   utf8_printf(stderr,
20911       "Usage: %s [OPTIONS] FILENAME [SQL]\n"
20912       "FILENAME is the name of an SQLite database. A new database is created\n"
20913       "if the file does not previously exist.\n", Argv0);
20914   if( showDetail ){
20915     utf8_printf(stderr, "OPTIONS include:\n%s", zOptions);
20916   }else{
20917     raw_printf(stderr, "Use the -help option for additional information\n");
20918   }
20919   exit(1);
20920 }
20921 
20922 /*
20923 ** Internal check:  Verify that the SQLite is uninitialized.  Print a
20924 ** error message if it is initialized.
20925 */
20926 static void verify_uninitialized(void){
20927   if( sqlite3_config(-1)==SQLITE_MISUSE ){
20928     utf8_printf(stdout, "WARNING: attempt to configure SQLite after"
20929                         " initialization.\n");
20930   }
20931 }
20932 
20933 /*
20934 ** Initialize the state information in data
20935 */
20936 static void main_init(ShellState *data) {
20937   memset(data, 0, sizeof(*data));
20938   data->normalMode = data->cMode = data->mode = MODE_List;
20939   data->autoExplain = 1;
20940   memcpy(data->colSeparator,SEP_Column, 2);
20941   memcpy(data->rowSeparator,SEP_Row, 2);
20942   data->showHeader = 0;
20943   data->shellFlgs = SHFLG_Lookaside;
20944   verify_uninitialized();
20945   sqlite3_config(SQLITE_CONFIG_URI, 1);
20946   sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
20947   sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
20948   sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
20949   sqlite3_snprintf(sizeof(continuePrompt), continuePrompt,"   ...> ");
20950 }
20951 
20952 /*
20953 ** Output text to the console in a font that attracts extra attention.
20954 */
20955 #ifdef _WIN32
20956 static void printBold(const char *zText){
20957 #if !SQLITE_OS_WINRT
20958   HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
20959   CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
20960   GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
20961   SetConsoleTextAttribute(out,
20962          FOREGROUND_RED|FOREGROUND_INTENSITY
20963   );
20964 #endif
20965   printf("%s", zText);
20966 #if !SQLITE_OS_WINRT
20967   SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
20968 #endif
20969 }
20970 #else
20971 static void printBold(const char *zText){
20972   printf("\033[1m%s\033[0m", zText);
20973 }
20974 #endif
20975 
20976 /*
20977 ** Get the argument to an --option.  Throw an error and die if no argument
20978 ** is available.
20979 */
20980 static char *cmdline_option_value(int argc, char **argv, int i){
20981   if( i==argc ){
20982     utf8_printf(stderr, "%s: Error: missing argument to %s\n",
20983             argv[0], argv[argc-1]);
20984     exit(1);
20985   }
20986   return argv[i];
20987 }
20988 
20989 #ifndef SQLITE_SHELL_IS_UTF8
20990 #  if (defined(_WIN32) || defined(WIN32)) \
20991    && (defined(_MSC_VER) || (defined(UNICODE) && defined(__GNUC__)))
20992 #    define SQLITE_SHELL_IS_UTF8          (0)
20993 #  else
20994 #    define SQLITE_SHELL_IS_UTF8          (1)
20995 #  endif
20996 #endif
20997 
20998 #if SQLITE_SHELL_IS_UTF8
20999 int SQLITE_CDECL main(int argc, char **argv){
21000 #else
21001 int SQLITE_CDECL wmain(int argc, wchar_t **wargv){
21002   char **argv;
21003 #endif
21004   char *zErrMsg = 0;
21005   ShellState data;
21006   const char *zInitFile = 0;
21007   int i;
21008   int rc = 0;
21009   int warnInmemoryDb = 0;
21010   int readStdin = 1;
21011   int nCmd = 0;
21012   char **azCmd = 0;
21013   const char *zVfs = 0;           /* Value of -vfs command-line option */
21014 #if !SQLITE_SHELL_IS_UTF8
21015   char **argvToFree = 0;
21016   int argcToFree = 0;
21017 #endif
21018 
21019   setBinaryMode(stdin, 0);
21020   setvbuf(stderr, 0, _IONBF, 0); /* Make sure stderr is unbuffered */
21021   stdin_is_interactive = isatty(0);
21022   stdout_is_console = isatty(1);
21023 
21024 #ifdef SQLITE_DEBUG
21025   registerOomSimulator();
21026 #endif
21027 
21028 #if !defined(_WIN32_WCE)
21029   if( getenv("SQLITE_DEBUG_BREAK") ){
21030     if( isatty(0) && isatty(2) ){
21031       fprintf(stderr,
21032           "attach debugger to process %d and press any key to continue.\n",
21033           GETPID());
21034       fgetc(stdin);
21035     }else{
21036 #if defined(_WIN32) || defined(WIN32)
21037 #if SQLITE_OS_WINRT
21038       __debugbreak();
21039 #else
21040       DebugBreak();
21041 #endif
21042 #elif defined(SIGTRAP)
21043       raise(SIGTRAP);
21044 #endif
21045     }
21046   }
21047 #endif
21048 
21049 #if USE_SYSTEM_SQLITE+0!=1
21050   if( strncmp(sqlite3_sourceid(),SQLITE_SOURCE_ID,60)!=0 ){
21051     utf8_printf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
21052             sqlite3_sourceid(), SQLITE_SOURCE_ID);
21053     exit(1);
21054   }
21055 #endif
21056   main_init(&data);
21057 
21058   /* On Windows, we must translate command-line arguments into UTF-8.
21059   ** The SQLite memory allocator subsystem has to be enabled in order to
21060   ** do this.  But we want to run an sqlite3_shutdown() afterwards so that
21061   ** subsequent sqlite3_config() calls will work.  So copy all results into
21062   ** memory that does not come from the SQLite memory allocator.
21063   */
21064 #if !SQLITE_SHELL_IS_UTF8
21065   sqlite3_initialize();
21066   argvToFree = malloc(sizeof(argv[0])*argc*2);
21067   argcToFree = argc;
21068   argv = argvToFree + argc;
21069   if( argv==0 ) shell_out_of_memory();
21070   for(i=0; i<argc; i++){
21071     char *z = sqlite3_win32_unicode_to_utf8(wargv[i]);
21072     int n;
21073     if( z==0 ) shell_out_of_memory();
21074     n = (int)strlen(z);
21075     argv[i] = malloc( n+1 );
21076     if( argv[i]==0 ) shell_out_of_memory();
21077     memcpy(argv[i], z, n+1);
21078     argvToFree[i] = argv[i];
21079     sqlite3_free(z);
21080   }
21081   sqlite3_shutdown();
21082 #endif
21083 
21084   assert( argc>=1 && argv && argv[0] );
21085   Argv0 = argv[0];
21086 
21087   /* Make sure we have a valid signal handler early, before anything
21088   ** else is done.
21089   */
21090 #ifdef SIGINT
21091   signal(SIGINT, interrupt_handler);
21092 #elif (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE)
21093   SetConsoleCtrlHandler(ConsoleCtrlHandler, TRUE);
21094 #endif
21095 
21096 #ifdef SQLITE_SHELL_DBNAME_PROC
21097   {
21098     /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name
21099     ** of a C-function that will provide the name of the database file.  Use
21100     ** this compile-time option to embed this shell program in larger
21101     ** applications. */
21102     extern void SQLITE_SHELL_DBNAME_PROC(const char**);
21103     SQLITE_SHELL_DBNAME_PROC(&data.zDbFilename);
21104     warnInmemoryDb = 0;
21105   }
21106 #endif
21107 
21108   /* Do an initial pass through the command-line argument to locate
21109   ** the name of the database file, the name of the initialization file,
21110   ** the size of the alternative malloc heap,
21111   ** and the first command to execute.
21112   */
21113   verify_uninitialized();
21114   for(i=1; i<argc; i++){
21115     char *z;
21116     z = argv[i];
21117     if( z[0]!='-' ){
21118       if( data.zDbFilename==0 ){
21119         data.zDbFilename = z;
21120       }else{
21121         /* Excesss arguments are interpreted as SQL (or dot-commands) and
21122         ** mean that nothing is read from stdin */
21123         readStdin = 0;
21124         nCmd++;
21125         azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd);
21126         if( azCmd==0 ) shell_out_of_memory();
21127         azCmd[nCmd-1] = z;
21128       }
21129     }
21130     if( z[1]=='-' ) z++;
21131     if( strcmp(z,"-separator")==0
21132      || strcmp(z,"-nullvalue")==0
21133      || strcmp(z,"-newline")==0
21134      || strcmp(z,"-cmd")==0
21135     ){
21136       (void)cmdline_option_value(argc, argv, ++i);
21137     }else if( strcmp(z,"-init")==0 ){
21138       zInitFile = cmdline_option_value(argc, argv, ++i);
21139     }else if( strcmp(z,"-batch")==0 ){
21140       /* Need to check for batch mode here to so we can avoid printing
21141       ** informational messages (like from process_sqliterc) before
21142       ** we do the actual processing of arguments later in a second pass.
21143       */
21144       stdin_is_interactive = 0;
21145     }else if( strcmp(z,"-heap")==0 ){
21146 #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
21147       const char *zSize;
21148       sqlite3_int64 szHeap;
21149 
21150       zSize = cmdline_option_value(argc, argv, ++i);
21151       szHeap = integerValue(zSize);
21152       if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
21153       sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
21154 #else
21155       (void)cmdline_option_value(argc, argv, ++i);
21156 #endif
21157     }else if( strcmp(z,"-pagecache")==0 ){
21158       sqlite3_int64 n, sz;
21159       sz = integerValue(cmdline_option_value(argc,argv,++i));
21160       if( sz>70000 ) sz = 70000;
21161       if( sz<0 ) sz = 0;
21162       n = integerValue(cmdline_option_value(argc,argv,++i));
21163       if( sz>0 && n>0 && 0xffffffffffffLL/sz<n ){
21164         n = 0xffffffffffffLL/sz;
21165       }
21166       sqlite3_config(SQLITE_CONFIG_PAGECACHE,
21167                     (n>0 && sz>0) ? malloc(n*sz) : 0, sz, n);
21168       data.shellFlgs |= SHFLG_Pagecache;
21169     }else if( strcmp(z,"-lookaside")==0 ){
21170       int n, sz;
21171       sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
21172       if( sz<0 ) sz = 0;
21173       n = (int)integerValue(cmdline_option_value(argc,argv,++i));
21174       if( n<0 ) n = 0;
21175       sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n);
21176       if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside;
21177 #ifdef SQLITE_ENABLE_VFSTRACE
21178     }else if( strcmp(z,"-vfstrace")==0 ){
21179       extern int vfstrace_register(
21180          const char *zTraceName,
21181          const char *zOldVfsName,
21182          int (*xOut)(const char*,void*),
21183          void *pOutArg,
21184          int makeDefault
21185       );
21186       vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
21187 #endif
21188 #ifdef SQLITE_ENABLE_MULTIPLEX
21189     }else if( strcmp(z,"-multiplex")==0 ){
21190       extern int sqlite3_multiple_initialize(const char*,int);
21191       sqlite3_multiplex_initialize(0, 1);
21192 #endif
21193     }else if( strcmp(z,"-mmap")==0 ){
21194       sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
21195       sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
21196 #ifdef SQLITE_ENABLE_SORTER_REFERENCES
21197     }else if( strcmp(z,"-sorterref")==0 ){
21198       sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
21199       sqlite3_config(SQLITE_CONFIG_SORTERREF_SIZE, (int)sz);
21200 #endif
21201     }else if( strcmp(z,"-vfs")==0 ){
21202       zVfs = cmdline_option_value(argc, argv, ++i);
21203 #ifdef SQLITE_HAVE_ZLIB
21204     }else if( strcmp(z,"-zip")==0 ){
21205       data.openMode = SHELL_OPEN_ZIPFILE;
21206 #endif
21207     }else if( strcmp(z,"-append")==0 ){
21208       data.openMode = SHELL_OPEN_APPENDVFS;
21209 #ifdef SQLITE_ENABLE_DESERIALIZE
21210     }else if( strcmp(z,"-deserialize")==0 ){
21211       data.openMode = SHELL_OPEN_DESERIALIZE;
21212     }else if( strcmp(z,"-maxsize")==0 && i+1<argc ){
21213       data.szMax = integerValue(argv[++i]);
21214 #endif
21215     }else if( strcmp(z,"-readonly")==0 ){
21216       data.openMode = SHELL_OPEN_READONLY;
21217     }else if( strcmp(z,"-nofollow")==0 ){
21218       data.openFlags = SQLITE_OPEN_NOFOLLOW;
21219 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
21220     }else if( strncmp(z, "-A",2)==0 ){
21221       /* All remaining command-line arguments are passed to the ".archive"
21222       ** command, so ignore them */
21223       break;
21224 #endif
21225     }else if( strcmp(z, "-memtrace")==0 ){
21226       sqlite3MemTraceActivate(stderr);
21227     }else if( strcmp(z,"-bail")==0 ){
21228       bail_on_error = 1;
21229     }
21230   }
21231   verify_uninitialized();
21232 
21233 
21234 #ifdef SQLITE_SHELL_INIT_PROC
21235   {
21236     /* If the SQLITE_SHELL_INIT_PROC macro is defined, then it is the name
21237     ** of a C-function that will perform initialization actions on SQLite that
21238     ** occur just before or after sqlite3_initialize(). Use this compile-time
21239     ** option to embed this shell program in larger applications. */
21240     extern void SQLITE_SHELL_INIT_PROC(void);
21241     SQLITE_SHELL_INIT_PROC();
21242   }
21243 #else
21244   /* All the sqlite3_config() calls have now been made. So it is safe
21245   ** to call sqlite3_initialize() and process any command line -vfs option. */
21246   sqlite3_initialize();
21247 #endif
21248 
21249   if( zVfs ){
21250     sqlite3_vfs *pVfs = sqlite3_vfs_find(zVfs);
21251     if( pVfs ){
21252       sqlite3_vfs_register(pVfs, 1);
21253     }else{
21254       utf8_printf(stderr, "no such VFS: \"%s\"\n", argv[i]);
21255       exit(1);
21256     }
21257   }
21258 
21259   if( data.zDbFilename==0 ){
21260 #ifndef SQLITE_OMIT_MEMORYDB
21261     data.zDbFilename = ":memory:";
21262     warnInmemoryDb = argc==1;
21263 #else
21264     utf8_printf(stderr,"%s: Error: no database filename specified\n", Argv0);
21265     return 1;
21266 #endif
21267   }
21268   data.out = stdout;
21269   sqlite3_appendvfs_init(0,0,0);
21270 
21271   /* Go ahead and open the database file if it already exists.  If the
21272   ** file does not exist, delay opening it.  This prevents empty database
21273   ** files from being created if a user mistypes the database name argument
21274   ** to the sqlite command-line tool.
21275   */
21276   if( access(data.zDbFilename, 0)==0 ){
21277     open_db(&data, 0);
21278   }
21279 
21280   /* Process the initialization file if there is one.  If no -init option
21281   ** is given on the command line, look for a file named ~/.sqliterc and
21282   ** try to process it.
21283   */
21284   process_sqliterc(&data,zInitFile);
21285 
21286   /* Make a second pass through the command-line argument and set
21287   ** options.  This second pass is delayed until after the initialization
21288   ** file is processed so that the command-line arguments will override
21289   ** settings in the initialization file.
21290   */
21291   for(i=1; i<argc; i++){
21292     char *z = argv[i];
21293     if( z[0]!='-' ) continue;
21294     if( z[1]=='-' ){ z++; }
21295     if( strcmp(z,"-init")==0 ){
21296       i++;
21297     }else if( strcmp(z,"-html")==0 ){
21298       data.mode = MODE_Html;
21299     }else if( strcmp(z,"-list")==0 ){
21300       data.mode = MODE_List;
21301     }else if( strcmp(z,"-quote")==0 ){
21302       data.mode = MODE_Quote;
21303       sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Comma);
21304       sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Row);
21305     }else if( strcmp(z,"-line")==0 ){
21306       data.mode = MODE_Line;
21307     }else if( strcmp(z,"-column")==0 ){
21308       data.mode = MODE_Column;
21309     }else if( strcmp(z,"-json")==0 ){
21310       data.mode = MODE_Json;
21311     }else if( strcmp(z,"-markdown")==0 ){
21312       data.mode = MODE_Markdown;
21313     }else if( strcmp(z,"-table")==0 ){
21314       data.mode = MODE_Table;
21315     }else if( strcmp(z,"-box")==0 ){
21316       data.mode = MODE_Box;
21317     }else if( strcmp(z,"-csv")==0 ){
21318       data.mode = MODE_Csv;
21319       memcpy(data.colSeparator,",",2);
21320 #ifdef SQLITE_HAVE_ZLIB
21321     }else if( strcmp(z,"-zip")==0 ){
21322       data.openMode = SHELL_OPEN_ZIPFILE;
21323 #endif
21324     }else if( strcmp(z,"-append")==0 ){
21325       data.openMode = SHELL_OPEN_APPENDVFS;
21326 #ifdef SQLITE_ENABLE_DESERIALIZE
21327     }else if( strcmp(z,"-deserialize")==0 ){
21328       data.openMode = SHELL_OPEN_DESERIALIZE;
21329     }else if( strcmp(z,"-maxsize")==0 && i+1<argc ){
21330       data.szMax = integerValue(argv[++i]);
21331 #endif
21332     }else if( strcmp(z,"-readonly")==0 ){
21333       data.openMode = SHELL_OPEN_READONLY;
21334     }else if( strcmp(z,"-nofollow")==0 ){
21335       data.openFlags |= SQLITE_OPEN_NOFOLLOW;
21336     }else if( strcmp(z,"-ascii")==0 ){
21337       data.mode = MODE_Ascii;
21338       sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Unit);
21339       sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Record);
21340     }else if( strcmp(z,"-tabs")==0 ){
21341       data.mode = MODE_List;
21342       sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Tab);
21343       sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Row);
21344     }else if( strcmp(z,"-separator")==0 ){
21345       sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
21346                        "%s",cmdline_option_value(argc,argv,++i));
21347     }else if( strcmp(z,"-newline")==0 ){
21348       sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
21349                        "%s",cmdline_option_value(argc,argv,++i));
21350     }else if( strcmp(z,"-nullvalue")==0 ){
21351       sqlite3_snprintf(sizeof(data.nullValue), data.nullValue,
21352                        "%s",cmdline_option_value(argc,argv,++i));
21353     }else if( strcmp(z,"-header")==0 ){
21354       data.showHeader = 1;
21355     }else if( strcmp(z,"-noheader")==0 ){
21356       data.showHeader = 0;
21357     }else if( strcmp(z,"-echo")==0 ){
21358       ShellSetFlag(&data, SHFLG_Echo);
21359     }else if( strcmp(z,"-eqp")==0 ){
21360       data.autoEQP = AUTOEQP_on;
21361     }else if( strcmp(z,"-eqpfull")==0 ){
21362       data.autoEQP = AUTOEQP_full;
21363     }else if( strcmp(z,"-stats")==0 ){
21364       data.statsOn = 1;
21365     }else if( strcmp(z,"-scanstats")==0 ){
21366       data.scanstatsOn = 1;
21367     }else if( strcmp(z,"-backslash")==0 ){
21368       /* Undocumented command-line option: -backslash
21369       ** Causes C-style backslash escapes to be evaluated in SQL statements
21370       ** prior to sending the SQL into SQLite.  Useful for injecting
21371       ** crazy bytes in the middle of SQL statements for testing and debugging.
21372       */
21373       ShellSetFlag(&data, SHFLG_Backslash);
21374     }else if( strcmp(z,"-bail")==0 ){
21375       /* No-op.  The bail_on_error flag should already be set. */
21376     }else if( strcmp(z,"-version")==0 ){
21377       printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
21378       return 0;
21379     }else if( strcmp(z,"-interactive")==0 ){
21380       stdin_is_interactive = 1;
21381     }else if( strcmp(z,"-batch")==0 ){
21382       stdin_is_interactive = 0;
21383     }else if( strcmp(z,"-heap")==0 ){
21384       i++;
21385     }else if( strcmp(z,"-pagecache")==0 ){
21386       i+=2;
21387     }else if( strcmp(z,"-lookaside")==0 ){
21388       i+=2;
21389     }else if( strcmp(z,"-mmap")==0 ){
21390       i++;
21391     }else if( strcmp(z,"-memtrace")==0 ){
21392       i++;
21393 #ifdef SQLITE_ENABLE_SORTER_REFERENCES
21394     }else if( strcmp(z,"-sorterref")==0 ){
21395       i++;
21396 #endif
21397     }else if( strcmp(z,"-vfs")==0 ){
21398       i++;
21399 #ifdef SQLITE_ENABLE_VFSTRACE
21400     }else if( strcmp(z,"-vfstrace")==0 ){
21401       i++;
21402 #endif
21403 #ifdef SQLITE_ENABLE_MULTIPLEX
21404     }else if( strcmp(z,"-multiplex")==0 ){
21405       i++;
21406 #endif
21407     }else if( strcmp(z,"-help")==0 ){
21408       usage(1);
21409     }else if( strcmp(z,"-cmd")==0 ){
21410       /* Run commands that follow -cmd first and separately from commands
21411       ** that simply appear on the command-line.  This seems goofy.  It would
21412       ** be better if all commands ran in the order that they appear.  But
21413       ** we retain the goofy behavior for historical compatibility. */
21414       if( i==argc-1 ) break;
21415       z = cmdline_option_value(argc,argv,++i);
21416       if( z[0]=='.' ){
21417         rc = do_meta_command(z, &data);
21418         if( rc && bail_on_error ) return rc==2 ? 0 : rc;
21419       }else{
21420         open_db(&data, 0);
21421         rc = shell_exec(&data, z, &zErrMsg);
21422         if( zErrMsg!=0 ){
21423           utf8_printf(stderr,"Error: %s\n", zErrMsg);
21424           if( bail_on_error ) return rc!=0 ? rc : 1;
21425         }else if( rc!=0 ){
21426           utf8_printf(stderr,"Error: unable to process SQL \"%s\"\n", z);
21427           if( bail_on_error ) return rc;
21428         }
21429       }
21430 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
21431     }else if( strncmp(z, "-A", 2)==0 ){
21432       if( nCmd>0 ){
21433         utf8_printf(stderr, "Error: cannot mix regular SQL or dot-commands"
21434                             " with \"%s\"\n", z);
21435         return 1;
21436       }
21437       open_db(&data, OPEN_DB_ZIPFILE);
21438       if( z[2] ){
21439         argv[i] = &z[2];
21440         arDotCommand(&data, 1, argv+(i-1), argc-(i-1));
21441       }else{
21442         arDotCommand(&data, 1, argv+i, argc-i);
21443       }
21444       readStdin = 0;
21445       break;
21446 #endif
21447     }else{
21448       utf8_printf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
21449       raw_printf(stderr,"Use -help for a list of options.\n");
21450       return 1;
21451     }
21452     data.cMode = data.mode;
21453   }
21454 
21455   if( !readStdin ){
21456     /* Run all arguments that do not begin with '-' as if they were separate
21457     ** command-line inputs, except for the argToSkip argument which contains
21458     ** the database filename.
21459     */
21460     for(i=0; i<nCmd; i++){
21461       if( azCmd[i][0]=='.' ){
21462         rc = do_meta_command(azCmd[i], &data);
21463         if( rc ){
21464           free(azCmd);
21465           return rc==2 ? 0 : rc;
21466         }
21467       }else{
21468         open_db(&data, 0);
21469         rc = shell_exec(&data, azCmd[i], &zErrMsg);
21470         if( zErrMsg || rc ){
21471           if( zErrMsg!=0 ){
21472             utf8_printf(stderr,"Error: %s\n", zErrMsg);
21473           }else{
21474             utf8_printf(stderr,"Error: unable to process SQL: %s\n", azCmd[i]);
21475           }
21476           sqlite3_free(zErrMsg);
21477           free(azCmd);
21478           return rc!=0 ? rc : 1;
21479         }
21480       }
21481     }
21482   }else{
21483     /* Run commands received from standard input
21484     */
21485     if( stdin_is_interactive ){
21486       char *zHome;
21487       char *zHistory;
21488       int nHistory;
21489       printf(
21490         "SQLite version %s %.19s\n" /*extra-version-info*/
21491         "Enter \".help\" for usage hints.\n",
21492         sqlite3_libversion(), sqlite3_sourceid()
21493       );
21494       if( warnInmemoryDb ){
21495         printf("Connected to a ");
21496         printBold("transient in-memory database");
21497         printf(".\nUse \".open FILENAME\" to reopen on a "
21498                "persistent database.\n");
21499       }
21500       zHistory = getenv("SQLITE_HISTORY");
21501       if( zHistory ){
21502         zHistory = strdup(zHistory);
21503       }else if( (zHome = find_home_dir(0))!=0 ){
21504         nHistory = strlen30(zHome) + 20;
21505         if( (zHistory = malloc(nHistory))!=0 ){
21506           sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
21507         }
21508       }
21509       if( zHistory ){ shell_read_history(zHistory); }
21510 #if HAVE_READLINE || HAVE_EDITLINE
21511       rl_attempted_completion_function = readline_completion;
21512 #elif HAVE_LINENOISE
21513       linenoiseSetCompletionCallback(linenoise_completion);
21514 #endif
21515       data.in = 0;
21516       rc = process_input(&data);
21517       if( zHistory ){
21518         shell_stifle_history(2000);
21519         shell_write_history(zHistory);
21520         free(zHistory);
21521       }
21522     }else{
21523       data.in = stdin;
21524       rc = process_input(&data);
21525     }
21526   }
21527   free(azCmd);
21528   set_table_name(&data, 0);
21529   if( data.db ){
21530     session_close_all(&data);
21531     close_db(data.db);
21532   }
21533   sqlite3_free(data.zFreeOnClose);
21534   find_home_dir(1);
21535   output_reset(&data);
21536   data.doXdgOpen = 0;
21537   clearTempFile(&data);
21538 #if !SQLITE_SHELL_IS_UTF8
21539   for(i=0; i<argcToFree; i++) free(argvToFree[i]);
21540   free(argvToFree);
21541 #endif
21542   free(data.colWidth);
21543   /* Clear the global data structure so that valgrind will detect memory
21544   ** leaks */
21545   memset(&data, 0, sizeof(data));
21546   return rc;
21547 }
21548