1 /* DO NOT EDIT!
2 ** This file is automatically generated by the script in the canonical
3 ** SQLite source tree at tool/mkshellc.tcl.  That script combines source
4 ** code from various constituent source files of SQLite into this single
5 ** "shell.c" file used to implement the SQLite command-line shell.
6 **
7 ** Most of the code found below comes from the "src/shell.c.in" file in
8 ** the canonical SQLite source tree.  That main file contains "INCLUDE"
9 ** lines that specify other files in the canonical source tree that are
10 ** inserted to getnerate this complete program source file.
11 **
12 ** The code from multiple files is combined into this single "shell.c"
13 ** source file to help make the command-line program easier to compile.
14 **
15 ** To modify this program, get a copy of the canonical SQLite source tree,
16 ** edit the src/shell.c.in" and/or some of the other files that are included
17 ** by "src/shell.c.in", then rerun the tool/mkshellc.tcl script.
18 */
19 /*
20 ** 2001 September 15
21 **
22 ** The author disclaims copyright to this source code.  In place of
23 ** a legal notice, here is a blessing:
24 **
25 **    May you do good and not evil.
26 **    May you find forgiveness for yourself and forgive others.
27 **    May you share freely, never taking more than you give.
28 **
29 *************************************************************************
30 ** This file contains code to implement the "sqlite" command line
31 ** utility for accessing SQLite databases.
32 */
33 #if (defined(_WIN32) || defined(WIN32)) && !defined(_CRT_SECURE_NO_WARNINGS)
34 /* This needs to come before any includes for MSVC compiler */
35 #define _CRT_SECURE_NO_WARNINGS
36 #endif
37 
38 /*
39 ** Warning pragmas copied from msvc.h in the core.
40 */
41 #if defined(_MSC_VER)
42 #pragma warning(disable : 4054)
43 #pragma warning(disable : 4055)
44 #pragma warning(disable : 4100)
45 #pragma warning(disable : 4127)
46 #pragma warning(disable : 4130)
47 #pragma warning(disable : 4152)
48 #pragma warning(disable : 4189)
49 #pragma warning(disable : 4206)
50 #pragma warning(disable : 4210)
51 #pragma warning(disable : 4232)
52 #pragma warning(disable : 4244)
53 #pragma warning(disable : 4305)
54 #pragma warning(disable : 4306)
55 #pragma warning(disable : 4702)
56 #pragma warning(disable : 4706)
57 #endif /* defined(_MSC_VER) */
58 
59 /*
60 ** No support for loadable extensions in VxWorks.
61 */
62 #if (defined(__RTP__) || defined(_WRS_KERNEL)) && !SQLITE_OMIT_LOAD_EXTENSION
63 # define SQLITE_OMIT_LOAD_EXTENSION 1
64 #endif
65 
66 /*
67 ** Enable large-file support for fopen() and friends on unix.
68 */
69 #ifndef SQLITE_DISABLE_LFS
70 # define _LARGE_FILE       1
71 # ifndef _FILE_OFFSET_BITS
72 #   define _FILE_OFFSET_BITS 64
73 # endif
74 # define _LARGEFILE_SOURCE 1
75 #endif
76 
77 #include <stdlib.h>
78 #include <string.h>
79 #include <stdio.h>
80 #include <assert.h>
81 #include "sqlite3.h"
82 typedef sqlite3_int64 i64;
83 typedef sqlite3_uint64 u64;
84 typedef unsigned char u8;
85 #if SQLITE_USER_AUTHENTICATION
86 # include "sqlite3userauth.h"
87 #endif
88 #include <ctype.h>
89 #include <stdarg.h>
90 
91 #if !defined(_WIN32) && !defined(WIN32)
92 # include <signal.h>
93 # if !defined(__RTP__) && !defined(_WRS_KERNEL)
94 #  include <pwd.h>
95 # endif
96 #endif
97 #if (!defined(_WIN32) && !defined(WIN32)) || defined(__MINGW32__)
98 # include <unistd.h>
99 # include <dirent.h>
100 # define GETPID getpid
101 # if defined(__MINGW32__)
102 #  define DIRENT dirent
103 #  ifndef S_ISLNK
104 #   define S_ISLNK(mode) (0)
105 #  endif
106 # endif
107 #else
108 # define GETPID (int)GetCurrentProcessId
109 #endif
110 #include <sys/types.h>
111 #include <sys/stat.h>
112 
113 #if HAVE_READLINE
114 # include <readline/readline.h>
115 # include <readline/history.h>
116 #endif
117 
118 #if HAVE_EDITLINE
119 # include <editline/readline.h>
120 #endif
121 
122 #if HAVE_EDITLINE || HAVE_READLINE
123 
124 # define shell_add_history(X) add_history(X)
125 # define shell_read_history(X) read_history(X)
126 # define shell_write_history(X) write_history(X)
127 # define shell_stifle_history(X) stifle_history(X)
128 # define shell_readline(X) readline(X)
129 
130 #elif HAVE_LINENOISE
131 
132 # include "linenoise.h"
133 # define shell_add_history(X) linenoiseHistoryAdd(X)
134 # define shell_read_history(X) linenoiseHistoryLoad(X)
135 # define shell_write_history(X) linenoiseHistorySave(X)
136 # define shell_stifle_history(X) linenoiseHistorySetMaxLen(X)
137 # define shell_readline(X) linenoise(X)
138 
139 #else
140 
141 # define shell_read_history(X)
142 # define shell_write_history(X)
143 # define shell_stifle_history(X)
144 
145 # define SHELL_USE_LOCAL_GETLINE 1
146 #endif
147 
148 
149 #if defined(_WIN32) || defined(WIN32)
150 # include <io.h>
151 # include <fcntl.h>
152 # define isatty(h) _isatty(h)
153 # ifndef access
154 #  define access(f,m) _access((f),(m))
155 # endif
156 # ifndef unlink
157 #  define unlink _unlink
158 # endif
159 # undef popen
160 # define popen _popen
161 # undef pclose
162 # define pclose _pclose
163 #else
164  /* Make sure isatty() has a prototype. */
165  extern int isatty(int);
166 
167 # if !defined(__RTP__) && !defined(_WRS_KERNEL)
168   /* popen and pclose are not C89 functions and so are
169   ** sometimes omitted from the <stdio.h> header */
170    extern FILE *popen(const char*,const char*);
171    extern int pclose(FILE*);
172 # else
173 #  define SQLITE_OMIT_POPEN 1
174 # endif
175 #endif
176 
177 #if defined(_WIN32_WCE)
178 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
179  * thus we always assume that we have a console. That can be
180  * overridden with the -batch command line option.
181  */
182 #define isatty(x) 1
183 #endif
184 
185 /* ctype macros that work with signed characters */
186 #define IsSpace(X)  isspace((unsigned char)X)
187 #define IsDigit(X)  isdigit((unsigned char)X)
188 #define ToLower(X)  (char)tolower((unsigned char)X)
189 
190 #if defined(_WIN32) || defined(WIN32)
191 #include <windows.h>
192 
193 /* string conversion routines only needed on Win32 */
194 extern char *sqlite3_win32_unicode_to_utf8(LPCWSTR);
195 extern char *sqlite3_win32_mbcs_to_utf8_v2(const char *, int);
196 extern char *sqlite3_win32_utf8_to_mbcs_v2(const char *, int);
197 extern LPWSTR sqlite3_win32_utf8_to_unicode(const char *zText);
198 #endif
199 
200 /* On Windows, we normally run with output mode of TEXT so that \n characters
201 ** are automatically translated into \r\n.  However, this behavior needs
202 ** to be disabled in some cases (ex: when generating CSV output and when
203 ** rendering quoted strings that contain \n characters).  The following
204 ** routines take care of that.
205 */
206 #if defined(_WIN32) || defined(WIN32)
setBinaryMode(FILE * file,int isOutput)207 static void setBinaryMode(FILE *file, int isOutput){
208   if( isOutput ) fflush(file);
209   _setmode(_fileno(file), _O_BINARY);
210 }
setTextMode(FILE * file,int isOutput)211 static void setTextMode(FILE *file, int isOutput){
212   if( isOutput ) fflush(file);
213   _setmode(_fileno(file), _O_TEXT);
214 }
215 #else
216 # define setBinaryMode(X,Y)
217 # define setTextMode(X,Y)
218 #endif
219 
220 
221 /* True if the timer is enabled */
222 static int enableTimer = 0;
223 
224 /* Return the current wall-clock time */
timeOfDay(void)225 static sqlite3_int64 timeOfDay(void){
226   static sqlite3_vfs *clockVfs = 0;
227   sqlite3_int64 t;
228   if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0);
229   if( clockVfs->iVersion>=2 && clockVfs->xCurrentTimeInt64!=0 ){
230     clockVfs->xCurrentTimeInt64(clockVfs, &t);
231   }else{
232     double r;
233     clockVfs->xCurrentTime(clockVfs, &r);
234     t = (sqlite3_int64)(r*86400000.0);
235   }
236   return t;
237 }
238 
239 #if !defined(_WIN32) && !defined(WIN32) && !defined(__minux)
240 #include <sys/time.h>
241 #include <sys/resource.h>
242 
243 /* VxWorks does not support getrusage() as far as we can determine */
244 #if defined(_WRS_KERNEL) || defined(__RTP__)
245 struct rusage {
246   struct timeval ru_utime; /* user CPU time used */
247   struct timeval ru_stime; /* system CPU time used */
248 };
249 #define getrusage(A,B) memset(B,0,sizeof(*B))
250 #endif
251 
252 /* Saved resource information for the beginning of an operation */
253 static struct rusage sBegin;  /* CPU time at start */
254 static sqlite3_int64 iBegin;  /* Wall-clock time at start */
255 
256 /*
257 ** Begin timing an operation
258 */
beginTimer(void)259 static void beginTimer(void){
260   if( enableTimer ){
261     getrusage(RUSAGE_SELF, &sBegin);
262     iBegin = timeOfDay();
263   }
264 }
265 
266 /* Return the difference of two time_structs in seconds */
timeDiff(struct timeval * pStart,struct timeval * pEnd)267 static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
268   return (pEnd->tv_usec - pStart->tv_usec)*0.000001 +
269          (double)(pEnd->tv_sec - pStart->tv_sec);
270 }
271 
272 /*
273 ** Print the timing results.
274 */
endTimer(void)275 static void endTimer(void){
276   if( enableTimer ){
277     sqlite3_int64 iEnd = timeOfDay();
278     struct rusage sEnd;
279     getrusage(RUSAGE_SELF, &sEnd);
280     printf("Run Time: real %.3f user %f sys %f\n",
281        (iEnd - iBegin)*0.001,
282        timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
283        timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
284   }
285 }
286 
287 #define BEGIN_TIMER beginTimer()
288 #define END_TIMER endTimer()
289 #define HAS_TIMER 1
290 
291 #elif (defined(_WIN32) || defined(WIN32))
292 
293 /* Saved resource information for the beginning of an operation */
294 static HANDLE hProcess;
295 static FILETIME ftKernelBegin;
296 static FILETIME ftUserBegin;
297 static sqlite3_int64 ftWallBegin;
298 typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME,
299                                     LPFILETIME, LPFILETIME);
300 static GETPROCTIMES getProcessTimesAddr = NULL;
301 
302 /*
303 ** Check to see if we have timer support.  Return 1 if necessary
304 ** support found (or found previously).
305 */
hasTimer(void)306 static int hasTimer(void){
307   if( getProcessTimesAddr ){
308     return 1;
309   } else {
310     /* GetProcessTimes() isn't supported in WIN95 and some other Windows
311     ** versions. See if the version we are running on has it, and if it
312     ** does, save off a pointer to it and the current process handle.
313     */
314     hProcess = GetCurrentProcess();
315     if( hProcess ){
316       HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll"));
317       if( NULL != hinstLib ){
318         getProcessTimesAddr =
319             (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes");
320         if( NULL != getProcessTimesAddr ){
321           return 1;
322         }
323         FreeLibrary(hinstLib);
324       }
325     }
326   }
327   return 0;
328 }
329 
330 /*
331 ** Begin timing an operation
332 */
beginTimer(void)333 static void beginTimer(void){
334   if( enableTimer && getProcessTimesAddr ){
335     FILETIME ftCreation, ftExit;
336     getProcessTimesAddr(hProcess,&ftCreation,&ftExit,
337                         &ftKernelBegin,&ftUserBegin);
338     ftWallBegin = timeOfDay();
339   }
340 }
341 
342 /* Return the difference of two FILETIME structs in seconds */
timeDiff(FILETIME * pStart,FILETIME * pEnd)343 static double timeDiff(FILETIME *pStart, FILETIME *pEnd){
344   sqlite_int64 i64Start = *((sqlite_int64 *) pStart);
345   sqlite_int64 i64End = *((sqlite_int64 *) pEnd);
346   return (double) ((i64End - i64Start) / 10000000.0);
347 }
348 
349 /*
350 ** Print the timing results.
351 */
endTimer(void)352 static void endTimer(void){
353   if( enableTimer && getProcessTimesAddr){
354     FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
355     sqlite3_int64 ftWallEnd = timeOfDay();
356     getProcessTimesAddr(hProcess,&ftCreation,&ftExit,&ftKernelEnd,&ftUserEnd);
357     printf("Run Time: real %.3f user %f sys %f\n",
358        (ftWallEnd - ftWallBegin)*0.001,
359        timeDiff(&ftUserBegin, &ftUserEnd),
360        timeDiff(&ftKernelBegin, &ftKernelEnd));
361   }
362 }
363 
364 #define BEGIN_TIMER beginTimer()
365 #define END_TIMER endTimer()
366 #define HAS_TIMER hasTimer()
367 
368 #else
369 #define BEGIN_TIMER
370 #define END_TIMER
371 #define HAS_TIMER 0
372 #endif
373 
374 /*
375 ** Used to prevent warnings about unused parameters
376 */
377 #define UNUSED_PARAMETER(x) (void)(x)
378 
379 /*
380 ** Number of elements in an array
381 */
382 #define ArraySize(X)  (int)(sizeof(X)/sizeof(X[0]))
383 
384 /*
385 ** If the following flag is set, then command execution stops
386 ** at an error if we are not interactive.
387 */
388 static int bail_on_error = 0;
389 
390 /*
391 ** Threat stdin as an interactive input if the following variable
392 ** is true.  Otherwise, assume stdin is connected to a file or pipe.
393 */
394 static int stdin_is_interactive = 1;
395 
396 /*
397 ** On Windows systems we have to know if standard output is a console
398 ** in order to translate UTF-8 into MBCS.  The following variable is
399 ** true if translation is required.
400 */
401 static int stdout_is_console = 1;
402 
403 /*
404 ** The following is the open SQLite database.  We make a pointer
405 ** to this database a static variable so that it can be accessed
406 ** by the SIGINT handler to interrupt database processing.
407 */
408 static sqlite3 *globalDb = 0;
409 
410 /*
411 ** True if an interrupt (Control-C) has been received.
412 */
413 static volatile int seenInterrupt = 0;
414 
415 /*
416 ** This is the name of our program. It is set in main(), used
417 ** in a number of other places, mostly for error messages.
418 */
419 static char *Argv0;
420 
421 /*
422 ** Prompt strings. Initialized in main. Settable with
423 **   .prompt main continue
424 */
425 static char mainPrompt[20];     /* First line prompt. default: "sqlite> "*/
426 static char continuePrompt[20]; /* Continuation prompt. default: "   ...> " */
427 
428 /*
429 ** Render output like fprintf().  Except, if the output is going to the
430 ** console and if this is running on a Windows machine, translate the
431 ** output from UTF-8 into MBCS.
432 */
433 #if defined(_WIN32) || defined(WIN32)
utf8_printf(FILE * out,const char * zFormat,...)434 void utf8_printf(FILE *out, const char *zFormat, ...){
435   va_list ap;
436   va_start(ap, zFormat);
437   if( stdout_is_console && (out==stdout || out==stderr) ){
438     char *z1 = sqlite3_vmprintf(zFormat, ap);
439     char *z2 = sqlite3_win32_utf8_to_mbcs_v2(z1, 0);
440     sqlite3_free(z1);
441     fputs(z2, out);
442     sqlite3_free(z2);
443   }else{
444     vfprintf(out, zFormat, ap);
445   }
446   va_end(ap);
447 }
448 #elif !defined(utf8_printf)
449 # define utf8_printf fprintf
450 #endif
451 
452 /*
453 ** Render output like fprintf().  This should not be used on anything that
454 ** includes string formatting (e.g. "%s").
455 */
456 #if !defined(raw_printf)
457 # define raw_printf fprintf
458 #endif
459 
460 /* Indicate out-of-memory and exit. */
shell_out_of_memory(void)461 static void shell_out_of_memory(void){
462   raw_printf(stderr,"Error: out of memory\n");
463   exit(1);
464 }
465 
466 /*
467 ** Write I/O traces to the following stream.
468 */
469 #ifdef SQLITE_ENABLE_IOTRACE
470 static FILE *iotrace = 0;
471 #endif
472 
473 /*
474 ** This routine works like printf in that its first argument is a
475 ** format string and subsequent arguments are values to be substituted
476 ** in place of % fields.  The result of formatting this string
477 ** is written to iotrace.
478 */
479 #ifdef SQLITE_ENABLE_IOTRACE
iotracePrintf(const char * zFormat,...)480 static void SQLITE_CDECL iotracePrintf(const char *zFormat, ...){
481   va_list ap;
482   char *z;
483   if( iotrace==0 ) return;
484   va_start(ap, zFormat);
485   z = sqlite3_vmprintf(zFormat, ap);
486   va_end(ap);
487   utf8_printf(iotrace, "%s", z);
488   sqlite3_free(z);
489 }
490 #endif
491 
492 /*
493 ** Output string zUtf to stream pOut as w characters.  If w is negative,
494 ** then right-justify the text.  W is the width in UTF-8 characters, not
495 ** in bytes.  This is different from the %*.*s specification in printf
496 ** since with %*.*s the width is measured in bytes, not characters.
497 */
utf8_width_print(FILE * pOut,int w,const char * zUtf)498 static void utf8_width_print(FILE *pOut, int w, const char *zUtf){
499   int i;
500   int n;
501   int aw = w<0 ? -w : w;
502   char zBuf[1000];
503   if( aw>(int)sizeof(zBuf)/3 ) aw = (int)sizeof(zBuf)/3;
504   for(i=n=0; zUtf[i]; i++){
505     if( (zUtf[i]&0xc0)!=0x80 ){
506       n++;
507       if( n==aw ){
508         do{ i++; }while( (zUtf[i]&0xc0)==0x80 );
509         break;
510       }
511     }
512   }
513   if( n>=aw ){
514     utf8_printf(pOut, "%.*s", i, zUtf);
515   }else if( w<0 ){
516     utf8_printf(pOut, "%*s%s", aw-n, "", zUtf);
517   }else{
518     utf8_printf(pOut, "%s%*s", zUtf, aw-n, "");
519   }
520 }
521 
522 
523 /*
524 ** Determines if a string is a number of not.
525 */
isNumber(const char * z,int * realnum)526 static int isNumber(const char *z, int *realnum){
527   if( *z=='-' || *z=='+' ) z++;
528   if( !IsDigit(*z) ){
529     return 0;
530   }
531   z++;
532   if( realnum ) *realnum = 0;
533   while( IsDigit(*z) ){ z++; }
534   if( *z=='.' ){
535     z++;
536     if( !IsDigit(*z) ) return 0;
537     while( IsDigit(*z) ){ z++; }
538     if( realnum ) *realnum = 1;
539   }
540   if( *z=='e' || *z=='E' ){
541     z++;
542     if( *z=='+' || *z=='-' ) z++;
543     if( !IsDigit(*z) ) return 0;
544     while( IsDigit(*z) ){ z++; }
545     if( realnum ) *realnum = 1;
546   }
547   return *z==0;
548 }
549 
550 /*
551 ** Compute a string length that is limited to what can be stored in
552 ** lower 30 bits of a 32-bit signed integer.
553 */
strlen30(const char * z)554 static int strlen30(const char *z){
555   const char *z2 = z;
556   while( *z2 ){ z2++; }
557   return 0x3fffffff & (int)(z2 - z);
558 }
559 
560 /*
561 ** Return the length of a string in characters.  Multibyte UTF8 characters
562 ** count as a single character.
563 */
strlenChar(const char * z)564 static int strlenChar(const char *z){
565   int n = 0;
566   while( *z ){
567     if( (0xc0&*(z++))!=0x80 ) n++;
568   }
569   return n;
570 }
571 
572 /*
573 ** This routine reads a line of text from FILE in, stores
574 ** the text in memory obtained from malloc() and returns a pointer
575 ** to the text.  NULL is returned at end of file, or if malloc()
576 ** fails.
577 **
578 ** If zLine is not NULL then it is a malloced buffer returned from
579 ** a previous call to this routine that may be reused.
580 */
local_getline(char * zLine,FILE * in)581 static char *local_getline(char *zLine, FILE *in){
582   int nLine = zLine==0 ? 0 : 100;
583   int n = 0;
584 
585   while( 1 ){
586     if( n+100>nLine ){
587       nLine = nLine*2 + 100;
588       zLine = realloc(zLine, nLine);
589       if( zLine==0 ) shell_out_of_memory();
590     }
591     if( fgets(&zLine[n], nLine - n, in)==0 ){
592       if( n==0 ){
593         free(zLine);
594         return 0;
595       }
596       zLine[n] = 0;
597       break;
598     }
599     while( zLine[n] ) n++;
600     if( n>0 && zLine[n-1]=='\n' ){
601       n--;
602       if( n>0 && zLine[n-1]=='\r' ) n--;
603       zLine[n] = 0;
604       break;
605     }
606   }
607 #if defined(_WIN32) || defined(WIN32)
608   /* For interactive input on Windows systems, translate the
609   ** multi-byte characterset characters into UTF-8. */
610   if( stdin_is_interactive && in==stdin ){
611     char *zTrans = sqlite3_win32_mbcs_to_utf8_v2(zLine, 0);
612     if( zTrans ){
613       int nTrans = strlen30(zTrans)+1;
614       if( nTrans>nLine ){
615         zLine = realloc(zLine, nTrans);
616         if( zLine==0 ) shell_out_of_memory();
617       }
618       memcpy(zLine, zTrans, nTrans);
619       sqlite3_free(zTrans);
620     }
621   }
622 #endif /* defined(_WIN32) || defined(WIN32) */
623   return zLine;
624 }
625 
626 /*
627 ** Retrieve a single line of input text.
628 **
629 ** If in==0 then read from standard input and prompt before each line.
630 ** If isContinuation is true, then a continuation prompt is appropriate.
631 ** If isContinuation is zero, then the main prompt should be used.
632 **
633 ** If zPrior is not NULL then it is a buffer from a prior call to this
634 ** routine that can be reused.
635 **
636 ** The result is stored in space obtained from malloc() and must either
637 ** be freed by the caller or else passed back into this routine via the
638 ** zPrior argument for reuse.
639 */
one_input_line(FILE * in,char * zPrior,int isContinuation)640 static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
641   char *zPrompt;
642   char *zResult;
643   if( in!=0 ){
644     zResult = local_getline(zPrior, in);
645   }else{
646     zPrompt = isContinuation ? continuePrompt : mainPrompt;
647 #if SHELL_USE_LOCAL_GETLINE
648     printf("%s", zPrompt);
649     fflush(stdout);
650     zResult = local_getline(zPrior, stdin);
651 #else
652     free(zPrior);
653     zResult = shell_readline(zPrompt);
654     if( zResult && *zResult ) shell_add_history(zResult);
655 #endif
656   }
657   return zResult;
658 }
659 
660 
661 /*
662 ** Return the value of a hexadecimal digit.  Return -1 if the input
663 ** is not a hex digit.
664 */
hexDigitValue(char c)665 static int hexDigitValue(char c){
666   if( c>='0' && c<='9' ) return c - '0';
667   if( c>='a' && c<='f' ) return c - 'a' + 10;
668   if( c>='A' && c<='F' ) return c - 'A' + 10;
669   return -1;
670 }
671 
672 /*
673 ** Interpret zArg as an integer value, possibly with suffixes.
674 */
integerValue(const char * zArg)675 static sqlite3_int64 integerValue(const char *zArg){
676   sqlite3_int64 v = 0;
677   static const struct { char *zSuffix; int iMult; } aMult[] = {
678     { "KiB", 1024 },
679     { "MiB", 1024*1024 },
680     { "GiB", 1024*1024*1024 },
681     { "KB",  1000 },
682     { "MB",  1000000 },
683     { "GB",  1000000000 },
684     { "K",   1000 },
685     { "M",   1000000 },
686     { "G",   1000000000 },
687   };
688   int i;
689   int isNeg = 0;
690   if( zArg[0]=='-' ){
691     isNeg = 1;
692     zArg++;
693   }else if( zArg[0]=='+' ){
694     zArg++;
695   }
696   if( zArg[0]=='0' && zArg[1]=='x' ){
697     int x;
698     zArg += 2;
699     while( (x = hexDigitValue(zArg[0]))>=0 ){
700       v = (v<<4) + x;
701       zArg++;
702     }
703   }else{
704     while( IsDigit(zArg[0]) ){
705       v = v*10 + zArg[0] - '0';
706       zArg++;
707     }
708   }
709   for(i=0; i<ArraySize(aMult); i++){
710     if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
711       v *= aMult[i].iMult;
712       break;
713     }
714   }
715   return isNeg? -v : v;
716 }
717 
718 /*
719 ** A variable length string to which one can append text.
720 */
721 typedef struct ShellText ShellText;
722 struct ShellText {
723   char *z;
724   int n;
725   int nAlloc;
726 };
727 
728 /*
729 ** Initialize and destroy a ShellText object
730 */
initText(ShellText * p)731 static void initText(ShellText *p){
732   memset(p, 0, sizeof(*p));
733 }
freeText(ShellText * p)734 static void freeText(ShellText *p){
735   free(p->z);
736   initText(p);
737 }
738 
739 /* zIn is either a pointer to a NULL-terminated string in memory obtained
740 ** from malloc(), or a NULL pointer. The string pointed to by zAppend is
741 ** added to zIn, and the result returned in memory obtained from malloc().
742 ** zIn, if it was not NULL, is freed.
743 **
744 ** If the third argument, quote, is not '\0', then it is used as a
745 ** quote character for zAppend.
746 */
appendText(ShellText * p,char const * zAppend,char quote)747 static void appendText(ShellText *p, char const *zAppend, char quote){
748   int len;
749   int i;
750   int nAppend = strlen30(zAppend);
751 
752   len = nAppend+p->n+1;
753   if( quote ){
754     len += 2;
755     for(i=0; i<nAppend; i++){
756       if( zAppend[i]==quote ) len++;
757     }
758   }
759 
760   if( p->n+len>=p->nAlloc ){
761     p->nAlloc = p->nAlloc*2 + len + 20;
762     p->z = realloc(p->z, p->nAlloc);
763     if( p->z==0 ) shell_out_of_memory();
764   }
765 
766   if( quote ){
767     char *zCsr = p->z+p->n;
768     *zCsr++ = quote;
769     for(i=0; i<nAppend; i++){
770       *zCsr++ = zAppend[i];
771       if( zAppend[i]==quote ) *zCsr++ = quote;
772     }
773     *zCsr++ = quote;
774     p->n = (int)(zCsr - p->z);
775     *zCsr = '\0';
776   }else{
777     memcpy(p->z+p->n, zAppend, nAppend);
778     p->n += nAppend;
779     p->z[p->n] = '\0';
780   }
781 }
782 
783 /*
784 ** Attempt to determine if identifier zName needs to be quoted, either
785 ** because it contains non-alphanumeric characters, or because it is an
786 ** SQLite keyword.  Be conservative in this estimate:  When in doubt assume
787 ** that quoting is required.
788 **
789 ** Return '"' if quoting is required.  Return 0 if no quoting is required.
790 */
quoteChar(const char * zName)791 static char quoteChar(const char *zName){
792   int i;
793   if( !isalpha((unsigned char)zName[0]) && zName[0]!='_' ) return '"';
794   for(i=0; zName[i]; i++){
795     if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ) return '"';
796   }
797   return sqlite3_keyword_check(zName, i) ? '"' : 0;
798 }
799 
800 /*
801 ** Construct a fake object name and column list to describe the structure
802 ** of the view, virtual table, or table valued function zSchema.zName.
803 */
shellFakeSchema(sqlite3 * db,const char * zSchema,const char * zName)804 static char *shellFakeSchema(
805   sqlite3 *db,            /* The database connection containing the vtab */
806   const char *zSchema,    /* Schema of the database holding the vtab */
807   const char *zName       /* The name of the virtual table */
808 ){
809   sqlite3_stmt *pStmt = 0;
810   char *zSql;
811   ShellText s;
812   char cQuote;
813   char *zDiv = "(";
814   int nRow = 0;
815 
816   zSql = sqlite3_mprintf("PRAGMA \"%w\".table_info=%Q;",
817                          zSchema ? zSchema : "main", zName);
818   sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
819   sqlite3_free(zSql);
820   initText(&s);
821   if( zSchema ){
822     cQuote = quoteChar(zSchema);
823     if( cQuote && sqlite3_stricmp(zSchema,"temp")==0 ) cQuote = 0;
824     appendText(&s, zSchema, cQuote);
825     appendText(&s, ".", 0);
826   }
827   cQuote = quoteChar(zName);
828   appendText(&s, zName, cQuote);
829   while( sqlite3_step(pStmt)==SQLITE_ROW ){
830     const char *zCol = (const char*)sqlite3_column_text(pStmt, 1);
831     nRow++;
832     appendText(&s, zDiv, 0);
833     zDiv = ",";
834     cQuote = quoteChar(zCol);
835     appendText(&s, zCol, cQuote);
836   }
837   appendText(&s, ")", 0);
838   sqlite3_finalize(pStmt);
839   if( nRow==0 ){
840     freeText(&s);
841     s.z = 0;
842   }
843   return s.z;
844 }
845 
846 /*
847 ** SQL function:  shell_module_schema(X)
848 **
849 ** Return a fake schema for the table-valued function or eponymous virtual
850 ** table X.
851 */
shellModuleSchema(sqlite3_context * pCtx,int nVal,sqlite3_value ** apVal)852 static void shellModuleSchema(
853   sqlite3_context *pCtx,
854   int nVal,
855   sqlite3_value **apVal
856 ){
857   const char *zName = (const char*)sqlite3_value_text(apVal[0]);
858   char *zFake = shellFakeSchema(sqlite3_context_db_handle(pCtx), 0, zName);
859   UNUSED_PARAMETER(nVal);
860   if( zFake ){
861     sqlite3_result_text(pCtx, sqlite3_mprintf("/* %s */", zFake),
862                         -1, sqlite3_free);
863     free(zFake);
864   }
865 }
866 
867 /*
868 ** SQL function:  shell_add_schema(S,X)
869 **
870 ** Add the schema name X to the CREATE statement in S and return the result.
871 ** Examples:
872 **
873 **    CREATE TABLE t1(x)   ->   CREATE TABLE xyz.t1(x);
874 **
875 ** Also works on
876 **
877 **    CREATE INDEX
878 **    CREATE UNIQUE INDEX
879 **    CREATE VIEW
880 **    CREATE TRIGGER
881 **    CREATE VIRTUAL TABLE
882 **
883 ** This UDF is used by the .schema command to insert the schema name of
884 ** attached databases into the middle of the sqlite_master.sql field.
885 */
shellAddSchemaName(sqlite3_context * pCtx,int nVal,sqlite3_value ** apVal)886 static void shellAddSchemaName(
887   sqlite3_context *pCtx,
888   int nVal,
889   sqlite3_value **apVal
890 ){
891   static const char *aPrefix[] = {
892      "TABLE",
893      "INDEX",
894      "UNIQUE INDEX",
895      "VIEW",
896      "TRIGGER",
897      "VIRTUAL TABLE"
898   };
899   int i = 0;
900   const char *zIn = (const char*)sqlite3_value_text(apVal[0]);
901   const char *zSchema = (const char*)sqlite3_value_text(apVal[1]);
902   const char *zName = (const char*)sqlite3_value_text(apVal[2]);
903   sqlite3 *db = sqlite3_context_db_handle(pCtx);
904   UNUSED_PARAMETER(nVal);
905   if( zIn!=0 && strncmp(zIn, "CREATE ", 7)==0 ){
906     for(i=0; i<(int)(sizeof(aPrefix)/sizeof(aPrefix[0])); i++){
907       int n = strlen30(aPrefix[i]);
908       if( strncmp(zIn+7, aPrefix[i], n)==0 && zIn[n+7]==' ' ){
909         char *z = 0;
910         char *zFake = 0;
911         if( zSchema ){
912           char cQuote = quoteChar(zSchema);
913           if( cQuote && sqlite3_stricmp(zSchema,"temp")!=0 ){
914             z = sqlite3_mprintf("%.*s \"%w\".%s", n+7, zIn, zSchema, zIn+n+8);
915           }else{
916             z = sqlite3_mprintf("%.*s %s.%s", n+7, zIn, zSchema, zIn+n+8);
917           }
918         }
919         if( zName
920          && aPrefix[i][0]=='V'
921          && (zFake = shellFakeSchema(db, zSchema, zName))!=0
922         ){
923           if( z==0 ){
924             z = sqlite3_mprintf("%s\n/* %s */", zIn, zFake);
925           }else{
926             z = sqlite3_mprintf("%z\n/* %s */", z, zFake);
927           }
928           free(zFake);
929         }
930         if( z ){
931           sqlite3_result_text(pCtx, z, -1, sqlite3_free);
932           return;
933         }
934       }
935     }
936   }
937   sqlite3_result_value(pCtx, apVal[0]);
938 }
939 
940 /*
941 ** The source code for several run-time loadable extensions is inserted
942 ** below by the ../tool/mkshellc.tcl script.  Before processing that included
943 ** code, we need to override some macros to make the included program code
944 ** work here in the middle of this regular program.
945 */
946 #define SQLITE_EXTENSION_INIT1
947 #define SQLITE_EXTENSION_INIT2(X) (void)(X)
948 
949 #if defined(_WIN32) && defined(_MSC_VER)
950 /************************* Begin test_windirent.h ******************/
951 /*
952 ** 2015 November 30
953 **
954 ** The author disclaims copyright to this source code.  In place of
955 ** a legal notice, here is a blessing:
956 **
957 **    May you do good and not evil.
958 **    May you find forgiveness for yourself and forgive others.
959 **    May you share freely, never taking more than you give.
960 **
961 *************************************************************************
962 ** This file contains declarations for most of the opendir() family of
963 ** POSIX functions on Win32 using the MSVCRT.
964 */
965 
966 #if defined(_WIN32) && defined(_MSC_VER) && !defined(SQLITE_WINDIRENT_H)
967 #define SQLITE_WINDIRENT_H
968 
969 /*
970 ** We need several data types from the Windows SDK header.
971 */
972 
973 #ifndef WIN32_LEAN_AND_MEAN
974 #define WIN32_LEAN_AND_MEAN
975 #endif
976 
977 #include "windows.h"
978 
979 /*
980 ** We need several support functions from the SQLite core.
981 */
982 
983 
984 /*
985 ** We need several things from the ANSI and MSVCRT headers.
986 */
987 
988 #include <stdio.h>
989 #include <stdlib.h>
990 #include <errno.h>
991 #include <io.h>
992 #include <limits.h>
993 #include <sys/types.h>
994 #include <sys/stat.h>
995 
996 /*
997 ** We may need several defines that should have been in "sys/stat.h".
998 */
999 
1000 #ifndef S_ISREG
1001 #define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG)
1002 #endif
1003 
1004 #ifndef S_ISDIR
1005 #define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
1006 #endif
1007 
1008 #ifndef S_ISLNK
1009 #define S_ISLNK(mode) (0)
1010 #endif
1011 
1012 /*
1013 ** We may need to provide the "mode_t" type.
1014 */
1015 
1016 #ifndef MODE_T_DEFINED
1017   #define MODE_T_DEFINED
1018   typedef unsigned short mode_t;
1019 #endif
1020 
1021 /*
1022 ** We may need to provide the "ino_t" type.
1023 */
1024 
1025 #ifndef INO_T_DEFINED
1026   #define INO_T_DEFINED
1027   typedef unsigned short ino_t;
1028 #endif
1029 
1030 /*
1031 ** We need to define "NAME_MAX" if it was not present in "limits.h".
1032 */
1033 
1034 #ifndef NAME_MAX
1035 #  ifdef FILENAME_MAX
1036 #    define NAME_MAX (FILENAME_MAX)
1037 #  else
1038 #    define NAME_MAX (260)
1039 #  endif
1040 #endif
1041 
1042 /*
1043 ** We need to define "NULL_INTPTR_T" and "BAD_INTPTR_T".
1044 */
1045 
1046 #ifndef NULL_INTPTR_T
1047 #  define NULL_INTPTR_T ((intptr_t)(0))
1048 #endif
1049 
1050 #ifndef BAD_INTPTR_T
1051 #  define BAD_INTPTR_T ((intptr_t)(-1))
1052 #endif
1053 
1054 /*
1055 ** We need to provide the necessary structures and related types.
1056 */
1057 
1058 #ifndef DIRENT_DEFINED
1059 #define DIRENT_DEFINED
1060 typedef struct DIRENT DIRENT;
1061 typedef DIRENT *LPDIRENT;
1062 struct DIRENT {
1063   ino_t d_ino;               /* Sequence number, do not use. */
1064   unsigned d_attributes;     /* Win32 file attributes. */
1065   char d_name[NAME_MAX + 1]; /* Name within the directory. */
1066 };
1067 #endif
1068 
1069 #ifndef DIR_DEFINED
1070 #define DIR_DEFINED
1071 typedef struct DIR DIR;
1072 typedef DIR *LPDIR;
1073 struct DIR {
1074   intptr_t d_handle; /* Value returned by "_findfirst". */
1075   DIRENT d_first;    /* DIRENT constructed based on "_findfirst". */
1076   DIRENT d_next;     /* DIRENT constructed based on "_findnext". */
1077 };
1078 #endif
1079 
1080 /*
1081 ** Provide a macro, for use by the implementation, to determine if a
1082 ** particular directory entry should be skipped over when searching for
1083 ** the next directory entry that should be returned by the readdir() or
1084 ** readdir_r() functions.
1085 */
1086 
1087 #ifndef is_filtered
1088 #  define is_filtered(a) ((((a).attrib)&_A_HIDDEN) || (((a).attrib)&_A_SYSTEM))
1089 #endif
1090 
1091 /*
1092 ** Provide the function prototype for the POSIX compatiable getenv()
1093 ** function.  This function is not thread-safe.
1094 */
1095 
1096 extern const char *windirent_getenv(const char *name);
1097 
1098 /*
1099 ** Finally, we can provide the function prototypes for the opendir(),
1100 ** readdir(), readdir_r(), and closedir() POSIX functions.
1101 */
1102 
1103 extern LPDIR opendir(const char *dirname);
1104 extern LPDIRENT readdir(LPDIR dirp);
1105 extern INT readdir_r(LPDIR dirp, LPDIRENT entry, LPDIRENT *result);
1106 extern INT closedir(LPDIR dirp);
1107 
1108 #endif /* defined(WIN32) && defined(_MSC_VER) */
1109 
1110 /************************* End test_windirent.h ********************/
1111 /************************* Begin test_windirent.c ******************/
1112 /*
1113 ** 2015 November 30
1114 **
1115 ** The author disclaims copyright to this source code.  In place of
1116 ** a legal notice, here is a blessing:
1117 **
1118 **    May you do good and not evil.
1119 **    May you find forgiveness for yourself and forgive others.
1120 **    May you share freely, never taking more than you give.
1121 **
1122 *************************************************************************
1123 ** This file contains code to implement most of the opendir() family of
1124 ** POSIX functions on Win32 using the MSVCRT.
1125 */
1126 
1127 #if defined(_WIN32) && defined(_MSC_VER)
1128 /* #include "test_windirent.h" */
1129 
1130 /*
1131 ** Implementation of the POSIX getenv() function using the Win32 API.
1132 ** This function is not thread-safe.
1133 */
windirent_getenv(const char * name)1134 const char *windirent_getenv(
1135   const char *name
1136 ){
1137   static char value[32768]; /* Maximum length, per MSDN */
1138   DWORD dwSize = sizeof(value) / sizeof(char); /* Size in chars */
1139   DWORD dwRet; /* Value returned by GetEnvironmentVariableA() */
1140 
1141   memset(value, 0, sizeof(value));
1142   dwRet = GetEnvironmentVariableA(name, value, dwSize);
1143   if( dwRet==0 || dwRet>dwSize ){
1144     /*
1145     ** The function call to GetEnvironmentVariableA() failed -OR-
1146     ** the buffer is not large enough.  Either way, return NULL.
1147     */
1148     return 0;
1149   }else{
1150     /*
1151     ** The function call to GetEnvironmentVariableA() succeeded
1152     ** -AND- the buffer contains the entire value.
1153     */
1154     return value;
1155   }
1156 }
1157 
1158 /*
1159 ** Implementation of the POSIX opendir() function using the MSVCRT.
1160 */
opendir(const char * dirname)1161 LPDIR opendir(
1162   const char *dirname
1163 ){
1164   struct _finddata_t data;
1165   LPDIR dirp = (LPDIR)sqlite3_malloc(sizeof(DIR));
1166   SIZE_T namesize = sizeof(data.name) / sizeof(data.name[0]);
1167 
1168   if( dirp==NULL ) return NULL;
1169   memset(dirp, 0, sizeof(DIR));
1170 
1171   /* TODO: Remove this if Unix-style root paths are not used. */
1172   if( sqlite3_stricmp(dirname, "/")==0 ){
1173     dirname = windirent_getenv("SystemDrive");
1174   }
1175 
1176   memset(&data, 0, sizeof(struct _finddata_t));
1177   _snprintf(data.name, namesize, "%s\\*", dirname);
1178   dirp->d_handle = _findfirst(data.name, &data);
1179 
1180   if( dirp->d_handle==BAD_INTPTR_T ){
1181     closedir(dirp);
1182     return NULL;
1183   }
1184 
1185   /* TODO: Remove this block to allow hidden and/or system files. */
1186   if( is_filtered(data) ){
1187 next:
1188 
1189     memset(&data, 0, sizeof(struct _finddata_t));
1190     if( _findnext(dirp->d_handle, &data)==-1 ){
1191       closedir(dirp);
1192       return NULL;
1193     }
1194 
1195     /* TODO: Remove this block to allow hidden and/or system files. */
1196     if( is_filtered(data) ) goto next;
1197   }
1198 
1199   dirp->d_first.d_attributes = data.attrib;
1200   strncpy(dirp->d_first.d_name, data.name, NAME_MAX);
1201   dirp->d_first.d_name[NAME_MAX] = '\0';
1202 
1203   return dirp;
1204 }
1205 
1206 /*
1207 ** Implementation of the POSIX readdir() function using the MSVCRT.
1208 */
readdir(LPDIR dirp)1209 LPDIRENT readdir(
1210   LPDIR dirp
1211 ){
1212   struct _finddata_t data;
1213 
1214   if( dirp==NULL ) return NULL;
1215 
1216   if( dirp->d_first.d_ino==0 ){
1217     dirp->d_first.d_ino++;
1218     dirp->d_next.d_ino++;
1219 
1220     return &dirp->d_first;
1221   }
1222 
1223 next:
1224 
1225   memset(&data, 0, sizeof(struct _finddata_t));
1226   if( _findnext(dirp->d_handle, &data)==-1 ) return NULL;
1227 
1228   /* TODO: Remove this block to allow hidden and/or system files. */
1229   if( is_filtered(data) ) goto next;
1230 
1231   dirp->d_next.d_ino++;
1232   dirp->d_next.d_attributes = data.attrib;
1233   strncpy(dirp->d_next.d_name, data.name, NAME_MAX);
1234   dirp->d_next.d_name[NAME_MAX] = '\0';
1235 
1236   return &dirp->d_next;
1237 }
1238 
1239 /*
1240 ** Implementation of the POSIX readdir_r() function using the MSVCRT.
1241 */
readdir_r(LPDIR dirp,LPDIRENT entry,LPDIRENT * result)1242 INT readdir_r(
1243   LPDIR dirp,
1244   LPDIRENT entry,
1245   LPDIRENT *result
1246 ){
1247   struct _finddata_t data;
1248 
1249   if( dirp==NULL ) return EBADF;
1250 
1251   if( dirp->d_first.d_ino==0 ){
1252     dirp->d_first.d_ino++;
1253     dirp->d_next.d_ino++;
1254 
1255     entry->d_ino = dirp->d_first.d_ino;
1256     entry->d_attributes = dirp->d_first.d_attributes;
1257     strncpy(entry->d_name, dirp->d_first.d_name, NAME_MAX);
1258     entry->d_name[NAME_MAX] = '\0';
1259 
1260     *result = entry;
1261     return 0;
1262   }
1263 
1264 next:
1265 
1266   memset(&data, 0, sizeof(struct _finddata_t));
1267   if( _findnext(dirp->d_handle, &data)==-1 ){
1268     *result = NULL;
1269     return ENOENT;
1270   }
1271 
1272   /* TODO: Remove this block to allow hidden and/or system files. */
1273   if( is_filtered(data) ) goto next;
1274 
1275   entry->d_ino = (ino_t)-1; /* not available */
1276   entry->d_attributes = data.attrib;
1277   strncpy(entry->d_name, data.name, NAME_MAX);
1278   entry->d_name[NAME_MAX] = '\0';
1279 
1280   *result = entry;
1281   return 0;
1282 }
1283 
1284 /*
1285 ** Implementation of the POSIX closedir() function using the MSVCRT.
1286 */
closedir(LPDIR dirp)1287 INT closedir(
1288   LPDIR dirp
1289 ){
1290   INT result = 0;
1291 
1292   if( dirp==NULL ) return EINVAL;
1293 
1294   if( dirp->d_handle!=NULL_INTPTR_T && dirp->d_handle!=BAD_INTPTR_T ){
1295     result = _findclose(dirp->d_handle);
1296   }
1297 
1298   sqlite3_free(dirp);
1299   return result;
1300 }
1301 
1302 #endif /* defined(WIN32) && defined(_MSC_VER) */
1303 
1304 /************************* End test_windirent.c ********************/
1305 #define dirent DIRENT
1306 #endif
1307 /************************* Begin ../ext/misc/shathree.c ******************/
1308 /*
1309 ** 2017-03-08
1310 **
1311 ** The author disclaims copyright to this source code.  In place of
1312 ** a legal notice, here is a blessing:
1313 **
1314 **    May you do good and not evil.
1315 **    May you find forgiveness for yourself and forgive others.
1316 **    May you share freely, never taking more than you give.
1317 **
1318 ******************************************************************************
1319 **
1320 ** This SQLite extension implements functions that compute SHA3 hashes.
1321 ** Two SQL functions are implemented:
1322 **
1323 **     sha3(X,SIZE)
1324 **     sha3_query(Y,SIZE)
1325 **
1326 ** The sha3(X) function computes the SHA3 hash of the input X, or NULL if
1327 ** X is NULL.
1328 **
1329 ** The sha3_query(Y) function evalutes all queries in the SQL statements of Y
1330 ** and returns a hash of their results.
1331 **
1332 ** The SIZE argument is optional.  If omitted, the SHA3-256 hash algorithm
1333 ** is used.  If SIZE is included it must be one of the integers 224, 256,
1334 ** 384, or 512, to determine SHA3 hash variant that is computed.
1335 */
1336 SQLITE_EXTENSION_INIT1
1337 #include <assert.h>
1338 #include <string.h>
1339 #include <stdarg.h>
1340 /* typedef sqlite3_uint64 u64; */
1341 
1342 /******************************************************************************
1343 ** The Hash Engine
1344 */
1345 /*
1346 ** Macros to determine whether the machine is big or little endian,
1347 ** and whether or not that determination is run-time or compile-time.
1348 **
1349 ** For best performance, an attempt is made to guess at the byte-order
1350 ** using C-preprocessor macros.  If that is unsuccessful, or if
1351 ** -DSHA3_BYTEORDER=0 is set, then byte-order is determined
1352 ** at run-time.
1353 */
1354 #ifndef SHA3_BYTEORDER
1355 # if defined(i386)     || defined(__i386__)   || defined(_M_IX86) ||    \
1356      defined(__x86_64) || defined(__x86_64__) || defined(_M_X64)  ||    \
1357      defined(_M_AMD64) || defined(_M_ARM)     || defined(__x86)   ||    \
1358      defined(__arm__)
1359 #   define SHA3_BYTEORDER    1234
1360 # elif defined(sparc)    || defined(__ppc__)
1361 #   define SHA3_BYTEORDER    4321
1362 # else
1363 #   define SHA3_BYTEORDER 0
1364 # endif
1365 #endif
1366 
1367 
1368 /*
1369 ** State structure for a SHA3 hash in progress
1370 */
1371 typedef struct SHA3Context SHA3Context;
1372 struct SHA3Context {
1373   union {
1374     u64 s[25];                /* Keccak state. 5x5 lines of 64 bits each */
1375     unsigned char x[1600];    /* ... or 1600 bytes */
1376   } u;
1377   unsigned nRate;        /* Bytes of input accepted per Keccak iteration */
1378   unsigned nLoaded;      /* Input bytes loaded into u.x[] so far this cycle */
1379   unsigned ixMask;       /* Insert next input into u.x[nLoaded^ixMask]. */
1380 };
1381 
1382 /*
1383 ** A single step of the Keccak mixing function for a 1600-bit state
1384 */
KeccakF1600Step(SHA3Context * p)1385 static void KeccakF1600Step(SHA3Context *p){
1386   int i;
1387   u64 b0, b1, b2, b3, b4;
1388   u64 c0, c1, c2, c3, c4;
1389   u64 d0, d1, d2, d3, d4;
1390   static const u64 RC[] = {
1391     0x0000000000000001ULL,  0x0000000000008082ULL,
1392     0x800000000000808aULL,  0x8000000080008000ULL,
1393     0x000000000000808bULL,  0x0000000080000001ULL,
1394     0x8000000080008081ULL,  0x8000000000008009ULL,
1395     0x000000000000008aULL,  0x0000000000000088ULL,
1396     0x0000000080008009ULL,  0x000000008000000aULL,
1397     0x000000008000808bULL,  0x800000000000008bULL,
1398     0x8000000000008089ULL,  0x8000000000008003ULL,
1399     0x8000000000008002ULL,  0x8000000000000080ULL,
1400     0x000000000000800aULL,  0x800000008000000aULL,
1401     0x8000000080008081ULL,  0x8000000000008080ULL,
1402     0x0000000080000001ULL,  0x8000000080008008ULL
1403   };
1404 # define a00 (p->u.s[0])
1405 # define a01 (p->u.s[1])
1406 # define a02 (p->u.s[2])
1407 # define a03 (p->u.s[3])
1408 # define a04 (p->u.s[4])
1409 # define a10 (p->u.s[5])
1410 # define a11 (p->u.s[6])
1411 # define a12 (p->u.s[7])
1412 # define a13 (p->u.s[8])
1413 # define a14 (p->u.s[9])
1414 # define a20 (p->u.s[10])
1415 # define a21 (p->u.s[11])
1416 # define a22 (p->u.s[12])
1417 # define a23 (p->u.s[13])
1418 # define a24 (p->u.s[14])
1419 # define a30 (p->u.s[15])
1420 # define a31 (p->u.s[16])
1421 # define a32 (p->u.s[17])
1422 # define a33 (p->u.s[18])
1423 # define a34 (p->u.s[19])
1424 # define a40 (p->u.s[20])
1425 # define a41 (p->u.s[21])
1426 # define a42 (p->u.s[22])
1427 # define a43 (p->u.s[23])
1428 # define a44 (p->u.s[24])
1429 # define ROL64(a,x) ((a<<x)|(a>>(64-x)))
1430 
1431   for(i=0; i<24; i+=4){
1432     c0 = a00^a10^a20^a30^a40;
1433     c1 = a01^a11^a21^a31^a41;
1434     c2 = a02^a12^a22^a32^a42;
1435     c3 = a03^a13^a23^a33^a43;
1436     c4 = a04^a14^a24^a34^a44;
1437     d0 = c4^ROL64(c1, 1);
1438     d1 = c0^ROL64(c2, 1);
1439     d2 = c1^ROL64(c3, 1);
1440     d3 = c2^ROL64(c4, 1);
1441     d4 = c3^ROL64(c0, 1);
1442 
1443     b0 = (a00^d0);
1444     b1 = ROL64((a11^d1), 44);
1445     b2 = ROL64((a22^d2), 43);
1446     b3 = ROL64((a33^d3), 21);
1447     b4 = ROL64((a44^d4), 14);
1448     a00 =   b0 ^((~b1)&  b2 );
1449     a00 ^= RC[i];
1450     a11 =   b1 ^((~b2)&  b3 );
1451     a22 =   b2 ^((~b3)&  b4 );
1452     a33 =   b3 ^((~b4)&  b0 );
1453     a44 =   b4 ^((~b0)&  b1 );
1454 
1455     b2 = ROL64((a20^d0), 3);
1456     b3 = ROL64((a31^d1), 45);
1457     b4 = ROL64((a42^d2), 61);
1458     b0 = ROL64((a03^d3), 28);
1459     b1 = ROL64((a14^d4), 20);
1460     a20 =   b0 ^((~b1)&  b2 );
1461     a31 =   b1 ^((~b2)&  b3 );
1462     a42 =   b2 ^((~b3)&  b4 );
1463     a03 =   b3 ^((~b4)&  b0 );
1464     a14 =   b4 ^((~b0)&  b1 );
1465 
1466     b4 = ROL64((a40^d0), 18);
1467     b0 = ROL64((a01^d1), 1);
1468     b1 = ROL64((a12^d2), 6);
1469     b2 = ROL64((a23^d3), 25);
1470     b3 = ROL64((a34^d4), 8);
1471     a40 =   b0 ^((~b1)&  b2 );
1472     a01 =   b1 ^((~b2)&  b3 );
1473     a12 =   b2 ^((~b3)&  b4 );
1474     a23 =   b3 ^((~b4)&  b0 );
1475     a34 =   b4 ^((~b0)&  b1 );
1476 
1477     b1 = ROL64((a10^d0), 36);
1478     b2 = ROL64((a21^d1), 10);
1479     b3 = ROL64((a32^d2), 15);
1480     b4 = ROL64((a43^d3), 56);
1481     b0 = ROL64((a04^d4), 27);
1482     a10 =   b0 ^((~b1)&  b2 );
1483     a21 =   b1 ^((~b2)&  b3 );
1484     a32 =   b2 ^((~b3)&  b4 );
1485     a43 =   b3 ^((~b4)&  b0 );
1486     a04 =   b4 ^((~b0)&  b1 );
1487 
1488     b3 = ROL64((a30^d0), 41);
1489     b4 = ROL64((a41^d1), 2);
1490     b0 = ROL64((a02^d2), 62);
1491     b1 = ROL64((a13^d3), 55);
1492     b2 = ROL64((a24^d4), 39);
1493     a30 =   b0 ^((~b1)&  b2 );
1494     a41 =   b1 ^((~b2)&  b3 );
1495     a02 =   b2 ^((~b3)&  b4 );
1496     a13 =   b3 ^((~b4)&  b0 );
1497     a24 =   b4 ^((~b0)&  b1 );
1498 
1499     c0 = a00^a20^a40^a10^a30;
1500     c1 = a11^a31^a01^a21^a41;
1501     c2 = a22^a42^a12^a32^a02;
1502     c3 = a33^a03^a23^a43^a13;
1503     c4 = a44^a14^a34^a04^a24;
1504     d0 = c4^ROL64(c1, 1);
1505     d1 = c0^ROL64(c2, 1);
1506     d2 = c1^ROL64(c3, 1);
1507     d3 = c2^ROL64(c4, 1);
1508     d4 = c3^ROL64(c0, 1);
1509 
1510     b0 = (a00^d0);
1511     b1 = ROL64((a31^d1), 44);
1512     b2 = ROL64((a12^d2), 43);
1513     b3 = ROL64((a43^d3), 21);
1514     b4 = ROL64((a24^d4), 14);
1515     a00 =   b0 ^((~b1)&  b2 );
1516     a00 ^= RC[i+1];
1517     a31 =   b1 ^((~b2)&  b3 );
1518     a12 =   b2 ^((~b3)&  b4 );
1519     a43 =   b3 ^((~b4)&  b0 );
1520     a24 =   b4 ^((~b0)&  b1 );
1521 
1522     b2 = ROL64((a40^d0), 3);
1523     b3 = ROL64((a21^d1), 45);
1524     b4 = ROL64((a02^d2), 61);
1525     b0 = ROL64((a33^d3), 28);
1526     b1 = ROL64((a14^d4), 20);
1527     a40 =   b0 ^((~b1)&  b2 );
1528     a21 =   b1 ^((~b2)&  b3 );
1529     a02 =   b2 ^((~b3)&  b4 );
1530     a33 =   b3 ^((~b4)&  b0 );
1531     a14 =   b4 ^((~b0)&  b1 );
1532 
1533     b4 = ROL64((a30^d0), 18);
1534     b0 = ROL64((a11^d1), 1);
1535     b1 = ROL64((a42^d2), 6);
1536     b2 = ROL64((a23^d3), 25);
1537     b3 = ROL64((a04^d4), 8);
1538     a30 =   b0 ^((~b1)&  b2 );
1539     a11 =   b1 ^((~b2)&  b3 );
1540     a42 =   b2 ^((~b3)&  b4 );
1541     a23 =   b3 ^((~b4)&  b0 );
1542     a04 =   b4 ^((~b0)&  b1 );
1543 
1544     b1 = ROL64((a20^d0), 36);
1545     b2 = ROL64((a01^d1), 10);
1546     b3 = ROL64((a32^d2), 15);
1547     b4 = ROL64((a13^d3), 56);
1548     b0 = ROL64((a44^d4), 27);
1549     a20 =   b0 ^((~b1)&  b2 );
1550     a01 =   b1 ^((~b2)&  b3 );
1551     a32 =   b2 ^((~b3)&  b4 );
1552     a13 =   b3 ^((~b4)&  b0 );
1553     a44 =   b4 ^((~b0)&  b1 );
1554 
1555     b3 = ROL64((a10^d0), 41);
1556     b4 = ROL64((a41^d1), 2);
1557     b0 = ROL64((a22^d2), 62);
1558     b1 = ROL64((a03^d3), 55);
1559     b2 = ROL64((a34^d4), 39);
1560     a10 =   b0 ^((~b1)&  b2 );
1561     a41 =   b1 ^((~b2)&  b3 );
1562     a22 =   b2 ^((~b3)&  b4 );
1563     a03 =   b3 ^((~b4)&  b0 );
1564     a34 =   b4 ^((~b0)&  b1 );
1565 
1566     c0 = a00^a40^a30^a20^a10;
1567     c1 = a31^a21^a11^a01^a41;
1568     c2 = a12^a02^a42^a32^a22;
1569     c3 = a43^a33^a23^a13^a03;
1570     c4 = a24^a14^a04^a44^a34;
1571     d0 = c4^ROL64(c1, 1);
1572     d1 = c0^ROL64(c2, 1);
1573     d2 = c1^ROL64(c3, 1);
1574     d3 = c2^ROL64(c4, 1);
1575     d4 = c3^ROL64(c0, 1);
1576 
1577     b0 = (a00^d0);
1578     b1 = ROL64((a21^d1), 44);
1579     b2 = ROL64((a42^d2), 43);
1580     b3 = ROL64((a13^d3), 21);
1581     b4 = ROL64((a34^d4), 14);
1582     a00 =   b0 ^((~b1)&  b2 );
1583     a00 ^= RC[i+2];
1584     a21 =   b1 ^((~b2)&  b3 );
1585     a42 =   b2 ^((~b3)&  b4 );
1586     a13 =   b3 ^((~b4)&  b0 );
1587     a34 =   b4 ^((~b0)&  b1 );
1588 
1589     b2 = ROL64((a30^d0), 3);
1590     b3 = ROL64((a01^d1), 45);
1591     b4 = ROL64((a22^d2), 61);
1592     b0 = ROL64((a43^d3), 28);
1593     b1 = ROL64((a14^d4), 20);
1594     a30 =   b0 ^((~b1)&  b2 );
1595     a01 =   b1 ^((~b2)&  b3 );
1596     a22 =   b2 ^((~b3)&  b4 );
1597     a43 =   b3 ^((~b4)&  b0 );
1598     a14 =   b4 ^((~b0)&  b1 );
1599 
1600     b4 = ROL64((a10^d0), 18);
1601     b0 = ROL64((a31^d1), 1);
1602     b1 = ROL64((a02^d2), 6);
1603     b2 = ROL64((a23^d3), 25);
1604     b3 = ROL64((a44^d4), 8);
1605     a10 =   b0 ^((~b1)&  b2 );
1606     a31 =   b1 ^((~b2)&  b3 );
1607     a02 =   b2 ^((~b3)&  b4 );
1608     a23 =   b3 ^((~b4)&  b0 );
1609     a44 =   b4 ^((~b0)&  b1 );
1610 
1611     b1 = ROL64((a40^d0), 36);
1612     b2 = ROL64((a11^d1), 10);
1613     b3 = ROL64((a32^d2), 15);
1614     b4 = ROL64((a03^d3), 56);
1615     b0 = ROL64((a24^d4), 27);
1616     a40 =   b0 ^((~b1)&  b2 );
1617     a11 =   b1 ^((~b2)&  b3 );
1618     a32 =   b2 ^((~b3)&  b4 );
1619     a03 =   b3 ^((~b4)&  b0 );
1620     a24 =   b4 ^((~b0)&  b1 );
1621 
1622     b3 = ROL64((a20^d0), 41);
1623     b4 = ROL64((a41^d1), 2);
1624     b0 = ROL64((a12^d2), 62);
1625     b1 = ROL64((a33^d3), 55);
1626     b2 = ROL64((a04^d4), 39);
1627     a20 =   b0 ^((~b1)&  b2 );
1628     a41 =   b1 ^((~b2)&  b3 );
1629     a12 =   b2 ^((~b3)&  b4 );
1630     a33 =   b3 ^((~b4)&  b0 );
1631     a04 =   b4 ^((~b0)&  b1 );
1632 
1633     c0 = a00^a30^a10^a40^a20;
1634     c1 = a21^a01^a31^a11^a41;
1635     c2 = a42^a22^a02^a32^a12;
1636     c3 = a13^a43^a23^a03^a33;
1637     c4 = a34^a14^a44^a24^a04;
1638     d0 = c4^ROL64(c1, 1);
1639     d1 = c0^ROL64(c2, 1);
1640     d2 = c1^ROL64(c3, 1);
1641     d3 = c2^ROL64(c4, 1);
1642     d4 = c3^ROL64(c0, 1);
1643 
1644     b0 = (a00^d0);
1645     b1 = ROL64((a01^d1), 44);
1646     b2 = ROL64((a02^d2), 43);
1647     b3 = ROL64((a03^d3), 21);
1648     b4 = ROL64((a04^d4), 14);
1649     a00 =   b0 ^((~b1)&  b2 );
1650     a00 ^= RC[i+3];
1651     a01 =   b1 ^((~b2)&  b3 );
1652     a02 =   b2 ^((~b3)&  b4 );
1653     a03 =   b3 ^((~b4)&  b0 );
1654     a04 =   b4 ^((~b0)&  b1 );
1655 
1656     b2 = ROL64((a10^d0), 3);
1657     b3 = ROL64((a11^d1), 45);
1658     b4 = ROL64((a12^d2), 61);
1659     b0 = ROL64((a13^d3), 28);
1660     b1 = ROL64((a14^d4), 20);
1661     a10 =   b0 ^((~b1)&  b2 );
1662     a11 =   b1 ^((~b2)&  b3 );
1663     a12 =   b2 ^((~b3)&  b4 );
1664     a13 =   b3 ^((~b4)&  b0 );
1665     a14 =   b4 ^((~b0)&  b1 );
1666 
1667     b4 = ROL64((a20^d0), 18);
1668     b0 = ROL64((a21^d1), 1);
1669     b1 = ROL64((a22^d2), 6);
1670     b2 = ROL64((a23^d3), 25);
1671     b3 = ROL64((a24^d4), 8);
1672     a20 =   b0 ^((~b1)&  b2 );
1673     a21 =   b1 ^((~b2)&  b3 );
1674     a22 =   b2 ^((~b3)&  b4 );
1675     a23 =   b3 ^((~b4)&  b0 );
1676     a24 =   b4 ^((~b0)&  b1 );
1677 
1678     b1 = ROL64((a30^d0), 36);
1679     b2 = ROL64((a31^d1), 10);
1680     b3 = ROL64((a32^d2), 15);
1681     b4 = ROL64((a33^d3), 56);
1682     b0 = ROL64((a34^d4), 27);
1683     a30 =   b0 ^((~b1)&  b2 );
1684     a31 =   b1 ^((~b2)&  b3 );
1685     a32 =   b2 ^((~b3)&  b4 );
1686     a33 =   b3 ^((~b4)&  b0 );
1687     a34 =   b4 ^((~b0)&  b1 );
1688 
1689     b3 = ROL64((a40^d0), 41);
1690     b4 = ROL64((a41^d1), 2);
1691     b0 = ROL64((a42^d2), 62);
1692     b1 = ROL64((a43^d3), 55);
1693     b2 = ROL64((a44^d4), 39);
1694     a40 =   b0 ^((~b1)&  b2 );
1695     a41 =   b1 ^((~b2)&  b3 );
1696     a42 =   b2 ^((~b3)&  b4 );
1697     a43 =   b3 ^((~b4)&  b0 );
1698     a44 =   b4 ^((~b0)&  b1 );
1699   }
1700 }
1701 
1702 /*
1703 ** Initialize a new hash.  iSize determines the size of the hash
1704 ** in bits and should be one of 224, 256, 384, or 512.  Or iSize
1705 ** can be zero to use the default hash size of 256 bits.
1706 */
SHA3Init(SHA3Context * p,int iSize)1707 static void SHA3Init(SHA3Context *p, int iSize){
1708   memset(p, 0, sizeof(*p));
1709   if( iSize>=128 && iSize<=512 ){
1710     p->nRate = (1600 - ((iSize + 31)&~31)*2)/8;
1711   }else{
1712     p->nRate = (1600 - 2*256)/8;
1713   }
1714 #if SHA3_BYTEORDER==1234
1715   /* Known to be little-endian at compile-time. No-op */
1716 #elif SHA3_BYTEORDER==4321
1717   p->ixMask = 7;  /* Big-endian */
1718 #else
1719   {
1720     static unsigned int one = 1;
1721     if( 1==*(unsigned char*)&one ){
1722       /* Little endian.  No byte swapping. */
1723       p->ixMask = 0;
1724     }else{
1725       /* Big endian.  Byte swap. */
1726       p->ixMask = 7;
1727     }
1728   }
1729 #endif
1730 }
1731 
1732 /*
1733 ** Make consecutive calls to the SHA3Update function to add new content
1734 ** to the hash
1735 */
SHA3Update(SHA3Context * p,const unsigned char * aData,unsigned int nData)1736 static void SHA3Update(
1737   SHA3Context *p,
1738   const unsigned char *aData,
1739   unsigned int nData
1740 ){
1741   unsigned int i = 0;
1742 #if SHA3_BYTEORDER==1234
1743   if( (p->nLoaded % 8)==0 && ((aData - (const unsigned char*)0)&7)==0 ){
1744     for(; i+7<nData; i+=8){
1745       p->u.s[p->nLoaded/8] ^= *(u64*)&aData[i];
1746       p->nLoaded += 8;
1747       if( p->nLoaded>=p->nRate ){
1748         KeccakF1600Step(p);
1749         p->nLoaded = 0;
1750       }
1751     }
1752   }
1753 #endif
1754   for(; i<nData; i++){
1755 #if SHA3_BYTEORDER==1234
1756     p->u.x[p->nLoaded] ^= aData[i];
1757 #elif SHA3_BYTEORDER==4321
1758     p->u.x[p->nLoaded^0x07] ^= aData[i];
1759 #else
1760     p->u.x[p->nLoaded^p->ixMask] ^= aData[i];
1761 #endif
1762     p->nLoaded++;
1763     if( p->nLoaded==p->nRate ){
1764       KeccakF1600Step(p);
1765       p->nLoaded = 0;
1766     }
1767   }
1768 }
1769 
1770 /*
1771 ** After all content has been added, invoke SHA3Final() to compute
1772 ** the final hash.  The function returns a pointer to the binary
1773 ** hash value.
1774 */
SHA3Final(SHA3Context * p)1775 static unsigned char *SHA3Final(SHA3Context *p){
1776   unsigned int i;
1777   if( p->nLoaded==p->nRate-1 ){
1778     const unsigned char c1 = 0x86;
1779     SHA3Update(p, &c1, 1);
1780   }else{
1781     const unsigned char c2 = 0x06;
1782     const unsigned char c3 = 0x80;
1783     SHA3Update(p, &c2, 1);
1784     p->nLoaded = p->nRate - 1;
1785     SHA3Update(p, &c3, 1);
1786   }
1787   for(i=0; i<p->nRate; i++){
1788     p->u.x[i+p->nRate] = p->u.x[i^p->ixMask];
1789   }
1790   return &p->u.x[p->nRate];
1791 }
1792 /* End of the hashing logic
1793 *****************************************************************************/
1794 
1795 /*
1796 ** Implementation of the sha3(X,SIZE) function.
1797 **
1798 ** Return a BLOB which is the SIZE-bit SHA3 hash of X.  The default
1799 ** size is 256.  If X is a BLOB, it is hashed as is.
1800 ** For all other non-NULL types of input, X is converted into a UTF-8 string
1801 ** and the string is hashed without the trailing 0x00 terminator.  The hash
1802 ** of a NULL value is NULL.
1803 */
sha3Func(sqlite3_context * context,int argc,sqlite3_value ** argv)1804 static void sha3Func(
1805   sqlite3_context *context,
1806   int argc,
1807   sqlite3_value **argv
1808 ){
1809   SHA3Context cx;
1810   int eType = sqlite3_value_type(argv[0]);
1811   int nByte = sqlite3_value_bytes(argv[0]);
1812   int iSize;
1813   if( argc==1 ){
1814     iSize = 256;
1815   }else{
1816     iSize = sqlite3_value_int(argv[1]);
1817     if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){
1818       sqlite3_result_error(context, "SHA3 size should be one of: 224 256 "
1819                                     "384 512", -1);
1820       return;
1821     }
1822   }
1823   if( eType==SQLITE_NULL ) return;
1824   SHA3Init(&cx, iSize);
1825   if( eType==SQLITE_BLOB ){
1826     SHA3Update(&cx, sqlite3_value_blob(argv[0]), nByte);
1827   }else{
1828     SHA3Update(&cx, sqlite3_value_text(argv[0]), nByte);
1829   }
1830   sqlite3_result_blob(context, SHA3Final(&cx), iSize/8, SQLITE_TRANSIENT);
1831 }
1832 
1833 /* Compute a string using sqlite3_vsnprintf() with a maximum length
1834 ** of 50 bytes and add it to the hash.
1835 */
hash_step_vformat(SHA3Context * p,const char * zFormat,...)1836 static void hash_step_vformat(
1837   SHA3Context *p,                 /* Add content to this context */
1838   const char *zFormat,
1839   ...
1840 ){
1841   va_list ap;
1842   int n;
1843   char zBuf[50];
1844   va_start(ap, zFormat);
1845   sqlite3_vsnprintf(sizeof(zBuf),zBuf,zFormat,ap);
1846   va_end(ap);
1847   n = (int)strlen(zBuf);
1848   SHA3Update(p, (unsigned char*)zBuf, n);
1849 }
1850 
1851 /*
1852 ** Implementation of the sha3_query(SQL,SIZE) function.
1853 **
1854 ** This function compiles and runs the SQL statement(s) given in the
1855 ** argument. The results are hashed using a SIZE-bit SHA3.  The default
1856 ** size is 256.
1857 **
1858 ** The format of the byte stream that is hashed is summarized as follows:
1859 **
1860 **       S<n>:<sql>
1861 **       R
1862 **       N
1863 **       I<int>
1864 **       F<ieee-float>
1865 **       B<size>:<bytes>
1866 **       T<size>:<text>
1867 **
1868 ** <sql> is the original SQL text for each statement run and <n> is
1869 ** the size of that text.  The SQL text is UTF-8.  A single R character
1870 ** occurs before the start of each row.  N means a NULL value.
1871 ** I mean an 8-byte little-endian integer <int>.  F is a floating point
1872 ** number with an 8-byte little-endian IEEE floating point value <ieee-float>.
1873 ** B means blobs of <size> bytes.  T means text rendered as <size>
1874 ** bytes of UTF-8.  The <n> and <size> values are expressed as an ASCII
1875 ** text integers.
1876 **
1877 ** For each SQL statement in the X input, there is one S segment.  Each
1878 ** S segment is followed by zero or more R segments, one for each row in the
1879 ** result set.  After each R, there are one or more N, I, F, B, or T segments,
1880 ** one for each column in the result set.  Segments are concatentated directly
1881 ** with no delimiters of any kind.
1882 */
sha3QueryFunc(sqlite3_context * context,int argc,sqlite3_value ** argv)1883 static void sha3QueryFunc(
1884   sqlite3_context *context,
1885   int argc,
1886   sqlite3_value **argv
1887 ){
1888   sqlite3 *db = sqlite3_context_db_handle(context);
1889   const char *zSql = (const char*)sqlite3_value_text(argv[0]);
1890   sqlite3_stmt *pStmt = 0;
1891   int nCol;                   /* Number of columns in the result set */
1892   int i;                      /* Loop counter */
1893   int rc;
1894   int n;
1895   const char *z;
1896   SHA3Context cx;
1897   int iSize;
1898 
1899   if( argc==1 ){
1900     iSize = 256;
1901   }else{
1902     iSize = sqlite3_value_int(argv[1]);
1903     if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){
1904       sqlite3_result_error(context, "SHA3 size should be one of: 224 256 "
1905                                     "384 512", -1);
1906       return;
1907     }
1908   }
1909   if( zSql==0 ) return;
1910   SHA3Init(&cx, iSize);
1911   while( zSql[0] ){
1912     rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zSql);
1913     if( rc ){
1914       char *zMsg = sqlite3_mprintf("error SQL statement [%s]: %s",
1915                                    zSql, sqlite3_errmsg(db));
1916       sqlite3_finalize(pStmt);
1917       sqlite3_result_error(context, zMsg, -1);
1918       sqlite3_free(zMsg);
1919       return;
1920     }
1921     if( !sqlite3_stmt_readonly(pStmt) ){
1922       char *zMsg = sqlite3_mprintf("non-query: [%s]", sqlite3_sql(pStmt));
1923       sqlite3_finalize(pStmt);
1924       sqlite3_result_error(context, zMsg, -1);
1925       sqlite3_free(zMsg);
1926       return;
1927     }
1928     nCol = sqlite3_column_count(pStmt);
1929     z = sqlite3_sql(pStmt);
1930     n = (int)strlen(z);
1931     hash_step_vformat(&cx,"S%d:",n);
1932     SHA3Update(&cx,(unsigned char*)z,n);
1933 
1934     /* Compute a hash over the result of the query */
1935     while( SQLITE_ROW==sqlite3_step(pStmt) ){
1936       SHA3Update(&cx,(const unsigned char*)"R",1);
1937       for(i=0; i<nCol; i++){
1938         switch( sqlite3_column_type(pStmt,i) ){
1939           case SQLITE_NULL: {
1940             SHA3Update(&cx, (const unsigned char*)"N",1);
1941             break;
1942           }
1943           case SQLITE_INTEGER: {
1944             sqlite3_uint64 u;
1945             int j;
1946             unsigned char x[9];
1947             sqlite3_int64 v = sqlite3_column_int64(pStmt,i);
1948             memcpy(&u, &v, 8);
1949             for(j=8; j>=1; j--){
1950               x[j] = u & 0xff;
1951               u >>= 8;
1952             }
1953             x[0] = 'I';
1954             SHA3Update(&cx, x, 9);
1955             break;
1956           }
1957           case SQLITE_FLOAT: {
1958             sqlite3_uint64 u;
1959             int j;
1960             unsigned char x[9];
1961             double r = sqlite3_column_double(pStmt,i);
1962             memcpy(&u, &r, 8);
1963             for(j=8; j>=1; j--){
1964               x[j] = u & 0xff;
1965               u >>= 8;
1966             }
1967             x[0] = 'F';
1968             SHA3Update(&cx,x,9);
1969             break;
1970           }
1971           case SQLITE_TEXT: {
1972             int n2 = sqlite3_column_bytes(pStmt, i);
1973             const unsigned char *z2 = sqlite3_column_text(pStmt, i);
1974             hash_step_vformat(&cx,"T%d:",n2);
1975             SHA3Update(&cx, z2, n2);
1976             break;
1977           }
1978           case SQLITE_BLOB: {
1979             int n2 = sqlite3_column_bytes(pStmt, i);
1980             const unsigned char *z2 = sqlite3_column_blob(pStmt, i);
1981             hash_step_vformat(&cx,"B%d:",n2);
1982             SHA3Update(&cx, z2, n2);
1983             break;
1984           }
1985         }
1986       }
1987     }
1988     sqlite3_finalize(pStmt);
1989   }
1990   sqlite3_result_blob(context, SHA3Final(&cx), iSize/8, SQLITE_TRANSIENT);
1991 }
1992 
1993 
1994 #ifdef _WIN32
1995 
1996 #endif
sqlite3_shathree_init(sqlite3 * db,char ** pzErrMsg,const sqlite3_api_routines * pApi)1997 static int sqlite3_shathree_init(
1998   sqlite3 *db,
1999   char **pzErrMsg,
2000   const sqlite3_api_routines *pApi
2001 ){
2002   int rc = SQLITE_OK;
2003   SQLITE_EXTENSION_INIT2(pApi);
2004   (void)pzErrMsg;  /* Unused parameter */
2005   rc = sqlite3_create_function(db, "sha3", 1, SQLITE_UTF8, 0,
2006                                sha3Func, 0, 0);
2007   if( rc==SQLITE_OK ){
2008     rc = sqlite3_create_function(db, "sha3", 2, SQLITE_UTF8, 0,
2009                                  sha3Func, 0, 0);
2010   }
2011   if( rc==SQLITE_OK ){
2012     rc = sqlite3_create_function(db, "sha3_query", 1, SQLITE_UTF8, 0,
2013                                  sha3QueryFunc, 0, 0);
2014   }
2015   if( rc==SQLITE_OK ){
2016     rc = sqlite3_create_function(db, "sha3_query", 2, SQLITE_UTF8, 0,
2017                                  sha3QueryFunc, 0, 0);
2018   }
2019   return rc;
2020 }
2021 
2022 /************************* End ../ext/misc/shathree.c ********************/
2023 /************************* Begin ../ext/misc/fileio.c ******************/
2024 /*
2025 ** 2014-06-13
2026 **
2027 ** The author disclaims copyright to this source code.  In place of
2028 ** a legal notice, here is a blessing:
2029 **
2030 **    May you do good and not evil.
2031 **    May you find forgiveness for yourself and forgive others.
2032 **    May you share freely, never taking more than you give.
2033 **
2034 ******************************************************************************
2035 **
2036 ** This SQLite extension implements SQL functions readfile() and
2037 ** writefile(), and eponymous virtual type "fsdir".
2038 **
2039 ** WRITEFILE(FILE, DATA [, MODE [, MTIME]]):
2040 **
2041 **   If neither of the optional arguments is present, then this UDF
2042 **   function writes blob DATA to file FILE. If successful, the number
2043 **   of bytes written is returned. If an error occurs, NULL is returned.
2044 **
2045 **   If the first option argument - MODE - is present, then it must
2046 **   be passed an integer value that corresponds to a POSIX mode
2047 **   value (file type + permissions, as returned in the stat.st_mode
2048 **   field by the stat() system call). Three types of files may
2049 **   be written/created:
2050 **
2051 **     regular files:  (mode & 0170000)==0100000
2052 **     symbolic links: (mode & 0170000)==0120000
2053 **     directories:    (mode & 0170000)==0040000
2054 **
2055 **   For a directory, the DATA is ignored. For a symbolic link, it is
2056 **   interpreted as text and used as the target of the link. For a
2057 **   regular file, it is interpreted as a blob and written into the
2058 **   named file. Regardless of the type of file, its permissions are
2059 **   set to (mode & 0777) before returning.
2060 **
2061 **   If the optional MTIME argument is present, then it is interpreted
2062 **   as an integer - the number of seconds since the unix epoch. The
2063 **   modification-time of the target file is set to this value before
2064 **   returning.
2065 **
2066 **   If three or more arguments are passed to this function and an
2067 **   error is encountered, an exception is raised.
2068 **
2069 ** READFILE(FILE):
2070 **
2071 **   Read and return the contents of file FILE (type blob) from disk.
2072 **
2073 ** FSDIR:
2074 **
2075 **   Used as follows:
2076 **
2077 **     SELECT * FROM fsdir($path [, $dir]);
2078 **
2079 **   Parameter $path is an absolute or relative pathname. If the file that it
2080 **   refers to does not exist, it is an error. If the path refers to a regular
2081 **   file or symbolic link, it returns a single row. Or, if the path refers
2082 **   to a directory, it returns one row for the directory, and one row for each
2083 **   file within the hierarchy rooted at $path.
2084 **
2085 **   Each row has the following columns:
2086 **
2087 **     name:  Path to file or directory (text value).
2088 **     mode:  Value of stat.st_mode for directory entry (an integer).
2089 **     mtime: Value of stat.st_mtime for directory entry (an integer).
2090 **     data:  For a regular file, a blob containing the file data. For a
2091 **            symlink, a text value containing the text of the link. For a
2092 **            directory, NULL.
2093 **
2094 **   If a non-NULL value is specified for the optional $dir parameter and
2095 **   $path is a relative path, then $path is interpreted relative to $dir.
2096 **   And the paths returned in the "name" column of the table are also
2097 **   relative to directory $dir.
2098 */
2099 SQLITE_EXTENSION_INIT1
2100 #include <stdio.h>
2101 #include <string.h>
2102 #include <assert.h>
2103 
2104 #include <sys/types.h>
2105 #include <sys/stat.h>
2106 #include <fcntl.h>
2107 #if !defined(_WIN32) && !defined(WIN32)
2108 #  include <unistd.h>
2109 #  include <dirent.h>
2110 #  include <utime.h>
2111 #  include <sys/time.h>
2112 #else
2113 #  include "windows.h"
2114 #  include <io.h>
2115 #  include <direct.h>
2116 /* #  include "test_windirent.h" */
2117 #  define dirent DIRENT
2118 #  ifndef chmod
2119 #    define chmod _chmod
2120 #  endif
2121 #  ifndef stat
2122 #    define stat _stat
2123 #  endif
2124 #  define mkdir(path,mode) _mkdir(path)
2125 #  define lstat(path,buf) stat(path,buf)
2126 #endif
2127 #include <time.h>
2128 #include <errno.h>
2129 
2130 
2131 /*
2132 ** Structure of the fsdir() table-valued function
2133 */
2134                  /*    0    1    2     3    4           5             */
2135 #define FSDIR_SCHEMA "(name,mode,mtime,data,path HIDDEN,dir HIDDEN)"
2136 #define FSDIR_COLUMN_NAME     0     /* Name of the file */
2137 #define FSDIR_COLUMN_MODE     1     /* Access mode */
2138 #define FSDIR_COLUMN_MTIME    2     /* Last modification time */
2139 #define FSDIR_COLUMN_DATA     3     /* File content */
2140 #define FSDIR_COLUMN_PATH     4     /* Path to top of search */
2141 #define FSDIR_COLUMN_DIR      5     /* Path is relative to this directory */
2142 
2143 
2144 /*
2145 ** Set the result stored by context ctx to a blob containing the
2146 ** contents of file zName.
2147 */
readFileContents(sqlite3_context * ctx,const char * zName)2148 static void readFileContents(sqlite3_context *ctx, const char *zName){
2149   FILE *in;
2150   long nIn;
2151   void *pBuf;
2152 
2153   in = fopen(zName, "rb");
2154   if( in==0 ) return;
2155   fseek(in, 0, SEEK_END);
2156   nIn = ftell(in);
2157   rewind(in);
2158   pBuf = sqlite3_malloc( nIn );
2159   if( pBuf && 1==fread(pBuf, nIn, 1, in) ){
2160     sqlite3_result_blob(ctx, pBuf, nIn, sqlite3_free);
2161   }else{
2162     sqlite3_free(pBuf);
2163   }
2164   fclose(in);
2165 }
2166 
2167 /*
2168 ** Implementation of the "readfile(X)" SQL function.  The entire content
2169 ** of the file named X is read and returned as a BLOB.  NULL is returned
2170 ** if the file does not exist or is unreadable.
2171 */
readfileFunc(sqlite3_context * context,int argc,sqlite3_value ** argv)2172 static void readfileFunc(
2173   sqlite3_context *context,
2174   int argc,
2175   sqlite3_value **argv
2176 ){
2177   const char *zName;
2178   (void)(argc);  /* Unused parameter */
2179   zName = (const char*)sqlite3_value_text(argv[0]);
2180   if( zName==0 ) return;
2181   readFileContents(context, zName);
2182 }
2183 
2184 /*
2185 ** Set the error message contained in context ctx to the results of
2186 ** vprintf(zFmt, ...).
2187 */
ctxErrorMsg(sqlite3_context * ctx,const char * zFmt,...)2188 static void ctxErrorMsg(sqlite3_context *ctx, const char *zFmt, ...){
2189   char *zMsg = 0;
2190   va_list ap;
2191   va_start(ap, zFmt);
2192   zMsg = sqlite3_vmprintf(zFmt, ap);
2193   sqlite3_result_error(ctx, zMsg, -1);
2194   sqlite3_free(zMsg);
2195   va_end(ap);
2196 }
2197 
2198 #if defined(_WIN32)
2199 /*
2200 ** This function is designed to convert a Win32 FILETIME structure into the
2201 ** number of seconds since the Unix Epoch (1970-01-01 00:00:00 UTC).
2202 */
fileTimeToUnixTime(LPFILETIME pFileTime)2203 static sqlite3_uint64 fileTimeToUnixTime(
2204   LPFILETIME pFileTime
2205 ){
2206   SYSTEMTIME epochSystemTime;
2207   ULARGE_INTEGER epochIntervals;
2208   FILETIME epochFileTime;
2209   ULARGE_INTEGER fileIntervals;
2210 
2211   memset(&epochSystemTime, 0, sizeof(SYSTEMTIME));
2212   epochSystemTime.wYear = 1970;
2213   epochSystemTime.wMonth = 1;
2214   epochSystemTime.wDay = 1;
2215   SystemTimeToFileTime(&epochSystemTime, &epochFileTime);
2216   epochIntervals.LowPart = epochFileTime.dwLowDateTime;
2217   epochIntervals.HighPart = epochFileTime.dwHighDateTime;
2218 
2219   fileIntervals.LowPart = pFileTime->dwLowDateTime;
2220   fileIntervals.HighPart = pFileTime->dwHighDateTime;
2221 
2222   return (fileIntervals.QuadPart - epochIntervals.QuadPart) / 10000000;
2223 }
2224 
2225 /*
2226 ** This function attempts to normalize the time values found in the stat()
2227 ** buffer to UTC.  This is necessary on Win32, where the runtime library
2228 ** appears to return these values as local times.
2229 */
statTimesToUtc(const char * zPath,struct stat * pStatBuf)2230 static void statTimesToUtc(
2231   const char *zPath,
2232   struct stat *pStatBuf
2233 ){
2234   HANDLE hFindFile;
2235   WIN32_FIND_DATAW fd;
2236   LPWSTR zUnicodeName;
2237   extern LPWSTR sqlite3_win32_utf8_to_unicode(const char*);
2238   zUnicodeName = sqlite3_win32_utf8_to_unicode(zPath);
2239   if( zUnicodeName ){
2240     memset(&fd, 0, sizeof(WIN32_FIND_DATAW));
2241     hFindFile = FindFirstFileW(zUnicodeName, &fd);
2242     if( hFindFile!=NULL ){
2243       pStatBuf->st_ctime = (time_t)fileTimeToUnixTime(&fd.ftCreationTime);
2244       pStatBuf->st_atime = (time_t)fileTimeToUnixTime(&fd.ftLastAccessTime);
2245       pStatBuf->st_mtime = (time_t)fileTimeToUnixTime(&fd.ftLastWriteTime);
2246       FindClose(hFindFile);
2247     }
2248     sqlite3_free(zUnicodeName);
2249   }
2250 }
2251 #endif
2252 
2253 /*
2254 ** This function is used in place of stat().  On Windows, special handling
2255 ** is required in order for the included time to be returned as UTC.  On all
2256 ** other systems, this function simply calls stat().
2257 */
fileStat(const char * zPath,struct stat * pStatBuf)2258 static int fileStat(
2259   const char *zPath,
2260   struct stat *pStatBuf
2261 ){
2262 #if defined(_WIN32)
2263   int rc = stat(zPath, pStatBuf);
2264   if( rc==0 ) statTimesToUtc(zPath, pStatBuf);
2265   return rc;
2266 #else
2267   return stat(zPath, pStatBuf);
2268 #endif
2269 }
2270 
2271 /*
2272 ** This function is used in place of lstat().  On Windows, special handling
2273 ** is required in order for the included time to be returned as UTC.  On all
2274 ** other systems, this function simply calls lstat().
2275 */
fileLinkStat(const char * zPath,struct stat * pStatBuf)2276 static int fileLinkStat(
2277   const char *zPath,
2278   struct stat *pStatBuf
2279 ){
2280 #if defined(_WIN32)
2281   int rc = lstat(zPath, pStatBuf);
2282   if( rc==0 ) statTimesToUtc(zPath, pStatBuf);
2283   return rc;
2284 #else
2285   return lstat(zPath, pStatBuf);
2286 #endif
2287 }
2288 
2289 /*
2290 ** Argument zFile is the name of a file that will be created and/or written
2291 ** by SQL function writefile(). This function ensures that the directory
2292 ** zFile will be written to exists, creating it if required. The permissions
2293 ** for any path components created by this function are set to (mode&0777).
2294 **
2295 ** If an OOM condition is encountered, SQLITE_NOMEM is returned. Otherwise,
2296 ** SQLITE_OK is returned if the directory is successfully created, or
2297 ** SQLITE_ERROR otherwise.
2298 */
makeDirectory(const char * zFile,mode_t mode)2299 static int makeDirectory(
2300   const char *zFile,
2301   mode_t mode
2302 ){
2303   char *zCopy = sqlite3_mprintf("%s", zFile);
2304   int rc = SQLITE_OK;
2305 
2306   if( zCopy==0 ){
2307     rc = SQLITE_NOMEM;
2308   }else{
2309     int nCopy = (int)strlen(zCopy);
2310     int i = 1;
2311 
2312     while( rc==SQLITE_OK ){
2313       struct stat sStat;
2314       int rc2;
2315 
2316       for(; zCopy[i]!='/' && i<nCopy; i++);
2317       if( i==nCopy ) break;
2318       zCopy[i] = '\0';
2319 
2320       rc2 = fileStat(zCopy, &sStat);
2321       if( rc2!=0 ){
2322         if( mkdir(zCopy, mode & 0777) ) rc = SQLITE_ERROR;
2323       }else{
2324         if( !S_ISDIR(sStat.st_mode) ) rc = SQLITE_ERROR;
2325       }
2326       zCopy[i] = '/';
2327       i++;
2328     }
2329 
2330     sqlite3_free(zCopy);
2331   }
2332 
2333   return rc;
2334 }
2335 
2336 /*
2337 ** This function does the work for the writefile() UDF. Refer to
2338 ** header comments at the top of this file for details.
2339 */
writeFile(sqlite3_context * pCtx,const char * zFile,sqlite3_value * pData,mode_t mode,sqlite3_int64 mtime)2340 static int writeFile(
2341   sqlite3_context *pCtx,          /* Context to return bytes written in */
2342   const char *zFile,              /* File to write */
2343   sqlite3_value *pData,           /* Data to write */
2344   mode_t mode,                    /* MODE parameter passed to writefile() */
2345   sqlite3_int64 mtime             /* MTIME parameter (or -1 to not set time) */
2346 ){
2347 #if !defined(_WIN32) && !defined(WIN32)
2348   if( S_ISLNK(mode) ){
2349     const char *zTo = (const char*)sqlite3_value_text(pData);
2350     if( symlink(zTo, zFile)<0 ) return 1;
2351   }else
2352 #endif
2353   {
2354     if( S_ISDIR(mode) ){
2355       if( mkdir(zFile, mode) ){
2356         /* The mkdir() call to create the directory failed. This might not
2357         ** be an error though - if there is already a directory at the same
2358         ** path and either the permissions already match or can be changed
2359         ** to do so using chmod(), it is not an error.  */
2360         struct stat sStat;
2361         if( errno!=EEXIST
2362          || 0!=fileStat(zFile, &sStat)
2363          || !S_ISDIR(sStat.st_mode)
2364          || ((sStat.st_mode&0777)!=(mode&0777) && 0!=chmod(zFile, mode&0777))
2365         ){
2366           return 1;
2367         }
2368       }
2369     }else{
2370       sqlite3_int64 nWrite = 0;
2371       const char *z;
2372       int rc = 0;
2373       FILE *out = fopen(zFile, "wb");
2374       if( out==0 ) return 1;
2375       z = (const char*)sqlite3_value_blob(pData);
2376       if( z ){
2377         sqlite3_int64 n = fwrite(z, 1, sqlite3_value_bytes(pData), out);
2378         nWrite = sqlite3_value_bytes(pData);
2379         if( nWrite!=n ){
2380           rc = 1;
2381         }
2382       }
2383       fclose(out);
2384       if( rc==0 && mode && chmod(zFile, mode & 0777) ){
2385         rc = 1;
2386       }
2387       if( rc ) return 2;
2388       sqlite3_result_int64(pCtx, nWrite);
2389     }
2390   }
2391 
2392   if( mtime>=0 ){
2393 #if defined(_WIN32)
2394     /* Windows */
2395     FILETIME lastAccess;
2396     FILETIME lastWrite;
2397     SYSTEMTIME currentTime;
2398     LONGLONG intervals;
2399     HANDLE hFile;
2400     LPWSTR zUnicodeName;
2401     extern LPWSTR sqlite3_win32_utf8_to_unicode(const char*);
2402 
2403     GetSystemTime(&currentTime);
2404     SystemTimeToFileTime(&currentTime, &lastAccess);
2405     intervals = Int32x32To64(mtime, 10000000) + 116444736000000000;
2406     lastWrite.dwLowDateTime = (DWORD)intervals;
2407     lastWrite.dwHighDateTime = intervals >> 32;
2408     zUnicodeName = sqlite3_win32_utf8_to_unicode(zFile);
2409     if( zUnicodeName==0 ){
2410       return 1;
2411     }
2412     hFile = CreateFileW(
2413       zUnicodeName, FILE_WRITE_ATTRIBUTES, 0, NULL, OPEN_EXISTING,
2414       FILE_FLAG_BACKUP_SEMANTICS, NULL
2415     );
2416     sqlite3_free(zUnicodeName);
2417     if( hFile!=INVALID_HANDLE_VALUE ){
2418       BOOL bResult = SetFileTime(hFile, NULL, &lastAccess, &lastWrite);
2419       CloseHandle(hFile);
2420       return !bResult;
2421     }else{
2422       return 1;
2423     }
2424 #elif defined(AT_FDCWD) && 0 /* utimensat() is not universally available */
2425     /* Recent unix */
2426     struct timespec times[2];
2427     times[0].tv_nsec = times[1].tv_nsec = 0;
2428     times[0].tv_sec = time(0);
2429     times[1].tv_sec = mtime;
2430     if( utimensat(AT_FDCWD, zFile, times, AT_SYMLINK_NOFOLLOW) ){
2431       return 1;
2432     }
2433 #else
2434     /* Legacy unix */
2435     struct timeval times[2];
2436     times[0].tv_usec = times[1].tv_usec = 0;
2437     times[0].tv_sec = time(0);
2438     times[1].tv_sec = mtime;
2439     if( utimes(zFile, times) ){
2440       return 1;
2441     }
2442 #endif
2443   }
2444 
2445   return 0;
2446 }
2447 
2448 /*
2449 ** Implementation of the "writefile(W,X[,Y[,Z]]])" SQL function.
2450 ** Refer to header comments at the top of this file for details.
2451 */
writefileFunc(sqlite3_context * context,int argc,sqlite3_value ** argv)2452 static void writefileFunc(
2453   sqlite3_context *context,
2454   int argc,
2455   sqlite3_value **argv
2456 ){
2457   const char *zFile;
2458   mode_t mode = 0;
2459   int res;
2460   sqlite3_int64 mtime = -1;
2461 
2462   if( argc<2 || argc>4 ){
2463     sqlite3_result_error(context,
2464         "wrong number of arguments to function writefile()", -1
2465     );
2466     return;
2467   }
2468 
2469   zFile = (const char*)sqlite3_value_text(argv[0]);
2470   if( zFile==0 ) return;
2471   if( argc>=3 ){
2472     mode = (mode_t)sqlite3_value_int(argv[2]);
2473   }
2474   if( argc==4 ){
2475     mtime = sqlite3_value_int64(argv[3]);
2476   }
2477 
2478   res = writeFile(context, zFile, argv[1], mode, mtime);
2479   if( res==1 && errno==ENOENT ){
2480     if( makeDirectory(zFile, mode)==SQLITE_OK ){
2481       res = writeFile(context, zFile, argv[1], mode, mtime);
2482     }
2483   }
2484 
2485   if( argc>2 && res!=0 ){
2486     if( S_ISLNK(mode) ){
2487       ctxErrorMsg(context, "failed to create symlink: %s", zFile);
2488     }else if( S_ISDIR(mode) ){
2489       ctxErrorMsg(context, "failed to create directory: %s", zFile);
2490     }else{
2491       ctxErrorMsg(context, "failed to write file: %s", zFile);
2492     }
2493   }
2494 }
2495 
2496 /*
2497 ** SQL function:   lsmode(MODE)
2498 **
2499 ** Given a numberic st_mode from stat(), convert it into a human-readable
2500 ** text string in the style of "ls -l".
2501 */
lsModeFunc(sqlite3_context * context,int argc,sqlite3_value ** argv)2502 static void lsModeFunc(
2503   sqlite3_context *context,
2504   int argc,
2505   sqlite3_value **argv
2506 ){
2507   int i;
2508   int iMode = sqlite3_value_int(argv[0]);
2509   char z[16];
2510   (void)argc;
2511   if( S_ISLNK(iMode) ){
2512     z[0] = 'l';
2513   }else if( S_ISREG(iMode) ){
2514     z[0] = '-';
2515   }else if( S_ISDIR(iMode) ){
2516     z[0] = 'd';
2517   }else{
2518     z[0] = '?';
2519   }
2520   for(i=0; i<3; i++){
2521     int m = (iMode >> ((2-i)*3));
2522     char *a = &z[1 + i*3];
2523     a[0] = (m & 0x4) ? 'r' : '-';
2524     a[1] = (m & 0x2) ? 'w' : '-';
2525     a[2] = (m & 0x1) ? 'x' : '-';
2526   }
2527   z[10] = '\0';
2528   sqlite3_result_text(context, z, -1, SQLITE_TRANSIENT);
2529 }
2530 
2531 #ifndef SQLITE_OMIT_VIRTUALTABLE
2532 
2533 /*
2534 ** Cursor type for recursively iterating through a directory structure.
2535 */
2536 typedef struct fsdir_cursor fsdir_cursor;
2537 typedef struct FsdirLevel FsdirLevel;
2538 
2539 struct FsdirLevel {
2540   DIR *pDir;                 /* From opendir() */
2541   char *zDir;                /* Name of directory (nul-terminated) */
2542 };
2543 
2544 struct fsdir_cursor {
2545   sqlite3_vtab_cursor base;  /* Base class - must be first */
2546 
2547   int nLvl;                  /* Number of entries in aLvl[] array */
2548   int iLvl;                  /* Index of current entry */
2549   FsdirLevel *aLvl;          /* Hierarchy of directories being traversed */
2550 
2551   const char *zBase;
2552   int nBase;
2553 
2554   struct stat sStat;         /* Current lstat() results */
2555   char *zPath;               /* Path to current entry */
2556   sqlite3_int64 iRowid;      /* Current rowid */
2557 };
2558 
2559 typedef struct fsdir_tab fsdir_tab;
2560 struct fsdir_tab {
2561   sqlite3_vtab base;         /* Base class - must be first */
2562 };
2563 
2564 /*
2565 ** Construct a new fsdir virtual table object.
2566 */
fsdirConnect(sqlite3 * db,void * pAux,int argc,const char * const * argv,sqlite3_vtab ** ppVtab,char ** pzErr)2567 static int fsdirConnect(
2568   sqlite3 *db,
2569   void *pAux,
2570   int argc, const char *const*argv,
2571   sqlite3_vtab **ppVtab,
2572   char **pzErr
2573 ){
2574   fsdir_tab *pNew = 0;
2575   int rc;
2576   (void)pAux;
2577   (void)argc;
2578   (void)argv;
2579   (void)pzErr;
2580   rc = sqlite3_declare_vtab(db, "CREATE TABLE x" FSDIR_SCHEMA);
2581   if( rc==SQLITE_OK ){
2582     pNew = (fsdir_tab*)sqlite3_malloc( sizeof(*pNew) );
2583     if( pNew==0 ) return SQLITE_NOMEM;
2584     memset(pNew, 0, sizeof(*pNew));
2585   }
2586   *ppVtab = (sqlite3_vtab*)pNew;
2587   return rc;
2588 }
2589 
2590 /*
2591 ** This method is the destructor for fsdir vtab objects.
2592 */
fsdirDisconnect(sqlite3_vtab * pVtab)2593 static int fsdirDisconnect(sqlite3_vtab *pVtab){
2594   sqlite3_free(pVtab);
2595   return SQLITE_OK;
2596 }
2597 
2598 /*
2599 ** Constructor for a new fsdir_cursor object.
2600 */
fsdirOpen(sqlite3_vtab * p,sqlite3_vtab_cursor ** ppCursor)2601 static int fsdirOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){
2602   fsdir_cursor *pCur;
2603   (void)p;
2604   pCur = sqlite3_malloc( sizeof(*pCur) );
2605   if( pCur==0 ) return SQLITE_NOMEM;
2606   memset(pCur, 0, sizeof(*pCur));
2607   pCur->iLvl = -1;
2608   *ppCursor = &pCur->base;
2609   return SQLITE_OK;
2610 }
2611 
2612 /*
2613 ** Reset a cursor back to the state it was in when first returned
2614 ** by fsdirOpen().
2615 */
fsdirResetCursor(fsdir_cursor * pCur)2616 static void fsdirResetCursor(fsdir_cursor *pCur){
2617   int i;
2618   for(i=0; i<=pCur->iLvl; i++){
2619     FsdirLevel *pLvl = &pCur->aLvl[i];
2620     if( pLvl->pDir ) closedir(pLvl->pDir);
2621     sqlite3_free(pLvl->zDir);
2622   }
2623   sqlite3_free(pCur->zPath);
2624   sqlite3_free(pCur->aLvl);
2625   pCur->aLvl = 0;
2626   pCur->zPath = 0;
2627   pCur->zBase = 0;
2628   pCur->nBase = 0;
2629   pCur->nLvl = 0;
2630   pCur->iLvl = -1;
2631   pCur->iRowid = 1;
2632 }
2633 
2634 /*
2635 ** Destructor for an fsdir_cursor.
2636 */
fsdirClose(sqlite3_vtab_cursor * cur)2637 static int fsdirClose(sqlite3_vtab_cursor *cur){
2638   fsdir_cursor *pCur = (fsdir_cursor*)cur;
2639 
2640   fsdirResetCursor(pCur);
2641   sqlite3_free(pCur);
2642   return SQLITE_OK;
2643 }
2644 
2645 /*
2646 ** Set the error message for the virtual table associated with cursor
2647 ** pCur to the results of vprintf(zFmt, ...).
2648 */
fsdirSetErrmsg(fsdir_cursor * pCur,const char * zFmt,...)2649 static void fsdirSetErrmsg(fsdir_cursor *pCur, const char *zFmt, ...){
2650   va_list ap;
2651   va_start(ap, zFmt);
2652   pCur->base.pVtab->zErrMsg = sqlite3_vmprintf(zFmt, ap);
2653   va_end(ap);
2654 }
2655 
2656 
2657 /*
2658 ** Advance an fsdir_cursor to its next row of output.
2659 */
fsdirNext(sqlite3_vtab_cursor * cur)2660 static int fsdirNext(sqlite3_vtab_cursor *cur){
2661   fsdir_cursor *pCur = (fsdir_cursor*)cur;
2662   mode_t m = pCur->sStat.st_mode;
2663 
2664   pCur->iRowid++;
2665   if( S_ISDIR(m) ){
2666     /* Descend into this directory */
2667     int iNew = pCur->iLvl + 1;
2668     FsdirLevel *pLvl;
2669     if( iNew>=pCur->nLvl ){
2670       int nNew = iNew+1;
2671       int nByte = nNew*sizeof(FsdirLevel);
2672       FsdirLevel *aNew = (FsdirLevel*)sqlite3_realloc(pCur->aLvl, nByte);
2673       if( aNew==0 ) return SQLITE_NOMEM;
2674       memset(&aNew[pCur->nLvl], 0, sizeof(FsdirLevel)*(nNew-pCur->nLvl));
2675       pCur->aLvl = aNew;
2676       pCur->nLvl = nNew;
2677     }
2678     pCur->iLvl = iNew;
2679     pLvl = &pCur->aLvl[iNew];
2680 
2681     pLvl->zDir = pCur->zPath;
2682     pCur->zPath = 0;
2683     pLvl->pDir = opendir(pLvl->zDir);
2684     if( pLvl->pDir==0 ){
2685       fsdirSetErrmsg(pCur, "cannot read directory: %s", pCur->zPath);
2686       return SQLITE_ERROR;
2687     }
2688   }
2689 
2690   while( pCur->iLvl>=0 ){
2691     FsdirLevel *pLvl = &pCur->aLvl[pCur->iLvl];
2692     struct dirent *pEntry = readdir(pLvl->pDir);
2693     if( pEntry ){
2694       if( pEntry->d_name[0]=='.' ){
2695        if( pEntry->d_name[1]=='.' && pEntry->d_name[2]=='\0' ) continue;
2696        if( pEntry->d_name[1]=='\0' ) continue;
2697       }
2698       sqlite3_free(pCur->zPath);
2699       pCur->zPath = sqlite3_mprintf("%s/%s", pLvl->zDir, pEntry->d_name);
2700       if( pCur->zPath==0 ) return SQLITE_NOMEM;
2701       if( fileLinkStat(pCur->zPath, &pCur->sStat) ){
2702         fsdirSetErrmsg(pCur, "cannot stat file: %s", pCur->zPath);
2703         return SQLITE_ERROR;
2704       }
2705       return SQLITE_OK;
2706     }
2707     closedir(pLvl->pDir);
2708     sqlite3_free(pLvl->zDir);
2709     pLvl->pDir = 0;
2710     pLvl->zDir = 0;
2711     pCur->iLvl--;
2712   }
2713 
2714   /* EOF */
2715   sqlite3_free(pCur->zPath);
2716   pCur->zPath = 0;
2717   return SQLITE_OK;
2718 }
2719 
2720 /*
2721 ** Return values of columns for the row at which the series_cursor
2722 ** is currently pointing.
2723 */
fsdirColumn(sqlite3_vtab_cursor * cur,sqlite3_context * ctx,int i)2724 static int fsdirColumn(
2725   sqlite3_vtab_cursor *cur,   /* The cursor */
2726   sqlite3_context *ctx,       /* First argument to sqlite3_result_...() */
2727   int i                       /* Which column to return */
2728 ){
2729   fsdir_cursor *pCur = (fsdir_cursor*)cur;
2730   switch( i ){
2731     case FSDIR_COLUMN_NAME: {
2732       sqlite3_result_text(ctx, &pCur->zPath[pCur->nBase], -1, SQLITE_TRANSIENT);
2733       break;
2734     }
2735 
2736     case FSDIR_COLUMN_MODE:
2737       sqlite3_result_int64(ctx, pCur->sStat.st_mode);
2738       break;
2739 
2740     case FSDIR_COLUMN_MTIME:
2741       sqlite3_result_int64(ctx, pCur->sStat.st_mtime);
2742       break;
2743 
2744     case FSDIR_COLUMN_DATA: {
2745       mode_t m = pCur->sStat.st_mode;
2746       if( S_ISDIR(m) ){
2747         sqlite3_result_null(ctx);
2748 #if !defined(_WIN32) && !defined(WIN32)
2749       }else if( S_ISLNK(m) ){
2750         char aStatic[64];
2751         char *aBuf = aStatic;
2752         int nBuf = 64;
2753         int n;
2754 
2755         while( 1 ){
2756           n = readlink(pCur->zPath, aBuf, nBuf);
2757           if( n<nBuf ) break;
2758           if( aBuf!=aStatic ) sqlite3_free(aBuf);
2759           nBuf = nBuf*2;
2760           aBuf = sqlite3_malloc(nBuf);
2761           if( aBuf==0 ){
2762             sqlite3_result_error_nomem(ctx);
2763             return SQLITE_NOMEM;
2764           }
2765         }
2766 
2767         sqlite3_result_text(ctx, aBuf, n, SQLITE_TRANSIENT);
2768         if( aBuf!=aStatic ) sqlite3_free(aBuf);
2769 #endif
2770       }else{
2771         readFileContents(ctx, pCur->zPath);
2772       }
2773     }
2774     case FSDIR_COLUMN_PATH:
2775     default: {
2776       /* The FSDIR_COLUMN_PATH and FSDIR_COLUMN_DIR are input parameters.
2777       ** always return their values as NULL */
2778       break;
2779     }
2780   }
2781   return SQLITE_OK;
2782 }
2783 
2784 /*
2785 ** Return the rowid for the current row. In this implementation, the
2786 ** first row returned is assigned rowid value 1, and each subsequent
2787 ** row a value 1 more than that of the previous.
2788 */
fsdirRowid(sqlite3_vtab_cursor * cur,sqlite_int64 * pRowid)2789 static int fsdirRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
2790   fsdir_cursor *pCur = (fsdir_cursor*)cur;
2791   *pRowid = pCur->iRowid;
2792   return SQLITE_OK;
2793 }
2794 
2795 /*
2796 ** Return TRUE if the cursor has been moved off of the last
2797 ** row of output.
2798 */
fsdirEof(sqlite3_vtab_cursor * cur)2799 static int fsdirEof(sqlite3_vtab_cursor *cur){
2800   fsdir_cursor *pCur = (fsdir_cursor*)cur;
2801   return (pCur->zPath==0);
2802 }
2803 
2804 /*
2805 ** xFilter callback.
2806 **
2807 ** idxNum==1   PATH parameter only
2808 ** idxNum==2   Both PATH and DIR supplied
2809 */
fsdirFilter(sqlite3_vtab_cursor * cur,int idxNum,const char * idxStr,int argc,sqlite3_value ** argv)2810 static int fsdirFilter(
2811   sqlite3_vtab_cursor *cur,
2812   int idxNum, const char *idxStr,
2813   int argc, sqlite3_value **argv
2814 ){
2815   const char *zDir = 0;
2816   fsdir_cursor *pCur = (fsdir_cursor*)cur;
2817   (void)idxStr;
2818   fsdirResetCursor(pCur);
2819 
2820   if( idxNum==0 ){
2821     fsdirSetErrmsg(pCur, "table function fsdir requires an argument");
2822     return SQLITE_ERROR;
2823   }
2824 
2825   assert( argc==idxNum && (argc==1 || argc==2) );
2826   zDir = (const char*)sqlite3_value_text(argv[0]);
2827   if( zDir==0 ){
2828     fsdirSetErrmsg(pCur, "table function fsdir requires a non-NULL argument");
2829     return SQLITE_ERROR;
2830   }
2831   if( argc==2 ){
2832     pCur->zBase = (const char*)sqlite3_value_text(argv[1]);
2833   }
2834   if( pCur->zBase ){
2835     pCur->nBase = (int)strlen(pCur->zBase)+1;
2836     pCur->zPath = sqlite3_mprintf("%s/%s", pCur->zBase, zDir);
2837   }else{
2838     pCur->zPath = sqlite3_mprintf("%s", zDir);
2839   }
2840 
2841   if( pCur->zPath==0 ){
2842     return SQLITE_NOMEM;
2843   }
2844   if( fileLinkStat(pCur->zPath, &pCur->sStat) ){
2845     fsdirSetErrmsg(pCur, "cannot stat file: %s", pCur->zPath);
2846     return SQLITE_ERROR;
2847   }
2848 
2849   return SQLITE_OK;
2850 }
2851 
2852 /*
2853 ** SQLite will invoke this method one or more times while planning a query
2854 ** that uses the generate_series virtual table.  This routine needs to create
2855 ** a query plan for each invocation and compute an estimated cost for that
2856 ** plan.
2857 **
2858 ** In this implementation idxNum is used to represent the
2859 ** query plan.  idxStr is unused.
2860 **
2861 ** The query plan is represented by values of idxNum:
2862 **
2863 **  (1)  The path value is supplied by argv[0]
2864 **  (2)  Path is in argv[0] and dir is in argv[1]
2865 */
fsdirBestIndex(sqlite3_vtab * tab,sqlite3_index_info * pIdxInfo)2866 static int fsdirBestIndex(
2867   sqlite3_vtab *tab,
2868   sqlite3_index_info *pIdxInfo
2869 ){
2870   int i;                 /* Loop over constraints */
2871   int idxPath = -1;      /* Index in pIdxInfo->aConstraint of PATH= */
2872   int idxDir = -1;       /* Index in pIdxInfo->aConstraint of DIR= */
2873   int seenPath = 0;      /* True if an unusable PATH= constraint is seen */
2874   int seenDir = 0;       /* True if an unusable DIR= constraint is seen */
2875   const struct sqlite3_index_constraint *pConstraint;
2876 
2877   (void)tab;
2878   pConstraint = pIdxInfo->aConstraint;
2879   for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){
2880     if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue;
2881     switch( pConstraint->iColumn ){
2882       case FSDIR_COLUMN_PATH: {
2883         if( pConstraint->usable ){
2884           idxPath = i;
2885           seenPath = 0;
2886         }else if( idxPath<0 ){
2887           seenPath = 1;
2888         }
2889         break;
2890       }
2891       case FSDIR_COLUMN_DIR: {
2892         if( pConstraint->usable ){
2893           idxDir = i;
2894           seenDir = 0;
2895         }else if( idxDir<0 ){
2896           seenDir = 1;
2897         }
2898         break;
2899       }
2900     }
2901   }
2902   if( seenPath || seenDir ){
2903     /* If input parameters are unusable, disallow this plan */
2904     return SQLITE_CONSTRAINT;
2905   }
2906 
2907   if( idxPath<0 ){
2908     pIdxInfo->idxNum = 0;
2909     /* The pIdxInfo->estimatedCost should have been initialized to a huge
2910     ** number.  Leave it unchanged. */
2911     pIdxInfo->estimatedRows = 0x7fffffff;
2912   }else{
2913     pIdxInfo->aConstraintUsage[idxPath].omit = 1;
2914     pIdxInfo->aConstraintUsage[idxPath].argvIndex = 1;
2915     if( idxDir>=0 ){
2916       pIdxInfo->aConstraintUsage[idxDir].omit = 1;
2917       pIdxInfo->aConstraintUsage[idxDir].argvIndex = 2;
2918       pIdxInfo->idxNum = 2;
2919       pIdxInfo->estimatedCost = 10.0;
2920     }else{
2921       pIdxInfo->idxNum = 1;
2922       pIdxInfo->estimatedCost = 100.0;
2923     }
2924   }
2925 
2926   return SQLITE_OK;
2927 }
2928 
2929 /*
2930 ** Register the "fsdir" virtual table.
2931 */
fsdirRegister(sqlite3 * db)2932 static int fsdirRegister(sqlite3 *db){
2933   static sqlite3_module fsdirModule = {
2934     0,                         /* iVersion */
2935     0,                         /* xCreate */
2936     fsdirConnect,              /* xConnect */
2937     fsdirBestIndex,            /* xBestIndex */
2938     fsdirDisconnect,           /* xDisconnect */
2939     0,                         /* xDestroy */
2940     fsdirOpen,                 /* xOpen - open a cursor */
2941     fsdirClose,                /* xClose - close a cursor */
2942     fsdirFilter,               /* xFilter - configure scan constraints */
2943     fsdirNext,                 /* xNext - advance a cursor */
2944     fsdirEof,                  /* xEof - check for end of scan */
2945     fsdirColumn,               /* xColumn - read data */
2946     fsdirRowid,                /* xRowid - read data */
2947     0,                         /* xUpdate */
2948     0,                         /* xBegin */
2949     0,                         /* xSync */
2950     0,                         /* xCommit */
2951     0,                         /* xRollback */
2952     0,                         /* xFindMethod */
2953     0,                         /* xRename */
2954     0,                         /* xSavepoint */
2955     0,                         /* xRelease */
2956     0,                         /* xRollbackTo */
2957     0,                         /* xShadowName */
2958   };
2959 
2960   int rc = sqlite3_create_module(db, "fsdir", &fsdirModule, 0);
2961   return rc;
2962 }
2963 #else         /* SQLITE_OMIT_VIRTUALTABLE */
2964 # define fsdirRegister(x) SQLITE_OK
2965 #endif
2966 
2967 #ifdef _WIN32
2968 
2969 #endif
sqlite3_fileio_init(sqlite3 * db,char ** pzErrMsg,const sqlite3_api_routines * pApi)2970 static int sqlite3_fileio_init(
2971   sqlite3 *db,
2972   char **pzErrMsg,
2973   const sqlite3_api_routines *pApi
2974 ){
2975   int rc = SQLITE_OK;
2976   SQLITE_EXTENSION_INIT2(pApi);
2977   (void)pzErrMsg;  /* Unused parameter */
2978   rc = sqlite3_create_function(db, "readfile", 1, SQLITE_UTF8, 0,
2979                                readfileFunc, 0, 0);
2980   if( rc==SQLITE_OK ){
2981     rc = sqlite3_create_function(db, "writefile", -1, SQLITE_UTF8, 0,
2982                                  writefileFunc, 0, 0);
2983   }
2984   if( rc==SQLITE_OK ){
2985     rc = sqlite3_create_function(db, "lsmode", 1, SQLITE_UTF8, 0,
2986                                  lsModeFunc, 0, 0);
2987   }
2988   if( rc==SQLITE_OK ){
2989     rc = fsdirRegister(db);
2990   }
2991   return rc;
2992 }
2993 
2994 /************************* End ../ext/misc/fileio.c ********************/
2995 /************************* Begin ../ext/misc/completion.c ******************/
2996 /*
2997 ** 2017-07-10
2998 **
2999 ** The author disclaims copyright to this source code.  In place of
3000 ** a legal notice, here is a blessing:
3001 **
3002 **    May you do good and not evil.
3003 **    May you find forgiveness for yourself and forgive others.
3004 **    May you share freely, never taking more than you give.
3005 **
3006 *************************************************************************
3007 **
3008 ** This file implements an eponymous virtual table that returns suggested
3009 ** completions for a partial SQL input.
3010 **
3011 ** Suggested usage:
3012 **
3013 **     SELECT DISTINCT candidate COLLATE nocase
3014 **       FROM completion($prefix,$wholeline)
3015 **      ORDER BY 1;
3016 **
3017 ** The two query parameters are optional.  $prefix is the text of the
3018 ** current word being typed and that is to be completed.  $wholeline is
3019 ** the complete input line, used for context.
3020 **
3021 ** The raw completion() table might return the same candidate multiple
3022 ** times, for example if the same column name is used to two or more
3023 ** tables.  And the candidates are returned in an arbitrary order.  Hence,
3024 ** the DISTINCT and ORDER BY are recommended.
3025 **
3026 ** This virtual table operates at the speed of human typing, and so there
3027 ** is no attempt to make it fast.  Even a slow implementation will be much
3028 ** faster than any human can type.
3029 **
3030 */
3031 SQLITE_EXTENSION_INIT1
3032 #include <assert.h>
3033 #include <string.h>
3034 #include <ctype.h>
3035 
3036 #ifndef SQLITE_OMIT_VIRTUALTABLE
3037 
3038 /* completion_vtab is a subclass of sqlite3_vtab which will
3039 ** serve as the underlying representation of a completion virtual table
3040 */
3041 typedef struct completion_vtab completion_vtab;
3042 struct completion_vtab {
3043   sqlite3_vtab base;  /* Base class - must be first */
3044   sqlite3 *db;        /* Database connection for this completion vtab */
3045 };
3046 
3047 /* completion_cursor is a subclass of sqlite3_vtab_cursor which will
3048 ** serve as the underlying representation of a cursor that scans
3049 ** over rows of the result
3050 */
3051 typedef struct completion_cursor completion_cursor;
3052 struct completion_cursor {
3053   sqlite3_vtab_cursor base;  /* Base class - must be first */
3054   sqlite3 *db;               /* Database connection for this cursor */
3055   int nPrefix, nLine;        /* Number of bytes in zPrefix and zLine */
3056   char *zPrefix;             /* The prefix for the word we want to complete */
3057   char *zLine;               /* The whole that we want to complete */
3058   const char *zCurrentRow;   /* Current output row */
3059   int szRow;                 /* Length of the zCurrentRow string */
3060   sqlite3_stmt *pStmt;       /* Current statement */
3061   sqlite3_int64 iRowid;      /* The rowid */
3062   int ePhase;                /* Current phase */
3063   int j;                     /* inter-phase counter */
3064 };
3065 
3066 /* Values for ePhase:
3067 */
3068 #define COMPLETION_FIRST_PHASE   1
3069 #define COMPLETION_KEYWORDS      1
3070 #define COMPLETION_PRAGMAS       2
3071 #define COMPLETION_FUNCTIONS     3
3072 #define COMPLETION_COLLATIONS    4
3073 #define COMPLETION_INDEXES       5
3074 #define COMPLETION_TRIGGERS      6
3075 #define COMPLETION_DATABASES     7
3076 #define COMPLETION_TABLES        8    /* Also VIEWs and TRIGGERs */
3077 #define COMPLETION_COLUMNS       9
3078 #define COMPLETION_MODULES       10
3079 #define COMPLETION_EOF           11
3080 
3081 /*
3082 ** The completionConnect() method is invoked to create a new
3083 ** completion_vtab that describes the completion virtual table.
3084 **
3085 ** Think of this routine as the constructor for completion_vtab objects.
3086 **
3087 ** All this routine needs to do is:
3088 **
3089 **    (1) Allocate the completion_vtab object and initialize all fields.
3090 **
3091 **    (2) Tell SQLite (via the sqlite3_declare_vtab() interface) what the
3092 **        result set of queries against completion will look like.
3093 */
completionConnect(sqlite3 * db,void * pAux,int argc,const char * const * argv,sqlite3_vtab ** ppVtab,char ** pzErr)3094 static int completionConnect(
3095   sqlite3 *db,
3096   void *pAux,
3097   int argc, const char *const*argv,
3098   sqlite3_vtab **ppVtab,
3099   char **pzErr
3100 ){
3101   completion_vtab *pNew;
3102   int rc;
3103 
3104   (void)(pAux);    /* Unused parameter */
3105   (void)(argc);    /* Unused parameter */
3106   (void)(argv);    /* Unused parameter */
3107   (void)(pzErr);   /* Unused parameter */
3108 
3109 /* Column numbers */
3110 #define COMPLETION_COLUMN_CANDIDATE 0  /* Suggested completion of the input */
3111 #define COMPLETION_COLUMN_PREFIX    1  /* Prefix of the word to be completed */
3112 #define COMPLETION_COLUMN_WHOLELINE 2  /* Entire line seen so far */
3113 #define COMPLETION_COLUMN_PHASE     3  /* ePhase - used for debugging only */
3114 
3115   rc = sqlite3_declare_vtab(db,
3116       "CREATE TABLE x("
3117       "  candidate TEXT,"
3118       "  prefix TEXT HIDDEN,"
3119       "  wholeline TEXT HIDDEN,"
3120       "  phase INT HIDDEN"        /* Used for debugging only */
3121       ")");
3122   if( rc==SQLITE_OK ){
3123     pNew = sqlite3_malloc( sizeof(*pNew) );
3124     *ppVtab = (sqlite3_vtab*)pNew;
3125     if( pNew==0 ) return SQLITE_NOMEM;
3126     memset(pNew, 0, sizeof(*pNew));
3127     pNew->db = db;
3128   }
3129   return rc;
3130 }
3131 
3132 /*
3133 ** This method is the destructor for completion_cursor objects.
3134 */
completionDisconnect(sqlite3_vtab * pVtab)3135 static int completionDisconnect(sqlite3_vtab *pVtab){
3136   sqlite3_free(pVtab);
3137   return SQLITE_OK;
3138 }
3139 
3140 /*
3141 ** Constructor for a new completion_cursor object.
3142 */
completionOpen(sqlite3_vtab * p,sqlite3_vtab_cursor ** ppCursor)3143 static int completionOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){
3144   completion_cursor *pCur;
3145   pCur = sqlite3_malloc( sizeof(*pCur) );
3146   if( pCur==0 ) return SQLITE_NOMEM;
3147   memset(pCur, 0, sizeof(*pCur));
3148   pCur->db = ((completion_vtab*)p)->db;
3149   *ppCursor = &pCur->base;
3150   return SQLITE_OK;
3151 }
3152 
3153 /*
3154 ** Reset the completion_cursor.
3155 */
completionCursorReset(completion_cursor * pCur)3156 static void completionCursorReset(completion_cursor *pCur){
3157   sqlite3_free(pCur->zPrefix);   pCur->zPrefix = 0;  pCur->nPrefix = 0;
3158   sqlite3_free(pCur->zLine);     pCur->zLine = 0;    pCur->nLine = 0;
3159   sqlite3_finalize(pCur->pStmt); pCur->pStmt = 0;
3160   pCur->j = 0;
3161 }
3162 
3163 /*
3164 ** Destructor for a completion_cursor.
3165 */
completionClose(sqlite3_vtab_cursor * cur)3166 static int completionClose(sqlite3_vtab_cursor *cur){
3167   completionCursorReset((completion_cursor*)cur);
3168   sqlite3_free(cur);
3169   return SQLITE_OK;
3170 }
3171 
3172 /*
3173 ** Advance a completion_cursor to its next row of output.
3174 **
3175 ** The ->ePhase, ->j, and ->pStmt fields of the completion_cursor object
3176 ** record the current state of the scan.  This routine sets ->zCurrentRow
3177 ** to the current row of output and then returns.  If no more rows remain,
3178 ** then ->ePhase is set to COMPLETION_EOF which will signal the virtual
3179 ** table that has reached the end of its scan.
3180 **
3181 ** The current implementation just lists potential identifiers and
3182 ** keywords and filters them by zPrefix.  Future enhancements should
3183 ** take zLine into account to try to restrict the set of identifiers and
3184 ** keywords based on what would be legal at the current point of input.
3185 */
completionNext(sqlite3_vtab_cursor * cur)3186 static int completionNext(sqlite3_vtab_cursor *cur){
3187   completion_cursor *pCur = (completion_cursor*)cur;
3188   int eNextPhase = 0;  /* Next phase to try if current phase reaches end */
3189   int iCol = -1;       /* If >=0, step pCur->pStmt and use the i-th column */
3190   pCur->iRowid++;
3191   while( pCur->ePhase!=COMPLETION_EOF ){
3192     switch( pCur->ePhase ){
3193       case COMPLETION_KEYWORDS: {
3194         if( pCur->j >= sqlite3_keyword_count() ){
3195           pCur->zCurrentRow = 0;
3196           pCur->ePhase = COMPLETION_DATABASES;
3197         }else{
3198           sqlite3_keyword_name(pCur->j++, &pCur->zCurrentRow, &pCur->szRow);
3199         }
3200         iCol = -1;
3201         break;
3202       }
3203       case COMPLETION_DATABASES: {
3204         if( pCur->pStmt==0 ){
3205           sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1,
3206                              &pCur->pStmt, 0);
3207         }
3208         iCol = 1;
3209         eNextPhase = COMPLETION_TABLES;
3210         break;
3211       }
3212       case COMPLETION_TABLES: {
3213         if( pCur->pStmt==0 ){
3214           sqlite3_stmt *pS2;
3215           char *zSql = 0;
3216           const char *zSep = "";
3217           sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1, &pS2, 0);
3218           while( sqlite3_step(pS2)==SQLITE_ROW ){
3219             const char *zDb = (const char*)sqlite3_column_text(pS2, 1);
3220             zSql = sqlite3_mprintf(
3221                "%z%s"
3222                "SELECT name FROM \"%w\".sqlite_master",
3223                zSql, zSep, zDb
3224             );
3225             if( zSql==0 ) return SQLITE_NOMEM;
3226             zSep = " UNION ";
3227           }
3228           sqlite3_finalize(pS2);
3229           sqlite3_prepare_v2(pCur->db, zSql, -1, &pCur->pStmt, 0);
3230           sqlite3_free(zSql);
3231         }
3232         iCol = 0;
3233         eNextPhase = COMPLETION_COLUMNS;
3234         break;
3235       }
3236       case COMPLETION_COLUMNS: {
3237         if( pCur->pStmt==0 ){
3238           sqlite3_stmt *pS2;
3239           char *zSql = 0;
3240           const char *zSep = "";
3241           sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1, &pS2, 0);
3242           while( sqlite3_step(pS2)==SQLITE_ROW ){
3243             const char *zDb = (const char*)sqlite3_column_text(pS2, 1);
3244             zSql = sqlite3_mprintf(
3245                "%z%s"
3246                "SELECT pti.name FROM \"%w\".sqlite_master AS sm"
3247                        " JOIN pragma_table_info(sm.name,%Q) AS pti"
3248                " WHERE sm.type='table'",
3249                zSql, zSep, zDb, zDb
3250             );
3251             if( zSql==0 ) return SQLITE_NOMEM;
3252             zSep = " UNION ";
3253           }
3254           sqlite3_finalize(pS2);
3255           sqlite3_prepare_v2(pCur->db, zSql, -1, &pCur->pStmt, 0);
3256           sqlite3_free(zSql);
3257         }
3258         iCol = 0;
3259         eNextPhase = COMPLETION_EOF;
3260         break;
3261       }
3262     }
3263     if( iCol<0 ){
3264       /* This case is when the phase presets zCurrentRow */
3265       if( pCur->zCurrentRow==0 ) continue;
3266     }else{
3267       if( sqlite3_step(pCur->pStmt)==SQLITE_ROW ){
3268         /* Extract the next row of content */
3269         pCur->zCurrentRow = (const char*)sqlite3_column_text(pCur->pStmt, iCol);
3270         pCur->szRow = sqlite3_column_bytes(pCur->pStmt, iCol);
3271       }else{
3272         /* When all rows are finished, advance to the next phase */
3273         sqlite3_finalize(pCur->pStmt);
3274         pCur->pStmt = 0;
3275         pCur->ePhase = eNextPhase;
3276         continue;
3277       }
3278     }
3279     if( pCur->nPrefix==0 ) break;
3280     if( pCur->nPrefix<=pCur->szRow
3281      && sqlite3_strnicmp(pCur->zPrefix, pCur->zCurrentRow, pCur->nPrefix)==0
3282     ){
3283       break;
3284     }
3285   }
3286 
3287   return SQLITE_OK;
3288 }
3289 
3290 /*
3291 ** Return values of columns for the row at which the completion_cursor
3292 ** is currently pointing.
3293 */
completionColumn(sqlite3_vtab_cursor * cur,sqlite3_context * ctx,int i)3294 static int completionColumn(
3295   sqlite3_vtab_cursor *cur,   /* The cursor */
3296   sqlite3_context *ctx,       /* First argument to sqlite3_result_...() */
3297   int i                       /* Which column to return */
3298 ){
3299   completion_cursor *pCur = (completion_cursor*)cur;
3300   switch( i ){
3301     case COMPLETION_COLUMN_CANDIDATE: {
3302       sqlite3_result_text(ctx, pCur->zCurrentRow, pCur->szRow,SQLITE_TRANSIENT);
3303       break;
3304     }
3305     case COMPLETION_COLUMN_PREFIX: {
3306       sqlite3_result_text(ctx, pCur->zPrefix, -1, SQLITE_TRANSIENT);
3307       break;
3308     }
3309     case COMPLETION_COLUMN_WHOLELINE: {
3310       sqlite3_result_text(ctx, pCur->zLine, -1, SQLITE_TRANSIENT);
3311       break;
3312     }
3313     case COMPLETION_COLUMN_PHASE: {
3314       sqlite3_result_int(ctx, pCur->ePhase);
3315       break;
3316     }
3317   }
3318   return SQLITE_OK;
3319 }
3320 
3321 /*
3322 ** Return the rowid for the current row.  In this implementation, the
3323 ** rowid is the same as the output value.
3324 */
completionRowid(sqlite3_vtab_cursor * cur,sqlite_int64 * pRowid)3325 static int completionRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
3326   completion_cursor *pCur = (completion_cursor*)cur;
3327   *pRowid = pCur->iRowid;
3328   return SQLITE_OK;
3329 }
3330 
3331 /*
3332 ** Return TRUE if the cursor has been moved off of the last
3333 ** row of output.
3334 */
completionEof(sqlite3_vtab_cursor * cur)3335 static int completionEof(sqlite3_vtab_cursor *cur){
3336   completion_cursor *pCur = (completion_cursor*)cur;
3337   return pCur->ePhase >= COMPLETION_EOF;
3338 }
3339 
3340 /*
3341 ** This method is called to "rewind" the completion_cursor object back
3342 ** to the first row of output.  This method is always called at least
3343 ** once prior to any call to completionColumn() or completionRowid() or
3344 ** completionEof().
3345 */
completionFilter(sqlite3_vtab_cursor * pVtabCursor,int idxNum,const char * idxStr,int argc,sqlite3_value ** argv)3346 static int completionFilter(
3347   sqlite3_vtab_cursor *pVtabCursor,
3348   int idxNum, const char *idxStr,
3349   int argc, sqlite3_value **argv
3350 ){
3351   completion_cursor *pCur = (completion_cursor *)pVtabCursor;
3352   int iArg = 0;
3353   (void)(idxStr);   /* Unused parameter */
3354   (void)(argc);     /* Unused parameter */
3355   completionCursorReset(pCur);
3356   if( idxNum & 1 ){
3357     pCur->nPrefix = sqlite3_value_bytes(argv[iArg]);
3358     if( pCur->nPrefix>0 ){
3359       pCur->zPrefix = sqlite3_mprintf("%s", sqlite3_value_text(argv[iArg]));
3360       if( pCur->zPrefix==0 ) return SQLITE_NOMEM;
3361     }
3362     iArg = 1;
3363   }
3364   if( idxNum & 2 ){
3365     pCur->nLine = sqlite3_value_bytes(argv[iArg]);
3366     if( pCur->nLine>0 ){
3367       pCur->zLine = sqlite3_mprintf("%s", sqlite3_value_text(argv[iArg]));
3368       if( pCur->zLine==0 ) return SQLITE_NOMEM;
3369     }
3370   }
3371   if( pCur->zLine!=0 && pCur->zPrefix==0 ){
3372     int i = pCur->nLine;
3373     while( i>0 && (isalnum((unsigned char)pCur->zLine[i-1]) || pCur->zLine[i-1]=='_') ){
3374       i--;
3375     }
3376     pCur->nPrefix = pCur->nLine - i;
3377     if( pCur->nPrefix>0 ){
3378       pCur->zPrefix = sqlite3_mprintf("%.*s", pCur->nPrefix, pCur->zLine + i);
3379       if( pCur->zPrefix==0 ) return SQLITE_NOMEM;
3380     }
3381   }
3382   pCur->iRowid = 0;
3383   pCur->ePhase = COMPLETION_FIRST_PHASE;
3384   return completionNext(pVtabCursor);
3385 }
3386 
3387 /*
3388 ** SQLite will invoke this method one or more times while planning a query
3389 ** that uses the completion virtual table.  This routine needs to create
3390 ** a query plan for each invocation and compute an estimated cost for that
3391 ** plan.
3392 **
3393 ** There are two hidden parameters that act as arguments to the table-valued
3394 ** function:  "prefix" and "wholeline".  Bit 0 of idxNum is set if "prefix"
3395 ** is available and bit 1 is set if "wholeline" is available.
3396 */
completionBestIndex(sqlite3_vtab * tab,sqlite3_index_info * pIdxInfo)3397 static int completionBestIndex(
3398   sqlite3_vtab *tab,
3399   sqlite3_index_info *pIdxInfo
3400 ){
3401   int i;                 /* Loop over constraints */
3402   int idxNum = 0;        /* The query plan bitmask */
3403   int prefixIdx = -1;    /* Index of the start= constraint, or -1 if none */
3404   int wholelineIdx = -1; /* Index of the stop= constraint, or -1 if none */
3405   int nArg = 0;          /* Number of arguments that completeFilter() expects */
3406   const struct sqlite3_index_constraint *pConstraint;
3407 
3408   (void)(tab);    /* Unused parameter */
3409   pConstraint = pIdxInfo->aConstraint;
3410   for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){
3411     if( pConstraint->usable==0 ) continue;
3412     if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue;
3413     switch( pConstraint->iColumn ){
3414       case COMPLETION_COLUMN_PREFIX:
3415         prefixIdx = i;
3416         idxNum |= 1;
3417         break;
3418       case COMPLETION_COLUMN_WHOLELINE:
3419         wholelineIdx = i;
3420         idxNum |= 2;
3421         break;
3422     }
3423   }
3424   if( prefixIdx>=0 ){
3425     pIdxInfo->aConstraintUsage[prefixIdx].argvIndex = ++nArg;
3426     pIdxInfo->aConstraintUsage[prefixIdx].omit = 1;
3427   }
3428   if( wholelineIdx>=0 ){
3429     pIdxInfo->aConstraintUsage[wholelineIdx].argvIndex = ++nArg;
3430     pIdxInfo->aConstraintUsage[wholelineIdx].omit = 1;
3431   }
3432   pIdxInfo->idxNum = idxNum;
3433   pIdxInfo->estimatedCost = (double)5000 - 1000*nArg;
3434   pIdxInfo->estimatedRows = 500 - 100*nArg;
3435   return SQLITE_OK;
3436 }
3437 
3438 /*
3439 ** This following structure defines all the methods for the
3440 ** completion virtual table.
3441 */
3442 static sqlite3_module completionModule = {
3443   0,                         /* iVersion */
3444   0,                         /* xCreate */
3445   completionConnect,         /* xConnect */
3446   completionBestIndex,       /* xBestIndex */
3447   completionDisconnect,      /* xDisconnect */
3448   0,                         /* xDestroy */
3449   completionOpen,            /* xOpen - open a cursor */
3450   completionClose,           /* xClose - close a cursor */
3451   completionFilter,          /* xFilter - configure scan constraints */
3452   completionNext,            /* xNext - advance a cursor */
3453   completionEof,             /* xEof - check for end of scan */
3454   completionColumn,          /* xColumn - read data */
3455   completionRowid,           /* xRowid - read data */
3456   0,                         /* xUpdate */
3457   0,                         /* xBegin */
3458   0,                         /* xSync */
3459   0,                         /* xCommit */
3460   0,                         /* xRollback */
3461   0,                         /* xFindMethod */
3462   0,                         /* xRename */
3463   0,                         /* xSavepoint */
3464   0,                         /* xRelease */
3465   0,                         /* xRollbackTo */
3466   0                          /* xShadowName */
3467 };
3468 
3469 #endif /* SQLITE_OMIT_VIRTUALTABLE */
3470 
sqlite3CompletionVtabInit(sqlite3 * db)3471 static int sqlite3CompletionVtabInit(sqlite3 *db){
3472   int rc = SQLITE_OK;
3473 #ifndef SQLITE_OMIT_VIRTUALTABLE
3474   rc = sqlite3_create_module(db, "completion", &completionModule, 0);
3475 #endif
3476   return rc;
3477 }
3478 
3479 #ifdef _WIN32
3480 
3481 #endif
sqlite3_completion_init(sqlite3 * db,char ** pzErrMsg,const sqlite3_api_routines * pApi)3482 static int sqlite3_completion_init(
3483   sqlite3 *db,
3484   char **pzErrMsg,
3485   const sqlite3_api_routines *pApi
3486 ){
3487   int rc = SQLITE_OK;
3488   SQLITE_EXTENSION_INIT2(pApi);
3489   (void)(pzErrMsg);  /* Unused parameter */
3490 #ifndef SQLITE_OMIT_VIRTUALTABLE
3491   rc = sqlite3CompletionVtabInit(db);
3492 #endif
3493   return rc;
3494 }
3495 
3496 /************************* End ../ext/misc/completion.c ********************/
3497 /************************* Begin ../ext/misc/appendvfs.c ******************/
3498 /*
3499 ** 2017-10-20
3500 **
3501 ** The author disclaims copyright to this source code.  In place of
3502 ** a legal notice, here is a blessing:
3503 **
3504 **    May you do good and not evil.
3505 **    May you find forgiveness for yourself and forgive others.
3506 **    May you share freely, never taking more than you give.
3507 **
3508 ******************************************************************************
3509 **
3510 ** This file implements a VFS shim that allows an SQLite database to be
3511 ** appended onto the end of some other file, such as an executable.
3512 **
3513 ** A special record must appear at the end of the file that identifies the
3514 ** file as an appended database and provides an offset to page 1.  For
3515 ** best performance page 1 should be located at a disk page boundary, though
3516 ** that is not required.
3517 **
3518 ** When opening a database using this VFS, the connection might treat
3519 ** the file as an ordinary SQLite database, or it might treat is as a
3520 ** database appended onto some other file.  Here are the rules:
3521 **
3522 **  (1)  When opening a new empty file, that file is treated as an ordinary
3523 **       database.
3524 **
3525 **  (2)  When opening a file that begins with the standard SQLite prefix
3526 **       string "SQLite format 3", that file is treated as an ordinary
3527 **       database.
3528 **
3529 **  (3)  When opening a file that ends with the appendvfs trailer string
3530 **       "Start-Of-SQLite3-NNNNNNNN" that file is treated as an appended
3531 **       database.
3532 **
3533 **  (4)  If none of the above apply and the SQLITE_OPEN_CREATE flag is
3534 **       set, then a new database is appended to the already existing file.
3535 **
3536 **  (5)  Otherwise, SQLITE_CANTOPEN is returned.
3537 **
3538 ** To avoid unnecessary complications with the PENDING_BYTE, the size of
3539 ** the file containing the database is limited to 1GB.  This VFS will refuse
3540 ** to read or write past the 1GB mark.  This restriction might be lifted in
3541 ** future versions.  For now, if you need a large database, then keep the
3542 ** database in a separate file.
3543 **
3544 ** If the file being opened is not an appended database, then this shim is
3545 ** a pass-through into the default underlying VFS.
3546 **/
3547 SQLITE_EXTENSION_INIT1
3548 #include <string.h>
3549 #include <assert.h>
3550 
3551 /* The append mark at the end of the database is:
3552 **
3553 **     Start-Of-SQLite3-NNNNNNNN
3554 **     123456789 123456789 12345
3555 **
3556 ** The NNNNNNNN represents a 64-bit big-endian unsigned integer which is
3557 ** the offset to page 1.
3558 */
3559 #define APND_MARK_PREFIX     "Start-Of-SQLite3-"
3560 #define APND_MARK_PREFIX_SZ  17
3561 #define APND_MARK_SIZE       25
3562 
3563 /*
3564 ** Maximum size of the combined prefix + database + append-mark.  This
3565 ** must be less than 0x40000000 to avoid locking issues on Windows.
3566 */
3567 #define APND_MAX_SIZE  (65536*15259)
3568 
3569 /*
3570 ** Forward declaration of objects used by this utility
3571 */
3572 typedef struct sqlite3_vfs ApndVfs;
3573 typedef struct ApndFile ApndFile;
3574 
3575 /* Access to a lower-level VFS that (might) implement dynamic loading,
3576 ** access to randomness, etc.
3577 */
3578 #define ORIGVFS(p)  ((sqlite3_vfs*)((p)->pAppData))
3579 #define ORIGFILE(p) ((sqlite3_file*)(((ApndFile*)(p))+1))
3580 
3581 /* An open file */
3582 struct ApndFile {
3583   sqlite3_file base;              /* IO methods */
3584   sqlite3_int64 iPgOne;           /* File offset to page 1 */
3585   sqlite3_int64 iMark;            /* Start of the append-mark */
3586 };
3587 
3588 /*
3589 ** Methods for ApndFile
3590 */
3591 static int apndClose(sqlite3_file*);
3592 static int apndRead(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst);
3593 static int apndWrite(sqlite3_file*,const void*,int iAmt, sqlite3_int64 iOfst);
3594 static int apndTruncate(sqlite3_file*, sqlite3_int64 size);
3595 static int apndSync(sqlite3_file*, int flags);
3596 static int apndFileSize(sqlite3_file*, sqlite3_int64 *pSize);
3597 static int apndLock(sqlite3_file*, int);
3598 static int apndUnlock(sqlite3_file*, int);
3599 static int apndCheckReservedLock(sqlite3_file*, int *pResOut);
3600 static int apndFileControl(sqlite3_file*, int op, void *pArg);
3601 static int apndSectorSize(sqlite3_file*);
3602 static int apndDeviceCharacteristics(sqlite3_file*);
3603 static int apndShmMap(sqlite3_file*, int iPg, int pgsz, int, void volatile**);
3604 static int apndShmLock(sqlite3_file*, int offset, int n, int flags);
3605 static void apndShmBarrier(sqlite3_file*);
3606 static int apndShmUnmap(sqlite3_file*, int deleteFlag);
3607 static int apndFetch(sqlite3_file*, sqlite3_int64 iOfst, int iAmt, void **pp);
3608 static int apndUnfetch(sqlite3_file*, sqlite3_int64 iOfst, void *p);
3609 
3610 /*
3611 ** Methods for ApndVfs
3612 */
3613 static int apndOpen(sqlite3_vfs*, const char *, sqlite3_file*, int , int *);
3614 static int apndDelete(sqlite3_vfs*, const char *zName, int syncDir);
3615 static int apndAccess(sqlite3_vfs*, const char *zName, int flags, int *);
3616 static int apndFullPathname(sqlite3_vfs*, const char *zName, int, char *zOut);
3617 static void *apndDlOpen(sqlite3_vfs*, const char *zFilename);
3618 static void apndDlError(sqlite3_vfs*, int nByte, char *zErrMsg);
3619 static void (*apndDlSym(sqlite3_vfs *pVfs, void *p, const char*zSym))(void);
3620 static void apndDlClose(sqlite3_vfs*, void*);
3621 static int apndRandomness(sqlite3_vfs*, int nByte, char *zOut);
3622 static int apndSleep(sqlite3_vfs*, int microseconds);
3623 static int apndCurrentTime(sqlite3_vfs*, double*);
3624 static int apndGetLastError(sqlite3_vfs*, int, char *);
3625 static int apndCurrentTimeInt64(sqlite3_vfs*, sqlite3_int64*);
3626 static int apndSetSystemCall(sqlite3_vfs*, const char*,sqlite3_syscall_ptr);
3627 static sqlite3_syscall_ptr apndGetSystemCall(sqlite3_vfs*, const char *z);
3628 static const char *apndNextSystemCall(sqlite3_vfs*, const char *zName);
3629 
3630 static sqlite3_vfs apnd_vfs = {
3631   3,                            /* iVersion (set when registered) */
3632   0,                            /* szOsFile (set when registered) */
3633   1024,                         /* mxPathname */
3634   0,                            /* pNext */
3635   "apndvfs",                    /* zName */
3636   0,                            /* pAppData (set when registered) */
3637   apndOpen,                     /* xOpen */
3638   apndDelete,                   /* xDelete */
3639   apndAccess,                   /* xAccess */
3640   apndFullPathname,             /* xFullPathname */
3641   apndDlOpen,                   /* xDlOpen */
3642   apndDlError,                  /* xDlError */
3643   apndDlSym,                    /* xDlSym */
3644   apndDlClose,                  /* xDlClose */
3645   apndRandomness,               /* xRandomness */
3646   apndSleep,                    /* xSleep */
3647   apndCurrentTime,              /* xCurrentTime */
3648   apndGetLastError,             /* xGetLastError */
3649   apndCurrentTimeInt64,         /* xCurrentTimeInt64 */
3650   apndSetSystemCall,            /* xSetSystemCall */
3651   apndGetSystemCall,            /* xGetSystemCall */
3652   apndNextSystemCall            /* xNextSystemCall */
3653 };
3654 
3655 static const sqlite3_io_methods apnd_io_methods = {
3656   3,                              /* iVersion */
3657   apndClose,                      /* xClose */
3658   apndRead,                       /* xRead */
3659   apndWrite,                      /* xWrite */
3660   apndTruncate,                   /* xTruncate */
3661   apndSync,                       /* xSync */
3662   apndFileSize,                   /* xFileSize */
3663   apndLock,                       /* xLock */
3664   apndUnlock,                     /* xUnlock */
3665   apndCheckReservedLock,          /* xCheckReservedLock */
3666   apndFileControl,                /* xFileControl */
3667   apndSectorSize,                 /* xSectorSize */
3668   apndDeviceCharacteristics,      /* xDeviceCharacteristics */
3669   apndShmMap,                     /* xShmMap */
3670   apndShmLock,                    /* xShmLock */
3671   apndShmBarrier,                 /* xShmBarrier */
3672   apndShmUnmap,                   /* xShmUnmap */
3673   apndFetch,                      /* xFetch */
3674   apndUnfetch                     /* xUnfetch */
3675 };
3676 
3677 
3678 
3679 /*
3680 ** Close an apnd-file.
3681 */
apndClose(sqlite3_file * pFile)3682 static int apndClose(sqlite3_file *pFile){
3683   pFile = ORIGFILE(pFile);
3684   return pFile->pMethods->xClose(pFile);
3685 }
3686 
3687 /*
3688 ** Read data from an apnd-file.
3689 */
apndRead(sqlite3_file * pFile,void * zBuf,int iAmt,sqlite_int64 iOfst)3690 static int apndRead(
3691   sqlite3_file *pFile,
3692   void *zBuf,
3693   int iAmt,
3694   sqlite_int64 iOfst
3695 ){
3696   ApndFile *p = (ApndFile *)pFile;
3697   pFile = ORIGFILE(pFile);
3698   return pFile->pMethods->xRead(pFile, zBuf, iAmt, iOfst+p->iPgOne);
3699 }
3700 
3701 /*
3702 ** Add the append-mark onto the end of the file.
3703 */
apndWriteMark(ApndFile * p,sqlite3_file * pFile)3704 static int apndWriteMark(ApndFile *p, sqlite3_file *pFile){
3705   int i;
3706   unsigned char a[APND_MARK_SIZE];
3707   memcpy(a, APND_MARK_PREFIX, APND_MARK_PREFIX_SZ);
3708   for(i=0; i<8; i++){
3709     a[APND_MARK_PREFIX_SZ+i] = (p->iPgOne >> (56 - i*8)) & 0xff;
3710   }
3711   return pFile->pMethods->xWrite(pFile, a, APND_MARK_SIZE, p->iMark);
3712 }
3713 
3714 /*
3715 ** Write data to an apnd-file.
3716 */
apndWrite(sqlite3_file * pFile,const void * zBuf,int iAmt,sqlite_int64 iOfst)3717 static int apndWrite(
3718   sqlite3_file *pFile,
3719   const void *zBuf,
3720   int iAmt,
3721   sqlite_int64 iOfst
3722 ){
3723   int rc;
3724   ApndFile *p = (ApndFile *)pFile;
3725   pFile = ORIGFILE(pFile);
3726   if( iOfst+iAmt>=APND_MAX_SIZE ) return SQLITE_FULL;
3727   rc = pFile->pMethods->xWrite(pFile, zBuf, iAmt, iOfst+p->iPgOne);
3728   if( rc==SQLITE_OK &&  iOfst + iAmt + p->iPgOne > p->iMark ){
3729     sqlite3_int64 sz = 0;
3730     rc = pFile->pMethods->xFileSize(pFile, &sz);
3731     if( rc==SQLITE_OK ){
3732       p->iMark = sz - APND_MARK_SIZE;
3733       if( iOfst + iAmt + p->iPgOne > p->iMark ){
3734         p->iMark = p->iPgOne + iOfst + iAmt;
3735         rc = apndWriteMark(p, pFile);
3736       }
3737     }
3738   }
3739   return rc;
3740 }
3741 
3742 /*
3743 ** Truncate an apnd-file.
3744 */
apndTruncate(sqlite3_file * pFile,sqlite_int64 size)3745 static int apndTruncate(sqlite3_file *pFile, sqlite_int64 size){
3746   int rc;
3747   ApndFile *p = (ApndFile *)pFile;
3748   pFile = ORIGFILE(pFile);
3749   rc = pFile->pMethods->xTruncate(pFile, size+p->iPgOne+APND_MARK_SIZE);
3750   if( rc==SQLITE_OK ){
3751     p->iMark = p->iPgOne+size;
3752     rc = apndWriteMark(p, pFile);
3753   }
3754   return rc;
3755 }
3756 
3757 /*
3758 ** Sync an apnd-file.
3759 */
apndSync(sqlite3_file * pFile,int flags)3760 static int apndSync(sqlite3_file *pFile, int flags){
3761   pFile = ORIGFILE(pFile);
3762   return pFile->pMethods->xSync(pFile, flags);
3763 }
3764 
3765 /*
3766 ** Return the current file-size of an apnd-file.
3767 */
apndFileSize(sqlite3_file * pFile,sqlite_int64 * pSize)3768 static int apndFileSize(sqlite3_file *pFile, sqlite_int64 *pSize){
3769   ApndFile *p = (ApndFile *)pFile;
3770   int rc;
3771   pFile = ORIGFILE(p);
3772   rc = pFile->pMethods->xFileSize(pFile, pSize);
3773   if( rc==SQLITE_OK && p->iPgOne ){
3774     *pSize -= p->iPgOne + APND_MARK_SIZE;
3775   }
3776   return rc;
3777 }
3778 
3779 /*
3780 ** Lock an apnd-file.
3781 */
apndLock(sqlite3_file * pFile,int eLock)3782 static int apndLock(sqlite3_file *pFile, int eLock){
3783   pFile = ORIGFILE(pFile);
3784   return pFile->pMethods->xLock(pFile, eLock);
3785 }
3786 
3787 /*
3788 ** Unlock an apnd-file.
3789 */
apndUnlock(sqlite3_file * pFile,int eLock)3790 static int apndUnlock(sqlite3_file *pFile, int eLock){
3791   pFile = ORIGFILE(pFile);
3792   return pFile->pMethods->xUnlock(pFile, eLock);
3793 }
3794 
3795 /*
3796 ** Check if another file-handle holds a RESERVED lock on an apnd-file.
3797 */
apndCheckReservedLock(sqlite3_file * pFile,int * pResOut)3798 static int apndCheckReservedLock(sqlite3_file *pFile, int *pResOut){
3799   pFile = ORIGFILE(pFile);
3800   return pFile->pMethods->xCheckReservedLock(pFile, pResOut);
3801 }
3802 
3803 /*
3804 ** File control method. For custom operations on an apnd-file.
3805 */
apndFileControl(sqlite3_file * pFile,int op,void * pArg)3806 static int apndFileControl(sqlite3_file *pFile, int op, void *pArg){
3807   ApndFile *p = (ApndFile *)pFile;
3808   int rc;
3809   pFile = ORIGFILE(pFile);
3810   rc = pFile->pMethods->xFileControl(pFile, op, pArg);
3811   if( rc==SQLITE_OK && op==SQLITE_FCNTL_VFSNAME ){
3812     *(char**)pArg = sqlite3_mprintf("apnd(%lld)/%z", p->iPgOne, *(char**)pArg);
3813   }
3814   return rc;
3815 }
3816 
3817 /*
3818 ** Return the sector-size in bytes for an apnd-file.
3819 */
apndSectorSize(sqlite3_file * pFile)3820 static int apndSectorSize(sqlite3_file *pFile){
3821   pFile = ORIGFILE(pFile);
3822   return pFile->pMethods->xSectorSize(pFile);
3823 }
3824 
3825 /*
3826 ** Return the device characteristic flags supported by an apnd-file.
3827 */
apndDeviceCharacteristics(sqlite3_file * pFile)3828 static int apndDeviceCharacteristics(sqlite3_file *pFile){
3829   pFile = ORIGFILE(pFile);
3830   return pFile->pMethods->xDeviceCharacteristics(pFile);
3831 }
3832 
3833 /* Create a shared memory file mapping */
apndShmMap(sqlite3_file * pFile,int iPg,int pgsz,int bExtend,void volatile ** pp)3834 static int apndShmMap(
3835   sqlite3_file *pFile,
3836   int iPg,
3837   int pgsz,
3838   int bExtend,
3839   void volatile **pp
3840 ){
3841   pFile = ORIGFILE(pFile);
3842   return pFile->pMethods->xShmMap(pFile,iPg,pgsz,bExtend,pp);
3843 }
3844 
3845 /* Perform locking on a shared-memory segment */
apndShmLock(sqlite3_file * pFile,int offset,int n,int flags)3846 static int apndShmLock(sqlite3_file *pFile, int offset, int n, int flags){
3847   pFile = ORIGFILE(pFile);
3848   return pFile->pMethods->xShmLock(pFile,offset,n,flags);
3849 }
3850 
3851 /* Memory barrier operation on shared memory */
apndShmBarrier(sqlite3_file * pFile)3852 static void apndShmBarrier(sqlite3_file *pFile){
3853   pFile = ORIGFILE(pFile);
3854   pFile->pMethods->xShmBarrier(pFile);
3855 }
3856 
3857 /* Unmap a shared memory segment */
apndShmUnmap(sqlite3_file * pFile,int deleteFlag)3858 static int apndShmUnmap(sqlite3_file *pFile, int deleteFlag){
3859   pFile = ORIGFILE(pFile);
3860   return pFile->pMethods->xShmUnmap(pFile,deleteFlag);
3861 }
3862 
3863 /* Fetch a page of a memory-mapped file */
apndFetch(sqlite3_file * pFile,sqlite3_int64 iOfst,int iAmt,void ** pp)3864 static int apndFetch(
3865   sqlite3_file *pFile,
3866   sqlite3_int64 iOfst,
3867   int iAmt,
3868   void **pp
3869 ){
3870   ApndFile *p = (ApndFile *)pFile;
3871   pFile = ORIGFILE(pFile);
3872   return pFile->pMethods->xFetch(pFile, iOfst+p->iPgOne, iAmt, pp);
3873 }
3874 
3875 /* Release a memory-mapped page */
apndUnfetch(sqlite3_file * pFile,sqlite3_int64 iOfst,void * pPage)3876 static int apndUnfetch(sqlite3_file *pFile, sqlite3_int64 iOfst, void *pPage){
3877   ApndFile *p = (ApndFile *)pFile;
3878   pFile = ORIGFILE(pFile);
3879   return pFile->pMethods->xUnfetch(pFile, iOfst+p->iPgOne, pPage);
3880 }
3881 
3882 /*
3883 ** Check to see if the file is an ordinary SQLite database file.
3884 */
apndIsOrdinaryDatabaseFile(sqlite3_int64 sz,sqlite3_file * pFile)3885 static int apndIsOrdinaryDatabaseFile(sqlite3_int64 sz, sqlite3_file *pFile){
3886   int rc;
3887   char zHdr[16];
3888   static const char aSqliteHdr[] = "SQLite format 3";
3889   if( sz<512 ) return 0;
3890   rc = pFile->pMethods->xRead(pFile, zHdr, sizeof(zHdr), 0);
3891   if( rc ) return 0;
3892   return memcmp(zHdr, aSqliteHdr, sizeof(zHdr))==0;
3893 }
3894 
3895 /*
3896 ** Try to read the append-mark off the end of a file.  Return the
3897 ** start of the appended database if the append-mark is present.  If
3898 ** there is no append-mark, return -1;
3899 */
apndReadMark(sqlite3_int64 sz,sqlite3_file * pFile)3900 static sqlite3_int64 apndReadMark(sqlite3_int64 sz, sqlite3_file *pFile){
3901   int rc, i;
3902   sqlite3_int64 iMark;
3903   unsigned char a[APND_MARK_SIZE];
3904 
3905   if( sz<=APND_MARK_SIZE ) return -1;
3906   rc = pFile->pMethods->xRead(pFile, a, APND_MARK_SIZE, sz-APND_MARK_SIZE);
3907   if( rc ) return -1;
3908   if( memcmp(a, APND_MARK_PREFIX, APND_MARK_PREFIX_SZ)!=0 ) return -1;
3909   iMark = ((sqlite3_int64)(a[APND_MARK_PREFIX_SZ]&0x7f))<<56;
3910   for(i=1; i<8; i++){
3911     iMark += (sqlite3_int64)a[APND_MARK_PREFIX_SZ+i]<<(56-8*i);
3912   }
3913   return iMark;
3914 }
3915 
3916 /*
3917 ** Open an apnd file handle.
3918 */
apndOpen(sqlite3_vfs * pVfs,const char * zName,sqlite3_file * pFile,int flags,int * pOutFlags)3919 static int apndOpen(
3920   sqlite3_vfs *pVfs,
3921   const char *zName,
3922   sqlite3_file *pFile,
3923   int flags,
3924   int *pOutFlags
3925 ){
3926   ApndFile *p;
3927   sqlite3_file *pSubFile;
3928   sqlite3_vfs *pSubVfs;
3929   int rc;
3930   sqlite3_int64 sz;
3931   pSubVfs = ORIGVFS(pVfs);
3932   if( (flags & SQLITE_OPEN_MAIN_DB)==0 ){
3933     return pSubVfs->xOpen(pSubVfs, zName, pFile, flags, pOutFlags);
3934   }
3935   p = (ApndFile*)pFile;
3936   memset(p, 0, sizeof(*p));
3937   pSubFile = ORIGFILE(pFile);
3938   p->base.pMethods = &apnd_io_methods;
3939   rc = pSubVfs->xOpen(pSubVfs, zName, pSubFile, flags, pOutFlags);
3940   if( rc ) goto apnd_open_done;
3941   rc = pSubFile->pMethods->xFileSize(pSubFile, &sz);
3942   if( rc ){
3943     pSubFile->pMethods->xClose(pSubFile);
3944     goto apnd_open_done;
3945   }
3946   if( apndIsOrdinaryDatabaseFile(sz, pSubFile) ){
3947     memmove(pFile, pSubFile, pSubVfs->szOsFile);
3948     return SQLITE_OK;
3949   }
3950   p->iMark = 0;
3951   p->iPgOne = apndReadMark(sz, pFile);
3952   if( p->iPgOne>0 ){
3953     return SQLITE_OK;
3954   }
3955   if( (flags & SQLITE_OPEN_CREATE)==0 ){
3956     pSubFile->pMethods->xClose(pSubFile);
3957     rc = SQLITE_CANTOPEN;
3958   }
3959   p->iPgOne = (sz+0xfff) & ~(sqlite3_int64)0xfff;
3960 apnd_open_done:
3961   if( rc ) pFile->pMethods = 0;
3962   return rc;
3963 }
3964 
3965 /*
3966 ** All other VFS methods are pass-thrus.
3967 */
apndDelete(sqlite3_vfs * pVfs,const char * zPath,int dirSync)3968 static int apndDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){
3969   return ORIGVFS(pVfs)->xDelete(ORIGVFS(pVfs), zPath, dirSync);
3970 }
apndAccess(sqlite3_vfs * pVfs,const char * zPath,int flags,int * pResOut)3971 static int apndAccess(
3972   sqlite3_vfs *pVfs,
3973   const char *zPath,
3974   int flags,
3975   int *pResOut
3976 ){
3977   return ORIGVFS(pVfs)->xAccess(ORIGVFS(pVfs), zPath, flags, pResOut);
3978 }
apndFullPathname(sqlite3_vfs * pVfs,const char * zPath,int nOut,char * zOut)3979 static int apndFullPathname(
3980   sqlite3_vfs *pVfs,
3981   const char *zPath,
3982   int nOut,
3983   char *zOut
3984 ){
3985   return ORIGVFS(pVfs)->xFullPathname(ORIGVFS(pVfs),zPath,nOut,zOut);
3986 }
apndDlOpen(sqlite3_vfs * pVfs,const char * zPath)3987 static void *apndDlOpen(sqlite3_vfs *pVfs, const char *zPath){
3988   return ORIGVFS(pVfs)->xDlOpen(ORIGVFS(pVfs), zPath);
3989 }
apndDlError(sqlite3_vfs * pVfs,int nByte,char * zErrMsg)3990 static void apndDlError(sqlite3_vfs *pVfs, int nByte, char *zErrMsg){
3991   ORIGVFS(pVfs)->xDlError(ORIGVFS(pVfs), nByte, zErrMsg);
3992 }
apndDlSym(sqlite3_vfs * pVfs,void * p,const char * zSym)3993 static void (*apndDlSym(sqlite3_vfs *pVfs, void *p, const char *zSym))(void){
3994   return ORIGVFS(pVfs)->xDlSym(ORIGVFS(pVfs), p, zSym);
3995 }
apndDlClose(sqlite3_vfs * pVfs,void * pHandle)3996 static void apndDlClose(sqlite3_vfs *pVfs, void *pHandle){
3997   ORIGVFS(pVfs)->xDlClose(ORIGVFS(pVfs), pHandle);
3998 }
apndRandomness(sqlite3_vfs * pVfs,int nByte,char * zBufOut)3999 static int apndRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){
4000   return ORIGVFS(pVfs)->xRandomness(ORIGVFS(pVfs), nByte, zBufOut);
4001 }
apndSleep(sqlite3_vfs * pVfs,int nMicro)4002 static int apndSleep(sqlite3_vfs *pVfs, int nMicro){
4003   return ORIGVFS(pVfs)->xSleep(ORIGVFS(pVfs), nMicro);
4004 }
apndCurrentTime(sqlite3_vfs * pVfs,double * pTimeOut)4005 static int apndCurrentTime(sqlite3_vfs *pVfs, double *pTimeOut){
4006   return ORIGVFS(pVfs)->xCurrentTime(ORIGVFS(pVfs), pTimeOut);
4007 }
apndGetLastError(sqlite3_vfs * pVfs,int a,char * b)4008 static int apndGetLastError(sqlite3_vfs *pVfs, int a, char *b){
4009   return ORIGVFS(pVfs)->xGetLastError(ORIGVFS(pVfs), a, b);
4010 }
apndCurrentTimeInt64(sqlite3_vfs * pVfs,sqlite3_int64 * p)4011 static int apndCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *p){
4012   return ORIGVFS(pVfs)->xCurrentTimeInt64(ORIGVFS(pVfs), p);
4013 }
apndSetSystemCall(sqlite3_vfs * pVfs,const char * zName,sqlite3_syscall_ptr pCall)4014 static int apndSetSystemCall(
4015   sqlite3_vfs *pVfs,
4016   const char *zName,
4017   sqlite3_syscall_ptr pCall
4018 ){
4019   return ORIGVFS(pVfs)->xSetSystemCall(ORIGVFS(pVfs),zName,pCall);
4020 }
apndGetSystemCall(sqlite3_vfs * pVfs,const char * zName)4021 static sqlite3_syscall_ptr apndGetSystemCall(
4022   sqlite3_vfs *pVfs,
4023   const char *zName
4024 ){
4025   return ORIGVFS(pVfs)->xGetSystemCall(ORIGVFS(pVfs),zName);
4026 }
apndNextSystemCall(sqlite3_vfs * pVfs,const char * zName)4027 static const char *apndNextSystemCall(sqlite3_vfs *pVfs, const char *zName){
4028   return ORIGVFS(pVfs)->xNextSystemCall(ORIGVFS(pVfs), zName);
4029 }
4030 
4031 
4032 #ifdef _WIN32
4033 
4034 #endif
4035 /*
4036 ** This routine is called when the extension is loaded.
4037 ** Register the new VFS.
4038 */
sqlite3_appendvfs_init(sqlite3 * db,char ** pzErrMsg,const sqlite3_api_routines * pApi)4039 static int sqlite3_appendvfs_init(
4040   sqlite3 *db,
4041   char **pzErrMsg,
4042   const sqlite3_api_routines *pApi
4043 ){
4044   int rc = SQLITE_OK;
4045   sqlite3_vfs *pOrig;
4046   SQLITE_EXTENSION_INIT2(pApi);
4047   (void)pzErrMsg;
4048   (void)db;
4049   pOrig = sqlite3_vfs_find(0);
4050   apnd_vfs.iVersion = pOrig->iVersion;
4051   apnd_vfs.pAppData = pOrig;
4052   apnd_vfs.szOsFile = pOrig->szOsFile + sizeof(ApndFile);
4053   rc = sqlite3_vfs_register(&apnd_vfs, 0);
4054 #ifdef APPENDVFS_TEST
4055   if( rc==SQLITE_OK ){
4056     rc = sqlite3_auto_extension((void(*)(void))apndvfsRegister);
4057   }
4058 #endif
4059   if( rc==SQLITE_OK ) rc = SQLITE_OK_LOAD_PERMANENTLY;
4060   return rc;
4061 }
4062 
4063 /************************* End ../ext/misc/appendvfs.c ********************/
4064 #ifdef SQLITE_HAVE_ZLIB
4065 /************************* Begin ../ext/misc/zipfile.c ******************/
4066 /*
4067 ** 2017-12-26
4068 **
4069 ** The author disclaims copyright to this source code.  In place of
4070 ** a legal notice, here is a blessing:
4071 **
4072 **    May you do good and not evil.
4073 **    May you find forgiveness for yourself and forgive others.
4074 **    May you share freely, never taking more than you give.
4075 **
4076 ******************************************************************************
4077 **
4078 ** This file implements a virtual table for reading and writing ZIP archive
4079 ** files.
4080 **
4081 ** Usage example:
4082 **
4083 **     SELECT name, sz, datetime(mtime,'unixepoch') FROM zipfile($filename);
4084 **
4085 ** Current limitations:
4086 **
4087 **    *  No support for encryption
4088 **    *  No support for ZIP archives spanning multiple files
4089 **    *  No support for zip64 extensions
4090 **    *  Only the "inflate/deflate" (zlib) compression method is supported
4091 */
4092 SQLITE_EXTENSION_INIT1
4093 #include <stdio.h>
4094 #include <string.h>
4095 #include <assert.h>
4096 
4097 #include <zlib.h>
4098 
4099 #ifndef SQLITE_OMIT_VIRTUALTABLE
4100 
4101 #ifndef SQLITE_AMALGAMATION
4102 
4103 /* typedef sqlite3_int64 i64; */
4104 /* typedef unsigned char u8; */
4105 typedef unsigned short u16;
4106 typedef unsigned long u32;
4107 #define MIN(a,b) ((a)<(b) ? (a) : (b))
4108 
4109 #if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST)
4110 # define ALWAYS(X)      (1)
4111 # define NEVER(X)       (0)
4112 #elif !defined(NDEBUG)
4113 # define ALWAYS(X)      ((X)?1:(assert(0),0))
4114 # define NEVER(X)       ((X)?(assert(0),1):0)
4115 #else
4116 # define ALWAYS(X)      (X)
4117 # define NEVER(X)       (X)
4118 #endif
4119 
4120 #endif   /* SQLITE_AMALGAMATION */
4121 
4122 /*
4123 ** Definitions for mode bitmasks S_IFDIR, S_IFREG and S_IFLNK.
4124 **
4125 ** In some ways it would be better to obtain these values from system
4126 ** header files. But, the dependency is undesirable and (a) these
4127 ** have been stable for decades, (b) the values are part of POSIX and
4128 ** are also made explicit in [man stat], and (c) are part of the
4129 ** file format for zip archives.
4130 */
4131 #ifndef S_IFDIR
4132 # define S_IFDIR 0040000
4133 #endif
4134 #ifndef S_IFREG
4135 # define S_IFREG 0100000
4136 #endif
4137 #ifndef S_IFLNK
4138 # define S_IFLNK 0120000
4139 #endif
4140 
4141 static const char ZIPFILE_SCHEMA[] =
4142   "CREATE TABLE y("
4143     "name PRIMARY KEY,"  /* 0: Name of file in zip archive */
4144     "mode,"              /* 1: POSIX mode for file */
4145     "mtime,"             /* 2: Last modification time (secs since 1970)*/
4146     "sz,"                /* 3: Size of object */
4147     "rawdata,"           /* 4: Raw data */
4148     "data,"              /* 5: Uncompressed data */
4149     "method,"            /* 6: Compression method (integer) */
4150     "z HIDDEN"           /* 7: Name of zip file */
4151   ") WITHOUT ROWID;";
4152 
4153 #define ZIPFILE_F_COLUMN_IDX 7    /* Index of column "file" in the above */
4154 #define ZIPFILE_BUFFER_SIZE (64*1024)
4155 
4156 
4157 /*
4158 ** Magic numbers used to read and write zip files.
4159 **
4160 ** ZIPFILE_NEWENTRY_MADEBY:
4161 **   Use this value for the "version-made-by" field in new zip file
4162 **   entries. The upper byte indicates "unix", and the lower byte
4163 **   indicates that the zip file matches pkzip specification 3.0.
4164 **   This is what info-zip seems to do.
4165 **
4166 ** ZIPFILE_NEWENTRY_REQUIRED:
4167 **   Value for "version-required-to-extract" field of new entries.
4168 **   Version 2.0 is required to support folders and deflate compression.
4169 **
4170 ** ZIPFILE_NEWENTRY_FLAGS:
4171 **   Value for "general-purpose-bit-flags" field of new entries. Bit
4172 **   11 means "utf-8 filename and comment".
4173 **
4174 ** ZIPFILE_SIGNATURE_CDS:
4175 **   First 4 bytes of a valid CDS record.
4176 **
4177 ** ZIPFILE_SIGNATURE_LFH:
4178 **   First 4 bytes of a valid LFH record.
4179 **
4180 ** ZIPFILE_SIGNATURE_EOCD
4181 **   First 4 bytes of a valid EOCD record.
4182 */
4183 #define ZIPFILE_EXTRA_TIMESTAMP   0x5455
4184 #define ZIPFILE_NEWENTRY_MADEBY   ((3<<8) + 30)
4185 #define ZIPFILE_NEWENTRY_REQUIRED 20
4186 #define ZIPFILE_NEWENTRY_FLAGS    0x800
4187 #define ZIPFILE_SIGNATURE_CDS     0x02014b50
4188 #define ZIPFILE_SIGNATURE_LFH     0x04034b50
4189 #define ZIPFILE_SIGNATURE_EOCD    0x06054b50
4190 
4191 /*
4192 ** The sizes of the fixed-size part of each of the three main data
4193 ** structures in a zip archive.
4194 */
4195 #define ZIPFILE_LFH_FIXED_SZ      30
4196 #define ZIPFILE_EOCD_FIXED_SZ     22
4197 #define ZIPFILE_CDS_FIXED_SZ      46
4198 
4199 /*
4200 *** 4.3.16  End of central directory record:
4201 ***
4202 ***   end of central dir signature    4 bytes  (0x06054b50)
4203 ***   number of this disk             2 bytes
4204 ***   number of the disk with the
4205 ***   start of the central directory  2 bytes
4206 ***   total number of entries in the
4207 ***   central directory on this disk  2 bytes
4208 ***   total number of entries in
4209 ***   the central directory           2 bytes
4210 ***   size of the central directory   4 bytes
4211 ***   offset of start of central
4212 ***   directory with respect to
4213 ***   the starting disk number        4 bytes
4214 ***   .ZIP file comment length        2 bytes
4215 ***   .ZIP file comment       (variable size)
4216 */
4217 typedef struct ZipfileEOCD ZipfileEOCD;
4218 struct ZipfileEOCD {
4219   u16 iDisk;
4220   u16 iFirstDisk;
4221   u16 nEntry;
4222   u16 nEntryTotal;
4223   u32 nSize;
4224   u32 iOffset;
4225 };
4226 
4227 /*
4228 *** 4.3.12  Central directory structure:
4229 ***
4230 *** ...
4231 ***
4232 ***   central file header signature   4 bytes  (0x02014b50)
4233 ***   version made by                 2 bytes
4234 ***   version needed to extract       2 bytes
4235 ***   general purpose bit flag        2 bytes
4236 ***   compression method              2 bytes
4237 ***   last mod file time              2 bytes
4238 ***   last mod file date              2 bytes
4239 ***   crc-32                          4 bytes
4240 ***   compressed size                 4 bytes
4241 ***   uncompressed size               4 bytes
4242 ***   file name length                2 bytes
4243 ***   extra field length              2 bytes
4244 ***   file comment length             2 bytes
4245 ***   disk number start               2 bytes
4246 ***   internal file attributes        2 bytes
4247 ***   external file attributes        4 bytes
4248 ***   relative offset of local header 4 bytes
4249 */
4250 typedef struct ZipfileCDS ZipfileCDS;
4251 struct ZipfileCDS {
4252   u16 iVersionMadeBy;
4253   u16 iVersionExtract;
4254   u16 flags;
4255   u16 iCompression;
4256   u16 mTime;
4257   u16 mDate;
4258   u32 crc32;
4259   u32 szCompressed;
4260   u32 szUncompressed;
4261   u16 nFile;
4262   u16 nExtra;
4263   u16 nComment;
4264   u16 iDiskStart;
4265   u16 iInternalAttr;
4266   u32 iExternalAttr;
4267   u32 iOffset;
4268   char *zFile;                    /* Filename (sqlite3_malloc()) */
4269 };
4270 
4271 /*
4272 *** 4.3.7  Local file header:
4273 ***
4274 ***   local file header signature     4 bytes  (0x04034b50)
4275 ***   version needed to extract       2 bytes
4276 ***   general purpose bit flag        2 bytes
4277 ***   compression method              2 bytes
4278 ***   last mod file time              2 bytes
4279 ***   last mod file date              2 bytes
4280 ***   crc-32                          4 bytes
4281 ***   compressed size                 4 bytes
4282 ***   uncompressed size               4 bytes
4283 ***   file name length                2 bytes
4284 ***   extra field length              2 bytes
4285 ***
4286 */
4287 typedef struct ZipfileLFH ZipfileLFH;
4288 struct ZipfileLFH {
4289   u16 iVersionExtract;
4290   u16 flags;
4291   u16 iCompression;
4292   u16 mTime;
4293   u16 mDate;
4294   u32 crc32;
4295   u32 szCompressed;
4296   u32 szUncompressed;
4297   u16 nFile;
4298   u16 nExtra;
4299 };
4300 
4301 typedef struct ZipfileEntry ZipfileEntry;
4302 struct ZipfileEntry {
4303   ZipfileCDS cds;            /* Parsed CDS record */
4304   u32 mUnixTime;             /* Modification time, in UNIX format */
4305   u8 *aExtra;                /* cds.nExtra+cds.nComment bytes of extra data */
4306   i64 iDataOff;              /* Offset to data in file (if aData==0) */
4307   u8 *aData;                 /* cds.szCompressed bytes of compressed data */
4308   ZipfileEntry *pNext;       /* Next element in in-memory CDS */
4309 };
4310 
4311 /*
4312 ** Cursor type for zipfile tables.
4313 */
4314 typedef struct ZipfileCsr ZipfileCsr;
4315 struct ZipfileCsr {
4316   sqlite3_vtab_cursor base;  /* Base class - must be first */
4317   i64 iId;                   /* Cursor ID */
4318   u8 bEof;                   /* True when at EOF */
4319   u8 bNoop;                  /* If next xNext() call is no-op */
4320 
4321   /* Used outside of write transactions */
4322   FILE *pFile;               /* Zip file */
4323   i64 iNextOff;              /* Offset of next record in central directory */
4324   ZipfileEOCD eocd;          /* Parse of central directory record */
4325 
4326   ZipfileEntry *pFreeEntry;  /* Free this list when cursor is closed or reset */
4327   ZipfileEntry *pCurrent;    /* Current entry */
4328   ZipfileCsr *pCsrNext;      /* Next cursor on same virtual table */
4329 };
4330 
4331 typedef struct ZipfileTab ZipfileTab;
4332 struct ZipfileTab {
4333   sqlite3_vtab base;         /* Base class - must be first */
4334   char *zFile;               /* Zip file this table accesses (may be NULL) */
4335   sqlite3 *db;               /* Host database connection */
4336   u8 *aBuffer;               /* Temporary buffer used for various tasks */
4337 
4338   ZipfileCsr *pCsrList;      /* List of cursors */
4339   i64 iNextCsrid;
4340 
4341   /* The following are used by write transactions only */
4342   ZipfileEntry *pFirstEntry; /* Linked list of all files (if pWriteFd!=0) */
4343   ZipfileEntry *pLastEntry;  /* Last element in pFirstEntry list */
4344   FILE *pWriteFd;            /* File handle open on zip archive */
4345   i64 szCurrent;             /* Current size of zip archive */
4346   i64 szOrig;                /* Size of archive at start of transaction */
4347 };
4348 
4349 /*
4350 ** Set the error message contained in context ctx to the results of
4351 ** vprintf(zFmt, ...).
4352 */
zipfileCtxErrorMsg(sqlite3_context * ctx,const char * zFmt,...)4353 static void zipfileCtxErrorMsg(sqlite3_context *ctx, const char *zFmt, ...){
4354   char *zMsg = 0;
4355   va_list ap;
4356   va_start(ap, zFmt);
4357   zMsg = sqlite3_vmprintf(zFmt, ap);
4358   sqlite3_result_error(ctx, zMsg, -1);
4359   sqlite3_free(zMsg);
4360   va_end(ap);
4361 }
4362 
4363 /*
4364 ** If string zIn is quoted, dequote it in place. Otherwise, if the string
4365 ** is not quoted, do nothing.
4366 */
zipfileDequote(char * zIn)4367 static void zipfileDequote(char *zIn){
4368   char q = zIn[0];
4369   if( q=='"' || q=='\'' || q=='`' || q=='[' ){
4370     int iIn = 1;
4371     int iOut = 0;
4372     if( q=='[' ) q = ']';
4373     while( ALWAYS(zIn[iIn]) ){
4374       char c = zIn[iIn++];
4375       if( c==q && zIn[iIn++]!=q ) break;
4376       zIn[iOut++] = c;
4377     }
4378     zIn[iOut] = '\0';
4379   }
4380 }
4381 
4382 /*
4383 ** Construct a new ZipfileTab virtual table object.
4384 **
4385 **   argv[0]   -> module name  ("zipfile")
4386 **   argv[1]   -> database name
4387 **   argv[2]   -> table name
4388 **   argv[...] -> "column name" and other module argument fields.
4389 */
zipfileConnect(sqlite3 * db,void * pAux,int argc,const char * const * argv,sqlite3_vtab ** ppVtab,char ** pzErr)4390 static int zipfileConnect(
4391   sqlite3 *db,
4392   void *pAux,
4393   int argc, const char *const*argv,
4394   sqlite3_vtab **ppVtab,
4395   char **pzErr
4396 ){
4397   int nByte = sizeof(ZipfileTab) + ZIPFILE_BUFFER_SIZE;
4398   int nFile = 0;
4399   const char *zFile = 0;
4400   ZipfileTab *pNew = 0;
4401   int rc;
4402 
4403   /* If the table name is not "zipfile", require that the argument be
4404   ** specified. This stops zipfile tables from being created as:
4405   **
4406   **   CREATE VIRTUAL TABLE zzz USING zipfile();
4407   **
4408   ** It does not prevent:
4409   **
4410   **   CREATE VIRTUAL TABLE zipfile USING zipfile();
4411   */
4412   assert( 0==sqlite3_stricmp(argv[0], "zipfile") );
4413   if( (0!=sqlite3_stricmp(argv[2], "zipfile") && argc<4) || argc>4 ){
4414     *pzErr = sqlite3_mprintf("zipfile constructor requires one argument");
4415     return SQLITE_ERROR;
4416   }
4417 
4418   if( argc>3 ){
4419     zFile = argv[3];
4420     nFile = (int)strlen(zFile)+1;
4421   }
4422 
4423   rc = sqlite3_declare_vtab(db, ZIPFILE_SCHEMA);
4424   if( rc==SQLITE_OK ){
4425     pNew = (ZipfileTab*)sqlite3_malloc(nByte+nFile);
4426     if( pNew==0 ) return SQLITE_NOMEM;
4427     memset(pNew, 0, nByte+nFile);
4428     pNew->db = db;
4429     pNew->aBuffer = (u8*)&pNew[1];
4430     if( zFile ){
4431       pNew->zFile = (char*)&pNew->aBuffer[ZIPFILE_BUFFER_SIZE];
4432       memcpy(pNew->zFile, zFile, nFile);
4433       zipfileDequote(pNew->zFile);
4434     }
4435   }
4436   *ppVtab = (sqlite3_vtab*)pNew;
4437   return rc;
4438 }
4439 
4440 /*
4441 ** Free the ZipfileEntry structure indicated by the only argument.
4442 */
zipfileEntryFree(ZipfileEntry * p)4443 static void zipfileEntryFree(ZipfileEntry *p){
4444   if( p ){
4445     sqlite3_free(p->cds.zFile);
4446     sqlite3_free(p);
4447   }
4448 }
4449 
4450 /*
4451 ** Release resources that should be freed at the end of a write
4452 ** transaction.
4453 */
zipfileCleanupTransaction(ZipfileTab * pTab)4454 static void zipfileCleanupTransaction(ZipfileTab *pTab){
4455   ZipfileEntry *pEntry;
4456   ZipfileEntry *pNext;
4457 
4458   if( pTab->pWriteFd ){
4459     fclose(pTab->pWriteFd);
4460     pTab->pWriteFd = 0;
4461   }
4462   for(pEntry=pTab->pFirstEntry; pEntry; pEntry=pNext){
4463     pNext = pEntry->pNext;
4464     zipfileEntryFree(pEntry);
4465   }
4466   pTab->pFirstEntry = 0;
4467   pTab->pLastEntry = 0;
4468   pTab->szCurrent = 0;
4469   pTab->szOrig = 0;
4470 }
4471 
4472 /*
4473 ** This method is the destructor for zipfile vtab objects.
4474 */
zipfileDisconnect(sqlite3_vtab * pVtab)4475 static int zipfileDisconnect(sqlite3_vtab *pVtab){
4476   zipfileCleanupTransaction((ZipfileTab*)pVtab);
4477   sqlite3_free(pVtab);
4478   return SQLITE_OK;
4479 }
4480 
4481 /*
4482 ** Constructor for a new ZipfileCsr object.
4483 */
zipfileOpen(sqlite3_vtab * p,sqlite3_vtab_cursor ** ppCsr)4484 static int zipfileOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCsr){
4485   ZipfileTab *pTab = (ZipfileTab*)p;
4486   ZipfileCsr *pCsr;
4487   pCsr = sqlite3_malloc(sizeof(*pCsr));
4488   *ppCsr = (sqlite3_vtab_cursor*)pCsr;
4489   if( pCsr==0 ){
4490     return SQLITE_NOMEM;
4491   }
4492   memset(pCsr, 0, sizeof(*pCsr));
4493   pCsr->iId = ++pTab->iNextCsrid;
4494   pCsr->pCsrNext = pTab->pCsrList;
4495   pTab->pCsrList = pCsr;
4496   return SQLITE_OK;
4497 }
4498 
4499 /*
4500 ** Reset a cursor back to the state it was in when first returned
4501 ** by zipfileOpen().
4502 */
zipfileResetCursor(ZipfileCsr * pCsr)4503 static void zipfileResetCursor(ZipfileCsr *pCsr){
4504   ZipfileEntry *p;
4505   ZipfileEntry *pNext;
4506 
4507   pCsr->bEof = 0;
4508   if( pCsr->pFile ){
4509     fclose(pCsr->pFile);
4510     pCsr->pFile = 0;
4511     zipfileEntryFree(pCsr->pCurrent);
4512     pCsr->pCurrent = 0;
4513   }
4514 
4515   for(p=pCsr->pFreeEntry; p; p=pNext){
4516     pNext = p->pNext;
4517     zipfileEntryFree(p);
4518   }
4519 }
4520 
4521 /*
4522 ** Destructor for an ZipfileCsr.
4523 */
zipfileClose(sqlite3_vtab_cursor * cur)4524 static int zipfileClose(sqlite3_vtab_cursor *cur){
4525   ZipfileCsr *pCsr = (ZipfileCsr*)cur;
4526   ZipfileTab *pTab = (ZipfileTab*)(pCsr->base.pVtab);
4527   ZipfileCsr **pp;
4528   zipfileResetCursor(pCsr);
4529 
4530   /* Remove this cursor from the ZipfileTab.pCsrList list. */
4531   for(pp=&pTab->pCsrList; *pp!=pCsr; pp=&((*pp)->pCsrNext));
4532   *pp = pCsr->pCsrNext;
4533 
4534   sqlite3_free(pCsr);
4535   return SQLITE_OK;
4536 }
4537 
4538 /*
4539 ** Set the error message for the virtual table associated with cursor
4540 ** pCsr to the results of vprintf(zFmt, ...).
4541 */
zipfileTableErr(ZipfileTab * pTab,const char * zFmt,...)4542 static void zipfileTableErr(ZipfileTab *pTab, const char *zFmt, ...){
4543   va_list ap;
4544   va_start(ap, zFmt);
4545   sqlite3_free(pTab->base.zErrMsg);
4546   pTab->base.zErrMsg = sqlite3_vmprintf(zFmt, ap);
4547   va_end(ap);
4548 }
zipfileCursorErr(ZipfileCsr * pCsr,const char * zFmt,...)4549 static void zipfileCursorErr(ZipfileCsr *pCsr, const char *zFmt, ...){
4550   va_list ap;
4551   va_start(ap, zFmt);
4552   sqlite3_free(pCsr->base.pVtab->zErrMsg);
4553   pCsr->base.pVtab->zErrMsg = sqlite3_vmprintf(zFmt, ap);
4554   va_end(ap);
4555 }
4556 
4557 /*
4558 ** Read nRead bytes of data from offset iOff of file pFile into buffer
4559 ** aRead[]. Return SQLITE_OK if successful, or an SQLite error code
4560 ** otherwise.
4561 **
4562 ** If an error does occur, output variable (*pzErrmsg) may be set to point
4563 ** to an English language error message. It is the responsibility of the
4564 ** caller to eventually free this buffer using
4565 ** sqlite3_free().
4566 */
zipfileReadData(FILE * pFile,u8 * aRead,int nRead,i64 iOff,char ** pzErrmsg)4567 static int zipfileReadData(
4568   FILE *pFile,                    /* Read from this file */
4569   u8 *aRead,                      /* Read into this buffer */
4570   int nRead,                      /* Number of bytes to read */
4571   i64 iOff,                       /* Offset to read from */
4572   char **pzErrmsg                 /* OUT: Error message (from sqlite3_malloc) */
4573 ){
4574   size_t n;
4575   fseek(pFile, (long)iOff, SEEK_SET);
4576   n = fread(aRead, 1, nRead, pFile);
4577   if( (int)n!=nRead ){
4578     *pzErrmsg = sqlite3_mprintf("error in fread()");
4579     return SQLITE_ERROR;
4580   }
4581   return SQLITE_OK;
4582 }
4583 
zipfileAppendData(ZipfileTab * pTab,const u8 * aWrite,int nWrite)4584 static int zipfileAppendData(
4585   ZipfileTab *pTab,
4586   const u8 *aWrite,
4587   int nWrite
4588 ){
4589   size_t n;
4590   fseek(pTab->pWriteFd, (long)pTab->szCurrent, SEEK_SET);
4591   n = fwrite(aWrite, 1, nWrite, pTab->pWriteFd);
4592   if( (int)n!=nWrite ){
4593     pTab->base.zErrMsg = sqlite3_mprintf("error in fwrite()");
4594     return SQLITE_ERROR;
4595   }
4596   pTab->szCurrent += nWrite;
4597   return SQLITE_OK;
4598 }
4599 
4600 /*
4601 ** Read and return a 16-bit little-endian unsigned integer from buffer aBuf.
4602 */
zipfileGetU16(const u8 * aBuf)4603 static u16 zipfileGetU16(const u8 *aBuf){
4604   return (aBuf[1] << 8) + aBuf[0];
4605 }
4606 
4607 /*
4608 ** Read and return a 32-bit little-endian unsigned integer from buffer aBuf.
4609 */
zipfileGetU32(const u8 * aBuf)4610 static u32 zipfileGetU32(const u8 *aBuf){
4611   return ((u32)(aBuf[3]) << 24)
4612        + ((u32)(aBuf[2]) << 16)
4613        + ((u32)(aBuf[1]) <<  8)
4614        + ((u32)(aBuf[0]) <<  0);
4615 }
4616 
4617 /*
4618 ** Write a 16-bit little endiate integer into buffer aBuf.
4619 */
zipfilePutU16(u8 * aBuf,u16 val)4620 static void zipfilePutU16(u8 *aBuf, u16 val){
4621   aBuf[0] = val & 0xFF;
4622   aBuf[1] = (val>>8) & 0xFF;
4623 }
4624 
4625 /*
4626 ** Write a 32-bit little endiate integer into buffer aBuf.
4627 */
zipfilePutU32(u8 * aBuf,u32 val)4628 static void zipfilePutU32(u8 *aBuf, u32 val){
4629   aBuf[0] = val & 0xFF;
4630   aBuf[1] = (val>>8) & 0xFF;
4631   aBuf[2] = (val>>16) & 0xFF;
4632   aBuf[3] = (val>>24) & 0xFF;
4633 }
4634 
4635 #define zipfileRead32(aBuf) ( aBuf+=4, zipfileGetU32(aBuf-4) )
4636 #define zipfileRead16(aBuf) ( aBuf+=2, zipfileGetU16(aBuf-2) )
4637 
4638 #define zipfileWrite32(aBuf,val) { zipfilePutU32(aBuf,val); aBuf+=4; }
4639 #define zipfileWrite16(aBuf,val) { zipfilePutU16(aBuf,val); aBuf+=2; }
4640 
4641 /*
4642 ** Magic numbers used to read CDS records.
4643 */
4644 #define ZIPFILE_CDS_NFILE_OFF        28
4645 #define ZIPFILE_CDS_SZCOMPRESSED_OFF 20
4646 
4647 /*
4648 ** Decode the CDS record in buffer aBuf into (*pCDS). Return SQLITE_ERROR
4649 ** if the record is not well-formed, or SQLITE_OK otherwise.
4650 */
zipfileReadCDS(u8 * aBuf,ZipfileCDS * pCDS)4651 static int zipfileReadCDS(u8 *aBuf, ZipfileCDS *pCDS){
4652   u8 *aRead = aBuf;
4653   u32 sig = zipfileRead32(aRead);
4654   int rc = SQLITE_OK;
4655   if( sig!=ZIPFILE_SIGNATURE_CDS ){
4656     rc = SQLITE_ERROR;
4657   }else{
4658     pCDS->iVersionMadeBy = zipfileRead16(aRead);
4659     pCDS->iVersionExtract = zipfileRead16(aRead);
4660     pCDS->flags = zipfileRead16(aRead);
4661     pCDS->iCompression = zipfileRead16(aRead);
4662     pCDS->mTime = zipfileRead16(aRead);
4663     pCDS->mDate = zipfileRead16(aRead);
4664     pCDS->crc32 = zipfileRead32(aRead);
4665     pCDS->szCompressed = zipfileRead32(aRead);
4666     pCDS->szUncompressed = zipfileRead32(aRead);
4667     assert( aRead==&aBuf[ZIPFILE_CDS_NFILE_OFF] );
4668     pCDS->nFile = zipfileRead16(aRead);
4669     pCDS->nExtra = zipfileRead16(aRead);
4670     pCDS->nComment = zipfileRead16(aRead);
4671     pCDS->iDiskStart = zipfileRead16(aRead);
4672     pCDS->iInternalAttr = zipfileRead16(aRead);
4673     pCDS->iExternalAttr = zipfileRead32(aRead);
4674     pCDS->iOffset = zipfileRead32(aRead);
4675     assert( aRead==&aBuf[ZIPFILE_CDS_FIXED_SZ] );
4676   }
4677 
4678   return rc;
4679 }
4680 
4681 /*
4682 ** Decode the LFH record in buffer aBuf into (*pLFH). Return SQLITE_ERROR
4683 ** if the record is not well-formed, or SQLITE_OK otherwise.
4684 */
zipfileReadLFH(u8 * aBuffer,ZipfileLFH * pLFH)4685 static int zipfileReadLFH(
4686   u8 *aBuffer,
4687   ZipfileLFH *pLFH
4688 ){
4689   u8 *aRead = aBuffer;
4690   int rc = SQLITE_OK;
4691 
4692   u32 sig = zipfileRead32(aRead);
4693   if( sig!=ZIPFILE_SIGNATURE_LFH ){
4694     rc = SQLITE_ERROR;
4695   }else{
4696     pLFH->iVersionExtract = zipfileRead16(aRead);
4697     pLFH->flags = zipfileRead16(aRead);
4698     pLFH->iCompression = zipfileRead16(aRead);
4699     pLFH->mTime = zipfileRead16(aRead);
4700     pLFH->mDate = zipfileRead16(aRead);
4701     pLFH->crc32 = zipfileRead32(aRead);
4702     pLFH->szCompressed = zipfileRead32(aRead);
4703     pLFH->szUncompressed = zipfileRead32(aRead);
4704     pLFH->nFile = zipfileRead16(aRead);
4705     pLFH->nExtra = zipfileRead16(aRead);
4706   }
4707   return rc;
4708 }
4709 
4710 
4711 /*
4712 ** Buffer aExtra (size nExtra bytes) contains zip archive "extra" fields.
4713 ** Scan through this buffer to find an "extra-timestamp" field. If one
4714 ** exists, extract the 32-bit modification-timestamp from it and store
4715 ** the value in output parameter *pmTime.
4716 **
4717 ** Zero is returned if no extra-timestamp record could be found (and so
4718 ** *pmTime is left unchanged), or non-zero otherwise.
4719 **
4720 ** The general format of an extra field is:
4721 **
4722 **   Header ID    2 bytes
4723 **   Data Size    2 bytes
4724 **   Data         N bytes
4725 */
zipfileScanExtra(u8 * aExtra,int nExtra,u32 * pmTime)4726 static int zipfileScanExtra(u8 *aExtra, int nExtra, u32 *pmTime){
4727   int ret = 0;
4728   u8 *p = aExtra;
4729   u8 *pEnd = &aExtra[nExtra];
4730 
4731   while( p<pEnd ){
4732     u16 id = zipfileRead16(p);
4733     u16 nByte = zipfileRead16(p);
4734 
4735     switch( id ){
4736       case ZIPFILE_EXTRA_TIMESTAMP: {
4737         u8 b = p[0];
4738         if( b & 0x01 ){     /* 0x01 -> modtime is present */
4739           *pmTime = zipfileGetU32(&p[1]);
4740           ret = 1;
4741         }
4742         break;
4743       }
4744     }
4745 
4746     p += nByte;
4747   }
4748   return ret;
4749 }
4750 
4751 /*
4752 ** Convert the standard MS-DOS timestamp stored in the mTime and mDate
4753 ** fields of the CDS structure passed as the only argument to a 32-bit
4754 ** UNIX seconds-since-the-epoch timestamp. Return the result.
4755 **
4756 ** "Standard" MS-DOS time format:
4757 **
4758 **   File modification time:
4759 **     Bits 00-04: seconds divided by 2
4760 **     Bits 05-10: minute
4761 **     Bits 11-15: hour
4762 **   File modification date:
4763 **     Bits 00-04: day
4764 **     Bits 05-08: month (1-12)
4765 **     Bits 09-15: years from 1980
4766 **
4767 ** https://msdn.microsoft.com/en-us/library/9kkf9tah.aspx
4768 */
zipfileMtime(ZipfileCDS * pCDS)4769 static u32 zipfileMtime(ZipfileCDS *pCDS){
4770   int Y = (1980 + ((pCDS->mDate >> 9) & 0x7F));
4771   int M = ((pCDS->mDate >> 5) & 0x0F);
4772   int D = (pCDS->mDate & 0x1F);
4773   int B = -13;
4774 
4775   int sec = (pCDS->mTime & 0x1F)*2;
4776   int min = (pCDS->mTime >> 5) & 0x3F;
4777   int hr = (pCDS->mTime >> 11) & 0x1F;
4778   i64 JD;
4779 
4780   /* JD = INT(365.25 * (Y+4716)) + INT(30.6001 * (M+1)) + D + B - 1524.5 */
4781 
4782   /* Calculate the JD in seconds for noon on the day in question */
4783   if( M<3 ){
4784     Y = Y-1;
4785     M = M+12;
4786   }
4787   JD = (i64)(24*60*60) * (
4788       (int)(365.25 * (Y + 4716))
4789     + (int)(30.6001 * (M + 1))
4790     + D + B - 1524
4791   );
4792 
4793   /* Correct the JD for the time within the day */
4794   JD += (hr-12) * 3600 + min * 60 + sec;
4795 
4796   /* Convert JD to unix timestamp (the JD epoch is 2440587.5) */
4797   return (u32)(JD - (i64)(24405875) * 24*60*6);
4798 }
4799 
4800 /*
4801 ** The opposite of zipfileMtime(). This function populates the mTime and
4802 ** mDate fields of the CDS structure passed as the first argument according
4803 ** to the UNIX timestamp value passed as the second.
4804 */
zipfileMtimeToDos(ZipfileCDS * pCds,u32 mUnixTime)4805 static void zipfileMtimeToDos(ZipfileCDS *pCds, u32 mUnixTime){
4806   /* Convert unix timestamp to JD (2440588 is noon on 1/1/1970) */
4807   i64 JD = (i64)2440588 + mUnixTime / (24*60*60);
4808 
4809   int A, B, C, D, E;
4810   int yr, mon, day;
4811   int hr, min, sec;
4812 
4813   A = (int)((JD - 1867216.25)/36524.25);
4814   A = (int)(JD + 1 + A - (A/4));
4815   B = A + 1524;
4816   C = (int)((B - 122.1)/365.25);
4817   D = (36525*(C&32767))/100;
4818   E = (int)((B-D)/30.6001);
4819 
4820   day = B - D - (int)(30.6001*E);
4821   mon = (E<14 ? E-1 : E-13);
4822   yr = mon>2 ? C-4716 : C-4715;
4823 
4824   hr = (mUnixTime % (24*60*60)) / (60*60);
4825   min = (mUnixTime % (60*60)) / 60;
4826   sec = (mUnixTime % 60);
4827 
4828   if( yr>=1980 ){
4829     pCds->mDate = (u16)(day + (mon << 5) + ((yr-1980) << 9));
4830     pCds->mTime = (u16)(sec/2 + (min<<5) + (hr<<11));
4831   }else{
4832     pCds->mDate = pCds->mTime = 0;
4833   }
4834 
4835   assert( mUnixTime<315507600
4836        || mUnixTime==zipfileMtime(pCds)
4837        || ((mUnixTime % 2) && mUnixTime-1==zipfileMtime(pCds))
4838        /* || (mUnixTime % 2) */
4839   );
4840 }
4841 
4842 /*
4843 ** If aBlob is not NULL, then it is a pointer to a buffer (nBlob bytes in
4844 ** size) containing an entire zip archive image. Or, if aBlob is NULL,
4845 ** then pFile is a file-handle open on a zip file. In either case, this
4846 ** function creates a ZipfileEntry object based on the zip archive entry
4847 ** for which the CDS record is at offset iOff.
4848 **
4849 ** If successful, SQLITE_OK is returned and (*ppEntry) set to point to
4850 ** the new object. Otherwise, an SQLite error code is returned and the
4851 ** final value of (*ppEntry) undefined.
4852 */
zipfileGetEntry(ZipfileTab * pTab,const u8 * aBlob,int nBlob,FILE * pFile,i64 iOff,ZipfileEntry ** ppEntry)4853 static int zipfileGetEntry(
4854   ZipfileTab *pTab,               /* Store any error message here */
4855   const u8 *aBlob,                /* Pointer to in-memory file image */
4856   int nBlob,                      /* Size of aBlob[] in bytes */
4857   FILE *pFile,                    /* If aBlob==0, read from this file */
4858   i64 iOff,                       /* Offset of CDS record */
4859   ZipfileEntry **ppEntry          /* OUT: Pointer to new object */
4860 ){
4861   u8 *aRead;
4862   char **pzErr = &pTab->base.zErrMsg;
4863   int rc = SQLITE_OK;
4864 
4865   if( aBlob==0 ){
4866     aRead = pTab->aBuffer;
4867     rc = zipfileReadData(pFile, aRead, ZIPFILE_CDS_FIXED_SZ, iOff, pzErr);
4868   }else{
4869     aRead = (u8*)&aBlob[iOff];
4870   }
4871 
4872   if( rc==SQLITE_OK ){
4873     int nAlloc;
4874     ZipfileEntry *pNew;
4875 
4876     int nFile = zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF]);
4877     int nExtra = zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF+2]);
4878     nExtra += zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF+4]);
4879 
4880     nAlloc = sizeof(ZipfileEntry) + nExtra;
4881     if( aBlob ){
4882       nAlloc += zipfileGetU32(&aRead[ZIPFILE_CDS_SZCOMPRESSED_OFF]);
4883     }
4884 
4885     pNew = (ZipfileEntry*)sqlite3_malloc(nAlloc);
4886     if( pNew==0 ){
4887       rc = SQLITE_NOMEM;
4888     }else{
4889       memset(pNew, 0, sizeof(ZipfileEntry));
4890       rc = zipfileReadCDS(aRead, &pNew->cds);
4891       if( rc!=SQLITE_OK ){
4892         *pzErr = sqlite3_mprintf("failed to read CDS at offset %lld", iOff);
4893       }else if( aBlob==0 ){
4894         rc = zipfileReadData(
4895             pFile, aRead, nExtra+nFile, iOff+ZIPFILE_CDS_FIXED_SZ, pzErr
4896         );
4897       }else{
4898         aRead = (u8*)&aBlob[iOff + ZIPFILE_CDS_FIXED_SZ];
4899       }
4900     }
4901 
4902     if( rc==SQLITE_OK ){
4903       u32 *pt = &pNew->mUnixTime;
4904       pNew->cds.zFile = sqlite3_mprintf("%.*s", nFile, aRead);
4905       pNew->aExtra = (u8*)&pNew[1];
4906       memcpy(pNew->aExtra, &aRead[nFile], nExtra);
4907       if( pNew->cds.zFile==0 ){
4908         rc = SQLITE_NOMEM;
4909       }else if( 0==zipfileScanExtra(&aRead[nFile], pNew->cds.nExtra, pt) ){
4910         pNew->mUnixTime = zipfileMtime(&pNew->cds);
4911       }
4912     }
4913 
4914     if( rc==SQLITE_OK ){
4915       static const int szFix = ZIPFILE_LFH_FIXED_SZ;
4916       ZipfileLFH lfh;
4917       if( pFile ){
4918         rc = zipfileReadData(pFile, aRead, szFix, pNew->cds.iOffset, pzErr);
4919       }else{
4920         aRead = (u8*)&aBlob[pNew->cds.iOffset];
4921       }
4922 
4923       rc = zipfileReadLFH(aRead, &lfh);
4924       if( rc==SQLITE_OK ){
4925         pNew->iDataOff =  pNew->cds.iOffset + ZIPFILE_LFH_FIXED_SZ;
4926         pNew->iDataOff += lfh.nFile + lfh.nExtra;
4927         if( aBlob && pNew->cds.szCompressed ){
4928           pNew->aData = &pNew->aExtra[nExtra];
4929           memcpy(pNew->aData, &aBlob[pNew->iDataOff], pNew->cds.szCompressed);
4930         }
4931       }else{
4932         *pzErr = sqlite3_mprintf("failed to read LFH at offset %d",
4933             (int)pNew->cds.iOffset
4934         );
4935       }
4936     }
4937 
4938     if( rc!=SQLITE_OK ){
4939       zipfileEntryFree(pNew);
4940     }else{
4941       *ppEntry = pNew;
4942     }
4943   }
4944 
4945   return rc;
4946 }
4947 
4948 /*
4949 ** Advance an ZipfileCsr to its next row of output.
4950 */
zipfileNext(sqlite3_vtab_cursor * cur)4951 static int zipfileNext(sqlite3_vtab_cursor *cur){
4952   ZipfileCsr *pCsr = (ZipfileCsr*)cur;
4953   int rc = SQLITE_OK;
4954 
4955   if( pCsr->pFile ){
4956     i64 iEof = pCsr->eocd.iOffset + pCsr->eocd.nSize;
4957     zipfileEntryFree(pCsr->pCurrent);
4958     pCsr->pCurrent = 0;
4959     if( pCsr->iNextOff>=iEof ){
4960       pCsr->bEof = 1;
4961     }else{
4962       ZipfileEntry *p = 0;
4963       ZipfileTab *pTab = (ZipfileTab*)(cur->pVtab);
4964       rc = zipfileGetEntry(pTab, 0, 0, pCsr->pFile, pCsr->iNextOff, &p);
4965       if( rc==SQLITE_OK ){
4966         pCsr->iNextOff += ZIPFILE_CDS_FIXED_SZ;
4967         pCsr->iNextOff += (int)p->cds.nExtra + p->cds.nFile + p->cds.nComment;
4968       }
4969       pCsr->pCurrent = p;
4970     }
4971   }else{
4972     if( !pCsr->bNoop ){
4973       pCsr->pCurrent = pCsr->pCurrent->pNext;
4974     }
4975     if( pCsr->pCurrent==0 ){
4976       pCsr->bEof = 1;
4977     }
4978   }
4979 
4980   pCsr->bNoop = 0;
4981   return rc;
4982 }
4983 
zipfileFree(void * p)4984 static void zipfileFree(void *p) {
4985   sqlite3_free(p);
4986 }
4987 
4988 /*
4989 ** Buffer aIn (size nIn bytes) contains compressed data. Uncompressed, the
4990 ** size is nOut bytes. This function uncompresses the data and sets the
4991 ** return value in context pCtx to the result (a blob).
4992 **
4993 ** If an error occurs, an error code is left in pCtx instead.
4994 */
zipfileInflate(sqlite3_context * pCtx,const u8 * aIn,int nIn,int nOut)4995 static void zipfileInflate(
4996   sqlite3_context *pCtx,          /* Store result here */
4997   const u8 *aIn,                  /* Compressed data */
4998   int nIn,                        /* Size of buffer aIn[] in bytes */
4999   int nOut                        /* Expected output size */
5000 ){
5001   u8 *aRes = sqlite3_malloc(nOut);
5002   if( aRes==0 ){
5003     sqlite3_result_error_nomem(pCtx);
5004   }else{
5005     int err;
5006     z_stream str;
5007     memset(&str, 0, sizeof(str));
5008 
5009     str.next_in = (Byte*)aIn;
5010     str.avail_in = nIn;
5011     str.next_out = (Byte*)aRes;
5012     str.avail_out = nOut;
5013 
5014     err = inflateInit2(&str, -15);
5015     if( err!=Z_OK ){
5016       zipfileCtxErrorMsg(pCtx, "inflateInit2() failed (%d)", err);
5017     }else{
5018       err = inflate(&str, Z_NO_FLUSH);
5019       if( err!=Z_STREAM_END ){
5020         zipfileCtxErrorMsg(pCtx, "inflate() failed (%d)", err);
5021       }else{
5022         sqlite3_result_blob(pCtx, aRes, nOut, zipfileFree);
5023         aRes = 0;
5024       }
5025     }
5026     sqlite3_free(aRes);
5027     inflateEnd(&str);
5028   }
5029 }
5030 
5031 /*
5032 ** Buffer aIn (size nIn bytes) contains uncompressed data. This function
5033 ** compresses it and sets (*ppOut) to point to a buffer containing the
5034 ** compressed data. The caller is responsible for eventually calling
5035 ** sqlite3_free() to release buffer (*ppOut). Before returning, (*pnOut)
5036 ** is set to the size of buffer (*ppOut) in bytes.
5037 **
5038 ** If no error occurs, SQLITE_OK is returned. Otherwise, an SQLite error
5039 ** code is returned and an error message left in virtual-table handle
5040 ** pTab. The values of (*ppOut) and (*pnOut) are left unchanged in this
5041 ** case.
5042 */
zipfileDeflate(const u8 * aIn,int nIn,u8 ** ppOut,int * pnOut,char ** pzErr)5043 static int zipfileDeflate(
5044   const u8 *aIn, int nIn,         /* Input */
5045   u8 **ppOut, int *pnOut,         /* Output */
5046   char **pzErr                    /* OUT: Error message */
5047 ){
5048   int nAlloc = (int)compressBound(nIn);
5049   u8 *aOut;
5050   int rc = SQLITE_OK;
5051 
5052   aOut = (u8*)sqlite3_malloc(nAlloc);
5053   if( aOut==0 ){
5054     rc = SQLITE_NOMEM;
5055   }else{
5056     int res;
5057     z_stream str;
5058     memset(&str, 0, sizeof(str));
5059     str.next_in = (Bytef*)aIn;
5060     str.avail_in = nIn;
5061     str.next_out = aOut;
5062     str.avail_out = nAlloc;
5063 
5064     deflateInit2(&str, 9, Z_DEFLATED, -15, 8, Z_DEFAULT_STRATEGY);
5065     res = deflate(&str, Z_FINISH);
5066 
5067     if( res==Z_STREAM_END ){
5068       *ppOut = aOut;
5069       *pnOut = (int)str.total_out;
5070     }else{
5071       sqlite3_free(aOut);
5072       *pzErr = sqlite3_mprintf("zipfile: deflate() error");
5073       rc = SQLITE_ERROR;
5074     }
5075     deflateEnd(&str);
5076   }
5077 
5078   return rc;
5079 }
5080 
5081 
5082 /*
5083 ** Return values of columns for the row at which the series_cursor
5084 ** is currently pointing.
5085 */
zipfileColumn(sqlite3_vtab_cursor * cur,sqlite3_context * ctx,int i)5086 static int zipfileColumn(
5087   sqlite3_vtab_cursor *cur,   /* The cursor */
5088   sqlite3_context *ctx,       /* First argument to sqlite3_result_...() */
5089   int i                       /* Which column to return */
5090 ){
5091   ZipfileCsr *pCsr = (ZipfileCsr*)cur;
5092   ZipfileCDS *pCDS = &pCsr->pCurrent->cds;
5093   int rc = SQLITE_OK;
5094   switch( i ){
5095     case 0:   /* name */
5096       sqlite3_result_text(ctx, pCDS->zFile, -1, SQLITE_TRANSIENT);
5097       break;
5098     case 1:   /* mode */
5099       /* TODO: Whether or not the following is correct surely depends on
5100       ** the platform on which the archive was created.  */
5101       sqlite3_result_int(ctx, pCDS->iExternalAttr >> 16);
5102       break;
5103     case 2: { /* mtime */
5104       sqlite3_result_int64(ctx, pCsr->pCurrent->mUnixTime);
5105       break;
5106     }
5107     case 3: { /* sz */
5108       if( sqlite3_vtab_nochange(ctx)==0 ){
5109         sqlite3_result_int64(ctx, pCDS->szUncompressed);
5110       }
5111       break;
5112     }
5113     case 4:   /* rawdata */
5114       if( sqlite3_vtab_nochange(ctx) ) break;
5115     case 5: { /* data */
5116       if( i==4 || pCDS->iCompression==0 || pCDS->iCompression==8 ){
5117         int sz = pCDS->szCompressed;
5118         int szFinal = pCDS->szUncompressed;
5119         if( szFinal>0 ){
5120           u8 *aBuf;
5121           u8 *aFree = 0;
5122           if( pCsr->pCurrent->aData ){
5123             aBuf = pCsr->pCurrent->aData;
5124           }else{
5125             aBuf = aFree = sqlite3_malloc(sz);
5126             if( aBuf==0 ){
5127               rc = SQLITE_NOMEM;
5128             }else{
5129               FILE *pFile = pCsr->pFile;
5130               if( pFile==0 ){
5131                 pFile = ((ZipfileTab*)(pCsr->base.pVtab))->pWriteFd;
5132               }
5133               rc = zipfileReadData(pFile, aBuf, sz, pCsr->pCurrent->iDataOff,
5134                   &pCsr->base.pVtab->zErrMsg
5135               );
5136             }
5137           }
5138           if( rc==SQLITE_OK ){
5139             if( i==5 && pCDS->iCompression ){
5140               zipfileInflate(ctx, aBuf, sz, szFinal);
5141             }else{
5142               sqlite3_result_blob(ctx, aBuf, sz, SQLITE_TRANSIENT);
5143             }
5144           }
5145           sqlite3_free(aFree);
5146         }else{
5147           /* Figure out if this is a directory or a zero-sized file. Consider
5148           ** it to be a directory either if the mode suggests so, or if
5149           ** the final character in the name is '/'.  */
5150           u32 mode = pCDS->iExternalAttr >> 16;
5151           if( !(mode & S_IFDIR) && pCDS->zFile[pCDS->nFile-1]!='/' ){
5152             sqlite3_result_blob(ctx, "", 0, SQLITE_STATIC);
5153           }
5154         }
5155       }
5156       break;
5157     }
5158     case 6:   /* method */
5159       sqlite3_result_int(ctx, pCDS->iCompression);
5160       break;
5161     default:  /* z */
5162       assert( i==7 );
5163       sqlite3_result_int64(ctx, pCsr->iId);
5164       break;
5165   }
5166 
5167   return rc;
5168 }
5169 
5170 /*
5171 ** Return TRUE if the cursor is at EOF.
5172 */
zipfileEof(sqlite3_vtab_cursor * cur)5173 static int zipfileEof(sqlite3_vtab_cursor *cur){
5174   ZipfileCsr *pCsr = (ZipfileCsr*)cur;
5175   return pCsr->bEof;
5176 }
5177 
5178 /*
5179 ** If aBlob is not NULL, then it points to a buffer nBlob bytes in size
5180 ** containing an entire zip archive image. Or, if aBlob is NULL, then pFile
5181 ** is guaranteed to be a file-handle open on a zip file.
5182 **
5183 ** This function attempts to locate the EOCD record within the zip archive
5184 ** and populate *pEOCD with the results of decoding it. SQLITE_OK is
5185 ** returned if successful. Otherwise, an SQLite error code is returned and
5186 ** an English language error message may be left in virtual-table pTab.
5187 */
zipfileReadEOCD(ZipfileTab * pTab,const u8 * aBlob,int nBlob,FILE * pFile,ZipfileEOCD * pEOCD)5188 static int zipfileReadEOCD(
5189   ZipfileTab *pTab,               /* Return errors here */
5190   const u8 *aBlob,                /* Pointer to in-memory file image */
5191   int nBlob,                      /* Size of aBlob[] in bytes */
5192   FILE *pFile,                    /* Read from this file if aBlob==0 */
5193   ZipfileEOCD *pEOCD              /* Object to populate */
5194 ){
5195   u8 *aRead = pTab->aBuffer;      /* Temporary buffer */
5196   int nRead;                      /* Bytes to read from file */
5197   int rc = SQLITE_OK;
5198 
5199   if( aBlob==0 ){
5200     i64 iOff;                     /* Offset to read from */
5201     i64 szFile;                   /* Total size of file in bytes */
5202     fseek(pFile, 0, SEEK_END);
5203     szFile = (i64)ftell(pFile);
5204     if( szFile==0 ){
5205       memset(pEOCD, 0, sizeof(ZipfileEOCD));
5206       return SQLITE_OK;
5207     }
5208     nRead = (int)(MIN(szFile, ZIPFILE_BUFFER_SIZE));
5209     iOff = szFile - nRead;
5210     rc = zipfileReadData(pFile, aRead, nRead, iOff, &pTab->base.zErrMsg);
5211   }else{
5212     nRead = (int)(MIN(nBlob, ZIPFILE_BUFFER_SIZE));
5213     aRead = (u8*)&aBlob[nBlob-nRead];
5214   }
5215 
5216   if( rc==SQLITE_OK ){
5217     int i;
5218 
5219     /* Scan backwards looking for the signature bytes */
5220     for(i=nRead-20; i>=0; i--){
5221       if( aRead[i]==0x50 && aRead[i+1]==0x4b
5222        && aRead[i+2]==0x05 && aRead[i+3]==0x06
5223       ){
5224         break;
5225       }
5226     }
5227     if( i<0 ){
5228       pTab->base.zErrMsg = sqlite3_mprintf(
5229           "cannot find end of central directory record"
5230       );
5231       return SQLITE_ERROR;
5232     }
5233 
5234     aRead += i+4;
5235     pEOCD->iDisk = zipfileRead16(aRead);
5236     pEOCD->iFirstDisk = zipfileRead16(aRead);
5237     pEOCD->nEntry = zipfileRead16(aRead);
5238     pEOCD->nEntryTotal = zipfileRead16(aRead);
5239     pEOCD->nSize = zipfileRead32(aRead);
5240     pEOCD->iOffset = zipfileRead32(aRead);
5241   }
5242 
5243   return rc;
5244 }
5245 
5246 /*
5247 ** Add object pNew to the linked list that begins at ZipfileTab.pFirstEntry
5248 ** and ends with pLastEntry. If argument pBefore is NULL, then pNew is added
5249 ** to the end of the list. Otherwise, it is added to the list immediately
5250 ** before pBefore (which is guaranteed to be a part of said list).
5251 */
zipfileAddEntry(ZipfileTab * pTab,ZipfileEntry * pBefore,ZipfileEntry * pNew)5252 static void zipfileAddEntry(
5253   ZipfileTab *pTab,
5254   ZipfileEntry *pBefore,
5255   ZipfileEntry *pNew
5256 ){
5257   assert( (pTab->pFirstEntry==0)==(pTab->pLastEntry==0) );
5258   assert( pNew->pNext==0 );
5259   if( pBefore==0 ){
5260     if( pTab->pFirstEntry==0 ){
5261       pTab->pFirstEntry = pTab->pLastEntry = pNew;
5262     }else{
5263       assert( pTab->pLastEntry->pNext==0 );
5264       pTab->pLastEntry->pNext = pNew;
5265       pTab->pLastEntry = pNew;
5266     }
5267   }else{
5268     ZipfileEntry **pp;
5269     for(pp=&pTab->pFirstEntry; *pp!=pBefore; pp=&((*pp)->pNext));
5270     pNew->pNext = pBefore;
5271     *pp = pNew;
5272   }
5273 }
5274 
zipfileLoadDirectory(ZipfileTab * pTab,const u8 * aBlob,int nBlob)5275 static int zipfileLoadDirectory(ZipfileTab *pTab, const u8 *aBlob, int nBlob){
5276   ZipfileEOCD eocd;
5277   int rc;
5278   int i;
5279   i64 iOff;
5280 
5281   rc = zipfileReadEOCD(pTab, aBlob, nBlob, pTab->pWriteFd, &eocd);
5282   iOff = eocd.iOffset;
5283   for(i=0; rc==SQLITE_OK && i<eocd.nEntry; i++){
5284     ZipfileEntry *pNew = 0;
5285     rc = zipfileGetEntry(pTab, aBlob, nBlob, pTab->pWriteFd, iOff, &pNew);
5286 
5287     if( rc==SQLITE_OK ){
5288       zipfileAddEntry(pTab, 0, pNew);
5289       iOff += ZIPFILE_CDS_FIXED_SZ;
5290       iOff += (int)pNew->cds.nExtra + pNew->cds.nFile + pNew->cds.nComment;
5291     }
5292   }
5293   return rc;
5294 }
5295 
5296 /*
5297 ** xFilter callback.
5298 */
zipfileFilter(sqlite3_vtab_cursor * cur,int idxNum,const char * idxStr,int argc,sqlite3_value ** argv)5299 static int zipfileFilter(
5300   sqlite3_vtab_cursor *cur,
5301   int idxNum, const char *idxStr,
5302   int argc, sqlite3_value **argv
5303 ){
5304   ZipfileTab *pTab = (ZipfileTab*)cur->pVtab;
5305   ZipfileCsr *pCsr = (ZipfileCsr*)cur;
5306   const char *zFile = 0;          /* Zip file to scan */
5307   int rc = SQLITE_OK;             /* Return Code */
5308   int bInMemory = 0;              /* True for an in-memory zipfile */
5309 
5310   zipfileResetCursor(pCsr);
5311 
5312   if( pTab->zFile ){
5313     zFile = pTab->zFile;
5314   }else if( idxNum==0 ){
5315     zipfileCursorErr(pCsr, "zipfile() function requires an argument");
5316     return SQLITE_ERROR;
5317   }else if( sqlite3_value_type(argv[0])==SQLITE_BLOB ){
5318     const u8 *aBlob = (const u8*)sqlite3_value_blob(argv[0]);
5319     int nBlob = sqlite3_value_bytes(argv[0]);
5320     assert( pTab->pFirstEntry==0 );
5321     rc = zipfileLoadDirectory(pTab, aBlob, nBlob);
5322     pCsr->pFreeEntry = pTab->pFirstEntry;
5323     pTab->pFirstEntry = pTab->pLastEntry = 0;
5324     if( rc!=SQLITE_OK ) return rc;
5325     bInMemory = 1;
5326   }else{
5327     zFile = (const char*)sqlite3_value_text(argv[0]);
5328   }
5329 
5330   if( 0==pTab->pWriteFd && 0==bInMemory ){
5331     pCsr->pFile = fopen(zFile, "rb");
5332     if( pCsr->pFile==0 ){
5333       zipfileCursorErr(pCsr, "cannot open file: %s", zFile);
5334       rc = SQLITE_ERROR;
5335     }else{
5336       rc = zipfileReadEOCD(pTab, 0, 0, pCsr->pFile, &pCsr->eocd);
5337       if( rc==SQLITE_OK ){
5338         if( pCsr->eocd.nEntry==0 ){
5339           pCsr->bEof = 1;
5340         }else{
5341           pCsr->iNextOff = pCsr->eocd.iOffset;
5342           rc = zipfileNext(cur);
5343         }
5344       }
5345     }
5346   }else{
5347     pCsr->bNoop = 1;
5348     pCsr->pCurrent = pCsr->pFreeEntry ? pCsr->pFreeEntry : pTab->pFirstEntry;
5349     rc = zipfileNext(cur);
5350   }
5351 
5352   return rc;
5353 }
5354 
5355 /*
5356 ** xBestIndex callback.
5357 */
zipfileBestIndex(sqlite3_vtab * tab,sqlite3_index_info * pIdxInfo)5358 static int zipfileBestIndex(
5359   sqlite3_vtab *tab,
5360   sqlite3_index_info *pIdxInfo
5361 ){
5362   int i;
5363   int idx = -1;
5364   int unusable = 0;
5365 
5366   for(i=0; i<pIdxInfo->nConstraint; i++){
5367     const struct sqlite3_index_constraint *pCons = &pIdxInfo->aConstraint[i];
5368     if( pCons->iColumn!=ZIPFILE_F_COLUMN_IDX ) continue;
5369     if( pCons->usable==0 ){
5370       unusable = 1;
5371     }else if( pCons->op==SQLITE_INDEX_CONSTRAINT_EQ ){
5372       idx = i;
5373     }
5374   }
5375   if( idx>=0 ){
5376     pIdxInfo->aConstraintUsage[idx].argvIndex = 1;
5377     pIdxInfo->aConstraintUsage[idx].omit = 1;
5378     pIdxInfo->estimatedCost = 1000.0;
5379     pIdxInfo->idxNum = 1;
5380   }else if( unusable ){
5381     return SQLITE_CONSTRAINT;
5382   }
5383   return SQLITE_OK;
5384 }
5385 
zipfileNewEntry(const char * zPath)5386 static ZipfileEntry *zipfileNewEntry(const char *zPath){
5387   ZipfileEntry *pNew;
5388   pNew = sqlite3_malloc(sizeof(ZipfileEntry));
5389   if( pNew ){
5390     memset(pNew, 0, sizeof(ZipfileEntry));
5391     pNew->cds.zFile = sqlite3_mprintf("%s", zPath);
5392     if( pNew->cds.zFile==0 ){
5393       sqlite3_free(pNew);
5394       pNew = 0;
5395     }
5396   }
5397   return pNew;
5398 }
5399 
zipfileSerializeLFH(ZipfileEntry * pEntry,u8 * aBuf)5400 static int zipfileSerializeLFH(ZipfileEntry *pEntry, u8 *aBuf){
5401   ZipfileCDS *pCds = &pEntry->cds;
5402   u8 *a = aBuf;
5403 
5404   pCds->nExtra = 9;
5405 
5406   /* Write the LFH itself */
5407   zipfileWrite32(a, ZIPFILE_SIGNATURE_LFH);
5408   zipfileWrite16(a, pCds->iVersionExtract);
5409   zipfileWrite16(a, pCds->flags);
5410   zipfileWrite16(a, pCds->iCompression);
5411   zipfileWrite16(a, pCds->mTime);
5412   zipfileWrite16(a, pCds->mDate);
5413   zipfileWrite32(a, pCds->crc32);
5414   zipfileWrite32(a, pCds->szCompressed);
5415   zipfileWrite32(a, pCds->szUncompressed);
5416   zipfileWrite16(a, (u16)pCds->nFile);
5417   zipfileWrite16(a, pCds->nExtra);
5418   assert( a==&aBuf[ZIPFILE_LFH_FIXED_SZ] );
5419 
5420   /* Add the file name */
5421   memcpy(a, pCds->zFile, (int)pCds->nFile);
5422   a += (int)pCds->nFile;
5423 
5424   /* The "extra" data */
5425   zipfileWrite16(a, ZIPFILE_EXTRA_TIMESTAMP);
5426   zipfileWrite16(a, 5);
5427   *a++ = 0x01;
5428   zipfileWrite32(a, pEntry->mUnixTime);
5429 
5430   return a-aBuf;
5431 }
5432 
zipfileAppendEntry(ZipfileTab * pTab,ZipfileEntry * pEntry,const u8 * pData,int nData)5433 static int zipfileAppendEntry(
5434   ZipfileTab *pTab,
5435   ZipfileEntry *pEntry,
5436   const u8 *pData,
5437   int nData
5438 ){
5439   u8 *aBuf = pTab->aBuffer;
5440   int nBuf;
5441   int rc;
5442 
5443   nBuf = zipfileSerializeLFH(pEntry, aBuf);
5444   rc = zipfileAppendData(pTab, aBuf, nBuf);
5445   if( rc==SQLITE_OK ){
5446     pEntry->iDataOff = pTab->szCurrent;
5447     rc = zipfileAppendData(pTab, pData, nData);
5448   }
5449 
5450   return rc;
5451 }
5452 
zipfileGetMode(sqlite3_value * pVal,int bIsDir,u32 * pMode,char ** pzErr)5453 static int zipfileGetMode(
5454   sqlite3_value *pVal,
5455   int bIsDir,                     /* If true, default to directory */
5456   u32 *pMode,                     /* OUT: Mode value */
5457   char **pzErr                    /* OUT: Error message */
5458 ){
5459   const char *z = (const char*)sqlite3_value_text(pVal);
5460   u32 mode = 0;
5461   if( z==0 ){
5462     mode = (bIsDir ? (S_IFDIR + 0755) : (S_IFREG + 0644));
5463   }else if( z[0]>='0' && z[0]<='9' ){
5464     mode = (unsigned int)sqlite3_value_int(pVal);
5465   }else{
5466     const char zTemplate[11] = "-rwxrwxrwx";
5467     int i;
5468     if( strlen(z)!=10 ) goto parse_error;
5469     switch( z[0] ){
5470       case '-': mode |= S_IFREG; break;
5471       case 'd': mode |= S_IFDIR; break;
5472       case 'l': mode |= S_IFLNK; break;
5473       default: goto parse_error;
5474     }
5475     for(i=1; i<10; i++){
5476       if( z[i]==zTemplate[i] ) mode |= 1 << (9-i);
5477       else if( z[i]!='-' ) goto parse_error;
5478     }
5479   }
5480   if( ((mode & S_IFDIR)==0)==bIsDir ){
5481     /* The "mode" attribute is a directory, but data has been specified.
5482     ** Or vice-versa - no data but "mode" is a file or symlink.  */
5483     *pzErr = sqlite3_mprintf("zipfile: mode does not match data");
5484     return SQLITE_CONSTRAINT;
5485   }
5486   *pMode = mode;
5487   return SQLITE_OK;
5488 
5489  parse_error:
5490   *pzErr = sqlite3_mprintf("zipfile: parse error in mode: %s", z);
5491   return SQLITE_ERROR;
5492 }
5493 
5494 /*
5495 ** Both (const char*) arguments point to nul-terminated strings. Argument
5496 ** nB is the value of strlen(zB). This function returns 0 if the strings are
5497 ** identical, ignoring any trailing '/' character in either path.  */
zipfileComparePath(const char * zA,const char * zB,int nB)5498 static int zipfileComparePath(const char *zA, const char *zB, int nB){
5499   int nA = (int)strlen(zA);
5500   if( zA[nA-1]=='/' ) nA--;
5501   if( zB[nB-1]=='/' ) nB--;
5502   if( nA==nB && memcmp(zA, zB, nA)==0 ) return 0;
5503   return 1;
5504 }
5505 
zipfileBegin(sqlite3_vtab * pVtab)5506 static int zipfileBegin(sqlite3_vtab *pVtab){
5507   ZipfileTab *pTab = (ZipfileTab*)pVtab;
5508   int rc = SQLITE_OK;
5509 
5510   assert( pTab->pWriteFd==0 );
5511 
5512   /* Open a write fd on the file. Also load the entire central directory
5513   ** structure into memory. During the transaction any new file data is
5514   ** appended to the archive file, but the central directory is accumulated
5515   ** in main-memory until the transaction is committed.  */
5516   pTab->pWriteFd = fopen(pTab->zFile, "ab+");
5517   if( pTab->pWriteFd==0 ){
5518     pTab->base.zErrMsg = sqlite3_mprintf(
5519         "zipfile: failed to open file %s for writing", pTab->zFile
5520         );
5521     rc = SQLITE_ERROR;
5522   }else{
5523     fseek(pTab->pWriteFd, 0, SEEK_END);
5524     pTab->szCurrent = pTab->szOrig = (i64)ftell(pTab->pWriteFd);
5525     rc = zipfileLoadDirectory(pTab, 0, 0);
5526   }
5527 
5528   if( rc!=SQLITE_OK ){
5529     zipfileCleanupTransaction(pTab);
5530   }
5531 
5532   return rc;
5533 }
5534 
5535 /*
5536 ** Return the current time as a 32-bit timestamp in UNIX epoch format (like
5537 ** time(2)).
5538 */
zipfileTime(void)5539 static u32 zipfileTime(void){
5540   sqlite3_vfs *pVfs = sqlite3_vfs_find(0);
5541   u32 ret;
5542   if( pVfs->iVersion>=2 && pVfs->xCurrentTimeInt64 ){
5543     i64 ms;
5544     pVfs->xCurrentTimeInt64(pVfs, &ms);
5545     ret = (u32)((ms/1000) - ((i64)24405875 * 8640));
5546   }else{
5547     double day;
5548     pVfs->xCurrentTime(pVfs, &day);
5549     ret = (u32)((day - 2440587.5) * 86400);
5550   }
5551   return ret;
5552 }
5553 
5554 /*
5555 ** Return a 32-bit timestamp in UNIX epoch format.
5556 **
5557 ** If the value passed as the only argument is either NULL or an SQL NULL,
5558 ** return the current time. Otherwise, return the value stored in (*pVal)
5559 ** cast to a 32-bit unsigned integer.
5560 */
zipfileGetTime(sqlite3_value * pVal)5561 static u32 zipfileGetTime(sqlite3_value *pVal){
5562   if( pVal==0 || sqlite3_value_type(pVal)==SQLITE_NULL ){
5563     return zipfileTime();
5564   }
5565   return (u32)sqlite3_value_int64(pVal);
5566 }
5567 
5568 /*
5569 ** Unless it is NULL, entry pOld is currently part of the pTab->pFirstEntry
5570 ** linked list.  Remove it from the list and free the object.
5571 */
zipfileRemoveEntryFromList(ZipfileTab * pTab,ZipfileEntry * pOld)5572 static void zipfileRemoveEntryFromList(ZipfileTab *pTab, ZipfileEntry *pOld){
5573   if( pOld ){
5574     ZipfileEntry **pp;
5575     for(pp=&pTab->pFirstEntry; (*pp)!=pOld; pp=&((*pp)->pNext));
5576     *pp = (*pp)->pNext;
5577     zipfileEntryFree(pOld);
5578   }
5579 }
5580 
5581 /*
5582 ** xUpdate method.
5583 */
zipfileUpdate(sqlite3_vtab * pVtab,int nVal,sqlite3_value ** apVal,sqlite_int64 * pRowid)5584 static int zipfileUpdate(
5585   sqlite3_vtab *pVtab,
5586   int nVal,
5587   sqlite3_value **apVal,
5588   sqlite_int64 *pRowid
5589 ){
5590   ZipfileTab *pTab = (ZipfileTab*)pVtab;
5591   int rc = SQLITE_OK;             /* Return Code */
5592   ZipfileEntry *pNew = 0;         /* New in-memory CDS entry */
5593 
5594   u32 mode = 0;                   /* Mode for new entry */
5595   u32 mTime = 0;                  /* Modification time for new entry */
5596   i64 sz = 0;                     /* Uncompressed size */
5597   const char *zPath = 0;          /* Path for new entry */
5598   int nPath = 0;                  /* strlen(zPath) */
5599   const u8 *pData = 0;            /* Pointer to buffer containing content */
5600   int nData = 0;                  /* Size of pData buffer in bytes */
5601   int iMethod = 0;                /* Compression method for new entry */
5602   u8 *pFree = 0;                  /* Free this */
5603   char *zFree = 0;                /* Also free this */
5604   ZipfileEntry *pOld = 0;
5605   ZipfileEntry *pOld2 = 0;
5606   int bUpdate = 0;                /* True for an update that modifies "name" */
5607   int bIsDir = 0;
5608   u32 iCrc32 = 0;
5609 
5610   if( pTab->pWriteFd==0 ){
5611     rc = zipfileBegin(pVtab);
5612     if( rc!=SQLITE_OK ) return rc;
5613   }
5614 
5615   /* If this is a DELETE or UPDATE, find the archive entry to delete. */
5616   if( sqlite3_value_type(apVal[0])!=SQLITE_NULL ){
5617     const char *zDelete = (const char*)sqlite3_value_text(apVal[0]);
5618     int nDelete = (int)strlen(zDelete);
5619     if( nVal>1 ){
5620       const char *zUpdate = (const char*)sqlite3_value_text(apVal[1]);
5621       if( zUpdate && zipfileComparePath(zUpdate, zDelete, nDelete)!=0 ){
5622         bUpdate = 1;
5623       }
5624     }
5625     for(pOld=pTab->pFirstEntry; 1; pOld=pOld->pNext){
5626       if( zipfileComparePath(pOld->cds.zFile, zDelete, nDelete)==0 ){
5627         break;
5628       }
5629       assert( pOld->pNext );
5630     }
5631   }
5632 
5633   if( nVal>1 ){
5634     /* Check that "sz" and "rawdata" are both NULL: */
5635     if( sqlite3_value_type(apVal[5])!=SQLITE_NULL ){
5636       zipfileTableErr(pTab, "sz must be NULL");
5637       rc = SQLITE_CONSTRAINT;
5638     }
5639     if( sqlite3_value_type(apVal[6])!=SQLITE_NULL ){
5640       zipfileTableErr(pTab, "rawdata must be NULL");
5641       rc = SQLITE_CONSTRAINT;
5642     }
5643 
5644     if( rc==SQLITE_OK ){
5645       if( sqlite3_value_type(apVal[7])==SQLITE_NULL ){
5646         /* data=NULL. A directory */
5647         bIsDir = 1;
5648       }else{
5649         /* Value specified for "data", and possibly "method". This must be
5650         ** a regular file or a symlink. */
5651         const u8 *aIn = sqlite3_value_blob(apVal[7]);
5652         int nIn = sqlite3_value_bytes(apVal[7]);
5653         int bAuto = sqlite3_value_type(apVal[8])==SQLITE_NULL;
5654 
5655         iMethod = sqlite3_value_int(apVal[8]);
5656         sz = nIn;
5657         pData = aIn;
5658         nData = nIn;
5659         if( iMethod!=0 && iMethod!=8 ){
5660           zipfileTableErr(pTab, "unknown compression method: %d", iMethod);
5661           rc = SQLITE_CONSTRAINT;
5662         }else{
5663           if( bAuto || iMethod ){
5664             int nCmp;
5665             rc = zipfileDeflate(aIn, nIn, &pFree, &nCmp, &pTab->base.zErrMsg);
5666             if( rc==SQLITE_OK ){
5667               if( iMethod || nCmp<nIn ){
5668                 iMethod = 8;
5669                 pData = pFree;
5670                 nData = nCmp;
5671               }
5672             }
5673           }
5674           iCrc32 = crc32(0, aIn, nIn);
5675         }
5676       }
5677     }
5678 
5679     if( rc==SQLITE_OK ){
5680       rc = zipfileGetMode(apVal[3], bIsDir, &mode, &pTab->base.zErrMsg);
5681     }
5682 
5683     if( rc==SQLITE_OK ){
5684       zPath = (const char*)sqlite3_value_text(apVal[2]);
5685       nPath = (int)strlen(zPath);
5686       mTime = zipfileGetTime(apVal[4]);
5687     }
5688 
5689     if( rc==SQLITE_OK && bIsDir ){
5690       /* For a directory, check that the last character in the path is a
5691       ** '/'. This appears to be required for compatibility with info-zip
5692       ** (the unzip command on unix). It does not create directories
5693       ** otherwise.  */
5694       if( zPath[nPath-1]!='/' ){
5695         zFree = sqlite3_mprintf("%s/", zPath);
5696         if( zFree==0 ){ rc = SQLITE_NOMEM; }
5697         zPath = (const char*)zFree;
5698         nPath++;
5699       }
5700     }
5701 
5702     /* Check that we're not inserting a duplicate entry -OR- updating an
5703     ** entry with a path, thereby making it into a duplicate. */
5704     if( (pOld==0 || bUpdate) && rc==SQLITE_OK ){
5705       ZipfileEntry *p;
5706       for(p=pTab->pFirstEntry; p; p=p->pNext){
5707         if( zipfileComparePath(p->cds.zFile, zPath, nPath)==0 ){
5708           switch( sqlite3_vtab_on_conflict(pTab->db) ){
5709             case SQLITE_IGNORE: {
5710               goto zipfile_update_done;
5711             }
5712             case SQLITE_REPLACE: {
5713               pOld2 = p;
5714               break;
5715             }
5716             default: {
5717               zipfileTableErr(pTab, "duplicate name: \"%s\"", zPath);
5718               rc = SQLITE_CONSTRAINT;
5719               break;
5720             }
5721           }
5722           break;
5723         }
5724       }
5725     }
5726 
5727     if( rc==SQLITE_OK ){
5728       /* Create the new CDS record. */
5729       pNew = zipfileNewEntry(zPath);
5730       if( pNew==0 ){
5731         rc = SQLITE_NOMEM;
5732       }else{
5733         pNew->cds.iVersionMadeBy = ZIPFILE_NEWENTRY_MADEBY;
5734         pNew->cds.iVersionExtract = ZIPFILE_NEWENTRY_REQUIRED;
5735         pNew->cds.flags = ZIPFILE_NEWENTRY_FLAGS;
5736         pNew->cds.iCompression = (u16)iMethod;
5737         zipfileMtimeToDos(&pNew->cds, mTime);
5738         pNew->cds.crc32 = iCrc32;
5739         pNew->cds.szCompressed = nData;
5740         pNew->cds.szUncompressed = (u32)sz;
5741         pNew->cds.iExternalAttr = (mode<<16);
5742         pNew->cds.iOffset = (u32)pTab->szCurrent;
5743         pNew->cds.nFile = (u16)nPath;
5744         pNew->mUnixTime = (u32)mTime;
5745         rc = zipfileAppendEntry(pTab, pNew, pData, nData);
5746         zipfileAddEntry(pTab, pOld, pNew);
5747       }
5748     }
5749   }
5750 
5751   if( rc==SQLITE_OK && (pOld || pOld2) ){
5752     ZipfileCsr *pCsr;
5753     for(pCsr=pTab->pCsrList; pCsr; pCsr=pCsr->pCsrNext){
5754       if( pCsr->pCurrent && (pCsr->pCurrent==pOld || pCsr->pCurrent==pOld2) ){
5755         pCsr->pCurrent = pCsr->pCurrent->pNext;
5756         pCsr->bNoop = 1;
5757       }
5758     }
5759 
5760     zipfileRemoveEntryFromList(pTab, pOld);
5761     zipfileRemoveEntryFromList(pTab, pOld2);
5762   }
5763 
5764 zipfile_update_done:
5765   sqlite3_free(pFree);
5766   sqlite3_free(zFree);
5767   return rc;
5768 }
5769 
zipfileSerializeEOCD(ZipfileEOCD * p,u8 * aBuf)5770 static int zipfileSerializeEOCD(ZipfileEOCD *p, u8 *aBuf){
5771   u8 *a = aBuf;
5772   zipfileWrite32(a, ZIPFILE_SIGNATURE_EOCD);
5773   zipfileWrite16(a, p->iDisk);
5774   zipfileWrite16(a, p->iFirstDisk);
5775   zipfileWrite16(a, p->nEntry);
5776   zipfileWrite16(a, p->nEntryTotal);
5777   zipfileWrite32(a, p->nSize);
5778   zipfileWrite32(a, p->iOffset);
5779   zipfileWrite16(a, 0);        /* Size of trailing comment in bytes*/
5780 
5781   return a-aBuf;
5782 }
5783 
zipfileAppendEOCD(ZipfileTab * pTab,ZipfileEOCD * p)5784 static int zipfileAppendEOCD(ZipfileTab *pTab, ZipfileEOCD *p){
5785   int nBuf = zipfileSerializeEOCD(p, pTab->aBuffer);
5786   assert( nBuf==ZIPFILE_EOCD_FIXED_SZ );
5787   return zipfileAppendData(pTab, pTab->aBuffer, nBuf);
5788 }
5789 
5790 /*
5791 ** Serialize the CDS structure into buffer aBuf[]. Return the number
5792 ** of bytes written.
5793 */
zipfileSerializeCDS(ZipfileEntry * pEntry,u8 * aBuf)5794 static int zipfileSerializeCDS(ZipfileEntry *pEntry, u8 *aBuf){
5795   u8 *a = aBuf;
5796   ZipfileCDS *pCDS = &pEntry->cds;
5797 
5798   if( pEntry->aExtra==0 ){
5799     pCDS->nExtra = 9;
5800   }
5801 
5802   zipfileWrite32(a, ZIPFILE_SIGNATURE_CDS);
5803   zipfileWrite16(a, pCDS->iVersionMadeBy);
5804   zipfileWrite16(a, pCDS->iVersionExtract);
5805   zipfileWrite16(a, pCDS->flags);
5806   zipfileWrite16(a, pCDS->iCompression);
5807   zipfileWrite16(a, pCDS->mTime);
5808   zipfileWrite16(a, pCDS->mDate);
5809   zipfileWrite32(a, pCDS->crc32);
5810   zipfileWrite32(a, pCDS->szCompressed);
5811   zipfileWrite32(a, pCDS->szUncompressed);
5812   assert( a==&aBuf[ZIPFILE_CDS_NFILE_OFF] );
5813   zipfileWrite16(a, pCDS->nFile);
5814   zipfileWrite16(a, pCDS->nExtra);
5815   zipfileWrite16(a, pCDS->nComment);
5816   zipfileWrite16(a, pCDS->iDiskStart);
5817   zipfileWrite16(a, pCDS->iInternalAttr);
5818   zipfileWrite32(a, pCDS->iExternalAttr);
5819   zipfileWrite32(a, pCDS->iOffset);
5820 
5821   memcpy(a, pCDS->zFile, pCDS->nFile);
5822   a += pCDS->nFile;
5823 
5824   if( pEntry->aExtra ){
5825     int n = (int)pCDS->nExtra + (int)pCDS->nComment;
5826     memcpy(a, pEntry->aExtra, n);
5827     a += n;
5828   }else{
5829     assert( pCDS->nExtra==9 );
5830     zipfileWrite16(a, ZIPFILE_EXTRA_TIMESTAMP);
5831     zipfileWrite16(a, 5);
5832     *a++ = 0x01;
5833     zipfileWrite32(a, pEntry->mUnixTime);
5834   }
5835 
5836   return a-aBuf;
5837 }
5838 
zipfileCommit(sqlite3_vtab * pVtab)5839 static int zipfileCommit(sqlite3_vtab *pVtab){
5840   ZipfileTab *pTab = (ZipfileTab*)pVtab;
5841   int rc = SQLITE_OK;
5842   if( pTab->pWriteFd ){
5843     i64 iOffset = pTab->szCurrent;
5844     ZipfileEntry *p;
5845     ZipfileEOCD eocd;
5846     int nEntry = 0;
5847 
5848     /* Write out all entries */
5849     for(p=pTab->pFirstEntry; rc==SQLITE_OK && p; p=p->pNext){
5850       int n = zipfileSerializeCDS(p, pTab->aBuffer);
5851       rc = zipfileAppendData(pTab, pTab->aBuffer, n);
5852       nEntry++;
5853     }
5854 
5855     /* Write out the EOCD record */
5856     eocd.iDisk = 0;
5857     eocd.iFirstDisk = 0;
5858     eocd.nEntry = (u16)nEntry;
5859     eocd.nEntryTotal = (u16)nEntry;
5860     eocd.nSize = (u32)(pTab->szCurrent - iOffset);
5861     eocd.iOffset = (u32)iOffset;
5862     rc = zipfileAppendEOCD(pTab, &eocd);
5863 
5864     zipfileCleanupTransaction(pTab);
5865   }
5866   return rc;
5867 }
5868 
zipfileRollback(sqlite3_vtab * pVtab)5869 static int zipfileRollback(sqlite3_vtab *pVtab){
5870   return zipfileCommit(pVtab);
5871 }
5872 
zipfileFindCursor(ZipfileTab * pTab,i64 iId)5873 static ZipfileCsr *zipfileFindCursor(ZipfileTab *pTab, i64 iId){
5874   ZipfileCsr *pCsr;
5875   for(pCsr=pTab->pCsrList; pCsr; pCsr=pCsr->pCsrNext){
5876     if( iId==pCsr->iId ) break;
5877   }
5878   return pCsr;
5879 }
5880 
zipfileFunctionCds(sqlite3_context * context,int argc,sqlite3_value ** argv)5881 static void zipfileFunctionCds(
5882   sqlite3_context *context,
5883   int argc,
5884   sqlite3_value **argv
5885 ){
5886   ZipfileCsr *pCsr;
5887   ZipfileTab *pTab = (ZipfileTab*)sqlite3_user_data(context);
5888   assert( argc>0 );
5889 
5890   pCsr = zipfileFindCursor(pTab, sqlite3_value_int64(argv[0]));
5891   if( pCsr ){
5892     ZipfileCDS *p = &pCsr->pCurrent->cds;
5893     char *zRes = sqlite3_mprintf("{"
5894         "\"version-made-by\" : %u, "
5895         "\"version-to-extract\" : %u, "
5896         "\"flags\" : %u, "
5897         "\"compression\" : %u, "
5898         "\"time\" : %u, "
5899         "\"date\" : %u, "
5900         "\"crc32\" : %u, "
5901         "\"compressed-size\" : %u, "
5902         "\"uncompressed-size\" : %u, "
5903         "\"file-name-length\" : %u, "
5904         "\"extra-field-length\" : %u, "
5905         "\"file-comment-length\" : %u, "
5906         "\"disk-number-start\" : %u, "
5907         "\"internal-attr\" : %u, "
5908         "\"external-attr\" : %u, "
5909         "\"offset\" : %u }",
5910         (u32)p->iVersionMadeBy, (u32)p->iVersionExtract,
5911         (u32)p->flags, (u32)p->iCompression,
5912         (u32)p->mTime, (u32)p->mDate,
5913         (u32)p->crc32, (u32)p->szCompressed,
5914         (u32)p->szUncompressed, (u32)p->nFile,
5915         (u32)p->nExtra, (u32)p->nComment,
5916         (u32)p->iDiskStart, (u32)p->iInternalAttr,
5917         (u32)p->iExternalAttr, (u32)p->iOffset
5918     );
5919 
5920     if( zRes==0 ){
5921       sqlite3_result_error_nomem(context);
5922     }else{
5923       sqlite3_result_text(context, zRes, -1, SQLITE_TRANSIENT);
5924       sqlite3_free(zRes);
5925     }
5926   }
5927 }
5928 
5929 /*
5930 ** xFindFunction method.
5931 */
zipfileFindFunction(sqlite3_vtab * pVtab,int nArg,const char * zName,void (** pxFunc)(sqlite3_context *,int,sqlite3_value **),void ** ppArg)5932 static int zipfileFindFunction(
5933   sqlite3_vtab *pVtab,            /* Virtual table handle */
5934   int nArg,                       /* Number of SQL function arguments */
5935   const char *zName,              /* Name of SQL function */
5936   void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), /* OUT: Result */
5937   void **ppArg                    /* OUT: User data for *pxFunc */
5938 ){
5939   if( sqlite3_stricmp("zipfile_cds", zName)==0 ){
5940     *pxFunc = zipfileFunctionCds;
5941     *ppArg = (void*)pVtab;
5942     return 1;
5943   }
5944   return 0;
5945 }
5946 
5947 typedef struct ZipfileBuffer ZipfileBuffer;
5948 struct ZipfileBuffer {
5949   u8 *a;                          /* Pointer to buffer */
5950   int n;                          /* Size of buffer in bytes */
5951   int nAlloc;                     /* Byte allocated at a[] */
5952 };
5953 
5954 typedef struct ZipfileCtx ZipfileCtx;
5955 struct ZipfileCtx {
5956   int nEntry;
5957   ZipfileBuffer body;
5958   ZipfileBuffer cds;
5959 };
5960 
zipfileBufferGrow(ZipfileBuffer * pBuf,int nByte)5961 static int zipfileBufferGrow(ZipfileBuffer *pBuf, int nByte){
5962   if( pBuf->n+nByte>pBuf->nAlloc ){
5963     u8 *aNew;
5964     int nNew = pBuf->n ? pBuf->n*2 : 512;
5965     int nReq = pBuf->n + nByte;
5966 
5967     while( nNew<nReq ) nNew = nNew*2;
5968     aNew = sqlite3_realloc(pBuf->a, nNew);
5969     if( aNew==0 ) return SQLITE_NOMEM;
5970     pBuf->a = aNew;
5971     pBuf->nAlloc = nNew;
5972   }
5973   return SQLITE_OK;
5974 }
5975 
5976 /*
5977 ** xStep() callback for the zipfile() aggregate. This can be called in
5978 ** any of the following ways:
5979 **
5980 **   SELECT zipfile(name,data) ...
5981 **   SELECT zipfile(name,mode,mtime,data) ...
5982 **   SELECT zipfile(name,mode,mtime,data,method) ...
5983 */
zipfileStep(sqlite3_context * pCtx,int nVal,sqlite3_value ** apVal)5984 void zipfileStep(sqlite3_context *pCtx, int nVal, sqlite3_value **apVal){
5985   ZipfileCtx *p;                  /* Aggregate function context */
5986   ZipfileEntry e;                 /* New entry to add to zip archive */
5987 
5988   sqlite3_value *pName = 0;
5989   sqlite3_value *pMode = 0;
5990   sqlite3_value *pMtime = 0;
5991   sqlite3_value *pData = 0;
5992   sqlite3_value *pMethod = 0;
5993 
5994   int bIsDir = 0;
5995   u32 mode;
5996   int rc = SQLITE_OK;
5997   char *zErr = 0;
5998 
5999   int iMethod = -1;               /* Compression method to use (0 or 8) */
6000 
6001   const u8 *aData = 0;            /* Possibly compressed data for new entry */
6002   int nData = 0;                  /* Size of aData[] in bytes */
6003   int szUncompressed = 0;         /* Size of data before compression */
6004   u8 *aFree = 0;                  /* Free this before returning */
6005   u32 iCrc32 = 0;                 /* crc32 of uncompressed data */
6006 
6007   char *zName = 0;                /* Path (name) of new entry */
6008   int nName = 0;                  /* Size of zName in bytes */
6009   char *zFree = 0;                /* Free this before returning */
6010   int nByte;
6011 
6012   memset(&e, 0, sizeof(e));
6013   p = (ZipfileCtx*)sqlite3_aggregate_context(pCtx, sizeof(ZipfileCtx));
6014   if( p==0 ) return;
6015 
6016   /* Martial the arguments into stack variables */
6017   if( nVal!=2 && nVal!=4 && nVal!=5 ){
6018     zErr = sqlite3_mprintf("wrong number of arguments to function zipfile()");
6019     rc = SQLITE_ERROR;
6020     goto zipfile_step_out;
6021   }
6022   pName = apVal[0];
6023   if( nVal==2 ){
6024     pData = apVal[1];
6025   }else{
6026     pMode = apVal[1];
6027     pMtime = apVal[2];
6028     pData = apVal[3];
6029     if( nVal==5 ){
6030       pMethod = apVal[4];
6031     }
6032   }
6033 
6034   /* Check that the 'name' parameter looks ok. */
6035   zName = (char*)sqlite3_value_text(pName);
6036   nName = sqlite3_value_bytes(pName);
6037   if( zName==0 ){
6038     zErr = sqlite3_mprintf("first argument to zipfile() must be non-NULL");
6039     rc = SQLITE_ERROR;
6040     goto zipfile_step_out;
6041   }
6042 
6043   /* Inspect the 'method' parameter. This must be either 0 (store), 8 (use
6044   ** deflate compression) or NULL (choose automatically).  */
6045   if( pMethod && SQLITE_NULL!=sqlite3_value_type(pMethod) ){
6046     iMethod = (int)sqlite3_value_int64(pMethod);
6047     if( iMethod!=0 && iMethod!=8 ){
6048       zErr = sqlite3_mprintf("illegal method value: %d", iMethod);
6049       rc = SQLITE_ERROR;
6050       goto zipfile_step_out;
6051     }
6052   }
6053 
6054   /* Now inspect the data. If this is NULL, then the new entry must be a
6055   ** directory.  Otherwise, figure out whether or not the data should
6056   ** be deflated or simply stored in the zip archive. */
6057   if( sqlite3_value_type(pData)==SQLITE_NULL ){
6058     bIsDir = 1;
6059     iMethod = 0;
6060   }else{
6061     aData = sqlite3_value_blob(pData);
6062     szUncompressed = nData = sqlite3_value_bytes(pData);
6063     iCrc32 = crc32(0, aData, nData);
6064     if( iMethod<0 || iMethod==8 ){
6065       int nOut = 0;
6066       rc = zipfileDeflate(aData, nData, &aFree, &nOut, &zErr);
6067       if( rc!=SQLITE_OK ){
6068         goto zipfile_step_out;
6069       }
6070       if( iMethod==8 || nOut<nData ){
6071         aData = aFree;
6072         nData = nOut;
6073         iMethod = 8;
6074       }else{
6075         iMethod = 0;
6076       }
6077     }
6078   }
6079 
6080   /* Decode the "mode" argument. */
6081   rc = zipfileGetMode(pMode, bIsDir, &mode, &zErr);
6082   if( rc ) goto zipfile_step_out;
6083 
6084   /* Decode the "mtime" argument. */
6085   e.mUnixTime = zipfileGetTime(pMtime);
6086 
6087   /* If this is a directory entry, ensure that there is exactly one '/'
6088   ** at the end of the path. Or, if this is not a directory and the path
6089   ** ends in '/' it is an error. */
6090   if( bIsDir==0 ){
6091     if( zName[nName-1]=='/' ){
6092       zErr = sqlite3_mprintf("non-directory name must not end with /");
6093       rc = SQLITE_ERROR;
6094       goto zipfile_step_out;
6095     }
6096   }else{
6097     if( zName[nName-1]!='/' ){
6098       zName = zFree = sqlite3_mprintf("%s/", zName);
6099       nName++;
6100       if( zName==0 ){
6101         rc = SQLITE_NOMEM;
6102         goto zipfile_step_out;
6103       }
6104     }else{
6105       while( nName>1 && zName[nName-2]=='/' ) nName--;
6106     }
6107   }
6108 
6109   /* Assemble the ZipfileEntry object for the new zip archive entry */
6110   e.cds.iVersionMadeBy = ZIPFILE_NEWENTRY_MADEBY;
6111   e.cds.iVersionExtract = ZIPFILE_NEWENTRY_REQUIRED;
6112   e.cds.flags = ZIPFILE_NEWENTRY_FLAGS;
6113   e.cds.iCompression = (u16)iMethod;
6114   zipfileMtimeToDos(&e.cds, (u32)e.mUnixTime);
6115   e.cds.crc32 = iCrc32;
6116   e.cds.szCompressed = nData;
6117   e.cds.szUncompressed = szUncompressed;
6118   e.cds.iExternalAttr = (mode<<16);
6119   e.cds.iOffset = p->body.n;
6120   e.cds.nFile = (u16)nName;
6121   e.cds.zFile = zName;
6122 
6123   /* Append the LFH to the body of the new archive */
6124   nByte = ZIPFILE_LFH_FIXED_SZ + e.cds.nFile + 9;
6125   if( (rc = zipfileBufferGrow(&p->body, nByte)) ) goto zipfile_step_out;
6126   p->body.n += zipfileSerializeLFH(&e, &p->body.a[p->body.n]);
6127 
6128   /* Append the data to the body of the new archive */
6129   if( nData>0 ){
6130     if( (rc = zipfileBufferGrow(&p->body, nData)) ) goto zipfile_step_out;
6131     memcpy(&p->body.a[p->body.n], aData, nData);
6132     p->body.n += nData;
6133   }
6134 
6135   /* Append the CDS record to the directory of the new archive */
6136   nByte = ZIPFILE_CDS_FIXED_SZ + e.cds.nFile + 9;
6137   if( (rc = zipfileBufferGrow(&p->cds, nByte)) ) goto zipfile_step_out;
6138   p->cds.n += zipfileSerializeCDS(&e, &p->cds.a[p->cds.n]);
6139 
6140   /* Increment the count of entries in the archive */
6141   p->nEntry++;
6142 
6143  zipfile_step_out:
6144   sqlite3_free(aFree);
6145   sqlite3_free(zFree);
6146   if( rc ){
6147     if( zErr ){
6148       sqlite3_result_error(pCtx, zErr, -1);
6149     }else{
6150       sqlite3_result_error_code(pCtx, rc);
6151     }
6152   }
6153   sqlite3_free(zErr);
6154 }
6155 
6156 /*
6157 ** xFinalize() callback for zipfile aggregate function.
6158 */
zipfileFinal(sqlite3_context * pCtx)6159 void zipfileFinal(sqlite3_context *pCtx){
6160   ZipfileCtx *p;
6161   ZipfileEOCD eocd;
6162   int nZip;
6163   u8 *aZip;
6164 
6165   p = (ZipfileCtx*)sqlite3_aggregate_context(pCtx, sizeof(ZipfileCtx));
6166   if( p==0 ) return;
6167   if( p->nEntry>0 ){
6168     memset(&eocd, 0, sizeof(eocd));
6169     eocd.nEntry = (u16)p->nEntry;
6170     eocd.nEntryTotal = (u16)p->nEntry;
6171     eocd.nSize = p->cds.n;
6172     eocd.iOffset = p->body.n;
6173 
6174     nZip = p->body.n + p->cds.n + ZIPFILE_EOCD_FIXED_SZ;
6175     aZip = (u8*)sqlite3_malloc(nZip);
6176     if( aZip==0 ){
6177       sqlite3_result_error_nomem(pCtx);
6178     }else{
6179       memcpy(aZip, p->body.a, p->body.n);
6180       memcpy(&aZip[p->body.n], p->cds.a, p->cds.n);
6181       zipfileSerializeEOCD(&eocd, &aZip[p->body.n + p->cds.n]);
6182       sqlite3_result_blob(pCtx, aZip, nZip, zipfileFree);
6183     }
6184   }
6185 
6186   sqlite3_free(p->body.a);
6187   sqlite3_free(p->cds.a);
6188 }
6189 
6190 
6191 /*
6192 ** Register the "zipfile" virtual table.
6193 */
zipfileRegister(sqlite3 * db)6194 static int zipfileRegister(sqlite3 *db){
6195   static sqlite3_module zipfileModule = {
6196     1,                         /* iVersion */
6197     zipfileConnect,            /* xCreate */
6198     zipfileConnect,            /* xConnect */
6199     zipfileBestIndex,          /* xBestIndex */
6200     zipfileDisconnect,         /* xDisconnect */
6201     zipfileDisconnect,         /* xDestroy */
6202     zipfileOpen,               /* xOpen - open a cursor */
6203     zipfileClose,              /* xClose - close a cursor */
6204     zipfileFilter,             /* xFilter - configure scan constraints */
6205     zipfileNext,               /* xNext - advance a cursor */
6206     zipfileEof,                /* xEof - check for end of scan */
6207     zipfileColumn,             /* xColumn - read data */
6208     0,                         /* xRowid - read data */
6209     zipfileUpdate,             /* xUpdate */
6210     zipfileBegin,              /* xBegin */
6211     0,                         /* xSync */
6212     zipfileCommit,             /* xCommit */
6213     zipfileRollback,           /* xRollback */
6214     zipfileFindFunction,       /* xFindMethod */
6215     0,                         /* xRename */
6216   };
6217 
6218   int rc = sqlite3_create_module(db, "zipfile"  , &zipfileModule, 0);
6219   if( rc==SQLITE_OK ) rc = sqlite3_overload_function(db, "zipfile_cds", -1);
6220   if( rc==SQLITE_OK ){
6221     rc = sqlite3_create_function(db, "zipfile", -1, SQLITE_UTF8, 0, 0,
6222         zipfileStep, zipfileFinal
6223     );
6224   }
6225   return rc;
6226 }
6227 #else         /* SQLITE_OMIT_VIRTUALTABLE */
6228 # define zipfileRegister(x) SQLITE_OK
6229 #endif
6230 
6231 #ifdef _WIN32
6232 
6233 #endif
sqlite3_zipfile_init(sqlite3 * db,char ** pzErrMsg,const sqlite3_api_routines * pApi)6234 int sqlite3_zipfile_init(
6235   sqlite3 *db,
6236   char **pzErrMsg,
6237   const sqlite3_api_routines *pApi
6238 ){
6239   SQLITE_EXTENSION_INIT2(pApi);
6240   (void)pzErrMsg;  /* Unused parameter */
6241   return zipfileRegister(db);
6242 }
6243 
6244 /************************* End ../ext/misc/zipfile.c ********************/
6245 /************************* Begin ../ext/misc/sqlar.c ******************/
6246 /*
6247 ** 2017-12-17
6248 **
6249 ** The author disclaims copyright to this source code.  In place of
6250 ** a legal notice, here is a blessing:
6251 **
6252 **    May you do good and not evil.
6253 **    May you find forgiveness for yourself and forgive others.
6254 **    May you share freely, never taking more than you give.
6255 **
6256 ******************************************************************************
6257 **
6258 ** Utility functions sqlar_compress() and sqlar_uncompress(). Useful
6259 ** for working with sqlar archives and used by the shell tool's built-in
6260 ** sqlar support.
6261 */
6262 SQLITE_EXTENSION_INIT1
6263 #include <zlib.h>
6264 
6265 /*
6266 ** Implementation of the "sqlar_compress(X)" SQL function.
6267 **
6268 ** If the type of X is SQLITE_BLOB, and compressing that blob using
6269 ** zlib utility function compress() yields a smaller blob, return the
6270 ** compressed blob. Otherwise, return a copy of X.
6271 **
6272 ** SQLar uses the "zlib format" for compressed content.  The zlib format
6273 ** contains a two-byte identification header and a four-byte checksum at
6274 ** the end.  This is different from ZIP which uses the raw deflate format.
6275 **
6276 ** Future enhancements to SQLar might add support for new compression formats.
6277 ** If so, those new formats will be identified by alternative headers in the
6278 ** compressed data.
6279 */
sqlarCompressFunc(sqlite3_context * context,int argc,sqlite3_value ** argv)6280 static void sqlarCompressFunc(
6281   sqlite3_context *context,
6282   int argc,
6283   sqlite3_value **argv
6284 ){
6285   assert( argc==1 );
6286   if( sqlite3_value_type(argv[0])==SQLITE_BLOB ){
6287     const Bytef *pData = sqlite3_value_blob(argv[0]);
6288     uLong nData = sqlite3_value_bytes(argv[0]);
6289     uLongf nOut = compressBound(nData);
6290     Bytef *pOut;
6291 
6292     pOut = (Bytef*)sqlite3_malloc(nOut);
6293     if( pOut==0 ){
6294       sqlite3_result_error_nomem(context);
6295       return;
6296     }else{
6297       if( Z_OK!=compress(pOut, &nOut, pData, nData) ){
6298         sqlite3_result_error(context, "error in compress()", -1);
6299       }else if( nOut<nData ){
6300         sqlite3_result_blob(context, pOut, nOut, SQLITE_TRANSIENT);
6301       }else{
6302         sqlite3_result_value(context, argv[0]);
6303       }
6304       sqlite3_free(pOut);
6305     }
6306   }else{
6307     sqlite3_result_value(context, argv[0]);
6308   }
6309 }
6310 
6311 /*
6312 ** Implementation of the "sqlar_uncompress(X,SZ)" SQL function
6313 **
6314 ** Parameter SZ is interpreted as an integer. If it is less than or
6315 ** equal to zero, then this function returns a copy of X. Or, if
6316 ** SZ is equal to the size of X when interpreted as a blob, also
6317 ** return a copy of X. Otherwise, decompress blob X using zlib
6318 ** utility function uncompress() and return the results (another
6319 ** blob).
6320 */
sqlarUncompressFunc(sqlite3_context * context,int argc,sqlite3_value ** argv)6321 static void sqlarUncompressFunc(
6322   sqlite3_context *context,
6323   int argc,
6324   sqlite3_value **argv
6325 ){
6326   uLong nData;
6327   uLongf sz;
6328 
6329   assert( argc==2 );
6330   sz = sqlite3_value_int(argv[1]);
6331 
6332   if( sz<=0 || sz==(nData = sqlite3_value_bytes(argv[0])) ){
6333     sqlite3_result_value(context, argv[0]);
6334   }else{
6335     const Bytef *pData= sqlite3_value_blob(argv[0]);
6336     Bytef *pOut = sqlite3_malloc(sz);
6337     if( Z_OK!=uncompress(pOut, &sz, pData, nData) ){
6338       sqlite3_result_error(context, "error in uncompress()", -1);
6339     }else{
6340       sqlite3_result_blob(context, pOut, sz, SQLITE_TRANSIENT);
6341     }
6342     sqlite3_free(pOut);
6343   }
6344 }
6345 
6346 
6347 #ifdef _WIN32
6348 
6349 #endif
sqlite3_sqlar_init(sqlite3 * db,char ** pzErrMsg,const sqlite3_api_routines * pApi)6350 int sqlite3_sqlar_init(
6351   sqlite3 *db,
6352   char **pzErrMsg,
6353   const sqlite3_api_routines *pApi
6354 ){
6355   int rc = SQLITE_OK;
6356   SQLITE_EXTENSION_INIT2(pApi);
6357   (void)pzErrMsg;  /* Unused parameter */
6358   rc = sqlite3_create_function(db, "sqlar_compress", 1, SQLITE_UTF8, 0,
6359                                sqlarCompressFunc, 0, 0);
6360   if( rc==SQLITE_OK ){
6361     rc = sqlite3_create_function(db, "sqlar_uncompress", 2, SQLITE_UTF8, 0,
6362                                  sqlarUncompressFunc, 0, 0);
6363   }
6364   return rc;
6365 }
6366 
6367 /************************* End ../ext/misc/sqlar.c ********************/
6368 #endif
6369 /************************* Begin ../ext/expert/sqlite3expert.h ******************/
6370 /*
6371 ** 2017 April 07
6372 **
6373 ** The author disclaims copyright to this source code.  In place of
6374 ** a legal notice, here is a blessing:
6375 **
6376 **    May you do good and not evil.
6377 **    May you find forgiveness for yourself and forgive others.
6378 **    May you share freely, never taking more than you give.
6379 **
6380 *************************************************************************
6381 */
6382 
6383 
6384 
6385 typedef struct sqlite3expert sqlite3expert;
6386 
6387 /*
6388 ** Create a new sqlite3expert object.
6389 **
6390 ** If successful, a pointer to the new object is returned and (*pzErr) set
6391 ** to NULL. Or, if an error occurs, NULL is returned and (*pzErr) set to
6392 ** an English-language error message. In this case it is the responsibility
6393 ** of the caller to eventually free the error message buffer using
6394 ** sqlite3_free().
6395 */
6396 sqlite3expert *sqlite3_expert_new(sqlite3 *db, char **pzErr);
6397 
6398 /*
6399 ** Configure an sqlite3expert object.
6400 **
6401 ** EXPERT_CONFIG_SAMPLE:
6402 **   By default, sqlite3_expert_analyze() generates sqlite_stat1 data for
6403 **   each candidate index. This involves scanning and sorting the entire
6404 **   contents of each user database table once for each candidate index
6405 **   associated with the table. For large databases, this can be
6406 **   prohibitively slow. This option allows the sqlite3expert object to
6407 **   be configured so that sqlite_stat1 data is instead generated based on a
6408 **   subset of each table, or so that no sqlite_stat1 data is used at all.
6409 **
6410 **   A single integer argument is passed to this option. If the value is less
6411 **   than or equal to zero, then no sqlite_stat1 data is generated or used by
6412 **   the analysis - indexes are recommended based on the database schema only.
6413 **   Or, if the value is 100 or greater, complete sqlite_stat1 data is
6414 **   generated for each candidate index (this is the default). Finally, if the
6415 **   value falls between 0 and 100, then it represents the percentage of user
6416 **   table rows that should be considered when generating sqlite_stat1 data.
6417 **
6418 **   Examples:
6419 **
6420 **     // Do not generate any sqlite_stat1 data
6421 **     sqlite3_expert_config(pExpert, EXPERT_CONFIG_SAMPLE, 0);
6422 **
6423 **     // Generate sqlite_stat1 data based on 10% of the rows in each table.
6424 **     sqlite3_expert_config(pExpert, EXPERT_CONFIG_SAMPLE, 10);
6425 */
6426 int sqlite3_expert_config(sqlite3expert *p, int op, ...);
6427 
6428 #define EXPERT_CONFIG_SAMPLE 1    /* int */
6429 
6430 /*
6431 ** Specify zero or more SQL statements to be included in the analysis.
6432 **
6433 ** Buffer zSql must contain zero or more complete SQL statements. This
6434 ** function parses all statements contained in the buffer and adds them
6435 ** to the internal list of statements to analyze. If successful, SQLITE_OK
6436 ** is returned and (*pzErr) set to NULL. Or, if an error occurs - for example
6437 ** due to a error in the SQL - an SQLite error code is returned and (*pzErr)
6438 ** may be set to point to an English language error message. In this case
6439 ** the caller is responsible for eventually freeing the error message buffer
6440 ** using sqlite3_free().
6441 **
6442 ** If an error does occur while processing one of the statements in the
6443 ** buffer passed as the second argument, none of the statements in the
6444 ** buffer are added to the analysis.
6445 **
6446 ** This function must be called before sqlite3_expert_analyze(). If a call
6447 ** to this function is made on an sqlite3expert object that has already
6448 ** been passed to sqlite3_expert_analyze() SQLITE_MISUSE is returned
6449 ** immediately and no statements are added to the analysis.
6450 */
6451 int sqlite3_expert_sql(
6452   sqlite3expert *p,               /* From a successful sqlite3_expert_new() */
6453   const char *zSql,               /* SQL statement(s) to add */
6454   char **pzErr                    /* OUT: Error message (if any) */
6455 );
6456 
6457 
6458 /*
6459 ** This function is called after the sqlite3expert object has been configured
6460 ** with all SQL statements using sqlite3_expert_sql() to actually perform
6461 ** the analysis. Once this function has been called, it is not possible to
6462 ** add further SQL statements to the analysis.
6463 **
6464 ** If successful, SQLITE_OK is returned and (*pzErr) is set to NULL. Or, if
6465 ** an error occurs, an SQLite error code is returned and (*pzErr) set to
6466 ** point to a buffer containing an English language error message. In this
6467 ** case it is the responsibility of the caller to eventually free the buffer
6468 ** using sqlite3_free().
6469 **
6470 ** If an error does occur within this function, the sqlite3expert object
6471 ** is no longer useful for any purpose. At that point it is no longer
6472 ** possible to add further SQL statements to the object or to re-attempt
6473 ** the analysis. The sqlite3expert object must still be freed using a call
6474 ** sqlite3_expert_destroy().
6475 */
6476 int sqlite3_expert_analyze(sqlite3expert *p, char **pzErr);
6477 
6478 /*
6479 ** Return the total number of statements loaded using sqlite3_expert_sql().
6480 ** The total number of SQL statements may be different from the total number
6481 ** to calls to sqlite3_expert_sql().
6482 */
6483 int sqlite3_expert_count(sqlite3expert*);
6484 
6485 /*
6486 ** Return a component of the report.
6487 **
6488 ** This function is called after sqlite3_expert_analyze() to extract the
6489 ** results of the analysis. Each call to this function returns either a
6490 ** NULL pointer or a pointer to a buffer containing a nul-terminated string.
6491 ** The value passed as the third argument must be one of the EXPERT_REPORT_*
6492 ** #define constants defined below.
6493 **
6494 ** For some EXPERT_REPORT_* parameters, the buffer returned contains
6495 ** information relating to a specific SQL statement. In these cases that
6496 ** SQL statement is identified by the value passed as the second argument.
6497 ** SQL statements are numbered from 0 in the order in which they are parsed.
6498 ** If an out-of-range value (less than zero or equal to or greater than the
6499 ** value returned by sqlite3_expert_count()) is passed as the second argument
6500 ** along with such an EXPERT_REPORT_* parameter, NULL is always returned.
6501 **
6502 ** EXPERT_REPORT_SQL:
6503 **   Return the text of SQL statement iStmt.
6504 **
6505 ** EXPERT_REPORT_INDEXES:
6506 **   Return a buffer containing the CREATE INDEX statements for all recommended
6507 **   indexes for statement iStmt. If there are no new recommeded indexes, NULL
6508 **   is returned.
6509 **
6510 ** EXPERT_REPORT_PLAN:
6511 **   Return a buffer containing the EXPLAIN QUERY PLAN output for SQL query
6512 **   iStmt after the proposed indexes have been added to the database schema.
6513 **
6514 ** EXPERT_REPORT_CANDIDATES:
6515 **   Return a pointer to a buffer containing the CREATE INDEX statements
6516 **   for all indexes that were tested (for all SQL statements). The iStmt
6517 **   parameter is ignored for EXPERT_REPORT_CANDIDATES calls.
6518 */
6519 const char *sqlite3_expert_report(sqlite3expert*, int iStmt, int eReport);
6520 
6521 /*
6522 ** Values for the third argument passed to sqlite3_expert_report().
6523 */
6524 #define EXPERT_REPORT_SQL        1
6525 #define EXPERT_REPORT_INDEXES    2
6526 #define EXPERT_REPORT_PLAN       3
6527 #define EXPERT_REPORT_CANDIDATES 4
6528 
6529 /*
6530 ** Free an (sqlite3expert*) handle and all associated resources. There
6531 ** should be one call to this function for each successful call to
6532 ** sqlite3-expert_new().
6533 */
6534 void sqlite3_expert_destroy(sqlite3expert*);
6535 
6536 
6537 
6538 /************************* End ../ext/expert/sqlite3expert.h ********************/
6539 /************************* Begin ../ext/expert/sqlite3expert.c ******************/
6540 /*
6541 ** 2017 April 09
6542 **
6543 ** The author disclaims copyright to this source code.  In place of
6544 ** a legal notice, here is a blessing:
6545 **
6546 **    May you do good and not evil.
6547 **    May you find forgiveness for yourself and forgive others.
6548 **    May you share freely, never taking more than you give.
6549 **
6550 *************************************************************************
6551 */
6552 #include <assert.h>
6553 #include <string.h>
6554 #include <stdio.h>
6555 
6556 #ifndef SQLITE_OMIT_VIRTUALTABLE
6557 
6558 /* typedef sqlite3_int64 i64; */
6559 /* typedef sqlite3_uint64 u64; */
6560 
6561 typedef struct IdxColumn IdxColumn;
6562 typedef struct IdxConstraint IdxConstraint;
6563 typedef struct IdxScan IdxScan;
6564 typedef struct IdxStatement IdxStatement;
6565 typedef struct IdxTable IdxTable;
6566 typedef struct IdxWrite IdxWrite;
6567 
6568 #define STRLEN  (int)strlen
6569 
6570 /*
6571 ** A temp table name that we assume no user database will actually use.
6572 ** If this assumption proves incorrect triggers on the table with the
6573 ** conflicting name will be ignored.
6574 */
6575 #define UNIQUE_TABLE_NAME "t592690916721053953805701627921227776"
6576 
6577 /*
6578 ** A single constraint. Equivalent to either "col = ?" or "col < ?" (or
6579 ** any other type of single-ended range constraint on a column).
6580 **
6581 ** pLink:
6582 **   Used to temporarily link IdxConstraint objects into lists while
6583 **   creating candidate indexes.
6584 */
6585 struct IdxConstraint {
6586   char *zColl;                    /* Collation sequence */
6587   int bRange;                     /* True for range, false for eq */
6588   int iCol;                       /* Constrained table column */
6589   int bFlag;                      /* Used by idxFindCompatible() */
6590   int bDesc;                      /* True if ORDER BY <expr> DESC */
6591   IdxConstraint *pNext;           /* Next constraint in pEq or pRange list */
6592   IdxConstraint *pLink;           /* See above */
6593 };
6594 
6595 /*
6596 ** A single scan of a single table.
6597 */
6598 struct IdxScan {
6599   IdxTable *pTab;                 /* Associated table object */
6600   int iDb;                        /* Database containing table zTable */
6601   i64 covering;                   /* Mask of columns required for cov. index */
6602   IdxConstraint *pOrder;          /* ORDER BY columns */
6603   IdxConstraint *pEq;             /* List of == constraints */
6604   IdxConstraint *pRange;          /* List of < constraints */
6605   IdxScan *pNextScan;             /* Next IdxScan object for same analysis */
6606 };
6607 
6608 /*
6609 ** Information regarding a single database table. Extracted from
6610 ** "PRAGMA table_info" by function idxGetTableInfo().
6611 */
6612 struct IdxColumn {
6613   char *zName;
6614   char *zColl;
6615   int iPk;
6616 };
6617 struct IdxTable {
6618   int nCol;
6619   char *zName;                    /* Table name */
6620   IdxColumn *aCol;
6621   IdxTable *pNext;                /* Next table in linked list of all tables */
6622 };
6623 
6624 /*
6625 ** An object of the following type is created for each unique table/write-op
6626 ** seen. The objects are stored in a singly-linked list beginning at
6627 ** sqlite3expert.pWrite.
6628 */
6629 struct IdxWrite {
6630   IdxTable *pTab;
6631   int eOp;                        /* SQLITE_UPDATE, DELETE or INSERT */
6632   IdxWrite *pNext;
6633 };
6634 
6635 /*
6636 ** Each statement being analyzed is represented by an instance of this
6637 ** structure.
6638 */
6639 struct IdxStatement {
6640   int iId;                        /* Statement number */
6641   char *zSql;                     /* SQL statement */
6642   char *zIdx;                     /* Indexes */
6643   char *zEQP;                     /* Plan */
6644   IdxStatement *pNext;
6645 };
6646 
6647 
6648 /*
6649 ** A hash table for storing strings. With space for a payload string
6650 ** with each entry. Methods are:
6651 **
6652 **   idxHashInit()
6653 **   idxHashClear()
6654 **   idxHashAdd()
6655 **   idxHashSearch()
6656 */
6657 #define IDX_HASH_SIZE 1023
6658 typedef struct IdxHashEntry IdxHashEntry;
6659 typedef struct IdxHash IdxHash;
6660 struct IdxHashEntry {
6661   char *zKey;                     /* nul-terminated key */
6662   char *zVal;                     /* nul-terminated value string */
6663   char *zVal2;                    /* nul-terminated value string 2 */
6664   IdxHashEntry *pHashNext;        /* Next entry in same hash bucket */
6665   IdxHashEntry *pNext;            /* Next entry in hash */
6666 };
6667 struct IdxHash {
6668   IdxHashEntry *pFirst;
6669   IdxHashEntry *aHash[IDX_HASH_SIZE];
6670 };
6671 
6672 /*
6673 ** sqlite3expert object.
6674 */
6675 struct sqlite3expert {
6676   int iSample;                    /* Percentage of tables to sample for stat1 */
6677   sqlite3 *db;                    /* User database */
6678   sqlite3 *dbm;                   /* In-memory db for this analysis */
6679   sqlite3 *dbv;                   /* Vtab schema for this analysis */
6680   IdxTable *pTable;               /* List of all IdxTable objects */
6681   IdxScan *pScan;                 /* List of scan objects */
6682   IdxWrite *pWrite;               /* List of write objects */
6683   IdxStatement *pStatement;       /* List of IdxStatement objects */
6684   int bRun;                       /* True once analysis has run */
6685   char **pzErrmsg;
6686   int rc;                         /* Error code from whereinfo hook */
6687   IdxHash hIdx;                   /* Hash containing all candidate indexes */
6688   char *zCandidates;              /* For EXPERT_REPORT_CANDIDATES */
6689 };
6690 
6691 
6692 /*
6693 ** Allocate and return nByte bytes of zeroed memory using sqlite3_malloc().
6694 ** If the allocation fails, set *pRc to SQLITE_NOMEM and return NULL.
6695 */
idxMalloc(int * pRc,int nByte)6696 static void *idxMalloc(int *pRc, int nByte){
6697   void *pRet;
6698   assert( *pRc==SQLITE_OK );
6699   assert( nByte>0 );
6700   pRet = sqlite3_malloc(nByte);
6701   if( pRet ){
6702     memset(pRet, 0, nByte);
6703   }else{
6704     *pRc = SQLITE_NOMEM;
6705   }
6706   return pRet;
6707 }
6708 
6709 /*
6710 ** Initialize an IdxHash hash table.
6711 */
idxHashInit(IdxHash * pHash)6712 static void idxHashInit(IdxHash *pHash){
6713   memset(pHash, 0, sizeof(IdxHash));
6714 }
6715 
6716 /*
6717 ** Reset an IdxHash hash table.
6718 */
idxHashClear(IdxHash * pHash)6719 static void idxHashClear(IdxHash *pHash){
6720   int i;
6721   for(i=0; i<IDX_HASH_SIZE; i++){
6722     IdxHashEntry *pEntry;
6723     IdxHashEntry *pNext;
6724     for(pEntry=pHash->aHash[i]; pEntry; pEntry=pNext){
6725       pNext = pEntry->pHashNext;
6726       sqlite3_free(pEntry->zVal2);
6727       sqlite3_free(pEntry);
6728     }
6729   }
6730   memset(pHash, 0, sizeof(IdxHash));
6731 }
6732 
6733 /*
6734 ** Return the index of the hash bucket that the string specified by the
6735 ** arguments to this function belongs.
6736 */
idxHashString(const char * z,int n)6737 static int idxHashString(const char *z, int n){
6738   unsigned int ret = 0;
6739   int i;
6740   for(i=0; i<n; i++){
6741     ret += (ret<<3) + (unsigned char)(z[i]);
6742   }
6743   return (int)(ret % IDX_HASH_SIZE);
6744 }
6745 
6746 /*
6747 ** If zKey is already present in the hash table, return non-zero and do
6748 ** nothing. Otherwise, add an entry with key zKey and payload string zVal to
6749 ** the hash table passed as the second argument.
6750 */
idxHashAdd(int * pRc,IdxHash * pHash,const char * zKey,const char * zVal)6751 static int idxHashAdd(
6752   int *pRc,
6753   IdxHash *pHash,
6754   const char *zKey,
6755   const char *zVal
6756 ){
6757   int nKey = STRLEN(zKey);
6758   int iHash = idxHashString(zKey, nKey);
6759   int nVal = (zVal ? STRLEN(zVal) : 0);
6760   IdxHashEntry *pEntry;
6761   assert( iHash>=0 );
6762   for(pEntry=pHash->aHash[iHash]; pEntry; pEntry=pEntry->pHashNext){
6763     if( STRLEN(pEntry->zKey)==nKey && 0==memcmp(pEntry->zKey, zKey, nKey) ){
6764       return 1;
6765     }
6766   }
6767   pEntry = idxMalloc(pRc, sizeof(IdxHashEntry) + nKey+1 + nVal+1);
6768   if( pEntry ){
6769     pEntry->zKey = (char*)&pEntry[1];
6770     memcpy(pEntry->zKey, zKey, nKey);
6771     if( zVal ){
6772       pEntry->zVal = &pEntry->zKey[nKey+1];
6773       memcpy(pEntry->zVal, zVal, nVal);
6774     }
6775     pEntry->pHashNext = pHash->aHash[iHash];
6776     pHash->aHash[iHash] = pEntry;
6777 
6778     pEntry->pNext = pHash->pFirst;
6779     pHash->pFirst = pEntry;
6780   }
6781   return 0;
6782 }
6783 
6784 /*
6785 ** If zKey/nKey is present in the hash table, return a pointer to the
6786 ** hash-entry object.
6787 */
idxHashFind(IdxHash * pHash,const char * zKey,int nKey)6788 static IdxHashEntry *idxHashFind(IdxHash *pHash, const char *zKey, int nKey){
6789   int iHash;
6790   IdxHashEntry *pEntry;
6791   if( nKey<0 ) nKey = STRLEN(zKey);
6792   iHash = idxHashString(zKey, nKey);
6793   assert( iHash>=0 );
6794   for(pEntry=pHash->aHash[iHash]; pEntry; pEntry=pEntry->pHashNext){
6795     if( STRLEN(pEntry->zKey)==nKey && 0==memcmp(pEntry->zKey, zKey, nKey) ){
6796       return pEntry;
6797     }
6798   }
6799   return 0;
6800 }
6801 
6802 /*
6803 ** If the hash table contains an entry with a key equal to the string
6804 ** passed as the final two arguments to this function, return a pointer
6805 ** to the payload string. Otherwise, if zKey/nKey is not present in the
6806 ** hash table, return NULL.
6807 */
idxHashSearch(IdxHash * pHash,const char * zKey,int nKey)6808 static const char *idxHashSearch(IdxHash *pHash, const char *zKey, int nKey){
6809   IdxHashEntry *pEntry = idxHashFind(pHash, zKey, nKey);
6810   if( pEntry ) return pEntry->zVal;
6811   return 0;
6812 }
6813 
6814 /*
6815 ** Allocate and return a new IdxConstraint object. Set the IdxConstraint.zColl
6816 ** variable to point to a copy of nul-terminated string zColl.
6817 */
idxNewConstraint(int * pRc,const char * zColl)6818 static IdxConstraint *idxNewConstraint(int *pRc, const char *zColl){
6819   IdxConstraint *pNew;
6820   int nColl = STRLEN(zColl);
6821 
6822   assert( *pRc==SQLITE_OK );
6823   pNew = (IdxConstraint*)idxMalloc(pRc, sizeof(IdxConstraint) * nColl + 1);
6824   if( pNew ){
6825     pNew->zColl = (char*)&pNew[1];
6826     memcpy(pNew->zColl, zColl, nColl+1);
6827   }
6828   return pNew;
6829 }
6830 
6831 /*
6832 ** An error associated with database handle db has just occurred. Pass
6833 ** the error message to callback function xOut.
6834 */
idxDatabaseError(sqlite3 * db,char ** pzErrmsg)6835 static void idxDatabaseError(
6836   sqlite3 *db,                    /* Database handle */
6837   char **pzErrmsg                 /* Write error here */
6838 ){
6839   *pzErrmsg = sqlite3_mprintf("%s", sqlite3_errmsg(db));
6840 }
6841 
6842 /*
6843 ** Prepare an SQL statement.
6844 */
idxPrepareStmt(sqlite3 * db,sqlite3_stmt ** ppStmt,char ** pzErrmsg,const char * zSql)6845 static int idxPrepareStmt(
6846   sqlite3 *db,                    /* Database handle to compile against */
6847   sqlite3_stmt **ppStmt,          /* OUT: Compiled SQL statement */
6848   char **pzErrmsg,                /* OUT: sqlite3_malloc()ed error message */
6849   const char *zSql                /* SQL statement to compile */
6850 ){
6851   int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0);
6852   if( rc!=SQLITE_OK ){
6853     *ppStmt = 0;
6854     idxDatabaseError(db, pzErrmsg);
6855   }
6856   return rc;
6857 }
6858 
6859 /*
6860 ** Prepare an SQL statement using the results of a printf() formatting.
6861 */
idxPrintfPrepareStmt(sqlite3 * db,sqlite3_stmt ** ppStmt,char ** pzErrmsg,const char * zFmt,...)6862 static int idxPrintfPrepareStmt(
6863   sqlite3 *db,                    /* Database handle to compile against */
6864   sqlite3_stmt **ppStmt,          /* OUT: Compiled SQL statement */
6865   char **pzErrmsg,                /* OUT: sqlite3_malloc()ed error message */
6866   const char *zFmt,               /* printf() format of SQL statement */
6867   ...                             /* Trailing printf() arguments */
6868 ){
6869   va_list ap;
6870   int rc;
6871   char *zSql;
6872   va_start(ap, zFmt);
6873   zSql = sqlite3_vmprintf(zFmt, ap);
6874   if( zSql==0 ){
6875     rc = SQLITE_NOMEM;
6876   }else{
6877     rc = idxPrepareStmt(db, ppStmt, pzErrmsg, zSql);
6878     sqlite3_free(zSql);
6879   }
6880   va_end(ap);
6881   return rc;
6882 }
6883 
6884 
6885 /*************************************************************************
6886 ** Beginning of virtual table implementation.
6887 */
6888 typedef struct ExpertVtab ExpertVtab;
6889 struct ExpertVtab {
6890   sqlite3_vtab base;
6891   IdxTable *pTab;
6892   sqlite3expert *pExpert;
6893 };
6894 
6895 typedef struct ExpertCsr ExpertCsr;
6896 struct ExpertCsr {
6897   sqlite3_vtab_cursor base;
6898   sqlite3_stmt *pData;
6899 };
6900 
expertDequote(const char * zIn)6901 static char *expertDequote(const char *zIn){
6902   int n = STRLEN(zIn);
6903   char *zRet = sqlite3_malloc(n);
6904 
6905   assert( zIn[0]=='\'' );
6906   assert( zIn[n-1]=='\'' );
6907 
6908   if( zRet ){
6909     int iOut = 0;
6910     int iIn = 0;
6911     for(iIn=1; iIn<(n-1); iIn++){
6912       if( zIn[iIn]=='\'' ){
6913         assert( zIn[iIn+1]=='\'' );
6914         iIn++;
6915       }
6916       zRet[iOut++] = zIn[iIn];
6917     }
6918     zRet[iOut] = '\0';
6919   }
6920 
6921   return zRet;
6922 }
6923 
6924 /*
6925 ** This function is the implementation of both the xConnect and xCreate
6926 ** methods of the r-tree virtual table.
6927 **
6928 **   argv[0]   -> module name
6929 **   argv[1]   -> database name
6930 **   argv[2]   -> table name
6931 **   argv[...] -> column names...
6932 */
expertConnect(sqlite3 * db,void * pAux,int argc,const char * const * argv,sqlite3_vtab ** ppVtab,char ** pzErr)6933 static int expertConnect(
6934   sqlite3 *db,
6935   void *pAux,
6936   int argc, const char *const*argv,
6937   sqlite3_vtab **ppVtab,
6938   char **pzErr
6939 ){
6940   sqlite3expert *pExpert = (sqlite3expert*)pAux;
6941   ExpertVtab *p = 0;
6942   int rc;
6943 
6944   if( argc!=4 ){
6945     *pzErr = sqlite3_mprintf("internal error!");
6946     rc = SQLITE_ERROR;
6947   }else{
6948     char *zCreateTable = expertDequote(argv[3]);
6949     if( zCreateTable ){
6950       rc = sqlite3_declare_vtab(db, zCreateTable);
6951       if( rc==SQLITE_OK ){
6952         p = idxMalloc(&rc, sizeof(ExpertVtab));
6953       }
6954       if( rc==SQLITE_OK ){
6955         p->pExpert = pExpert;
6956         p->pTab = pExpert->pTable;
6957         assert( sqlite3_stricmp(p->pTab->zName, argv[2])==0 );
6958       }
6959       sqlite3_free(zCreateTable);
6960     }else{
6961       rc = SQLITE_NOMEM;
6962     }
6963   }
6964 
6965   *ppVtab = (sqlite3_vtab*)p;
6966   return rc;
6967 }
6968 
expertDisconnect(sqlite3_vtab * pVtab)6969 static int expertDisconnect(sqlite3_vtab *pVtab){
6970   ExpertVtab *p = (ExpertVtab*)pVtab;
6971   sqlite3_free(p);
6972   return SQLITE_OK;
6973 }
6974 
expertBestIndex(sqlite3_vtab * pVtab,sqlite3_index_info * pIdxInfo)6975 static int expertBestIndex(sqlite3_vtab *pVtab, sqlite3_index_info *pIdxInfo){
6976   ExpertVtab *p = (ExpertVtab*)pVtab;
6977   int rc = SQLITE_OK;
6978   int n = 0;
6979   IdxScan *pScan;
6980   const int opmask =
6981     SQLITE_INDEX_CONSTRAINT_EQ | SQLITE_INDEX_CONSTRAINT_GT |
6982     SQLITE_INDEX_CONSTRAINT_LT | SQLITE_INDEX_CONSTRAINT_GE |
6983     SQLITE_INDEX_CONSTRAINT_LE;
6984 
6985   pScan = idxMalloc(&rc, sizeof(IdxScan));
6986   if( pScan ){
6987     int i;
6988 
6989     /* Link the new scan object into the list */
6990     pScan->pTab = p->pTab;
6991     pScan->pNextScan = p->pExpert->pScan;
6992     p->pExpert->pScan = pScan;
6993 
6994     /* Add the constraints to the IdxScan object */
6995     for(i=0; i<pIdxInfo->nConstraint; i++){
6996       struct sqlite3_index_constraint *pCons = &pIdxInfo->aConstraint[i];
6997       if( pCons->usable
6998        && pCons->iColumn>=0
6999        && p->pTab->aCol[pCons->iColumn].iPk==0
7000        && (pCons->op & opmask)
7001       ){
7002         IdxConstraint *pNew;
7003         const char *zColl = sqlite3_vtab_collation(pIdxInfo, i);
7004         pNew = idxNewConstraint(&rc, zColl);
7005         if( pNew ){
7006           pNew->iCol = pCons->iColumn;
7007           if( pCons->op==SQLITE_INDEX_CONSTRAINT_EQ ){
7008             pNew->pNext = pScan->pEq;
7009             pScan->pEq = pNew;
7010           }else{
7011             pNew->bRange = 1;
7012             pNew->pNext = pScan->pRange;
7013             pScan->pRange = pNew;
7014           }
7015         }
7016         n++;
7017         pIdxInfo->aConstraintUsage[i].argvIndex = n;
7018       }
7019     }
7020 
7021     /* Add the ORDER BY to the IdxScan object */
7022     for(i=pIdxInfo->nOrderBy-1; i>=0; i--){
7023       int iCol = pIdxInfo->aOrderBy[i].iColumn;
7024       if( iCol>=0 ){
7025         IdxConstraint *pNew = idxNewConstraint(&rc, p->pTab->aCol[iCol].zColl);
7026         if( pNew ){
7027           pNew->iCol = iCol;
7028           pNew->bDesc = pIdxInfo->aOrderBy[i].desc;
7029           pNew->pNext = pScan->pOrder;
7030           pNew->pLink = pScan->pOrder;
7031           pScan->pOrder = pNew;
7032           n++;
7033         }
7034       }
7035     }
7036   }
7037 
7038   pIdxInfo->estimatedCost = 1000000.0 / (n+1);
7039   return rc;
7040 }
7041 
expertUpdate(sqlite3_vtab * pVtab,int nData,sqlite3_value ** azData,sqlite_int64 * pRowid)7042 static int expertUpdate(
7043   sqlite3_vtab *pVtab,
7044   int nData,
7045   sqlite3_value **azData,
7046   sqlite_int64 *pRowid
7047 ){
7048   (void)pVtab;
7049   (void)nData;
7050   (void)azData;
7051   (void)pRowid;
7052   return SQLITE_OK;
7053 }
7054 
7055 /*
7056 ** Virtual table module xOpen method.
7057 */
expertOpen(sqlite3_vtab * pVTab,sqlite3_vtab_cursor ** ppCursor)7058 static int expertOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){
7059   int rc = SQLITE_OK;
7060   ExpertCsr *pCsr;
7061   (void)pVTab;
7062   pCsr = idxMalloc(&rc, sizeof(ExpertCsr));
7063   *ppCursor = (sqlite3_vtab_cursor*)pCsr;
7064   return rc;
7065 }
7066 
7067 /*
7068 ** Virtual table module xClose method.
7069 */
expertClose(sqlite3_vtab_cursor * cur)7070 static int expertClose(sqlite3_vtab_cursor *cur){
7071   ExpertCsr *pCsr = (ExpertCsr*)cur;
7072   sqlite3_finalize(pCsr->pData);
7073   sqlite3_free(pCsr);
7074   return SQLITE_OK;
7075 }
7076 
7077 /*
7078 ** Virtual table module xEof method.
7079 **
7080 ** Return non-zero if the cursor does not currently point to a valid
7081 ** record (i.e if the scan has finished), or zero otherwise.
7082 */
expertEof(sqlite3_vtab_cursor * cur)7083 static int expertEof(sqlite3_vtab_cursor *cur){
7084   ExpertCsr *pCsr = (ExpertCsr*)cur;
7085   return pCsr->pData==0;
7086 }
7087 
7088 /*
7089 ** Virtual table module xNext method.
7090 */
expertNext(sqlite3_vtab_cursor * cur)7091 static int expertNext(sqlite3_vtab_cursor *cur){
7092   ExpertCsr *pCsr = (ExpertCsr*)cur;
7093   int rc = SQLITE_OK;
7094 
7095   assert( pCsr->pData );
7096   rc = sqlite3_step(pCsr->pData);
7097   if( rc!=SQLITE_ROW ){
7098     rc = sqlite3_finalize(pCsr->pData);
7099     pCsr->pData = 0;
7100   }else{
7101     rc = SQLITE_OK;
7102   }
7103 
7104   return rc;
7105 }
7106 
7107 /*
7108 ** Virtual table module xRowid method.
7109 */
expertRowid(sqlite3_vtab_cursor * cur,sqlite_int64 * pRowid)7110 static int expertRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
7111   (void)cur;
7112   *pRowid = 0;
7113   return SQLITE_OK;
7114 }
7115 
7116 /*
7117 ** Virtual table module xColumn method.
7118 */
expertColumn(sqlite3_vtab_cursor * cur,sqlite3_context * ctx,int i)7119 static int expertColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){
7120   ExpertCsr *pCsr = (ExpertCsr*)cur;
7121   sqlite3_value *pVal;
7122   pVal = sqlite3_column_value(pCsr->pData, i);
7123   if( pVal ){
7124     sqlite3_result_value(ctx, pVal);
7125   }
7126   return SQLITE_OK;
7127 }
7128 
7129 /*
7130 ** Virtual table module xFilter method.
7131 */
expertFilter(sqlite3_vtab_cursor * cur,int idxNum,const char * idxStr,int argc,sqlite3_value ** argv)7132 static int expertFilter(
7133   sqlite3_vtab_cursor *cur,
7134   int idxNum, const char *idxStr,
7135   int argc, sqlite3_value **argv
7136 ){
7137   ExpertCsr *pCsr = (ExpertCsr*)cur;
7138   ExpertVtab *pVtab = (ExpertVtab*)(cur->pVtab);
7139   sqlite3expert *pExpert = pVtab->pExpert;
7140   int rc;
7141 
7142   (void)idxNum;
7143   (void)idxStr;
7144   (void)argc;
7145   (void)argv;
7146   rc = sqlite3_finalize(pCsr->pData);
7147   pCsr->pData = 0;
7148   if( rc==SQLITE_OK ){
7149     rc = idxPrintfPrepareStmt(pExpert->db, &pCsr->pData, &pVtab->base.zErrMsg,
7150         "SELECT * FROM main.%Q WHERE sample()", pVtab->pTab->zName
7151     );
7152   }
7153 
7154   if( rc==SQLITE_OK ){
7155     rc = expertNext(cur);
7156   }
7157   return rc;
7158 }
7159 
idxRegisterVtab(sqlite3expert * p)7160 static int idxRegisterVtab(sqlite3expert *p){
7161   static sqlite3_module expertModule = {
7162     2,                            /* iVersion */
7163     expertConnect,                /* xCreate - create a table */
7164     expertConnect,                /* xConnect - connect to an existing table */
7165     expertBestIndex,              /* xBestIndex - Determine search strategy */
7166     expertDisconnect,             /* xDisconnect - Disconnect from a table */
7167     expertDisconnect,             /* xDestroy - Drop a table */
7168     expertOpen,                   /* xOpen - open a cursor */
7169     expertClose,                  /* xClose - close a cursor */
7170     expertFilter,                 /* xFilter - configure scan constraints */
7171     expertNext,                   /* xNext - advance a cursor */
7172     expertEof,                    /* xEof */
7173     expertColumn,                 /* xColumn - read data */
7174     expertRowid,                  /* xRowid - read data */
7175     expertUpdate,                 /* xUpdate - write data */
7176     0,                            /* xBegin - begin transaction */
7177     0,                            /* xSync - sync transaction */
7178     0,                            /* xCommit - commit transaction */
7179     0,                            /* xRollback - rollback transaction */
7180     0,                            /* xFindFunction - function overloading */
7181     0,                            /* xRename - rename the table */
7182     0,                            /* xSavepoint */
7183     0,                            /* xRelease */
7184     0,                            /* xRollbackTo */
7185     0,                            /* xShadowName */
7186   };
7187 
7188   return sqlite3_create_module(p->dbv, "expert", &expertModule, (void*)p);
7189 }
7190 /*
7191 ** End of virtual table implementation.
7192 *************************************************************************/
7193 /*
7194 ** Finalize SQL statement pStmt. If (*pRc) is SQLITE_OK when this function
7195 ** is called, set it to the return value of sqlite3_finalize() before
7196 ** returning. Otherwise, discard the sqlite3_finalize() return value.
7197 */
idxFinalize(int * pRc,sqlite3_stmt * pStmt)7198 static void idxFinalize(int *pRc, sqlite3_stmt *pStmt){
7199   int rc = sqlite3_finalize(pStmt);
7200   if( *pRc==SQLITE_OK ) *pRc = rc;
7201 }
7202 
7203 /*
7204 ** Attempt to allocate an IdxTable structure corresponding to table zTab
7205 ** in the main database of connection db. If successful, set (*ppOut) to
7206 ** point to the new object and return SQLITE_OK. Otherwise, return an
7207 ** SQLite error code and set (*ppOut) to NULL. In this case *pzErrmsg may be
7208 ** set to point to an error string.
7209 **
7210 ** It is the responsibility of the caller to eventually free either the
7211 ** IdxTable object or error message using sqlite3_free().
7212 */
idxGetTableInfo(sqlite3 * db,const char * zTab,IdxTable ** ppOut,char ** pzErrmsg)7213 static int idxGetTableInfo(
7214   sqlite3 *db,                    /* Database connection to read details from */
7215   const char *zTab,               /* Table name */
7216   IdxTable **ppOut,               /* OUT: New object (if successful) */
7217   char **pzErrmsg                 /* OUT: Error message (if not) */
7218 ){
7219   sqlite3_stmt *p1 = 0;
7220   int nCol = 0;
7221   int nTab = STRLEN(zTab);
7222   int nByte = sizeof(IdxTable) + nTab + 1;
7223   IdxTable *pNew = 0;
7224   int rc, rc2;
7225   char *pCsr = 0;
7226 
7227   rc = idxPrintfPrepareStmt(db, &p1, pzErrmsg, "PRAGMA table_info=%Q", zTab);
7228   while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(p1) ){
7229     const char *zCol = (const char*)sqlite3_column_text(p1, 1);
7230     nByte += 1 + STRLEN(zCol);
7231     rc = sqlite3_table_column_metadata(
7232         db, "main", zTab, zCol, 0, &zCol, 0, 0, 0
7233     );
7234     nByte += 1 + STRLEN(zCol);
7235     nCol++;
7236   }
7237   rc2 = sqlite3_reset(p1);
7238   if( rc==SQLITE_OK ) rc = rc2;
7239 
7240   nByte += sizeof(IdxColumn) * nCol;
7241   if( rc==SQLITE_OK ){
7242     pNew = idxMalloc(&rc, nByte);
7243   }
7244   if( rc==SQLITE_OK ){
7245     pNew->aCol = (IdxColumn*)&pNew[1];
7246     pNew->nCol = nCol;
7247     pCsr = (char*)&pNew->aCol[nCol];
7248   }
7249 
7250   nCol = 0;
7251   while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(p1) ){
7252     const char *zCol = (const char*)sqlite3_column_text(p1, 1);
7253     int nCopy = STRLEN(zCol) + 1;
7254     pNew->aCol[nCol].zName = pCsr;
7255     pNew->aCol[nCol].iPk = sqlite3_column_int(p1, 5);
7256     memcpy(pCsr, zCol, nCopy);
7257     pCsr += nCopy;
7258 
7259     rc = sqlite3_table_column_metadata(
7260         db, "main", zTab, zCol, 0, &zCol, 0, 0, 0
7261     );
7262     if( rc==SQLITE_OK ){
7263       nCopy = STRLEN(zCol) + 1;
7264       pNew->aCol[nCol].zColl = pCsr;
7265       memcpy(pCsr, zCol, nCopy);
7266       pCsr += nCopy;
7267     }
7268 
7269     nCol++;
7270   }
7271   idxFinalize(&rc, p1);
7272 
7273   if( rc!=SQLITE_OK ){
7274     sqlite3_free(pNew);
7275     pNew = 0;
7276   }else{
7277     pNew->zName = pCsr;
7278     memcpy(pNew->zName, zTab, nTab+1);
7279   }
7280 
7281   *ppOut = pNew;
7282   return rc;
7283 }
7284 
7285 /*
7286 ** This function is a no-op if *pRc is set to anything other than
7287 ** SQLITE_OK when it is called.
7288 **
7289 ** If *pRc is initially set to SQLITE_OK, then the text specified by
7290 ** the printf() style arguments is appended to zIn and the result returned
7291 ** in a buffer allocated by sqlite3_malloc(). sqlite3_free() is called on
7292 ** zIn before returning.
7293 */
idxAppendText(int * pRc,char * zIn,const char * zFmt,...)7294 static char *idxAppendText(int *pRc, char *zIn, const char *zFmt, ...){
7295   va_list ap;
7296   char *zAppend = 0;
7297   char *zRet = 0;
7298   int nIn = zIn ? STRLEN(zIn) : 0;
7299   int nAppend = 0;
7300   va_start(ap, zFmt);
7301   if( *pRc==SQLITE_OK ){
7302     zAppend = sqlite3_vmprintf(zFmt, ap);
7303     if( zAppend ){
7304       nAppend = STRLEN(zAppend);
7305       zRet = (char*)sqlite3_malloc(nIn + nAppend + 1);
7306     }
7307     if( zAppend && zRet ){
7308       if( nIn ) memcpy(zRet, zIn, nIn);
7309       memcpy(&zRet[nIn], zAppend, nAppend+1);
7310     }else{
7311       sqlite3_free(zRet);
7312       zRet = 0;
7313       *pRc = SQLITE_NOMEM;
7314     }
7315     sqlite3_free(zAppend);
7316     sqlite3_free(zIn);
7317   }
7318   va_end(ap);
7319   return zRet;
7320 }
7321 
7322 /*
7323 ** Return true if zId must be quoted in order to use it as an SQL
7324 ** identifier, or false otherwise.
7325 */
idxIdentifierRequiresQuotes(const char * zId)7326 static int idxIdentifierRequiresQuotes(const char *zId){
7327   int i;
7328   for(i=0; zId[i]; i++){
7329     if( !(zId[i]=='_')
7330      && !(zId[i]>='0' && zId[i]<='9')
7331      && !(zId[i]>='a' && zId[i]<='z')
7332      && !(zId[i]>='A' && zId[i]<='Z')
7333     ){
7334       return 1;
7335     }
7336   }
7337   return 0;
7338 }
7339 
7340 /*
7341 ** This function appends an index column definition suitable for constraint
7342 ** pCons to the string passed as zIn and returns the result.
7343 */
idxAppendColDefn(int * pRc,char * zIn,IdxTable * pTab,IdxConstraint * pCons)7344 static char *idxAppendColDefn(
7345   int *pRc,                       /* IN/OUT: Error code */
7346   char *zIn,                      /* Column defn accumulated so far */
7347   IdxTable *pTab,                 /* Table index will be created on */
7348   IdxConstraint *pCons
7349 ){
7350   char *zRet = zIn;
7351   IdxColumn *p = &pTab->aCol[pCons->iCol];
7352   if( zRet ) zRet = idxAppendText(pRc, zRet, ", ");
7353 
7354   if( idxIdentifierRequiresQuotes(p->zName) ){
7355     zRet = idxAppendText(pRc, zRet, "%Q", p->zName);
7356   }else{
7357     zRet = idxAppendText(pRc, zRet, "%s", p->zName);
7358   }
7359 
7360   if( sqlite3_stricmp(p->zColl, pCons->zColl) ){
7361     if( idxIdentifierRequiresQuotes(pCons->zColl) ){
7362       zRet = idxAppendText(pRc, zRet, " COLLATE %Q", pCons->zColl);
7363     }else{
7364       zRet = idxAppendText(pRc, zRet, " COLLATE %s", pCons->zColl);
7365     }
7366   }
7367 
7368   if( pCons->bDesc ){
7369     zRet = idxAppendText(pRc, zRet, " DESC");
7370   }
7371   return zRet;
7372 }
7373 
7374 /*
7375 ** Search database dbm for an index compatible with the one idxCreateFromCons()
7376 ** would create from arguments pScan, pEq and pTail. If no error occurs and
7377 ** such an index is found, return non-zero. Or, if no such index is found,
7378 ** return zero.
7379 **
7380 ** If an error occurs, set *pRc to an SQLite error code and return zero.
7381 */
idxFindCompatible(int * pRc,sqlite3 * dbm,IdxScan * pScan,IdxConstraint * pEq,IdxConstraint * pTail)7382 static int idxFindCompatible(
7383   int *pRc,                       /* OUT: Error code */
7384   sqlite3* dbm,                   /* Database to search */
7385   IdxScan *pScan,                 /* Scan for table to search for index on */
7386   IdxConstraint *pEq,             /* List of == constraints */
7387   IdxConstraint *pTail            /* List of range constraints */
7388 ){
7389   const char *zTbl = pScan->pTab->zName;
7390   sqlite3_stmt *pIdxList = 0;
7391   IdxConstraint *pIter;
7392   int nEq = 0;                    /* Number of elements in pEq */
7393   int rc;
7394 
7395   /* Count the elements in list pEq */
7396   for(pIter=pEq; pIter; pIter=pIter->pLink) nEq++;
7397 
7398   rc = idxPrintfPrepareStmt(dbm, &pIdxList, 0, "PRAGMA index_list=%Q", zTbl);
7399   while( rc==SQLITE_OK && sqlite3_step(pIdxList)==SQLITE_ROW ){
7400     int bMatch = 1;
7401     IdxConstraint *pT = pTail;
7402     sqlite3_stmt *pInfo = 0;
7403     const char *zIdx = (const char*)sqlite3_column_text(pIdxList, 1);
7404 
7405     /* Zero the IdxConstraint.bFlag values in the pEq list */
7406     for(pIter=pEq; pIter; pIter=pIter->pLink) pIter->bFlag = 0;
7407 
7408     rc = idxPrintfPrepareStmt(dbm, &pInfo, 0, "PRAGMA index_xInfo=%Q", zIdx);
7409     while( rc==SQLITE_OK && sqlite3_step(pInfo)==SQLITE_ROW ){
7410       int iIdx = sqlite3_column_int(pInfo, 0);
7411       int iCol = sqlite3_column_int(pInfo, 1);
7412       const char *zColl = (const char*)sqlite3_column_text(pInfo, 4);
7413 
7414       if( iIdx<nEq ){
7415         for(pIter=pEq; pIter; pIter=pIter->pLink){
7416           if( pIter->bFlag ) continue;
7417           if( pIter->iCol!=iCol ) continue;
7418           if( sqlite3_stricmp(pIter->zColl, zColl) ) continue;
7419           pIter->bFlag = 1;
7420           break;
7421         }
7422         if( pIter==0 ){
7423           bMatch = 0;
7424           break;
7425         }
7426       }else{
7427         if( pT ){
7428           if( pT->iCol!=iCol || sqlite3_stricmp(pT->zColl, zColl) ){
7429             bMatch = 0;
7430             break;
7431           }
7432           pT = pT->pLink;
7433         }
7434       }
7435     }
7436     idxFinalize(&rc, pInfo);
7437 
7438     if( rc==SQLITE_OK && bMatch ){
7439       sqlite3_finalize(pIdxList);
7440       return 1;
7441     }
7442   }
7443   idxFinalize(&rc, pIdxList);
7444 
7445   *pRc = rc;
7446   return 0;
7447 }
7448 
idxCreateFromCons(sqlite3expert * p,IdxScan * pScan,IdxConstraint * pEq,IdxConstraint * pTail)7449 static int idxCreateFromCons(
7450   sqlite3expert *p,
7451   IdxScan *pScan,
7452   IdxConstraint *pEq,
7453   IdxConstraint *pTail
7454 ){
7455   sqlite3 *dbm = p->dbm;
7456   int rc = SQLITE_OK;
7457   if( (pEq || pTail) && 0==idxFindCompatible(&rc, dbm, pScan, pEq, pTail) ){
7458     IdxTable *pTab = pScan->pTab;
7459     char *zCols = 0;
7460     char *zIdx = 0;
7461     IdxConstraint *pCons;
7462     unsigned int h = 0;
7463     const char *zFmt;
7464 
7465     for(pCons=pEq; pCons; pCons=pCons->pLink){
7466       zCols = idxAppendColDefn(&rc, zCols, pTab, pCons);
7467     }
7468     for(pCons=pTail; pCons; pCons=pCons->pLink){
7469       zCols = idxAppendColDefn(&rc, zCols, pTab, pCons);
7470     }
7471 
7472     if( rc==SQLITE_OK ){
7473       /* Hash the list of columns to come up with a name for the index */
7474       const char *zTable = pScan->pTab->zName;
7475       char *zName;                /* Index name */
7476       int i;
7477       for(i=0; zCols[i]; i++){
7478         h += ((h<<3) + zCols[i]);
7479       }
7480       zName = sqlite3_mprintf("%s_idx_%08x", zTable, h);
7481       if( zName==0 ){
7482         rc = SQLITE_NOMEM;
7483       }else{
7484         if( idxIdentifierRequiresQuotes(zTable) ){
7485           zFmt = "CREATE INDEX '%q' ON %Q(%s)";
7486         }else{
7487           zFmt = "CREATE INDEX %s ON %s(%s)";
7488         }
7489         zIdx = sqlite3_mprintf(zFmt, zName, zTable, zCols);
7490         if( !zIdx ){
7491           rc = SQLITE_NOMEM;
7492         }else{
7493           rc = sqlite3_exec(dbm, zIdx, 0, 0, p->pzErrmsg);
7494           idxHashAdd(&rc, &p->hIdx, zName, zIdx);
7495         }
7496         sqlite3_free(zName);
7497         sqlite3_free(zIdx);
7498       }
7499     }
7500 
7501     sqlite3_free(zCols);
7502   }
7503   return rc;
7504 }
7505 
7506 /*
7507 ** Return true if list pList (linked by IdxConstraint.pLink) contains
7508 ** a constraint compatible with *p. Otherwise return false.
7509 */
idxFindConstraint(IdxConstraint * pList,IdxConstraint * p)7510 static int idxFindConstraint(IdxConstraint *pList, IdxConstraint *p){
7511   IdxConstraint *pCmp;
7512   for(pCmp=pList; pCmp; pCmp=pCmp->pLink){
7513     if( p->iCol==pCmp->iCol ) return 1;
7514   }
7515   return 0;
7516 }
7517 
idxCreateFromWhere(sqlite3expert * p,IdxScan * pScan,IdxConstraint * pTail)7518 static int idxCreateFromWhere(
7519   sqlite3expert *p,
7520   IdxScan *pScan,                 /* Create indexes for this scan */
7521   IdxConstraint *pTail            /* range/ORDER BY constraints for inclusion */
7522 ){
7523   IdxConstraint *p1 = 0;
7524   IdxConstraint *pCon;
7525   int rc;
7526 
7527   /* Gather up all the == constraints. */
7528   for(pCon=pScan->pEq; pCon; pCon=pCon->pNext){
7529     if( !idxFindConstraint(p1, pCon) && !idxFindConstraint(pTail, pCon) ){
7530       pCon->pLink = p1;
7531       p1 = pCon;
7532     }
7533   }
7534 
7535   /* Create an index using the == constraints collected above. And the
7536   ** range constraint/ORDER BY terms passed in by the caller, if any. */
7537   rc = idxCreateFromCons(p, pScan, p1, pTail);
7538 
7539   /* If no range/ORDER BY passed by the caller, create a version of the
7540   ** index for each range constraint.  */
7541   if( pTail==0 ){
7542     for(pCon=pScan->pRange; rc==SQLITE_OK && pCon; pCon=pCon->pNext){
7543       assert( pCon->pLink==0 );
7544       if( !idxFindConstraint(p1, pCon) && !idxFindConstraint(pTail, pCon) ){
7545         rc = idxCreateFromCons(p, pScan, p1, pCon);
7546       }
7547     }
7548   }
7549 
7550   return rc;
7551 }
7552 
7553 /*
7554 ** Create candidate indexes in database [dbm] based on the data in
7555 ** linked-list pScan.
7556 */
idxCreateCandidates(sqlite3expert * p)7557 static int idxCreateCandidates(sqlite3expert *p){
7558   int rc = SQLITE_OK;
7559   IdxScan *pIter;
7560 
7561   for(pIter=p->pScan; pIter && rc==SQLITE_OK; pIter=pIter->pNextScan){
7562     rc = idxCreateFromWhere(p, pIter, 0);
7563     if( rc==SQLITE_OK && pIter->pOrder ){
7564       rc = idxCreateFromWhere(p, pIter, pIter->pOrder);
7565     }
7566   }
7567 
7568   return rc;
7569 }
7570 
7571 /*
7572 ** Free all elements of the linked list starting at pConstraint.
7573 */
idxConstraintFree(IdxConstraint * pConstraint)7574 static void idxConstraintFree(IdxConstraint *pConstraint){
7575   IdxConstraint *pNext;
7576   IdxConstraint *p;
7577 
7578   for(p=pConstraint; p; p=pNext){
7579     pNext = p->pNext;
7580     sqlite3_free(p);
7581   }
7582 }
7583 
7584 /*
7585 ** Free all elements of the linked list starting from pScan up until pLast
7586 ** (pLast is not freed).
7587 */
idxScanFree(IdxScan * pScan,IdxScan * pLast)7588 static void idxScanFree(IdxScan *pScan, IdxScan *pLast){
7589   IdxScan *p;
7590   IdxScan *pNext;
7591   for(p=pScan; p!=pLast; p=pNext){
7592     pNext = p->pNextScan;
7593     idxConstraintFree(p->pOrder);
7594     idxConstraintFree(p->pEq);
7595     idxConstraintFree(p->pRange);
7596     sqlite3_free(p);
7597   }
7598 }
7599 
7600 /*
7601 ** Free all elements of the linked list starting from pStatement up
7602 ** until pLast (pLast is not freed).
7603 */
idxStatementFree(IdxStatement * pStatement,IdxStatement * pLast)7604 static void idxStatementFree(IdxStatement *pStatement, IdxStatement *pLast){
7605   IdxStatement *p;
7606   IdxStatement *pNext;
7607   for(p=pStatement; p!=pLast; p=pNext){
7608     pNext = p->pNext;
7609     sqlite3_free(p->zEQP);
7610     sqlite3_free(p->zIdx);
7611     sqlite3_free(p);
7612   }
7613 }
7614 
7615 /*
7616 ** Free the linked list of IdxTable objects starting at pTab.
7617 */
idxTableFree(IdxTable * pTab)7618 static void idxTableFree(IdxTable *pTab){
7619   IdxTable *pIter;
7620   IdxTable *pNext;
7621   for(pIter=pTab; pIter; pIter=pNext){
7622     pNext = pIter->pNext;
7623     sqlite3_free(pIter);
7624   }
7625 }
7626 
7627 /*
7628 ** Free the linked list of IdxWrite objects starting at pTab.
7629 */
idxWriteFree(IdxWrite * pTab)7630 static void idxWriteFree(IdxWrite *pTab){
7631   IdxWrite *pIter;
7632   IdxWrite *pNext;
7633   for(pIter=pTab; pIter; pIter=pNext){
7634     pNext = pIter->pNext;
7635     sqlite3_free(pIter);
7636   }
7637 }
7638 
7639 
7640 
7641 /*
7642 ** This function is called after candidate indexes have been created. It
7643 ** runs all the queries to see which indexes they prefer, and populates
7644 ** IdxStatement.zIdx and IdxStatement.zEQP with the results.
7645 */
idxFindIndexes(sqlite3expert * p,char ** pzErr)7646 static int idxFindIndexes(
7647   sqlite3expert *p,
7648   char **pzErr                         /* OUT: Error message (sqlite3_malloc) */
7649 ){
7650   IdxStatement *pStmt;
7651   sqlite3 *dbm = p->dbm;
7652   int rc = SQLITE_OK;
7653 
7654   IdxHash hIdx;
7655   idxHashInit(&hIdx);
7656 
7657   for(pStmt=p->pStatement; rc==SQLITE_OK && pStmt; pStmt=pStmt->pNext){
7658     IdxHashEntry *pEntry;
7659     sqlite3_stmt *pExplain = 0;
7660     idxHashClear(&hIdx);
7661     rc = idxPrintfPrepareStmt(dbm, &pExplain, pzErr,
7662         "EXPLAIN QUERY PLAN %s", pStmt->zSql
7663     );
7664     while( rc==SQLITE_OK && sqlite3_step(pExplain)==SQLITE_ROW ){
7665       /* int iId = sqlite3_column_int(pExplain, 0); */
7666       /* int iParent = sqlite3_column_int(pExplain, 1); */
7667       /* int iNotUsed = sqlite3_column_int(pExplain, 2); */
7668       const char *zDetail = (const char*)sqlite3_column_text(pExplain, 3);
7669       int nDetail = STRLEN(zDetail);
7670       int i;
7671 
7672       for(i=0; i<nDetail; i++){
7673         const char *zIdx = 0;
7674         if( memcmp(&zDetail[i], " USING INDEX ", 13)==0 ){
7675           zIdx = &zDetail[i+13];
7676         }else if( memcmp(&zDetail[i], " USING COVERING INDEX ", 22)==0 ){
7677           zIdx = &zDetail[i+22];
7678         }
7679         if( zIdx ){
7680           const char *zSql;
7681           int nIdx = 0;
7682           while( zIdx[nIdx]!='\0' && (zIdx[nIdx]!=' ' || zIdx[nIdx+1]!='(') ){
7683             nIdx++;
7684           }
7685           zSql = idxHashSearch(&p->hIdx, zIdx, nIdx);
7686           if( zSql ){
7687             idxHashAdd(&rc, &hIdx, zSql, 0);
7688             if( rc ) goto find_indexes_out;
7689           }
7690           break;
7691         }
7692       }
7693 
7694       if( zDetail[0]!='-' ){
7695         pStmt->zEQP = idxAppendText(&rc, pStmt->zEQP, "%s\n", zDetail);
7696       }
7697     }
7698 
7699     for(pEntry=hIdx.pFirst; pEntry; pEntry=pEntry->pNext){
7700       pStmt->zIdx = idxAppendText(&rc, pStmt->zIdx, "%s;\n", pEntry->zKey);
7701     }
7702 
7703     idxFinalize(&rc, pExplain);
7704   }
7705 
7706  find_indexes_out:
7707   idxHashClear(&hIdx);
7708   return rc;
7709 }
7710 
idxAuthCallback(void * pCtx,int eOp,const char * z3,const char * z4,const char * zDb,const char * zTrigger)7711 static int idxAuthCallback(
7712   void *pCtx,
7713   int eOp,
7714   const char *z3,
7715   const char *z4,
7716   const char *zDb,
7717   const char *zTrigger
7718 ){
7719   int rc = SQLITE_OK;
7720   (void)z4;
7721   (void)zTrigger;
7722   if( eOp==SQLITE_INSERT || eOp==SQLITE_UPDATE || eOp==SQLITE_DELETE ){
7723     if( sqlite3_stricmp(zDb, "main")==0 ){
7724       sqlite3expert *p = (sqlite3expert*)pCtx;
7725       IdxTable *pTab;
7726       for(pTab=p->pTable; pTab; pTab=pTab->pNext){
7727         if( 0==sqlite3_stricmp(z3, pTab->zName) ) break;
7728       }
7729       if( pTab ){
7730         IdxWrite *pWrite;
7731         for(pWrite=p->pWrite; pWrite; pWrite=pWrite->pNext){
7732           if( pWrite->pTab==pTab && pWrite->eOp==eOp ) break;
7733         }
7734         if( pWrite==0 ){
7735           pWrite = idxMalloc(&rc, sizeof(IdxWrite));
7736           if( rc==SQLITE_OK ){
7737             pWrite->pTab = pTab;
7738             pWrite->eOp = eOp;
7739             pWrite->pNext = p->pWrite;
7740             p->pWrite = pWrite;
7741           }
7742         }
7743       }
7744     }
7745   }
7746   return rc;
7747 }
7748 
idxProcessOneTrigger(sqlite3expert * p,IdxWrite * pWrite,char ** pzErr)7749 static int idxProcessOneTrigger(
7750   sqlite3expert *p,
7751   IdxWrite *pWrite,
7752   char **pzErr
7753 ){
7754   static const char *zInt = UNIQUE_TABLE_NAME;
7755   static const char *zDrop = "DROP TABLE " UNIQUE_TABLE_NAME;
7756   IdxTable *pTab = pWrite->pTab;
7757   const char *zTab = pTab->zName;
7758   const char *zSql =
7759     "SELECT 'CREATE TEMP' || substr(sql, 7) FROM sqlite_master "
7760     "WHERE tbl_name = %Q AND type IN ('table', 'trigger') "
7761     "ORDER BY type;";
7762   sqlite3_stmt *pSelect = 0;
7763   int rc = SQLITE_OK;
7764   char *zWrite = 0;
7765 
7766   /* Create the table and its triggers in the temp schema */
7767   rc = idxPrintfPrepareStmt(p->db, &pSelect, pzErr, zSql, zTab, zTab);
7768   while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSelect) ){
7769     const char *zCreate = (const char*)sqlite3_column_text(pSelect, 0);
7770     rc = sqlite3_exec(p->dbv, zCreate, 0, 0, pzErr);
7771   }
7772   idxFinalize(&rc, pSelect);
7773 
7774   /* Rename the table in the temp schema to zInt */
7775   if( rc==SQLITE_OK ){
7776     char *z = sqlite3_mprintf("ALTER TABLE temp.%Q RENAME TO %Q", zTab, zInt);
7777     if( z==0 ){
7778       rc = SQLITE_NOMEM;
7779     }else{
7780       rc = sqlite3_exec(p->dbv, z, 0, 0, pzErr);
7781       sqlite3_free(z);
7782     }
7783   }
7784 
7785   switch( pWrite->eOp ){
7786     case SQLITE_INSERT: {
7787       int i;
7788       zWrite = idxAppendText(&rc, zWrite, "INSERT INTO %Q VALUES(", zInt);
7789       for(i=0; i<pTab->nCol; i++){
7790         zWrite = idxAppendText(&rc, zWrite, "%s?", i==0 ? "" : ", ");
7791       }
7792       zWrite = idxAppendText(&rc, zWrite, ")");
7793       break;
7794     }
7795     case SQLITE_UPDATE: {
7796       int i;
7797       zWrite = idxAppendText(&rc, zWrite, "UPDATE %Q SET ", zInt);
7798       for(i=0; i<pTab->nCol; i++){
7799         zWrite = idxAppendText(&rc, zWrite, "%s%Q=?", i==0 ? "" : ", ",
7800             pTab->aCol[i].zName
7801         );
7802       }
7803       break;
7804     }
7805     default: {
7806       assert( pWrite->eOp==SQLITE_DELETE );
7807       if( rc==SQLITE_OK ){
7808         zWrite = sqlite3_mprintf("DELETE FROM %Q", zInt);
7809         if( zWrite==0 ) rc = SQLITE_NOMEM;
7810       }
7811     }
7812   }
7813 
7814   if( rc==SQLITE_OK ){
7815     sqlite3_stmt *pX = 0;
7816     rc = sqlite3_prepare_v2(p->dbv, zWrite, -1, &pX, 0);
7817     idxFinalize(&rc, pX);
7818     if( rc!=SQLITE_OK ){
7819       idxDatabaseError(p->dbv, pzErr);
7820     }
7821   }
7822   sqlite3_free(zWrite);
7823 
7824   if( rc==SQLITE_OK ){
7825     rc = sqlite3_exec(p->dbv, zDrop, 0, 0, pzErr);
7826   }
7827 
7828   return rc;
7829 }
7830 
idxProcessTriggers(sqlite3expert * p,char ** pzErr)7831 static int idxProcessTriggers(sqlite3expert *p, char **pzErr){
7832   int rc = SQLITE_OK;
7833   IdxWrite *pEnd = 0;
7834   IdxWrite *pFirst = p->pWrite;
7835 
7836   while( rc==SQLITE_OK && pFirst!=pEnd ){
7837     IdxWrite *pIter;
7838     for(pIter=pFirst; rc==SQLITE_OK && pIter!=pEnd; pIter=pIter->pNext){
7839       rc = idxProcessOneTrigger(p, pIter, pzErr);
7840     }
7841     pEnd = pFirst;
7842     pFirst = p->pWrite;
7843   }
7844 
7845   return rc;
7846 }
7847 
7848 
idxCreateVtabSchema(sqlite3expert * p,char ** pzErrmsg)7849 static int idxCreateVtabSchema(sqlite3expert *p, char **pzErrmsg){
7850   int rc = idxRegisterVtab(p);
7851   sqlite3_stmt *pSchema = 0;
7852 
7853   /* For each table in the main db schema:
7854   **
7855   **   1) Add an entry to the p->pTable list, and
7856   **   2) Create the equivalent virtual table in dbv.
7857   */
7858   rc = idxPrepareStmt(p->db, &pSchema, pzErrmsg,
7859       "SELECT type, name, sql, 1 FROM sqlite_master "
7860       "WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%%' "
7861       " UNION ALL "
7862       "SELECT type, name, sql, 2 FROM sqlite_master "
7863       "WHERE type = 'trigger'"
7864       "  AND tbl_name IN(SELECT name FROM sqlite_master WHERE type = 'view') "
7865       "ORDER BY 4, 1"
7866   );
7867   while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSchema) ){
7868     const char *zType = (const char*)sqlite3_column_text(pSchema, 0);
7869     const char *zName = (const char*)sqlite3_column_text(pSchema, 1);
7870     const char *zSql = (const char*)sqlite3_column_text(pSchema, 2);
7871 
7872     if( zType[0]=='v' || zType[1]=='r' ){
7873       rc = sqlite3_exec(p->dbv, zSql, 0, 0, pzErrmsg);
7874     }else{
7875       IdxTable *pTab;
7876       rc = idxGetTableInfo(p->db, zName, &pTab, pzErrmsg);
7877       if( rc==SQLITE_OK ){
7878         int i;
7879         char *zInner = 0;
7880         char *zOuter = 0;
7881         pTab->pNext = p->pTable;
7882         p->pTable = pTab;
7883 
7884         /* The statement the vtab will pass to sqlite3_declare_vtab() */
7885         zInner = idxAppendText(&rc, 0, "CREATE TABLE x(");
7886         for(i=0; i<pTab->nCol; i++){
7887           zInner = idxAppendText(&rc, zInner, "%s%Q COLLATE %s",
7888               (i==0 ? "" : ", "), pTab->aCol[i].zName, pTab->aCol[i].zColl
7889           );
7890         }
7891         zInner = idxAppendText(&rc, zInner, ")");
7892 
7893         /* The CVT statement to create the vtab */
7894         zOuter = idxAppendText(&rc, 0,
7895             "CREATE VIRTUAL TABLE %Q USING expert(%Q)", zName, zInner
7896         );
7897         if( rc==SQLITE_OK ){
7898           rc = sqlite3_exec(p->dbv, zOuter, 0, 0, pzErrmsg);
7899         }
7900         sqlite3_free(zInner);
7901         sqlite3_free(zOuter);
7902       }
7903     }
7904   }
7905   idxFinalize(&rc, pSchema);
7906   return rc;
7907 }
7908 
7909 struct IdxSampleCtx {
7910   int iTarget;
7911   double target;                  /* Target nRet/nRow value */
7912   double nRow;                    /* Number of rows seen */
7913   double nRet;                    /* Number of rows returned */
7914 };
7915 
idxSampleFunc(sqlite3_context * pCtx,int argc,sqlite3_value ** argv)7916 static void idxSampleFunc(
7917   sqlite3_context *pCtx,
7918   int argc,
7919   sqlite3_value **argv
7920 ){
7921   struct IdxSampleCtx *p = (struct IdxSampleCtx*)sqlite3_user_data(pCtx);
7922   int bRet;
7923 
7924   (void)argv;
7925   assert( argc==0 );
7926   if( p->nRow==0.0 ){
7927     bRet = 1;
7928   }else{
7929     bRet = (p->nRet / p->nRow) <= p->target;
7930     if( bRet==0 ){
7931       unsigned short rnd;
7932       sqlite3_randomness(2, (void*)&rnd);
7933       bRet = ((int)rnd % 100) <= p->iTarget;
7934     }
7935   }
7936 
7937   sqlite3_result_int(pCtx, bRet);
7938   p->nRow += 1.0;
7939   p->nRet += (double)bRet;
7940 }
7941 
7942 struct IdxRemCtx {
7943   int nSlot;
7944   struct IdxRemSlot {
7945     int eType;                    /* SQLITE_NULL, INTEGER, REAL, TEXT, BLOB */
7946     i64 iVal;                     /* SQLITE_INTEGER value */
7947     double rVal;                  /* SQLITE_FLOAT value */
7948     int nByte;                    /* Bytes of space allocated at z */
7949     int n;                        /* Size of buffer z */
7950     char *z;                      /* SQLITE_TEXT/BLOB value */
7951   } aSlot[1];
7952 };
7953 
7954 /*
7955 ** Implementation of scalar function rem().
7956 */
idxRemFunc(sqlite3_context * pCtx,int argc,sqlite3_value ** argv)7957 static void idxRemFunc(
7958   sqlite3_context *pCtx,
7959   int argc,
7960   sqlite3_value **argv
7961 ){
7962   struct IdxRemCtx *p = (struct IdxRemCtx*)sqlite3_user_data(pCtx);
7963   struct IdxRemSlot *pSlot;
7964   int iSlot;
7965   assert( argc==2 );
7966 
7967   iSlot = sqlite3_value_int(argv[0]);
7968   assert( iSlot<=p->nSlot );
7969   pSlot = &p->aSlot[iSlot];
7970 
7971   switch( pSlot->eType ){
7972     case SQLITE_NULL:
7973       /* no-op */
7974       break;
7975 
7976     case SQLITE_INTEGER:
7977       sqlite3_result_int64(pCtx, pSlot->iVal);
7978       break;
7979 
7980     case SQLITE_FLOAT:
7981       sqlite3_result_double(pCtx, pSlot->rVal);
7982       break;
7983 
7984     case SQLITE_BLOB:
7985       sqlite3_result_blob(pCtx, pSlot->z, pSlot->n, SQLITE_TRANSIENT);
7986       break;
7987 
7988     case SQLITE_TEXT:
7989       sqlite3_result_text(pCtx, pSlot->z, pSlot->n, SQLITE_TRANSIENT);
7990       break;
7991   }
7992 
7993   pSlot->eType = sqlite3_value_type(argv[1]);
7994   switch( pSlot->eType ){
7995     case SQLITE_NULL:
7996       /* no-op */
7997       break;
7998 
7999     case SQLITE_INTEGER:
8000       pSlot->iVal = sqlite3_value_int64(argv[1]);
8001       break;
8002 
8003     case SQLITE_FLOAT:
8004       pSlot->rVal = sqlite3_value_double(argv[1]);
8005       break;
8006 
8007     case SQLITE_BLOB:
8008     case SQLITE_TEXT: {
8009       int nByte = sqlite3_value_bytes(argv[1]);
8010       if( nByte>pSlot->nByte ){
8011         char *zNew = (char*)sqlite3_realloc(pSlot->z, nByte*2);
8012         if( zNew==0 ){
8013           sqlite3_result_error_nomem(pCtx);
8014           return;
8015         }
8016         pSlot->nByte = nByte*2;
8017         pSlot->z = zNew;
8018       }
8019       pSlot->n = nByte;
8020       if( pSlot->eType==SQLITE_BLOB ){
8021         memcpy(pSlot->z, sqlite3_value_blob(argv[1]), nByte);
8022       }else{
8023         memcpy(pSlot->z, sqlite3_value_text(argv[1]), nByte);
8024       }
8025       break;
8026     }
8027   }
8028 }
8029 
idxLargestIndex(sqlite3 * db,int * pnMax,char ** pzErr)8030 static int idxLargestIndex(sqlite3 *db, int *pnMax, char **pzErr){
8031   int rc = SQLITE_OK;
8032   const char *zMax =
8033     "SELECT max(i.seqno) FROM "
8034     "  sqlite_master AS s, "
8035     "  pragma_index_list(s.name) AS l, "
8036     "  pragma_index_info(l.name) AS i "
8037     "WHERE s.type = 'table'";
8038   sqlite3_stmt *pMax = 0;
8039 
8040   *pnMax = 0;
8041   rc = idxPrepareStmt(db, &pMax, pzErr, zMax);
8042   if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pMax) ){
8043     *pnMax = sqlite3_column_int(pMax, 0) + 1;
8044   }
8045   idxFinalize(&rc, pMax);
8046 
8047   return rc;
8048 }
8049 
idxPopulateOneStat1(sqlite3expert * p,sqlite3_stmt * pIndexXInfo,sqlite3_stmt * pWriteStat,const char * zTab,const char * zIdx,char ** pzErr)8050 static int idxPopulateOneStat1(
8051   sqlite3expert *p,
8052   sqlite3_stmt *pIndexXInfo,
8053   sqlite3_stmt *pWriteStat,
8054   const char *zTab,
8055   const char *zIdx,
8056   char **pzErr
8057 ){
8058   char *zCols = 0;
8059   char *zOrder = 0;
8060   char *zQuery = 0;
8061   int nCol = 0;
8062   int i;
8063   sqlite3_stmt *pQuery = 0;
8064   int *aStat = 0;
8065   int rc = SQLITE_OK;
8066 
8067   assert( p->iSample>0 );
8068 
8069   /* Formulate the query text */
8070   sqlite3_bind_text(pIndexXInfo, 1, zIdx, -1, SQLITE_STATIC);
8071   while( SQLITE_OK==rc && SQLITE_ROW==sqlite3_step(pIndexXInfo) ){
8072     const char *zComma = zCols==0 ? "" : ", ";
8073     const char *zName = (const char*)sqlite3_column_text(pIndexXInfo, 0);
8074     const char *zColl = (const char*)sqlite3_column_text(pIndexXInfo, 1);
8075     zCols = idxAppendText(&rc, zCols,
8076         "%sx.%Q IS rem(%d, x.%Q) COLLATE %s", zComma, zName, nCol, zName, zColl
8077     );
8078     zOrder = idxAppendText(&rc, zOrder, "%s%d", zComma, ++nCol);
8079   }
8080   sqlite3_reset(pIndexXInfo);
8081   if( rc==SQLITE_OK ){
8082     if( p->iSample==100 ){
8083       zQuery = sqlite3_mprintf(
8084           "SELECT %s FROM %Q x ORDER BY %s", zCols, zTab, zOrder
8085       );
8086     }else{
8087       zQuery = sqlite3_mprintf(
8088           "SELECT %s FROM temp."UNIQUE_TABLE_NAME" x ORDER BY %s", zCols, zOrder
8089       );
8090     }
8091   }
8092   sqlite3_free(zCols);
8093   sqlite3_free(zOrder);
8094 
8095   /* Formulate the query text */
8096   if( rc==SQLITE_OK ){
8097     sqlite3 *dbrem = (p->iSample==100 ? p->db : p->dbv);
8098     rc = idxPrepareStmt(dbrem, &pQuery, pzErr, zQuery);
8099   }
8100   sqlite3_free(zQuery);
8101 
8102   if( rc==SQLITE_OK ){
8103     aStat = (int*)idxMalloc(&rc, sizeof(int)*(nCol+1));
8104   }
8105   if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pQuery) ){
8106     IdxHashEntry *pEntry;
8107     char *zStat = 0;
8108     for(i=0; i<=nCol; i++) aStat[i] = 1;
8109     while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pQuery) ){
8110       aStat[0]++;
8111       for(i=0; i<nCol; i++){
8112         if( sqlite3_column_int(pQuery, i)==0 ) break;
8113       }
8114       for(/*no-op*/; i<nCol; i++){
8115         aStat[i+1]++;
8116       }
8117     }
8118 
8119     if( rc==SQLITE_OK ){
8120       int s0 = aStat[0];
8121       zStat = sqlite3_mprintf("%d", s0);
8122       if( zStat==0 ) rc = SQLITE_NOMEM;
8123       for(i=1; rc==SQLITE_OK && i<=nCol; i++){
8124         zStat = idxAppendText(&rc, zStat, " %d", (s0+aStat[i]/2) / aStat[i]);
8125       }
8126     }
8127 
8128     if( rc==SQLITE_OK ){
8129       sqlite3_bind_text(pWriteStat, 1, zTab, -1, SQLITE_STATIC);
8130       sqlite3_bind_text(pWriteStat, 2, zIdx, -1, SQLITE_STATIC);
8131       sqlite3_bind_text(pWriteStat, 3, zStat, -1, SQLITE_STATIC);
8132       sqlite3_step(pWriteStat);
8133       rc = sqlite3_reset(pWriteStat);
8134     }
8135 
8136     pEntry = idxHashFind(&p->hIdx, zIdx, STRLEN(zIdx));
8137     if( pEntry ){
8138       assert( pEntry->zVal2==0 );
8139       pEntry->zVal2 = zStat;
8140     }else{
8141       sqlite3_free(zStat);
8142     }
8143   }
8144   sqlite3_free(aStat);
8145   idxFinalize(&rc, pQuery);
8146 
8147   return rc;
8148 }
8149 
idxBuildSampleTable(sqlite3expert * p,const char * zTab)8150 static int idxBuildSampleTable(sqlite3expert *p, const char *zTab){
8151   int rc;
8152   char *zSql;
8153 
8154   rc = sqlite3_exec(p->dbv,"DROP TABLE IF EXISTS temp."UNIQUE_TABLE_NAME,0,0,0);
8155   if( rc!=SQLITE_OK ) return rc;
8156 
8157   zSql = sqlite3_mprintf(
8158       "CREATE TABLE temp." UNIQUE_TABLE_NAME " AS SELECT * FROM %Q", zTab
8159   );
8160   if( zSql==0 ) return SQLITE_NOMEM;
8161   rc = sqlite3_exec(p->dbv, zSql, 0, 0, 0);
8162   sqlite3_free(zSql);
8163 
8164   return rc;
8165 }
8166 
8167 /*
8168 ** This function is called as part of sqlite3_expert_analyze(). Candidate
8169 ** indexes have already been created in database sqlite3expert.dbm, this
8170 ** function populates sqlite_stat1 table in the same database.
8171 **
8172 ** The stat1 data is generated by querying the
8173 */
idxPopulateStat1(sqlite3expert * p,char ** pzErr)8174 static int idxPopulateStat1(sqlite3expert *p, char **pzErr){
8175   int rc = SQLITE_OK;
8176   int nMax =0;
8177   struct IdxRemCtx *pCtx = 0;
8178   struct IdxSampleCtx samplectx;
8179   int i;
8180   i64 iPrev = -100000;
8181   sqlite3_stmt *pAllIndex = 0;
8182   sqlite3_stmt *pIndexXInfo = 0;
8183   sqlite3_stmt *pWrite = 0;
8184 
8185   const char *zAllIndex =
8186     "SELECT s.rowid, s.name, l.name FROM "
8187     "  sqlite_master AS s, "
8188     "  pragma_index_list(s.name) AS l "
8189     "WHERE s.type = 'table'";
8190   const char *zIndexXInfo =
8191     "SELECT name, coll FROM pragma_index_xinfo(?) WHERE key";
8192   const char *zWrite = "INSERT INTO sqlite_stat1 VALUES(?, ?, ?)";
8193 
8194   /* If iSample==0, no sqlite_stat1 data is required. */
8195   if( p->iSample==0 ) return SQLITE_OK;
8196 
8197   rc = idxLargestIndex(p->dbm, &nMax, pzErr);
8198   if( nMax<=0 || rc!=SQLITE_OK ) return rc;
8199 
8200   rc = sqlite3_exec(p->dbm, "ANALYZE; PRAGMA writable_schema=1", 0, 0, 0);
8201 
8202   if( rc==SQLITE_OK ){
8203     int nByte = sizeof(struct IdxRemCtx) + (sizeof(struct IdxRemSlot) * nMax);
8204     pCtx = (struct IdxRemCtx*)idxMalloc(&rc, nByte);
8205   }
8206 
8207   if( rc==SQLITE_OK ){
8208     sqlite3 *dbrem = (p->iSample==100 ? p->db : p->dbv);
8209     rc = sqlite3_create_function(
8210         dbrem, "rem", 2, SQLITE_UTF8, (void*)pCtx, idxRemFunc, 0, 0
8211     );
8212   }
8213   if( rc==SQLITE_OK ){
8214     rc = sqlite3_create_function(
8215         p->db, "sample", 0, SQLITE_UTF8, (void*)&samplectx, idxSampleFunc, 0, 0
8216     );
8217   }
8218 
8219   if( rc==SQLITE_OK ){
8220     pCtx->nSlot = nMax+1;
8221     rc = idxPrepareStmt(p->dbm, &pAllIndex, pzErr, zAllIndex);
8222   }
8223   if( rc==SQLITE_OK ){
8224     rc = idxPrepareStmt(p->dbm, &pIndexXInfo, pzErr, zIndexXInfo);
8225   }
8226   if( rc==SQLITE_OK ){
8227     rc = idxPrepareStmt(p->dbm, &pWrite, pzErr, zWrite);
8228   }
8229 
8230   while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pAllIndex) ){
8231     i64 iRowid = sqlite3_column_int64(pAllIndex, 0);
8232     const char *zTab = (const char*)sqlite3_column_text(pAllIndex, 1);
8233     const char *zIdx = (const char*)sqlite3_column_text(pAllIndex, 2);
8234     if( p->iSample<100 && iPrev!=iRowid ){
8235       samplectx.target = (double)p->iSample / 100.0;
8236       samplectx.iTarget = p->iSample;
8237       samplectx.nRow = 0.0;
8238       samplectx.nRet = 0.0;
8239       rc = idxBuildSampleTable(p, zTab);
8240       if( rc!=SQLITE_OK ) break;
8241     }
8242     rc = idxPopulateOneStat1(p, pIndexXInfo, pWrite, zTab, zIdx, pzErr);
8243     iPrev = iRowid;
8244   }
8245   if( rc==SQLITE_OK && p->iSample<100 ){
8246     rc = sqlite3_exec(p->dbv,
8247         "DROP TABLE IF EXISTS temp." UNIQUE_TABLE_NAME, 0,0,0
8248     );
8249   }
8250 
8251   idxFinalize(&rc, pAllIndex);
8252   idxFinalize(&rc, pIndexXInfo);
8253   idxFinalize(&rc, pWrite);
8254 
8255   for(i=0; i<pCtx->nSlot; i++){
8256     sqlite3_free(pCtx->aSlot[i].z);
8257   }
8258   sqlite3_free(pCtx);
8259 
8260   if( rc==SQLITE_OK ){
8261     rc = sqlite3_exec(p->dbm, "ANALYZE sqlite_master", 0, 0, 0);
8262   }
8263 
8264   sqlite3_exec(p->db, "DROP TABLE IF EXISTS temp."UNIQUE_TABLE_NAME,0,0,0);
8265   return rc;
8266 }
8267 
8268 /*
8269 ** Allocate a new sqlite3expert object.
8270 */
sqlite3_expert_new(sqlite3 * db,char ** pzErrmsg)8271 sqlite3expert *sqlite3_expert_new(sqlite3 *db, char **pzErrmsg){
8272   int rc = SQLITE_OK;
8273   sqlite3expert *pNew;
8274 
8275   pNew = (sqlite3expert*)idxMalloc(&rc, sizeof(sqlite3expert));
8276 
8277   /* Open two in-memory databases to work with. The "vtab database" (dbv)
8278   ** will contain a virtual table corresponding to each real table in
8279   ** the user database schema, and a copy of each view. It is used to
8280   ** collect information regarding the WHERE, ORDER BY and other clauses
8281   ** of the user's query.
8282   */
8283   if( rc==SQLITE_OK ){
8284     pNew->db = db;
8285     pNew->iSample = 100;
8286     rc = sqlite3_open(":memory:", &pNew->dbv);
8287   }
8288   if( rc==SQLITE_OK ){
8289     rc = sqlite3_open(":memory:", &pNew->dbm);
8290     if( rc==SQLITE_OK ){
8291       sqlite3_db_config(pNew->dbm, SQLITE_DBCONFIG_TRIGGER_EQP, 1, (int*)0);
8292     }
8293   }
8294 
8295 
8296   /* Copy the entire schema of database [db] into [dbm]. */
8297   if( rc==SQLITE_OK ){
8298     sqlite3_stmt *pSql;
8299     rc = idxPrintfPrepareStmt(pNew->db, &pSql, pzErrmsg,
8300         "SELECT sql FROM sqlite_master WHERE name NOT LIKE 'sqlite_%%'"
8301         " AND sql NOT LIKE 'CREATE VIRTUAL %%'"
8302     );
8303     while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
8304       const char *zSql = (const char*)sqlite3_column_text(pSql, 0);
8305       rc = sqlite3_exec(pNew->dbm, zSql, 0, 0, pzErrmsg);
8306     }
8307     idxFinalize(&rc, pSql);
8308   }
8309 
8310   /* Create the vtab schema */
8311   if( rc==SQLITE_OK ){
8312     rc = idxCreateVtabSchema(pNew, pzErrmsg);
8313   }
8314 
8315   /* Register the auth callback with dbv */
8316   if( rc==SQLITE_OK ){
8317     sqlite3_set_authorizer(pNew->dbv, idxAuthCallback, (void*)pNew);
8318   }
8319 
8320   /* If an error has occurred, free the new object and reutrn NULL. Otherwise,
8321   ** return the new sqlite3expert handle.  */
8322   if( rc!=SQLITE_OK ){
8323     sqlite3_expert_destroy(pNew);
8324     pNew = 0;
8325   }
8326   return pNew;
8327 }
8328 
8329 /*
8330 ** Configure an sqlite3expert object.
8331 */
sqlite3_expert_config(sqlite3expert * p,int op,...)8332 int sqlite3_expert_config(sqlite3expert *p, int op, ...){
8333   int rc = SQLITE_OK;
8334   va_list ap;
8335   va_start(ap, op);
8336   switch( op ){
8337     case EXPERT_CONFIG_SAMPLE: {
8338       int iVal = va_arg(ap, int);
8339       if( iVal<0 ) iVal = 0;
8340       if( iVal>100 ) iVal = 100;
8341       p->iSample = iVal;
8342       break;
8343     }
8344     default:
8345       rc = SQLITE_NOTFOUND;
8346       break;
8347   }
8348 
8349   va_end(ap);
8350   return rc;
8351 }
8352 
8353 /*
8354 ** Add an SQL statement to the analysis.
8355 */
sqlite3_expert_sql(sqlite3expert * p,const char * zSql,char ** pzErr)8356 int sqlite3_expert_sql(
8357   sqlite3expert *p,               /* From sqlite3_expert_new() */
8358   const char *zSql,               /* SQL statement to add */
8359   char **pzErr                    /* OUT: Error message (if any) */
8360 ){
8361   IdxScan *pScanOrig = p->pScan;
8362   IdxStatement *pStmtOrig = p->pStatement;
8363   int rc = SQLITE_OK;
8364   const char *zStmt = zSql;
8365 
8366   if( p->bRun ) return SQLITE_MISUSE;
8367 
8368   while( rc==SQLITE_OK && zStmt && zStmt[0] ){
8369     sqlite3_stmt *pStmt = 0;
8370     rc = sqlite3_prepare_v2(p->dbv, zStmt, -1, &pStmt, &zStmt);
8371     if( rc==SQLITE_OK ){
8372       if( pStmt ){
8373         IdxStatement *pNew;
8374         const char *z = sqlite3_sql(pStmt);
8375         int n = STRLEN(z);
8376         pNew = (IdxStatement*)idxMalloc(&rc, sizeof(IdxStatement) + n+1);
8377         if( rc==SQLITE_OK ){
8378           pNew->zSql = (char*)&pNew[1];
8379           memcpy(pNew->zSql, z, n+1);
8380           pNew->pNext = p->pStatement;
8381           if( p->pStatement ) pNew->iId = p->pStatement->iId+1;
8382           p->pStatement = pNew;
8383         }
8384         sqlite3_finalize(pStmt);
8385       }
8386     }else{
8387       idxDatabaseError(p->dbv, pzErr);
8388     }
8389   }
8390 
8391   if( rc!=SQLITE_OK ){
8392     idxScanFree(p->pScan, pScanOrig);
8393     idxStatementFree(p->pStatement, pStmtOrig);
8394     p->pScan = pScanOrig;
8395     p->pStatement = pStmtOrig;
8396   }
8397 
8398   return rc;
8399 }
8400 
sqlite3_expert_analyze(sqlite3expert * p,char ** pzErr)8401 int sqlite3_expert_analyze(sqlite3expert *p, char **pzErr){
8402   int rc;
8403   IdxHashEntry *pEntry;
8404 
8405   /* Do trigger processing to collect any extra IdxScan structures */
8406   rc = idxProcessTriggers(p, pzErr);
8407 
8408   /* Create candidate indexes within the in-memory database file */
8409   if( rc==SQLITE_OK ){
8410     rc = idxCreateCandidates(p);
8411   }
8412 
8413   /* Generate the stat1 data */
8414   if( rc==SQLITE_OK ){
8415     rc = idxPopulateStat1(p, pzErr);
8416   }
8417 
8418   /* Formulate the EXPERT_REPORT_CANDIDATES text */
8419   for(pEntry=p->hIdx.pFirst; pEntry; pEntry=pEntry->pNext){
8420     p->zCandidates = idxAppendText(&rc, p->zCandidates,
8421         "%s;%s%s\n", pEntry->zVal,
8422         pEntry->zVal2 ? " -- stat1: " : "", pEntry->zVal2
8423     );
8424   }
8425 
8426   /* Figure out which of the candidate indexes are preferred by the query
8427   ** planner and report the results to the user.  */
8428   if( rc==SQLITE_OK ){
8429     rc = idxFindIndexes(p, pzErr);
8430   }
8431 
8432   if( rc==SQLITE_OK ){
8433     p->bRun = 1;
8434   }
8435   return rc;
8436 }
8437 
8438 /*
8439 ** Return the total number of statements that have been added to this
8440 ** sqlite3expert using sqlite3_expert_sql().
8441 */
sqlite3_expert_count(sqlite3expert * p)8442 int sqlite3_expert_count(sqlite3expert *p){
8443   int nRet = 0;
8444   if( p->pStatement ) nRet = p->pStatement->iId+1;
8445   return nRet;
8446 }
8447 
8448 /*
8449 ** Return a component of the report.
8450 */
sqlite3_expert_report(sqlite3expert * p,int iStmt,int eReport)8451 const char *sqlite3_expert_report(sqlite3expert *p, int iStmt, int eReport){
8452   const char *zRet = 0;
8453   IdxStatement *pStmt;
8454 
8455   if( p->bRun==0 ) return 0;
8456   for(pStmt=p->pStatement; pStmt && pStmt->iId!=iStmt; pStmt=pStmt->pNext);
8457   switch( eReport ){
8458     case EXPERT_REPORT_SQL:
8459       if( pStmt ) zRet = pStmt->zSql;
8460       break;
8461     case EXPERT_REPORT_INDEXES:
8462       if( pStmt ) zRet = pStmt->zIdx;
8463       break;
8464     case EXPERT_REPORT_PLAN:
8465       if( pStmt ) zRet = pStmt->zEQP;
8466       break;
8467     case EXPERT_REPORT_CANDIDATES:
8468       zRet = p->zCandidates;
8469       break;
8470   }
8471   return zRet;
8472 }
8473 
8474 /*
8475 ** Free an sqlite3expert object.
8476 */
sqlite3_expert_destroy(sqlite3expert * p)8477 void sqlite3_expert_destroy(sqlite3expert *p){
8478   if( p ){
8479     sqlite3_close(p->dbm);
8480     sqlite3_close(p->dbv);
8481     idxScanFree(p->pScan, 0);
8482     idxStatementFree(p->pStatement, 0);
8483     idxTableFree(p->pTable);
8484     idxWriteFree(p->pWrite);
8485     idxHashClear(&p->hIdx);
8486     sqlite3_free(p->zCandidates);
8487     sqlite3_free(p);
8488   }
8489 }
8490 
8491 #endif /* ifndef SQLITE_OMIT_VIRTUAL_TABLE */
8492 
8493 /************************* End ../ext/expert/sqlite3expert.c ********************/
8494 
8495 #if defined(SQLITE_ENABLE_SESSION)
8496 /*
8497 ** State information for a single open session
8498 */
8499 typedef struct OpenSession OpenSession;
8500 struct OpenSession {
8501   char *zName;             /* Symbolic name for this session */
8502   int nFilter;             /* Number of xFilter rejection GLOB patterns */
8503   char **azFilter;         /* Array of xFilter rejection GLOB patterns */
8504   sqlite3_session *p;      /* The open session */
8505 };
8506 #endif
8507 
8508 /*
8509 ** Shell output mode information from before ".explain on",
8510 ** saved so that it can be restored by ".explain off"
8511 */
8512 typedef struct SavedModeInfo SavedModeInfo;
8513 struct SavedModeInfo {
8514   int valid;          /* Is there legit data in here? */
8515   int mode;           /* Mode prior to ".explain on" */
8516   int showHeader;     /* The ".header" setting prior to ".explain on" */
8517   int colWidth[100];  /* Column widths prior to ".explain on" */
8518 };
8519 
8520 typedef struct ExpertInfo ExpertInfo;
8521 struct ExpertInfo {
8522   sqlite3expert *pExpert;
8523   int bVerbose;
8524 };
8525 
8526 /* A single line in the EQP output */
8527 typedef struct EQPGraphRow EQPGraphRow;
8528 struct EQPGraphRow {
8529   int iEqpId;           /* ID for this row */
8530   int iParentId;        /* ID of the parent row */
8531   EQPGraphRow *pNext;   /* Next row in sequence */
8532   char zText[1];        /* Text to display for this row */
8533 };
8534 
8535 /* All EQP output is collected into an instance of the following */
8536 typedef struct EQPGraph EQPGraph;
8537 struct EQPGraph {
8538   EQPGraphRow *pRow;    /* Linked list of all rows of the EQP output */
8539   EQPGraphRow *pLast;   /* Last element of the pRow list */
8540   char zPrefix[100];    /* Graph prefix */
8541 };
8542 
8543 /*
8544 ** State information about the database connection is contained in an
8545 ** instance of the following structure.
8546 */
8547 typedef struct ShellState ShellState;
8548 struct ShellState {
8549   sqlite3 *db;           /* The database */
8550   u8 autoExplain;        /* Automatically turn on .explain mode */
8551   u8 autoEQP;            /* Run EXPLAIN QUERY PLAN prior to seach SQL stmt */
8552   u8 autoEQPtest;        /* autoEQP is in test mode */
8553   u8 statsOn;            /* True to display memory stats before each finalize */
8554   u8 scanstatsOn;        /* True to display scan stats before each finalize */
8555   u8 openMode;           /* SHELL_OPEN_NORMAL, _APPENDVFS, or _ZIPFILE */
8556   u8 doXdgOpen;          /* Invoke start/open/xdg-open in output_reset() */
8557   u8 nEqpLevel;          /* Depth of the EQP output graph */
8558   unsigned mEqpLines;    /* Mask of veritical lines in the EQP output graph */
8559   int outCount;          /* Revert to stdout when reaching zero */
8560   int cnt;               /* Number of records displayed so far */
8561   FILE *out;             /* Write results here */
8562   FILE *traceOut;        /* Output for sqlite3_trace() */
8563   int nErr;              /* Number of errors seen */
8564   int mode;              /* An output mode setting */
8565   int modePrior;         /* Saved mode */
8566   int cMode;             /* temporary output mode for the current query */
8567   int normalMode;        /* Output mode before ".explain on" */
8568   int writableSchema;    /* True if PRAGMA writable_schema=ON */
8569   int showHeader;        /* True to show column names in List or Column mode */
8570   int nCheck;            /* Number of ".check" commands run */
8571   unsigned shellFlgs;    /* Various flags */
8572   char *zDestTable;      /* Name of destination table when MODE_Insert */
8573   char *zTempFile;       /* Temporary file that might need deleting */
8574   char zTestcase[30];    /* Name of current test case */
8575   char colSeparator[20]; /* Column separator character for several modes */
8576   char rowSeparator[20]; /* Row separator character for MODE_Ascii */
8577   char colSepPrior[20];  /* Saved column separator */
8578   char rowSepPrior[20];  /* Saved row separator */
8579   int colWidth[100];     /* Requested width of each column when in column mode*/
8580   int actualWidth[100];  /* Actual width of each column */
8581   char nullValue[20];    /* The text to print when a NULL comes back from
8582                          ** the database */
8583   char outfile[FILENAME_MAX]; /* Filename for *out */
8584   const char *zDbFilename;    /* name of the database file */
8585   char *zFreeOnClose;         /* Filename to free when closing */
8586   const char *zVfs;           /* Name of VFS to use */
8587   sqlite3_stmt *pStmt;   /* Current statement if any. */
8588   FILE *pLog;            /* Write log output here */
8589   int *aiIndent;         /* Array of indents used in MODE_Explain */
8590   int nIndent;           /* Size of array aiIndent[] */
8591   int iIndent;           /* Index of current op in aiIndent[] */
8592   EQPGraph sGraph;       /* Information for the graphical EXPLAIN QUERY PLAN */
8593 #if defined(SQLITE_ENABLE_SESSION)
8594   int nSession;             /* Number of active sessions */
8595   OpenSession aSession[4];  /* Array of sessions.  [0] is in focus. */
8596 #endif
8597   ExpertInfo expert;        /* Valid if previous command was ".expert OPT..." */
8598 };
8599 
8600 
8601 /* Allowed values for ShellState.autoEQP
8602 */
8603 #define AUTOEQP_off      0           /* Automatic EXPLAIN QUERY PLAN is off */
8604 #define AUTOEQP_on       1           /* Automatic EQP is on */
8605 #define AUTOEQP_trigger  2           /* On and also show plans for triggers */
8606 #define AUTOEQP_full     3           /* Show full EXPLAIN */
8607 
8608 /* Allowed values for ShellState.openMode
8609 */
8610 #define SHELL_OPEN_UNSPEC      0      /* No open-mode specified */
8611 #define SHELL_OPEN_NORMAL      1      /* Normal database file */
8612 #define SHELL_OPEN_APPENDVFS   2      /* Use appendvfs */
8613 #define SHELL_OPEN_ZIPFILE     3      /* Use the zipfile virtual table */
8614 #define SHELL_OPEN_READONLY    4      /* Open a normal database read-only */
8615 #define SHELL_OPEN_DESERIALIZE 5      /* Open using sqlite3_deserialize() */
8616 
8617 /*
8618 ** These are the allowed shellFlgs values
8619 */
8620 #define SHFLG_Pagecache      0x00000001 /* The --pagecache option is used */
8621 #define SHFLG_Lookaside      0x00000002 /* Lookaside memory is used */
8622 #define SHFLG_Backslash      0x00000004 /* The --backslash option is used */
8623 #define SHFLG_PreserveRowid  0x00000008 /* .dump preserves rowid values */
8624 #define SHFLG_Newlines       0x00000010 /* .dump --newline flag */
8625 #define SHFLG_CountChanges   0x00000020 /* .changes setting */
8626 #define SHFLG_Echo           0x00000040 /* .echo or --echo setting */
8627 
8628 /*
8629 ** Macros for testing and setting shellFlgs
8630 */
8631 #define ShellHasFlag(P,X)    (((P)->shellFlgs & (X))!=0)
8632 #define ShellSetFlag(P,X)    ((P)->shellFlgs|=(X))
8633 #define ShellClearFlag(P,X)  ((P)->shellFlgs&=(~(X)))
8634 
8635 /*
8636 ** These are the allowed modes.
8637 */
8638 #define MODE_Line     0  /* One column per line.  Blank line between records */
8639 #define MODE_Column   1  /* One record per line in neat columns */
8640 #define MODE_List     2  /* One record per line with a separator */
8641 #define MODE_Semi     3  /* Same as MODE_List but append ";" to each line */
8642 #define MODE_Html     4  /* Generate an XHTML table */
8643 #define MODE_Insert   5  /* Generate SQL "insert" statements */
8644 #define MODE_Quote    6  /* Quote values as for SQL */
8645 #define MODE_Tcl      7  /* Generate ANSI-C or TCL quoted elements */
8646 #define MODE_Csv      8  /* Quote strings, numbers are plain */
8647 #define MODE_Explain  9  /* Like MODE_Column, but do not truncate data */
8648 #define MODE_Ascii   10  /* Use ASCII unit and record separators (0x1F/0x1E) */
8649 #define MODE_Pretty  11  /* Pretty-print schemas */
8650 #define MODE_EQP     12  /* Converts EXPLAIN QUERY PLAN output into a graph */
8651 
8652 static const char *modeDescr[] = {
8653   "line",
8654   "column",
8655   "list",
8656   "semi",
8657   "html",
8658   "insert",
8659   "quote",
8660   "tcl",
8661   "csv",
8662   "explain",
8663   "ascii",
8664   "prettyprint",
8665   "eqp"
8666 };
8667 
8668 /*
8669 ** These are the column/row/line separators used by the various
8670 ** import/export modes.
8671 */
8672 #define SEP_Column    "|"
8673 #define SEP_Row       "\n"
8674 #define SEP_Tab       "\t"
8675 #define SEP_Space     " "
8676 #define SEP_Comma     ","
8677 #define SEP_CrLf      "\r\n"
8678 #define SEP_Unit      "\x1F"
8679 #define SEP_Record    "\x1E"
8680 
8681 /*
8682 ** A callback for the sqlite3_log() interface.
8683 */
shellLog(void * pArg,int iErrCode,const char * zMsg)8684 static void shellLog(void *pArg, int iErrCode, const char *zMsg){
8685   ShellState *p = (ShellState*)pArg;
8686   if( p->pLog==0 ) return;
8687   utf8_printf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
8688   fflush(p->pLog);
8689 }
8690 
8691 /*
8692 ** SQL function:  shell_putsnl(X)
8693 **
8694 ** Write the text X to the screen (or whatever output is being directed)
8695 ** adding a newline at the end, and then return X.
8696 */
shellPutsFunc(sqlite3_context * pCtx,int nVal,sqlite3_value ** apVal)8697 static void shellPutsFunc(
8698   sqlite3_context *pCtx,
8699   int nVal,
8700   sqlite3_value **apVal
8701 ){
8702   ShellState *p = (ShellState*)sqlite3_user_data(pCtx);
8703   (void)nVal;
8704   utf8_printf(p->out, "%s\n", sqlite3_value_text(apVal[0]));
8705   sqlite3_result_value(pCtx, apVal[0]);
8706 }
8707 
8708 /*
8709 ** SQL function:   edit(VALUE)
8710 **                 edit(VALUE,EDITOR)
8711 **
8712 ** These steps:
8713 **
8714 **     (1) Write VALUE into a temporary file.
8715 **     (2) Run program EDITOR on that temporary file.
8716 **     (3) Read the temporary file back and return its content as the result.
8717 **     (4) Delete the temporary file
8718 **
8719 ** If the EDITOR argument is omitted, use the value in the VISUAL
8720 ** environment variable.  If still there is no EDITOR, through an error.
8721 **
8722 ** Also throw an error if the EDITOR program returns a non-zero exit code.
8723 */
8724 #ifndef SQLITE_NOHAVE_SYSTEM
editFunc(sqlite3_context * context,int argc,sqlite3_value ** argv)8725 static void editFunc(
8726   sqlite3_context *context,
8727   int argc,
8728   sqlite3_value **argv
8729 ){
8730   const char *zEditor;
8731   char *zTempFile = 0;
8732   sqlite3 *db;
8733   char *zCmd = 0;
8734   int bBin;
8735   int rc;
8736   int hasCRNL = 0;
8737   FILE *f = 0;
8738   sqlite3_int64 sz;
8739   sqlite3_int64 x;
8740   unsigned char *p = 0;
8741 
8742   if( argc==2 ){
8743     zEditor = (const char*)sqlite3_value_text(argv[1]);
8744   }else{
8745     zEditor = getenv("VISUAL");
8746   }
8747   if( zEditor==0 ){
8748     sqlite3_result_error(context, "no editor for edit()", -1);
8749     return;
8750   }
8751   if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
8752     sqlite3_result_error(context, "NULL input to edit()", -1);
8753     return;
8754   }
8755   db = sqlite3_context_db_handle(context);
8756   zTempFile = 0;
8757   sqlite3_file_control(db, 0, SQLITE_FCNTL_TEMPFILENAME, &zTempFile);
8758   if( zTempFile==0 ){
8759     sqlite3_uint64 r = 0;
8760     sqlite3_randomness(sizeof(r), &r);
8761     zTempFile = sqlite3_mprintf("temp%llx", r);
8762     if( zTempFile==0 ){
8763       sqlite3_result_error_nomem(context);
8764       return;
8765     }
8766   }
8767   bBin = sqlite3_value_type(argv[0])==SQLITE_BLOB;
8768   /* When writing the file to be edited, do \n to \r\n conversions on systems
8769   ** that want \r\n line endings */
8770   f = fopen(zTempFile, bBin ? "wb" : "w");
8771   if( f==0 ){
8772     sqlite3_result_error(context, "edit() cannot open temp file", -1);
8773     goto edit_func_end;
8774   }
8775   sz = sqlite3_value_bytes(argv[0]);
8776   if( bBin ){
8777     x = fwrite(sqlite3_value_blob(argv[0]), 1, sz, f);
8778   }else{
8779     const char *z = (const char*)sqlite3_value_text(argv[0]);
8780     /* Remember whether or not the value originally contained \r\n */
8781     if( z && strstr(z,"\r\n")!=0 ) hasCRNL = 1;
8782     x = fwrite(sqlite3_value_text(argv[0]), 1, sz, f);
8783   }
8784   fclose(f);
8785   f = 0;
8786   if( x!=sz ){
8787     sqlite3_result_error(context, "edit() could not write the whole file", -1);
8788     goto edit_func_end;
8789   }
8790   zCmd = sqlite3_mprintf("%s \"%s\"", zEditor, zTempFile);
8791   if( zCmd==0 ){
8792     sqlite3_result_error_nomem(context);
8793     goto edit_func_end;
8794   }
8795   rc = system(zCmd);
8796   sqlite3_free(zCmd);
8797   if( rc ){
8798     sqlite3_result_error(context, "EDITOR returned non-zero", -1);
8799     goto edit_func_end;
8800   }
8801   f = fopen(zTempFile, "rb");
8802   if( f==0 ){
8803     sqlite3_result_error(context,
8804       "edit() cannot reopen temp file after edit", -1);
8805     goto edit_func_end;
8806   }
8807   fseek(f, 0, SEEK_END);
8808   sz = ftell(f);
8809   rewind(f);
8810   p = sqlite3_malloc64( sz+(bBin==0) );
8811   if( p==0 ){
8812     sqlite3_result_error_nomem(context);
8813     goto edit_func_end;
8814   }
8815   x = fread(p, 1, sz, f);
8816   fclose(f);
8817   f = 0;
8818   if( x!=sz ){
8819     sqlite3_result_error(context, "could not read back the whole file", -1);
8820     goto edit_func_end;
8821   }
8822   if( bBin ){
8823     sqlite3_result_blob64(context, p, sz, sqlite3_free);
8824   }else{
8825     sqlite3_int64 i, j;
8826     if( hasCRNL ){
8827       /* If the original contains \r\n then do no conversions back to \n */
8828       j = sz;
8829     }else{
8830       /* If the file did not originally contain \r\n then convert any new
8831       ** \r\n back into \n */
8832       for(i=j=0; i<sz; i++){
8833         if( p[i]=='\r' && p[i+1]=='\n' ) i++;
8834         p[j++] = p[i];
8835       }
8836       sz = j;
8837       p[sz] = 0;
8838     }
8839     sqlite3_result_text64(context, (const char*)p, sz,
8840                           sqlite3_free, SQLITE_UTF8);
8841   }
8842   p = 0;
8843 
8844 edit_func_end:
8845   if( f ) fclose(f);
8846   unlink(zTempFile);
8847   sqlite3_free(zTempFile);
8848   sqlite3_free(p);
8849 }
8850 #endif /* SQLITE_NOHAVE_SYSTEM */
8851 
8852 /*
8853 ** Save or restore the current output mode
8854 */
outputModePush(ShellState * p)8855 static void outputModePush(ShellState *p){
8856   p->modePrior = p->mode;
8857   memcpy(p->colSepPrior, p->colSeparator, sizeof(p->colSeparator));
8858   memcpy(p->rowSepPrior, p->rowSeparator, sizeof(p->rowSeparator));
8859 }
outputModePop(ShellState * p)8860 static void outputModePop(ShellState *p){
8861   p->mode = p->modePrior;
8862   memcpy(p->colSeparator, p->colSepPrior, sizeof(p->colSeparator));
8863   memcpy(p->rowSeparator, p->rowSepPrior, sizeof(p->rowSeparator));
8864 }
8865 
8866 /*
8867 ** Output the given string as a hex-encoded blob (eg. X'1234' )
8868 */
output_hex_blob(FILE * out,const void * pBlob,int nBlob)8869 static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
8870   int i;
8871   char *zBlob = (char *)pBlob;
8872   raw_printf(out,"X'");
8873   for(i=0; i<nBlob; i++){ raw_printf(out,"%02x",zBlob[i]&0xff); }
8874   raw_printf(out,"'");
8875 }
8876 
8877 /*
8878 ** Find a string that is not found anywhere in z[].  Return a pointer
8879 ** to that string.
8880 **
8881 ** Try to use zA and zB first.  If both of those are already found in z[]
8882 ** then make up some string and store it in the buffer zBuf.
8883 */
unused_string(const char * z,const char * zA,const char * zB,char * zBuf)8884 static const char *unused_string(
8885   const char *z,                    /* Result must not appear anywhere in z */
8886   const char *zA, const char *zB,   /* Try these first */
8887   char *zBuf                        /* Space to store a generated string */
8888 ){
8889   unsigned i = 0;
8890   if( strstr(z, zA)==0 ) return zA;
8891   if( strstr(z, zB)==0 ) return zB;
8892   do{
8893     sqlite3_snprintf(20,zBuf,"(%s%u)", zA, i++);
8894   }while( strstr(z,zBuf)!=0 );
8895   return zBuf;
8896 }
8897 
8898 /*
8899 ** Output the given string as a quoted string using SQL quoting conventions.
8900 **
8901 ** See also: output_quoted_escaped_string()
8902 */
output_quoted_string(FILE * out,const char * z)8903 static void output_quoted_string(FILE *out, const char *z){
8904   int i;
8905   char c;
8906   setBinaryMode(out, 1);
8907   for(i=0; (c = z[i])!=0 && c!='\''; i++){}
8908   if( c==0 ){
8909     utf8_printf(out,"'%s'",z);
8910   }else{
8911     raw_printf(out, "'");
8912     while( *z ){
8913       for(i=0; (c = z[i])!=0 && c!='\''; i++){}
8914       if( c=='\'' ) i++;
8915       if( i ){
8916         utf8_printf(out, "%.*s", i, z);
8917         z += i;
8918       }
8919       if( c=='\'' ){
8920         raw_printf(out, "'");
8921         continue;
8922       }
8923       if( c==0 ){
8924         break;
8925       }
8926       z++;
8927     }
8928     raw_printf(out, "'");
8929   }
8930   setTextMode(out, 1);
8931 }
8932 
8933 /*
8934 ** Output the given string as a quoted string using SQL quoting conventions.
8935 ** Additionallly , escape the "\n" and "\r" characters so that they do not
8936 ** get corrupted by end-of-line translation facilities in some operating
8937 ** systems.
8938 **
8939 ** This is like output_quoted_string() but with the addition of the \r\n
8940 ** escape mechanism.
8941 */
output_quoted_escaped_string(FILE * out,const char * z)8942 static void output_quoted_escaped_string(FILE *out, const char *z){
8943   int i;
8944   char c;
8945   setBinaryMode(out, 1);
8946   for(i=0; (c = z[i])!=0 && c!='\'' && c!='\n' && c!='\r'; i++){}
8947   if( c==0 ){
8948     utf8_printf(out,"'%s'",z);
8949   }else{
8950     const char *zNL = 0;
8951     const char *zCR = 0;
8952     int nNL = 0;
8953     int nCR = 0;
8954     char zBuf1[20], zBuf2[20];
8955     for(i=0; z[i]; i++){
8956       if( z[i]=='\n' ) nNL++;
8957       if( z[i]=='\r' ) nCR++;
8958     }
8959     if( nNL ){
8960       raw_printf(out, "replace(");
8961       zNL = unused_string(z, "\\n", "\\012", zBuf1);
8962     }
8963     if( nCR ){
8964       raw_printf(out, "replace(");
8965       zCR = unused_string(z, "\\r", "\\015", zBuf2);
8966     }
8967     raw_printf(out, "'");
8968     while( *z ){
8969       for(i=0; (c = z[i])!=0 && c!='\n' && c!='\r' && c!='\''; i++){}
8970       if( c=='\'' ) i++;
8971       if( i ){
8972         utf8_printf(out, "%.*s", i, z);
8973         z += i;
8974       }
8975       if( c=='\'' ){
8976         raw_printf(out, "'");
8977         continue;
8978       }
8979       if( c==0 ){
8980         break;
8981       }
8982       z++;
8983       if( c=='\n' ){
8984         raw_printf(out, "%s", zNL);
8985         continue;
8986       }
8987       raw_printf(out, "%s", zCR);
8988     }
8989     raw_printf(out, "'");
8990     if( nCR ){
8991       raw_printf(out, ",'%s',char(13))", zCR);
8992     }
8993     if( nNL ){
8994       raw_printf(out, ",'%s',char(10))", zNL);
8995     }
8996   }
8997   setTextMode(out, 1);
8998 }
8999 
9000 /*
9001 ** Output the given string as a quoted according to C or TCL quoting rules.
9002 */
output_c_string(FILE * out,const char * z)9003 static void output_c_string(FILE *out, const char *z){
9004   unsigned int c;
9005   fputc('"', out);
9006   while( (c = *(z++))!=0 ){
9007     if( c=='\\' ){
9008       fputc(c, out);
9009       fputc(c, out);
9010     }else if( c=='"' ){
9011       fputc('\\', out);
9012       fputc('"', out);
9013     }else if( c=='\t' ){
9014       fputc('\\', out);
9015       fputc('t', out);
9016     }else if( c=='\n' ){
9017       fputc('\\', out);
9018       fputc('n', out);
9019     }else if( c=='\r' ){
9020       fputc('\\', out);
9021       fputc('r', out);
9022     }else if( !isprint(c&0xff) ){
9023       raw_printf(out, "\\%03o", c&0xff);
9024     }else{
9025       fputc(c, out);
9026     }
9027   }
9028   fputc('"', out);
9029 }
9030 
9031 /*
9032 ** Output the given string with characters that are special to
9033 ** HTML escaped.
9034 */
output_html_string(FILE * out,const char * z)9035 static void output_html_string(FILE *out, const char *z){
9036   int i;
9037   if( z==0 ) z = "";
9038   while( *z ){
9039     for(i=0;   z[i]
9040             && z[i]!='<'
9041             && z[i]!='&'
9042             && z[i]!='>'
9043             && z[i]!='\"'
9044             && z[i]!='\'';
9045         i++){}
9046     if( i>0 ){
9047       utf8_printf(out,"%.*s",i,z);
9048     }
9049     if( z[i]=='<' ){
9050       raw_printf(out,"&lt;");
9051     }else if( z[i]=='&' ){
9052       raw_printf(out,"&amp;");
9053     }else if( z[i]=='>' ){
9054       raw_printf(out,"&gt;");
9055     }else if( z[i]=='\"' ){
9056       raw_printf(out,"&quot;");
9057     }else if( z[i]=='\'' ){
9058       raw_printf(out,"&#39;");
9059     }else{
9060       break;
9061     }
9062     z += i + 1;
9063   }
9064 }
9065 
9066 /*
9067 ** If a field contains any character identified by a 1 in the following
9068 ** array, then the string must be quoted for CSV.
9069 */
9070 static const char needCsvQuote[] = {
9071   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
9072   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
9073   1, 0, 1, 0, 0, 0, 0, 1,   0, 0, 0, 0, 0, 0, 0, 0,
9074   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
9075   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
9076   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
9077   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
9078   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 1,
9079   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
9080   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
9081   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
9082   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
9083   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
9084   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
9085   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
9086   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
9087 };
9088 
9089 /*
9090 ** Output a single term of CSV.  Actually, p->colSeparator is used for
9091 ** the separator, which may or may not be a comma.  p->nullValue is
9092 ** the null value.  Strings are quoted if necessary.  The separator
9093 ** is only issued if bSep is true.
9094 */
output_csv(ShellState * p,const char * z,int bSep)9095 static void output_csv(ShellState *p, const char *z, int bSep){
9096   FILE *out = p->out;
9097   if( z==0 ){
9098     utf8_printf(out,"%s",p->nullValue);
9099   }else{
9100     int i;
9101     int nSep = strlen30(p->colSeparator);
9102     for(i=0; z[i]; i++){
9103       if( needCsvQuote[((unsigned char*)z)[i]]
9104          || (z[i]==p->colSeparator[0] &&
9105              (nSep==1 || memcmp(z, p->colSeparator, nSep)==0)) ){
9106         i = 0;
9107         break;
9108       }
9109     }
9110     if( i==0 ){
9111       char *zQuoted = sqlite3_mprintf("\"%w\"", z);
9112       utf8_printf(out, "%s", zQuoted);
9113       sqlite3_free(zQuoted);
9114     }else{
9115       utf8_printf(out, "%s", z);
9116     }
9117   }
9118   if( bSep ){
9119     utf8_printf(p->out, "%s", p->colSeparator);
9120   }
9121 }
9122 
9123 /*
9124 ** This routine runs when the user presses Ctrl-C
9125 */
interrupt_handler(int NotUsed)9126 static void interrupt_handler(int NotUsed){
9127   UNUSED_PARAMETER(NotUsed);
9128   seenInterrupt++;
9129   if( seenInterrupt>2 ) exit(1);
9130   if( globalDb ) sqlite3_interrupt(globalDb);
9131 }
9132 
9133 #if (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE)
9134 /*
9135 ** This routine runs for console events (e.g. Ctrl-C) on Win32
9136 */
ConsoleCtrlHandler(DWORD dwCtrlType)9137 static BOOL WINAPI ConsoleCtrlHandler(
9138   DWORD dwCtrlType /* One of the CTRL_*_EVENT constants */
9139 ){
9140   if( dwCtrlType==CTRL_C_EVENT ){
9141     interrupt_handler(0);
9142     return TRUE;
9143   }
9144   return FALSE;
9145 }
9146 #endif
9147 
9148 #ifndef SQLITE_OMIT_AUTHORIZATION
9149 /*
9150 ** When the ".auth ON" is set, the following authorizer callback is
9151 ** invoked.  It always returns SQLITE_OK.
9152 */
shellAuth(void * pClientData,int op,const char * zA1,const char * zA2,const char * zA3,const char * zA4)9153 static int shellAuth(
9154   void *pClientData,
9155   int op,
9156   const char *zA1,
9157   const char *zA2,
9158   const char *zA3,
9159   const char *zA4
9160 ){
9161   ShellState *p = (ShellState*)pClientData;
9162   static const char *azAction[] = { 0,
9163      "CREATE_INDEX",         "CREATE_TABLE",         "CREATE_TEMP_INDEX",
9164      "CREATE_TEMP_TABLE",    "CREATE_TEMP_TRIGGER",  "CREATE_TEMP_VIEW",
9165      "CREATE_TRIGGER",       "CREATE_VIEW",          "DELETE",
9166      "DROP_INDEX",           "DROP_TABLE",           "DROP_TEMP_INDEX",
9167      "DROP_TEMP_TABLE",      "DROP_TEMP_TRIGGER",    "DROP_TEMP_VIEW",
9168      "DROP_TRIGGER",         "DROP_VIEW",            "INSERT",
9169      "PRAGMA",               "READ",                 "SELECT",
9170      "TRANSACTION",          "UPDATE",               "ATTACH",
9171      "DETACH",               "ALTER_TABLE",          "REINDEX",
9172      "ANALYZE",              "CREATE_VTABLE",        "DROP_VTABLE",
9173      "FUNCTION",             "SAVEPOINT",            "RECURSIVE"
9174   };
9175   int i;
9176   const char *az[4];
9177   az[0] = zA1;
9178   az[1] = zA2;
9179   az[2] = zA3;
9180   az[3] = zA4;
9181   utf8_printf(p->out, "authorizer: %s", azAction[op]);
9182   for(i=0; i<4; i++){
9183     raw_printf(p->out, " ");
9184     if( az[i] ){
9185       output_c_string(p->out, az[i]);
9186     }else{
9187       raw_printf(p->out, "NULL");
9188     }
9189   }
9190   raw_printf(p->out, "\n");
9191   return SQLITE_OK;
9192 }
9193 #endif
9194 
9195 /*
9196 ** Print a schema statement.  Part of MODE_Semi and MODE_Pretty output.
9197 **
9198 ** This routine converts some CREATE TABLE statements for shadow tables
9199 ** in FTS3/4/5 into CREATE TABLE IF NOT EXISTS statements.
9200 */
printSchemaLine(FILE * out,const char * z,const char * zTail)9201 static void printSchemaLine(FILE *out, const char *z, const char *zTail){
9202   if( sqlite3_strglob("CREATE TABLE ['\"]*", z)==0 ){
9203     utf8_printf(out, "CREATE TABLE IF NOT EXISTS %s%s", z+13, zTail);
9204   }else{
9205     utf8_printf(out, "%s%s", z, zTail);
9206   }
9207 }
printSchemaLineN(FILE * out,char * z,int n,const char * zTail)9208 static void printSchemaLineN(FILE *out, char *z, int n, const char *zTail){
9209   char c = z[n];
9210   z[n] = 0;
9211   printSchemaLine(out, z, zTail);
9212   z[n] = c;
9213 }
9214 
9215 /*
9216 ** Return true if string z[] has nothing but whitespace and comments to the
9217 ** end of the first line.
9218 */
wsToEol(const char * z)9219 static int wsToEol(const char *z){
9220   int i;
9221   for(i=0; z[i]; i++){
9222     if( z[i]=='\n' ) return 1;
9223     if( IsSpace(z[i]) ) continue;
9224     if( z[i]=='-' && z[i+1]=='-' ) return 1;
9225     return 0;
9226   }
9227   return 1;
9228 }
9229 
9230 /*
9231 ** Add a new entry to the EXPLAIN QUERY PLAN data
9232 */
eqp_append(ShellState * p,int iEqpId,int p2,const char * zText)9233 static void eqp_append(ShellState *p, int iEqpId, int p2, const char *zText){
9234   EQPGraphRow *pNew;
9235   int nText = strlen30(zText);
9236   if( p->autoEQPtest ){
9237     utf8_printf(p->out, "%d,%d,%s\n", iEqpId, p2, zText);
9238   }
9239   pNew = sqlite3_malloc64( sizeof(*pNew) + nText );
9240   if( pNew==0 ) shell_out_of_memory();
9241   pNew->iEqpId = iEqpId;
9242   pNew->iParentId = p2;
9243   memcpy(pNew->zText, zText, nText+1);
9244   pNew->pNext = 0;
9245   if( p->sGraph.pLast ){
9246     p->sGraph.pLast->pNext = pNew;
9247   }else{
9248     p->sGraph.pRow = pNew;
9249   }
9250   p->sGraph.pLast = pNew;
9251 }
9252 
9253 /*
9254 ** Free and reset the EXPLAIN QUERY PLAN data that has been collected
9255 ** in p->sGraph.
9256 */
eqp_reset(ShellState * p)9257 static void eqp_reset(ShellState *p){
9258   EQPGraphRow *pRow, *pNext;
9259   for(pRow = p->sGraph.pRow; pRow; pRow = pNext){
9260     pNext = pRow->pNext;
9261     sqlite3_free(pRow);
9262   }
9263   memset(&p->sGraph, 0, sizeof(p->sGraph));
9264 }
9265 
9266 /* Return the next EXPLAIN QUERY PLAN line with iEqpId that occurs after
9267 ** pOld, or return the first such line if pOld is NULL
9268 */
eqp_next_row(ShellState * p,int iEqpId,EQPGraphRow * pOld)9269 static EQPGraphRow *eqp_next_row(ShellState *p, int iEqpId, EQPGraphRow *pOld){
9270   EQPGraphRow *pRow = pOld ? pOld->pNext : p->sGraph.pRow;
9271   while( pRow && pRow->iParentId!=iEqpId ) pRow = pRow->pNext;
9272   return pRow;
9273 }
9274 
9275 /* Render a single level of the graph that has iEqpId as its parent.  Called
9276 ** recursively to render sublevels.
9277 */
eqp_render_level(ShellState * p,int iEqpId)9278 static void eqp_render_level(ShellState *p, int iEqpId){
9279   EQPGraphRow *pRow, *pNext;
9280   int n = strlen30(p->sGraph.zPrefix);
9281   char *z;
9282   for(pRow = eqp_next_row(p, iEqpId, 0); pRow; pRow = pNext){
9283     pNext = eqp_next_row(p, iEqpId, pRow);
9284     z = pRow->zText;
9285     utf8_printf(p->out, "%s%s%s\n", p->sGraph.zPrefix, pNext ? "|--" : "`--", z);
9286     if( n<(int)sizeof(p->sGraph.zPrefix)-7 ){
9287       memcpy(&p->sGraph.zPrefix[n], pNext ? "|  " : "   ", 4);
9288       eqp_render_level(p, pRow->iEqpId);
9289       p->sGraph.zPrefix[n] = 0;
9290     }
9291   }
9292 }
9293 
9294 /*
9295 ** Display and reset the EXPLAIN QUERY PLAN data
9296 */
eqp_render(ShellState * p)9297 static void eqp_render(ShellState *p){
9298   EQPGraphRow *pRow = p->sGraph.pRow;
9299   if( pRow ){
9300     if( pRow->zText[0]=='-' ){
9301       if( pRow->pNext==0 ){
9302         eqp_reset(p);
9303         return;
9304       }
9305       utf8_printf(p->out, "%s\n", pRow->zText+3);
9306       p->sGraph.pRow = pRow->pNext;
9307       sqlite3_free(pRow);
9308     }else{
9309       utf8_printf(p->out, "QUERY PLAN\n");
9310     }
9311     p->sGraph.zPrefix[0] = 0;
9312     eqp_render_level(p, 0);
9313     eqp_reset(p);
9314   }
9315 }
9316 
9317 /*
9318 ** This is the callback routine that the shell
9319 ** invokes for each row of a query result.
9320 */
shell_callback(void * pArg,int nArg,char ** azArg,char ** azCol,int * aiType)9321 static int shell_callback(
9322   void *pArg,
9323   int nArg,        /* Number of result columns */
9324   char **azArg,    /* Text of each result column */
9325   char **azCol,    /* Column names */
9326   int *aiType      /* Column types */
9327 ){
9328   int i;
9329   ShellState *p = (ShellState*)pArg;
9330 
9331   if( azArg==0 ) return 0;
9332   switch( p->cMode ){
9333     case MODE_Line: {
9334       int w = 5;
9335       if( azArg==0 ) break;
9336       for(i=0; i<nArg; i++){
9337         int len = strlen30(azCol[i] ? azCol[i] : "");
9338         if( len>w ) w = len;
9339       }
9340       if( p->cnt++>0 ) utf8_printf(p->out, "%s", p->rowSeparator);
9341       for(i=0; i<nArg; i++){
9342         utf8_printf(p->out,"%*s = %s%s", w, azCol[i],
9343                 azArg[i] ? azArg[i] : p->nullValue, p->rowSeparator);
9344       }
9345       break;
9346     }
9347     case MODE_Explain:
9348     case MODE_Column: {
9349       static const int aExplainWidths[] = {4, 13, 4, 4, 4, 13, 2, 13};
9350       const int *colWidth;
9351       int showHdr;
9352       char *rowSep;
9353       if( p->cMode==MODE_Column ){
9354         colWidth = p->colWidth;
9355         showHdr = p->showHeader;
9356         rowSep = p->rowSeparator;
9357       }else{
9358         colWidth = aExplainWidths;
9359         showHdr = 1;
9360         rowSep = SEP_Row;
9361       }
9362       if( p->cnt++==0 ){
9363         for(i=0; i<nArg; i++){
9364           int w, n;
9365           if( i<ArraySize(p->colWidth) ){
9366             w = colWidth[i];
9367           }else{
9368             w = 0;
9369           }
9370           if( w==0 ){
9371             w = strlenChar(azCol[i] ? azCol[i] : "");
9372             if( w<10 ) w = 10;
9373             n = strlenChar(azArg && azArg[i] ? azArg[i] : p->nullValue);
9374             if( w<n ) w = n;
9375           }
9376           if( i<ArraySize(p->actualWidth) ){
9377             p->actualWidth[i] = w;
9378           }
9379           if( showHdr ){
9380             utf8_width_print(p->out, w, azCol[i]);
9381             utf8_printf(p->out, "%s", i==nArg-1 ? rowSep : "  ");
9382           }
9383         }
9384         if( showHdr ){
9385           for(i=0; i<nArg; i++){
9386             int w;
9387             if( i<ArraySize(p->actualWidth) ){
9388                w = p->actualWidth[i];
9389                if( w<0 ) w = -w;
9390             }else{
9391                w = 10;
9392             }
9393             utf8_printf(p->out,"%-*.*s%s",w,w,
9394                    "----------------------------------------------------------"
9395                    "----------------------------------------------------------",
9396                     i==nArg-1 ? rowSep : "  ");
9397           }
9398         }
9399       }
9400       if( azArg==0 ) break;
9401       for(i=0; i<nArg; i++){
9402         int w;
9403         if( i<ArraySize(p->actualWidth) ){
9404            w = p->actualWidth[i];
9405         }else{
9406            w = 10;
9407         }
9408         if( p->cMode==MODE_Explain && azArg[i] && strlenChar(azArg[i])>w ){
9409           w = strlenChar(azArg[i]);
9410         }
9411         if( i==1 && p->aiIndent && p->pStmt ){
9412           if( p->iIndent<p->nIndent ){
9413             utf8_printf(p->out, "%*.s", p->aiIndent[p->iIndent], "");
9414           }
9415           p->iIndent++;
9416         }
9417         utf8_width_print(p->out, w, azArg[i] ? azArg[i] : p->nullValue);
9418         utf8_printf(p->out, "%s", i==nArg-1 ? rowSep : "  ");
9419       }
9420       break;
9421     }
9422     case MODE_Semi: {   /* .schema and .fullschema output */
9423       printSchemaLine(p->out, azArg[0], ";\n");
9424       break;
9425     }
9426     case MODE_Pretty: {  /* .schema and .fullschema with --indent */
9427       char *z;
9428       int j;
9429       int nParen = 0;
9430       char cEnd = 0;
9431       char c;
9432       int nLine = 0;
9433       assert( nArg==1 );
9434       if( azArg[0]==0 ) break;
9435       if( sqlite3_strlike("CREATE VIEW%", azArg[0], 0)==0
9436        || sqlite3_strlike("CREATE TRIG%", azArg[0], 0)==0
9437       ){
9438         utf8_printf(p->out, "%s;\n", azArg[0]);
9439         break;
9440       }
9441       z = sqlite3_mprintf("%s", azArg[0]);
9442       j = 0;
9443       for(i=0; IsSpace(z[i]); i++){}
9444       for(; (c = z[i])!=0; i++){
9445         if( IsSpace(c) ){
9446           if( z[j-1]=='\r' ) z[j-1] = '\n';
9447           if( IsSpace(z[j-1]) || z[j-1]=='(' ) continue;
9448         }else if( (c=='(' || c==')') && j>0 && IsSpace(z[j-1]) ){
9449           j--;
9450         }
9451         z[j++] = c;
9452       }
9453       while( j>0 && IsSpace(z[j-1]) ){ j--; }
9454       z[j] = 0;
9455       if( strlen30(z)>=79 ){
9456         for(i=j=0; (c = z[i])!=0; i++){  /* Copy changes from z[i] back to z[j] */
9457           if( c==cEnd ){
9458             cEnd = 0;
9459           }else if( c=='"' || c=='\'' || c=='`' ){
9460             cEnd = c;
9461           }else if( c=='[' ){
9462             cEnd = ']';
9463           }else if( c=='-' && z[i+1]=='-' ){
9464             cEnd = '\n';
9465           }else if( c=='(' ){
9466             nParen++;
9467           }else if( c==')' ){
9468             nParen--;
9469             if( nLine>0 && nParen==0 && j>0 ){
9470               printSchemaLineN(p->out, z, j, "\n");
9471               j = 0;
9472             }
9473           }
9474           z[j++] = c;
9475           if( nParen==1 && cEnd==0
9476            && (c=='(' || c=='\n' || (c==',' && !wsToEol(z+i+1)))
9477           ){
9478             if( c=='\n' ) j--;
9479             printSchemaLineN(p->out, z, j, "\n  ");
9480             j = 0;
9481             nLine++;
9482             while( IsSpace(z[i+1]) ){ i++; }
9483           }
9484         }
9485         z[j] = 0;
9486       }
9487       printSchemaLine(p->out, z, ";\n");
9488       sqlite3_free(z);
9489       break;
9490     }
9491     case MODE_List: {
9492       if( p->cnt++==0 && p->showHeader ){
9493         for(i=0; i<nArg; i++){
9494           utf8_printf(p->out,"%s%s",azCol[i],
9495                   i==nArg-1 ? p->rowSeparator : p->colSeparator);
9496         }
9497       }
9498       if( azArg==0 ) break;
9499       for(i=0; i<nArg; i++){
9500         char *z = azArg[i];
9501         if( z==0 ) z = p->nullValue;
9502         utf8_printf(p->out, "%s", z);
9503         if( i<nArg-1 ){
9504           utf8_printf(p->out, "%s", p->colSeparator);
9505         }else{
9506           utf8_printf(p->out, "%s", p->rowSeparator);
9507         }
9508       }
9509       break;
9510     }
9511     case MODE_Html: {
9512       if( p->cnt++==0 && p->showHeader ){
9513         raw_printf(p->out,"<TR>");
9514         for(i=0; i<nArg; i++){
9515           raw_printf(p->out,"<TH>");
9516           output_html_string(p->out, azCol[i]);
9517           raw_printf(p->out,"</TH>\n");
9518         }
9519         raw_printf(p->out,"</TR>\n");
9520       }
9521       if( azArg==0 ) break;
9522       raw_printf(p->out,"<TR>");
9523       for(i=0; i<nArg; i++){
9524         raw_printf(p->out,"<TD>");
9525         output_html_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
9526         raw_printf(p->out,"</TD>\n");
9527       }
9528       raw_printf(p->out,"</TR>\n");
9529       break;
9530     }
9531     case MODE_Tcl: {
9532       if( p->cnt++==0 && p->showHeader ){
9533         for(i=0; i<nArg; i++){
9534           output_c_string(p->out,azCol[i] ? azCol[i] : "");
9535           if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
9536         }
9537         utf8_printf(p->out, "%s", p->rowSeparator);
9538       }
9539       if( azArg==0 ) break;
9540       for(i=0; i<nArg; i++){
9541         output_c_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
9542         if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
9543       }
9544       utf8_printf(p->out, "%s", p->rowSeparator);
9545       break;
9546     }
9547     case MODE_Csv: {
9548       setBinaryMode(p->out, 1);
9549       if( p->cnt++==0 && p->showHeader ){
9550         for(i=0; i<nArg; i++){
9551           output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
9552         }
9553         utf8_printf(p->out, "%s", p->rowSeparator);
9554       }
9555       if( nArg>0 ){
9556         for(i=0; i<nArg; i++){
9557           output_csv(p, azArg[i], i<nArg-1);
9558         }
9559         utf8_printf(p->out, "%s", p->rowSeparator);
9560       }
9561       setTextMode(p->out, 1);
9562       break;
9563     }
9564     case MODE_Insert: {
9565       if( azArg==0 ) break;
9566       utf8_printf(p->out,"INSERT INTO %s",p->zDestTable);
9567       if( p->showHeader ){
9568         raw_printf(p->out,"(");
9569         for(i=0; i<nArg; i++){
9570           if( i>0 ) raw_printf(p->out, ",");
9571           if( quoteChar(azCol[i]) ){
9572             char *z = sqlite3_mprintf("\"%w\"", azCol[i]);
9573             utf8_printf(p->out, "%s", z);
9574             sqlite3_free(z);
9575           }else{
9576             raw_printf(p->out, "%s", azCol[i]);
9577           }
9578         }
9579         raw_printf(p->out,")");
9580       }
9581       p->cnt++;
9582       for(i=0; i<nArg; i++){
9583         raw_printf(p->out, i>0 ? "," : " VALUES(");
9584         if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
9585           utf8_printf(p->out,"NULL");
9586         }else if( aiType && aiType[i]==SQLITE_TEXT ){
9587           if( ShellHasFlag(p, SHFLG_Newlines) ){
9588             output_quoted_string(p->out, azArg[i]);
9589           }else{
9590             output_quoted_escaped_string(p->out, azArg[i]);
9591           }
9592         }else if( aiType && aiType[i]==SQLITE_INTEGER ){
9593           utf8_printf(p->out,"%s", azArg[i]);
9594         }else if( aiType && aiType[i]==SQLITE_FLOAT ){
9595           char z[50];
9596           double r = sqlite3_column_double(p->pStmt, i);
9597           sqlite3_uint64 ur;
9598           memcpy(&ur,&r,sizeof(r));
9599           if( ur==0x7ff0000000000000LL ){
9600             raw_printf(p->out, "1e999");
9601           }else if( ur==0xfff0000000000000LL ){
9602             raw_printf(p->out, "-1e999");
9603           }else{
9604             sqlite3_snprintf(50,z,"%!.20g", r);
9605             raw_printf(p->out, "%s", z);
9606           }
9607         }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
9608           const void *pBlob = sqlite3_column_blob(p->pStmt, i);
9609           int nBlob = sqlite3_column_bytes(p->pStmt, i);
9610           output_hex_blob(p->out, pBlob, nBlob);
9611         }else if( isNumber(azArg[i], 0) ){
9612           utf8_printf(p->out,"%s", azArg[i]);
9613         }else if( ShellHasFlag(p, SHFLG_Newlines) ){
9614           output_quoted_string(p->out, azArg[i]);
9615         }else{
9616           output_quoted_escaped_string(p->out, azArg[i]);
9617         }
9618       }
9619       raw_printf(p->out,");\n");
9620       break;
9621     }
9622     case MODE_Quote: {
9623       if( azArg==0 ) break;
9624       if( p->cnt==0 && p->showHeader ){
9625         for(i=0; i<nArg; i++){
9626           if( i>0 ) raw_printf(p->out, ",");
9627           output_quoted_string(p->out, azCol[i]);
9628         }
9629         raw_printf(p->out,"\n");
9630       }
9631       p->cnt++;
9632       for(i=0; i<nArg; i++){
9633         if( i>0 ) raw_printf(p->out, ",");
9634         if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
9635           utf8_printf(p->out,"NULL");
9636         }else if( aiType && aiType[i]==SQLITE_TEXT ){
9637           output_quoted_string(p->out, azArg[i]);
9638         }else if( aiType && aiType[i]==SQLITE_INTEGER ){
9639           utf8_printf(p->out,"%s", azArg[i]);
9640         }else if( aiType && aiType[i]==SQLITE_FLOAT ){
9641           char z[50];
9642           double r = sqlite3_column_double(p->pStmt, i);
9643           sqlite3_snprintf(50,z,"%!.20g", r);
9644           raw_printf(p->out, "%s", z);
9645         }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
9646           const void *pBlob = sqlite3_column_blob(p->pStmt, i);
9647           int nBlob = sqlite3_column_bytes(p->pStmt, i);
9648           output_hex_blob(p->out, pBlob, nBlob);
9649         }else if( isNumber(azArg[i], 0) ){
9650           utf8_printf(p->out,"%s", azArg[i]);
9651         }else{
9652           output_quoted_string(p->out, azArg[i]);
9653         }
9654       }
9655       raw_printf(p->out,"\n");
9656       break;
9657     }
9658     case MODE_Ascii: {
9659       if( p->cnt++==0 && p->showHeader ){
9660         for(i=0; i<nArg; i++){
9661           if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
9662           utf8_printf(p->out,"%s",azCol[i] ? azCol[i] : "");
9663         }
9664         utf8_printf(p->out, "%s", p->rowSeparator);
9665       }
9666       if( azArg==0 ) break;
9667       for(i=0; i<nArg; i++){
9668         if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
9669         utf8_printf(p->out,"%s",azArg[i] ? azArg[i] : p->nullValue);
9670       }
9671       utf8_printf(p->out, "%s", p->rowSeparator);
9672       break;
9673     }
9674     case MODE_EQP: {
9675       eqp_append(p, atoi(azArg[0]), atoi(azArg[1]), azArg[3]);
9676       break;
9677     }
9678   }
9679   return 0;
9680 }
9681 
9682 /*
9683 ** This is the callback routine that the SQLite library
9684 ** invokes for each row of a query result.
9685 */
callback(void * pArg,int nArg,char ** azArg,char ** azCol)9686 static int callback(void *pArg, int nArg, char **azArg, char **azCol){
9687   /* since we don't have type info, call the shell_callback with a NULL value */
9688   return shell_callback(pArg, nArg, azArg, azCol, NULL);
9689 }
9690 
9691 /*
9692 ** This is the callback routine from sqlite3_exec() that appends all
9693 ** output onto the end of a ShellText object.
9694 */
captureOutputCallback(void * pArg,int nArg,char ** azArg,char ** az)9695 static int captureOutputCallback(void *pArg, int nArg, char **azArg, char **az){
9696   ShellText *p = (ShellText*)pArg;
9697   int i;
9698   UNUSED_PARAMETER(az);
9699   if( azArg==0 ) return 0;
9700   if( p->n ) appendText(p, "|", 0);
9701   for(i=0; i<nArg; i++){
9702     if( i ) appendText(p, ",", 0);
9703     if( azArg[i] ) appendText(p, azArg[i], 0);
9704   }
9705   return 0;
9706 }
9707 
9708 /*
9709 ** Generate an appropriate SELFTEST table in the main database.
9710 */
createSelftestTable(ShellState * p)9711 static void createSelftestTable(ShellState *p){
9712   char *zErrMsg = 0;
9713   sqlite3_exec(p->db,
9714     "SAVEPOINT selftest_init;\n"
9715     "CREATE TABLE IF NOT EXISTS selftest(\n"
9716     "  tno INTEGER PRIMARY KEY,\n"   /* Test number */
9717     "  op TEXT,\n"                   /* Operator:  memo run */
9718     "  cmd TEXT,\n"                  /* Command text */
9719     "  ans TEXT\n"                   /* Desired answer */
9720     ");"
9721     "CREATE TEMP TABLE [_shell$self](op,cmd,ans);\n"
9722     "INSERT INTO [_shell$self](rowid,op,cmd)\n"
9723     "  VALUES(coalesce((SELECT (max(tno)+100)/10 FROM selftest),10),\n"
9724     "         'memo','Tests generated by --init');\n"
9725     "INSERT INTO [_shell$self]\n"
9726     "  SELECT 'run',\n"
9727     "    'SELECT hex(sha3_query(''SELECT type,name,tbl_name,sql "
9728                                  "FROM sqlite_master ORDER BY 2'',224))',\n"
9729     "    hex(sha3_query('SELECT type,name,tbl_name,sql "
9730                           "FROM sqlite_master ORDER BY 2',224));\n"
9731     "INSERT INTO [_shell$self]\n"
9732     "  SELECT 'run',"
9733     "    'SELECT hex(sha3_query(''SELECT * FROM \"' ||"
9734     "        printf('%w',name) || '\" NOT INDEXED'',224))',\n"
9735     "    hex(sha3_query(printf('SELECT * FROM \"%w\" NOT INDEXED',name),224))\n"
9736     "  FROM (\n"
9737     "    SELECT name FROM sqlite_master\n"
9738     "     WHERE type='table'\n"
9739     "       AND name<>'selftest'\n"
9740     "       AND coalesce(rootpage,0)>0\n"
9741     "  )\n"
9742     " ORDER BY name;\n"
9743     "INSERT INTO [_shell$self]\n"
9744     "  VALUES('run','PRAGMA integrity_check','ok');\n"
9745     "INSERT INTO selftest(tno,op,cmd,ans)"
9746     "  SELECT rowid*10,op,cmd,ans FROM [_shell$self];\n"
9747     "DROP TABLE [_shell$self];"
9748     ,0,0,&zErrMsg);
9749   if( zErrMsg ){
9750     utf8_printf(stderr, "SELFTEST initialization failure: %s\n", zErrMsg);
9751     sqlite3_free(zErrMsg);
9752   }
9753   sqlite3_exec(p->db, "RELEASE selftest_init",0,0,0);
9754 }
9755 
9756 
9757 /*
9758 ** Set the destination table field of the ShellState structure to
9759 ** the name of the table given.  Escape any quote characters in the
9760 ** table name.
9761 */
set_table_name(ShellState * p,const char * zName)9762 static void set_table_name(ShellState *p, const char *zName){
9763   int i, n;
9764   char cQuote;
9765   char *z;
9766 
9767   if( p->zDestTable ){
9768     free(p->zDestTable);
9769     p->zDestTable = 0;
9770   }
9771   if( zName==0 ) return;
9772   cQuote = quoteChar(zName);
9773   n = strlen30(zName);
9774   if( cQuote ) n += n+2;
9775   z = p->zDestTable = malloc( n+1 );
9776   if( z==0 ) shell_out_of_memory();
9777   n = 0;
9778   if( cQuote ) z[n++] = cQuote;
9779   for(i=0; zName[i]; i++){
9780     z[n++] = zName[i];
9781     if( zName[i]==cQuote ) z[n++] = cQuote;
9782   }
9783   if( cQuote ) z[n++] = cQuote;
9784   z[n] = 0;
9785 }
9786 
9787 
9788 /*
9789 ** Execute a query statement that will generate SQL output.  Print
9790 ** the result columns, comma-separated, on a line and then add a
9791 ** semicolon terminator to the end of that line.
9792 **
9793 ** If the number of columns is 1 and that column contains text "--"
9794 ** then write the semicolon on a separate line.  That way, if a
9795 ** "--" comment occurs at the end of the statement, the comment
9796 ** won't consume the semicolon terminator.
9797 */
run_table_dump_query(ShellState * p,const char * zSelect,const char * zFirstRow)9798 static int run_table_dump_query(
9799   ShellState *p,           /* Query context */
9800   const char *zSelect,     /* SELECT statement to extract content */
9801   const char *zFirstRow    /* Print before first row, if not NULL */
9802 ){
9803   sqlite3_stmt *pSelect;
9804   int rc;
9805   int nResult;
9806   int i;
9807   const char *z;
9808   rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0);
9809   if( rc!=SQLITE_OK || !pSelect ){
9810     utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc,
9811                 sqlite3_errmsg(p->db));
9812     if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
9813     return rc;
9814   }
9815   rc = sqlite3_step(pSelect);
9816   nResult = sqlite3_column_count(pSelect);
9817   while( rc==SQLITE_ROW ){
9818     if( zFirstRow ){
9819       utf8_printf(p->out, "%s", zFirstRow);
9820       zFirstRow = 0;
9821     }
9822     z = (const char*)sqlite3_column_text(pSelect, 0);
9823     utf8_printf(p->out, "%s", z);
9824     for(i=1; i<nResult; i++){
9825       utf8_printf(p->out, ",%s", sqlite3_column_text(pSelect, i));
9826     }
9827     if( z==0 ) z = "";
9828     while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
9829     if( z[0] ){
9830       raw_printf(p->out, "\n;\n");
9831     }else{
9832       raw_printf(p->out, ";\n");
9833     }
9834     rc = sqlite3_step(pSelect);
9835   }
9836   rc = sqlite3_finalize(pSelect);
9837   if( rc!=SQLITE_OK ){
9838     utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc,
9839                 sqlite3_errmsg(p->db));
9840     if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
9841   }
9842   return rc;
9843 }
9844 
9845 /*
9846 ** Allocate space and save off current error string.
9847 */
save_err_msg(sqlite3 * db)9848 static char *save_err_msg(
9849   sqlite3 *db            /* Database to query */
9850 ){
9851   int nErrMsg = 1+strlen30(sqlite3_errmsg(db));
9852   char *zErrMsg = sqlite3_malloc64(nErrMsg);
9853   if( zErrMsg ){
9854     memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg);
9855   }
9856   return zErrMsg;
9857 }
9858 
9859 #ifdef __linux__
9860 /*
9861 ** Attempt to display I/O stats on Linux using /proc/PID/io
9862 */
displayLinuxIoStats(FILE * out)9863 static void displayLinuxIoStats(FILE *out){
9864   FILE *in;
9865   char z[200];
9866   sqlite3_snprintf(sizeof(z), z, "/proc/%d/io", getpid());
9867   in = fopen(z, "rb");
9868   if( in==0 ) return;
9869   while( fgets(z, sizeof(z), in)!=0 ){
9870     static const struct {
9871       const char *zPattern;
9872       const char *zDesc;
9873     } aTrans[] = {
9874       { "rchar: ",                  "Bytes received by read():" },
9875       { "wchar: ",                  "Bytes sent to write():"    },
9876       { "syscr: ",                  "Read() system calls:"      },
9877       { "syscw: ",                  "Write() system calls:"     },
9878       { "read_bytes: ",             "Bytes read from storage:"  },
9879       { "write_bytes: ",            "Bytes written to storage:" },
9880       { "cancelled_write_bytes: ",  "Cancelled write bytes:"    },
9881     };
9882     int i;
9883     for(i=0; i<ArraySize(aTrans); i++){
9884       int n = strlen30(aTrans[i].zPattern);
9885       if( strncmp(aTrans[i].zPattern, z, n)==0 ){
9886         utf8_printf(out, "%-36s %s", aTrans[i].zDesc, &z[n]);
9887         break;
9888       }
9889     }
9890   }
9891   fclose(in);
9892 }
9893 #endif
9894 
9895 /*
9896 ** Display a single line of status using 64-bit values.
9897 */
displayStatLine(ShellState * p,char * zLabel,char * zFormat,int iStatusCtrl,int bReset)9898 static void displayStatLine(
9899   ShellState *p,            /* The shell context */
9900   char *zLabel,             /* Label for this one line */
9901   char *zFormat,            /* Format for the result */
9902   int iStatusCtrl,          /* Which status to display */
9903   int bReset                /* True to reset the stats */
9904 ){
9905   sqlite3_int64 iCur = -1;
9906   sqlite3_int64 iHiwtr = -1;
9907   int i, nPercent;
9908   char zLine[200];
9909   sqlite3_status64(iStatusCtrl, &iCur, &iHiwtr, bReset);
9910   for(i=0, nPercent=0; zFormat[i]; i++){
9911     if( zFormat[i]=='%' ) nPercent++;
9912   }
9913   if( nPercent>1 ){
9914     sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iCur, iHiwtr);
9915   }else{
9916     sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iHiwtr);
9917   }
9918   raw_printf(p->out, "%-36s %s\n", zLabel, zLine);
9919 }
9920 
9921 /*
9922 ** Display memory stats.
9923 */
display_stats(sqlite3 * db,ShellState * pArg,int bReset)9924 static int display_stats(
9925   sqlite3 *db,                /* Database to query */
9926   ShellState *pArg,           /* Pointer to ShellState */
9927   int bReset                  /* True to reset the stats */
9928 ){
9929   int iCur;
9930   int iHiwtr;
9931   FILE *out;
9932   if( pArg==0 || pArg->out==0 ) return 0;
9933   out = pArg->out;
9934 
9935   if( pArg->pStmt && (pArg->statsOn & 2) ){
9936     int nCol, i, x;
9937     sqlite3_stmt *pStmt = pArg->pStmt;
9938     char z[100];
9939     nCol = sqlite3_column_count(pStmt);
9940     raw_printf(out, "%-36s %d\n", "Number of output columns:", nCol);
9941     for(i=0; i<nCol; i++){
9942       sqlite3_snprintf(sizeof(z),z,"Column %d %nname:", i, &x);
9943       utf8_printf(out, "%-36s %s\n", z, sqlite3_column_name(pStmt,i));
9944 #ifndef SQLITE_OMIT_DECLTYPE
9945       sqlite3_snprintf(30, z+x, "declared type:");
9946       utf8_printf(out, "%-36s %s\n", z, sqlite3_column_decltype(pStmt, i));
9947 #endif
9948 #ifdef SQLITE_ENABLE_COLUMN_METADATA
9949       sqlite3_snprintf(30, z+x, "database name:");
9950       utf8_printf(out, "%-36s %s\n", z, sqlite3_column_database_name(pStmt,i));
9951       sqlite3_snprintf(30, z+x, "table name:");
9952       utf8_printf(out, "%-36s %s\n", z, sqlite3_column_table_name(pStmt,i));
9953       sqlite3_snprintf(30, z+x, "origin name:");
9954       utf8_printf(out, "%-36s %s\n", z, sqlite3_column_origin_name(pStmt,i));
9955 #endif
9956     }
9957   }
9958 
9959   displayStatLine(pArg, "Memory Used:",
9960      "%lld (max %lld) bytes", SQLITE_STATUS_MEMORY_USED, bReset);
9961   displayStatLine(pArg, "Number of Outstanding Allocations:",
9962      "%lld (max %lld)", SQLITE_STATUS_MALLOC_COUNT, bReset);
9963   if( pArg->shellFlgs & SHFLG_Pagecache ){
9964     displayStatLine(pArg, "Number of Pcache Pages Used:",
9965        "%lld (max %lld) pages", SQLITE_STATUS_PAGECACHE_USED, bReset);
9966   }
9967   displayStatLine(pArg, "Number of Pcache Overflow Bytes:",
9968      "%lld (max %lld) bytes", SQLITE_STATUS_PAGECACHE_OVERFLOW, bReset);
9969   displayStatLine(pArg, "Largest Allocation:",
9970      "%lld bytes", SQLITE_STATUS_MALLOC_SIZE, bReset);
9971   displayStatLine(pArg, "Largest Pcache Allocation:",
9972      "%lld bytes", SQLITE_STATUS_PAGECACHE_SIZE, bReset);
9973 #ifdef YYTRACKMAXSTACKDEPTH
9974   displayStatLine(pArg, "Deepest Parser Stack:",
9975      "%lld (max %lld)", SQLITE_STATUS_PARSER_STACK, bReset);
9976 #endif
9977 
9978   if( db ){
9979     if( pArg->shellFlgs & SHFLG_Lookaside ){
9980       iHiwtr = iCur = -1;
9981       sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED,
9982                         &iCur, &iHiwtr, bReset);
9983       raw_printf(pArg->out,
9984               "Lookaside Slots Used:                %d (max %d)\n",
9985               iCur, iHiwtr);
9986       sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT,
9987                         &iCur, &iHiwtr, bReset);
9988       raw_printf(pArg->out, "Successful lookaside attempts:       %d\n",
9989               iHiwtr);
9990       sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE,
9991                         &iCur, &iHiwtr, bReset);
9992       raw_printf(pArg->out, "Lookaside failures due to size:      %d\n",
9993               iHiwtr);
9994       sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL,
9995                         &iCur, &iHiwtr, bReset);
9996       raw_printf(pArg->out, "Lookaside failures due to OOM:       %d\n",
9997               iHiwtr);
9998     }
9999     iHiwtr = iCur = -1;
10000     sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
10001     raw_printf(pArg->out, "Pager Heap Usage:                    %d bytes\n",
10002             iCur);
10003     iHiwtr = iCur = -1;
10004     sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
10005     raw_printf(pArg->out, "Page cache hits:                     %d\n", iCur);
10006     iHiwtr = iCur = -1;
10007     sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
10008     raw_printf(pArg->out, "Page cache misses:                   %d\n", iCur);
10009     iHiwtr = iCur = -1;
10010     sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
10011     raw_printf(pArg->out, "Page cache writes:                   %d\n", iCur);
10012     iHiwtr = iCur = -1;
10013     sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_SPILL, &iCur, &iHiwtr, 1);
10014     raw_printf(pArg->out, "Page cache spills:                   %d\n", iCur);
10015     iHiwtr = iCur = -1;
10016     sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
10017     raw_printf(pArg->out, "Schema Heap Usage:                   %d bytes\n",
10018             iCur);
10019     iHiwtr = iCur = -1;
10020     sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
10021     raw_printf(pArg->out, "Statement Heap/Lookaside Usage:      %d bytes\n",
10022             iCur);
10023   }
10024 
10025   if( pArg->pStmt ){
10026     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP,
10027                                bReset);
10028     raw_printf(pArg->out, "Fullscan Steps:                      %d\n", iCur);
10029     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
10030     raw_printf(pArg->out, "Sort Operations:                     %d\n", iCur);
10031     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX,bReset);
10032     raw_printf(pArg->out, "Autoindex Inserts:                   %d\n", iCur);
10033     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
10034     raw_printf(pArg->out, "Virtual Machine Steps:               %d\n", iCur);
10035     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_REPREPARE, bReset);
10036     raw_printf(pArg->out, "Reprepare operations:                %d\n", iCur);
10037     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_RUN, bReset);
10038     raw_printf(pArg->out, "Number of times run:                 %d\n", iCur);
10039     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_MEMUSED, bReset);
10040     raw_printf(pArg->out, "Memory used by prepared stmt:        %d\n", iCur);
10041   }
10042 
10043 #ifdef __linux__
10044   displayLinuxIoStats(pArg->out);
10045 #endif
10046 
10047   /* Do not remove this machine readable comment: extra-stats-output-here */
10048 
10049   return 0;
10050 }
10051 
10052 /*
10053 ** Display scan stats.
10054 */
display_scanstats(sqlite3 * db,ShellState * pArg)10055 static void display_scanstats(
10056   sqlite3 *db,                    /* Database to query */
10057   ShellState *pArg                /* Pointer to ShellState */
10058 ){
10059 #ifndef SQLITE_ENABLE_STMT_SCANSTATUS
10060   UNUSED_PARAMETER(db);
10061   UNUSED_PARAMETER(pArg);
10062 #else
10063   int i, k, n, mx;
10064   raw_printf(pArg->out, "-------- scanstats --------\n");
10065   mx = 0;
10066   for(k=0; k<=mx; k++){
10067     double rEstLoop = 1.0;
10068     for(i=n=0; 1; i++){
10069       sqlite3_stmt *p = pArg->pStmt;
10070       sqlite3_int64 nLoop, nVisit;
10071       double rEst;
10072       int iSid;
10073       const char *zExplain;
10074       if( sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NLOOP, (void*)&nLoop) ){
10075         break;
10076       }
10077       sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_SELECTID, (void*)&iSid);
10078       if( iSid>mx ) mx = iSid;
10079       if( iSid!=k ) continue;
10080       if( n==0 ){
10081         rEstLoop = (double)nLoop;
10082         if( k>0 ) raw_printf(pArg->out, "-------- subquery %d -------\n", k);
10083       }
10084       n++;
10085       sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NVISIT, (void*)&nVisit);
10086       sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EST, (void*)&rEst);
10087       sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EXPLAIN, (void*)&zExplain);
10088       utf8_printf(pArg->out, "Loop %2d: %s\n", n, zExplain);
10089       rEstLoop *= rEst;
10090       raw_printf(pArg->out,
10091           "         nLoop=%-8lld nRow=%-8lld estRow=%-8lld estRow/Loop=%-8g\n",
10092           nLoop, nVisit, (sqlite3_int64)(rEstLoop+0.5), rEst
10093       );
10094     }
10095   }
10096   raw_printf(pArg->out, "---------------------------\n");
10097 #endif
10098 }
10099 
10100 /*
10101 ** Parameter azArray points to a zero-terminated array of strings. zStr
10102 ** points to a single nul-terminated string. Return non-zero if zStr
10103 ** is equal, according to strcmp(), to any of the strings in the array.
10104 ** Otherwise, return zero.
10105 */
str_in_array(const char * zStr,const char ** azArray)10106 static int str_in_array(const char *zStr, const char **azArray){
10107   int i;
10108   for(i=0; azArray[i]; i++){
10109     if( 0==strcmp(zStr, azArray[i]) ) return 1;
10110   }
10111   return 0;
10112 }
10113 
10114 /*
10115 ** If compiled statement pSql appears to be an EXPLAIN statement, allocate
10116 ** and populate the ShellState.aiIndent[] array with the number of
10117 ** spaces each opcode should be indented before it is output.
10118 **
10119 ** The indenting rules are:
10120 **
10121 **     * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
10122 **       all opcodes that occur between the p2 jump destination and the opcode
10123 **       itself by 2 spaces.
10124 **
10125 **     * For each "Goto", if the jump destination is earlier in the program
10126 **       and ends on one of:
10127 **          Yield  SeekGt  SeekLt  RowSetRead  Rewind
10128 **       or if the P1 parameter is one instead of zero,
10129 **       then indent all opcodes between the earlier instruction
10130 **       and "Goto" by 2 spaces.
10131 */
explain_data_prepare(ShellState * p,sqlite3_stmt * pSql)10132 static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){
10133   const char *zSql;               /* The text of the SQL statement */
10134   const char *z;                  /* Used to check if this is an EXPLAIN */
10135   int *abYield = 0;               /* True if op is an OP_Yield */
10136   int nAlloc = 0;                 /* Allocated size of p->aiIndent[], abYield */
10137   int iOp;                        /* Index of operation in p->aiIndent[] */
10138 
10139   const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext", 0 };
10140   const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead",
10141                             "Rewind", 0 };
10142   const char *azGoto[] = { "Goto", 0 };
10143 
10144   /* Try to figure out if this is really an EXPLAIN statement. If this
10145   ** cannot be verified, return early.  */
10146   if( sqlite3_column_count(pSql)!=8 ){
10147     p->cMode = p->mode;
10148     return;
10149   }
10150   zSql = sqlite3_sql(pSql);
10151   if( zSql==0 ) return;
10152   for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++);
10153   if( sqlite3_strnicmp(z, "explain", 7) ){
10154     p->cMode = p->mode;
10155     return;
10156   }
10157 
10158   for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
10159     int i;
10160     int iAddr = sqlite3_column_int(pSql, 0);
10161     const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
10162 
10163     /* Set p2 to the P2 field of the current opcode. Then, assuming that
10164     ** p2 is an instruction address, set variable p2op to the index of that
10165     ** instruction in the aiIndent[] array. p2 and p2op may be different if
10166     ** the current instruction is part of a sub-program generated by an
10167     ** SQL trigger or foreign key.  */
10168     int p2 = sqlite3_column_int(pSql, 3);
10169     int p2op = (p2 + (iOp-iAddr));
10170 
10171     /* Grow the p->aiIndent array as required */
10172     if( iOp>=nAlloc ){
10173       if( iOp==0 ){
10174         /* Do further verfication that this is explain output.  Abort if
10175         ** it is not */
10176         static const char *explainCols[] = {
10177            "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment" };
10178         int jj;
10179         for(jj=0; jj<ArraySize(explainCols); jj++){
10180           if( strcmp(sqlite3_column_name(pSql,jj),explainCols[jj])!=0 ){
10181             p->cMode = p->mode;
10182             sqlite3_reset(pSql);
10183             return;
10184           }
10185         }
10186       }
10187       nAlloc += 100;
10188       p->aiIndent = (int*)sqlite3_realloc64(p->aiIndent, nAlloc*sizeof(int));
10189       if( p->aiIndent==0 ) shell_out_of_memory();
10190       abYield = (int*)sqlite3_realloc64(abYield, nAlloc*sizeof(int));
10191       if( abYield==0 ) shell_out_of_memory();
10192     }
10193     abYield[iOp] = str_in_array(zOp, azYield);
10194     p->aiIndent[iOp] = 0;
10195     p->nIndent = iOp+1;
10196 
10197     if( str_in_array(zOp, azNext) ){
10198       for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
10199     }
10200     if( str_in_array(zOp, azGoto) && p2op<p->nIndent
10201      && (abYield[p2op] || sqlite3_column_int(pSql, 2))
10202     ){
10203       for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
10204     }
10205   }
10206 
10207   p->iIndent = 0;
10208   sqlite3_free(abYield);
10209   sqlite3_reset(pSql);
10210 }
10211 
10212 /*
10213 ** Free the array allocated by explain_data_prepare().
10214 */
explain_data_delete(ShellState * p)10215 static void explain_data_delete(ShellState *p){
10216   sqlite3_free(p->aiIndent);
10217   p->aiIndent = 0;
10218   p->nIndent = 0;
10219   p->iIndent = 0;
10220 }
10221 
10222 /*
10223 ** Disable and restore .wheretrace and .selecttrace settings.
10224 */
10225 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
10226 extern int sqlite3SelectTrace;
10227 static int savedSelectTrace;
10228 #endif
10229 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
10230 extern int sqlite3WhereTrace;
10231 static int savedWhereTrace;
10232 #endif
disable_debug_trace_modes(void)10233 static void disable_debug_trace_modes(void){
10234 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
10235   savedSelectTrace = sqlite3SelectTrace;
10236   sqlite3SelectTrace = 0;
10237 #endif
10238 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
10239   savedWhereTrace = sqlite3WhereTrace;
10240   sqlite3WhereTrace = 0;
10241 #endif
10242 }
restore_debug_trace_modes(void)10243 static void restore_debug_trace_modes(void){
10244 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
10245   sqlite3SelectTrace = savedSelectTrace;
10246 #endif
10247 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
10248   sqlite3WhereTrace = savedWhereTrace;
10249 #endif
10250 }
10251 
10252 /*
10253 ** Run a prepared statement
10254 */
exec_prepared_stmt(ShellState * pArg,sqlite3_stmt * pStmt)10255 static void exec_prepared_stmt(
10256   ShellState *pArg,                                /* Pointer to ShellState */
10257   sqlite3_stmt *pStmt                              /* Statment to run */
10258 ){
10259   int rc;
10260 
10261   /* perform the first step.  this will tell us if we
10262   ** have a result set or not and how wide it is.
10263   */
10264   rc = sqlite3_step(pStmt);
10265   /* if we have a result set... */
10266   if( SQLITE_ROW == rc ){
10267     /* allocate space for col name ptr, value ptr, and type */
10268     int nCol = sqlite3_column_count(pStmt);
10269     void *pData = sqlite3_malloc64(3*nCol*sizeof(const char*) + 1);
10270     if( !pData ){
10271       rc = SQLITE_NOMEM;
10272     }else{
10273       char **azCols = (char **)pData;      /* Names of result columns */
10274       char **azVals = &azCols[nCol];       /* Results */
10275       int *aiTypes = (int *)&azVals[nCol]; /* Result types */
10276       int i, x;
10277       assert(sizeof(int) <= sizeof(char *));
10278       /* save off ptrs to column names */
10279       for(i=0; i<nCol; i++){
10280         azCols[i] = (char *)sqlite3_column_name(pStmt, i);
10281       }
10282       do{
10283         /* extract the data and data types */
10284         for(i=0; i<nCol; i++){
10285           aiTypes[i] = x = sqlite3_column_type(pStmt, i);
10286           if( x==SQLITE_BLOB && pArg && pArg->cMode==MODE_Insert ){
10287             azVals[i] = "";
10288           }else{
10289             azVals[i] = (char*)sqlite3_column_text(pStmt, i);
10290           }
10291           if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
10292             rc = SQLITE_NOMEM;
10293             break; /* from for */
10294           }
10295         } /* end for */
10296 
10297         /* if data and types extracted successfully... */
10298         if( SQLITE_ROW == rc ){
10299           /* call the supplied callback with the result row data */
10300           if( shell_callback(pArg, nCol, azVals, azCols, aiTypes) ){
10301             rc = SQLITE_ABORT;
10302           }else{
10303             rc = sqlite3_step(pStmt);
10304           }
10305         }
10306       } while( SQLITE_ROW == rc );
10307       sqlite3_free(pData);
10308     }
10309   }
10310 }
10311 
10312 #ifndef SQLITE_OMIT_VIRTUALTABLE
10313 /*
10314 ** This function is called to process SQL if the previous shell command
10315 ** was ".expert". It passes the SQL in the second argument directly to
10316 ** the sqlite3expert object.
10317 **
10318 ** If successful, SQLITE_OK is returned. Otherwise, an SQLite error
10319 ** code. In this case, (*pzErr) may be set to point to a buffer containing
10320 ** an English language error message. It is the responsibility of the
10321 ** caller to eventually free this buffer using sqlite3_free().
10322 */
expertHandleSQL(ShellState * pState,const char * zSql,char ** pzErr)10323 static int expertHandleSQL(
10324   ShellState *pState,
10325   const char *zSql,
10326   char **pzErr
10327 ){
10328   assert( pState->expert.pExpert );
10329   assert( pzErr==0 || *pzErr==0 );
10330   return sqlite3_expert_sql(pState->expert.pExpert, zSql, pzErr);
10331 }
10332 
10333 /*
10334 ** This function is called either to silently clean up the object
10335 ** created by the ".expert" command (if bCancel==1), or to generate a
10336 ** report from it and then clean it up (if bCancel==0).
10337 **
10338 ** If successful, SQLITE_OK is returned. Otherwise, an SQLite error
10339 ** code. In this case, (*pzErr) may be set to point to a buffer containing
10340 ** an English language error message. It is the responsibility of the
10341 ** caller to eventually free this buffer using sqlite3_free().
10342 */
expertFinish(ShellState * pState,int bCancel,char ** pzErr)10343 static int expertFinish(
10344   ShellState *pState,
10345   int bCancel,
10346   char **pzErr
10347 ){
10348   int rc = SQLITE_OK;
10349   sqlite3expert *p = pState->expert.pExpert;
10350   assert( p );
10351   assert( bCancel || pzErr==0 || *pzErr==0 );
10352   if( bCancel==0 ){
10353     FILE *out = pState->out;
10354     int bVerbose = pState->expert.bVerbose;
10355 
10356     rc = sqlite3_expert_analyze(p, pzErr);
10357     if( rc==SQLITE_OK ){
10358       int nQuery = sqlite3_expert_count(p);
10359       int i;
10360 
10361       if( bVerbose ){
10362         const char *zCand = sqlite3_expert_report(p,0,EXPERT_REPORT_CANDIDATES);
10363         raw_printf(out, "-- Candidates -----------------------------\n");
10364         raw_printf(out, "%s\n", zCand);
10365       }
10366       for(i=0; i<nQuery; i++){
10367         const char *zSql = sqlite3_expert_report(p, i, EXPERT_REPORT_SQL);
10368         const char *zIdx = sqlite3_expert_report(p, i, EXPERT_REPORT_INDEXES);
10369         const char *zEQP = sqlite3_expert_report(p, i, EXPERT_REPORT_PLAN);
10370         if( zIdx==0 ) zIdx = "(no new indexes)\n";
10371         if( bVerbose ){
10372           raw_printf(out, "-- Query %d --------------------------------\n",i+1);
10373           raw_printf(out, "%s\n\n", zSql);
10374         }
10375         raw_printf(out, "%s\n", zIdx);
10376         raw_printf(out, "%s\n", zEQP);
10377       }
10378     }
10379   }
10380   sqlite3_expert_destroy(p);
10381   pState->expert.pExpert = 0;
10382   return rc;
10383 }
10384 
10385 /*
10386 ** Implementation of ".expert" dot command.
10387 */
expertDotCommand(ShellState * pState,char ** azArg,int nArg)10388 static int expertDotCommand(
10389   ShellState *pState,             /* Current shell tool state */
10390   char **azArg,                   /* Array of arguments passed to dot command */
10391   int nArg                        /* Number of entries in azArg[] */
10392 ){
10393   int rc = SQLITE_OK;
10394   char *zErr = 0;
10395   int i;
10396   int iSample = 0;
10397 
10398   assert( pState->expert.pExpert==0 );
10399   memset(&pState->expert, 0, sizeof(ExpertInfo));
10400 
10401   for(i=1; rc==SQLITE_OK && i<nArg; i++){
10402     char *z = azArg[i];
10403     int n;
10404     if( z[0]=='-' && z[1]=='-' ) z++;
10405     n = strlen30(z);
10406     if( n>=2 && 0==strncmp(z, "-verbose", n) ){
10407       pState->expert.bVerbose = 1;
10408     }
10409     else if( n>=2 && 0==strncmp(z, "-sample", n) ){
10410       if( i==(nArg-1) ){
10411         raw_printf(stderr, "option requires an argument: %s\n", z);
10412         rc = SQLITE_ERROR;
10413       }else{
10414         iSample = (int)integerValue(azArg[++i]);
10415         if( iSample<0 || iSample>100 ){
10416           raw_printf(stderr, "value out of range: %s\n", azArg[i]);
10417           rc = SQLITE_ERROR;
10418         }
10419       }
10420     }
10421     else{
10422       raw_printf(stderr, "unknown option: %s\n", z);
10423       rc = SQLITE_ERROR;
10424     }
10425   }
10426 
10427   if( rc==SQLITE_OK ){
10428     pState->expert.pExpert = sqlite3_expert_new(pState->db, &zErr);
10429     if( pState->expert.pExpert==0 ){
10430       raw_printf(stderr, "sqlite3_expert_new: %s\n", zErr);
10431       rc = SQLITE_ERROR;
10432     }else{
10433       sqlite3_expert_config(
10434           pState->expert.pExpert, EXPERT_CONFIG_SAMPLE, iSample
10435       );
10436     }
10437   }
10438 
10439   return rc;
10440 }
10441 #endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
10442 
10443 /*
10444 ** Execute a statement or set of statements.  Print
10445 ** any result rows/columns depending on the current mode
10446 ** set via the supplied callback.
10447 **
10448 ** This is very similar to SQLite's built-in sqlite3_exec()
10449 ** function except it takes a slightly different callback
10450 ** and callback data argument.
10451 */
shell_exec(ShellState * pArg,const char * zSql,char ** pzErrMsg)10452 static int shell_exec(
10453   ShellState *pArg,                         /* Pointer to ShellState */
10454   const char *zSql,                         /* SQL to be evaluated */
10455   char **pzErrMsg                           /* Error msg written here */
10456 ){
10457   sqlite3_stmt *pStmt = NULL;     /* Statement to execute. */
10458   int rc = SQLITE_OK;             /* Return Code */
10459   int rc2;
10460   const char *zLeftover;          /* Tail of unprocessed SQL */
10461   sqlite3 *db = pArg->db;
10462 
10463   if( pzErrMsg ){
10464     *pzErrMsg = NULL;
10465   }
10466 
10467 #ifndef SQLITE_OMIT_VIRTUALTABLE
10468   if( pArg->expert.pExpert ){
10469     rc = expertHandleSQL(pArg, zSql, pzErrMsg);
10470     return expertFinish(pArg, (rc!=SQLITE_OK), pzErrMsg);
10471   }
10472 #endif
10473 
10474   while( zSql[0] && (SQLITE_OK == rc) ){
10475     static const char *zStmtSql;
10476     rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
10477     if( SQLITE_OK != rc ){
10478       if( pzErrMsg ){
10479         *pzErrMsg = save_err_msg(db);
10480       }
10481     }else{
10482       if( !pStmt ){
10483         /* this happens for a comment or white-space */
10484         zSql = zLeftover;
10485         while( IsSpace(zSql[0]) ) zSql++;
10486         continue;
10487       }
10488       zStmtSql = sqlite3_sql(pStmt);
10489       if( zStmtSql==0 ) zStmtSql = "";
10490       while( IsSpace(zStmtSql[0]) ) zStmtSql++;
10491 
10492       /* save off the prepared statment handle and reset row count */
10493       if( pArg ){
10494         pArg->pStmt = pStmt;
10495         pArg->cnt = 0;
10496       }
10497 
10498       /* echo the sql statement if echo on */
10499       if( pArg && ShellHasFlag(pArg, SHFLG_Echo) ){
10500         utf8_printf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
10501       }
10502 
10503       /* Show the EXPLAIN QUERY PLAN if .eqp is on */
10504       if( pArg && pArg->autoEQP && sqlite3_strlike("EXPLAIN%",zStmtSql,0)!=0 ){
10505         sqlite3_stmt *pExplain;
10506         char *zEQP;
10507         int triggerEQP = 0;
10508         disable_debug_trace_modes();
10509         sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, -1, &triggerEQP);
10510         if( pArg->autoEQP>=AUTOEQP_trigger ){
10511           sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 1, 0);
10512         }
10513         zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s", zStmtSql);
10514         rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
10515         if( rc==SQLITE_OK ){
10516           while( sqlite3_step(pExplain)==SQLITE_ROW ){
10517             const char *zEQPLine = (const char*)sqlite3_column_text(pExplain,3);
10518             int iEqpId = sqlite3_column_int(pExplain, 0);
10519             int iParentId = sqlite3_column_int(pExplain, 1);
10520             if( zEQPLine[0]=='-' ) eqp_render(pArg);
10521             eqp_append(pArg, iEqpId, iParentId, zEQPLine);
10522           }
10523           eqp_render(pArg);
10524         }
10525         sqlite3_finalize(pExplain);
10526         sqlite3_free(zEQP);
10527         if( pArg->autoEQP>=AUTOEQP_full ){
10528           /* Also do an EXPLAIN for ".eqp full" mode */
10529           zEQP = sqlite3_mprintf("EXPLAIN %s", zStmtSql);
10530           rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
10531           if( rc==SQLITE_OK ){
10532             pArg->cMode = MODE_Explain;
10533             explain_data_prepare(pArg, pExplain);
10534             exec_prepared_stmt(pArg, pExplain);
10535             explain_data_delete(pArg);
10536           }
10537           sqlite3_finalize(pExplain);
10538           sqlite3_free(zEQP);
10539         }
10540         if( pArg->autoEQP>=AUTOEQP_trigger && triggerEQP==0 ){
10541           sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 0, 0);
10542           /* Reprepare pStmt before reactiving trace modes */
10543           sqlite3_finalize(pStmt);
10544           sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
10545           if( pArg ) pArg->pStmt = pStmt;
10546         }
10547         restore_debug_trace_modes();
10548       }
10549 
10550       if( pArg ){
10551         pArg->cMode = pArg->mode;
10552         if( pArg->autoExplain ){
10553           if( sqlite3_column_count(pStmt)==8
10554            && sqlite3_strlike("EXPLAIN%", zStmtSql,0)==0
10555           ){
10556             pArg->cMode = MODE_Explain;
10557           }
10558           if( sqlite3_column_count(pStmt)==4
10559            && sqlite3_strlike("EXPLAIN QUERY PLAN%", zStmtSql,0)==0 ){
10560             pArg->cMode = MODE_EQP;
10561           }
10562         }
10563 
10564         /* If the shell is currently in ".explain" mode, gather the extra
10565         ** data required to add indents to the output.*/
10566         if( pArg->cMode==MODE_Explain ){
10567           explain_data_prepare(pArg, pStmt);
10568         }
10569       }
10570 
10571       exec_prepared_stmt(pArg, pStmt);
10572       explain_data_delete(pArg);
10573       eqp_render(pArg);
10574 
10575       /* print usage stats if stats on */
10576       if( pArg && pArg->statsOn ){
10577         display_stats(db, pArg, 0);
10578       }
10579 
10580       /* print loop-counters if required */
10581       if( pArg && pArg->scanstatsOn ){
10582         display_scanstats(db, pArg);
10583       }
10584 
10585       /* Finalize the statement just executed. If this fails, save a
10586       ** copy of the error message. Otherwise, set zSql to point to the
10587       ** next statement to execute. */
10588       rc2 = sqlite3_finalize(pStmt);
10589       if( rc!=SQLITE_NOMEM ) rc = rc2;
10590       if( rc==SQLITE_OK ){
10591         zSql = zLeftover;
10592         while( IsSpace(zSql[0]) ) zSql++;
10593       }else if( pzErrMsg ){
10594         *pzErrMsg = save_err_msg(db);
10595       }
10596 
10597       /* clear saved stmt handle */
10598       if( pArg ){
10599         pArg->pStmt = NULL;
10600       }
10601     }
10602   } /* end while */
10603 
10604   return rc;
10605 }
10606 
10607 /*
10608 ** Release memory previously allocated by tableColumnList().
10609 */
freeColumnList(char ** azCol)10610 static void freeColumnList(char **azCol){
10611   int i;
10612   for(i=1; azCol[i]; i++){
10613     sqlite3_free(azCol[i]);
10614   }
10615   /* azCol[0] is a static string */
10616   sqlite3_free(azCol);
10617 }
10618 
10619 /*
10620 ** Return a list of pointers to strings which are the names of all
10621 ** columns in table zTab.   The memory to hold the names is dynamically
10622 ** allocated and must be released by the caller using a subsequent call
10623 ** to freeColumnList().
10624 **
10625 ** The azCol[0] entry is usually NULL.  However, if zTab contains a rowid
10626 ** value that needs to be preserved, then azCol[0] is filled in with the
10627 ** name of the rowid column.
10628 **
10629 ** The first regular column in the table is azCol[1].  The list is terminated
10630 ** by an entry with azCol[i]==0.
10631 */
tableColumnList(ShellState * p,const char * zTab)10632 static char **tableColumnList(ShellState *p, const char *zTab){
10633   char **azCol = 0;
10634   sqlite3_stmt *pStmt;
10635   char *zSql;
10636   int nCol = 0;
10637   int nAlloc = 0;
10638   int nPK = 0;       /* Number of PRIMARY KEY columns seen */
10639   int isIPK = 0;     /* True if one PRIMARY KEY column of type INTEGER */
10640   int preserveRowid = ShellHasFlag(p, SHFLG_PreserveRowid);
10641   int rc;
10642 
10643   zSql = sqlite3_mprintf("PRAGMA table_info=%Q", zTab);
10644   rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
10645   sqlite3_free(zSql);
10646   if( rc ) return 0;
10647   while( sqlite3_step(pStmt)==SQLITE_ROW ){
10648     if( nCol>=nAlloc-2 ){
10649       nAlloc = nAlloc*2 + nCol + 10;
10650       azCol = sqlite3_realloc(azCol, nAlloc*sizeof(azCol[0]));
10651       if( azCol==0 ) shell_out_of_memory();
10652     }
10653     azCol[++nCol] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 1));
10654     if( sqlite3_column_int(pStmt, 5) ){
10655       nPK++;
10656       if( nPK==1
10657        && sqlite3_stricmp((const char*)sqlite3_column_text(pStmt,2),
10658                           "INTEGER")==0
10659       ){
10660         isIPK = 1;
10661       }else{
10662         isIPK = 0;
10663       }
10664     }
10665   }
10666   sqlite3_finalize(pStmt);
10667   if( azCol==0 ) return 0;
10668   azCol[0] = 0;
10669   azCol[nCol+1] = 0;
10670 
10671   /* The decision of whether or not a rowid really needs to be preserved
10672   ** is tricky.  We never need to preserve a rowid for a WITHOUT ROWID table
10673   ** or a table with an INTEGER PRIMARY KEY.  We are unable to preserve
10674   ** rowids on tables where the rowid is inaccessible because there are other
10675   ** columns in the table named "rowid", "_rowid_", and "oid".
10676   */
10677   if( preserveRowid && isIPK ){
10678     /* If a single PRIMARY KEY column with type INTEGER was seen, then it
10679     ** might be an alise for the ROWID.  But it might also be a WITHOUT ROWID
10680     ** table or a INTEGER PRIMARY KEY DESC column, neither of which are
10681     ** ROWID aliases.  To distinguish these cases, check to see if
10682     ** there is a "pk" entry in "PRAGMA index_list".  There will be
10683     ** no "pk" index if the PRIMARY KEY really is an alias for the ROWID.
10684     */
10685     zSql = sqlite3_mprintf("SELECT 1 FROM pragma_index_list(%Q)"
10686                            " WHERE origin='pk'", zTab);
10687     rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
10688     sqlite3_free(zSql);
10689     if( rc ){
10690       freeColumnList(azCol);
10691       return 0;
10692     }
10693     rc = sqlite3_step(pStmt);
10694     sqlite3_finalize(pStmt);
10695     preserveRowid = rc==SQLITE_ROW;
10696   }
10697   if( preserveRowid ){
10698     /* Only preserve the rowid if we can find a name to use for the
10699     ** rowid */
10700     static char *azRowid[] = { "rowid", "_rowid_", "oid" };
10701     int i, j;
10702     for(j=0; j<3; j++){
10703       for(i=1; i<=nCol; i++){
10704         if( sqlite3_stricmp(azRowid[j],azCol[i])==0 ) break;
10705       }
10706       if( i>nCol ){
10707         /* At this point, we know that azRowid[j] is not the name of any
10708         ** ordinary column in the table.  Verify that azRowid[j] is a valid
10709         ** name for the rowid before adding it to azCol[0].  WITHOUT ROWID
10710         ** tables will fail this last check */
10711         rc = sqlite3_table_column_metadata(p->db,0,zTab,azRowid[j],0,0,0,0,0);
10712         if( rc==SQLITE_OK ) azCol[0] = azRowid[j];
10713         break;
10714       }
10715     }
10716   }
10717   return azCol;
10718 }
10719 
10720 /*
10721 ** Toggle the reverse_unordered_selects setting.
10722 */
toggleSelectOrder(sqlite3 * db)10723 static void toggleSelectOrder(sqlite3 *db){
10724   sqlite3_stmt *pStmt = 0;
10725   int iSetting = 0;
10726   char zStmt[100];
10727   sqlite3_prepare_v2(db, "PRAGMA reverse_unordered_selects", -1, &pStmt, 0);
10728   if( sqlite3_step(pStmt)==SQLITE_ROW ){
10729     iSetting = sqlite3_column_int(pStmt, 0);
10730   }
10731   sqlite3_finalize(pStmt);
10732   sqlite3_snprintf(sizeof(zStmt), zStmt,
10733        "PRAGMA reverse_unordered_selects(%d)", !iSetting);
10734   sqlite3_exec(db, zStmt, 0, 0, 0);
10735 }
10736 
10737 /*
10738 ** This is a different callback routine used for dumping the database.
10739 ** Each row received by this callback consists of a table name,
10740 ** the table type ("index" or "table") and SQL to create the table.
10741 ** This routine should print text sufficient to recreate the table.
10742 */
dump_callback(void * pArg,int nArg,char ** azArg,char ** azNotUsed)10743 static int dump_callback(void *pArg, int nArg, char **azArg, char **azNotUsed){
10744   int rc;
10745   const char *zTable;
10746   const char *zType;
10747   const char *zSql;
10748   ShellState *p = (ShellState *)pArg;
10749 
10750   UNUSED_PARAMETER(azNotUsed);
10751   if( nArg!=3 || azArg==0 ) return 0;
10752   zTable = azArg[0];
10753   zType = azArg[1];
10754   zSql = azArg[2];
10755 
10756   if( strcmp(zTable, "sqlite_sequence")==0 ){
10757     raw_printf(p->out, "DELETE FROM sqlite_sequence;\n");
10758   }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 ){
10759     raw_printf(p->out, "ANALYZE sqlite_master;\n");
10760   }else if( strncmp(zTable, "sqlite_", 7)==0 ){
10761     return 0;
10762   }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
10763     char *zIns;
10764     if( !p->writableSchema ){
10765       raw_printf(p->out, "PRAGMA writable_schema=ON;\n");
10766       p->writableSchema = 1;
10767     }
10768     zIns = sqlite3_mprintf(
10769        "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"
10770        "VALUES('table','%q','%q',0,'%q');",
10771        zTable, zTable, zSql);
10772     utf8_printf(p->out, "%s\n", zIns);
10773     sqlite3_free(zIns);
10774     return 0;
10775   }else{
10776     printSchemaLine(p->out, zSql, ";\n");
10777   }
10778 
10779   if( strcmp(zType, "table")==0 ){
10780     ShellText sSelect;
10781     ShellText sTable;
10782     char **azCol;
10783     int i;
10784     char *savedDestTable;
10785     int savedMode;
10786 
10787     azCol = tableColumnList(p, zTable);
10788     if( azCol==0 ){
10789       p->nErr++;
10790       return 0;
10791     }
10792 
10793     /* Always quote the table name, even if it appears to be pure ascii,
10794     ** in case it is a keyword. Ex:  INSERT INTO "table" ... */
10795     initText(&sTable);
10796     appendText(&sTable, zTable, quoteChar(zTable));
10797     /* If preserving the rowid, add a column list after the table name.
10798     ** In other words:  "INSERT INTO tab(rowid,a,b,c,...) VALUES(...)"
10799     ** instead of the usual "INSERT INTO tab VALUES(...)".
10800     */
10801     if( azCol[0] ){
10802       appendText(&sTable, "(", 0);
10803       appendText(&sTable, azCol[0], 0);
10804       for(i=1; azCol[i]; i++){
10805         appendText(&sTable, ",", 0);
10806         appendText(&sTable, azCol[i], quoteChar(azCol[i]));
10807       }
10808       appendText(&sTable, ")", 0);
10809     }
10810 
10811     /* Build an appropriate SELECT statement */
10812     initText(&sSelect);
10813     appendText(&sSelect, "SELECT ", 0);
10814     if( azCol[0] ){
10815       appendText(&sSelect, azCol[0], 0);
10816       appendText(&sSelect, ",", 0);
10817     }
10818     for(i=1; azCol[i]; i++){
10819       appendText(&sSelect, azCol[i], quoteChar(azCol[i]));
10820       if( azCol[i+1] ){
10821         appendText(&sSelect, ",", 0);
10822       }
10823     }
10824     freeColumnList(azCol);
10825     appendText(&sSelect, " FROM ", 0);
10826     appendText(&sSelect, zTable, quoteChar(zTable));
10827 
10828     savedDestTable = p->zDestTable;
10829     savedMode = p->mode;
10830     p->zDestTable = sTable.z;
10831     p->mode = p->cMode = MODE_Insert;
10832     rc = shell_exec(p, sSelect.z, 0);
10833     if( (rc&0xff)==SQLITE_CORRUPT ){
10834       raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n");
10835       toggleSelectOrder(p->db);
10836       shell_exec(p, sSelect.z, 0);
10837       toggleSelectOrder(p->db);
10838     }
10839     p->zDestTable = savedDestTable;
10840     p->mode = savedMode;
10841     freeText(&sTable);
10842     freeText(&sSelect);
10843     if( rc ) p->nErr++;
10844   }
10845   return 0;
10846 }
10847 
10848 /*
10849 ** Run zQuery.  Use dump_callback() as the callback routine so that
10850 ** the contents of the query are output as SQL statements.
10851 **
10852 ** If we get a SQLITE_CORRUPT error, rerun the query after appending
10853 ** "ORDER BY rowid DESC" to the end.
10854 */
run_schema_dump_query(ShellState * p,const char * zQuery)10855 static int run_schema_dump_query(
10856   ShellState *p,
10857   const char *zQuery
10858 ){
10859   int rc;
10860   char *zErr = 0;
10861   rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
10862   if( rc==SQLITE_CORRUPT ){
10863     char *zQ2;
10864     int len = strlen30(zQuery);
10865     raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n");
10866     if( zErr ){
10867       utf8_printf(p->out, "/****** %s ******/\n", zErr);
10868       sqlite3_free(zErr);
10869       zErr = 0;
10870     }
10871     zQ2 = malloc( len+100 );
10872     if( zQ2==0 ) return rc;
10873     sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
10874     rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
10875     if( rc ){
10876       utf8_printf(p->out, "/****** ERROR: %s ******/\n", zErr);
10877     }else{
10878       rc = SQLITE_CORRUPT;
10879     }
10880     sqlite3_free(zErr);
10881     free(zQ2);
10882   }
10883   return rc;
10884 }
10885 
10886 /*
10887 ** Text of help messages.
10888 **
10889 ** The help text for each individual command begins with a line that starts
10890 ** with ".".  Subsequent lines are supplimental information.
10891 **
10892 ** There must be two or more spaces between the end of the command and the
10893 ** start of the description of what that command does.
10894 */
10895 static const char *(azHelp[]) = {
10896 #if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE)
10897   ".archive ...             Manage SQL archives",
10898   "   Each command must have exactly one of the following options:",
10899   "     -c, --create               Create a new archive",
10900   "     -u, --update               Update or add files to an existing archive",
10901   "     -t, --list                 List contents of archive",
10902   "     -x, --extract              Extract files from archive",
10903   "   Optional arguments:",
10904   "     -v, --verbose              Print each filename as it is processed",
10905   "     -f FILE, --file FILE       Operate on archive FILE (default is current db)",
10906   "     -a FILE, --append FILE     Operate on FILE opened using the apndvfs VFS",
10907   "     -C DIR, --directory DIR    Change to directory DIR to read/extract files",
10908   "     -n, --dryrun               Show the SQL that would have occurred",
10909   "   Examples:",
10910   "     .ar -cf archive.sar foo bar  # Create archive.sar from files foo and bar",
10911   "     .ar -tf archive.sar          # List members of archive.sar",
10912   "     .ar -xvf archive.sar         # Verbosely extract files from archive.sar",
10913   "   See also:",
10914   "      http://sqlite.org/cli.html#sqlar_archive_support",
10915 #endif
10916 #ifndef SQLITE_OMIT_AUTHORIZATION
10917   ".auth ON|OFF             Show authorizer callbacks",
10918 #endif
10919   ".backup ?DB? FILE        Backup DB (default \"main\") to FILE",
10920   "       --append            Use the appendvfs",
10921   ".bail on|off             Stop after hitting an error.  Default OFF",
10922   ".binary on|off           Turn binary output on or off.  Default OFF",
10923   ".cd DIRECTORY            Change the working directory to DIRECTORY",
10924   ".changes on|off          Show number of rows changed by SQL",
10925   ".check GLOB              Fail if output since .testcase does not match",
10926   ".clone NEWDB             Clone data into NEWDB from the existing database",
10927   ".databases               List names and files of attached databases",
10928   ".dbconfig ?op? ?val?     List or change sqlite3_db_config() options",
10929   ".dbinfo ?DB?             Show status information about the database",
10930   ".dump ?TABLE? ...        Render all database content as SQL",
10931   "   Options:",
10932   "     --preserve-rowids      Include ROWID values in the output",
10933   "     --newlines             Allow unescaped newline characters in output",
10934   "   TABLE is LIKE pattern for the tables to dump",
10935   ".echo on|off             Turn command echo on or off",
10936   ".eqp on|off|full         Enable or disable automatic EXPLAIN QUERY PLAN",
10937   ".excel                   Display the output of next command in a spreadsheet",
10938   ".exit ?CODE?             Exit this program with return-code CODE",
10939   ".expert                  EXPERIMENTAL. Suggest indexes for specified queries",
10940 /* Because explain mode comes on automatically now, the ".explain" mode
10941 ** is removed from the help screen.  It is still supported for legacy, however */
10942 /*".explain ?on|off|auto?   Turn EXPLAIN output mode on or off or to automatic",*/
10943   ".fullschema ?--indent?   Show schema and the content of sqlite_stat tables",
10944   ".headers on|off          Turn display of headers on or off",
10945   ".help ?-all? ?PATTERN?   Show help text for PATTERN",
10946   ".import FILE TABLE       Import data from FILE into TABLE",
10947 #ifndef SQLITE_OMIT_TEST_CONTROL
10948   ".imposter INDEX TABLE    Create imposter table TABLE on index INDEX",
10949 #endif
10950   ".indexes ?TABLE?         Show names of indexes",
10951   "                           If TABLE is specified, only show indexes for",
10952   "                           tables matching TABLE using the LIKE operator.",
10953 #ifdef SQLITE_ENABLE_IOTRACE
10954   ".iotrace FILE            Enable I/O diagnostic logging to FILE",
10955 #endif
10956   ".limit ?LIMIT? ?VAL?     Display or change the value of an SQLITE_LIMIT",
10957   ".lint OPTIONS            Report potential schema issues.",
10958   "     Options:",
10959   "        fkey-indexes     Find missing foreign key indexes",
10960 #ifndef SQLITE_OMIT_LOAD_EXTENSION
10961   ".load FILE ?ENTRY?       Load an extension library",
10962 #endif
10963   ".log FILE|off            Turn logging on or off.  FILE can be stderr/stdout",
10964   ".mode MODE ?TABLE?       Set output mode",
10965   "   MODE is one of:",
10966   "     ascii    Columns/rows delimited by 0x1F and 0x1E",
10967   "     csv      Comma-separated values",
10968   "     column   Left-aligned columns.  (See .width)",
10969   "     html     HTML <table> code",
10970   "     insert   SQL insert statements for TABLE",
10971   "     line     One value per line",
10972   "     list     Values delimited by \"|\"",
10973   "     quote    Escape answers as for SQL",
10974   "     tabs     Tab-separated values",
10975   "     tcl      TCL list elements",
10976   ".nullvalue STRING        Use STRING in place of NULL values",
10977   ".once (-e|-x|FILE)       Output for the next SQL command only to FILE",
10978   "     If FILE begins with '|' then open as a pipe",
10979   "     Other options:",
10980   "       -e    Invoke system text editor",
10981   "       -x    Open in a spreadsheet",
10982   ".open ?OPTIONS? ?FILE?   Close existing database and reopen FILE",
10983   "     Options:",
10984   "        --append        Use appendvfs to append database to the end of FILE",
10985 #ifdef SQLITE_ENABLE_DESERIALIZE
10986   "        --deserialize   Load into memory useing sqlite3_deserialize()",
10987 #endif
10988   "        --new           Initialize FILE to an empty database",
10989   "        --readonly      Open FILE readonly",
10990   "        --zip           FILE is a ZIP archive",
10991   ".output ?FILE?           Send output to FILE or stdout if FILE is omitted",
10992   "     If FILE begins with '|' then open it as a pipe.",
10993   ".print STRING...         Print literal STRING",
10994   ".prompt MAIN CONTINUE    Replace the standard prompts",
10995   ".quit                    Exit this program",
10996   ".read FILE               Read input from FILE",
10997   ".restore ?DB? FILE       Restore content of DB (default \"main\") from FILE",
10998   ".save FILE               Write in-memory database into FILE",
10999   ".scanstats on|off        Turn sqlite3_stmt_scanstatus() metrics on or off",
11000   ".schema ?PATTERN?        Show the CREATE statements matching PATTERN",
11001   "     Options:",
11002   "         --indent            Try to pretty-print the schema",
11003   ".selftest ?OPTIONS?      Run tests defined in the SELFTEST table",
11004   "    Options:",
11005   "       --init               Create a new SELFTEST table",
11006   "       -v                   Verbose output",
11007   ".separator COL ?ROW?     Change the column and row separators",
11008 #if defined(SQLITE_ENABLE_SESSION)
11009   ".session ?NAME? CMD ...  Create or control sessions",
11010   "   Subcommands:",
11011   "     attach TABLE             Attach TABLE",
11012   "     changeset FILE           Write a changeset into FILE",
11013   "     close                    Close one session",
11014   "     enable ?BOOLEAN?         Set or query the enable bit",
11015   "     filter GLOB...           Reject tables matching GLOBs",
11016   "     indirect ?BOOLEAN?       Mark or query the indirect status",
11017   "     isempty                  Query whether the session is empty",
11018   "     list                     List currently open session names",
11019   "     open DB NAME             Open a new session on DB",
11020   "     patchset FILE            Write a patchset into FILE",
11021   "   If ?NAME? is omitted, the first defined session is used.",
11022 #endif
11023   ".sha3sum ...             Compute a SHA3 hash of database content",
11024   "    Options:",
11025   "      --schema              Also hash the sqlite_master table",
11026   "      --sha3-224            Use the sha3-224 algorithm",
11027   "      --sha3-256            Use the sha3-256 algorithm.  This is the default.",
11028   "      --sha3-384            Use the sha3-384 algorithm",
11029   "      --sha3-512            Use the sha3-512 algorithm",
11030   "    Any other argument is a LIKE pattern for tables to hash",
11031 #ifndef SQLITE_NOHAVE_SYSTEM
11032   ".shell CMD ARGS...       Run CMD ARGS... in a system shell",
11033 #endif
11034   ".show                    Show the current values for various settings",
11035   ".stats ?on|off?          Show stats or turn stats on or off",
11036 #ifndef SQLITE_NOHAVE_SYSTEM
11037   ".system CMD ARGS...      Run CMD ARGS... in a system shell",
11038 #endif
11039   ".tables ?TABLE?          List names of tables matching LIKE pattern TABLE",
11040   ".testcase NAME           Begin redirecting output to 'testcase-out.txt'",
11041   ".timeout MS              Try opening locked tables for MS milliseconds",
11042   ".timer on|off            Turn SQL timer on or off",
11043   ".trace FILE|off          Output each SQL statement as it is run",
11044   ".vfsinfo ?AUX?           Information about the top-level VFS",
11045   ".vfslist                 List all available VFSes",
11046   ".vfsname ?AUX?           Print the name of the VFS stack",
11047   ".width NUM1 NUM2 ...     Set column widths for \"column\" mode",
11048   "     Negative values right-justify",
11049 };
11050 
11051 /*
11052 ** Output help text.
11053 **
11054 ** zPattern describes the set of commands for which help text is provided.
11055 ** If zPattern is NULL, then show all commands, but only give a one-line
11056 ** description of each.
11057 **
11058 ** Return the number of matches.
11059 */
showHelp(FILE * out,const char * zPattern)11060 static int showHelp(FILE *out, const char *zPattern){
11061   int i = 0;
11062   int j = 0;
11063   int n = 0;
11064   char *zPat;
11065   if( zPattern==0
11066    || zPattern[0]=='0'
11067    || strcmp(zPattern,"-a")==0
11068    || strcmp(zPattern,"-all")==0
11069   ){
11070     /* Show all commands, but only one line per command */
11071     if( zPattern==0 ) zPattern = "";
11072     for(i=0; i<ArraySize(azHelp); i++){
11073       if( azHelp[i][0]=='.' || zPattern[0] ){
11074         utf8_printf(out, "%s\n", azHelp[i]);
11075         n++;
11076       }
11077     }
11078   }else{
11079     /* Look for commands that for which zPattern is an exact prefix */
11080     zPat = sqlite3_mprintf(".%s*", zPattern);
11081     for(i=0; i<ArraySize(azHelp); i++){
11082       if( sqlite3_strglob(zPat, azHelp[i])==0 ){
11083         utf8_printf(out, "%s\n", azHelp[i]);
11084         j = i+1;
11085         n++;
11086       }
11087     }
11088     sqlite3_free(zPat);
11089     if( n ){
11090       if( n==1 ){
11091         /* when zPattern is a prefix of exactly one command, then include the
11092         ** details of that command, which should begin at offset j */
11093         while( j<ArraySize(azHelp)-1 && azHelp[j][0]!='.' ){
11094           utf8_printf(out, "%s\n", azHelp[j]);
11095           j++;
11096         }
11097       }
11098       return n;
11099     }
11100     /* Look for commands that contain zPattern anywhere.  Show the complete
11101     ** text of all commands that match. */
11102     zPat = sqlite3_mprintf("%%%s%%", zPattern);
11103     for(i=0; i<ArraySize(azHelp); i++){
11104       if( azHelp[i][0]=='.' ) j = i;
11105       if( sqlite3_strlike(zPat, azHelp[i], 0)==0 ){
11106         utf8_printf(out, "%s\n", azHelp[j]);
11107         while( j<ArraySize(azHelp)-1 && azHelp[j+1][0]!='.' ){
11108           j++;
11109           utf8_printf(out, "%s\n", azHelp[j]);
11110         }
11111         i = j;
11112         n++;
11113       }
11114     }
11115     sqlite3_free(zPat);
11116   }
11117   return n;
11118 }
11119 
11120 /* Forward reference */
11121 static int process_input(ShellState *p, FILE *in);
11122 
11123 /*
11124 ** Read the content of file zName into memory obtained from sqlite3_malloc64()
11125 ** and return a pointer to the buffer. The caller is responsible for freeing
11126 ** the memory.
11127 **
11128 ** If parameter pnByte is not NULL, (*pnByte) is set to the number of bytes
11129 ** read.
11130 **
11131 ** For convenience, a nul-terminator byte is always appended to the data read
11132 ** from the file before the buffer is returned. This byte is not included in
11133 ** the final value of (*pnByte), if applicable.
11134 **
11135 ** NULL is returned if any error is encountered. The final value of *pnByte
11136 ** is undefined in this case.
11137 */
readFile(const char * zName,int * pnByte)11138 static char *readFile(const char *zName, int *pnByte){
11139   FILE *in = fopen(zName, "rb");
11140   long nIn;
11141   size_t nRead;
11142   char *pBuf;
11143   if( in==0 ) return 0;
11144   fseek(in, 0, SEEK_END);
11145   nIn = ftell(in);
11146   rewind(in);
11147   pBuf = sqlite3_malloc64( nIn+1 );
11148   if( pBuf==0 ){ fclose(in); return 0; }
11149   nRead = fread(pBuf, nIn, 1, in);
11150   fclose(in);
11151   if( nRead!=1 ){
11152     sqlite3_free(pBuf);
11153     return 0;
11154   }
11155   pBuf[nIn] = 0;
11156   if( pnByte ) *pnByte = nIn;
11157   return pBuf;
11158 }
11159 
11160 #if defined(SQLITE_ENABLE_SESSION)
11161 /*
11162 ** Close a single OpenSession object and release all of its associated
11163 ** resources.
11164 */
session_close(OpenSession * pSession)11165 static void session_close(OpenSession *pSession){
11166   int i;
11167   sqlite3session_delete(pSession->p);
11168   sqlite3_free(pSession->zName);
11169   for(i=0; i<pSession->nFilter; i++){
11170     sqlite3_free(pSession->azFilter[i]);
11171   }
11172   sqlite3_free(pSession->azFilter);
11173   memset(pSession, 0, sizeof(OpenSession));
11174 }
11175 #endif
11176 
11177 /*
11178 ** Close all OpenSession objects and release all associated resources.
11179 */
11180 #if defined(SQLITE_ENABLE_SESSION)
session_close_all(ShellState * p)11181 static void session_close_all(ShellState *p){
11182   int i;
11183   for(i=0; i<p->nSession; i++){
11184     session_close(&p->aSession[i]);
11185   }
11186   p->nSession = 0;
11187 }
11188 #else
11189 # define session_close_all(X)
11190 #endif
11191 
11192 /*
11193 ** Implementation of the xFilter function for an open session.  Omit
11194 ** any tables named by ".session filter" but let all other table through.
11195 */
11196 #if defined(SQLITE_ENABLE_SESSION)
session_filter(void * pCtx,const char * zTab)11197 static int session_filter(void *pCtx, const char *zTab){
11198   OpenSession *pSession = (OpenSession*)pCtx;
11199   int i;
11200   for(i=0; i<pSession->nFilter; i++){
11201     if( sqlite3_strglob(pSession->azFilter[i], zTab)==0 ) return 0;
11202   }
11203   return 1;
11204 }
11205 #endif
11206 
11207 /*
11208 ** Try to deduce the type of file for zName based on its content.  Return
11209 ** one of the SHELL_OPEN_* constants.
11210 **
11211 ** If the file does not exist or is empty but its name looks like a ZIP
11212 ** archive and the dfltZip flag is true, then assume it is a ZIP archive.
11213 ** Otherwise, assume an ordinary database regardless of the filename if
11214 ** the type cannot be determined from content.
11215 */
deduceDatabaseType(const char * zName,int dfltZip)11216 static int deduceDatabaseType(const char *zName, int dfltZip){
11217   FILE *f = fopen(zName, "rb");
11218   size_t n;
11219   int rc = SHELL_OPEN_UNSPEC;
11220   char zBuf[100];
11221   if( f==0 ){
11222     if( dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){
11223        return SHELL_OPEN_ZIPFILE;
11224     }else{
11225        return SHELL_OPEN_NORMAL;
11226     }
11227   }
11228   n = fread(zBuf, 16, 1, f);
11229   if( n==1 && memcmp(zBuf, "SQLite format 3", 16)==0 ){
11230     fclose(f);
11231     return SHELL_OPEN_NORMAL;
11232   }
11233   fseek(f, -25, SEEK_END);
11234   n = fread(zBuf, 25, 1, f);
11235   if( n==1 && memcmp(zBuf, "Start-Of-SQLite3-", 17)==0 ){
11236     rc = SHELL_OPEN_APPENDVFS;
11237   }else{
11238     fseek(f, -22, SEEK_END);
11239     n = fread(zBuf, 22, 1, f);
11240     if( n==1 && zBuf[0]==0x50 && zBuf[1]==0x4b && zBuf[2]==0x05
11241        && zBuf[3]==0x06 ){
11242       rc = SHELL_OPEN_ZIPFILE;
11243     }else if( n==0 && dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){
11244       rc = SHELL_OPEN_ZIPFILE;
11245     }
11246   }
11247   fclose(f);
11248   return rc;
11249 }
11250 
11251 /* Flags for open_db().
11252 **
11253 ** The default behavior of open_db() is to exit(1) if the database fails to
11254 ** open.  The OPEN_DB_KEEPALIVE flag changes that so that it prints an error
11255 ** but still returns without calling exit.
11256 **
11257 ** The OPEN_DB_ZIPFILE flag causes open_db() to prefer to open files as a
11258 ** ZIP archive if the file does not exist or is empty and its name matches
11259 ** the *.zip pattern.
11260 */
11261 #define OPEN_DB_KEEPALIVE   0x001   /* Return after error if true */
11262 #define OPEN_DB_ZIPFILE     0x002   /* Open as ZIP if name matches *.zip */
11263 
11264 /*
11265 ** Make sure the database is open.  If it is not, then open it.  If
11266 ** the database fails to open, print an error message and exit.
11267 */
open_db(ShellState * p,int openFlags)11268 static void open_db(ShellState *p, int openFlags){
11269   if( p->db==0 ){
11270     if( p->openMode==SHELL_OPEN_UNSPEC ){
11271       if( p->zDbFilename==0 || p->zDbFilename[0]==0 ){
11272         p->openMode = SHELL_OPEN_NORMAL;
11273       }else{
11274         p->openMode = (u8)deduceDatabaseType(p->zDbFilename,
11275                              (openFlags & OPEN_DB_ZIPFILE)!=0);
11276       }
11277     }
11278     switch( p->openMode ){
11279       case SHELL_OPEN_APPENDVFS: {
11280         sqlite3_open_v2(p->zDbFilename, &p->db,
11281            SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE, "apndvfs");
11282         break;
11283       }
11284       case SHELL_OPEN_DESERIALIZE: {
11285         sqlite3_open(0, &p->db);
11286         break;
11287       }
11288       case SHELL_OPEN_ZIPFILE: {
11289         sqlite3_open(":memory:", &p->db);
11290         break;
11291       }
11292       case SHELL_OPEN_READONLY: {
11293         sqlite3_open_v2(p->zDbFilename, &p->db, SQLITE_OPEN_READONLY, 0);
11294         break;
11295       }
11296       case SHELL_OPEN_UNSPEC:
11297       case SHELL_OPEN_NORMAL: {
11298         sqlite3_open(p->zDbFilename, &p->db);
11299         break;
11300       }
11301     }
11302     globalDb = p->db;
11303     if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){
11304       utf8_printf(stderr,"Error: unable to open database \"%s\": %s\n",
11305           p->zDbFilename, sqlite3_errmsg(p->db));
11306       if( openFlags & OPEN_DB_KEEPALIVE ) return;
11307       exit(1);
11308     }
11309 #ifndef SQLITE_OMIT_LOAD_EXTENSION
11310     sqlite3_enable_load_extension(p->db, 1);
11311 #endif
11312     sqlite3_fileio_init(p->db, 0, 0);
11313     sqlite3_shathree_init(p->db, 0, 0);
11314     sqlite3_completion_init(p->db, 0, 0);
11315 #ifdef SQLITE_HAVE_ZLIB
11316     sqlite3_zipfile_init(p->db, 0, 0);
11317     sqlite3_sqlar_init(p->db, 0, 0);
11318 #endif
11319     sqlite3_create_function(p->db, "shell_add_schema", 3, SQLITE_UTF8, 0,
11320                             shellAddSchemaName, 0, 0);
11321     sqlite3_create_function(p->db, "shell_module_schema", 1, SQLITE_UTF8, 0,
11322                             shellModuleSchema, 0, 0);
11323     sqlite3_create_function(p->db, "shell_putsnl", 1, SQLITE_UTF8, p,
11324                             shellPutsFunc, 0, 0);
11325 #ifndef SQLITE_NOHAVE_SYSTEM
11326     sqlite3_create_function(p->db, "edit", 1, SQLITE_UTF8, 0,
11327                             editFunc, 0, 0);
11328     sqlite3_create_function(p->db, "edit", 2, SQLITE_UTF8, 0,
11329                             editFunc, 0, 0);
11330 #endif
11331     if( p->openMode==SHELL_OPEN_ZIPFILE ){
11332       char *zSql = sqlite3_mprintf(
11333          "CREATE VIRTUAL TABLE zip USING zipfile(%Q);", p->zDbFilename);
11334       sqlite3_exec(p->db, zSql, 0, 0, 0);
11335       sqlite3_free(zSql);
11336     }
11337 #ifdef SQLITE_ENABLE_DESERIALIZE
11338     else if( p->openMode==SHELL_OPEN_DESERIALIZE ){
11339       int nData = 0;
11340       unsigned char *aData = (unsigned char*)readFile(p->zDbFilename, &nData);
11341       int rc = sqlite3_deserialize(p->db, "main", aData, nData, nData,
11342                    SQLITE_DESERIALIZE_RESIZEABLE |
11343                    SQLITE_DESERIALIZE_FREEONCLOSE);
11344       if( rc ){
11345         utf8_printf(stderr, "Error: sqlite3_deserialize() returns %d\n", rc);
11346       }
11347     }
11348 #endif
11349   }
11350 }
11351 
11352 /*
11353 ** Attempt to close the databaes connection.  Report errors.
11354 */
close_db(sqlite3 * db)11355 static void close_db(sqlite3 *db){
11356   int rc = sqlite3_close(db);
11357   if( rc ){
11358     utf8_printf(stderr, "Error: sqlite3_close() returns %d: %s\n",
11359         rc, sqlite3_errmsg(db));
11360   }
11361 }
11362 
11363 #if HAVE_READLINE || HAVE_EDITLINE
11364 /*
11365 ** Readline completion callbacks
11366 */
readline_completion_generator(const char * text,int state)11367 static char *readline_completion_generator(const char *text, int state){
11368   static sqlite3_stmt *pStmt = 0;
11369   char *zRet;
11370   if( state==0 ){
11371     char *zSql;
11372     sqlite3_finalize(pStmt);
11373     zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
11374                            "  FROM completion(%Q) ORDER BY 1", text);
11375     sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
11376     sqlite3_free(zSql);
11377   }
11378   if( sqlite3_step(pStmt)==SQLITE_ROW ){
11379     zRet = strdup((const char*)sqlite3_column_text(pStmt, 0));
11380   }else{
11381     sqlite3_finalize(pStmt);
11382     pStmt = 0;
11383     zRet = 0;
11384   }
11385   return zRet;
11386 }
readline_completion(const char * zText,int iStart,int iEnd)11387 static char **readline_completion(const char *zText, int iStart, int iEnd){
11388   rl_attempted_completion_over = 1;
11389   return rl_completion_matches(zText, readline_completion_generator);
11390 }
11391 
11392 #elif HAVE_LINENOISE
11393 /*
11394 ** Linenoise completion callback
11395 */
linenoise_completion(const char * zLine,linenoiseCompletions * lc)11396 static void linenoise_completion(const char *zLine, linenoiseCompletions *lc){
11397   int nLine = strlen30(zLine);
11398   int i, iStart;
11399   sqlite3_stmt *pStmt = 0;
11400   char *zSql;
11401   char zBuf[1000];
11402 
11403   if( nLine>sizeof(zBuf)-30 ) return;
11404   if( zLine[0]=='.' || zLine[0]=='#') return;
11405   for(i=nLine-1; i>=0 && (isalnum(zLine[i]) || zLine[i]=='_'); i--){}
11406   if( i==nLine-1 ) return;
11407   iStart = i+1;
11408   memcpy(zBuf, zLine, iStart);
11409   zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
11410                          "  FROM completion(%Q,%Q) ORDER BY 1",
11411                          &zLine[iStart], zLine);
11412   sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
11413   sqlite3_free(zSql);
11414   sqlite3_exec(globalDb, "PRAGMA page_count", 0, 0, 0); /* Load the schema */
11415   while( sqlite3_step(pStmt)==SQLITE_ROW ){
11416     const char *zCompletion = (const char*)sqlite3_column_text(pStmt, 0);
11417     int nCompletion = sqlite3_column_bytes(pStmt, 0);
11418     if( iStart+nCompletion < sizeof(zBuf)-1 ){
11419       memcpy(zBuf+iStart, zCompletion, nCompletion+1);
11420       linenoiseAddCompletion(lc, zBuf);
11421     }
11422   }
11423   sqlite3_finalize(pStmt);
11424 }
11425 #endif
11426 
11427 /*
11428 ** Do C-language style dequoting.
11429 **
11430 **    \a    -> alarm
11431 **    \b    -> backspace
11432 **    \t    -> tab
11433 **    \n    -> newline
11434 **    \v    -> vertical tab
11435 **    \f    -> form feed
11436 **    \r    -> carriage return
11437 **    \s    -> space
11438 **    \"    -> "
11439 **    \'    -> '
11440 **    \\    -> backslash
11441 **    \NNN  -> ascii character NNN in octal
11442 */
resolve_backslashes(char * z)11443 static void resolve_backslashes(char *z){
11444   int i, j;
11445   char c;
11446   while( *z && *z!='\\' ) z++;
11447   for(i=j=0; (c = z[i])!=0; i++, j++){
11448     if( c=='\\' && z[i+1]!=0 ){
11449       c = z[++i];
11450       if( c=='a' ){
11451         c = '\a';
11452       }else if( c=='b' ){
11453         c = '\b';
11454       }else if( c=='t' ){
11455         c = '\t';
11456       }else if( c=='n' ){
11457         c = '\n';
11458       }else if( c=='v' ){
11459         c = '\v';
11460       }else if( c=='f' ){
11461         c = '\f';
11462       }else if( c=='r' ){
11463         c = '\r';
11464       }else if( c=='"' ){
11465         c = '"';
11466       }else if( c=='\'' ){
11467         c = '\'';
11468       }else if( c=='\\' ){
11469         c = '\\';
11470       }else if( c>='0' && c<='7' ){
11471         c -= '0';
11472         if( z[i+1]>='0' && z[i+1]<='7' ){
11473           i++;
11474           c = (c<<3) + z[i] - '0';
11475           if( z[i+1]>='0' && z[i+1]<='7' ){
11476             i++;
11477             c = (c<<3) + z[i] - '0';
11478           }
11479         }
11480       }
11481     }
11482     z[j] = c;
11483   }
11484   if( j<i ) z[j] = 0;
11485 }
11486 
11487 /*
11488 ** Interpret zArg as either an integer or a boolean value.  Return 1 or 0
11489 ** for TRUE and FALSE.  Return the integer value if appropriate.
11490 */
booleanValue(const char * zArg)11491 static int booleanValue(const char *zArg){
11492   int i;
11493   if( zArg[0]=='0' && zArg[1]=='x' ){
11494     for(i=2; hexDigitValue(zArg[i])>=0; i++){}
11495   }else{
11496     for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
11497   }
11498   if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
11499   if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
11500     return 1;
11501   }
11502   if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
11503     return 0;
11504   }
11505   utf8_printf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
11506           zArg);
11507   return 0;
11508 }
11509 
11510 /*
11511 ** Set or clear a shell flag according to a boolean value.
11512 */
setOrClearFlag(ShellState * p,unsigned mFlag,const char * zArg)11513 static void setOrClearFlag(ShellState *p, unsigned mFlag, const char *zArg){
11514   if( booleanValue(zArg) ){
11515     ShellSetFlag(p, mFlag);
11516   }else{
11517     ShellClearFlag(p, mFlag);
11518   }
11519 }
11520 
11521 /*
11522 ** Close an output file, assuming it is not stderr or stdout
11523 */
output_file_close(FILE * f)11524 static void output_file_close(FILE *f){
11525   if( f && f!=stdout && f!=stderr ) fclose(f);
11526 }
11527 
11528 /*
11529 ** Try to open an output file.   The names "stdout" and "stderr" are
11530 ** recognized and do the right thing.  NULL is returned if the output
11531 ** filename is "off".
11532 */
output_file_open(const char * zFile,int bTextMode)11533 static FILE *output_file_open(const char *zFile, int bTextMode){
11534   FILE *f;
11535   if( strcmp(zFile,"stdout")==0 ){
11536     f = stdout;
11537   }else if( strcmp(zFile, "stderr")==0 ){
11538     f = stderr;
11539   }else if( strcmp(zFile, "off")==0 ){
11540     f = 0;
11541   }else{
11542     f = fopen(zFile, bTextMode ? "w" : "wb");
11543     if( f==0 ){
11544       utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
11545     }
11546   }
11547   return f;
11548 }
11549 
11550 #if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
11551 /*
11552 ** A routine for handling output from sqlite3_trace().
11553 */
sql_trace_callback(unsigned mType,void * pArg,void * pP,void * pX)11554 static int sql_trace_callback(
11555   unsigned mType,
11556   void *pArg,
11557   void *pP,
11558   void *pX
11559 ){
11560   FILE *f = (FILE*)pArg;
11561   UNUSED_PARAMETER(mType);
11562   UNUSED_PARAMETER(pP);
11563   if( f ){
11564     const char *z = (const char*)pX;
11565     int i = strlen30(z);
11566     while( i>0 && z[i-1]==';' ){ i--; }
11567     utf8_printf(f, "%.*s;\n", i, z);
11568   }
11569   return 0;
11570 }
11571 #endif
11572 
11573 /*
11574 ** A no-op routine that runs with the ".breakpoint" doc-command.  This is
11575 ** a useful spot to set a debugger breakpoint.
11576 */
test_breakpoint(void)11577 static void test_breakpoint(void){
11578   static int nCall = 0;
11579   nCall++;
11580 }
11581 
11582 /*
11583 ** An object used to read a CSV and other files for import.
11584 */
11585 typedef struct ImportCtx ImportCtx;
11586 struct ImportCtx {
11587   const char *zFile;  /* Name of the input file */
11588   FILE *in;           /* Read the CSV text from this input stream */
11589   char *z;            /* Accumulated text for a field */
11590   int n;              /* Number of bytes in z */
11591   int nAlloc;         /* Space allocated for z[] */
11592   int nLine;          /* Current line number */
11593   int bNotFirst;      /* True if one or more bytes already read */
11594   int cTerm;          /* Character that terminated the most recent field */
11595   int cColSep;        /* The column separator character.  (Usually ",") */
11596   int cRowSep;        /* The row separator character.  (Usually "\n") */
11597 };
11598 
11599 /* Append a single byte to z[] */
import_append_char(ImportCtx * p,int c)11600 static void import_append_char(ImportCtx *p, int c){
11601   if( p->n+1>=p->nAlloc ){
11602     p->nAlloc += p->nAlloc + 100;
11603     p->z = sqlite3_realloc64(p->z, p->nAlloc);
11604     if( p->z==0 ) shell_out_of_memory();
11605   }
11606   p->z[p->n++] = (char)c;
11607 }
11608 
11609 /* Read a single field of CSV text.  Compatible with rfc4180 and extended
11610 ** with the option of having a separator other than ",".
11611 **
11612 **   +  Input comes from p->in.
11613 **   +  Store results in p->z of length p->n.  Space to hold p->z comes
11614 **      from sqlite3_malloc64().
11615 **   +  Use p->cSep as the column separator.  The default is ",".
11616 **   +  Use p->rSep as the row separator.  The default is "\n".
11617 **   +  Keep track of the line number in p->nLine.
11618 **   +  Store the character that terminates the field in p->cTerm.  Store
11619 **      EOF on end-of-file.
11620 **   +  Report syntax errors on stderr
11621 */
csv_read_one_field(ImportCtx * p)11622 static char *SQLITE_CDECL csv_read_one_field(ImportCtx *p){
11623   int c;
11624   int cSep = p->cColSep;
11625   int rSep = p->cRowSep;
11626   p->n = 0;
11627   c = fgetc(p->in);
11628   if( c==EOF || seenInterrupt ){
11629     p->cTerm = EOF;
11630     return 0;
11631   }
11632   if( c=='"' ){
11633     int pc, ppc;
11634     int startLine = p->nLine;
11635     int cQuote = c;
11636     pc = ppc = 0;
11637     while( 1 ){
11638       c = fgetc(p->in);
11639       if( c==rSep ) p->nLine++;
11640       if( c==cQuote ){
11641         if( pc==cQuote ){
11642           pc = 0;
11643           continue;
11644         }
11645       }
11646       if( (c==cSep && pc==cQuote)
11647        || (c==rSep && pc==cQuote)
11648        || (c==rSep && pc=='\r' && ppc==cQuote)
11649        || (c==EOF && pc==cQuote)
11650       ){
11651         do{ p->n--; }while( p->z[p->n]!=cQuote );
11652         p->cTerm = c;
11653         break;
11654       }
11655       if( pc==cQuote && c!='\r' ){
11656         utf8_printf(stderr, "%s:%d: unescaped %c character\n",
11657                 p->zFile, p->nLine, cQuote);
11658       }
11659       if( c==EOF ){
11660         utf8_printf(stderr, "%s:%d: unterminated %c-quoted field\n",
11661                 p->zFile, startLine, cQuote);
11662         p->cTerm = c;
11663         break;
11664       }
11665       import_append_char(p, c);
11666       ppc = pc;
11667       pc = c;
11668     }
11669   }else{
11670     /* If this is the first field being parsed and it begins with the
11671     ** UTF-8 BOM  (0xEF BB BF) then skip the BOM */
11672     if( (c&0xff)==0xef && p->bNotFirst==0 ){
11673       import_append_char(p, c);
11674       c = fgetc(p->in);
11675       if( (c&0xff)==0xbb ){
11676         import_append_char(p, c);
11677         c = fgetc(p->in);
11678         if( (c&0xff)==0xbf ){
11679           p->bNotFirst = 1;
11680           p->n = 0;
11681           return csv_read_one_field(p);
11682         }
11683       }
11684     }
11685     while( c!=EOF && c!=cSep && c!=rSep ){
11686       import_append_char(p, c);
11687       c = fgetc(p->in);
11688     }
11689     if( c==rSep ){
11690       p->nLine++;
11691       if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
11692     }
11693     p->cTerm = c;
11694   }
11695   if( p->z ) p->z[p->n] = 0;
11696   p->bNotFirst = 1;
11697   return p->z;
11698 }
11699 
11700 /* Read a single field of ASCII delimited text.
11701 **
11702 **   +  Input comes from p->in.
11703 **   +  Store results in p->z of length p->n.  Space to hold p->z comes
11704 **      from sqlite3_malloc64().
11705 **   +  Use p->cSep as the column separator.  The default is "\x1F".
11706 **   +  Use p->rSep as the row separator.  The default is "\x1E".
11707 **   +  Keep track of the row number in p->nLine.
11708 **   +  Store the character that terminates the field in p->cTerm.  Store
11709 **      EOF on end-of-file.
11710 **   +  Report syntax errors on stderr
11711 */
ascii_read_one_field(ImportCtx * p)11712 static char *SQLITE_CDECL ascii_read_one_field(ImportCtx *p){
11713   int c;
11714   int cSep = p->cColSep;
11715   int rSep = p->cRowSep;
11716   p->n = 0;
11717   c = fgetc(p->in);
11718   if( c==EOF || seenInterrupt ){
11719     p->cTerm = EOF;
11720     return 0;
11721   }
11722   while( c!=EOF && c!=cSep && c!=rSep ){
11723     import_append_char(p, c);
11724     c = fgetc(p->in);
11725   }
11726   if( c==rSep ){
11727     p->nLine++;
11728   }
11729   p->cTerm = c;
11730   if( p->z ) p->z[p->n] = 0;
11731   return p->z;
11732 }
11733 
11734 /*
11735 ** Try to transfer data for table zTable.  If an error is seen while
11736 ** moving forward, try to go backwards.  The backwards movement won't
11737 ** work for WITHOUT ROWID tables.
11738 */
tryToCloneData(ShellState * p,sqlite3 * newDb,const char * zTable)11739 static void tryToCloneData(
11740   ShellState *p,
11741   sqlite3 *newDb,
11742   const char *zTable
11743 ){
11744   sqlite3_stmt *pQuery = 0;
11745   sqlite3_stmt *pInsert = 0;
11746   char *zQuery = 0;
11747   char *zInsert = 0;
11748   int rc;
11749   int i, j, n;
11750   int nTable = strlen30(zTable);
11751   int k = 0;
11752   int cnt = 0;
11753   const int spinRate = 10000;
11754 
11755   zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
11756   rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
11757   if( rc ){
11758     utf8_printf(stderr, "Error %d: %s on [%s]\n",
11759             sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
11760             zQuery);
11761     goto end_data_xfer;
11762   }
11763   n = sqlite3_column_count(pQuery);
11764   zInsert = sqlite3_malloc64(200 + nTable + n*3);
11765   if( zInsert==0 ) shell_out_of_memory();
11766   sqlite3_snprintf(200+nTable,zInsert,
11767                    "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
11768   i = strlen30(zInsert);
11769   for(j=1; j<n; j++){
11770     memcpy(zInsert+i, ",?", 2);
11771     i += 2;
11772   }
11773   memcpy(zInsert+i, ");", 3);
11774   rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
11775   if( rc ){
11776     utf8_printf(stderr, "Error %d: %s on [%s]\n",
11777             sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
11778             zQuery);
11779     goto end_data_xfer;
11780   }
11781   for(k=0; k<2; k++){
11782     while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
11783       for(i=0; i<n; i++){
11784         switch( sqlite3_column_type(pQuery, i) ){
11785           case SQLITE_NULL: {
11786             sqlite3_bind_null(pInsert, i+1);
11787             break;
11788           }
11789           case SQLITE_INTEGER: {
11790             sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
11791             break;
11792           }
11793           case SQLITE_FLOAT: {
11794             sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
11795             break;
11796           }
11797           case SQLITE_TEXT: {
11798             sqlite3_bind_text(pInsert, i+1,
11799                              (const char*)sqlite3_column_text(pQuery,i),
11800                              -1, SQLITE_STATIC);
11801             break;
11802           }
11803           case SQLITE_BLOB: {
11804             sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
11805                                             sqlite3_column_bytes(pQuery,i),
11806                                             SQLITE_STATIC);
11807             break;
11808           }
11809         }
11810       } /* End for */
11811       rc = sqlite3_step(pInsert);
11812       if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
11813         utf8_printf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
11814                         sqlite3_errmsg(newDb));
11815       }
11816       sqlite3_reset(pInsert);
11817       cnt++;
11818       if( (cnt%spinRate)==0 ){
11819         printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
11820         fflush(stdout);
11821       }
11822     } /* End while */
11823     if( rc==SQLITE_DONE ) break;
11824     sqlite3_finalize(pQuery);
11825     sqlite3_free(zQuery);
11826     zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
11827                              zTable);
11828     rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
11829     if( rc ){
11830       utf8_printf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
11831       break;
11832     }
11833   } /* End for(k=0...) */
11834 
11835 end_data_xfer:
11836   sqlite3_finalize(pQuery);
11837   sqlite3_finalize(pInsert);
11838   sqlite3_free(zQuery);
11839   sqlite3_free(zInsert);
11840 }
11841 
11842 
11843 /*
11844 ** Try to transfer all rows of the schema that match zWhere.  For
11845 ** each row, invoke xForEach() on the object defined by that row.
11846 ** If an error is encountered while moving forward through the
11847 ** sqlite_master table, try again moving backwards.
11848 */
tryToCloneSchema(ShellState * p,sqlite3 * newDb,const char * zWhere,void (* xForEach)(ShellState *,sqlite3 *,const char *))11849 static void tryToCloneSchema(
11850   ShellState *p,
11851   sqlite3 *newDb,
11852   const char *zWhere,
11853   void (*xForEach)(ShellState*,sqlite3*,const char*)
11854 ){
11855   sqlite3_stmt *pQuery = 0;
11856   char *zQuery = 0;
11857   int rc;
11858   const unsigned char *zName;
11859   const unsigned char *zSql;
11860   char *zErrMsg = 0;
11861 
11862   zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
11863                            " WHERE %s", zWhere);
11864   rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
11865   if( rc ){
11866     utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
11867                     sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
11868                     zQuery);
11869     goto end_schema_xfer;
11870   }
11871   while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
11872     zName = sqlite3_column_text(pQuery, 0);
11873     zSql = sqlite3_column_text(pQuery, 1);
11874     printf("%s... ", zName); fflush(stdout);
11875     sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
11876     if( zErrMsg ){
11877       utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
11878       sqlite3_free(zErrMsg);
11879       zErrMsg = 0;
11880     }
11881     if( xForEach ){
11882       xForEach(p, newDb, (const char*)zName);
11883     }
11884     printf("done\n");
11885   }
11886   if( rc!=SQLITE_DONE ){
11887     sqlite3_finalize(pQuery);
11888     sqlite3_free(zQuery);
11889     zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
11890                              " WHERE %s ORDER BY rowid DESC", zWhere);
11891     rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
11892     if( rc ){
11893       utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
11894                       sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
11895                       zQuery);
11896       goto end_schema_xfer;
11897     }
11898     while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
11899       zName = sqlite3_column_text(pQuery, 0);
11900       zSql = sqlite3_column_text(pQuery, 1);
11901       printf("%s... ", zName); fflush(stdout);
11902       sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
11903       if( zErrMsg ){
11904         utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
11905         sqlite3_free(zErrMsg);
11906         zErrMsg = 0;
11907       }
11908       if( xForEach ){
11909         xForEach(p, newDb, (const char*)zName);
11910       }
11911       printf("done\n");
11912     }
11913   }
11914 end_schema_xfer:
11915   sqlite3_finalize(pQuery);
11916   sqlite3_free(zQuery);
11917 }
11918 
11919 /*
11920 ** Open a new database file named "zNewDb".  Try to recover as much information
11921 ** as possible out of the main database (which might be corrupt) and write it
11922 ** into zNewDb.
11923 */
tryToClone(ShellState * p,const char * zNewDb)11924 static void tryToClone(ShellState *p, const char *zNewDb){
11925   int rc;
11926   sqlite3 *newDb = 0;
11927   if( access(zNewDb,0)==0 ){
11928     utf8_printf(stderr, "File \"%s\" already exists.\n", zNewDb);
11929     return;
11930   }
11931   rc = sqlite3_open(zNewDb, &newDb);
11932   if( rc ){
11933     utf8_printf(stderr, "Cannot create output database: %s\n",
11934             sqlite3_errmsg(newDb));
11935   }else{
11936     sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0);
11937     sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
11938     tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
11939     tryToCloneSchema(p, newDb, "type!='table'", 0);
11940     sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
11941     sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
11942   }
11943   close_db(newDb);
11944 }
11945 
11946 /*
11947 ** Change the output file back to stdout.
11948 **
11949 ** If the p->doXdgOpen flag is set, that means the output was being
11950 ** redirected to a temporary file named by p->zTempFile.  In that case,
11951 ** launch start/open/xdg-open on that temporary file.
11952 */
output_reset(ShellState * p)11953 static void output_reset(ShellState *p){
11954   if( p->outfile[0]=='|' ){
11955 #ifndef SQLITE_OMIT_POPEN
11956     pclose(p->out);
11957 #endif
11958   }else{
11959     output_file_close(p->out);
11960 #ifndef SQLITE_NOHAVE_SYSTEM
11961     if( p->doXdgOpen ){
11962       const char *zXdgOpenCmd =
11963 #if defined(_WIN32)
11964       "start";
11965 #elif defined(__APPLE__)
11966       "open";
11967 #else
11968       "xdg-open";
11969 #endif
11970       char *zCmd;
11971       zCmd = sqlite3_mprintf("%s %s", zXdgOpenCmd, p->zTempFile);
11972       if( system(zCmd) ){
11973         utf8_printf(stderr, "Failed: [%s]\n", zCmd);
11974       }
11975       sqlite3_free(zCmd);
11976       outputModePop(p);
11977       p->doXdgOpen = 0;
11978     }
11979 #endif /* !defined(SQLITE_NOHAVE_SYSTEM) */
11980   }
11981   p->outfile[0] = 0;
11982   p->out = stdout;
11983 }
11984 
11985 /*
11986 ** Run an SQL command and return the single integer result.
11987 */
db_int(ShellState * p,const char * zSql)11988 static int db_int(ShellState *p, const char *zSql){
11989   sqlite3_stmt *pStmt;
11990   int res = 0;
11991   sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
11992   if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){
11993     res = sqlite3_column_int(pStmt,0);
11994   }
11995   sqlite3_finalize(pStmt);
11996   return res;
11997 }
11998 
11999 /*
12000 ** Convert a 2-byte or 4-byte big-endian integer into a native integer
12001 */
get2byteInt(unsigned char * a)12002 static unsigned int get2byteInt(unsigned char *a){
12003   return (a[0]<<8) + a[1];
12004 }
get4byteInt(unsigned char * a)12005 static unsigned int get4byteInt(unsigned char *a){
12006   return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3];
12007 }
12008 
12009 /*
12010 ** Implementation of the ".info" command.
12011 **
12012 ** Return 1 on error, 2 to exit, and 0 otherwise.
12013 */
shell_dbinfo_command(ShellState * p,int nArg,char ** azArg)12014 static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){
12015   static const struct { const char *zName; int ofst; } aField[] = {
12016      { "file change counter:",  24  },
12017      { "database page count:",  28  },
12018      { "freelist page count:",  36  },
12019      { "schema cookie:",        40  },
12020      { "schema format:",        44  },
12021      { "default cache size:",   48  },
12022      { "autovacuum top root:",  52  },
12023      { "incremental vacuum:",   64  },
12024      { "text encoding:",        56  },
12025      { "user version:",         60  },
12026      { "application id:",       68  },
12027      { "software version:",     96  },
12028   };
12029   static const struct { const char *zName; const char *zSql; } aQuery[] = {
12030      { "number of tables:",
12031        "SELECT count(*) FROM %s WHERE type='table'" },
12032      { "number of indexes:",
12033        "SELECT count(*) FROM %s WHERE type='index'" },
12034      { "number of triggers:",
12035        "SELECT count(*) FROM %s WHERE type='trigger'" },
12036      { "number of views:",
12037        "SELECT count(*) FROM %s WHERE type='view'" },
12038      { "schema size:",
12039        "SELECT total(length(sql)) FROM %s" },
12040   };
12041   int i;
12042   unsigned iDataVersion;
12043   char *zSchemaTab;
12044   char *zDb = nArg>=2 ? azArg[1] : "main";
12045   sqlite3_stmt *pStmt = 0;
12046   unsigned char aHdr[100];
12047   open_db(p, 0);
12048   if( p->db==0 ) return 1;
12049   sqlite3_prepare_v2(p->db,"SELECT data FROM sqlite_dbpage(?1) WHERE pgno=1",
12050                      -1, &pStmt, 0);
12051   sqlite3_bind_text(pStmt, 1, zDb, -1, SQLITE_STATIC);
12052   if( sqlite3_step(pStmt)==SQLITE_ROW
12053    && sqlite3_column_bytes(pStmt,0)>100
12054   ){
12055     memcpy(aHdr, sqlite3_column_blob(pStmt,0), 100);
12056     sqlite3_finalize(pStmt);
12057   }else{
12058     raw_printf(stderr, "unable to read database header\n");
12059     sqlite3_finalize(pStmt);
12060     return 1;
12061   }
12062   i = get2byteInt(aHdr+16);
12063   if( i==1 ) i = 65536;
12064   utf8_printf(p->out, "%-20s %d\n", "database page size:", i);
12065   utf8_printf(p->out, "%-20s %d\n", "write format:", aHdr[18]);
12066   utf8_printf(p->out, "%-20s %d\n", "read format:", aHdr[19]);
12067   utf8_printf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]);
12068   for(i=0; i<ArraySize(aField); i++){
12069     int ofst = aField[i].ofst;
12070     unsigned int val = get4byteInt(aHdr + ofst);
12071     utf8_printf(p->out, "%-20s %u", aField[i].zName, val);
12072     switch( ofst ){
12073       case 56: {
12074         if( val==1 ) raw_printf(p->out, " (utf8)");
12075         if( val==2 ) raw_printf(p->out, " (utf16le)");
12076         if( val==3 ) raw_printf(p->out, " (utf16be)");
12077       }
12078     }
12079     raw_printf(p->out, "\n");
12080   }
12081   if( zDb==0 ){
12082     zSchemaTab = sqlite3_mprintf("main.sqlite_master");
12083   }else if( strcmp(zDb,"temp")==0 ){
12084     zSchemaTab = sqlite3_mprintf("%s", "sqlite_temp_master");
12085   }else{
12086     zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_master", zDb);
12087   }
12088   for(i=0; i<ArraySize(aQuery); i++){
12089     char *zSql = sqlite3_mprintf(aQuery[i].zSql, zSchemaTab);
12090     int val = db_int(p, zSql);
12091     sqlite3_free(zSql);
12092     utf8_printf(p->out, "%-20s %d\n", aQuery[i].zName, val);
12093   }
12094   sqlite3_free(zSchemaTab);
12095   sqlite3_file_control(p->db, zDb, SQLITE_FCNTL_DATA_VERSION, &iDataVersion);
12096   utf8_printf(p->out, "%-20s %u\n", "data version", iDataVersion);
12097   return 0;
12098 }
12099 
12100 /*
12101 ** Print the current sqlite3_errmsg() value to stderr and return 1.
12102 */
shellDatabaseError(sqlite3 * db)12103 static int shellDatabaseError(sqlite3 *db){
12104   const char *zErr = sqlite3_errmsg(db);
12105   utf8_printf(stderr, "Error: %s\n", zErr);
12106   return 1;
12107 }
12108 
12109 /*
12110 ** Compare the pattern in zGlob[] against the text in z[].  Return TRUE
12111 ** if they match and FALSE (0) if they do not match.
12112 **
12113 ** Globbing rules:
12114 **
12115 **      '*'       Matches any sequence of zero or more characters.
12116 **
12117 **      '?'       Matches exactly one character.
12118 **
12119 **     [...]      Matches one character from the enclosed list of
12120 **                characters.
12121 **
12122 **     [^...]     Matches one character not in the enclosed list.
12123 **
12124 **      '#'       Matches any sequence of one or more digits with an
12125 **                optional + or - sign in front
12126 **
12127 **      ' '       Any span of whitespace matches any other span of
12128 **                whitespace.
12129 **
12130 ** Extra whitespace at the end of z[] is ignored.
12131 */
testcase_glob(const char * zGlob,const char * z)12132 static int testcase_glob(const char *zGlob, const char *z){
12133   int c, c2;
12134   int invert;
12135   int seen;
12136 
12137   while( (c = (*(zGlob++)))!=0 ){
12138     if( IsSpace(c) ){
12139       if( !IsSpace(*z) ) return 0;
12140       while( IsSpace(*zGlob) ) zGlob++;
12141       while( IsSpace(*z) ) z++;
12142     }else if( c=='*' ){
12143       while( (c=(*(zGlob++))) == '*' || c=='?' ){
12144         if( c=='?' && (*(z++))==0 ) return 0;
12145       }
12146       if( c==0 ){
12147         return 1;
12148       }else if( c=='[' ){
12149         while( *z && testcase_glob(zGlob-1,z)==0 ){
12150           z++;
12151         }
12152         return (*z)!=0;
12153       }
12154       while( (c2 = (*(z++)))!=0 ){
12155         while( c2!=c ){
12156           c2 = *(z++);
12157           if( c2==0 ) return 0;
12158         }
12159         if( testcase_glob(zGlob,z) ) return 1;
12160       }
12161       return 0;
12162     }else if( c=='?' ){
12163       if( (*(z++))==0 ) return 0;
12164     }else if( c=='[' ){
12165       int prior_c = 0;
12166       seen = 0;
12167       invert = 0;
12168       c = *(z++);
12169       if( c==0 ) return 0;
12170       c2 = *(zGlob++);
12171       if( c2=='^' ){
12172         invert = 1;
12173         c2 = *(zGlob++);
12174       }
12175       if( c2==']' ){
12176         if( c==']' ) seen = 1;
12177         c2 = *(zGlob++);
12178       }
12179       while( c2 && c2!=']' ){
12180         if( c2=='-' && zGlob[0]!=']' && zGlob[0]!=0 && prior_c>0 ){
12181           c2 = *(zGlob++);
12182           if( c>=prior_c && c<=c2 ) seen = 1;
12183           prior_c = 0;
12184         }else{
12185           if( c==c2 ){
12186             seen = 1;
12187           }
12188           prior_c = c2;
12189         }
12190         c2 = *(zGlob++);
12191       }
12192       if( c2==0 || (seen ^ invert)==0 ) return 0;
12193     }else if( c=='#' ){
12194       if( (z[0]=='-' || z[0]=='+') && IsDigit(z[1]) ) z++;
12195       if( !IsDigit(z[0]) ) return 0;
12196       z++;
12197       while( IsDigit(z[0]) ){ z++; }
12198     }else{
12199       if( c!=(*(z++)) ) return 0;
12200     }
12201   }
12202   while( IsSpace(*z) ){ z++; }
12203   return *z==0;
12204 }
12205 
12206 
12207 /*
12208 ** Compare the string as a command-line option with either one or two
12209 ** initial "-" characters.
12210 */
optionMatch(const char * zStr,const char * zOpt)12211 static int optionMatch(const char *zStr, const char *zOpt){
12212   if( zStr[0]!='-' ) return 0;
12213   zStr++;
12214   if( zStr[0]=='-' ) zStr++;
12215   return strcmp(zStr, zOpt)==0;
12216 }
12217 
12218 /*
12219 ** Delete a file.
12220 */
shellDeleteFile(const char * zFilename)12221 static int shellDeleteFile(const char *zFilename){
12222   int rc;
12223 #ifdef _WIN32
12224   wchar_t *z = sqlite3_win32_utf8_to_unicode(zFilename);
12225   rc = _wunlink(z);
12226   sqlite3_free(z);
12227 #else
12228   rc = unlink(zFilename);
12229 #endif
12230   return rc;
12231 }
12232 
12233 /*
12234 ** Try to delete the temporary file (if there is one) and free the
12235 ** memory used to hold the name of the temp file.
12236 */
clearTempFile(ShellState * p)12237 static void clearTempFile(ShellState *p){
12238   if( p->zTempFile==0 ) return;
12239   if( p->doXdgOpen ) return;
12240   if( shellDeleteFile(p->zTempFile) ) return;
12241   sqlite3_free(p->zTempFile);
12242   p->zTempFile = 0;
12243 }
12244 
12245 /*
12246 ** Create a new temp file name with the given suffix.
12247 */
newTempFile(ShellState * p,const char * zSuffix)12248 static void newTempFile(ShellState *p, const char *zSuffix){
12249   clearTempFile(p);
12250   sqlite3_free(p->zTempFile);
12251   p->zTempFile = 0;
12252   if( p->db ){
12253     sqlite3_file_control(p->db, 0, SQLITE_FCNTL_TEMPFILENAME, &p->zTempFile);
12254   }
12255   if( p->zTempFile==0 ){
12256     sqlite3_uint64 r;
12257     sqlite3_randomness(sizeof(r), &r);
12258     p->zTempFile = sqlite3_mprintf("temp%llx.%s", r, zSuffix);
12259   }else{
12260     p->zTempFile = sqlite3_mprintf("%z.%s", p->zTempFile, zSuffix);
12261   }
12262   if( p->zTempFile==0 ){
12263     raw_printf(stderr, "out of memory\n");
12264     exit(1);
12265   }
12266 }
12267 
12268 
12269 /*
12270 ** The implementation of SQL scalar function fkey_collate_clause(), used
12271 ** by the ".lint fkey-indexes" command. This scalar function is always
12272 ** called with four arguments - the parent table name, the parent column name,
12273 ** the child table name and the child column name.
12274 **
12275 **   fkey_collate_clause('parent-tab', 'parent-col', 'child-tab', 'child-col')
12276 **
12277 ** If either of the named tables or columns do not exist, this function
12278 ** returns an empty string. An empty string is also returned if both tables
12279 ** and columns exist but have the same default collation sequence. Or,
12280 ** if both exist but the default collation sequences are different, this
12281 ** function returns the string " COLLATE <parent-collation>", where
12282 ** <parent-collation> is the default collation sequence of the parent column.
12283 */
shellFkeyCollateClause(sqlite3_context * pCtx,int nVal,sqlite3_value ** apVal)12284 static void shellFkeyCollateClause(
12285   sqlite3_context *pCtx,
12286   int nVal,
12287   sqlite3_value **apVal
12288 ){
12289   sqlite3 *db = sqlite3_context_db_handle(pCtx);
12290   const char *zParent;
12291   const char *zParentCol;
12292   const char *zParentSeq;
12293   const char *zChild;
12294   const char *zChildCol;
12295   const char *zChildSeq = 0;  /* Initialize to avoid false-positive warning */
12296   int rc;
12297 
12298   assert( nVal==4 );
12299   zParent = (const char*)sqlite3_value_text(apVal[0]);
12300   zParentCol = (const char*)sqlite3_value_text(apVal[1]);
12301   zChild = (const char*)sqlite3_value_text(apVal[2]);
12302   zChildCol = (const char*)sqlite3_value_text(apVal[3]);
12303 
12304   sqlite3_result_text(pCtx, "", -1, SQLITE_STATIC);
12305   rc = sqlite3_table_column_metadata(
12306       db, "main", zParent, zParentCol, 0, &zParentSeq, 0, 0, 0
12307   );
12308   if( rc==SQLITE_OK ){
12309     rc = sqlite3_table_column_metadata(
12310         db, "main", zChild, zChildCol, 0, &zChildSeq, 0, 0, 0
12311     );
12312   }
12313 
12314   if( rc==SQLITE_OK && sqlite3_stricmp(zParentSeq, zChildSeq) ){
12315     char *z = sqlite3_mprintf(" COLLATE %s", zParentSeq);
12316     sqlite3_result_text(pCtx, z, -1, SQLITE_TRANSIENT);
12317     sqlite3_free(z);
12318   }
12319 }
12320 
12321 
12322 /*
12323 ** The implementation of dot-command ".lint fkey-indexes".
12324 */
lintFkeyIndexes(ShellState * pState,char ** azArg,int nArg)12325 static int lintFkeyIndexes(
12326   ShellState *pState,             /* Current shell tool state */
12327   char **azArg,                   /* Array of arguments passed to dot command */
12328   int nArg                        /* Number of entries in azArg[] */
12329 ){
12330   sqlite3 *db = pState->db;       /* Database handle to query "main" db of */
12331   FILE *out = pState->out;        /* Stream to write non-error output to */
12332   int bVerbose = 0;               /* If -verbose is present */
12333   int bGroupByParent = 0;         /* If -groupbyparent is present */
12334   int i;                          /* To iterate through azArg[] */
12335   const char *zIndent = "";       /* How much to indent CREATE INDEX by */
12336   int rc;                         /* Return code */
12337   sqlite3_stmt *pSql = 0;         /* Compiled version of SQL statement below */
12338 
12339   /*
12340   ** This SELECT statement returns one row for each foreign key constraint
12341   ** in the schema of the main database. The column values are:
12342   **
12343   ** 0. The text of an SQL statement similar to:
12344   **
12345   **      "EXPLAIN QUERY PLAN SELECT 1 FROM child_table WHERE child_key=?"
12346   **
12347   **    This SELECT is similar to the one that the foreign keys implementation
12348   **    needs to run internally on child tables. If there is an index that can
12349   **    be used to optimize this query, then it can also be used by the FK
12350   **    implementation to optimize DELETE or UPDATE statements on the parent
12351   **    table.
12352   **
12353   ** 1. A GLOB pattern suitable for sqlite3_strglob(). If the plan output by
12354   **    the EXPLAIN QUERY PLAN command matches this pattern, then the schema
12355   **    contains an index that can be used to optimize the query.
12356   **
12357   ** 2. Human readable text that describes the child table and columns. e.g.
12358   **
12359   **       "child_table(child_key1, child_key2)"
12360   **
12361   ** 3. Human readable text that describes the parent table and columns. e.g.
12362   **
12363   **       "parent_table(parent_key1, parent_key2)"
12364   **
12365   ** 4. A full CREATE INDEX statement for an index that could be used to
12366   **    optimize DELETE or UPDATE statements on the parent table. e.g.
12367   **
12368   **       "CREATE INDEX child_table_child_key ON child_table(child_key)"
12369   **
12370   ** 5. The name of the parent table.
12371   **
12372   ** These six values are used by the C logic below to generate the report.
12373   */
12374   const char *zSql =
12375   "SELECT "
12376     "     'EXPLAIN QUERY PLAN SELECT 1 FROM ' || quote(s.name) || ' WHERE '"
12377     "  || group_concat(quote(s.name) || '.' || quote(f.[from]) || '=?' "
12378     "  || fkey_collate_clause("
12379     "       f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]),' AND ')"
12380     ", "
12381     "     'SEARCH TABLE ' || s.name || ' USING COVERING INDEX*('"
12382     "  || group_concat('*=?', ' AND ') || ')'"
12383     ", "
12384     "     s.name  || '(' || group_concat(f.[from],  ', ') || ')'"
12385     ", "
12386     "     f.[table] || '(' || group_concat(COALESCE(f.[to], p.[name])) || ')'"
12387     ", "
12388     "     'CREATE INDEX ' || quote(s.name ||'_'|| group_concat(f.[from], '_'))"
12389     "  || ' ON ' || quote(s.name) || '('"
12390     "  || group_concat(quote(f.[from]) ||"
12391     "        fkey_collate_clause("
12392     "          f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]), ', ')"
12393     "  || ');'"
12394     ", "
12395     "     f.[table] "
12396     "FROM sqlite_master AS s, pragma_foreign_key_list(s.name) AS f "
12397     "LEFT JOIN pragma_table_info AS p ON (pk-1=seq AND p.arg=f.[table]) "
12398     "GROUP BY s.name, f.id "
12399     "ORDER BY (CASE WHEN ? THEN f.[table] ELSE s.name END)"
12400   ;
12401   const char *zGlobIPK = "SEARCH TABLE * USING INTEGER PRIMARY KEY (rowid=?)";
12402 
12403   for(i=2; i<nArg; i++){
12404     int n = strlen30(azArg[i]);
12405     if( n>1 && sqlite3_strnicmp("-verbose", azArg[i], n)==0 ){
12406       bVerbose = 1;
12407     }
12408     else if( n>1 && sqlite3_strnicmp("-groupbyparent", azArg[i], n)==0 ){
12409       bGroupByParent = 1;
12410       zIndent = "    ";
12411     }
12412     else{
12413       raw_printf(stderr, "Usage: %s %s ?-verbose? ?-groupbyparent?\n",
12414           azArg[0], azArg[1]
12415       );
12416       return SQLITE_ERROR;
12417     }
12418   }
12419 
12420   /* Register the fkey_collate_clause() SQL function */
12421   rc = sqlite3_create_function(db, "fkey_collate_clause", 4, SQLITE_UTF8,
12422       0, shellFkeyCollateClause, 0, 0
12423   );
12424 
12425 
12426   if( rc==SQLITE_OK ){
12427     rc = sqlite3_prepare_v2(db, zSql, -1, &pSql, 0);
12428   }
12429   if( rc==SQLITE_OK ){
12430     sqlite3_bind_int(pSql, 1, bGroupByParent);
12431   }
12432 
12433   if( rc==SQLITE_OK ){
12434     int rc2;
12435     char *zPrev = 0;
12436     while( SQLITE_ROW==sqlite3_step(pSql) ){
12437       int res = -1;
12438       sqlite3_stmt *pExplain = 0;
12439       const char *zEQP = (const char*)sqlite3_column_text(pSql, 0);
12440       const char *zGlob = (const char*)sqlite3_column_text(pSql, 1);
12441       const char *zFrom = (const char*)sqlite3_column_text(pSql, 2);
12442       const char *zTarget = (const char*)sqlite3_column_text(pSql, 3);
12443       const char *zCI = (const char*)sqlite3_column_text(pSql, 4);
12444       const char *zParent = (const char*)sqlite3_column_text(pSql, 5);
12445 
12446       rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
12447       if( rc!=SQLITE_OK ) break;
12448       if( SQLITE_ROW==sqlite3_step(pExplain) ){
12449         const char *zPlan = (const char*)sqlite3_column_text(pExplain, 3);
12450         res = (
12451               0==sqlite3_strglob(zGlob, zPlan)
12452            || 0==sqlite3_strglob(zGlobIPK, zPlan)
12453         );
12454       }
12455       rc = sqlite3_finalize(pExplain);
12456       if( rc!=SQLITE_OK ) break;
12457 
12458       if( res<0 ){
12459         raw_printf(stderr, "Error: internal error");
12460         break;
12461       }else{
12462         if( bGroupByParent
12463         && (bVerbose || res==0)
12464         && (zPrev==0 || sqlite3_stricmp(zParent, zPrev))
12465         ){
12466           raw_printf(out, "-- Parent table %s\n", zParent);
12467           sqlite3_free(zPrev);
12468           zPrev = sqlite3_mprintf("%s", zParent);
12469         }
12470 
12471         if( res==0 ){
12472           raw_printf(out, "%s%s --> %s\n", zIndent, zCI, zTarget);
12473         }else if( bVerbose ){
12474           raw_printf(out, "%s/* no extra indexes required for %s -> %s */\n",
12475               zIndent, zFrom, zTarget
12476           );
12477         }
12478       }
12479     }
12480     sqlite3_free(zPrev);
12481 
12482     if( rc!=SQLITE_OK ){
12483       raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
12484     }
12485 
12486     rc2 = sqlite3_finalize(pSql);
12487     if( rc==SQLITE_OK && rc2!=SQLITE_OK ){
12488       rc = rc2;
12489       raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
12490     }
12491   }else{
12492     raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
12493   }
12494 
12495   return rc;
12496 }
12497 
12498 /*
12499 ** Implementation of ".lint" dot command.
12500 */
lintDotCommand(ShellState * pState,char ** azArg,int nArg)12501 static int lintDotCommand(
12502   ShellState *pState,             /* Current shell tool state */
12503   char **azArg,                   /* Array of arguments passed to dot command */
12504   int nArg                        /* Number of entries in azArg[] */
12505 ){
12506   int n;
12507   n = (nArg>=2 ? strlen30(azArg[1]) : 0);
12508   if( n<1 || sqlite3_strnicmp(azArg[1], "fkey-indexes", n) ) goto usage;
12509   return lintFkeyIndexes(pState, azArg, nArg);
12510 
12511  usage:
12512   raw_printf(stderr, "Usage %s sub-command ?switches...?\n", azArg[0]);
12513   raw_printf(stderr, "Where sub-commands are:\n");
12514   raw_printf(stderr, "    fkey-indexes\n");
12515   return SQLITE_ERROR;
12516 }
12517 
12518 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
12519 /*********************************************************************************
12520 ** The ".archive" or ".ar" command.
12521 */
shellPrepare(sqlite3 * db,int * pRc,const char * zSql,sqlite3_stmt ** ppStmt)12522 static void shellPrepare(
12523   sqlite3 *db,
12524   int *pRc,
12525   const char *zSql,
12526   sqlite3_stmt **ppStmt
12527 ){
12528   *ppStmt = 0;
12529   if( *pRc==SQLITE_OK ){
12530     int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0);
12531     if( rc!=SQLITE_OK ){
12532       raw_printf(stderr, "sql error: %s (%d)\n",
12533           sqlite3_errmsg(db), sqlite3_errcode(db)
12534       );
12535       *pRc = rc;
12536     }
12537   }
12538 }
12539 
shellPreparePrintf(sqlite3 * db,int * pRc,sqlite3_stmt ** ppStmt,const char * zFmt,...)12540 static void shellPreparePrintf(
12541   sqlite3 *db,
12542   int *pRc,
12543   sqlite3_stmt **ppStmt,
12544   const char *zFmt,
12545   ...
12546 ){
12547   *ppStmt = 0;
12548   if( *pRc==SQLITE_OK ){
12549     va_list ap;
12550     char *z;
12551     va_start(ap, zFmt);
12552     z = sqlite3_vmprintf(zFmt, ap);
12553     va_end(ap);
12554     if( z==0 ){
12555       *pRc = SQLITE_NOMEM;
12556     }else{
12557       shellPrepare(db, pRc, z, ppStmt);
12558       sqlite3_free(z);
12559     }
12560   }
12561 }
12562 
shellFinalize(int * pRc,sqlite3_stmt * pStmt)12563 static void shellFinalize(
12564   int *pRc,
12565   sqlite3_stmt *pStmt
12566 ){
12567   if( pStmt ){
12568     sqlite3 *db = sqlite3_db_handle(pStmt);
12569     int rc = sqlite3_finalize(pStmt);
12570     if( *pRc==SQLITE_OK ){
12571       if( rc!=SQLITE_OK ){
12572         raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));
12573       }
12574       *pRc = rc;
12575     }
12576   }
12577 }
12578 
shellReset(int * pRc,sqlite3_stmt * pStmt)12579 static void shellReset(
12580   int *pRc,
12581   sqlite3_stmt *pStmt
12582 ){
12583   int rc = sqlite3_reset(pStmt);
12584   if( *pRc==SQLITE_OK ){
12585     if( rc!=SQLITE_OK ){
12586       sqlite3 *db = sqlite3_db_handle(pStmt);
12587       raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));
12588     }
12589     *pRc = rc;
12590   }
12591 }
12592 /*
12593 ** Structure representing a single ".ar" command.
12594 */
12595 typedef struct ArCommand ArCommand;
12596 struct ArCommand {
12597   u8 eCmd;                        /* An AR_CMD_* value */
12598   u8 bVerbose;                    /* True if --verbose */
12599   u8 bZip;                        /* True if the archive is a ZIP */
12600   u8 bDryRun;                     /* True if --dry-run */
12601   u8 bAppend;                     /* True if --append */
12602   u8 fromCmdLine;                 /* Run from -A instead of .archive */
12603   int nArg;                       /* Number of command arguments */
12604   char *zSrcTable;                /* "sqlar", "zipfile($file)" or "zip" */
12605   const char *zFile;              /* --file argument, or NULL */
12606   const char *zDir;               /* --directory argument, or NULL */
12607   char **azArg;                   /* Array of command arguments */
12608   ShellState *p;                  /* Shell state */
12609   sqlite3 *db;                    /* Database containing the archive */
12610 };
12611 
12612 /*
12613 ** Print a usage message for the .ar command to stderr and return SQLITE_ERROR.
12614 */
arUsage(FILE * f)12615 static int arUsage(FILE *f){
12616   showHelp(f,"archive");
12617   return SQLITE_ERROR;
12618 }
12619 
12620 /*
12621 ** Print an error message for the .ar command to stderr and return
12622 ** SQLITE_ERROR.
12623 */
arErrorMsg(ArCommand * pAr,const char * zFmt,...)12624 static int arErrorMsg(ArCommand *pAr, const char *zFmt, ...){
12625   va_list ap;
12626   char *z;
12627   va_start(ap, zFmt);
12628   z = sqlite3_vmprintf(zFmt, ap);
12629   va_end(ap);
12630   utf8_printf(stderr, "Error: %s\n", z);
12631   if( pAr->fromCmdLine ){
12632     utf8_printf(stderr, "Use \"-A\" for more help\n");
12633   }else{
12634     utf8_printf(stderr, "Use \".archive --help\" for more help\n");
12635   }
12636   sqlite3_free(z);
12637   return SQLITE_ERROR;
12638 }
12639 
12640 /*
12641 ** Values for ArCommand.eCmd.
12642 */
12643 #define AR_CMD_CREATE       1
12644 #define AR_CMD_EXTRACT      2
12645 #define AR_CMD_LIST         3
12646 #define AR_CMD_UPDATE       4
12647 #define AR_CMD_HELP         5
12648 
12649 /*
12650 ** Other (non-command) switches.
12651 */
12652 #define AR_SWITCH_VERBOSE     6
12653 #define AR_SWITCH_FILE        7
12654 #define AR_SWITCH_DIRECTORY   8
12655 #define AR_SWITCH_APPEND      9
12656 #define AR_SWITCH_DRYRUN     10
12657 
arProcessSwitch(ArCommand * pAr,int eSwitch,const char * zArg)12658 static int arProcessSwitch(ArCommand *pAr, int eSwitch, const char *zArg){
12659   switch( eSwitch ){
12660     case AR_CMD_CREATE:
12661     case AR_CMD_EXTRACT:
12662     case AR_CMD_LIST:
12663     case AR_CMD_UPDATE:
12664     case AR_CMD_HELP:
12665       if( pAr->eCmd ){
12666         return arErrorMsg(pAr, "multiple command options");
12667       }
12668       pAr->eCmd = eSwitch;
12669       break;
12670 
12671     case AR_SWITCH_DRYRUN:
12672       pAr->bDryRun = 1;
12673       break;
12674     case AR_SWITCH_VERBOSE:
12675       pAr->bVerbose = 1;
12676       break;
12677     case AR_SWITCH_APPEND:
12678       pAr->bAppend = 1;
12679       /* Fall thru into --file */
12680     case AR_SWITCH_FILE:
12681       pAr->zFile = zArg;
12682       break;
12683     case AR_SWITCH_DIRECTORY:
12684       pAr->zDir = zArg;
12685       break;
12686   }
12687 
12688   return SQLITE_OK;
12689 }
12690 
12691 /*
12692 ** Parse the command line for an ".ar" command. The results are written into
12693 ** structure (*pAr). SQLITE_OK is returned if the command line is parsed
12694 ** successfully, otherwise an error message is written to stderr and
12695 ** SQLITE_ERROR returned.
12696 */
arParseCommand(char ** azArg,int nArg,ArCommand * pAr)12697 static int arParseCommand(
12698   char **azArg,                   /* Array of arguments passed to dot command */
12699   int nArg,                       /* Number of entries in azArg[] */
12700   ArCommand *pAr                  /* Populate this object */
12701 ){
12702   struct ArSwitch {
12703     const char *zLong;
12704     char cShort;
12705     u8 eSwitch;
12706     u8 bArg;
12707   } aSwitch[] = {
12708     { "create",    'c', AR_CMD_CREATE,       0 },
12709     { "extract",   'x', AR_CMD_EXTRACT,      0 },
12710     { "list",      't', AR_CMD_LIST,         0 },
12711     { "update",    'u', AR_CMD_UPDATE,       0 },
12712     { "help",      'h', AR_CMD_HELP,         0 },
12713     { "verbose",   'v', AR_SWITCH_VERBOSE,   0 },
12714     { "file",      'f', AR_SWITCH_FILE,      1 },
12715     { "append",    'a', AR_SWITCH_APPEND,    1 },
12716     { "directory", 'C', AR_SWITCH_DIRECTORY, 1 },
12717     { "dryrun",    'n', AR_SWITCH_DRYRUN,    0 },
12718   };
12719   int nSwitch = sizeof(aSwitch) / sizeof(struct ArSwitch);
12720   struct ArSwitch *pEnd = &aSwitch[nSwitch];
12721 
12722   if( nArg<=1 ){
12723     utf8_printf(stderr, "Wrong number of arguments.  Usage:\n");
12724     return arUsage(stderr);
12725   }else{
12726     char *z = azArg[1];
12727     if( z[0]!='-' ){
12728       /* Traditional style [tar] invocation */
12729       int i;
12730       int iArg = 2;
12731       for(i=0; z[i]; i++){
12732         const char *zArg = 0;
12733         struct ArSwitch *pOpt;
12734         for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
12735           if( z[i]==pOpt->cShort ) break;
12736         }
12737         if( pOpt==pEnd ){
12738           return arErrorMsg(pAr, "unrecognized option: %c", z[i]);
12739         }
12740         if( pOpt->bArg ){
12741           if( iArg>=nArg ){
12742             return arErrorMsg(pAr, "option requires an argument: %c",z[i]);
12743           }
12744           zArg = azArg[iArg++];
12745         }
12746         if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR;
12747       }
12748       pAr->nArg = nArg-iArg;
12749       if( pAr->nArg>0 ){
12750         pAr->azArg = &azArg[iArg];
12751       }
12752     }else{
12753       /* Non-traditional invocation */
12754       int iArg;
12755       for(iArg=1; iArg<nArg; iArg++){
12756         int n;
12757         z = azArg[iArg];
12758         if( z[0]!='-' ){
12759           /* All remaining command line words are command arguments. */
12760           pAr->azArg = &azArg[iArg];
12761           pAr->nArg = nArg-iArg;
12762           break;
12763         }
12764         n = strlen30(z);
12765 
12766         if( z[1]!='-' ){
12767           int i;
12768           /* One or more short options */
12769           for(i=1; i<n; i++){
12770             const char *zArg = 0;
12771             struct ArSwitch *pOpt;
12772             for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
12773               if( z[i]==pOpt->cShort ) break;
12774             }
12775             if( pOpt==pEnd ){
12776               return arErrorMsg(pAr, "unrecognized option: %c", z[i]);
12777             }
12778             if( pOpt->bArg ){
12779               if( i<(n-1) ){
12780                 zArg = &z[i+1];
12781                 i = n;
12782               }else{
12783                 if( iArg>=(nArg-1) ){
12784                   return arErrorMsg(pAr, "option requires an argument: %c",z[i]);
12785                 }
12786                 zArg = azArg[++iArg];
12787               }
12788             }
12789             if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR;
12790           }
12791         }else if( z[2]=='\0' ){
12792           /* A -- option, indicating that all remaining command line words
12793           ** are command arguments.  */
12794           pAr->azArg = &azArg[iArg+1];
12795           pAr->nArg = nArg-iArg-1;
12796           break;
12797         }else{
12798           /* A long option */
12799           const char *zArg = 0;             /* Argument for option, if any */
12800           struct ArSwitch *pMatch = 0;      /* Matching option */
12801           struct ArSwitch *pOpt;            /* Iterator */
12802           for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
12803             const char *zLong = pOpt->zLong;
12804             if( (n-2)<=strlen30(zLong) && 0==memcmp(&z[2], zLong, n-2) ){
12805               if( pMatch ){
12806                 return arErrorMsg(pAr, "ambiguous option: %s",z);
12807               }else{
12808                 pMatch = pOpt;
12809               }
12810             }
12811           }
12812 
12813           if( pMatch==0 ){
12814             return arErrorMsg(pAr, "unrecognized option: %s", z);
12815           }
12816           if( pMatch->bArg ){
12817             if( iArg>=(nArg-1) ){
12818               return arErrorMsg(pAr, "option requires an argument: %s", z);
12819             }
12820             zArg = azArg[++iArg];
12821           }
12822           if( arProcessSwitch(pAr, pMatch->eSwitch, zArg) ) return SQLITE_ERROR;
12823         }
12824       }
12825     }
12826   }
12827 
12828   return SQLITE_OK;
12829 }
12830 
12831 /*
12832 ** This function assumes that all arguments within the ArCommand.azArg[]
12833 ** array refer to archive members, as for the --extract or --list commands.
12834 ** It checks that each of them are present. If any specified file is not
12835 ** present in the archive, an error is printed to stderr and an error
12836 ** code returned. Otherwise, if all specified arguments are present in
12837 ** the archive, SQLITE_OK is returned.
12838 **
12839 ** This function strips any trailing '/' characters from each argument.
12840 ** This is consistent with the way the [tar] command seems to work on
12841 ** Linux.
12842 */
arCheckEntries(ArCommand * pAr)12843 static int arCheckEntries(ArCommand *pAr){
12844   int rc = SQLITE_OK;
12845   if( pAr->nArg ){
12846     int i, j;
12847     sqlite3_stmt *pTest = 0;
12848 
12849     shellPreparePrintf(pAr->db, &rc, &pTest,
12850         "SELECT name FROM %s WHERE name=$name",
12851         pAr->zSrcTable
12852     );
12853     j = sqlite3_bind_parameter_index(pTest, "$name");
12854     for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){
12855       char *z = pAr->azArg[i];
12856       int n = strlen30(z);
12857       int bOk = 0;
12858       while( n>0 && z[n-1]=='/' ) n--;
12859       z[n] = '\0';
12860       sqlite3_bind_text(pTest, j, z, -1, SQLITE_STATIC);
12861       if( SQLITE_ROW==sqlite3_step(pTest) ){
12862         bOk = 1;
12863       }
12864       shellReset(&rc, pTest);
12865       if( rc==SQLITE_OK && bOk==0 ){
12866         utf8_printf(stderr, "not found in archive: %s\n", z);
12867         rc = SQLITE_ERROR;
12868       }
12869     }
12870     shellFinalize(&rc, pTest);
12871   }
12872   return rc;
12873 }
12874 
12875 /*
12876 ** Format a WHERE clause that can be used against the "sqlar" table to
12877 ** identify all archive members that match the command arguments held
12878 ** in (*pAr). Leave this WHERE clause in (*pzWhere) before returning.
12879 ** The caller is responsible for eventually calling sqlite3_free() on
12880 ** any non-NULL (*pzWhere) value.
12881 */
arWhereClause(int * pRc,ArCommand * pAr,char ** pzWhere)12882 static void arWhereClause(
12883   int *pRc,
12884   ArCommand *pAr,
12885   char **pzWhere                  /* OUT: New WHERE clause */
12886 ){
12887   char *zWhere = 0;
12888   if( *pRc==SQLITE_OK ){
12889     if( pAr->nArg==0 ){
12890       zWhere = sqlite3_mprintf("1");
12891     }else{
12892       int i;
12893       const char *zSep = "";
12894       for(i=0; i<pAr->nArg; i++){
12895         const char *z = pAr->azArg[i];
12896         zWhere = sqlite3_mprintf(
12897           "%z%s name = '%q' OR substr(name,1,%d) = '%q/'",
12898           zWhere, zSep, z, strlen30(z)+1, z
12899         );
12900         if( zWhere==0 ){
12901           *pRc = SQLITE_NOMEM;
12902           break;
12903         }
12904         zSep = " OR ";
12905       }
12906     }
12907   }
12908   *pzWhere = zWhere;
12909 }
12910 
12911 /*
12912 ** Implementation of .ar "lisT" command.
12913 */
arListCommand(ArCommand * pAr)12914 static int arListCommand(ArCommand *pAr){
12915   const char *zSql = "SELECT %s FROM %s WHERE %s";
12916   const char *azCols[] = {
12917     "name",
12918     "lsmode(mode), sz, datetime(mtime, 'unixepoch'), name"
12919   };
12920 
12921   char *zWhere = 0;
12922   sqlite3_stmt *pSql = 0;
12923   int rc;
12924 
12925   rc = arCheckEntries(pAr);
12926   arWhereClause(&rc, pAr, &zWhere);
12927 
12928   shellPreparePrintf(pAr->db, &rc, &pSql, zSql, azCols[pAr->bVerbose],
12929                      pAr->zSrcTable, zWhere);
12930   if( pAr->bDryRun ){
12931     utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql));
12932   }else{
12933     while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
12934       if( pAr->bVerbose ){
12935         utf8_printf(pAr->p->out, "%s % 10d  %s  %s\n",
12936             sqlite3_column_text(pSql, 0),
12937             sqlite3_column_int(pSql, 1),
12938             sqlite3_column_text(pSql, 2),
12939             sqlite3_column_text(pSql, 3)
12940         );
12941       }else{
12942         utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0));
12943       }
12944     }
12945   }
12946   shellFinalize(&rc, pSql);
12947   sqlite3_free(zWhere);
12948   return rc;
12949 }
12950 
12951 
12952 /*
12953 ** Implementation of .ar "eXtract" command.
12954 */
arExtractCommand(ArCommand * pAr)12955 static int arExtractCommand(ArCommand *pAr){
12956   const char *zSql1 =
12957     "SELECT "
12958     " ($dir || name),"
12959     " writefile(($dir || name), %s, mode, mtime) "
12960     "FROM %s WHERE (%s) AND (data IS NULL OR $dirOnly = 0)"
12961     " AND name NOT GLOB '*..[/\\]*'";
12962 
12963   const char *azExtraArg[] = {
12964     "sqlar_uncompress(data, sz)",
12965     "data"
12966   };
12967 
12968   sqlite3_stmt *pSql = 0;
12969   int rc = SQLITE_OK;
12970   char *zDir = 0;
12971   char *zWhere = 0;
12972   int i, j;
12973 
12974   /* If arguments are specified, check that they actually exist within
12975   ** the archive before proceeding. And formulate a WHERE clause to
12976   ** match them.  */
12977   rc = arCheckEntries(pAr);
12978   arWhereClause(&rc, pAr, &zWhere);
12979 
12980   if( rc==SQLITE_OK ){
12981     if( pAr->zDir ){
12982       zDir = sqlite3_mprintf("%s/", pAr->zDir);
12983     }else{
12984       zDir = sqlite3_mprintf("");
12985     }
12986     if( zDir==0 ) rc = SQLITE_NOMEM;
12987   }
12988 
12989   shellPreparePrintf(pAr->db, &rc, &pSql, zSql1,
12990       azExtraArg[pAr->bZip], pAr->zSrcTable, zWhere
12991   );
12992 
12993   if( rc==SQLITE_OK ){
12994     j = sqlite3_bind_parameter_index(pSql, "$dir");
12995     sqlite3_bind_text(pSql, j, zDir, -1, SQLITE_STATIC);
12996 
12997     /* Run the SELECT statement twice. The first time, writefile() is called
12998     ** for all archive members that should be extracted. The second time,
12999     ** only for the directories. This is because the timestamps for
13000     ** extracted directories must be reset after they are populated (as
13001     ** populating them changes the timestamp).  */
13002     for(i=0; i<2; i++){
13003       j = sqlite3_bind_parameter_index(pSql, "$dirOnly");
13004       sqlite3_bind_int(pSql, j, i);
13005       if( pAr->bDryRun ){
13006         utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql));
13007       }else{
13008         while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
13009           if( i==0 && pAr->bVerbose ){
13010             utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0));
13011           }
13012         }
13013       }
13014       shellReset(&rc, pSql);
13015     }
13016     shellFinalize(&rc, pSql);
13017   }
13018 
13019   sqlite3_free(zDir);
13020   sqlite3_free(zWhere);
13021   return rc;
13022 }
13023 
13024 /*
13025 ** Run the SQL statement in zSql.  Or if doing a --dryrun, merely print it out.
13026 */
arExecSql(ArCommand * pAr,const char * zSql)13027 static int arExecSql(ArCommand *pAr, const char *zSql){
13028   int rc;
13029   if( pAr->bDryRun ){
13030     utf8_printf(pAr->p->out, "%s\n", zSql);
13031     rc = SQLITE_OK;
13032   }else{
13033     char *zErr = 0;
13034     rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr);
13035     if( zErr ){
13036       utf8_printf(stdout, "ERROR: %s\n", zErr);
13037       sqlite3_free(zErr);
13038     }
13039   }
13040   return rc;
13041 }
13042 
13043 
13044 /*
13045 ** Implementation of .ar "create" and "update" commands.
13046 **
13047 ** Create the "sqlar" table in the database if it does not already exist.
13048 ** Then add each file in the azFile[] array to the archive. Directories
13049 ** are added recursively. If argument bVerbose is non-zero, a message is
13050 ** printed on stdout for each file archived.
13051 **
13052 ** The create command is the same as update, except that it drops
13053 ** any existing "sqlar" table before beginning.
13054 */
arCreateOrUpdateCommand(ArCommand * pAr,int bUpdate)13055 static int arCreateOrUpdateCommand(
13056   ArCommand *pAr,                 /* Command arguments and options */
13057   int bUpdate                     /* true for a --create.  false for --update */
13058 ){
13059   const char *zCreate =
13060       "CREATE TABLE IF NOT EXISTS sqlar(\n"
13061       "  name TEXT PRIMARY KEY,  -- name of the file\n"
13062       "  mode INT,               -- access permissions\n"
13063       "  mtime INT,              -- last modification time\n"
13064       "  sz INT,                 -- original file size\n"
13065       "  data BLOB               -- compressed content\n"
13066       ")";
13067   const char *zDrop = "DROP TABLE IF EXISTS sqlar";
13068   const char *zInsertFmt[2] = {
13069      "REPLACE INTO %s(name,mode,mtime,sz,data)\n"
13070      "  SELECT\n"
13071      "    %s,\n"
13072      "    mode,\n"
13073      "    mtime,\n"
13074      "    CASE substr(lsmode(mode),1,1)\n"
13075      "      WHEN '-' THEN length(data)\n"
13076      "      WHEN 'd' THEN 0\n"
13077      "      ELSE -1 END,\n"
13078      "    sqlar_compress(data)\n"
13079      "  FROM fsdir(%Q,%Q)\n"
13080      "  WHERE lsmode(mode) NOT LIKE '?%%';",
13081      "REPLACE INTO %s(name,mode,mtime,data)\n"
13082      "  SELECT\n"
13083      "    %s,\n"
13084      "    mode,\n"
13085      "    mtime,\n"
13086      "    data\n"
13087      "  FROM fsdir(%Q,%Q)\n"
13088      "  WHERE lsmode(mode) NOT LIKE '?%%';"
13089   };
13090   int i;                          /* For iterating through azFile[] */
13091   int rc;                         /* Return code */
13092   const char *zTab = 0;           /* SQL table into which to insert */
13093   char *zSql;
13094   char zTemp[50];
13095 
13096   arExecSql(pAr, "PRAGMA page_size=512");
13097   rc = arExecSql(pAr, "SAVEPOINT ar;");
13098   if( rc!=SQLITE_OK ) return rc;
13099   zTemp[0] = 0;
13100   if( pAr->bZip ){
13101     /* Initialize the zipfile virtual table, if necessary */
13102     if( pAr->zFile ){
13103       sqlite3_uint64 r;
13104       sqlite3_randomness(sizeof(r),&r);
13105       sqlite3_snprintf(sizeof(zTemp),zTemp,"zip%016llx",r);
13106       zTab = zTemp;
13107       zSql = sqlite3_mprintf(
13108          "CREATE VIRTUAL TABLE temp.%s USING zipfile(%Q)",
13109          zTab, pAr->zFile
13110       );
13111       rc = arExecSql(pAr, zSql);
13112       sqlite3_free(zSql);
13113     }else{
13114       zTab = "zip";
13115     }
13116   }else{
13117     /* Initialize the table for an SQLAR */
13118     zTab = "sqlar";
13119     if( bUpdate==0 ){
13120       rc = arExecSql(pAr, zDrop);
13121       if( rc!=SQLITE_OK ) goto end_ar_transaction;
13122     }
13123     rc = arExecSql(pAr, zCreate);
13124   }
13125   for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){
13126     char *zSql2 = sqlite3_mprintf(zInsertFmt[pAr->bZip], zTab,
13127         pAr->bVerbose ? "shell_putsnl(name)" : "name",
13128         pAr->azArg[i], pAr->zDir);
13129     rc = arExecSql(pAr, zSql2);
13130     sqlite3_free(zSql2);
13131   }
13132 end_ar_transaction:
13133   if( rc!=SQLITE_OK ){
13134     arExecSql(pAr, "ROLLBACK TO ar; RELEASE ar;");
13135   }else{
13136     rc = arExecSql(pAr, "RELEASE ar;");
13137     if( pAr->bZip && pAr->zFile ){
13138       zSql = sqlite3_mprintf("DROP TABLE %s", zTemp);
13139       arExecSql(pAr, zSql);
13140       sqlite3_free(zSql);
13141     }
13142   }
13143   return rc;
13144 }
13145 
13146 /*
13147 ** Implementation of ".ar" dot command.
13148 */
arDotCommand(ShellState * pState,int fromCmdLine,char ** azArg,int nArg)13149 static int arDotCommand(
13150   ShellState *pState,             /* Current shell tool state */
13151   int fromCmdLine,                /* True if -A command-line option, not .ar cmd */
13152   char **azArg,                   /* Array of arguments passed to dot command */
13153   int nArg                        /* Number of entries in azArg[] */
13154 ){
13155   ArCommand cmd;
13156   int rc;
13157   memset(&cmd, 0, sizeof(cmd));
13158   cmd.fromCmdLine = fromCmdLine;
13159   rc = arParseCommand(azArg, nArg, &cmd);
13160   if( rc==SQLITE_OK ){
13161     int eDbType = SHELL_OPEN_UNSPEC;
13162     cmd.p = pState;
13163     cmd.db = pState->db;
13164     if( cmd.zFile ){
13165       eDbType = deduceDatabaseType(cmd.zFile, 1);
13166     }else{
13167       eDbType = pState->openMode;
13168     }
13169     if( eDbType==SHELL_OPEN_ZIPFILE ){
13170       if( cmd.eCmd==AR_CMD_EXTRACT || cmd.eCmd==AR_CMD_LIST ){
13171         if( cmd.zFile==0 ){
13172           cmd.zSrcTable = sqlite3_mprintf("zip");
13173         }else{
13174           cmd.zSrcTable = sqlite3_mprintf("zipfile(%Q)", cmd.zFile);
13175         }
13176       }
13177       cmd.bZip = 1;
13178     }else if( cmd.zFile ){
13179       int flags;
13180       if( cmd.bAppend ) eDbType = SHELL_OPEN_APPENDVFS;
13181       if( cmd.eCmd==AR_CMD_CREATE || cmd.eCmd==AR_CMD_UPDATE ){
13182         flags = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE;
13183       }else{
13184         flags = SQLITE_OPEN_READONLY;
13185       }
13186       cmd.db = 0;
13187       if( cmd.bDryRun ){
13188         utf8_printf(pState->out, "-- open database '%s'%s\n", cmd.zFile,
13189              eDbType==SHELL_OPEN_APPENDVFS ? " using 'apndvfs'" : "");
13190       }
13191       rc = sqlite3_open_v2(cmd.zFile, &cmd.db, flags,
13192              eDbType==SHELL_OPEN_APPENDVFS ? "apndvfs" : 0);
13193       if( rc!=SQLITE_OK ){
13194         utf8_printf(stderr, "cannot open file: %s (%s)\n",
13195             cmd.zFile, sqlite3_errmsg(cmd.db)
13196         );
13197         goto end_ar_command;
13198       }
13199       sqlite3_fileio_init(cmd.db, 0, 0);
13200       sqlite3_sqlar_init(cmd.db, 0, 0);
13201       sqlite3_create_function(cmd.db, "shell_putsnl", 1, SQLITE_UTF8, cmd.p,
13202                               shellPutsFunc, 0, 0);
13203 
13204     }
13205     if( cmd.zSrcTable==0 && cmd.bZip==0 && cmd.eCmd!=AR_CMD_HELP ){
13206       if( cmd.eCmd!=AR_CMD_CREATE
13207        && sqlite3_table_column_metadata(cmd.db,0,"sqlar","name",0,0,0,0,0)
13208       ){
13209         utf8_printf(stderr, "database does not contain an 'sqlar' table\n");
13210         rc = SQLITE_ERROR;
13211         goto end_ar_command;
13212       }
13213       cmd.zSrcTable = sqlite3_mprintf("sqlar");
13214     }
13215 
13216     switch( cmd.eCmd ){
13217       case AR_CMD_CREATE:
13218         rc = arCreateOrUpdateCommand(&cmd, 0);
13219         break;
13220 
13221       case AR_CMD_EXTRACT:
13222         rc = arExtractCommand(&cmd);
13223         break;
13224 
13225       case AR_CMD_LIST:
13226         rc = arListCommand(&cmd);
13227         break;
13228 
13229       case AR_CMD_HELP:
13230         arUsage(pState->out);
13231         break;
13232 
13233       default:
13234         assert( cmd.eCmd==AR_CMD_UPDATE );
13235         rc = arCreateOrUpdateCommand(&cmd, 1);
13236         break;
13237     }
13238   }
13239 end_ar_command:
13240   if( cmd.db!=pState->db ){
13241     close_db(cmd.db);
13242   }
13243   sqlite3_free(cmd.zSrcTable);
13244 
13245   return rc;
13246 }
13247 /* End of the ".archive" or ".ar" command logic
13248 **********************************************************************************/
13249 #endif /* !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) */
13250 
13251 
13252 /*
13253 ** If an input line begins with "." then invoke this routine to
13254 ** process that line.
13255 **
13256 ** Return 1 on error, 2 to exit, and 0 otherwise.
13257 */
do_meta_command(char * zLine,ShellState * p)13258 static int do_meta_command(char *zLine, ShellState *p){
13259   int h = 1;
13260   int nArg = 0;
13261   int n, c;
13262   int rc = 0;
13263   char *azArg[50];
13264 
13265 #ifndef SQLITE_OMIT_VIRTUALTABLE
13266   if( p->expert.pExpert ){
13267     expertFinish(p, 1, 0);
13268   }
13269 #endif
13270 
13271   /* Parse the input line into tokens.
13272   */
13273   while( zLine[h] && nArg<ArraySize(azArg) ){
13274     while( IsSpace(zLine[h]) ){ h++; }
13275     if( zLine[h]==0 ) break;
13276     if( zLine[h]=='\'' || zLine[h]=='"' ){
13277       int delim = zLine[h++];
13278       azArg[nArg++] = &zLine[h];
13279       while( zLine[h] && zLine[h]!=delim ){
13280         if( zLine[h]=='\\' && delim=='"' && zLine[h+1]!=0 ) h++;
13281         h++;
13282       }
13283       if( zLine[h]==delim ){
13284         zLine[h++] = 0;
13285       }
13286       if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
13287     }else{
13288       azArg[nArg++] = &zLine[h];
13289       while( zLine[h] && !IsSpace(zLine[h]) ){ h++; }
13290       if( zLine[h] ) zLine[h++] = 0;
13291       resolve_backslashes(azArg[nArg-1]);
13292     }
13293   }
13294 
13295   /* Process the input line.
13296   */
13297   if( nArg==0 ) return 0; /* no tokens, no error */
13298   n = strlen30(azArg[0]);
13299   c = azArg[0][0];
13300   clearTempFile(p);
13301 
13302 #ifndef SQLITE_OMIT_AUTHORIZATION
13303   if( c=='a' && strncmp(azArg[0], "auth", n)==0 ){
13304     if( nArg!=2 ){
13305       raw_printf(stderr, "Usage: .auth ON|OFF\n");
13306       rc = 1;
13307       goto meta_command_exit;
13308     }
13309     open_db(p, 0);
13310     if( booleanValue(azArg[1]) ){
13311       sqlite3_set_authorizer(p->db, shellAuth, p);
13312     }else{
13313       sqlite3_set_authorizer(p->db, 0, 0);
13314     }
13315   }else
13316 #endif
13317 
13318 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
13319   if( c=='a' && strncmp(azArg[0], "archive", n)==0 ){
13320     open_db(p, 0);
13321     rc = arDotCommand(p, 0, azArg, nArg);
13322   }else
13323 #endif
13324 
13325   if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0)
13326    || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0)
13327   ){
13328     const char *zDestFile = 0;
13329     const char *zDb = 0;
13330     sqlite3 *pDest;
13331     sqlite3_backup *pBackup;
13332     int j;
13333     const char *zVfs = 0;
13334     for(j=1; j<nArg; j++){
13335       const char *z = azArg[j];
13336       if( z[0]=='-' ){
13337         if( z[1]=='-' ) z++;
13338         if( strcmp(z, "-append")==0 ){
13339           zVfs = "apndvfs";
13340         }else
13341         {
13342           utf8_printf(stderr, "unknown option: %s\n", azArg[j]);
13343           return 1;
13344         }
13345       }else if( zDestFile==0 ){
13346         zDestFile = azArg[j];
13347       }else if( zDb==0 ){
13348         zDb = zDestFile;
13349         zDestFile = azArg[j];
13350       }else{
13351         raw_printf(stderr, "Usage: .backup ?DB? ?--append? FILENAME\n");
13352         return 1;
13353       }
13354     }
13355     if( zDestFile==0 ){
13356       raw_printf(stderr, "missing FILENAME argument on .backup\n");
13357       return 1;
13358     }
13359     if( zDb==0 ) zDb = "main";
13360     rc = sqlite3_open_v2(zDestFile, &pDest,
13361                   SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE, zVfs);
13362     if( rc!=SQLITE_OK ){
13363       utf8_printf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
13364       close_db(pDest);
13365       return 1;
13366     }
13367     open_db(p, 0);
13368     pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
13369     if( pBackup==0 ){
13370       utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
13371       close_db(pDest);
13372       return 1;
13373     }
13374     while(  (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
13375     sqlite3_backup_finish(pBackup);
13376     if( rc==SQLITE_DONE ){
13377       rc = 0;
13378     }else{
13379       utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
13380       rc = 1;
13381     }
13382     close_db(pDest);
13383   }else
13384 
13385   if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 ){
13386     if( nArg==2 ){
13387       bail_on_error = booleanValue(azArg[1]);
13388     }else{
13389       raw_printf(stderr, "Usage: .bail on|off\n");
13390       rc = 1;
13391     }
13392   }else
13393 
13394   if( c=='b' && n>=3 && strncmp(azArg[0], "binary", n)==0 ){
13395     if( nArg==2 ){
13396       if( booleanValue(azArg[1]) ){
13397         setBinaryMode(p->out, 1);
13398       }else{
13399         setTextMode(p->out, 1);
13400       }
13401     }else{
13402       raw_printf(stderr, "Usage: .binary on|off\n");
13403       rc = 1;
13404     }
13405   }else
13406 
13407   if( c=='c' && strcmp(azArg[0],"cd")==0 ){
13408     if( nArg==2 ){
13409 #if defined(_WIN32) || defined(WIN32)
13410       wchar_t *z = sqlite3_win32_utf8_to_unicode(azArg[1]);
13411       rc = !SetCurrentDirectoryW(z);
13412       sqlite3_free(z);
13413 #else
13414       rc = chdir(azArg[1]);
13415 #endif
13416       if( rc ){
13417         utf8_printf(stderr, "Cannot change to directory \"%s\"\n", azArg[1]);
13418         rc = 1;
13419       }
13420     }else{
13421       raw_printf(stderr, "Usage: .cd DIRECTORY\n");
13422       rc = 1;
13423     }
13424   }else
13425 
13426   /* The undocumented ".breakpoint" command causes a call to the no-op
13427   ** routine named test_breakpoint().
13428   */
13429   if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
13430     test_breakpoint();
13431   }else
13432 
13433   if( c=='c' && n>=3 && strncmp(azArg[0], "changes", n)==0 ){
13434     if( nArg==2 ){
13435       setOrClearFlag(p, SHFLG_CountChanges, azArg[1]);
13436     }else{
13437       raw_printf(stderr, "Usage: .changes on|off\n");
13438       rc = 1;
13439     }
13440   }else
13441 
13442   /* Cancel output redirection, if it is currently set (by .testcase)
13443   ** Then read the content of the testcase-out.txt file and compare against
13444   ** azArg[1].  If there are differences, report an error and exit.
13445   */
13446   if( c=='c' && n>=3 && strncmp(azArg[0], "check", n)==0 ){
13447     char *zRes = 0;
13448     output_reset(p);
13449     if( nArg!=2 ){
13450       raw_printf(stderr, "Usage: .check GLOB-PATTERN\n");
13451       rc = 2;
13452     }else if( (zRes = readFile("testcase-out.txt", 0))==0 ){
13453       raw_printf(stderr, "Error: cannot read 'testcase-out.txt'\n");
13454       rc = 2;
13455     }else if( testcase_glob(azArg[1],zRes)==0 ){
13456       utf8_printf(stderr,
13457                  "testcase-%s FAILED\n Expected: [%s]\n      Got: [%s]\n",
13458                  p->zTestcase, azArg[1], zRes);
13459       rc = 1;
13460     }else{
13461       utf8_printf(stdout, "testcase-%s ok\n", p->zTestcase);
13462       p->nCheck++;
13463     }
13464     sqlite3_free(zRes);
13465   }else
13466 
13467   if( c=='c' && strncmp(azArg[0], "clone", n)==0 ){
13468     if( nArg==2 ){
13469       tryToClone(p, azArg[1]);
13470     }else{
13471       raw_printf(stderr, "Usage: .clone FILENAME\n");
13472       rc = 1;
13473     }
13474   }else
13475 
13476   if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){
13477     ShellState data;
13478     char *zErrMsg = 0;
13479     open_db(p, 0);
13480     memcpy(&data, p, sizeof(data));
13481     data.showHeader = 0;
13482     data.cMode = data.mode = MODE_List;
13483     sqlite3_snprintf(sizeof(data.colSeparator),data.colSeparator,": ");
13484     data.cnt = 0;
13485     sqlite3_exec(p->db, "SELECT name, file FROM pragma_database_list",
13486                  callback, &data, &zErrMsg);
13487     if( zErrMsg ){
13488       utf8_printf(stderr,"Error: %s\n", zErrMsg);
13489       sqlite3_free(zErrMsg);
13490       rc = 1;
13491     }
13492   }else
13493 
13494   if( c=='d' && n>=3 && strncmp(azArg[0], "dbconfig", n)==0 ){
13495     static const struct DbConfigChoices {
13496       const char *zName;
13497       int op;
13498     } aDbConfig[] = {
13499         { "enable_fkey",      SQLITE_DBCONFIG_ENABLE_FKEY            },
13500         { "enable_trigger",   SQLITE_DBCONFIG_ENABLE_TRIGGER         },
13501         { "fts3_tokenizer",   SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER  },
13502         { "load_extension",   SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION  },
13503         { "no_ckpt_on_close", SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE       },
13504         { "enable_qpsg",      SQLITE_DBCONFIG_ENABLE_QPSG            },
13505         { "trigger_eqp",      SQLITE_DBCONFIG_TRIGGER_EQP            },
13506         { "reset_database",   SQLITE_DBCONFIG_RESET_DATABASE         },
13507         { "defensive",        SQLITE_DBCONFIG_DEFENSIVE              },
13508     };
13509     int ii, v;
13510     open_db(p, 0);
13511     for(ii=0; ii<ArraySize(aDbConfig); ii++){
13512       if( nArg>1 && strcmp(azArg[1], aDbConfig[ii].zName)!=0 ) continue;
13513       if( nArg>=3 ){
13514         sqlite3_db_config(p->db, aDbConfig[ii].op, booleanValue(azArg[2]), 0);
13515       }
13516       sqlite3_db_config(p->db, aDbConfig[ii].op, -1, &v);
13517       utf8_printf(p->out, "%18s %s\n", aDbConfig[ii].zName, v ? "on" : "off");
13518       if( nArg>1 ) break;
13519     }
13520     if( nArg>1 && ii==ArraySize(aDbConfig) ){
13521       utf8_printf(stderr, "Error: unknown dbconfig \"%s\"\n", azArg[1]);
13522       utf8_printf(stderr, "Enter \".dbconfig\" with no arguments for a list\n");
13523     }
13524   }else
13525 
13526   if( c=='d' && n>=3 && strncmp(azArg[0], "dbinfo", n)==0 ){
13527     rc = shell_dbinfo_command(p, nArg, azArg);
13528   }else
13529 
13530   if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){
13531     const char *zLike = 0;
13532     int i;
13533     int savedShowHeader = p->showHeader;
13534     int savedShellFlags = p->shellFlgs;
13535     ShellClearFlag(p, SHFLG_PreserveRowid|SHFLG_Newlines|SHFLG_Echo);
13536     for(i=1; i<nArg; i++){
13537       if( azArg[i][0]=='-' ){
13538         const char *z = azArg[i]+1;
13539         if( z[0]=='-' ) z++;
13540         if( strcmp(z,"preserve-rowids")==0 ){
13541 #ifdef SQLITE_OMIT_VIRTUALTABLE
13542           raw_printf(stderr, "The --preserve-rowids option is not compatible"
13543                              " with SQLITE_OMIT_VIRTUALTABLE\n");
13544           rc = 1;
13545           goto meta_command_exit;
13546 #else
13547           ShellSetFlag(p, SHFLG_PreserveRowid);
13548 #endif
13549         }else
13550         if( strcmp(z,"newlines")==0 ){
13551           ShellSetFlag(p, SHFLG_Newlines);
13552         }else
13553         {
13554           raw_printf(stderr, "Unknown option \"%s\" on \".dump\"\n", azArg[i]);
13555           rc = 1;
13556           goto meta_command_exit;
13557         }
13558       }else if( zLike ){
13559         raw_printf(stderr, "Usage: .dump ?--preserve-rowids? "
13560                            "?--newlines? ?LIKE-PATTERN?\n");
13561         rc = 1;
13562         goto meta_command_exit;
13563       }else{
13564         zLike = azArg[i];
13565       }
13566     }
13567     open_db(p, 0);
13568     /* When playing back a "dump", the content might appear in an order
13569     ** which causes immediate foreign key constraints to be violated.
13570     ** So disable foreign-key constraint enforcement to prevent problems. */
13571     raw_printf(p->out, "PRAGMA foreign_keys=OFF;\n");
13572     raw_printf(p->out, "BEGIN TRANSACTION;\n");
13573     p->writableSchema = 0;
13574     p->showHeader = 0;
13575     /* Set writable_schema=ON since doing so forces SQLite to initialize
13576     ** as much of the schema as it can even if the sqlite_master table is
13577     ** corrupt. */
13578     sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
13579     p->nErr = 0;
13580     if( zLike==0 ){
13581       run_schema_dump_query(p,
13582         "SELECT name, type, sql FROM sqlite_master "
13583         "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'"
13584       );
13585       run_schema_dump_query(p,
13586         "SELECT name, type, sql FROM sqlite_master "
13587         "WHERE name=='sqlite_sequence'"
13588       );
13589       run_table_dump_query(p,
13590         "SELECT sql FROM sqlite_master "
13591         "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
13592       );
13593     }else{
13594       char *zSql;
13595       zSql = sqlite3_mprintf(
13596         "SELECT name, type, sql FROM sqlite_master "
13597         "WHERE tbl_name LIKE %Q AND type=='table'"
13598         "  AND sql NOT NULL", zLike);
13599       run_schema_dump_query(p,zSql);
13600       sqlite3_free(zSql);
13601       zSql = sqlite3_mprintf(
13602         "SELECT sql FROM sqlite_master "
13603         "WHERE sql NOT NULL"
13604         "  AND type IN ('index','trigger','view')"
13605         "  AND tbl_name LIKE %Q", zLike);
13606       run_table_dump_query(p, zSql, 0);
13607       sqlite3_free(zSql);
13608     }
13609     if( p->writableSchema ){
13610       raw_printf(p->out, "PRAGMA writable_schema=OFF;\n");
13611       p->writableSchema = 0;
13612     }
13613     sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
13614     sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
13615     raw_printf(p->out, p->nErr ? "ROLLBACK; -- due to errors\n" : "COMMIT;\n");
13616     p->showHeader = savedShowHeader;
13617     p->shellFlgs = savedShellFlags;
13618   }else
13619 
13620   if( c=='e' && strncmp(azArg[0], "echo", n)==0 ){
13621     if( nArg==2 ){
13622       setOrClearFlag(p, SHFLG_Echo, azArg[1]);
13623     }else{
13624       raw_printf(stderr, "Usage: .echo on|off\n");
13625       rc = 1;
13626     }
13627   }else
13628 
13629   if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){
13630     if( nArg==2 ){
13631       p->autoEQPtest = 0;
13632       if( strcmp(azArg[1],"full")==0 ){
13633         p->autoEQP = AUTOEQP_full;
13634       }else if( strcmp(azArg[1],"trigger")==0 ){
13635         p->autoEQP = AUTOEQP_trigger;
13636       }else if( strcmp(azArg[1],"test")==0 ){
13637         p->autoEQP = AUTOEQP_on;
13638         p->autoEQPtest = 1;
13639       }else{
13640         p->autoEQP = (u8)booleanValue(azArg[1]);
13641       }
13642     }else{
13643       raw_printf(stderr, "Usage: .eqp off|on|trigger|full\n");
13644       rc = 1;
13645     }
13646   }else
13647 
13648   if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
13649     if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
13650     rc = 2;
13651   }else
13652 
13653   /* The ".explain" command is automatic now.  It is largely pointless.  It
13654   ** retained purely for backwards compatibility */
13655   if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){
13656     int val = 1;
13657     if( nArg>=2 ){
13658       if( strcmp(azArg[1],"auto")==0 ){
13659         val = 99;
13660       }else{
13661         val =  booleanValue(azArg[1]);
13662       }
13663     }
13664     if( val==1 && p->mode!=MODE_Explain ){
13665       p->normalMode = p->mode;
13666       p->mode = MODE_Explain;
13667       p->autoExplain = 0;
13668     }else if( val==0 ){
13669       if( p->mode==MODE_Explain ) p->mode = p->normalMode;
13670       p->autoExplain = 0;
13671     }else if( val==99 ){
13672       if( p->mode==MODE_Explain ) p->mode = p->normalMode;
13673       p->autoExplain = 1;
13674     }
13675   }else
13676 
13677 #ifndef SQLITE_OMIT_VIRTUALTABLE
13678   if( c=='e' && strncmp(azArg[0], "expert", n)==0 ){
13679     open_db(p, 0);
13680     expertDotCommand(p, azArg, nArg);
13681   }else
13682 #endif
13683 
13684   if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){
13685     ShellState data;
13686     char *zErrMsg = 0;
13687     int doStats = 0;
13688     memcpy(&data, p, sizeof(data));
13689     data.showHeader = 0;
13690     data.cMode = data.mode = MODE_Semi;
13691     if( nArg==2 && optionMatch(azArg[1], "indent") ){
13692       data.cMode = data.mode = MODE_Pretty;
13693       nArg = 1;
13694     }
13695     if( nArg!=1 ){
13696       raw_printf(stderr, "Usage: .fullschema ?--indent?\n");
13697       rc = 1;
13698       goto meta_command_exit;
13699     }
13700     open_db(p, 0);
13701     rc = sqlite3_exec(p->db,
13702        "SELECT sql FROM"
13703        "  (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
13704        "     FROM sqlite_master UNION ALL"
13705        "   SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
13706        "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
13707        "ORDER BY rowid",
13708        callback, &data, &zErrMsg
13709     );
13710     if( rc==SQLITE_OK ){
13711       sqlite3_stmt *pStmt;
13712       rc = sqlite3_prepare_v2(p->db,
13713                "SELECT rowid FROM sqlite_master"
13714                " WHERE name GLOB 'sqlite_stat[134]'",
13715                -1, &pStmt, 0);
13716       doStats = sqlite3_step(pStmt)==SQLITE_ROW;
13717       sqlite3_finalize(pStmt);
13718     }
13719     if( doStats==0 ){
13720       raw_printf(p->out, "/* No STAT tables available */\n");
13721     }else{
13722       raw_printf(p->out, "ANALYZE sqlite_master;\n");
13723       sqlite3_exec(p->db, "SELECT 'ANALYZE sqlite_master'",
13724                    callback, &data, &zErrMsg);
13725       data.cMode = data.mode = MODE_Insert;
13726       data.zDestTable = "sqlite_stat1";
13727       shell_exec(&data, "SELECT * FROM sqlite_stat1", &zErrMsg);
13728       data.zDestTable = "sqlite_stat3";
13729       shell_exec(&data, "SELECT * FROM sqlite_stat3", &zErrMsg);
13730       data.zDestTable = "sqlite_stat4";
13731       shell_exec(&data, "SELECT * FROM sqlite_stat4", &zErrMsg);
13732       raw_printf(p->out, "ANALYZE sqlite_master;\n");
13733     }
13734   }else
13735 
13736   if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){
13737     if( nArg==2 ){
13738       p->showHeader = booleanValue(azArg[1]);
13739     }else{
13740       raw_printf(stderr, "Usage: .headers on|off\n");
13741       rc = 1;
13742     }
13743   }else
13744 
13745   if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
13746     if( nArg>=2 ){
13747       n = showHelp(p->out, azArg[1]);
13748       if( n==0 ){
13749         utf8_printf(p->out, "Nothing matches '%s'\n", azArg[1]);
13750       }
13751     }else{
13752       showHelp(p->out, 0);
13753     }
13754   }else
13755 
13756   if( c=='i' && strncmp(azArg[0], "import", n)==0 ){
13757     char *zTable;               /* Insert data into this table */
13758     char *zFile;                /* Name of file to extra content from */
13759     sqlite3_stmt *pStmt = NULL; /* A statement */
13760     int nCol;                   /* Number of columns in the table */
13761     int nByte;                  /* Number of bytes in an SQL string */
13762     int i, j;                   /* Loop counters */
13763     int needCommit;             /* True to COMMIT or ROLLBACK at end */
13764     int nSep;                   /* Number of bytes in p->colSeparator[] */
13765     char *zSql;                 /* An SQL statement */
13766     ImportCtx sCtx;             /* Reader context */
13767     char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */
13768     int (SQLITE_CDECL *xCloser)(FILE*);      /* Func to close file */
13769 
13770     if( nArg!=3 ){
13771       raw_printf(stderr, "Usage: .import FILE TABLE\n");
13772       goto meta_command_exit;
13773     }
13774     zFile = azArg[1];
13775     zTable = azArg[2];
13776     seenInterrupt = 0;
13777     memset(&sCtx, 0, sizeof(sCtx));
13778     open_db(p, 0);
13779     nSep = strlen30(p->colSeparator);
13780     if( nSep==0 ){
13781       raw_printf(stderr,
13782                  "Error: non-null column separator required for import\n");
13783       return 1;
13784     }
13785     if( nSep>1 ){
13786       raw_printf(stderr, "Error: multi-character column separators not allowed"
13787                       " for import\n");
13788       return 1;
13789     }
13790     nSep = strlen30(p->rowSeparator);
13791     if( nSep==0 ){
13792       raw_printf(stderr, "Error: non-null row separator required for import\n");
13793       return 1;
13794     }
13795     if( nSep==2 && p->mode==MODE_Csv && strcmp(p->rowSeparator, SEP_CrLf)==0 ){
13796       /* When importing CSV (only), if the row separator is set to the
13797       ** default output row separator, change it to the default input
13798       ** row separator.  This avoids having to maintain different input
13799       ** and output row separators. */
13800       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
13801       nSep = strlen30(p->rowSeparator);
13802     }
13803     if( nSep>1 ){
13804       raw_printf(stderr, "Error: multi-character row separators not allowed"
13805                       " for import\n");
13806       return 1;
13807     }
13808     sCtx.zFile = zFile;
13809     sCtx.nLine = 1;
13810     if( sCtx.zFile[0]=='|' ){
13811 #ifdef SQLITE_OMIT_POPEN
13812       raw_printf(stderr, "Error: pipes are not supported in this OS\n");
13813       return 1;
13814 #else
13815       sCtx.in = popen(sCtx.zFile+1, "r");
13816       sCtx.zFile = "<pipe>";
13817       xCloser = pclose;
13818 #endif
13819     }else{
13820       sCtx.in = fopen(sCtx.zFile, "rb");
13821       xCloser = fclose;
13822     }
13823     if( p->mode==MODE_Ascii ){
13824       xRead = ascii_read_one_field;
13825     }else{
13826       xRead = csv_read_one_field;
13827     }
13828     if( sCtx.in==0 ){
13829       utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
13830       return 1;
13831     }
13832     sCtx.cColSep = p->colSeparator[0];
13833     sCtx.cRowSep = p->rowSeparator[0];
13834     zSql = sqlite3_mprintf("SELECT * FROM %s", zTable);
13835     if( zSql==0 ){
13836       xCloser(sCtx.in);
13837       shell_out_of_memory();
13838     }
13839     nByte = strlen30(zSql);
13840     rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
13841     import_append_char(&sCtx, 0);    /* To ensure sCtx.z is allocated */
13842     if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(p->db))==0 ){
13843       char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable);
13844       char cSep = '(';
13845       while( xRead(&sCtx) ){
13846         zCreate = sqlite3_mprintf("%z%c\n  \"%w\" TEXT", zCreate, cSep, sCtx.z);
13847         cSep = ',';
13848         if( sCtx.cTerm!=sCtx.cColSep ) break;
13849       }
13850       if( cSep=='(' ){
13851         sqlite3_free(zCreate);
13852         sqlite3_free(sCtx.z);
13853         xCloser(sCtx.in);
13854         utf8_printf(stderr,"%s: empty file\n", sCtx.zFile);
13855         return 1;
13856       }
13857       zCreate = sqlite3_mprintf("%z\n)", zCreate);
13858       rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
13859       sqlite3_free(zCreate);
13860       if( rc ){
13861         utf8_printf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable,
13862                 sqlite3_errmsg(p->db));
13863         sqlite3_free(sCtx.z);
13864         xCloser(sCtx.in);
13865         return 1;
13866       }
13867       rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
13868     }
13869     sqlite3_free(zSql);
13870     if( rc ){
13871       if (pStmt) sqlite3_finalize(pStmt);
13872       utf8_printf(stderr,"Error: %s\n", sqlite3_errmsg(p->db));
13873       xCloser(sCtx.in);
13874       return 1;
13875     }
13876     nCol = sqlite3_column_count(pStmt);
13877     sqlite3_finalize(pStmt);
13878     pStmt = 0;
13879     if( nCol==0 ) return 0; /* no columns, no error */
13880     zSql = sqlite3_malloc64( nByte*2 + 20 + nCol*2 );
13881     if( zSql==0 ){
13882       xCloser(sCtx.in);
13883       shell_out_of_memory();
13884     }
13885     sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
13886     j = strlen30(zSql);
13887     for(i=1; i<nCol; i++){
13888       zSql[j++] = ',';
13889       zSql[j++] = '?';
13890     }
13891     zSql[j++] = ')';
13892     zSql[j] = 0;
13893     rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
13894     sqlite3_free(zSql);
13895     if( rc ){
13896       utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
13897       if (pStmt) sqlite3_finalize(pStmt);
13898       xCloser(sCtx.in);
13899       return 1;
13900     }
13901     needCommit = sqlite3_get_autocommit(p->db);
13902     if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
13903     do{
13904       int startLine = sCtx.nLine;
13905       for(i=0; i<nCol; i++){
13906         char *z = xRead(&sCtx);
13907         /*
13908         ** Did we reach end-of-file before finding any columns?
13909         ** If so, stop instead of NULL filling the remaining columns.
13910         */
13911         if( z==0 && i==0 ) break;
13912         /*
13913         ** Did we reach end-of-file OR end-of-line before finding any
13914         ** columns in ASCII mode?  If so, stop instead of NULL filling
13915         ** the remaining columns.
13916         */
13917         if( p->mode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break;
13918         sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
13919         if( i<nCol-1 && sCtx.cTerm!=sCtx.cColSep ){
13920           utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
13921                           "filling the rest with NULL\n",
13922                           sCtx.zFile, startLine, nCol, i+1);
13923           i += 2;
13924           while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; }
13925         }
13926       }
13927       if( sCtx.cTerm==sCtx.cColSep ){
13928         do{
13929           xRead(&sCtx);
13930           i++;
13931         }while( sCtx.cTerm==sCtx.cColSep );
13932         utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
13933                         "extras ignored\n",
13934                         sCtx.zFile, startLine, nCol, i);
13935       }
13936       if( i>=nCol ){
13937         sqlite3_step(pStmt);
13938         rc = sqlite3_reset(pStmt);
13939         if( rc!=SQLITE_OK ){
13940           utf8_printf(stderr, "%s:%d: INSERT failed: %s\n", sCtx.zFile,
13941                       startLine, sqlite3_errmsg(p->db));
13942         }
13943       }
13944     }while( sCtx.cTerm!=EOF );
13945 
13946     xCloser(sCtx.in);
13947     sqlite3_free(sCtx.z);
13948     sqlite3_finalize(pStmt);
13949     if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0);
13950   }else
13951 
13952 #ifndef SQLITE_UNTESTABLE
13953   if( c=='i' && strncmp(azArg[0], "imposter", n)==0 ){
13954     char *zSql;
13955     char *zCollist = 0;
13956     sqlite3_stmt *pStmt;
13957     int tnum = 0;
13958     int i;
13959     if( !(nArg==3 || (nArg==2 && sqlite3_stricmp(azArg[1],"off")==0)) ){
13960       utf8_printf(stderr, "Usage: .imposter INDEX IMPOSTER\n"
13961                           "       .imposter off\n");
13962       rc = 1;
13963       goto meta_command_exit;
13964     }
13965     open_db(p, 0);
13966     if( nArg==2 ){
13967       sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 1);
13968       goto meta_command_exit;
13969     }
13970     zSql = sqlite3_mprintf("SELECT rootpage FROM sqlite_master"
13971                            " WHERE name='%q' AND type='index'", azArg[1]);
13972     sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
13973     sqlite3_free(zSql);
13974     if( sqlite3_step(pStmt)==SQLITE_ROW ){
13975       tnum = sqlite3_column_int(pStmt, 0);
13976     }
13977     sqlite3_finalize(pStmt);
13978     if( tnum==0 ){
13979       utf8_printf(stderr, "no such index: \"%s\"\n", azArg[1]);
13980       rc = 1;
13981       goto meta_command_exit;
13982     }
13983     zSql = sqlite3_mprintf("PRAGMA index_xinfo='%q'", azArg[1]);
13984     rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
13985     sqlite3_free(zSql);
13986     i = 0;
13987     while( sqlite3_step(pStmt)==SQLITE_ROW ){
13988       char zLabel[20];
13989       const char *zCol = (const char*)sqlite3_column_text(pStmt,2);
13990       i++;
13991       if( zCol==0 ){
13992         if( sqlite3_column_int(pStmt,1)==-1 ){
13993           zCol = "_ROWID_";
13994         }else{
13995           sqlite3_snprintf(sizeof(zLabel),zLabel,"expr%d",i);
13996           zCol = zLabel;
13997         }
13998       }
13999       if( zCollist==0 ){
14000         zCollist = sqlite3_mprintf("\"%w\"", zCol);
14001       }else{
14002         zCollist = sqlite3_mprintf("%z,\"%w\"", zCollist, zCol);
14003       }
14004     }
14005     sqlite3_finalize(pStmt);
14006     zSql = sqlite3_mprintf(
14007           "CREATE TABLE \"%w\"(%s,PRIMARY KEY(%s))WITHOUT ROWID",
14008           azArg[2], zCollist, zCollist);
14009     sqlite3_free(zCollist);
14010     rc = sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 1, tnum);
14011     if( rc==SQLITE_OK ){
14012       rc = sqlite3_exec(p->db, zSql, 0, 0, 0);
14013       sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 0);
14014       if( rc ){
14015         utf8_printf(stderr, "Error in [%s]: %s\n", zSql, sqlite3_errmsg(p->db));
14016       }else{
14017         utf8_printf(stdout, "%s;\n", zSql);
14018         raw_printf(stdout,
14019            "WARNING: writing to an imposter table will corrupt the index!\n"
14020         );
14021       }
14022     }else{
14023       raw_printf(stderr, "SQLITE_TESTCTRL_IMPOSTER returns %d\n", rc);
14024       rc = 1;
14025     }
14026     sqlite3_free(zSql);
14027   }else
14028 #endif /* !defined(SQLITE_OMIT_TEST_CONTROL) */
14029 
14030 #ifdef SQLITE_ENABLE_IOTRACE
14031   if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
14032     SQLITE_API extern void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...);
14033     if( iotrace && iotrace!=stdout ) fclose(iotrace);
14034     iotrace = 0;
14035     if( nArg<2 ){
14036       sqlite3IoTrace = 0;
14037     }else if( strcmp(azArg[1], "-")==0 ){
14038       sqlite3IoTrace = iotracePrintf;
14039       iotrace = stdout;
14040     }else{
14041       iotrace = fopen(azArg[1], "w");
14042       if( iotrace==0 ){
14043         utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
14044         sqlite3IoTrace = 0;
14045         rc = 1;
14046       }else{
14047         sqlite3IoTrace = iotracePrintf;
14048       }
14049     }
14050   }else
14051 #endif
14052 
14053   if( c=='l' && n>=5 && strncmp(azArg[0], "limits", n)==0 ){
14054     static const struct {
14055        const char *zLimitName;   /* Name of a limit */
14056        int limitCode;            /* Integer code for that limit */
14057     } aLimit[] = {
14058       { "length",                SQLITE_LIMIT_LENGTH                    },
14059       { "sql_length",            SQLITE_LIMIT_SQL_LENGTH                },
14060       { "column",                SQLITE_LIMIT_COLUMN                    },
14061       { "expr_depth",            SQLITE_LIMIT_EXPR_DEPTH                },
14062       { "compound_select",       SQLITE_LIMIT_COMPOUND_SELECT           },
14063       { "vdbe_op",               SQLITE_LIMIT_VDBE_OP                   },
14064       { "function_arg",          SQLITE_LIMIT_FUNCTION_ARG              },
14065       { "attached",              SQLITE_LIMIT_ATTACHED                  },
14066       { "like_pattern_length",   SQLITE_LIMIT_LIKE_PATTERN_LENGTH       },
14067       { "variable_number",       SQLITE_LIMIT_VARIABLE_NUMBER           },
14068       { "trigger_depth",         SQLITE_LIMIT_TRIGGER_DEPTH             },
14069       { "worker_threads",        SQLITE_LIMIT_WORKER_THREADS            },
14070     };
14071     int i, n2;
14072     open_db(p, 0);
14073     if( nArg==1 ){
14074       for(i=0; i<ArraySize(aLimit); i++){
14075         printf("%20s %d\n", aLimit[i].zLimitName,
14076                sqlite3_limit(p->db, aLimit[i].limitCode, -1));
14077       }
14078     }else if( nArg>3 ){
14079       raw_printf(stderr, "Usage: .limit NAME ?NEW-VALUE?\n");
14080       rc = 1;
14081       goto meta_command_exit;
14082     }else{
14083       int iLimit = -1;
14084       n2 = strlen30(azArg[1]);
14085       for(i=0; i<ArraySize(aLimit); i++){
14086         if( sqlite3_strnicmp(aLimit[i].zLimitName, azArg[1], n2)==0 ){
14087           if( iLimit<0 ){
14088             iLimit = i;
14089           }else{
14090             utf8_printf(stderr, "ambiguous limit: \"%s\"\n", azArg[1]);
14091             rc = 1;
14092             goto meta_command_exit;
14093           }
14094         }
14095       }
14096       if( iLimit<0 ){
14097         utf8_printf(stderr, "unknown limit: \"%s\"\n"
14098                         "enter \".limits\" with no arguments for a list.\n",
14099                          azArg[1]);
14100         rc = 1;
14101         goto meta_command_exit;
14102       }
14103       if( nArg==3 ){
14104         sqlite3_limit(p->db, aLimit[iLimit].limitCode,
14105                       (int)integerValue(azArg[2]));
14106       }
14107       printf("%20s %d\n", aLimit[iLimit].zLimitName,
14108              sqlite3_limit(p->db, aLimit[iLimit].limitCode, -1));
14109     }
14110   }else
14111 
14112   if( c=='l' && n>2 && strncmp(azArg[0], "lint", n)==0 ){
14113     open_db(p, 0);
14114     lintDotCommand(p, azArg, nArg);
14115   }else
14116 
14117 #ifndef SQLITE_OMIT_LOAD_EXTENSION
14118   if( c=='l' && strncmp(azArg[0], "load", n)==0 ){
14119     const char *zFile, *zProc;
14120     char *zErrMsg = 0;
14121     if( nArg<2 ){
14122       raw_printf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n");
14123       rc = 1;
14124       goto meta_command_exit;
14125     }
14126     zFile = azArg[1];
14127     zProc = nArg>=3 ? azArg[2] : 0;
14128     open_db(p, 0);
14129     rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
14130     if( rc!=SQLITE_OK ){
14131       utf8_printf(stderr, "Error: %s\n", zErrMsg);
14132       sqlite3_free(zErrMsg);
14133       rc = 1;
14134     }
14135   }else
14136 #endif
14137 
14138   if( c=='l' && strncmp(azArg[0], "log", n)==0 ){
14139     if( nArg!=2 ){
14140       raw_printf(stderr, "Usage: .log FILENAME\n");
14141       rc = 1;
14142     }else{
14143       const char *zFile = azArg[1];
14144       output_file_close(p->pLog);
14145       p->pLog = output_file_open(zFile, 0);
14146     }
14147   }else
14148 
14149   if( c=='m' && strncmp(azArg[0], "mode", n)==0 ){
14150     const char *zMode = nArg>=2 ? azArg[1] : "";
14151     int n2 = strlen30(zMode);
14152     int c2 = zMode[0];
14153     if( c2=='l' && n2>2 && strncmp(azArg[1],"lines",n2)==0 ){
14154       p->mode = MODE_Line;
14155       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
14156     }else if( c2=='c' && strncmp(azArg[1],"columns",n2)==0 ){
14157       p->mode = MODE_Column;
14158       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
14159     }else if( c2=='l' && n2>2 && strncmp(azArg[1],"list",n2)==0 ){
14160       p->mode = MODE_List;
14161       sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Column);
14162       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
14163     }else if( c2=='h' && strncmp(azArg[1],"html",n2)==0 ){
14164       p->mode = MODE_Html;
14165     }else if( c2=='t' && strncmp(azArg[1],"tcl",n2)==0 ){
14166       p->mode = MODE_Tcl;
14167       sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Space);
14168       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
14169     }else if( c2=='c' && strncmp(azArg[1],"csv",n2)==0 ){
14170       p->mode = MODE_Csv;
14171       sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
14172       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
14173     }else if( c2=='t' && strncmp(azArg[1],"tabs",n2)==0 ){
14174       p->mode = MODE_List;
14175       sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Tab);
14176     }else if( c2=='i' && strncmp(azArg[1],"insert",n2)==0 ){
14177       p->mode = MODE_Insert;
14178       set_table_name(p, nArg>=3 ? azArg[2] : "table");
14179     }else if( c2=='q' && strncmp(azArg[1],"quote",n2)==0 ){
14180       p->mode = MODE_Quote;
14181     }else if( c2=='a' && strncmp(azArg[1],"ascii",n2)==0 ){
14182       p->mode = MODE_Ascii;
14183       sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit);
14184       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record);
14185     }else if( nArg==1 ){
14186       raw_printf(p->out, "current output mode: %s\n", modeDescr[p->mode]);
14187     }else{
14188       raw_printf(stderr, "Error: mode should be one of: "
14189          "ascii column csv html insert line list quote tabs tcl\n");
14190       rc = 1;
14191     }
14192     p->cMode = p->mode;
14193   }else
14194 
14195   if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){
14196     if( nArg==2 ){
14197       sqlite3_snprintf(sizeof(p->nullValue), p->nullValue,
14198                        "%.*s", (int)ArraySize(p->nullValue)-1, azArg[1]);
14199     }else{
14200       raw_printf(stderr, "Usage: .nullvalue STRING\n");
14201       rc = 1;
14202     }
14203   }else
14204 
14205   if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
14206     char *zNewFilename;  /* Name of the database file to open */
14207     int iName = 1;       /* Index in azArg[] of the filename */
14208     int newFlag = 0;     /* True to delete file before opening */
14209     /* Close the existing database */
14210     session_close_all(p);
14211     close_db(p->db);
14212     p->db = 0;
14213     p->zDbFilename = 0;
14214     sqlite3_free(p->zFreeOnClose);
14215     p->zFreeOnClose = 0;
14216     p->openMode = SHELL_OPEN_UNSPEC;
14217     /* Check for command-line arguments */
14218     for(iName=1; iName<nArg && azArg[iName][0]=='-'; iName++){
14219       const char *z = azArg[iName];
14220       if( optionMatch(z,"new") ){
14221         newFlag = 1;
14222 #ifdef SQLITE_HAVE_ZLIB
14223       }else if( optionMatch(z, "zip") ){
14224         p->openMode = SHELL_OPEN_ZIPFILE;
14225 #endif
14226       }else if( optionMatch(z, "append") ){
14227         p->openMode = SHELL_OPEN_APPENDVFS;
14228       }else if( optionMatch(z, "readonly") ){
14229         p->openMode = SHELL_OPEN_READONLY;
14230 #ifdef SQLITE_ENABLE_DESERIALIZE
14231       }else if( optionMatch(z, "deserialize") ){
14232         p->openMode = SHELL_OPEN_DESERIALIZE;
14233 #endif
14234       }else if( z[0]=='-' ){
14235         utf8_printf(stderr, "unknown option: %s\n", z);
14236         rc = 1;
14237         goto meta_command_exit;
14238       }
14239     }
14240     /* If a filename is specified, try to open it first */
14241     zNewFilename = nArg>iName ? sqlite3_mprintf("%s", azArg[iName]) : 0;
14242     if( zNewFilename ){
14243       if( newFlag ) shellDeleteFile(zNewFilename);
14244       p->zDbFilename = zNewFilename;
14245       open_db(p, OPEN_DB_KEEPALIVE);
14246       if( p->db==0 ){
14247         utf8_printf(stderr, "Error: cannot open '%s'\n", zNewFilename);
14248         sqlite3_free(zNewFilename);
14249       }else{
14250         p->zFreeOnClose = zNewFilename;
14251       }
14252     }
14253     if( p->db==0 ){
14254       /* As a fall-back open a TEMP database */
14255       p->zDbFilename = 0;
14256       open_db(p, 0);
14257     }
14258   }else
14259 
14260   if( (c=='o'
14261         && (strncmp(azArg[0], "output", n)==0||strncmp(azArg[0], "once", n)==0))
14262    || (c=='e' && n==5 && strcmp(azArg[0],"excel")==0)
14263   ){
14264     const char *zFile = nArg>=2 ? azArg[1] : "stdout";
14265     int bTxtMode = 0;
14266     if( azArg[0][0]=='e' ){
14267       /* Transform the ".excel" command into ".once -x" */
14268       nArg = 2;
14269       azArg[0] = "once";
14270       zFile = azArg[1] = "-x";
14271       n = 4;
14272     }
14273     if( nArg>2 ){
14274       utf8_printf(stderr, "Usage: .%s [-e|-x|FILE]\n", azArg[0]);
14275       rc = 1;
14276       goto meta_command_exit;
14277     }
14278     if( n>1 && strncmp(azArg[0], "once", n)==0 ){
14279       if( nArg<2 ){
14280         raw_printf(stderr, "Usage: .once (-e|-x|FILE)\n");
14281         rc = 1;
14282         goto meta_command_exit;
14283       }
14284       p->outCount = 2;
14285     }else{
14286       p->outCount = 0;
14287     }
14288     output_reset(p);
14289     if( zFile[0]=='-' && zFile[1]=='-' ) zFile++;
14290 #ifndef SQLITE_NOHAVE_SYSTEM
14291     if( strcmp(zFile, "-e")==0 || strcmp(zFile, "-x")==0 ){
14292       p->doXdgOpen = 1;
14293       outputModePush(p);
14294       if( zFile[1]=='x' ){
14295         newTempFile(p, "csv");
14296         p->mode = MODE_Csv;
14297         sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
14298         sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
14299       }else{
14300         newTempFile(p, "txt");
14301         bTxtMode = 1;
14302       }
14303       zFile = p->zTempFile;
14304     }
14305 #endif /* SQLITE_NOHAVE_SYSTEM */
14306     if( zFile[0]=='|' ){
14307 #ifdef SQLITE_OMIT_POPEN
14308       raw_printf(stderr, "Error: pipes are not supported in this OS\n");
14309       rc = 1;
14310       p->out = stdout;
14311 #else
14312       p->out = popen(zFile + 1, "w");
14313       if( p->out==0 ){
14314         utf8_printf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1);
14315         p->out = stdout;
14316         rc = 1;
14317       }else{
14318         sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
14319       }
14320 #endif
14321     }else{
14322       p->out = output_file_open(zFile, bTxtMode);
14323       if( p->out==0 ){
14324         if( strcmp(zFile,"off")!=0 ){
14325           utf8_printf(stderr,"Error: cannot write to \"%s\"\n", zFile);
14326         }
14327         p->out = stdout;
14328         rc = 1;
14329       } else {
14330         sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
14331       }
14332     }
14333   }else
14334 
14335   if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
14336     int i;
14337     for(i=1; i<nArg; i++){
14338       if( i>1 ) raw_printf(p->out, " ");
14339       utf8_printf(p->out, "%s", azArg[i]);
14340     }
14341     raw_printf(p->out, "\n");
14342   }else
14343 
14344   if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){
14345     if( nArg >= 2) {
14346       strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
14347     }
14348     if( nArg >= 3) {
14349       strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
14350     }
14351   }else
14352 
14353   if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){
14354     rc = 2;
14355   }else
14356 
14357   if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){
14358     FILE *alt;
14359     if( nArg!=2 ){
14360       raw_printf(stderr, "Usage: .read FILE\n");
14361       rc = 1;
14362       goto meta_command_exit;
14363     }
14364     alt = fopen(azArg[1], "rb");
14365     if( alt==0 ){
14366       utf8_printf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
14367       rc = 1;
14368     }else{
14369       rc = process_input(p, alt);
14370       fclose(alt);
14371     }
14372   }else
14373 
14374   if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){
14375     const char *zSrcFile;
14376     const char *zDb;
14377     sqlite3 *pSrc;
14378     sqlite3_backup *pBackup;
14379     int nTimeout = 0;
14380 
14381     if( nArg==2 ){
14382       zSrcFile = azArg[1];
14383       zDb = "main";
14384     }else if( nArg==3 ){
14385       zSrcFile = azArg[2];
14386       zDb = azArg[1];
14387     }else{
14388       raw_printf(stderr, "Usage: .restore ?DB? FILE\n");
14389       rc = 1;
14390       goto meta_command_exit;
14391     }
14392     rc = sqlite3_open(zSrcFile, &pSrc);
14393     if( rc!=SQLITE_OK ){
14394       utf8_printf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
14395       close_db(pSrc);
14396       return 1;
14397     }
14398     open_db(p, 0);
14399     pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
14400     if( pBackup==0 ){
14401       utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
14402       close_db(pSrc);
14403       return 1;
14404     }
14405     while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
14406           || rc==SQLITE_BUSY  ){
14407       if( rc==SQLITE_BUSY ){
14408         if( nTimeout++ >= 3 ) break;
14409         sqlite3_sleep(100);
14410       }
14411     }
14412     sqlite3_backup_finish(pBackup);
14413     if( rc==SQLITE_DONE ){
14414       rc = 0;
14415     }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
14416       raw_printf(stderr, "Error: source database is busy\n");
14417       rc = 1;
14418     }else{
14419       utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
14420       rc = 1;
14421     }
14422     close_db(pSrc);
14423   }else
14424 
14425   if( c=='s' && strncmp(azArg[0], "scanstats", n)==0 ){
14426     if( nArg==2 ){
14427       p->scanstatsOn = (u8)booleanValue(azArg[1]);
14428 #ifndef SQLITE_ENABLE_STMT_SCANSTATUS
14429       raw_printf(stderr, "Warning: .scanstats not available in this build.\n");
14430 #endif
14431     }else{
14432       raw_printf(stderr, "Usage: .scanstats on|off\n");
14433       rc = 1;
14434     }
14435   }else
14436 
14437   if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){
14438     ShellText sSelect;
14439     ShellState data;
14440     char *zErrMsg = 0;
14441     const char *zDiv = "(";
14442     const char *zName = 0;
14443     int iSchema = 0;
14444     int bDebug = 0;
14445     int ii;
14446 
14447     open_db(p, 0);
14448     memcpy(&data, p, sizeof(data));
14449     data.showHeader = 0;
14450     data.cMode = data.mode = MODE_Semi;
14451     initText(&sSelect);
14452     for(ii=1; ii<nArg; ii++){
14453       if( optionMatch(azArg[ii],"indent") ){
14454         data.cMode = data.mode = MODE_Pretty;
14455       }else if( optionMatch(azArg[ii],"debug") ){
14456         bDebug = 1;
14457       }else if( zName==0 ){
14458         zName = azArg[ii];
14459       }else{
14460         raw_printf(stderr, "Usage: .schema ?--indent? ?LIKE-PATTERN?\n");
14461         rc = 1;
14462         goto meta_command_exit;
14463       }
14464     }
14465     if( zName!=0 ){
14466       int isMaster = sqlite3_strlike(zName, "sqlite_master", '\\')==0;
14467       if( isMaster || sqlite3_strlike(zName,"sqlite_temp_master", '\\')==0 ){
14468         char *new_argv[2], *new_colv[2];
14469         new_argv[0] = sqlite3_mprintf(
14470                       "CREATE TABLE %s (\n"
14471                       "  type text,\n"
14472                       "  name text,\n"
14473                       "  tbl_name text,\n"
14474                       "  rootpage integer,\n"
14475                       "  sql text\n"
14476                       ")", isMaster ? "sqlite_master" : "sqlite_temp_master");
14477         new_argv[1] = 0;
14478         new_colv[0] = "sql";
14479         new_colv[1] = 0;
14480         callback(&data, 1, new_argv, new_colv);
14481         sqlite3_free(new_argv[0]);
14482       }
14483     }
14484     if( zDiv ){
14485       sqlite3_stmt *pStmt = 0;
14486       rc = sqlite3_prepare_v2(p->db, "SELECT name FROM pragma_database_list",
14487                               -1, &pStmt, 0);
14488       if( rc ){
14489         utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
14490         sqlite3_finalize(pStmt);
14491         rc = 1;
14492         goto meta_command_exit;
14493       }
14494       appendText(&sSelect, "SELECT sql FROM", 0);
14495       iSchema = 0;
14496       while( sqlite3_step(pStmt)==SQLITE_ROW ){
14497         const char *zDb = (const char*)sqlite3_column_text(pStmt, 0);
14498         char zScNum[30];
14499         sqlite3_snprintf(sizeof(zScNum), zScNum, "%d", ++iSchema);
14500         appendText(&sSelect, zDiv, 0);
14501         zDiv = " UNION ALL ";
14502         appendText(&sSelect, "SELECT shell_add_schema(sql,", 0);
14503         if( sqlite3_stricmp(zDb, "main")!=0 ){
14504           appendText(&sSelect, zDb, '"');
14505         }else{
14506           appendText(&sSelect, "NULL", 0);
14507         }
14508         appendText(&sSelect, ",name) AS sql, type, tbl_name, name, rowid,", 0);
14509         appendText(&sSelect, zScNum, 0);
14510         appendText(&sSelect, " AS snum, ", 0);
14511         appendText(&sSelect, zDb, '\'');
14512         appendText(&sSelect, " AS sname FROM ", 0);
14513         appendText(&sSelect, zDb, '"');
14514         appendText(&sSelect, ".sqlite_master", 0);
14515       }
14516       sqlite3_finalize(pStmt);
14517 #ifdef SQLITE_INTROSPECTION_PRAGMAS
14518       if( zName ){
14519         appendText(&sSelect,
14520            " UNION ALL SELECT shell_module_schema(name),"
14521            " 'table', name, name, name, 9e+99, 'main' FROM pragma_module_list", 0);
14522       }
14523 #endif
14524       appendText(&sSelect, ") WHERE ", 0);
14525       if( zName ){
14526         char *zQarg = sqlite3_mprintf("%Q", zName);
14527         int bGlob = strchr(zName, '*') != 0 || strchr(zName, '?') != 0 ||
14528                     strchr(zName, '[') != 0;
14529         if( strchr(zName, '.') ){
14530           appendText(&sSelect, "lower(printf('%s.%s',sname,tbl_name))", 0);
14531         }else{
14532           appendText(&sSelect, "lower(tbl_name)", 0);
14533         }
14534         appendText(&sSelect, bGlob ? " GLOB " : " LIKE ", 0);
14535         appendText(&sSelect, zQarg, 0);
14536         if( !bGlob ){
14537           appendText(&sSelect, " ESCAPE '\\' ", 0);
14538         }
14539         appendText(&sSelect, " AND ", 0);
14540         sqlite3_free(zQarg);
14541       }
14542       appendText(&sSelect, "type!='meta' AND sql IS NOT NULL"
14543                            " ORDER BY snum, rowid", 0);
14544       if( bDebug ){
14545         utf8_printf(p->out, "SQL: %s;\n", sSelect.z);
14546       }else{
14547         rc = sqlite3_exec(p->db, sSelect.z, callback, &data, &zErrMsg);
14548       }
14549       freeText(&sSelect);
14550     }
14551     if( zErrMsg ){
14552       utf8_printf(stderr,"Error: %s\n", zErrMsg);
14553       sqlite3_free(zErrMsg);
14554       rc = 1;
14555     }else if( rc != SQLITE_OK ){
14556       raw_printf(stderr,"Error: querying schema information\n");
14557       rc = 1;
14558     }else{
14559       rc = 0;
14560     }
14561   }else
14562 
14563 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
14564   if( c=='s' && n==11 && strncmp(azArg[0], "selecttrace", n)==0 ){
14565     sqlite3SelectTrace = (int)integerValue(azArg[1]);
14566   }else
14567 #endif
14568 
14569 #if defined(SQLITE_ENABLE_SESSION)
14570   if( c=='s' && strncmp(azArg[0],"session",n)==0 && n>=3 ){
14571     OpenSession *pSession = &p->aSession[0];
14572     char **azCmd = &azArg[1];
14573     int iSes = 0;
14574     int nCmd = nArg - 1;
14575     int i;
14576     if( nArg<=1 ) goto session_syntax_error;
14577     open_db(p, 0);
14578     if( nArg>=3 ){
14579       for(iSes=0; iSes<p->nSession; iSes++){
14580         if( strcmp(p->aSession[iSes].zName, azArg[1])==0 ) break;
14581       }
14582       if( iSes<p->nSession ){
14583         pSession = &p->aSession[iSes];
14584         azCmd++;
14585         nCmd--;
14586       }else{
14587         pSession = &p->aSession[0];
14588         iSes = 0;
14589       }
14590     }
14591 
14592     /* .session attach TABLE
14593     ** Invoke the sqlite3session_attach() interface to attach a particular
14594     ** table so that it is never filtered.
14595     */
14596     if( strcmp(azCmd[0],"attach")==0 ){
14597       if( nCmd!=2 ) goto session_syntax_error;
14598       if( pSession->p==0 ){
14599         session_not_open:
14600         raw_printf(stderr, "ERROR: No sessions are open\n");
14601       }else{
14602         rc = sqlite3session_attach(pSession->p, azCmd[1]);
14603         if( rc ){
14604           raw_printf(stderr, "ERROR: sqlite3session_attach() returns %d\n", rc);
14605           rc = 0;
14606         }
14607       }
14608     }else
14609 
14610     /* .session changeset FILE
14611     ** .session patchset FILE
14612     ** Write a changeset or patchset into a file.  The file is overwritten.
14613     */
14614     if( strcmp(azCmd[0],"changeset")==0 || strcmp(azCmd[0],"patchset")==0 ){
14615       FILE *out = 0;
14616       if( nCmd!=2 ) goto session_syntax_error;
14617       if( pSession->p==0 ) goto session_not_open;
14618       out = fopen(azCmd[1], "wb");
14619       if( out==0 ){
14620         utf8_printf(stderr, "ERROR: cannot open \"%s\" for writing\n", azCmd[1]);
14621       }else{
14622         int szChng;
14623         void *pChng;
14624         if( azCmd[0][0]=='c' ){
14625           rc = sqlite3session_changeset(pSession->p, &szChng, &pChng);
14626         }else{
14627           rc = sqlite3session_patchset(pSession->p, &szChng, &pChng);
14628         }
14629         if( rc ){
14630           printf("Error: error code %d\n", rc);
14631           rc = 0;
14632         }
14633         if( pChng
14634           && fwrite(pChng, szChng, 1, out)!=1 ){
14635           raw_printf(stderr, "ERROR: Failed to write entire %d-byte output\n",
14636                   szChng);
14637         }
14638         sqlite3_free(pChng);
14639         fclose(out);
14640       }
14641     }else
14642 
14643     /* .session close
14644     ** Close the identified session
14645     */
14646     if( strcmp(azCmd[0], "close")==0 ){
14647       if( nCmd!=1 ) goto session_syntax_error;
14648       if( p->nSession ){
14649         session_close(pSession);
14650         p->aSession[iSes] = p->aSession[--p->nSession];
14651       }
14652     }else
14653 
14654     /* .session enable ?BOOLEAN?
14655     ** Query or set the enable flag
14656     */
14657     if( strcmp(azCmd[0], "enable")==0 ){
14658       int ii;
14659       if( nCmd>2 ) goto session_syntax_error;
14660       ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
14661       if( p->nSession ){
14662         ii = sqlite3session_enable(pSession->p, ii);
14663         utf8_printf(p->out, "session %s enable flag = %d\n",
14664                     pSession->zName, ii);
14665       }
14666     }else
14667 
14668     /* .session filter GLOB ....
14669     ** Set a list of GLOB patterns of table names to be excluded.
14670     */
14671     if( strcmp(azCmd[0], "filter")==0 ){
14672       int ii, nByte;
14673       if( nCmd<2 ) goto session_syntax_error;
14674       if( p->nSession ){
14675         for(ii=0; ii<pSession->nFilter; ii++){
14676           sqlite3_free(pSession->azFilter[ii]);
14677         }
14678         sqlite3_free(pSession->azFilter);
14679         nByte = sizeof(pSession->azFilter[0])*(nCmd-1);
14680         pSession->azFilter = sqlite3_malloc( nByte );
14681         if( pSession->azFilter==0 ){
14682           raw_printf(stderr, "Error: out or memory\n");
14683           exit(1);
14684         }
14685         for(ii=1; ii<nCmd; ii++){
14686           pSession->azFilter[ii-1] = sqlite3_mprintf("%s", azCmd[ii]);
14687         }
14688         pSession->nFilter = ii-1;
14689       }
14690     }else
14691 
14692     /* .session indirect ?BOOLEAN?
14693     ** Query or set the indirect flag
14694     */
14695     if( strcmp(azCmd[0], "indirect")==0 ){
14696       int ii;
14697       if( nCmd>2 ) goto session_syntax_error;
14698       ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
14699       if( p->nSession ){
14700         ii = sqlite3session_indirect(pSession->p, ii);
14701         utf8_printf(p->out, "session %s indirect flag = %d\n",
14702                     pSession->zName, ii);
14703       }
14704     }else
14705 
14706     /* .session isempty
14707     ** Determine if the session is empty
14708     */
14709     if( strcmp(azCmd[0], "isempty")==0 ){
14710       int ii;
14711       if( nCmd!=1 ) goto session_syntax_error;
14712       if( p->nSession ){
14713         ii = sqlite3session_isempty(pSession->p);
14714         utf8_printf(p->out, "session %s isempty flag = %d\n",
14715                     pSession->zName, ii);
14716       }
14717     }else
14718 
14719     /* .session list
14720     ** List all currently open sessions
14721     */
14722     if( strcmp(azCmd[0],"list")==0 ){
14723       for(i=0; i<p->nSession; i++){
14724         utf8_printf(p->out, "%d %s\n", i, p->aSession[i].zName);
14725       }
14726     }else
14727 
14728     /* .session open DB NAME
14729     ** Open a new session called NAME on the attached database DB.
14730     ** DB is normally "main".
14731     */
14732     if( strcmp(azCmd[0],"open")==0 ){
14733       char *zName;
14734       if( nCmd!=3 ) goto session_syntax_error;
14735       zName = azCmd[2];
14736       if( zName[0]==0 ) goto session_syntax_error;
14737       for(i=0; i<p->nSession; i++){
14738         if( strcmp(p->aSession[i].zName,zName)==0 ){
14739           utf8_printf(stderr, "Session \"%s\" already exists\n", zName);
14740           goto meta_command_exit;
14741         }
14742       }
14743       if( p->nSession>=ArraySize(p->aSession) ){
14744         raw_printf(stderr, "Maximum of %d sessions\n", ArraySize(p->aSession));
14745         goto meta_command_exit;
14746       }
14747       pSession = &p->aSession[p->nSession];
14748       rc = sqlite3session_create(p->db, azCmd[1], &pSession->p);
14749       if( rc ){
14750         raw_printf(stderr, "Cannot open session: error code=%d\n", rc);
14751         rc = 0;
14752         goto meta_command_exit;
14753       }
14754       pSession->nFilter = 0;
14755       sqlite3session_table_filter(pSession->p, session_filter, pSession);
14756       p->nSession++;
14757       pSession->zName = sqlite3_mprintf("%s", zName);
14758     }else
14759     /* If no command name matches, show a syntax error */
14760     session_syntax_error:
14761     showHelp(p->out, "session");
14762   }else
14763 #endif
14764 
14765 #ifdef SQLITE_DEBUG
14766   /* Undocumented commands for internal testing.  Subject to change
14767   ** without notice. */
14768   if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
14769     if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
14770       int i, v;
14771       for(i=1; i<nArg; i++){
14772         v = booleanValue(azArg[i]);
14773         utf8_printf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
14774       }
14775     }
14776     if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
14777       int i; sqlite3_int64 v;
14778       for(i=1; i<nArg; i++){
14779         char zBuf[200];
14780         v = integerValue(azArg[i]);
14781         sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v);
14782         utf8_printf(p->out, "%s", zBuf);
14783       }
14784     }
14785   }else
14786 #endif
14787 
14788   if( c=='s' && n>=4 && strncmp(azArg[0],"selftest",n)==0 ){
14789     int bIsInit = 0;         /* True to initialize the SELFTEST table */
14790     int bVerbose = 0;        /* Verbose output */
14791     int bSelftestExists;     /* True if SELFTEST already exists */
14792     int i, k;                /* Loop counters */
14793     int nTest = 0;           /* Number of tests runs */
14794     int nErr = 0;            /* Number of errors seen */
14795     ShellText str;           /* Answer for a query */
14796     sqlite3_stmt *pStmt = 0; /* Query against the SELFTEST table */
14797 
14798     open_db(p,0);
14799     for(i=1; i<nArg; i++){
14800       const char *z = azArg[i];
14801       if( z[0]=='-' && z[1]=='-' ) z++;
14802       if( strcmp(z,"-init")==0 ){
14803         bIsInit = 1;
14804       }else
14805       if( strcmp(z,"-v")==0 ){
14806         bVerbose++;
14807       }else
14808       {
14809         utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n",
14810                     azArg[i], azArg[0]);
14811         raw_printf(stderr, "Should be one of: --init -v\n");
14812         rc = 1;
14813         goto meta_command_exit;
14814       }
14815     }
14816     if( sqlite3_table_column_metadata(p->db,"main","selftest",0,0,0,0,0,0)
14817            != SQLITE_OK ){
14818       bSelftestExists = 0;
14819     }else{
14820       bSelftestExists = 1;
14821     }
14822     if( bIsInit ){
14823       createSelftestTable(p);
14824       bSelftestExists = 1;
14825     }
14826     initText(&str);
14827     appendText(&str, "x", 0);
14828     for(k=bSelftestExists; k>=0; k--){
14829       if( k==1 ){
14830         rc = sqlite3_prepare_v2(p->db,
14831             "SELECT tno,op,cmd,ans FROM selftest ORDER BY tno",
14832             -1, &pStmt, 0);
14833       }else{
14834         rc = sqlite3_prepare_v2(p->db,
14835           "VALUES(0,'memo','Missing SELFTEST table - default checks only',''),"
14836           "      (1,'run','PRAGMA integrity_check','ok')",
14837           -1, &pStmt, 0);
14838       }
14839       if( rc ){
14840         raw_printf(stderr, "Error querying the selftest table\n");
14841         rc = 1;
14842         sqlite3_finalize(pStmt);
14843         goto meta_command_exit;
14844       }
14845       for(i=1; sqlite3_step(pStmt)==SQLITE_ROW; i++){
14846         int tno = sqlite3_column_int(pStmt, 0);
14847         const char *zOp = (const char*)sqlite3_column_text(pStmt, 1);
14848         const char *zSql = (const char*)sqlite3_column_text(pStmt, 2);
14849         const char *zAns = (const char*)sqlite3_column_text(pStmt, 3);
14850 
14851         k = 0;
14852         if( bVerbose>0 ){
14853           char *zQuote = sqlite3_mprintf("%q", zSql);
14854           printf("%d: %s %s\n", tno, zOp, zSql);
14855           sqlite3_free(zQuote);
14856         }
14857         if( strcmp(zOp,"memo")==0 ){
14858           utf8_printf(p->out, "%s\n", zSql);
14859         }else
14860         if( strcmp(zOp,"run")==0 ){
14861           char *zErrMsg = 0;
14862           str.n = 0;
14863           str.z[0] = 0;
14864           rc = sqlite3_exec(p->db, zSql, captureOutputCallback, &str, &zErrMsg);
14865           nTest++;
14866           if( bVerbose ){
14867             utf8_printf(p->out, "Result: %s\n", str.z);
14868           }
14869           if( rc || zErrMsg ){
14870             nErr++;
14871             rc = 1;
14872             utf8_printf(p->out, "%d: error-code-%d: %s\n", tno, rc, zErrMsg);
14873             sqlite3_free(zErrMsg);
14874           }else if( strcmp(zAns,str.z)!=0 ){
14875             nErr++;
14876             rc = 1;
14877             utf8_printf(p->out, "%d: Expected: [%s]\n", tno, zAns);
14878             utf8_printf(p->out, "%d:      Got: [%s]\n", tno, str.z);
14879           }
14880         }else
14881         {
14882           utf8_printf(stderr,
14883             "Unknown operation \"%s\" on selftest line %d\n", zOp, tno);
14884           rc = 1;
14885           break;
14886         }
14887       } /* End loop over rows of content from SELFTEST */
14888       sqlite3_finalize(pStmt);
14889     } /* End loop over k */
14890     freeText(&str);
14891     utf8_printf(p->out, "%d errors out of %d tests\n", nErr, nTest);
14892   }else
14893 
14894   if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){
14895     if( nArg<2 || nArg>3 ){
14896       raw_printf(stderr, "Usage: .separator COL ?ROW?\n");
14897       rc = 1;
14898     }
14899     if( nArg>=2 ){
14900       sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator,
14901                        "%.*s", (int)ArraySize(p->colSeparator)-1, azArg[1]);
14902     }
14903     if( nArg>=3 ){
14904       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator,
14905                        "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]);
14906     }
14907   }else
14908 
14909   if( c=='s' && n>=4 && strncmp(azArg[0],"sha3sum",n)==0 ){
14910     const char *zLike = 0;   /* Which table to checksum. 0 means everything */
14911     int i;                   /* Loop counter */
14912     int bSchema = 0;         /* Also hash the schema */
14913     int bSeparate = 0;       /* Hash each table separately */
14914     int iSize = 224;         /* Hash algorithm to use */
14915     int bDebug = 0;          /* Only show the query that would have run */
14916     sqlite3_stmt *pStmt;     /* For querying tables names */
14917     char *zSql;              /* SQL to be run */
14918     char *zSep;              /* Separator */
14919     ShellText sSql;          /* Complete SQL for the query to run the hash */
14920     ShellText sQuery;        /* Set of queries used to read all content */
14921     open_db(p, 0);
14922     for(i=1; i<nArg; i++){
14923       const char *z = azArg[i];
14924       if( z[0]=='-' ){
14925         z++;
14926         if( z[0]=='-' ) z++;
14927         if( strcmp(z,"schema")==0 ){
14928           bSchema = 1;
14929         }else
14930         if( strcmp(z,"sha3-224")==0 || strcmp(z,"sha3-256")==0
14931          || strcmp(z,"sha3-384")==0 || strcmp(z,"sha3-512")==0
14932         ){
14933           iSize = atoi(&z[5]);
14934         }else
14935         if( strcmp(z,"debug")==0 ){
14936           bDebug = 1;
14937         }else
14938         {
14939           utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n",
14940                       azArg[i], azArg[0]);
14941           raw_printf(stderr, "Should be one of: --schema"
14942                              " --sha3-224 --sha3-256 --sha3-384 --sha3-512\n");
14943           rc = 1;
14944           goto meta_command_exit;
14945         }
14946       }else if( zLike ){
14947         raw_printf(stderr, "Usage: .sha3sum ?OPTIONS? ?LIKE-PATTERN?\n");
14948         rc = 1;
14949         goto meta_command_exit;
14950       }else{
14951         zLike = z;
14952         bSeparate = 1;
14953         if( sqlite3_strlike("sqlite\\_%", zLike, '\\')==0 ) bSchema = 1;
14954       }
14955     }
14956     if( bSchema ){
14957       zSql = "SELECT lower(name) FROM sqlite_master"
14958              " WHERE type='table' AND coalesce(rootpage,0)>1"
14959              " UNION ALL SELECT 'sqlite_master'"
14960              " ORDER BY 1 collate nocase";
14961     }else{
14962       zSql = "SELECT lower(name) FROM sqlite_master"
14963              " WHERE type='table' AND coalesce(rootpage,0)>1"
14964              " AND name NOT LIKE 'sqlite_%'"
14965              " ORDER BY 1 collate nocase";
14966     }
14967     sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
14968     initText(&sQuery);
14969     initText(&sSql);
14970     appendText(&sSql, "WITH [sha3sum$query](a,b) AS(",0);
14971     zSep = "VALUES(";
14972     while( SQLITE_ROW==sqlite3_step(pStmt) ){
14973       const char *zTab = (const char*)sqlite3_column_text(pStmt,0);
14974       if( zLike && sqlite3_strlike(zLike, zTab, 0)!=0 ) continue;
14975       if( strncmp(zTab, "sqlite_",7)!=0 ){
14976         appendText(&sQuery,"SELECT * FROM ", 0);
14977         appendText(&sQuery,zTab,'"');
14978         appendText(&sQuery," NOT INDEXED;", 0);
14979       }else if( strcmp(zTab, "sqlite_master")==0 ){
14980         appendText(&sQuery,"SELECT type,name,tbl_name,sql FROM sqlite_master"
14981                            " ORDER BY name;", 0);
14982       }else if( strcmp(zTab, "sqlite_sequence")==0 ){
14983         appendText(&sQuery,"SELECT name,seq FROM sqlite_sequence"
14984                            " ORDER BY name;", 0);
14985       }else if( strcmp(zTab, "sqlite_stat1")==0 ){
14986         appendText(&sQuery,"SELECT tbl,idx,stat FROM sqlite_stat1"
14987                            " ORDER BY tbl,idx;", 0);
14988       }else if( strcmp(zTab, "sqlite_stat3")==0
14989              || strcmp(zTab, "sqlite_stat4")==0 ){
14990         appendText(&sQuery, "SELECT * FROM ", 0);
14991         appendText(&sQuery, zTab, 0);
14992         appendText(&sQuery, " ORDER BY tbl, idx, rowid;\n", 0);
14993       }
14994       appendText(&sSql, zSep, 0);
14995       appendText(&sSql, sQuery.z, '\'');
14996       sQuery.n = 0;
14997       appendText(&sSql, ",", 0);
14998       appendText(&sSql, zTab, '\'');
14999       zSep = "),(";
15000     }
15001     sqlite3_finalize(pStmt);
15002     if( bSeparate ){
15003       zSql = sqlite3_mprintf(
15004           "%s))"
15005           " SELECT lower(hex(sha3_query(a,%d))) AS hash, b AS label"
15006           "   FROM [sha3sum$query]",
15007           sSql.z, iSize);
15008     }else{
15009       zSql = sqlite3_mprintf(
15010           "%s))"
15011           " SELECT lower(hex(sha3_query(group_concat(a,''),%d))) AS hash"
15012           "   FROM [sha3sum$query]",
15013           sSql.z, iSize);
15014     }
15015     freeText(&sQuery);
15016     freeText(&sSql);
15017     if( bDebug ){
15018       utf8_printf(p->out, "%s\n", zSql);
15019     }else{
15020       shell_exec(p, zSql, 0);
15021     }
15022     sqlite3_free(zSql);
15023   }else
15024 
15025 #ifndef SQLITE_NOHAVE_SYSTEM
15026   if( c=='s'
15027    && (strncmp(azArg[0], "shell", n)==0 || strncmp(azArg[0],"system",n)==0)
15028   ){
15029     char *zCmd;
15030     int i, x;
15031     if( nArg<2 ){
15032       raw_printf(stderr, "Usage: .system COMMAND\n");
15033       rc = 1;
15034       goto meta_command_exit;
15035     }
15036     zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]);
15037     for(i=2; i<nArg; i++){
15038       zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"",
15039                              zCmd, azArg[i]);
15040     }
15041     x = system(zCmd);
15042     sqlite3_free(zCmd);
15043     if( x ) raw_printf(stderr, "System command returns %d\n", x);
15044   }else
15045 #endif /* !defined(SQLITE_NOHAVE_SYSTEM) */
15046 
15047   if( c=='s' && strncmp(azArg[0], "show", n)==0 ){
15048     static const char *azBool[] = { "off", "on", "trigger", "full"};
15049     int i;
15050     if( nArg!=1 ){
15051       raw_printf(stderr, "Usage: .show\n");
15052       rc = 1;
15053       goto meta_command_exit;
15054     }
15055     utf8_printf(p->out, "%12.12s: %s\n","echo",
15056                                   azBool[ShellHasFlag(p, SHFLG_Echo)]);
15057     utf8_printf(p->out, "%12.12s: %s\n","eqp", azBool[p->autoEQP&3]);
15058     utf8_printf(p->out, "%12.12s: %s\n","explain",
15059          p->mode==MODE_Explain ? "on" : p->autoExplain ? "auto" : "off");
15060     utf8_printf(p->out,"%12.12s: %s\n","headers", azBool[p->showHeader!=0]);
15061     utf8_printf(p->out, "%12.12s: %s\n","mode", modeDescr[p->mode]);
15062     utf8_printf(p->out, "%12.12s: ", "nullvalue");
15063       output_c_string(p->out, p->nullValue);
15064       raw_printf(p->out, "\n");
15065     utf8_printf(p->out,"%12.12s: %s\n","output",
15066             strlen30(p->outfile) ? p->outfile : "stdout");
15067     utf8_printf(p->out,"%12.12s: ", "colseparator");
15068       output_c_string(p->out, p->colSeparator);
15069       raw_printf(p->out, "\n");
15070     utf8_printf(p->out,"%12.12s: ", "rowseparator");
15071       output_c_string(p->out, p->rowSeparator);
15072       raw_printf(p->out, "\n");
15073     utf8_printf(p->out, "%12.12s: %s\n","stats", azBool[p->statsOn!=0]);
15074     utf8_printf(p->out, "%12.12s: ", "width");
15075     for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
15076       raw_printf(p->out, "%d ", p->colWidth[i]);
15077     }
15078     raw_printf(p->out, "\n");
15079     utf8_printf(p->out, "%12.12s: %s\n", "filename",
15080                 p->zDbFilename ? p->zDbFilename : "");
15081   }else
15082 
15083   if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){
15084     if( nArg==2 ){
15085       p->statsOn = (u8)booleanValue(azArg[1]);
15086     }else if( nArg==1 ){
15087       display_stats(p->db, p, 0);
15088     }else{
15089       raw_printf(stderr, "Usage: .stats ?on|off?\n");
15090       rc = 1;
15091     }
15092   }else
15093 
15094   if( (c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0)
15095    || (c=='i' && (strncmp(azArg[0], "indices", n)==0
15096                  || strncmp(azArg[0], "indexes", n)==0) )
15097   ){
15098     sqlite3_stmt *pStmt;
15099     char **azResult;
15100     int nRow, nAlloc;
15101     int ii;
15102     ShellText s;
15103     initText(&s);
15104     open_db(p, 0);
15105     rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
15106     if( rc ){
15107       sqlite3_finalize(pStmt);
15108       return shellDatabaseError(p->db);
15109     }
15110 
15111     if( nArg>2 && c=='i' ){
15112       /* It is an historical accident that the .indexes command shows an error
15113       ** when called with the wrong number of arguments whereas the .tables
15114       ** command does not. */
15115       raw_printf(stderr, "Usage: .indexes ?LIKE-PATTERN?\n");
15116       rc = 1;
15117       sqlite3_finalize(pStmt);
15118       goto meta_command_exit;
15119     }
15120     for(ii=0; sqlite3_step(pStmt)==SQLITE_ROW; ii++){
15121       const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
15122       if( zDbName==0 ) continue;
15123       if( s.z && s.z[0] ) appendText(&s, " UNION ALL ", 0);
15124       if( sqlite3_stricmp(zDbName, "main")==0 ){
15125         appendText(&s, "SELECT name FROM ", 0);
15126       }else{
15127         appendText(&s, "SELECT ", 0);
15128         appendText(&s, zDbName, '\'');
15129         appendText(&s, "||'.'||name FROM ", 0);
15130       }
15131       appendText(&s, zDbName, '"');
15132       appendText(&s, ".sqlite_master ", 0);
15133       if( c=='t' ){
15134         appendText(&s," WHERE type IN ('table','view')"
15135                       "   AND name NOT LIKE 'sqlite_%'"
15136                       "   AND name LIKE ?1", 0);
15137       }else{
15138         appendText(&s," WHERE type='index'"
15139                       "   AND tbl_name LIKE ?1", 0);
15140       }
15141     }
15142     rc = sqlite3_finalize(pStmt);
15143     appendText(&s, " ORDER BY 1", 0);
15144     rc = sqlite3_prepare_v2(p->db, s.z, -1, &pStmt, 0);
15145     freeText(&s);
15146     if( rc ) return shellDatabaseError(p->db);
15147 
15148     /* Run the SQL statement prepared by the above block. Store the results
15149     ** as an array of nul-terminated strings in azResult[].  */
15150     nRow = nAlloc = 0;
15151     azResult = 0;
15152     if( nArg>1 ){
15153       sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
15154     }else{
15155       sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
15156     }
15157     while( sqlite3_step(pStmt)==SQLITE_ROW ){
15158       if( nRow>=nAlloc ){
15159         char **azNew;
15160         int n2 = nAlloc*2 + 10;
15161         azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2);
15162         if( azNew==0 ) shell_out_of_memory();
15163         nAlloc = n2;
15164         azResult = azNew;
15165       }
15166       azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
15167       if( 0==azResult[nRow] ) shell_out_of_memory();
15168       nRow++;
15169     }
15170     if( sqlite3_finalize(pStmt)!=SQLITE_OK ){
15171       rc = shellDatabaseError(p->db);
15172     }
15173 
15174     /* Pretty-print the contents of array azResult[] to the output */
15175     if( rc==0 && nRow>0 ){
15176       int len, maxlen = 0;
15177       int i, j;
15178       int nPrintCol, nPrintRow;
15179       for(i=0; i<nRow; i++){
15180         len = strlen30(azResult[i]);
15181         if( len>maxlen ) maxlen = len;
15182       }
15183       nPrintCol = 80/(maxlen+2);
15184       if( nPrintCol<1 ) nPrintCol = 1;
15185       nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
15186       for(i=0; i<nPrintRow; i++){
15187         for(j=i; j<nRow; j+=nPrintRow){
15188           char *zSp = j<nPrintRow ? "" : "  ";
15189           utf8_printf(p->out, "%s%-*s", zSp, maxlen,
15190                       azResult[j] ? azResult[j]:"");
15191         }
15192         raw_printf(p->out, "\n");
15193       }
15194     }
15195 
15196     for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
15197     sqlite3_free(azResult);
15198   }else
15199 
15200   /* Begin redirecting output to the file "testcase-out.txt" */
15201   if( c=='t' && strcmp(azArg[0],"testcase")==0 ){
15202     output_reset(p);
15203     p->out = output_file_open("testcase-out.txt", 0);
15204     if( p->out==0 ){
15205       raw_printf(stderr, "Error: cannot open 'testcase-out.txt'\n");
15206     }
15207     if( nArg>=2 ){
15208       sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "%s", azArg[1]);
15209     }else{
15210       sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "?");
15211     }
15212   }else
15213 
15214 #ifndef SQLITE_UNTESTABLE
15215   if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 ){
15216     static const struct {
15217        const char *zCtrlName;   /* Name of a test-control option */
15218        int ctrlCode;            /* Integer code for that option */
15219        const char *zUsage;      /* Usage notes */
15220     } aCtrl[] = {
15221       { "always",             SQLITE_TESTCTRL_ALWAYS,        "BOOLEAN"            },
15222       { "assert",             SQLITE_TESTCTRL_ASSERT,        "BOOLEAN"            },
15223     /*{ "benign_malloc_hooks",SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS, ""          },*/
15224     /*{ "bitvec_test",        SQLITE_TESTCTRL_BITVEC_TEST,   ""                },*/
15225       { "byteorder",          SQLITE_TESTCTRL_BYTEORDER,     ""                   },
15226     /*{ "fault_install",      SQLITE_TESTCTRL_FAULT_INSTALL, ""                }, */
15227       { "imposter",           SQLITE_TESTCTRL_IMPOSTER,   "SCHEMA ON/OFF ROOTPAGE"},
15228       { "internal_functions", SQLITE_TESTCTRL_INTERNAL_FUNCTIONS, "BOOLEAN"       },
15229       { "localtime_fault",    SQLITE_TESTCTRL_LOCALTIME_FAULT,"BOOLEAN"           },
15230       { "never_corrupt",      SQLITE_TESTCTRL_NEVER_CORRUPT, "BOOLEAN"            },
15231       { "optimizations",      SQLITE_TESTCTRL_OPTIMIZATIONS, "DISABLE-MASK"       },
15232 #ifdef YYCOVERAGE
15233       { "parser_coverage",    SQLITE_TESTCTRL_PARSER_COVERAGE, ""                 },
15234 #endif
15235       { "pending_byte",       SQLITE_TESTCTRL_PENDING_BYTE,  "OFFSET  "           },
15236       { "prng_reset",         SQLITE_TESTCTRL_PRNG_RESET,    ""                   },
15237       { "prng_restore",       SQLITE_TESTCTRL_PRNG_RESTORE,  ""                   },
15238       { "prng_save",          SQLITE_TESTCTRL_PRNG_SAVE,     ""                   },
15239       { "reserve",            SQLITE_TESTCTRL_RESERVE,       "BYTES-OF-RESERVE"   },
15240     };
15241     int testctrl = -1;
15242     int iCtrl = -1;
15243     int rc2 = 0;    /* 0: usage.  1: %d  2: %x  3: no-output */
15244     int isOk = 0;
15245     int i, n2;
15246     const char *zCmd = 0;
15247 
15248     open_db(p, 0);
15249     zCmd = nArg>=2 ? azArg[1] : "help";
15250 
15251     /* The argument can optionally begin with "-" or "--" */
15252     if( zCmd[0]=='-' && zCmd[1] ){
15253       zCmd++;
15254       if( zCmd[0]=='-' && zCmd[1] ) zCmd++;
15255     }
15256 
15257     /* --help lists all test-controls */
15258     if( strcmp(zCmd,"help")==0 ){
15259       utf8_printf(p->out, "Available test-controls:\n");
15260       for(i=0; i<ArraySize(aCtrl); i++){
15261         utf8_printf(p->out, "  .testctrl %s %s\n",
15262                     aCtrl[i].zCtrlName, aCtrl[i].zUsage);
15263       }
15264       rc = 1;
15265       goto meta_command_exit;
15266     }
15267 
15268     /* convert testctrl text option to value. allow any unique prefix
15269     ** of the option name, or a numerical value. */
15270     n2 = strlen30(zCmd);
15271     for(i=0; i<ArraySize(aCtrl); i++){
15272       if( strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){
15273         if( testctrl<0 ){
15274           testctrl = aCtrl[i].ctrlCode;
15275           iCtrl = i;
15276         }else{
15277           utf8_printf(stderr, "Error: ambiguous test-control: \"%s\"\n"
15278                               "Use \".testctrl --help\" for help\n", zCmd);
15279           rc = 1;
15280           goto meta_command_exit;
15281         }
15282       }
15283     }
15284     if( testctrl<0 ){
15285       utf8_printf(stderr,"Error: unknown test-control: %s\n"
15286                          "Use \".testctrl --help\" for help\n", zCmd);
15287     }else{
15288       switch(testctrl){
15289 
15290         /* sqlite3_test_control(int, db, int) */
15291         case SQLITE_TESTCTRL_OPTIMIZATIONS:
15292         case SQLITE_TESTCTRL_RESERVE:
15293           if( nArg==3 ){
15294             int opt = (int)strtol(azArg[2], 0, 0);
15295             rc2 = sqlite3_test_control(testctrl, p->db, opt);
15296             isOk = 3;
15297           }
15298           break;
15299 
15300         /* sqlite3_test_control(int) */
15301         case SQLITE_TESTCTRL_PRNG_SAVE:
15302         case SQLITE_TESTCTRL_PRNG_RESTORE:
15303         case SQLITE_TESTCTRL_PRNG_RESET:
15304         case SQLITE_TESTCTRL_BYTEORDER:
15305           if( nArg==2 ){
15306             rc2 = sqlite3_test_control(testctrl);
15307             isOk = testctrl==SQLITE_TESTCTRL_BYTEORDER ? 1 : 3;
15308           }
15309           break;
15310 
15311         /* sqlite3_test_control(int, uint) */
15312         case SQLITE_TESTCTRL_PENDING_BYTE:
15313           if( nArg==3 ){
15314             unsigned int opt = (unsigned int)integerValue(azArg[2]);
15315             rc2 = sqlite3_test_control(testctrl, opt);
15316             isOk = 3;
15317           }
15318           break;
15319 
15320         /* sqlite3_test_control(int, int) */
15321         case SQLITE_TESTCTRL_ASSERT:
15322         case SQLITE_TESTCTRL_ALWAYS:
15323         case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS:
15324           if( nArg==3 ){
15325             int opt = booleanValue(azArg[2]);
15326             rc2 = sqlite3_test_control(testctrl, opt);
15327             isOk = 1;
15328           }
15329           break;
15330 
15331         /* sqlite3_test_control(int, int) */
15332         case SQLITE_TESTCTRL_LOCALTIME_FAULT:
15333         case SQLITE_TESTCTRL_NEVER_CORRUPT:
15334           if( nArg==3 ){
15335             int opt = booleanValue(azArg[2]);
15336             rc2 = sqlite3_test_control(testctrl, opt);
15337             isOk = 3;
15338           }
15339           break;
15340 
15341         case SQLITE_TESTCTRL_IMPOSTER:
15342           if( nArg==5 ){
15343             rc2 = sqlite3_test_control(testctrl, p->db,
15344                           azArg[2],
15345                           integerValue(azArg[3]),
15346                           integerValue(azArg[4]));
15347             isOk = 3;
15348           }
15349           break;
15350 
15351 #ifdef YYCOVERAGE
15352         case SQLITE_TESTCTRL_PARSER_COVERAGE:
15353           if( nArg==2 ){
15354             sqlite3_test_control(testctrl, p->out);
15355             isOk = 3;
15356           }
15357 #endif
15358       }
15359     }
15360     if( isOk==0 && iCtrl>=0 ){
15361       utf8_printf(p->out, "Usage: .testctrl %s %s\n", zCmd, aCtrl[iCtrl].zUsage);
15362       rc = 1;
15363     }else if( isOk==1 ){
15364       raw_printf(p->out, "%d\n", rc2);
15365     }else if( isOk==2 ){
15366       raw_printf(p->out, "0x%08x\n", rc2);
15367     }
15368   }else
15369 #endif /* !defined(SQLITE_UNTESTABLE) */
15370 
15371   if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 ){
15372     open_db(p, 0);
15373     sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0);
15374   }else
15375 
15376   if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 ){
15377     if( nArg==2 ){
15378       enableTimer = booleanValue(azArg[1]);
15379       if( enableTimer && !HAS_TIMER ){
15380         raw_printf(stderr, "Error: timer not available on this system.\n");
15381         enableTimer = 0;
15382       }
15383     }else{
15384       raw_printf(stderr, "Usage: .timer on|off\n");
15385       rc = 1;
15386     }
15387   }else
15388 
15389   if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){
15390     open_db(p, 0);
15391     if( nArg!=2 ){
15392       raw_printf(stderr, "Usage: .trace FILE|off\n");
15393       rc = 1;
15394       goto meta_command_exit;
15395     }
15396     output_file_close(p->traceOut);
15397     p->traceOut = output_file_open(azArg[1], 0);
15398 #if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
15399     if( p->traceOut==0 ){
15400       sqlite3_trace_v2(p->db, 0, 0, 0);
15401     }else{
15402       sqlite3_trace_v2(p->db, SQLITE_TRACE_STMT, sql_trace_callback,p->traceOut);
15403     }
15404 #endif
15405   }else
15406 
15407 #if SQLITE_USER_AUTHENTICATION
15408   if( c=='u' && strncmp(azArg[0], "user", n)==0 ){
15409     if( nArg<2 ){
15410       raw_printf(stderr, "Usage: .user SUBCOMMAND ...\n");
15411       rc = 1;
15412       goto meta_command_exit;
15413     }
15414     open_db(p, 0);
15415     if( strcmp(azArg[1],"login")==0 ){
15416       if( nArg!=4 ){
15417         raw_printf(stderr, "Usage: .user login USER PASSWORD\n");
15418         rc = 1;
15419         goto meta_command_exit;
15420       }
15421       rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3], strlen30(azArg[3]));
15422       if( rc ){
15423         utf8_printf(stderr, "Authentication failed for user %s\n", azArg[2]);
15424         rc = 1;
15425       }
15426     }else if( strcmp(azArg[1],"add")==0 ){
15427       if( nArg!=5 ){
15428         raw_printf(stderr, "Usage: .user add USER PASSWORD ISADMIN\n");
15429         rc = 1;
15430         goto meta_command_exit;
15431       }
15432       rc = sqlite3_user_add(p->db, azArg[2], azArg[3], strlen30(azArg[3]),
15433                             booleanValue(azArg[4]));
15434       if( rc ){
15435         raw_printf(stderr, "User-Add failed: %d\n", rc);
15436         rc = 1;
15437       }
15438     }else if( strcmp(azArg[1],"edit")==0 ){
15439       if( nArg!=5 ){
15440         raw_printf(stderr, "Usage: .user edit USER PASSWORD ISADMIN\n");
15441         rc = 1;
15442         goto meta_command_exit;
15443       }
15444       rc = sqlite3_user_change(p->db, azArg[2], azArg[3], strlen30(azArg[3]),
15445                               booleanValue(azArg[4]));
15446       if( rc ){
15447         raw_printf(stderr, "User-Edit failed: %d\n", rc);
15448         rc = 1;
15449       }
15450     }else if( strcmp(azArg[1],"delete")==0 ){
15451       if( nArg!=3 ){
15452         raw_printf(stderr, "Usage: .user delete USER\n");
15453         rc = 1;
15454         goto meta_command_exit;
15455       }
15456       rc = sqlite3_user_delete(p->db, azArg[2]);
15457       if( rc ){
15458         raw_printf(stderr, "User-Delete failed: %d\n", rc);
15459         rc = 1;
15460       }
15461     }else{
15462       raw_printf(stderr, "Usage: .user login|add|edit|delete ...\n");
15463       rc = 1;
15464       goto meta_command_exit;
15465     }
15466   }else
15467 #endif /* SQLITE_USER_AUTHENTICATION */
15468 
15469   if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
15470     utf8_printf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
15471         sqlite3_libversion(), sqlite3_sourceid());
15472 #if SQLITE_HAVE_ZLIB
15473     utf8_printf(p->out, "zlib version %s\n", zlibVersion());
15474 #endif
15475 #define CTIMEOPT_VAL_(opt) #opt
15476 #define CTIMEOPT_VAL(opt) CTIMEOPT_VAL_(opt)
15477 #if defined(__clang__) && defined(__clang_major__)
15478     utf8_printf(p->out, "clang-" CTIMEOPT_VAL(__clang_major__) "."
15479                     CTIMEOPT_VAL(__clang_minor__) "."
15480                     CTIMEOPT_VAL(__clang_patchlevel__) "\n");
15481 #elif defined(_MSC_VER)
15482     utf8_printf(p->out, "msvc-" CTIMEOPT_VAL(_MSC_VER) "\n");
15483 #elif defined(__GNUC__) && defined(__VERSION__)
15484     utf8_printf(p->out, "gcc-" __VERSION__ "\n");
15485 #endif
15486   }else
15487 
15488   if( c=='v' && strncmp(azArg[0], "vfsinfo", n)==0 ){
15489     const char *zDbName = nArg==2 ? azArg[1] : "main";
15490     sqlite3_vfs *pVfs = 0;
15491     if( p->db ){
15492       sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFS_POINTER, &pVfs);
15493       if( pVfs ){
15494         utf8_printf(p->out, "vfs.zName      = \"%s\"\n", pVfs->zName);
15495         raw_printf(p->out, "vfs.iVersion   = %d\n", pVfs->iVersion);
15496         raw_printf(p->out, "vfs.szOsFile   = %d\n", pVfs->szOsFile);
15497         raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
15498       }
15499     }
15500   }else
15501 
15502   if( c=='v' && strncmp(azArg[0], "vfslist", n)==0 ){
15503     sqlite3_vfs *pVfs;
15504     sqlite3_vfs *pCurrent = 0;
15505     if( p->db ){
15506       sqlite3_file_control(p->db, "main", SQLITE_FCNTL_VFS_POINTER, &pCurrent);
15507     }
15508     for(pVfs=sqlite3_vfs_find(0); pVfs; pVfs=pVfs->pNext){
15509       utf8_printf(p->out, "vfs.zName      = \"%s\"%s\n", pVfs->zName,
15510            pVfs==pCurrent ? "  <--- CURRENT" : "");
15511       raw_printf(p->out, "vfs.iVersion   = %d\n", pVfs->iVersion);
15512       raw_printf(p->out, "vfs.szOsFile   = %d\n", pVfs->szOsFile);
15513       raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
15514       if( pVfs->pNext ){
15515         raw_printf(p->out, "-----------------------------------\n");
15516       }
15517     }
15518   }else
15519 
15520   if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
15521     const char *zDbName = nArg==2 ? azArg[1] : "main";
15522     char *zVfsName = 0;
15523     if( p->db ){
15524       sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
15525       if( zVfsName ){
15526         utf8_printf(p->out, "%s\n", zVfsName);
15527         sqlite3_free(zVfsName);
15528       }
15529     }
15530   }else
15531 
15532 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
15533   if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
15534     sqlite3WhereTrace = nArg>=2 ? booleanValue(azArg[1]) : 0xff;
15535   }else
15536 #endif
15537 
15538   if( c=='w' && strncmp(azArg[0], "width", n)==0 ){
15539     int j;
15540     assert( nArg<=ArraySize(azArg) );
15541     for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
15542       p->colWidth[j-1] = (int)integerValue(azArg[j]);
15543     }
15544   }else
15545 
15546   {
15547     utf8_printf(stderr, "Error: unknown command or invalid arguments: "
15548       " \"%s\". Enter \".help\" for help\n", azArg[0]);
15549     rc = 1;
15550   }
15551 
15552 meta_command_exit:
15553   if( p->outCount ){
15554     p->outCount--;
15555     if( p->outCount==0 ) output_reset(p);
15556   }
15557   return rc;
15558 }
15559 
15560 /*
15561 ** Return TRUE if a semicolon occurs anywhere in the first N characters
15562 ** of string z[].
15563 */
line_contains_semicolon(const char * z,int N)15564 static int line_contains_semicolon(const char *z, int N){
15565   int i;
15566   for(i=0; i<N; i++){  if( z[i]==';' ) return 1; }
15567   return 0;
15568 }
15569 
15570 /*
15571 ** Test to see if a line consists entirely of whitespace.
15572 */
_all_whitespace(const char * z)15573 static int _all_whitespace(const char *z){
15574   for(; *z; z++){
15575     if( IsSpace(z[0]) ) continue;
15576     if( *z=='/' && z[1]=='*' ){
15577       z += 2;
15578       while( *z && (*z!='*' || z[1]!='/') ){ z++; }
15579       if( *z==0 ) return 0;
15580       z++;
15581       continue;
15582     }
15583     if( *z=='-' && z[1]=='-' ){
15584       z += 2;
15585       while( *z && *z!='\n' ){ z++; }
15586       if( *z==0 ) return 1;
15587       continue;
15588     }
15589     return 0;
15590   }
15591   return 1;
15592 }
15593 
15594 /*
15595 ** Return TRUE if the line typed in is an SQL command terminator other
15596 ** than a semi-colon.  The SQL Server style "go" command is understood
15597 ** as is the Oracle "/".
15598 */
line_is_command_terminator(const char * zLine)15599 static int line_is_command_terminator(const char *zLine){
15600   while( IsSpace(zLine[0]) ){ zLine++; };
15601   if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){
15602     return 1;  /* Oracle */
15603   }
15604   if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o'
15605          && _all_whitespace(&zLine[2]) ){
15606     return 1;  /* SQL Server */
15607   }
15608   return 0;
15609 }
15610 
15611 /*
15612 ** We need a default sqlite3_complete() implementation to use in case
15613 ** the shell is compiled with SQLITE_OMIT_COMPLETE.  The default assumes
15614 ** any arbitrary text is a complete SQL statement.  This is not very
15615 ** user-friendly, but it does seem to work.
15616 */
15617 #ifdef SQLITE_OMIT_COMPLETE
15618 #define sqlite3_complete(x) 1
15619 #endif
15620 
15621 /*
15622 ** Return true if zSql is a complete SQL statement.  Return false if it
15623 ** ends in the middle of a string literal or C-style comment.
15624 */
line_is_complete(char * zSql,int nSql)15625 static int line_is_complete(char *zSql, int nSql){
15626   int rc;
15627   if( zSql==0 ) return 1;
15628   zSql[nSql] = ';';
15629   zSql[nSql+1] = 0;
15630   rc = sqlite3_complete(zSql);
15631   zSql[nSql] = 0;
15632   return rc;
15633 }
15634 
15635 /*
15636 ** Run a single line of SQL.  Return the number of errors.
15637 */
runOneSqlLine(ShellState * p,char * zSql,FILE * in,int startline)15638 static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){
15639   int rc;
15640   char *zErrMsg = 0;
15641 
15642   open_db(p, 0);
15643   if( ShellHasFlag(p,SHFLG_Backslash) ) resolve_backslashes(zSql);
15644   BEGIN_TIMER;
15645   rc = shell_exec(p, zSql, &zErrMsg);
15646   END_TIMER;
15647   if( rc || zErrMsg ){
15648     char zPrefix[100];
15649     if( in!=0 || !stdin_is_interactive ){
15650       sqlite3_snprintf(sizeof(zPrefix), zPrefix,
15651                        "Error: near line %d:", startline);
15652     }else{
15653       sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
15654     }
15655     if( zErrMsg!=0 ){
15656       utf8_printf(stderr, "%s %s\n", zPrefix, zErrMsg);
15657       sqlite3_free(zErrMsg);
15658       zErrMsg = 0;
15659     }else{
15660       utf8_printf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
15661     }
15662     return 1;
15663   }else if( ShellHasFlag(p, SHFLG_CountChanges) ){
15664     raw_printf(p->out, "changes: %3d   total_changes: %d\n",
15665             sqlite3_changes(p->db), sqlite3_total_changes(p->db));
15666   }
15667   return 0;
15668 }
15669 
15670 
15671 /*
15672 ** Read input from *in and process it.  If *in==0 then input
15673 ** is interactive - the user is typing it it.  Otherwise, input
15674 ** is coming from a file or device.  A prompt is issued and history
15675 ** is saved only if input is interactive.  An interrupt signal will
15676 ** cause this routine to exit immediately, unless input is interactive.
15677 **
15678 ** Return the number of errors.
15679 */
process_input(ShellState * p,FILE * in)15680 static int process_input(ShellState *p, FILE *in){
15681   char *zLine = 0;          /* A single input line */
15682   char *zSql = 0;           /* Accumulated SQL text */
15683   int nLine;                /* Length of current line */
15684   int nSql = 0;             /* Bytes of zSql[] used */
15685   int nAlloc = 0;           /* Allocated zSql[] space */
15686   int nSqlPrior = 0;        /* Bytes of zSql[] used by prior line */
15687   int rc;                   /* Error code */
15688   int errCnt = 0;           /* Number of errors seen */
15689   int lineno = 0;           /* Current line number */
15690   int startline = 0;        /* Line number for start of current input */
15691 
15692   while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){
15693     fflush(p->out);
15694     zLine = one_input_line(in, zLine, nSql>0);
15695     if( zLine==0 ){
15696       /* End of input */
15697       if( in==0 && stdin_is_interactive ) printf("\n");
15698       break;
15699     }
15700     if( seenInterrupt ){
15701       if( in!=0 ) break;
15702       seenInterrupt = 0;
15703     }
15704     lineno++;
15705     if( nSql==0 && _all_whitespace(zLine) ){
15706       if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine);
15707       continue;
15708     }
15709     if( zLine && (zLine[0]=='.' || zLine[0]=='#') && nSql==0 ){
15710       if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine);
15711       if( zLine[0]=='.' ){
15712         rc = do_meta_command(zLine, p);
15713         if( rc==2 ){ /* exit requested */
15714           break;
15715         }else if( rc ){
15716           errCnt++;
15717         }
15718       }
15719       continue;
15720     }
15721     if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){
15722       memcpy(zLine,";",2);
15723     }
15724     nLine = strlen30(zLine);
15725     if( nSql+nLine+2>=nAlloc ){
15726       nAlloc = nSql+nLine+100;
15727       zSql = realloc(zSql, nAlloc);
15728       if( zSql==0 ) shell_out_of_memory();
15729     }
15730     nSqlPrior = nSql;
15731     if( nSql==0 ){
15732       int i;
15733       for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
15734       assert( nAlloc>0 && zSql!=0 );
15735       memcpy(zSql, zLine+i, nLine+1-i);
15736       startline = lineno;
15737       nSql = nLine-i;
15738     }else{
15739       zSql[nSql++] = '\n';
15740       memcpy(zSql+nSql, zLine, nLine+1);
15741       nSql += nLine;
15742     }
15743     if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
15744                 && sqlite3_complete(zSql) ){
15745       errCnt += runOneSqlLine(p, zSql, in, startline);
15746       nSql = 0;
15747       if( p->outCount ){
15748         output_reset(p);
15749         p->outCount = 0;
15750       }else{
15751         clearTempFile(p);
15752       }
15753     }else if( nSql && _all_whitespace(zSql) ){
15754       if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zSql);
15755       nSql = 0;
15756     }
15757   }
15758   if( nSql && !_all_whitespace(zSql) ){
15759     errCnt += runOneSqlLine(p, zSql, in, startline);
15760   }
15761   free(zSql);
15762   free(zLine);
15763   return errCnt>0;
15764 }
15765 
15766 /*
15767 ** Return a pathname which is the user's home directory.  A
15768 ** 0 return indicates an error of some kind.
15769 */
find_home_dir(int clearFlag)15770 static char *find_home_dir(int clearFlag){
15771   static char *home_dir = NULL;
15772   if( clearFlag ){
15773     free(home_dir);
15774     home_dir = 0;
15775     return 0;
15776   }
15777   if( home_dir ) return home_dir;
15778 
15779 #if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) \
15780      && !defined(__RTP__) && !defined(_WRS_KERNEL)
15781   {
15782     struct passwd *pwent;
15783     uid_t uid = getuid();
15784     if( (pwent=getpwuid(uid)) != NULL) {
15785       home_dir = pwent->pw_dir;
15786     }
15787   }
15788 #endif
15789 
15790 #if defined(_WIN32_WCE)
15791   /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
15792    */
15793   home_dir = "/";
15794 #else
15795 
15796 #if defined(_WIN32) || defined(WIN32)
15797   if (!home_dir) {
15798     home_dir = getenv("USERPROFILE");
15799   }
15800 #endif
15801 
15802   if (!home_dir) {
15803     home_dir = getenv("HOME");
15804   }
15805 
15806 #if defined(_WIN32) || defined(WIN32)
15807   if (!home_dir) {
15808     char *zDrive, *zPath;
15809     int n;
15810     zDrive = getenv("HOMEDRIVE");
15811     zPath = getenv("HOMEPATH");
15812     if( zDrive && zPath ){
15813       n = strlen30(zDrive) + strlen30(zPath) + 1;
15814       home_dir = malloc( n );
15815       if( home_dir==0 ) return 0;
15816       sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
15817       return home_dir;
15818     }
15819     home_dir = "c:\\";
15820   }
15821 #endif
15822 
15823 #endif /* !_WIN32_WCE */
15824 
15825   if( home_dir ){
15826     int n = strlen30(home_dir) + 1;
15827     char *z = malloc( n );
15828     if( z ) memcpy(z, home_dir, n);
15829     home_dir = z;
15830   }
15831 
15832   return home_dir;
15833 }
15834 
15835 /*
15836 ** Read input from the file given by sqliterc_override.  Or if that
15837 ** parameter is NULL, take input from ~/.sqliterc
15838 **
15839 ** Returns the number of errors.
15840 */
process_sqliterc(ShellState * p,const char * sqliterc_override)15841 static void process_sqliterc(
15842   ShellState *p,                  /* Configuration data */
15843   const char *sqliterc_override   /* Name of config file. NULL to use default */
15844 ){
15845   char *home_dir = NULL;
15846   const char *sqliterc = sqliterc_override;
15847   char *zBuf = 0;
15848   FILE *in = NULL;
15849 
15850   if (sqliterc == NULL) {
15851     home_dir = find_home_dir(0);
15852     if( home_dir==0 ){
15853       raw_printf(stderr, "-- warning: cannot find home directory;"
15854                       " cannot read ~/.sqliterc\n");
15855       return;
15856     }
15857     zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
15858     sqliterc = zBuf;
15859   }
15860   in = fopen(sqliterc,"rb");
15861   if( in ){
15862     if( stdin_is_interactive ){
15863       utf8_printf(stderr,"-- Loading resources from %s\n",sqliterc);
15864     }
15865     process_input(p,in);
15866     fclose(in);
15867   }
15868   sqlite3_free(zBuf);
15869 }
15870 
15871 /*
15872 ** Show available command line options
15873 */
15874 static const char zOptions[] =
15875 #if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE)
15876   "   -A ARGS...           run \".archive ARGS\" and exit\n"
15877 #endif
15878   "   -append              append the database to the end of the file\n"
15879   "   -ascii               set output mode to 'ascii'\n"
15880   "   -bail                stop after hitting an error\n"
15881   "   -batch               force batch I/O\n"
15882   "   -column              set output mode to 'column'\n"
15883   "   -cmd COMMAND         run \"COMMAND\" before reading stdin\n"
15884   "   -csv                 set output mode to 'csv'\n"
15885   "   -echo                print commands before execution\n"
15886   "   -init FILENAME       read/process named file\n"
15887   "   -[no]header          turn headers on or off\n"
15888 #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
15889   "   -heap SIZE           Size of heap for memsys3 or memsys5\n"
15890 #endif
15891   "   -help                show this message\n"
15892   "   -html                set output mode to HTML\n"
15893   "   -interactive         force interactive I/O\n"
15894   "   -line                set output mode to 'line'\n"
15895   "   -list                set output mode to 'list'\n"
15896   "   -lookaside SIZE N    use N entries of SZ bytes for lookaside memory\n"
15897   "   -mmap N              default mmap size set to N\n"
15898 #ifdef SQLITE_ENABLE_MULTIPLEX
15899   "   -multiplex           enable the multiplexor VFS\n"
15900 #endif
15901   "   -newline SEP         set output row separator. Default: '\\n'\n"
15902   "   -nullvalue TEXT      set text string for NULL values. Default ''\n"
15903   "   -pagecache SIZE N    use N slots of SZ bytes each for page cache memory\n"
15904   "   -quote               set output mode to 'quote'\n"
15905   "   -readonly            open the database read-only\n"
15906   "   -separator SEP       set output column separator. Default: '|'\n"
15907 #ifdef SQLITE_ENABLE_SORTER_REFERENCES
15908   "   -sorterref SIZE      sorter references threshold size\n"
15909 #endif
15910   "   -stats               print memory stats before each finalize\n"
15911   "   -version             show SQLite version\n"
15912   "   -vfs NAME            use NAME as the default VFS\n"
15913 #ifdef SQLITE_ENABLE_VFSTRACE
15914   "   -vfstrace            enable tracing of all VFS calls\n"
15915 #endif
15916 #ifdef SQLITE_HAVE_ZLIB
15917   "   -zip                 open the file as a ZIP Archive\n"
15918 #endif
15919 ;
usage(int showDetail)15920 static void usage(int showDetail){
15921   utf8_printf(stderr,
15922       "Usage: %s [OPTIONS] FILENAME [SQL]\n"
15923       "FILENAME is the name of an SQLite database. A new database is created\n"
15924       "if the file does not previously exist.\n", Argv0);
15925   if( showDetail ){
15926     utf8_printf(stderr, "OPTIONS include:\n%s", zOptions);
15927   }else{
15928     raw_printf(stderr, "Use the -help option for additional information\n");
15929   }
15930   exit(1);
15931 }
15932 
15933 /*
15934 ** Internal check:  Verify that the SQLite is uninitialized.  Print a
15935 ** error message if it is initialized.
15936 */
verify_uninitialized(void)15937 static void verify_uninitialized(void){
15938   if( sqlite3_config(-1)==SQLITE_MISUSE ){
15939     utf8_printf(stdout, "WARNING: attempt to configure SQLite after"
15940                         " initialization.\n");
15941   }
15942 }
15943 
15944 /*
15945 ** Initialize the state information in data
15946 */
main_init(ShellState * data)15947 static void main_init(ShellState *data) {
15948   memset(data, 0, sizeof(*data));
15949   data->normalMode = data->cMode = data->mode = MODE_List;
15950   data->autoExplain = 1;
15951   memcpy(data->colSeparator,SEP_Column, 2);
15952   memcpy(data->rowSeparator,SEP_Row, 2);
15953   data->showHeader = 0;
15954   data->shellFlgs = SHFLG_Lookaside;
15955   verify_uninitialized();
15956   sqlite3_config(SQLITE_CONFIG_URI, 1);
15957   sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
15958   sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
15959   sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
15960   sqlite3_snprintf(sizeof(continuePrompt), continuePrompt,"   ...> ");
15961 }
15962 
15963 /*
15964 ** Output text to the console in a font that attracts extra attention.
15965 */
15966 #ifdef _WIN32
printBold(const char * zText)15967 static void printBold(const char *zText){
15968   HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
15969   CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
15970   GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
15971   SetConsoleTextAttribute(out,
15972          FOREGROUND_RED|FOREGROUND_INTENSITY
15973   );
15974   printf("%s", zText);
15975   SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
15976 }
15977 #else
printBold(const char * zText)15978 static void printBold(const char *zText){
15979   printf("\033[1m%s\033[0m", zText);
15980 }
15981 #endif
15982 
15983 /*
15984 ** Get the argument to an --option.  Throw an error and die if no argument
15985 ** is available.
15986 */
cmdline_option_value(int argc,char ** argv,int i)15987 static char *cmdline_option_value(int argc, char **argv, int i){
15988   if( i==argc ){
15989     utf8_printf(stderr, "%s: Error: missing argument to %s\n",
15990             argv[0], argv[argc-1]);
15991     exit(1);
15992   }
15993   return argv[i];
15994 }
15995 
15996 #ifndef SQLITE_SHELL_IS_UTF8
15997 #  if (defined(_WIN32) || defined(WIN32)) && defined(_MSC_VER)
15998 #    define SQLITE_SHELL_IS_UTF8          (0)
15999 #  else
16000 #    define SQLITE_SHELL_IS_UTF8          (1)
16001 #  endif
16002 #endif
16003 
16004 #if SQLITE_SHELL_IS_UTF8
main(int argc,char ** argv)16005 int SQLITE_CDECL main(int argc, char **argv){
16006 #else
16007 int SQLITE_CDECL wmain(int argc, wchar_t **wargv){
16008   char **argv;
16009 #endif
16010   char *zErrMsg = 0;
16011   ShellState data;
16012   const char *zInitFile = 0;
16013   int i;
16014   int rc = 0;
16015   int warnInmemoryDb = 0;
16016   int readStdin = 1;
16017   int nCmd = 0;
16018   char **azCmd = 0;
16019   const char *zVfs = 0;           /* Value of -vfs command-line option */
16020 #if !SQLITE_SHELL_IS_UTF8
16021   char **argvToFree = 0;
16022   int argcToFree = 0;
16023 #endif
16024 
16025   setBinaryMode(stdin, 0);
16026   setvbuf(stderr, 0, _IONBF, 0); /* Make sure stderr is unbuffered */
16027   stdin_is_interactive = isatty(0);
16028   stdout_is_console = isatty(1);
16029 
16030 #if !defined(_WIN32_WCE)
16031   if( getenv("SQLITE_DEBUG_BREAK") ){
16032     if( isatty(0) && isatty(2) ){
16033       fprintf(stderr,
16034           "attach debugger to process %d and press any key to continue.\n",
16035           GETPID());
16036       fgetc(stdin);
16037     }else{
16038 #if defined(_WIN32) || defined(WIN32)
16039       DebugBreak();
16040 #elif defined(SIGTRAP)
16041       raise(SIGTRAP);
16042 #endif
16043     }
16044   }
16045 #endif
16046 
16047 #if USE_SYSTEM_SQLITE+0!=1
16048   if( strncmp(sqlite3_sourceid(),SQLITE_SOURCE_ID,60)!=0 ){
16049     utf8_printf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
16050             sqlite3_sourceid(), SQLITE_SOURCE_ID);
16051     exit(1);
16052   }
16053 #endif
16054   main_init(&data);
16055 
16056   /* On Windows, we must translate command-line arguments into UTF-8.
16057   ** The SQLite memory allocator subsystem has to be enabled in order to
16058   ** do this.  But we want to run an sqlite3_shutdown() afterwards so that
16059   ** subsequent sqlite3_config() calls will work.  So copy all results into
16060   ** memory that does not come from the SQLite memory allocator.
16061   */
16062 #if !SQLITE_SHELL_IS_UTF8
16063   sqlite3_initialize();
16064   argvToFree = malloc(sizeof(argv[0])*argc*2);
16065   argcToFree = argc;
16066   argv = argvToFree + argc;
16067   if( argv==0 ) shell_out_of_memory();
16068   for(i=0; i<argc; i++){
16069     char *z = sqlite3_win32_unicode_to_utf8(wargv[i]);
16070     int n;
16071     if( z==0 ) shell_out_of_memory();
16072     n = (int)strlen(z);
16073     argv[i] = malloc( n+1 );
16074     if( argv[i]==0 ) shell_out_of_memory();
16075     memcpy(argv[i], z, n+1);
16076     argvToFree[i] = argv[i];
16077     sqlite3_free(z);
16078   }
16079   sqlite3_shutdown();
16080 #endif
16081 
16082   assert( argc>=1 && argv && argv[0] );
16083   Argv0 = argv[0];
16084 
16085   /* Make sure we have a valid signal handler early, before anything
16086   ** else is done.
16087   */
16088 #ifdef SIGINT
16089   signal(SIGINT, interrupt_handler);
16090 #elif (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE)
16091   SetConsoleCtrlHandler(ConsoleCtrlHandler, TRUE);
16092 #endif
16093 
16094 #ifdef SQLITE_SHELL_DBNAME_PROC
16095   {
16096     /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name
16097     ** of a C-function that will provide the name of the database file.  Use
16098     ** this compile-time option to embed this shell program in larger
16099     ** applications. */
16100     extern void SQLITE_SHELL_DBNAME_PROC(const char**);
16101     SQLITE_SHELL_DBNAME_PROC(&data.zDbFilename);
16102     warnInmemoryDb = 0;
16103   }
16104 #endif
16105 
16106   /* Do an initial pass through the command-line argument to locate
16107   ** the name of the database file, the name of the initialization file,
16108   ** the size of the alternative malloc heap,
16109   ** and the first command to execute.
16110   */
16111   verify_uninitialized();
16112   for(i=1; i<argc; i++){
16113     char *z;
16114     z = argv[i];
16115     if( z[0]!='-' ){
16116       if( data.zDbFilename==0 ){
16117         data.zDbFilename = z;
16118       }else{
16119         /* Excesss arguments are interpreted as SQL (or dot-commands) and
16120         ** mean that nothing is read from stdin */
16121         readStdin = 0;
16122         nCmd++;
16123         azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd);
16124         if( azCmd==0 ) shell_out_of_memory();
16125         azCmd[nCmd-1] = z;
16126       }
16127     }
16128     if( z[1]=='-' ) z++;
16129     if( strcmp(z,"-separator")==0
16130      || strcmp(z,"-nullvalue")==0
16131      || strcmp(z,"-newline")==0
16132      || strcmp(z,"-cmd")==0
16133     ){
16134       (void)cmdline_option_value(argc, argv, ++i);
16135     }else if( strcmp(z,"-init")==0 ){
16136       zInitFile = cmdline_option_value(argc, argv, ++i);
16137     }else if( strcmp(z,"-batch")==0 ){
16138       /* Need to check for batch mode here to so we can avoid printing
16139       ** informational messages (like from process_sqliterc) before
16140       ** we do the actual processing of arguments later in a second pass.
16141       */
16142       stdin_is_interactive = 0;
16143     }else if( strcmp(z,"-heap")==0 ){
16144 #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
16145       const char *zSize;
16146       sqlite3_int64 szHeap;
16147 
16148       zSize = cmdline_option_value(argc, argv, ++i);
16149       szHeap = integerValue(zSize);
16150       if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
16151       sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
16152 #else
16153       (void)cmdline_option_value(argc, argv, ++i);
16154 #endif
16155     }else if( strcmp(z,"-pagecache")==0 ){
16156       int n, sz;
16157       sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
16158       if( sz>70000 ) sz = 70000;
16159       if( sz<0 ) sz = 0;
16160       n = (int)integerValue(cmdline_option_value(argc,argv,++i));
16161       sqlite3_config(SQLITE_CONFIG_PAGECACHE,
16162                     (n>0 && sz>0) ? malloc(n*sz) : 0, sz, n);
16163       data.shellFlgs |= SHFLG_Pagecache;
16164     }else if( strcmp(z,"-lookaside")==0 ){
16165       int n, sz;
16166       sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
16167       if( sz<0 ) sz = 0;
16168       n = (int)integerValue(cmdline_option_value(argc,argv,++i));
16169       if( n<0 ) n = 0;
16170       sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n);
16171       if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside;
16172 #ifdef SQLITE_ENABLE_VFSTRACE
16173     }else if( strcmp(z,"-vfstrace")==0 ){
16174       extern int vfstrace_register(
16175          const char *zTraceName,
16176          const char *zOldVfsName,
16177          int (*xOut)(const char*,void*),
16178          void *pOutArg,
16179          int makeDefault
16180       );
16181       vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
16182 #endif
16183 #ifdef SQLITE_ENABLE_MULTIPLEX
16184     }else if( strcmp(z,"-multiplex")==0 ){
16185       extern int sqlite3_multiple_initialize(const char*,int);
16186       sqlite3_multiplex_initialize(0, 1);
16187 #endif
16188     }else if( strcmp(z,"-mmap")==0 ){
16189       sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
16190       sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
16191 #ifdef SQLITE_ENABLE_SORTER_REFERENCES
16192     }else if( strcmp(z,"-sorterref")==0 ){
16193       sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
16194       sqlite3_config(SQLITE_CONFIG_SORTERREF_SIZE, (int)sz);
16195 #endif
16196     }else if( strcmp(z,"-vfs")==0 ){
16197       zVfs = cmdline_option_value(argc, argv, ++i);
16198 #ifdef SQLITE_HAVE_ZLIB
16199     }else if( strcmp(z,"-zip")==0 ){
16200       data.openMode = SHELL_OPEN_ZIPFILE;
16201 #endif
16202     }else if( strcmp(z,"-append")==0 ){
16203       data.openMode = SHELL_OPEN_APPENDVFS;
16204 #ifdef SQLITE_ENABLE_DESERIALIZE
16205     }else if( strcmp(z,"-deserialize")==0 ){
16206       data.openMode = SHELL_OPEN_DESERIALIZE;
16207 #endif
16208     }else if( strcmp(z,"-readonly")==0 ){
16209       data.openMode = SHELL_OPEN_READONLY;
16210 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
16211     }else if( strncmp(z, "-A",2)==0 ){
16212       /* All remaining command-line arguments are passed to the ".archive"
16213       ** command, so ignore them */
16214       break;
16215 #endif
16216     }
16217   }
16218   verify_uninitialized();
16219 
16220 
16221 #ifdef SQLITE_SHELL_INIT_PROC
16222   {
16223     /* If the SQLITE_SHELL_INIT_PROC macro is defined, then it is the name
16224     ** of a C-function that will perform initialization actions on SQLite that
16225     ** occur just before or after sqlite3_initialize(). Use this compile-time
16226     ** option to embed this shell program in larger applications. */
16227     extern void SQLITE_SHELL_INIT_PROC(void);
16228     SQLITE_SHELL_INIT_PROC();
16229   }
16230 #else
16231   /* All the sqlite3_config() calls have now been made. So it is safe
16232   ** to call sqlite3_initialize() and process any command line -vfs option. */
16233   sqlite3_initialize();
16234 #endif
16235 
16236   if( zVfs ){
16237     sqlite3_vfs *pVfs = sqlite3_vfs_find(zVfs);
16238     if( pVfs ){
16239       sqlite3_vfs_register(pVfs, 1);
16240     }else{
16241       utf8_printf(stderr, "no such VFS: \"%s\"\n", argv[i]);
16242       exit(1);
16243     }
16244   }
16245 
16246   if( data.zDbFilename==0 ){
16247 #ifndef SQLITE_OMIT_MEMORYDB
16248     data.zDbFilename = ":memory:";
16249     warnInmemoryDb = argc==1;
16250 #else
16251     utf8_printf(stderr,"%s: Error: no database filename specified\n", Argv0);
16252     return 1;
16253 #endif
16254   }
16255   data.out = stdout;
16256   sqlite3_appendvfs_init(0,0,0);
16257 
16258   /* Go ahead and open the database file if it already exists.  If the
16259   ** file does not exist, delay opening it.  This prevents empty database
16260   ** files from being created if a user mistypes the database name argument
16261   ** to the sqlite command-line tool.
16262   */
16263   if( access(data.zDbFilename, 0)==0 ){
16264     open_db(&data, 0);
16265   }
16266 
16267   /* Process the initialization file if there is one.  If no -init option
16268   ** is given on the command line, look for a file named ~/.sqliterc and
16269   ** try to process it.
16270   */
16271   process_sqliterc(&data,zInitFile);
16272 
16273   /* Make a second pass through the command-line argument and set
16274   ** options.  This second pass is delayed until after the initialization
16275   ** file is processed so that the command-line arguments will override
16276   ** settings in the initialization file.
16277   */
16278   for(i=1; i<argc; i++){
16279     char *z = argv[i];
16280     if( z[0]!='-' ) continue;
16281     if( z[1]=='-' ){ z++; }
16282     if( strcmp(z,"-init")==0 ){
16283       i++;
16284     }else if( strcmp(z,"-html")==0 ){
16285       data.mode = MODE_Html;
16286     }else if( strcmp(z,"-list")==0 ){
16287       data.mode = MODE_List;
16288     }else if( strcmp(z,"-quote")==0 ){
16289       data.mode = MODE_Quote;
16290     }else if( strcmp(z,"-line")==0 ){
16291       data.mode = MODE_Line;
16292     }else if( strcmp(z,"-column")==0 ){
16293       data.mode = MODE_Column;
16294     }else if( strcmp(z,"-csv")==0 ){
16295       data.mode = MODE_Csv;
16296       memcpy(data.colSeparator,",",2);
16297 #ifdef SQLITE_HAVE_ZLIB
16298     }else if( strcmp(z,"-zip")==0 ){
16299       data.openMode = SHELL_OPEN_ZIPFILE;
16300 #endif
16301     }else if( strcmp(z,"-append")==0 ){
16302       data.openMode = SHELL_OPEN_APPENDVFS;
16303 #ifdef SQLITE_ENABLE_DESERIALIZE
16304     }else if( strcmp(z,"-deserialize")==0 ){
16305       data.openMode = SHELL_OPEN_DESERIALIZE;
16306 #endif
16307     }else if( strcmp(z,"-readonly")==0 ){
16308       data.openMode = SHELL_OPEN_READONLY;
16309     }else if( strcmp(z,"-ascii")==0 ){
16310       data.mode = MODE_Ascii;
16311       sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
16312                        SEP_Unit);
16313       sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
16314                        SEP_Record);
16315     }else if( strcmp(z,"-separator")==0 ){
16316       sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
16317                        "%s",cmdline_option_value(argc,argv,++i));
16318     }else if( strcmp(z,"-newline")==0 ){
16319       sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
16320                        "%s",cmdline_option_value(argc,argv,++i));
16321     }else if( strcmp(z,"-nullvalue")==0 ){
16322       sqlite3_snprintf(sizeof(data.nullValue), data.nullValue,
16323                        "%s",cmdline_option_value(argc,argv,++i));
16324     }else if( strcmp(z,"-header")==0 ){
16325       data.showHeader = 1;
16326     }else if( strcmp(z,"-noheader")==0 ){
16327       data.showHeader = 0;
16328     }else if( strcmp(z,"-echo")==0 ){
16329       ShellSetFlag(&data, SHFLG_Echo);
16330     }else if( strcmp(z,"-eqp")==0 ){
16331       data.autoEQP = AUTOEQP_on;
16332     }else if( strcmp(z,"-eqpfull")==0 ){
16333       data.autoEQP = AUTOEQP_full;
16334     }else if( strcmp(z,"-stats")==0 ){
16335       data.statsOn = 1;
16336     }else if( strcmp(z,"-scanstats")==0 ){
16337       data.scanstatsOn = 1;
16338     }else if( strcmp(z,"-backslash")==0 ){
16339       /* Undocumented command-line option: -backslash
16340       ** Causes C-style backslash escapes to be evaluated in SQL statements
16341       ** prior to sending the SQL into SQLite.  Useful for injecting
16342       ** crazy bytes in the middle of SQL statements for testing and debugging.
16343       */
16344       ShellSetFlag(&data, SHFLG_Backslash);
16345     }else if( strcmp(z,"-bail")==0 ){
16346       bail_on_error = 1;
16347     }else if( strcmp(z,"-version")==0 ){
16348       printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
16349       return 0;
16350     }else if( strcmp(z,"-interactive")==0 ){
16351       stdin_is_interactive = 1;
16352     }else if( strcmp(z,"-batch")==0 ){
16353       stdin_is_interactive = 0;
16354     }else if( strcmp(z,"-heap")==0 ){
16355       i++;
16356     }else if( strcmp(z,"-pagecache")==0 ){
16357       i+=2;
16358     }else if( strcmp(z,"-lookaside")==0 ){
16359       i+=2;
16360     }else if( strcmp(z,"-mmap")==0 ){
16361       i++;
16362 #ifdef SQLITE_ENABLE_SORTER_REFERENCES
16363     }else if( strcmp(z,"-sorterref")==0 ){
16364       i++;
16365 #endif
16366     }else if( strcmp(z,"-vfs")==0 ){
16367       i++;
16368 #ifdef SQLITE_ENABLE_VFSTRACE
16369     }else if( strcmp(z,"-vfstrace")==0 ){
16370       i++;
16371 #endif
16372 #ifdef SQLITE_ENABLE_MULTIPLEX
16373     }else if( strcmp(z,"-multiplex")==0 ){
16374       i++;
16375 #endif
16376     }else if( strcmp(z,"-help")==0 ){
16377       usage(1);
16378     }else if( strcmp(z,"-cmd")==0 ){
16379       /* Run commands that follow -cmd first and separately from commands
16380       ** that simply appear on the command-line.  This seems goofy.  It would
16381       ** be better if all commands ran in the order that they appear.  But
16382       ** we retain the goofy behavior for historical compatibility. */
16383       if( i==argc-1 ) break;
16384       z = cmdline_option_value(argc,argv,++i);
16385       if( z[0]=='.' ){
16386         rc = do_meta_command(z, &data);
16387         if( rc && bail_on_error ) return rc==2 ? 0 : rc;
16388       }else{
16389         open_db(&data, 0);
16390         rc = shell_exec(&data, z, &zErrMsg);
16391         if( zErrMsg!=0 ){
16392           utf8_printf(stderr,"Error: %s\n", zErrMsg);
16393           if( bail_on_error ) return rc!=0 ? rc : 1;
16394         }else if( rc!=0 ){
16395           utf8_printf(stderr,"Error: unable to process SQL \"%s\"\n", z);
16396           if( bail_on_error ) return rc;
16397         }
16398       }
16399 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
16400     }else if( strncmp(z, "-A", 2)==0 ){
16401       if( nCmd>0 ){
16402         utf8_printf(stderr, "Error: cannot mix regular SQL or dot-commands"
16403                             " with \"%s\"\n", z);
16404         return 1;
16405       }
16406       open_db(&data, OPEN_DB_ZIPFILE);
16407       if( z[2] ){
16408         argv[i] = &z[2];
16409         arDotCommand(&data, 1, argv+(i-1), argc-(i-1));
16410       }else{
16411         arDotCommand(&data, 1, argv+i, argc-i);
16412       }
16413       readStdin = 0;
16414       break;
16415 #endif
16416     }else{
16417       utf8_printf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
16418       raw_printf(stderr,"Use -help for a list of options.\n");
16419       return 1;
16420     }
16421     data.cMode = data.mode;
16422   }
16423 
16424   if( !readStdin ){
16425     /* Run all arguments that do not begin with '-' as if they were separate
16426     ** command-line inputs, except for the argToSkip argument which contains
16427     ** the database filename.
16428     */
16429     for(i=0; i<nCmd; i++){
16430       if( azCmd[i][0]=='.' ){
16431         rc = do_meta_command(azCmd[i], &data);
16432         if( rc ) return rc==2 ? 0 : rc;
16433       }else{
16434         open_db(&data, 0);
16435         rc = shell_exec(&data, azCmd[i], &zErrMsg);
16436         if( zErrMsg!=0 ){
16437           utf8_printf(stderr,"Error: %s\n", zErrMsg);
16438           return rc!=0 ? rc : 1;
16439         }else if( rc!=0 ){
16440           utf8_printf(stderr,"Error: unable to process SQL: %s\n", azCmd[i]);
16441           return rc;
16442         }
16443       }
16444     }
16445     free(azCmd);
16446   }else{
16447     /* Run commands received from standard input
16448     */
16449     if( stdin_is_interactive ){
16450       char *zHome;
16451       char *zHistory;
16452       int nHistory;
16453       printf(
16454         "SQLite version %s %.19s\n" /*extra-version-info*/
16455         "Enter \".help\" for usage hints.\n",
16456         sqlite3_libversion(), sqlite3_sourceid()
16457       );
16458       if( warnInmemoryDb ){
16459         printf("Connected to a ");
16460         printBold("transient in-memory database");
16461         printf(".\nUse \".open FILENAME\" to reopen on a "
16462                "persistent database.\n");
16463       }
16464       zHistory = getenv("SQLITE_HISTORY");
16465       if( zHistory ){
16466         zHistory = strdup(zHistory);
16467       }else if( (zHome = find_home_dir(0))!=0 ){
16468         nHistory = strlen30(zHome) + 20;
16469         if( (zHistory = malloc(nHistory))!=0 ){
16470           sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
16471         }
16472       }
16473       if( zHistory ){ shell_read_history(zHistory); }
16474 #if HAVE_READLINE || HAVE_EDITLINE
16475       rl_attempted_completion_function = readline_completion;
16476 #elif HAVE_LINENOISE
16477       linenoiseSetCompletionCallback(linenoise_completion);
16478 #endif
16479       rc = process_input(&data, 0);
16480       if( zHistory ){
16481         shell_stifle_history(2000);
16482         shell_write_history(zHistory);
16483         free(zHistory);
16484       }
16485     }else{
16486       rc = process_input(&data, stdin);
16487     }
16488   }
16489   set_table_name(&data, 0);
16490   if( data.db ){
16491     session_close_all(&data);
16492     close_db(data.db);
16493   }
16494   sqlite3_free(data.zFreeOnClose);
16495   find_home_dir(1);
16496   output_reset(&data);
16497   data.doXdgOpen = 0;
16498   clearTempFile(&data);
16499 #if !SQLITE_SHELL_IS_UTF8
16500   for(i=0; i<argcToFree; i++) free(argvToFree[i]);
16501   free(argvToFree);
16502 #endif
16503   /* Clear the global data structure so that valgrind will detect memory
16504   ** leaks */
16505   memset(&data, 0, sizeof(data));
16506   return rc;
16507 }
16508