xref: /freebsd/contrib/sqlite3/shell.c (revision 0f996f45)
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 typedef unsigned int u32;
38 typedef unsigned short int u16;
39 
40 /*
41 ** Optionally #include a user-defined header, whereby compilation options
42 ** may be set prior to where they take effect, but after platform setup.
43 ** If SQLITE_CUSTOM_INCLUDE=? is defined, its value names the #include
44 ** file. Note that this macro has a like effect on sqlite3.c compilation.
45 */
46 # define SHELL_STRINGIFY_(f) #f
47 # define SHELL_STRINGIFY(f) SHELL_STRINGIFY_(f)
48 #ifdef SQLITE_CUSTOM_INCLUDE
49 # include SHELL_STRINGIFY(SQLITE_CUSTOM_INCLUDE)
50 #endif
51 
52 /*
53 ** Determine if we are dealing with WinRT, which provides only a subset of
54 ** the full Win32 API.
55 */
56 #if !defined(SQLITE_OS_WINRT)
57 # define SQLITE_OS_WINRT 0
58 #endif
59 
60 /*
61 ** If SQLITE_SHELL_FIDDLE is defined then the shell is modified
62 ** somewhat for use as a WASM module in a web browser. This flag
63 ** should only be used when building the "fiddle" web application, as
64 ** the browser-mode build has much different user input requirements
65 ** and this build mode rewires the user input subsystem to account for
66 ** that.
67 */
68 
69 /*
70 ** Warning pragmas copied from msvc.h in the core.
71 */
72 #if defined(_MSC_VER)
73 #pragma warning(disable : 4054)
74 #pragma warning(disable : 4055)
75 #pragma warning(disable : 4100)
76 #pragma warning(disable : 4127)
77 #pragma warning(disable : 4130)
78 #pragma warning(disable : 4152)
79 #pragma warning(disable : 4189)
80 #pragma warning(disable : 4206)
81 #pragma warning(disable : 4210)
82 #pragma warning(disable : 4232)
83 #pragma warning(disable : 4244)
84 #pragma warning(disable : 4305)
85 #pragma warning(disable : 4306)
86 #pragma warning(disable : 4702)
87 #pragma warning(disable : 4706)
88 #endif /* defined(_MSC_VER) */
89 
90 /*
91 ** No support for loadable extensions in VxWorks.
92 */
93 #if (defined(__RTP__) || defined(_WRS_KERNEL)) && !SQLITE_OMIT_LOAD_EXTENSION
94 # define SQLITE_OMIT_LOAD_EXTENSION 1
95 #endif
96 
97 /*
98 ** Enable large-file support for fopen() and friends on unix.
99 */
100 #ifndef SQLITE_DISABLE_LFS
101 # define _LARGE_FILE       1
102 # ifndef _FILE_OFFSET_BITS
103 #   define _FILE_OFFSET_BITS 64
104 # endif
105 # define _LARGEFILE_SOURCE 1
106 #endif
107 
108 #if defined(SQLITE_SHELL_FIDDLE) && !defined(_POSIX_SOURCE)
109 /*
110 ** emcc requires _POSIX_SOURCE (or one of several similar defines)
111 ** to expose strdup().
112 */
113 # define _POSIX_SOURCE
114 #endif
115 
116 #include <stdlib.h>
117 #include <string.h>
118 #include <stdio.h>
119 #include <assert.h>
120 #include <math.h>
121 #include "sqlite3.h"
122 typedef sqlite3_int64 i64;
123 typedef sqlite3_uint64 u64;
124 typedef unsigned char u8;
125 #if SQLITE_USER_AUTHENTICATION
126 # include "sqlite3userauth.h"
127 #endif
128 #include <ctype.h>
129 #include <stdarg.h>
130 
131 #if !defined(_WIN32) && !defined(WIN32)
132 # include <signal.h>
133 # if !defined(__RTP__) && !defined(_WRS_KERNEL) && !defined(SQLITE_WASI)
134 #  include <pwd.h>
135 # endif
136 #endif
137 #if (!defined(_WIN32) && !defined(WIN32)) || defined(__MINGW32__)
138 # include <unistd.h>
139 # include <dirent.h>
140 # define GETPID getpid
141 # if defined(__MINGW32__)
142 #  define DIRENT dirent
143 #  ifndef S_ISLNK
144 #   define S_ISLNK(mode) (0)
145 #  endif
146 # endif
147 #else
148 # define GETPID (int)GetCurrentProcessId
149 #endif
150 #include <sys/types.h>
151 #include <sys/stat.h>
152 
153 #if HAVE_READLINE
154 # include <readline/readline.h>
155 # include <readline/history.h>
156 #endif
157 
158 #if HAVE_EDITLINE
159 # include <editline/readline.h>
160 #endif
161 
162 #if HAVE_EDITLINE || HAVE_READLINE
163 
164 # define shell_add_history(X) add_history(X)
165 # define shell_read_history(X) read_history(X)
166 # define shell_write_history(X) write_history(X)
167 # define shell_stifle_history(X) stifle_history(X)
168 # define shell_readline(X) readline(X)
169 
170 #elif HAVE_LINENOISE
171 
172 # include "linenoise.h"
173 # define shell_add_history(X) linenoiseHistoryAdd(X)
174 # define shell_read_history(X) linenoiseHistoryLoad(X)
175 # define shell_write_history(X) linenoiseHistorySave(X)
176 # define shell_stifle_history(X) linenoiseHistorySetMaxLen(X)
177 # define shell_readline(X) linenoise(X)
178 
179 #else
180 
181 # define shell_read_history(X)
182 # define shell_write_history(X)
183 # define shell_stifle_history(X)
184 
185 # define SHELL_USE_LOCAL_GETLINE 1
186 #endif
187 
188 #ifndef deliberate_fall_through
189 /* Quiet some compilers about some of our intentional code. */
190 # if defined(GCC_VERSION) && GCC_VERSION>=7000000
191 #  define deliberate_fall_through __attribute__((fallthrough));
192 # else
193 #  define deliberate_fall_through
194 # endif
195 #endif
196 
197 #if defined(_WIN32) || defined(WIN32)
198 # if SQLITE_OS_WINRT
199 #  define SQLITE_OMIT_POPEN 1
200 # else
201 #  include <io.h>
202 #  include <fcntl.h>
203 #  define isatty(h) _isatty(h)
204 #  ifndef access
205 #   define access(f,m) _access((f),(m))
206 #  endif
207 #  ifndef unlink
208 #   define unlink _unlink
209 #  endif
210 #  ifndef strdup
211 #   define strdup _strdup
212 #  endif
213 #  undef popen
214 #  define popen _popen
215 #  undef pclose
216 #  define pclose _pclose
217 # endif
218 #else
219  /* Make sure isatty() has a prototype. */
220  extern int isatty(int);
221 
222 # if !defined(__RTP__) && !defined(_WRS_KERNEL) && !defined(SQLITE_WASI)
223   /* popen and pclose are not C89 functions and so are
224   ** sometimes omitted from the <stdio.h> header */
225    extern FILE *popen(const char*,const char*);
226    extern int pclose(FILE*);
227 # else
228 #  define SQLITE_OMIT_POPEN 1
229 # endif
230 #endif
231 
232 #if defined(_WIN32_WCE)
233 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
234  * thus we always assume that we have a console. That can be
235  * overridden with the -batch command line option.
236  */
237 #define isatty(x) 1
238 #endif
239 
240 /* ctype macros that work with signed characters */
241 #define IsSpace(X)  isspace((unsigned char)X)
242 #define IsDigit(X)  isdigit((unsigned char)X)
243 #define ToLower(X)  (char)tolower((unsigned char)X)
244 
245 #if defined(_WIN32) || defined(WIN32)
246 #if SQLITE_OS_WINRT
247 #include <intrin.h>
248 #endif
249 #undef WIN32_LEAN_AND_MEAN
250 #define WIN32_LEAN_AND_MEAN
251 #include <windows.h>
252 
253 /* string conversion routines only needed on Win32 */
254 extern char *sqlite3_win32_unicode_to_utf8(LPCWSTR);
255 extern LPWSTR sqlite3_win32_utf8_to_unicode(const char *zText);
256 #endif
257 
258 /* Use console I/O package as a direct INCLUDE. */
259 #define SQLITE_INTERNAL_LINKAGE static
260 
261 #ifdef SQLITE_SHELL_FIDDLE
262 /* Deselect most features from the console I/O package for Fiddle. */
263 # define SQLITE_CIO_NO_REDIRECT
264 # define SQLITE_CIO_NO_CLASSIFY
265 # define SQLITE_CIO_NO_TRANSLATE
266 # define SQLITE_CIO_NO_SETMODE
267 #endif
268 /************************* Begin ../ext/consio/console_io.h ******************/
269 /*
270 ** 2023 November 1
271 **
272 ** The author disclaims copyright to this source code.  In place of
273 ** a legal notice, here is a blessing:
274 **
275 **    May you do good and not evil.
276 **    May you find forgiveness for yourself and forgive others.
277 **    May you share freely, never taking more than you give.
278 **
279 ********************************************************************************
280 ** This file exposes various interfaces used for console and other I/O
281 ** by the SQLite project command-line tools. These interfaces are used
282 ** at either source conglomeration time, compilation time, or run time.
283 ** This source provides for either inclusion into conglomerated,
284 ** "single-source" forms or separate compilation then linking.
285 **
286 ** Platform dependencies are "hidden" here by various stratagems so
287 ** that, provided certain conditions are met, the programs using this
288 ** source or object code compiled from it need no explicit conditional
289 ** compilation in their source for their console and stream I/O.
290 **
291 ** The symbols and functionality exposed here are not a public API.
292 ** This code may change in tandem with other project code as needed.
293 **
294 ** When this .h file and its companion .c are directly incorporated into
295 ** a source conglomeration (such as shell.c), the preprocessor symbol
296 ** CIO_WIN_WC_XLATE is defined as 0 or 1, reflecting whether console I/O
297 ** translation for Windows is effected for the build.
298 */
299 #define HAVE_CONSOLE_IO_H 1
300 #ifndef SQLITE_INTERNAL_LINKAGE
301 # define SQLITE_INTERNAL_LINKAGE extern /* external to translation unit */
302 # include <stdio.h>
303 #else
304 # define SHELL_NO_SYSINC /* Better yet, modify mkshellc.tcl for this. */
305 #endif
306 
307 #ifndef SQLITE3_H
308 /* # include "sqlite3.h" */
309 #endif
310 
311 #ifndef SQLITE_CIO_NO_CLASSIFY
312 
313 /* Define enum for use with following function. */
314 typedef enum StreamsAreConsole {
315   SAC_NoConsole = 0,
316   SAC_InConsole = 1, SAC_OutConsole = 2, SAC_ErrConsole = 4,
317   SAC_AnyConsole = 0x7
318 } StreamsAreConsole;
319 
320 /*
321 ** Classify the three standard I/O streams according to whether
322 ** they are connected to a console attached to the process.
323 **
324 ** Returns the bit-wise OR of SAC_{In,Out,Err}Console values,
325 ** or SAC_NoConsole if none of the streams reaches a console.
326 **
327 ** This function should be called before any I/O is done with
328 ** the given streams. As a side-effect, the given inputs are
329 ** recorded so that later I/O operations on them may be done
330 ** differently than the C library FILE* I/O would be done,
331 ** iff the stream is used for the I/O functions that follow,
332 ** and to support the ones that use an implicit stream.
333 **
334 ** On some platforms, stream or console mode alteration (aka
335 ** "Setup") may be made which is undone by consoleRestore().
336 */
337 SQLITE_INTERNAL_LINKAGE StreamsAreConsole
338 consoleClassifySetup( FILE *pfIn, FILE *pfOut, FILE *pfErr );
339 /* A usual call for convenience: */
340 #define SQLITE_STD_CONSOLE_INIT() consoleClassifySetup(stdin,stdout,stderr)
341 
342 /*
343 ** After an initial call to consoleClassifySetup(...), renew
344 ** the same setup it effected. (A call not after is an error.)
345 ** This will restore state altered by consoleRestore();
346 **
347 ** Applications which run an inferior (child) process which
348 ** inherits the same I/O streams may call this function after
349 ** such a process exits to guard against console mode changes.
350 */
351 SQLITE_INTERNAL_LINKAGE void consoleRenewSetup(void);
352 
353 /*
354 ** Undo any side-effects left by consoleClassifySetup(...).
355 **
356 ** This should be called after consoleClassifySetup() and
357 ** before the process terminates normally. It is suitable
358 ** for use with the atexit() C library procedure. After
359 ** this call, no console I/O should be done until one of
360 ** console{Classify or Renew}Setup(...) is called again.
361 **
362 ** Applications which run an inferior (child) process that
363 ** inherits the same I/O streams might call this procedure
364 ** before so that said process will have a console setup
365 ** however users have configured it or come to expect.
366 */
367 SQLITE_INTERNAL_LINKAGE void SQLITE_CDECL consoleRestore( void );
368 
369 #else /* defined(SQLITE_CIO_NO_CLASSIFY) */
370 # define consoleClassifySetup(i,o,e)
371 # define consoleRenewSetup()
372 # define consoleRestore()
373 #endif /* defined(SQLITE_CIO_NO_CLASSIFY) */
374 
375 #ifndef SQLITE_CIO_NO_REDIRECT
376 /*
377 ** Set stream to be used for the functions below which write
378 ** to "the designated X stream", where X is Output or Error.
379 ** Returns the previous value.
380 **
381 ** Alternatively, pass the special value, invalidFileStream,
382 ** to get the designated stream value without setting it.
383 **
384 ** Before the designated streams are set, they default to
385 ** those passed to consoleClassifySetup(...), and before
386 ** that is called they default to stdout and stderr.
387 **
388 ** It is error to close a stream so designated, then, without
389 ** designating another, use the corresponding {o,e}Emit(...).
390 */
391 SQLITE_INTERNAL_LINKAGE FILE *invalidFileStream;
392 SQLITE_INTERNAL_LINKAGE FILE *setOutputStream(FILE *pf);
393 # ifdef CONSIO_SET_ERROR_STREAM
394 SQLITE_INTERNAL_LINKAGE FILE *setErrorStream(FILE *pf);
395 # endif
396 #else
397 # define setOutputStream(pf)
398 # define setErrorStream(pf)
399 #endif /* !defined(SQLITE_CIO_NO_REDIRECT) */
400 
401 #ifndef SQLITE_CIO_NO_TRANSLATE
402 /*
403 ** Emit output like fprintf(). If the output is going to the
404 ** console and translation from UTF-8 is necessary, perform
405 ** the needed translation. Otherwise, write formatted output
406 ** to the provided stream almost as-is, possibly with newline
407 ** translation as specified by set{Binary,Text}Mode().
408 */
409 SQLITE_INTERNAL_LINKAGE int fPrintfUtf8(FILE *pfO, const char *zFormat, ...);
410 /* Like fPrintfUtf8 except stream is always the designated output. */
411 SQLITE_INTERNAL_LINKAGE int oPrintfUtf8(const char *zFormat, ...);
412 /* Like fPrintfUtf8 except stream is always the designated error. */
413 SQLITE_INTERNAL_LINKAGE int ePrintfUtf8(const char *zFormat, ...);
414 
415 /*
416 ** Emit output like fputs(). If the output is going to the
417 ** console and translation from UTF-8 is necessary, perform
418 ** the needed translation. Otherwise, write given text to the
419 ** provided stream almost as-is, possibly with newline
420 ** translation as specified by set{Binary,Text}Mode().
421 */
422 SQLITE_INTERNAL_LINKAGE int fPutsUtf8(const char *z, FILE *pfO);
423 /* Like fPutsUtf8 except stream is always the designated output. */
424 SQLITE_INTERNAL_LINKAGE int oPutsUtf8(const char *z);
425 /* Like fPutsUtf8 except stream is always the designated error. */
426 SQLITE_INTERNAL_LINKAGE int ePutsUtf8(const char *z);
427 
428 /*
429 ** Emit output like fPutsUtf8(), except that the length of the
430 ** accepted char or character sequence is limited by nAccept.
431 **
432 ** Returns the number of accepted char values.
433 */
434 #ifdef CONSIO_SPUTB
435 SQLITE_INTERNAL_LINKAGE int
436 fPutbUtf8(FILE *pfOut, const char *cBuf, int nAccept);
437 /* Like fPutbUtf8 except stream is always the designated output. */
438 #endif
439 SQLITE_INTERNAL_LINKAGE int
440 oPutbUtf8(const char *cBuf, int nAccept);
441 /* Like fPutbUtf8 except stream is always the designated error. */
442 #ifdef CONSIO_EPUTB
443 SQLITE_INTERNAL_LINKAGE int
444 ePutbUtf8(const char *cBuf, int nAccept);
445 #endif
446 
447 /*
448 ** Collect input like fgets(...) with special provisions for input
449 ** from the console on platforms that require same. Defers to the
450 ** C library fgets() when input is not from the console. Newline
451 ** translation may be done as set by set{Binary,Text}Mode(). As a
452 ** convenience, pfIn==NULL is treated as stdin.
453 */
454 SQLITE_INTERNAL_LINKAGE char* fGetsUtf8(char *cBuf, int ncMax, FILE *pfIn);
455 /* Like fGetsUtf8 except stream is always the designated input. */
456 /* SQLITE_INTERNAL_LINKAGE char* iGetsUtf8(char *cBuf, int ncMax); */
457 
458 #endif /* !defined(SQLITE_CIO_NO_TRANSLATE) */
459 
460 #ifndef SQLITE_CIO_NO_SETMODE
461 /*
462 ** Set given stream for binary mode, where newline translation is
463 ** not done, or for text mode where, for some platforms, newlines
464 ** are translated to the platform's conventional char sequence.
465 ** If bFlush true, flush the stream.
466 **
467 ** An additional side-effect is that if the stream is one passed
468 ** to consoleClassifySetup() as an output, it is flushed first.
469 **
470 ** Note that binary/text mode has no effect on console I/O
471 ** translation. On all platforms, newline to the console starts
472 ** a new line and CR,LF chars from the console become a newline.
473 */
474 SQLITE_INTERNAL_LINKAGE void setBinaryMode(FILE *, short bFlush);
475 SQLITE_INTERNAL_LINKAGE void setTextMode(FILE *, short bFlush);
476 #endif
477 
478 #ifdef SQLITE_CIO_PROMPTED_IN
479 typedef struct Prompts {
480   int numPrompts;
481   const char **azPrompts;
482 } Prompts;
483 
484 /*
485 ** Macros for use of a line editor.
486 **
487 ** The following macros define operations involving use of a
488 ** line-editing library or simple console interaction.
489 ** A "T" argument is a text (char *) buffer or filename.
490 ** A "N" argument is an integer.
491 **
492 ** SHELL_ADD_HISTORY(T) // Record text as line(s) of history.
493 ** SHELL_READ_HISTORY(T) // Read history from file named by T.
494 ** SHELL_WRITE_HISTORY(T) // Write history to file named by T.
495 ** SHELL_STIFLE_HISTORY(N) // Limit history to N entries.
496 **
497 ** A console program which does interactive console input is
498 ** expected to call:
499 ** SHELL_READ_HISTORY(T) before collecting such input;
500 ** SHELL_ADD_HISTORY(T) as record-worthy input is taken;
501 ** SHELL_STIFLE_HISTORY(N) after console input ceases; then
502 ** SHELL_WRITE_HISTORY(T) before the program exits.
503 */
504 
505 /*
506 ** Retrieve a single line of input text from an input stream.
507 **
508 ** If pfIn is the input stream passed to consoleClassifySetup(),
509 ** and azPrompt is not NULL, then a prompt is issued before the
510 ** line is collected, as selected by the isContinuation flag.
511 ** Array azPrompt[{0,1}] holds the {main,continuation} prompt.
512 **
513 ** If zBufPrior is not NULL then it is a buffer from a prior
514 ** call to this routine that can be reused, or will be freed.
515 **
516 ** The result is stored in space obtained from malloc() and
517 ** must either be freed by the caller or else passed back to
518 ** this function as zBufPrior for reuse.
519 **
520 ** This function may call upon services of a line-editing
521 ** library to interactively collect line edited input.
522 */
523 SQLITE_INTERNAL_LINKAGE char *
524 shellGetLine(FILE *pfIn, char *zBufPrior, int nLen,
525              short isContinuation, Prompts azPrompt);
526 #endif /* defined(SQLITE_CIO_PROMPTED_IN) */
527 /*
528 ** TBD: Define an interface for application(s) to generate
529 ** completion candidates for use by the line-editor.
530 **
531 ** This may be premature; the CLI is the only application
532 ** that does this. Yet, getting line-editing melded into
533 ** console I/O is desirable because a line-editing library
534 ** may have to establish console operating mode, possibly
535 ** in a way that interferes with the above functionality.
536 */
537 
538 #if !(defined(SQLITE_CIO_NO_UTF8SCAN)&&defined(SQLITE_CIO_NO_TRANSLATE))
539 /* Skip over as much z[] input char sequence as is valid UTF-8,
540 ** limited per nAccept char's or whole characters and containing
541 ** no char cn such that ((1<<cn) & ccm)!=0. On return, the
542 ** sequence z:return (inclusive:exclusive) is validated UTF-8.
543 ** Limit: nAccept>=0 => char count, nAccept<0 => character
544  */
545 SQLITE_INTERNAL_LINKAGE const char*
546 zSkipValidUtf8(const char *z, int nAccept, long ccm);
547 
548 #endif
549 
550 /************************* End ../ext/consio/console_io.h ********************/
551 /************************* Begin ../ext/consio/console_io.c ******************/
552 /*
553 ** 2023 November 4
554 **
555 ** The author disclaims copyright to this source code.  In place of
556 ** a legal notice, here is a blessing:
557 **
558 **    May you do good and not evil.
559 **    May you find forgiveness for yourself and forgive others.
560 **    May you share freely, never taking more than you give.
561 **
562 ********************************************************************************
563 ** This file implements various interfaces used for console and stream I/O
564 ** by the SQLite project command-line tools, as explained in console_io.h .
565 ** Functions prefixed by "SQLITE_INTERNAL_LINKAGE" behave as described there.
566 */
567 
568 #ifndef SQLITE_CDECL
569 # define SQLITE_CDECL
570 #endif
571 
572 #ifndef SHELL_NO_SYSINC
573 # include <stdarg.h>
574 # include <string.h>
575 # include <stdlib.h>
576 # include <limits.h>
577 # include <assert.h>
578 /* # include "sqlite3.h" */
579 #endif
580 #ifndef HAVE_CONSOLE_IO_H
581 # include "console_io.h"
582 #endif
583 #if defined(_MSC_VER)
584 # pragma warning(disable : 4204)
585 #endif
586 
587 #ifndef SQLITE_CIO_NO_TRANSLATE
588 # if (defined(_WIN32) || defined(WIN32)) && !SQLITE_OS_WINRT
589 #  ifndef SHELL_NO_SYSINC
590 #   include <io.h>
591 #   include <fcntl.h>
592 #   undef WIN32_LEAN_AND_MEAN
593 #   define WIN32_LEAN_AND_MEAN
594 #   include <windows.h>
595 #  endif
596 #  define CIO_WIN_WC_XLATE 1 /* Use WCHAR Windows APIs for console I/O */
597 # else
598 #  ifndef SHELL_NO_SYSINC
599 #   include <unistd.h>
600 #  endif
601 #  define CIO_WIN_WC_XLATE 0 /* Use plain C library stream I/O at console */
602 # endif
603 #else
604 # define CIO_WIN_WC_XLATE 0 /* Not exposing translation routines at all */
605 #endif
606 
607 #if CIO_WIN_WC_XLATE
608 /* Character used to represent a known-incomplete UTF-8 char group (�) */
609 static WCHAR cBadGroup = 0xfffd;
610 #endif
611 
612 #if CIO_WIN_WC_XLATE
handleOfFile(FILE * pf)613 static HANDLE handleOfFile(FILE *pf){
614   int fileDesc = _fileno(pf);
615   union { intptr_t osfh; HANDLE fh; } fid = {
616     (fileDesc>=0)? _get_osfhandle(fileDesc) : (intptr_t)INVALID_HANDLE_VALUE
617   };
618   return fid.fh;
619 }
620 #endif
621 
622 #ifndef SQLITE_CIO_NO_TRANSLATE
623 typedef struct PerStreamTags {
624 # if CIO_WIN_WC_XLATE
625   HANDLE hx;
626   DWORD consMode;
627   char acIncomplete[4];
628 # else
629   short reachesConsole;
630 # endif
631   FILE *pf;
632 } PerStreamTags;
633 
634 /* Define NULL-like value for things which can validly be 0. */
635 # define SHELL_INVALID_FILE_PTR ((FILE *)~0)
636 # if CIO_WIN_WC_XLATE
637 #  define SHELL_INVALID_CONS_MODE 0xFFFF0000
638 # endif
639 
640 # if CIO_WIN_WC_XLATE
641 #  define PST_INITIALIZER { INVALID_HANDLE_VALUE, SHELL_INVALID_CONS_MODE, \
642       {0,0,0,0}, SHELL_INVALID_FILE_PTR }
643 # else
644 #  define PST_INITIALIZER { 0, SHELL_INVALID_FILE_PTR }
645 # endif
646 
647 /* Quickly say whether a known output is going to the console. */
648 # if CIO_WIN_WC_XLATE
pstReachesConsole(PerStreamTags * ppst)649 static short pstReachesConsole(PerStreamTags *ppst){
650   return (ppst->hx != INVALID_HANDLE_VALUE);
651 }
652 # else
653 #  define pstReachesConsole(ppst) 0
654 # endif
655 
656 # if CIO_WIN_WC_XLATE
restoreConsoleArb(PerStreamTags * ppst)657 static void restoreConsoleArb(PerStreamTags *ppst){
658   if( pstReachesConsole(ppst) ) SetConsoleMode(ppst->hx, ppst->consMode);
659 }
660 # else
661 #  define restoreConsoleArb(ppst)
662 # endif
663 
664 /* Say whether FILE* appears to be a console, collect associated info. */
streamOfConsole(FILE * pf,PerStreamTags * ppst)665 static short streamOfConsole(FILE *pf, /* out */ PerStreamTags *ppst){
666 # if CIO_WIN_WC_XLATE
667   short rv = 0;
668   DWORD dwCM = SHELL_INVALID_CONS_MODE;
669   HANDLE fh = handleOfFile(pf);
670   ppst->pf = pf;
671   if( INVALID_HANDLE_VALUE != fh ){
672     rv = (GetFileType(fh) == FILE_TYPE_CHAR && GetConsoleMode(fh,&dwCM));
673   }
674   ppst->hx = (rv)? fh : INVALID_HANDLE_VALUE;
675   ppst->consMode = dwCM;
676   return rv;
677 # else
678   ppst->pf = pf;
679   ppst->reachesConsole = ( (short)isatty(fileno(pf)) );
680   return ppst->reachesConsole;
681 # endif
682 }
683 
684 # ifndef ENABLE_VIRTUAL_TERMINAL_PROCESSING
685 #  define ENABLE_VIRTUAL_TERMINAL_PROCESSING  (0x4)
686 # endif
687 
688 # if CIO_WIN_WC_XLATE
689 /* Define console modes for use with the Windows Console API. */
690 #  define SHELL_CONI_MODE \
691   (ENABLE_ECHO_INPUT | ENABLE_INSERT_MODE | ENABLE_LINE_INPUT | 0x80 \
692   | ENABLE_QUICK_EDIT_MODE | ENABLE_EXTENDED_FLAGS | ENABLE_PROCESSED_INPUT)
693 #  define SHELL_CONO_MODE (ENABLE_PROCESSED_OUTPUT | ENABLE_WRAP_AT_EOL_OUTPUT \
694   | ENABLE_VIRTUAL_TERMINAL_PROCESSING)
695 # endif
696 
697 typedef struct ConsoleInfo {
698   PerStreamTags pstSetup[3];
699   PerStreamTags pstDesignated[3];
700   StreamsAreConsole sacSetup;
701 } ConsoleInfo;
702 
isValidStreamInfo(PerStreamTags * ppst)703 static short isValidStreamInfo(PerStreamTags *ppst){
704   return (ppst->pf != SHELL_INVALID_FILE_PTR);
705 }
706 
707 static ConsoleInfo consoleInfo = {
708   { /* pstSetup */ PST_INITIALIZER, PST_INITIALIZER, PST_INITIALIZER },
709   { /* pstDesignated[] */ PST_INITIALIZER, PST_INITIALIZER, PST_INITIALIZER },
710   SAC_NoConsole /* sacSetup */
711 };
712 
713 SQLITE_INTERNAL_LINKAGE FILE* invalidFileStream = (FILE *)~0;
714 
715 # if CIO_WIN_WC_XLATE
maybeSetupAsConsole(PerStreamTags * ppst,short odir)716 static void maybeSetupAsConsole(PerStreamTags *ppst, short odir){
717   if( pstReachesConsole(ppst) ){
718     DWORD cm = odir? SHELL_CONO_MODE : SHELL_CONI_MODE;
719     SetConsoleMode(ppst->hx, cm);
720   }
721 }
722 # else
723 #  define maybeSetupAsConsole(ppst,odir)
724 # endif
725 
consoleRenewSetup(void)726 SQLITE_INTERNAL_LINKAGE void consoleRenewSetup(void){
727 # if CIO_WIN_WC_XLATE
728   int ix = 0;
729   while( ix < 6 ){
730     PerStreamTags *ppst = (ix<3)?
731       &consoleInfo.pstSetup[ix] : &consoleInfo.pstDesignated[ix-3];
732     maybeSetupAsConsole(ppst, (ix % 3)>0);
733     ++ix;
734   }
735 # endif
736 }
737 
738 SQLITE_INTERNAL_LINKAGE StreamsAreConsole
consoleClassifySetup(FILE * pfIn,FILE * pfOut,FILE * pfErr)739 consoleClassifySetup( FILE *pfIn, FILE *pfOut, FILE *pfErr ){
740   StreamsAreConsole rv = SAC_NoConsole;
741   FILE* apf[3] = { pfIn, pfOut, pfErr };
742   int ix;
743   for( ix = 2; ix >= 0; --ix ){
744     PerStreamTags *ppst = &consoleInfo.pstSetup[ix];
745     if( streamOfConsole(apf[ix], ppst) ){
746       rv |= (SAC_InConsole<<ix);
747     }
748     consoleInfo.pstDesignated[ix] = *ppst;
749     if( ix > 0 ) fflush(apf[ix]);
750   }
751   consoleInfo.sacSetup = rv;
752   consoleRenewSetup();
753   return rv;
754 }
755 
consoleRestore(void)756 SQLITE_INTERNAL_LINKAGE void SQLITE_CDECL consoleRestore( void ){
757 # if CIO_WIN_WC_XLATE
758   static ConsoleInfo *pci = &consoleInfo;
759   if( pci->sacSetup ){
760     int ix;
761     for( ix=0; ix<3; ++ix ){
762       if( pci->sacSetup & (SAC_InConsole<<ix) ){
763         PerStreamTags *ppst = &pci->pstSetup[ix];
764         SetConsoleMode(ppst->hx, ppst->consMode);
765       }
766     }
767   }
768 # endif
769 }
770 #endif /* !defined(SQLITE_CIO_NO_TRANSLATE) */
771 
772 #ifdef SQLITE_CIO_INPUT_REDIR
773 /* Say whether given FILE* is among those known, via either
774 ** consoleClassifySetup() or set{Output,Error}Stream, as
775 ** readable, and return an associated PerStreamTags pointer
776 ** if so. Otherwise, return 0.
777 */
isKnownReadable(FILE * pf)778 static PerStreamTags * isKnownReadable(FILE *pf){
779   static PerStreamTags *apst[] = {
780     &consoleInfo.pstDesignated[0], &consoleInfo.pstSetup[0], 0
781   };
782   int ix = 0;
783   do {
784     if( apst[ix]->pf == pf ) break;
785   } while( apst[++ix] != 0 );
786   return apst[ix];
787 }
788 #endif
789 
790 #ifndef SQLITE_CIO_NO_TRANSLATE
791 /* Say whether given FILE* is among those known, via either
792 ** consoleClassifySetup() or set{Output,Error}Stream, as
793 ** writable, and return an associated PerStreamTags pointer
794 ** if so. Otherwise, return 0.
795 */
isKnownWritable(FILE * pf)796 static PerStreamTags * isKnownWritable(FILE *pf){
797   static PerStreamTags *apst[] = {
798     &consoleInfo.pstDesignated[1], &consoleInfo.pstDesignated[2],
799     &consoleInfo.pstSetup[1], &consoleInfo.pstSetup[2], 0
800   };
801   int ix = 0;
802   do {
803     if( apst[ix]->pf == pf ) break;
804   } while( apst[++ix] != 0 );
805   return apst[ix];
806 }
807 
designateEmitStream(FILE * pf,unsigned chix)808 static FILE *designateEmitStream(FILE *pf, unsigned chix){
809   FILE *rv = consoleInfo.pstDesignated[chix].pf;
810   if( pf == invalidFileStream ) return rv;
811   else{
812     /* Setting a possibly new output stream. */
813     PerStreamTags *ppst = isKnownWritable(pf);
814     if( ppst != 0 ){
815       PerStreamTags pst = *ppst;
816       consoleInfo.pstDesignated[chix] = pst;
817     }else streamOfConsole(pf, &consoleInfo.pstDesignated[chix]);
818   }
819   return rv;
820 }
821 
setOutputStream(FILE * pf)822 SQLITE_INTERNAL_LINKAGE FILE *setOutputStream(FILE *pf){
823   return designateEmitStream(pf, 1);
824 }
825 # ifdef CONSIO_SET_ERROR_STREAM
setErrorStream(FILE * pf)826 SQLITE_INTERNAL_LINKAGE FILE *setErrorStream(FILE *pf){
827   return designateEmitStream(pf, 2);
828 }
829 # endif
830 #endif /* !defined(SQLITE_CIO_NO_TRANSLATE) */
831 
832 #ifndef SQLITE_CIO_NO_SETMODE
833 # if CIO_WIN_WC_XLATE
setModeFlushQ(FILE * pf,short bFlush,int mode)834 static void setModeFlushQ(FILE *pf, short bFlush, int mode){
835   if( bFlush ) fflush(pf);
836   _setmode(_fileno(pf), mode);
837 }
838 # else
839 #  define setModeFlushQ(f, b, m) if(b) fflush(f)
840 # endif
841 
setBinaryMode(FILE * pf,short bFlush)842 SQLITE_INTERNAL_LINKAGE void setBinaryMode(FILE *pf, short bFlush){
843   setModeFlushQ(pf, bFlush, _O_BINARY);
844 }
setTextMode(FILE * pf,short bFlush)845 SQLITE_INTERNAL_LINKAGE void setTextMode(FILE *pf, short bFlush){
846   setModeFlushQ(pf, bFlush, _O_TEXT);
847 }
848 # undef setModeFlushQ
849 
850 #else /* defined(SQLITE_CIO_NO_SETMODE) */
851 # define setBinaryMode(f, bFlush) do{ if((bFlush)) fflush(f); }while(0)
852 # define setTextMode(f, bFlush) do{ if((bFlush)) fflush(f); }while(0)
853 #endif /* defined(SQLITE_CIO_NO_SETMODE) */
854 
855 #ifndef SQLITE_CIO_NO_TRANSLATE
856 # if CIO_WIN_WC_XLATE
857 /* Write buffer cBuf as output to stream known to reach console,
858 ** limited to ncTake char's. Return ncTake on success, else 0. */
conZstrEmit(PerStreamTags * ppst,const char * z,int ncTake)859 static int conZstrEmit(PerStreamTags *ppst, const char *z, int ncTake){
860   int rv = 0;
861   if( z!=NULL ){
862     int nwc = MultiByteToWideChar(CP_UTF8,0, z,ncTake, 0,0);
863     if( nwc > 0 ){
864       WCHAR *zw = sqlite3_malloc64(nwc*sizeof(WCHAR));
865       if( zw!=NULL ){
866         nwc = MultiByteToWideChar(CP_UTF8,0, z,ncTake, zw,nwc);
867         if( nwc > 0 ){
868           /* Translation from UTF-8 to UTF-16, then WCHARs out. */
869           if( WriteConsoleW(ppst->hx, zw,nwc, 0, NULL) ){
870             rv = ncTake;
871           }
872         }
873         sqlite3_free(zw);
874       }
875     }
876   }
877   return rv;
878 }
879 
880 /* For {f,o,e}PrintfUtf8() when stream is known to reach console. */
conioVmPrintf(PerStreamTags * ppst,const char * zFormat,va_list ap)881 static int conioVmPrintf(PerStreamTags *ppst, const char *zFormat, va_list ap){
882   char *z = sqlite3_vmprintf(zFormat, ap);
883   if( z ){
884     int rv = conZstrEmit(ppst, z, (int)strlen(z));
885     sqlite3_free(z);
886     return rv;
887   }else return 0;
888 }
889 # endif /* CIO_WIN_WC_XLATE */
890 
891 # ifdef CONSIO_GET_EMIT_STREAM
getDesignatedEmitStream(FILE * pf,unsigned chix,PerStreamTags * ppst)892 static PerStreamTags * getDesignatedEmitStream(FILE *pf, unsigned chix,
893                                                PerStreamTags *ppst){
894   PerStreamTags *rv = isKnownWritable(pf);
895   short isValid = (rv!=0)? isValidStreamInfo(rv) : 0;
896   if( rv != 0 && isValid ) return rv;
897   streamOfConsole(pf, ppst);
898   return ppst;
899 }
900 # endif
901 
902 /* Get stream info, either for designated output or error stream when
903 ** chix equals 1 or 2, or for an arbitrary stream when chix == 0.
904 ** In either case, ppst references a caller-owned PerStreamTags
905 ** struct which may be filled in if none of the known writable
906 ** streams is being held by consoleInfo. The ppf parameter is a
907 ** byref output when chix!=0 and a byref input when chix==0.
908  */
909 static PerStreamTags *
getEmitStreamInfo(unsigned chix,PerStreamTags * ppst,FILE ** ppf)910 getEmitStreamInfo(unsigned chix, PerStreamTags *ppst,
911                   /* in/out */ FILE **ppf){
912   PerStreamTags *ppstTry;
913   FILE *pfEmit;
914   if( chix > 0 ){
915     ppstTry = &consoleInfo.pstDesignated[chix];
916     if( !isValidStreamInfo(ppstTry) ){
917       ppstTry = &consoleInfo.pstSetup[chix];
918       pfEmit = ppst->pf;
919     }else pfEmit = ppstTry->pf;
920     if( !isValidStreamInfo(ppstTry) ){
921       pfEmit = (chix > 1)? stderr : stdout;
922       ppstTry = ppst;
923       streamOfConsole(pfEmit, ppstTry);
924     }
925     *ppf = pfEmit;
926   }else{
927     ppstTry = isKnownWritable(*ppf);
928     if( ppstTry != 0 ) return ppstTry;
929     streamOfConsole(*ppf, ppst);
930     return ppst;
931   }
932   return ppstTry;
933 }
934 
oPrintfUtf8(const char * zFormat,...)935 SQLITE_INTERNAL_LINKAGE int oPrintfUtf8(const char *zFormat, ...){
936   va_list ap;
937   int rv;
938   FILE *pfOut;
939   PerStreamTags pst = PST_INITIALIZER; /* for unknown streams */
940 # if CIO_WIN_WC_XLATE
941   PerStreamTags *ppst = getEmitStreamInfo(1, &pst, &pfOut);
942 # else
943   getEmitStreamInfo(1, &pst, &pfOut);
944 # endif
945   assert(zFormat!=0);
946   va_start(ap, zFormat);
947 # if CIO_WIN_WC_XLATE
948   if( pstReachesConsole(ppst) ){
949     rv = conioVmPrintf(ppst, zFormat, ap);
950   }else{
951 # endif
952     rv = vfprintf(pfOut, zFormat, ap);
953 # if CIO_WIN_WC_XLATE
954   }
955 # endif
956   va_end(ap);
957   return rv;
958 }
959 
ePrintfUtf8(const char * zFormat,...)960 SQLITE_INTERNAL_LINKAGE int ePrintfUtf8(const char *zFormat, ...){
961   va_list ap;
962   int rv;
963   FILE *pfErr;
964   PerStreamTags pst = PST_INITIALIZER; /* for unknown streams */
965 # if CIO_WIN_WC_XLATE
966   PerStreamTags *ppst = getEmitStreamInfo(2, &pst, &pfErr);
967 # else
968   getEmitStreamInfo(2, &pst, &pfErr);
969 # endif
970   assert(zFormat!=0);
971   va_start(ap, zFormat);
972 # if CIO_WIN_WC_XLATE
973   if( pstReachesConsole(ppst) ){
974     rv = conioVmPrintf(ppst, zFormat, ap);
975   }else{
976 # endif
977     rv = vfprintf(pfErr, zFormat, ap);
978 # if CIO_WIN_WC_XLATE
979   }
980 # endif
981   va_end(ap);
982   return rv;
983 }
984 
fPrintfUtf8(FILE * pfO,const char * zFormat,...)985 SQLITE_INTERNAL_LINKAGE int fPrintfUtf8(FILE *pfO, const char *zFormat, ...){
986   va_list ap;
987   int rv;
988   PerStreamTags pst = PST_INITIALIZER; /* for unknown streams */
989 # if CIO_WIN_WC_XLATE
990   PerStreamTags *ppst = getEmitStreamInfo(0, &pst, &pfO);
991 # else
992   getEmitStreamInfo(0, &pst, &pfO);
993 # endif
994   assert(zFormat!=0);
995   va_start(ap, zFormat);
996 # if CIO_WIN_WC_XLATE
997   if( pstReachesConsole(ppst) ){
998     maybeSetupAsConsole(ppst, 1);
999     rv = conioVmPrintf(ppst, zFormat, ap);
1000     if( 0 == isKnownWritable(ppst->pf) ) restoreConsoleArb(ppst);
1001   }else{
1002 # endif
1003     rv = vfprintf(pfO, zFormat, ap);
1004 # if CIO_WIN_WC_XLATE
1005   }
1006 # endif
1007   va_end(ap);
1008   return rv;
1009 }
1010 
fPutsUtf8(const char * z,FILE * pfO)1011 SQLITE_INTERNAL_LINKAGE int fPutsUtf8(const char *z, FILE *pfO){
1012   PerStreamTags pst = PST_INITIALIZER; /* for unknown streams */
1013 # if CIO_WIN_WC_XLATE
1014   PerStreamTags *ppst = getEmitStreamInfo(0, &pst, &pfO);
1015 # else
1016   getEmitStreamInfo(0, &pst, &pfO);
1017 # endif
1018   assert(z!=0);
1019 # if CIO_WIN_WC_XLATE
1020   if( pstReachesConsole(ppst) ){
1021     int rv;
1022     maybeSetupAsConsole(ppst, 1);
1023     rv = conZstrEmit(ppst, z, (int)strlen(z));
1024     if( 0 == isKnownWritable(ppst->pf) ) restoreConsoleArb(ppst);
1025     return rv;
1026   }else {
1027 # endif
1028     return (fputs(z, pfO)<0)? 0 : (int)strlen(z);
1029 # if CIO_WIN_WC_XLATE
1030   }
1031 # endif
1032 }
1033 
ePutsUtf8(const char * z)1034 SQLITE_INTERNAL_LINKAGE int ePutsUtf8(const char *z){
1035   FILE *pfErr;
1036   PerStreamTags pst = PST_INITIALIZER; /* for unknown streams */
1037 # if CIO_WIN_WC_XLATE
1038   PerStreamTags *ppst = getEmitStreamInfo(2, &pst, &pfErr);
1039 # else
1040   getEmitStreamInfo(2, &pst, &pfErr);
1041 # endif
1042   assert(z!=0);
1043 # if CIO_WIN_WC_XLATE
1044   if( pstReachesConsole(ppst) ) return conZstrEmit(ppst, z, (int)strlen(z));
1045   else {
1046 # endif
1047     return (fputs(z, pfErr)<0)? 0 : (int)strlen(z);
1048 # if CIO_WIN_WC_XLATE
1049   }
1050 # endif
1051 }
1052 
oPutsUtf8(const char * z)1053 SQLITE_INTERNAL_LINKAGE int oPutsUtf8(const char *z){
1054   FILE *pfOut;
1055   PerStreamTags pst = PST_INITIALIZER; /* for unknown streams */
1056 # if CIO_WIN_WC_XLATE
1057   PerStreamTags *ppst = getEmitStreamInfo(1, &pst, &pfOut);
1058 # else
1059   getEmitStreamInfo(1, &pst, &pfOut);
1060 # endif
1061   assert(z!=0);
1062 # if CIO_WIN_WC_XLATE
1063   if( pstReachesConsole(ppst) ) return conZstrEmit(ppst, z, (int)strlen(z));
1064   else {
1065 # endif
1066     return (fputs(z, pfOut)<0)? 0 : (int)strlen(z);
1067 # if CIO_WIN_WC_XLATE
1068   }
1069 # endif
1070 }
1071 
1072 #endif /* !defined(SQLITE_CIO_NO_TRANSLATE) */
1073 
1074 #if !(defined(SQLITE_CIO_NO_UTF8SCAN) && defined(SQLITE_CIO_NO_TRANSLATE))
1075 /* Skip over as much z[] input char sequence as is valid UTF-8,
1076 ** limited per nAccept char's or whole characters and containing
1077 ** no char cn such that ((1<<cn) & ccm)!=0. On return, the
1078 ** sequence z:return (inclusive:exclusive) is validated UTF-8.
1079 ** Limit: nAccept>=0 => char count, nAccept<0 => character
1080  */
1081 SQLITE_INTERNAL_LINKAGE const char*
zSkipValidUtf8(const char * z,int nAccept,long ccm)1082 zSkipValidUtf8(const char *z, int nAccept, long ccm){
1083   int ng = (nAccept<0)? -nAccept : 0;
1084   const char *pcLimit = (nAccept>=0)? z+nAccept : 0;
1085   assert(z!=0);
1086   while( (pcLimit)? (z<pcLimit) : (ng-- != 0) ){
1087     char c = *z;
1088     if( (c & 0x80) == 0 ){
1089       if( ccm != 0L && c < 0x20 && ((1L<<c) & ccm) != 0 ) return z;
1090       ++z; /* ASCII */
1091     }else if( (c & 0xC0) != 0xC0 ) return z; /* not a lead byte */
1092     else{
1093       const char *zt = z+1; /* Got lead byte, look at trail bytes.*/
1094       do{
1095         if( pcLimit && zt >= pcLimit ) return z;
1096         else{
1097           char ct = *zt++;
1098           if( ct==0 || (zt-z)>4 || (ct & 0xC0)!=0x80 ){
1099             /* Trailing bytes are too few, too many, or invalid. */
1100             return z;
1101           }
1102         }
1103       } while( ((c <<= 1) & 0x40) == 0x40 ); /* Eat lead byte's count. */
1104       z = zt;
1105     }
1106   }
1107   return z;
1108 }
1109 #endif /*!(defined(SQLITE_CIO_NO_UTF8SCAN)&&defined(SQLITE_CIO_NO_TRANSLATE))*/
1110 
1111 #ifndef SQLITE_CIO_NO_TRANSLATE
1112 # ifdef CONSIO_SPUTB
1113 SQLITE_INTERNAL_LINKAGE int
fPutbUtf8(FILE * pfO,const char * cBuf,int nAccept)1114 fPutbUtf8(FILE *pfO, const char *cBuf, int nAccept){
1115   assert(pfO!=0);
1116 #  if CIO_WIN_WC_XLATE
1117   PerStreamTags pst = PST_INITIALIZER; /* for unknown streams */
1118   PerStreamTags *ppst = getEmitStreamInfo(0, &pst, &pfO);
1119   if( pstReachesConsole(ppst) ){
1120     int rv;
1121     maybeSetupAsConsole(ppst, 1);
1122     rv = conZstrEmit(ppst, cBuf, nAccept);
1123     if( 0 == isKnownWritable(ppst->pf) ) restoreConsoleArb(ppst);
1124     return rv;
1125   }else {
1126 #  endif
1127     return (int)fwrite(cBuf, 1, nAccept, pfO);
1128 #  if CIO_WIN_WC_XLATE
1129   }
1130 #  endif
1131 }
1132 # endif
1133 
1134 SQLITE_INTERNAL_LINKAGE int
oPutbUtf8(const char * cBuf,int nAccept)1135 oPutbUtf8(const char *cBuf, int nAccept){
1136   FILE *pfOut;
1137   PerStreamTags pst = PST_INITIALIZER; /* for unknown streams */
1138 # if CIO_WIN_WC_XLATE
1139   PerStreamTags *ppst = getEmitStreamInfo(1, &pst, &pfOut);
1140 # else
1141   getEmitStreamInfo(1, &pst, &pfOut);
1142 # endif
1143 # if CIO_WIN_WC_XLATE
1144   if( pstReachesConsole(ppst) ){
1145     return conZstrEmit(ppst, cBuf, nAccept);
1146   }else {
1147 # endif
1148     return (int)fwrite(cBuf, 1, nAccept, pfOut);
1149 # if CIO_WIN_WC_XLATE
1150   }
1151 # endif
1152 }
1153 
1154 # ifdef CONSIO_EPUTB
1155 SQLITE_INTERNAL_LINKAGE int
ePutbUtf8(const char * cBuf,int nAccept)1156 ePutbUtf8(const char *cBuf, int nAccept){
1157   FILE *pfErr;
1158   PerStreamTags pst = PST_INITIALIZER; /* for unknown streams */
1159   PerStreamTags *ppst = getEmitStreamInfo(2, &pst, &pfErr);
1160 #  if CIO_WIN_WC_XLATE
1161   if( pstReachesConsole(ppst) ){
1162     return conZstrEmit(ppst, cBuf, nAccept);
1163   }else {
1164 #  endif
1165     return (int)fwrite(cBuf, 1, nAccept, pfErr);
1166 #  if CIO_WIN_WC_XLATE
1167   }
1168 #  endif
1169 }
1170 # endif /* defined(CONSIO_EPUTB) */
1171 
fGetsUtf8(char * cBuf,int ncMax,FILE * pfIn)1172 SQLITE_INTERNAL_LINKAGE char* fGetsUtf8(char *cBuf, int ncMax, FILE *pfIn){
1173   if( pfIn==0 ) pfIn = stdin;
1174 # if CIO_WIN_WC_XLATE
1175   if( pfIn == consoleInfo.pstSetup[0].pf
1176       && (consoleInfo.sacSetup & SAC_InConsole)!=0 ){
1177 #  if CIO_WIN_WC_XLATE==1
1178 #   define SHELL_GULP 150 /* Count of WCHARS to be gulped at a time */
1179     WCHAR wcBuf[SHELL_GULP+1];
1180     int lend = 0, noc = 0;
1181     if( ncMax > 0 ) cBuf[0] = 0;
1182     while( noc < ncMax-8-1 && !lend ){
1183       /* There is room for at least 2 more characters and a 0-terminator. */
1184       int na = (ncMax > SHELL_GULP*4+1 + noc)? SHELL_GULP : (ncMax-1 - noc)/4;
1185 #   undef SHELL_GULP
1186       DWORD nbr = 0;
1187       BOOL bRC = ReadConsoleW(consoleInfo.pstSetup[0].hx, wcBuf, na, &nbr, 0);
1188       if( bRC && nbr>0 && (wcBuf[nbr-1]&0xF800)==0xD800 ){
1189         /* Last WHAR read is first of a UTF-16 surrogate pair. Grab its mate. */
1190         DWORD nbrx;
1191         bRC &= ReadConsoleW(consoleInfo.pstSetup[0].hx, wcBuf+nbr, 1, &nbrx, 0);
1192         if( bRC ) nbr += nbrx;
1193       }
1194       if( !bRC || (noc==0 && nbr==0) ) return 0;
1195       if( nbr > 0 ){
1196         int nmb = WideCharToMultiByte(CP_UTF8, 0, wcBuf,nbr,0,0,0,0);
1197         if( nmb != 0 && noc+nmb <= ncMax ){
1198           int iseg = noc;
1199           nmb = WideCharToMultiByte(CP_UTF8, 0, wcBuf,nbr,cBuf+noc,nmb,0,0);
1200           noc += nmb;
1201           /* Fixup line-ends as coded by Windows for CR (or "Enter".)
1202           ** This is done without regard for any setMode{Text,Binary}()
1203           ** call that might have been done on the interactive input.
1204           */
1205           if( noc > 0 ){
1206             if( cBuf[noc-1]=='\n' ){
1207               lend = 1;
1208               if( noc > 1 && cBuf[noc-2]=='\r' ) cBuf[--noc-1] = '\n';
1209             }
1210           }
1211           /* Check for ^Z (anywhere in line) too, to act as EOF. */
1212           while( iseg < noc ){
1213             if( cBuf[iseg]=='\x1a' ){
1214               noc = iseg; /* Chop ^Z and anything following. */
1215               lend = 1; /* Counts as end of line too. */
1216               break;
1217             }
1218             ++iseg;
1219           }
1220         }else break; /* Drop apparent garbage in. (Could assert.) */
1221       }else break;
1222     }
1223     /* If got nothing, (after ^Z chop), must be at end-of-file. */
1224     if( noc > 0 ){
1225       cBuf[noc] = 0;
1226       return cBuf;
1227     }else return 0;
1228 #  endif
1229   }else{
1230 # endif
1231     return fgets(cBuf, ncMax, pfIn);
1232 # if CIO_WIN_WC_XLATE
1233   }
1234 # endif
1235 }
1236 #endif /* !defined(SQLITE_CIO_NO_TRANSLATE) */
1237 
1238 #if defined(_MSC_VER)
1239 # pragma warning(default : 4204)
1240 #endif
1241 
1242 #undef SHELL_INVALID_FILE_PTR
1243 
1244 /************************* End ../ext/consio/console_io.c ********************/
1245 
1246 #ifndef SQLITE_SHELL_FIDDLE
1247 
1248 /* From here onward, fgets() is redirected to the console_io library. */
1249 # define fgets(b,n,f) fGetsUtf8(b,n,f)
1250 /*
1251  * Define macros for emitting output text in various ways:
1252  *  sputz(s, z)      => emit 0-terminated string z to given stream s
1253  *  sputf(s, f, ...) => emit varargs per format f to given stream s
1254  *  oputz(z)         => emit 0-terminated string z to default stream
1255  *  oputf(f, ...)    => emit varargs per format f to default stream
1256  *  eputz(z)         => emit 0-terminated string z to error stream
1257  *  eputf(f, ...)    => emit varargs per format f to error stream
1258  *  oputb(b, n)      => emit char buffer b[0..n-1] to default stream
1259  *
1260  * Note that the default stream is whatever has been last set via:
1261  *   setOutputStream(FILE *pf)
1262  * This is normally the stream that CLI normal output goes to.
1263  * For the stand-alone CLI, it is stdout with no .output redirect.
1264  *
1265  * The ?putz(z) forms are required for the Fiddle builds for string literal
1266  * output, in aid of enforcing format string to argument correspondence.
1267  */
1268 # define sputz(s,z) fPutsUtf8(z,s)
1269 # define sputf fPrintfUtf8
1270 # define oputz(z) oPutsUtf8(z)
1271 # define oputf oPrintfUtf8
1272 # define eputz(z) ePutsUtf8(z)
1273 # define eputf ePrintfUtf8
1274 # define oputb(buf,na) oPutbUtf8(buf,na)
1275 
1276 #else
1277 /* For Fiddle, all console handling and emit redirection is omitted. */
1278 /* These next 3 macros are for emitting formatted output. When complaints
1279  * from the WASM build are issued for non-formatted output, (when a mere
1280  * string literal is to be emitted, the ?putz(z) forms should be used.
1281  * (This permits compile-time checking of format string / argument mismatch.)
1282  */
1283 # define oputf(fmt, ...) printf(fmt,__VA_ARGS__)
1284 # define eputf(fmt, ...) fprintf(stderr,fmt,__VA_ARGS__)
1285 # define sputf(fp,fmt, ...) fprintf(fp,fmt,__VA_ARGS__)
1286 /* These next 3 macros are for emitting simple string literals. */
1287 # define oputz(z) fputs(z,stdout)
1288 # define eputz(z) fputs(z,stderr)
1289 # define sputz(fp,z) fputs(z,fp)
1290 # define oputb(buf,na) fwrite(buf,1,na,stdout)
1291 #endif
1292 
1293 /* True if the timer is enabled */
1294 static int enableTimer = 0;
1295 
1296 /* A version of strcmp() that works with NULL values */
cli_strcmp(const char * a,const char * b)1297 static int cli_strcmp(const char *a, const char *b){
1298   if( a==0 ) a = "";
1299   if( b==0 ) b = "";
1300   return strcmp(a,b);
1301 }
cli_strncmp(const char * a,const char * b,size_t n)1302 static int cli_strncmp(const char *a, const char *b, size_t n){
1303   if( a==0 ) a = "";
1304   if( b==0 ) b = "";
1305   return strncmp(a,b,n);
1306 }
1307 
1308 /* Return the current wall-clock time */
timeOfDay(void)1309 static sqlite3_int64 timeOfDay(void){
1310   static sqlite3_vfs *clockVfs = 0;
1311   sqlite3_int64 t;
1312   if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0);
1313   if( clockVfs==0 ) return 0;  /* Never actually happens */
1314   if( clockVfs->iVersion>=2 && clockVfs->xCurrentTimeInt64!=0 ){
1315     clockVfs->xCurrentTimeInt64(clockVfs, &t);
1316   }else{
1317     double r;
1318     clockVfs->xCurrentTime(clockVfs, &r);
1319     t = (sqlite3_int64)(r*86400000.0);
1320   }
1321   return t;
1322 }
1323 
1324 #if !defined(_WIN32) && !defined(WIN32) && !defined(__minux)
1325 #include <sys/time.h>
1326 #include <sys/resource.h>
1327 
1328 /* VxWorks does not support getrusage() as far as we can determine */
1329 #if defined(_WRS_KERNEL) || defined(__RTP__)
1330 struct rusage {
1331   struct timeval ru_utime; /* user CPU time used */
1332   struct timeval ru_stime; /* system CPU time used */
1333 };
1334 #define getrusage(A,B) memset(B,0,sizeof(*B))
1335 #endif
1336 
1337 /* Saved resource information for the beginning of an operation */
1338 static struct rusage sBegin;  /* CPU time at start */
1339 static sqlite3_int64 iBegin;  /* Wall-clock time at start */
1340 
1341 /*
1342 ** Begin timing an operation
1343 */
beginTimer(void)1344 static void beginTimer(void){
1345   if( enableTimer ){
1346     getrusage(RUSAGE_SELF, &sBegin);
1347     iBegin = timeOfDay();
1348   }
1349 }
1350 
1351 /* Return the difference of two time_structs in seconds */
timeDiff(struct timeval * pStart,struct timeval * pEnd)1352 static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
1353   return (pEnd->tv_usec - pStart->tv_usec)*0.000001 +
1354          (double)(pEnd->tv_sec - pStart->tv_sec);
1355 }
1356 
1357 /*
1358 ** Print the timing results.
1359 */
endTimer(void)1360 static void endTimer(void){
1361   if( enableTimer ){
1362     sqlite3_int64 iEnd = timeOfDay();
1363     struct rusage sEnd;
1364     getrusage(RUSAGE_SELF, &sEnd);
1365     sputf(stdout, "Run Time: real %.3f user %f sys %f\n",
1366           (iEnd - iBegin)*0.001,
1367           timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
1368           timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
1369   }
1370 }
1371 
1372 #define BEGIN_TIMER beginTimer()
1373 #define END_TIMER endTimer()
1374 #define HAS_TIMER 1
1375 
1376 #elif (defined(_WIN32) || defined(WIN32))
1377 
1378 /* Saved resource information for the beginning of an operation */
1379 static HANDLE hProcess;
1380 static FILETIME ftKernelBegin;
1381 static FILETIME ftUserBegin;
1382 static sqlite3_int64 ftWallBegin;
1383 typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME,
1384                                     LPFILETIME, LPFILETIME);
1385 static GETPROCTIMES getProcessTimesAddr = NULL;
1386 
1387 /*
1388 ** Check to see if we have timer support.  Return 1 if necessary
1389 ** support found (or found previously).
1390 */
hasTimer(void)1391 static int hasTimer(void){
1392   if( getProcessTimesAddr ){
1393     return 1;
1394   } else {
1395 #if !SQLITE_OS_WINRT
1396     /* GetProcessTimes() isn't supported in WIN95 and some other Windows
1397     ** versions. See if the version we are running on has it, and if it
1398     ** does, save off a pointer to it and the current process handle.
1399     */
1400     hProcess = GetCurrentProcess();
1401     if( hProcess ){
1402       HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll"));
1403       if( NULL != hinstLib ){
1404         getProcessTimesAddr =
1405             (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes");
1406         if( NULL != getProcessTimesAddr ){
1407           return 1;
1408         }
1409         FreeLibrary(hinstLib);
1410       }
1411     }
1412 #endif
1413   }
1414   return 0;
1415 }
1416 
1417 /*
1418 ** Begin timing an operation
1419 */
beginTimer(void)1420 static void beginTimer(void){
1421   if( enableTimer && getProcessTimesAddr ){
1422     FILETIME ftCreation, ftExit;
1423     getProcessTimesAddr(hProcess,&ftCreation,&ftExit,
1424                         &ftKernelBegin,&ftUserBegin);
1425     ftWallBegin = timeOfDay();
1426   }
1427 }
1428 
1429 /* Return the difference of two FILETIME structs in seconds */
timeDiff(FILETIME * pStart,FILETIME * pEnd)1430 static double timeDiff(FILETIME *pStart, FILETIME *pEnd){
1431   sqlite_int64 i64Start = *((sqlite_int64 *) pStart);
1432   sqlite_int64 i64End = *((sqlite_int64 *) pEnd);
1433   return (double) ((i64End - i64Start) / 10000000.0);
1434 }
1435 
1436 /*
1437 ** Print the timing results.
1438 */
endTimer(void)1439 static void endTimer(void){
1440   if( enableTimer && getProcessTimesAddr){
1441     FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
1442     sqlite3_int64 ftWallEnd = timeOfDay();
1443     getProcessTimesAddr(hProcess,&ftCreation,&ftExit,&ftKernelEnd,&ftUserEnd);
1444     sputf(stdout, "Run Time: real %.3f user %f sys %f\n",
1445           (ftWallEnd - ftWallBegin)*0.001,
1446           timeDiff(&ftUserBegin, &ftUserEnd),
1447           timeDiff(&ftKernelBegin, &ftKernelEnd));
1448   }
1449 }
1450 
1451 #define BEGIN_TIMER beginTimer()
1452 #define END_TIMER endTimer()
1453 #define HAS_TIMER hasTimer()
1454 
1455 #else
1456 #define BEGIN_TIMER
1457 #define END_TIMER
1458 #define HAS_TIMER 0
1459 #endif
1460 
1461 /*
1462 ** Used to prevent warnings about unused parameters
1463 */
1464 #define UNUSED_PARAMETER(x) (void)(x)
1465 
1466 /*
1467 ** Number of elements in an array
1468 */
1469 #define ArraySize(X)  (int)(sizeof(X)/sizeof(X[0]))
1470 
1471 /*
1472 ** If the following flag is set, then command execution stops
1473 ** at an error if we are not interactive.
1474 */
1475 static int bail_on_error = 0;
1476 
1477 /*
1478 ** Treat stdin as an interactive input if the following variable
1479 ** is true.  Otherwise, assume stdin is connected to a file or pipe.
1480 */
1481 static int stdin_is_interactive = 1;
1482 
1483 /*
1484 ** On Windows systems we need to know if standard output is a console
1485 ** in order to show that UTF-16 translation is done in the sign-on
1486 ** banner. The following variable is true if it is the console.
1487 */
1488 static int stdout_is_console = 1;
1489 
1490 /*
1491 ** The following is the open SQLite database.  We make a pointer
1492 ** to this database a static variable so that it can be accessed
1493 ** by the SIGINT handler to interrupt database processing.
1494 */
1495 static sqlite3 *globalDb = 0;
1496 
1497 /*
1498 ** True if an interrupt (Control-C) has been received.
1499 */
1500 static volatile int seenInterrupt = 0;
1501 
1502 /*
1503 ** This is the name of our program. It is set in main(), used
1504 ** in a number of other places, mostly for error messages.
1505 */
1506 static char *Argv0;
1507 
1508 /*
1509 ** Prompt strings. Initialized in main. Settable with
1510 **   .prompt main continue
1511 */
1512 #define PROMPT_LEN_MAX 20
1513 /* First line prompt.   default: "sqlite> " */
1514 static char mainPrompt[PROMPT_LEN_MAX];
1515 /* Continuation prompt. default: "   ...> " */
1516 static char continuePrompt[PROMPT_LEN_MAX];
1517 
1518 /* This is variant of the standard-library strncpy() routine with the
1519 ** one change that the destination string is always zero-terminated, even
1520 ** if there is no zero-terminator in the first n-1 characters of the source
1521 ** string.
1522 */
shell_strncpy(char * dest,const char * src,size_t n)1523 static char *shell_strncpy(char *dest, const char *src, size_t n){
1524   size_t i;
1525   for(i=0; i<n-1 && src[i]!=0; i++) dest[i] = src[i];
1526   dest[i] = 0;
1527   return dest;
1528 }
1529 
1530 /*
1531 ** Optionally disable dynamic continuation prompt.
1532 ** Unless disabled, the continuation prompt shows open SQL lexemes if any,
1533 ** or open parentheses level if non-zero, or continuation prompt as set.
1534 ** This facility interacts with the scanner and process_input() where the
1535 ** below 5 macros are used.
1536 */
1537 #ifdef SQLITE_OMIT_DYNAPROMPT
1538 # define CONTINUATION_PROMPT continuePrompt
1539 # define CONTINUE_PROMPT_RESET
1540 # define CONTINUE_PROMPT_AWAITS(p,s)
1541 # define CONTINUE_PROMPT_AWAITC(p,c)
1542 # define CONTINUE_PAREN_INCR(p,n)
1543 # define CONTINUE_PROMPT_PSTATE 0
1544 typedef void *t_NoDynaPrompt;
1545 # define SCAN_TRACKER_REFTYPE t_NoDynaPrompt
1546 #else
1547 # define CONTINUATION_PROMPT dynamicContinuePrompt()
1548 # define CONTINUE_PROMPT_RESET \
1549   do {setLexemeOpen(&dynPrompt,0,0); trackParenLevel(&dynPrompt,0);} while(0)
1550 # define CONTINUE_PROMPT_AWAITS(p,s) \
1551   if(p && stdin_is_interactive) setLexemeOpen(p, s, 0)
1552 # define CONTINUE_PROMPT_AWAITC(p,c) \
1553   if(p && stdin_is_interactive) setLexemeOpen(p, 0, c)
1554 # define CONTINUE_PAREN_INCR(p,n) \
1555   if(p && stdin_is_interactive) (trackParenLevel(p,n))
1556 # define CONTINUE_PROMPT_PSTATE (&dynPrompt)
1557 typedef struct DynaPrompt *t_DynaPromptRef;
1558 # define SCAN_TRACKER_REFTYPE t_DynaPromptRef
1559 
1560 static struct DynaPrompt {
1561   char dynamicPrompt[PROMPT_LEN_MAX];
1562   char acAwait[2];
1563   int inParenLevel;
1564   char *zScannerAwaits;
1565 } dynPrompt = { {0}, {0}, 0, 0 };
1566 
1567 /* Record parenthesis nesting level change, or force level to 0. */
trackParenLevel(struct DynaPrompt * p,int ni)1568 static void trackParenLevel(struct DynaPrompt *p, int ni){
1569   p->inParenLevel += ni;
1570   if( ni==0 ) p->inParenLevel = 0;
1571   p->zScannerAwaits = 0;
1572 }
1573 
1574 /* Record that a lexeme is opened, or closed with args==0. */
setLexemeOpen(struct DynaPrompt * p,char * s,char c)1575 static void setLexemeOpen(struct DynaPrompt *p, char *s, char c){
1576   if( s!=0 || c==0 ){
1577     p->zScannerAwaits = s;
1578     p->acAwait[0] = 0;
1579   }else{
1580     p->acAwait[0] = c;
1581     p->zScannerAwaits = p->acAwait;
1582   }
1583 }
1584 
1585 /* Upon demand, derive the continuation prompt to display. */
dynamicContinuePrompt(void)1586 static char *dynamicContinuePrompt(void){
1587   if( continuePrompt[0]==0
1588       || (dynPrompt.zScannerAwaits==0 && dynPrompt.inParenLevel == 0) ){
1589     return continuePrompt;
1590   }else{
1591     if( dynPrompt.zScannerAwaits ){
1592       size_t ncp = strlen(continuePrompt);
1593       size_t ndp = strlen(dynPrompt.zScannerAwaits);
1594       if( ndp > ncp-3 ) return continuePrompt;
1595       strcpy(dynPrompt.dynamicPrompt, dynPrompt.zScannerAwaits);
1596       while( ndp<3 ) dynPrompt.dynamicPrompt[ndp++] = ' ';
1597       shell_strncpy(dynPrompt.dynamicPrompt+3, continuePrompt+3,
1598               PROMPT_LEN_MAX-4);
1599     }else{
1600       if( dynPrompt.inParenLevel>9 ){
1601         shell_strncpy(dynPrompt.dynamicPrompt, "(..", 4);
1602       }else if( dynPrompt.inParenLevel<0 ){
1603         shell_strncpy(dynPrompt.dynamicPrompt, ")x!", 4);
1604       }else{
1605         shell_strncpy(dynPrompt.dynamicPrompt, "(x.", 4);
1606         dynPrompt.dynamicPrompt[2] = (char)('0'+dynPrompt.inParenLevel);
1607       }
1608       shell_strncpy(dynPrompt.dynamicPrompt+3, continuePrompt+3,
1609                     PROMPT_LEN_MAX-4);
1610     }
1611   }
1612   return dynPrompt.dynamicPrompt;
1613 }
1614 #endif /* !defined(SQLITE_OMIT_DYNAPROMPT) */
1615 
1616 /* Indicate out-of-memory and exit. */
shell_out_of_memory(void)1617 static void shell_out_of_memory(void){
1618   eputz("Error: out of memory\n");
1619   exit(1);
1620 }
1621 
1622 /* Check a pointer to see if it is NULL.  If it is NULL, exit with an
1623 ** out-of-memory error.
1624 */
shell_check_oom(const void * p)1625 static void shell_check_oom(const void *p){
1626   if( p==0 ) shell_out_of_memory();
1627 }
1628 
1629 /*
1630 ** Write I/O traces to the following stream.
1631 */
1632 #ifdef SQLITE_ENABLE_IOTRACE
1633 static FILE *iotrace = 0;
1634 #endif
1635 
1636 /*
1637 ** This routine works like printf in that its first argument is a
1638 ** format string and subsequent arguments are values to be substituted
1639 ** in place of % fields.  The result of formatting this string
1640 ** is written to iotrace.
1641 */
1642 #ifdef SQLITE_ENABLE_IOTRACE
iotracePrintf(const char * zFormat,...)1643 static void SQLITE_CDECL iotracePrintf(const char *zFormat, ...){
1644   va_list ap;
1645   char *z;
1646   if( iotrace==0 ) return;
1647   va_start(ap, zFormat);
1648   z = sqlite3_vmprintf(zFormat, ap);
1649   va_end(ap);
1650   sputf(iotrace, "%s", z);
1651   sqlite3_free(z);
1652 }
1653 #endif
1654 
1655 /*
1656 ** Output string zUtf to Out stream as w characters.  If w is negative,
1657 ** then right-justify the text.  W is the width in UTF-8 characters, not
1658 ** in bytes.  This is different from the %*.*s specification in printf
1659 ** since with %*.*s the width is measured in bytes, not characters.
1660 */
utf8_width_print(int w,const char * zUtf)1661 static void utf8_width_print(int w, const char *zUtf){
1662   int i;
1663   int n;
1664   int aw = w<0 ? -w : w;
1665   if( zUtf==0 ) zUtf = "";
1666   for(i=n=0; zUtf[i]; i++){
1667     if( (zUtf[i]&0xc0)!=0x80 ){
1668       n++;
1669       if( n==aw ){
1670         do{ i++; }while( (zUtf[i]&0xc0)==0x80 );
1671         break;
1672       }
1673     }
1674   }
1675   if( n>=aw ){
1676     oputf("%.*s", i, zUtf);
1677   }else if( w<0 ){
1678     oputf("%*s%s", aw-n, "", zUtf);
1679   }else{
1680     oputf("%s%*s", zUtf, aw-n, "");
1681   }
1682 }
1683 
1684 
1685 /*
1686 ** Determines if a string is a number of not.
1687 */
isNumber(const char * z,int * realnum)1688 static int isNumber(const char *z, int *realnum){
1689   if( *z=='-' || *z=='+' ) z++;
1690   if( !IsDigit(*z) ){
1691     return 0;
1692   }
1693   z++;
1694   if( realnum ) *realnum = 0;
1695   while( IsDigit(*z) ){ z++; }
1696   if( *z=='.' ){
1697     z++;
1698     if( !IsDigit(*z) ) return 0;
1699     while( IsDigit(*z) ){ z++; }
1700     if( realnum ) *realnum = 1;
1701   }
1702   if( *z=='e' || *z=='E' ){
1703     z++;
1704     if( *z=='+' || *z=='-' ) z++;
1705     if( !IsDigit(*z) ) return 0;
1706     while( IsDigit(*z) ){ z++; }
1707     if( realnum ) *realnum = 1;
1708   }
1709   return *z==0;
1710 }
1711 
1712 /*
1713 ** Compute a string length that is limited to what can be stored in
1714 ** lower 30 bits of a 32-bit signed integer.
1715 */
strlen30(const char * z)1716 static int strlen30(const char *z){
1717   const char *z2 = z;
1718   while( *z2 ){ z2++; }
1719   return 0x3fffffff & (int)(z2 - z);
1720 }
1721 
1722 /*
1723 ** Return the length of a string in characters.  Multibyte UTF8 characters
1724 ** count as a single character.
1725 */
strlenChar(const char * z)1726 static int strlenChar(const char *z){
1727   int n = 0;
1728   while( *z ){
1729     if( (0xc0&*(z++))!=0x80 ) n++;
1730   }
1731   return n;
1732 }
1733 
1734 /*
1735 ** Return open FILE * if zFile exists, can be opened for read
1736 ** and is an ordinary file or a character stream source.
1737 ** Otherwise return 0.
1738 */
openChrSource(const char * zFile)1739 static FILE * openChrSource(const char *zFile){
1740 #if defined(_WIN32) || defined(WIN32)
1741   struct __stat64 x = {0};
1742 # define STAT_CHR_SRC(mode) ((mode & (_S_IFCHR|_S_IFIFO|_S_IFREG))!=0)
1743   /* On Windows, open first, then check the stream nature. This order
1744   ** is necessary because _stat() and sibs, when checking a named pipe,
1745   ** effectively break the pipe as its supplier sees it. */
1746   FILE *rv = fopen(zFile, "rb");
1747   if( rv==0 ) return 0;
1748   if( _fstat64(_fileno(rv), &x) != 0
1749       || !STAT_CHR_SRC(x.st_mode)){
1750     fclose(rv);
1751     rv = 0;
1752   }
1753   return rv;
1754 #else
1755   struct stat x = {0};
1756   int rc = stat(zFile, &x);
1757 # define STAT_CHR_SRC(mode) (S_ISREG(mode)||S_ISFIFO(mode)||S_ISCHR(mode))
1758   if( rc!=0 ) return 0;
1759   if( STAT_CHR_SRC(x.st_mode) ){
1760     return fopen(zFile, "rb");
1761   }else{
1762     return 0;
1763   }
1764 #endif
1765 #undef STAT_CHR_SRC
1766 }
1767 
1768 /*
1769 ** This routine reads a line of text from FILE in, stores
1770 ** the text in memory obtained from malloc() and returns a pointer
1771 ** to the text.  NULL is returned at end of file, or if malloc()
1772 ** fails.
1773 **
1774 ** If zLine is not NULL then it is a malloced buffer returned from
1775 ** a previous call to this routine that may be reused.
1776 */
local_getline(char * zLine,FILE * in)1777 static char *local_getline(char *zLine, FILE *in){
1778   int nLine = zLine==0 ? 0 : 100;
1779   int n = 0;
1780 
1781   while( 1 ){
1782     if( n+100>nLine ){
1783       nLine = nLine*2 + 100;
1784       zLine = realloc(zLine, nLine);
1785       shell_check_oom(zLine);
1786     }
1787     if( fgets(&zLine[n], nLine - n, in)==0 ){
1788       if( n==0 ){
1789         free(zLine);
1790         return 0;
1791       }
1792       zLine[n] = 0;
1793       break;
1794     }
1795     while( zLine[n] ) n++;
1796     if( n>0 && zLine[n-1]=='\n' ){
1797       n--;
1798       if( n>0 && zLine[n-1]=='\r' ) n--;
1799       zLine[n] = 0;
1800       break;
1801     }
1802   }
1803   return zLine;
1804 }
1805 
1806 /*
1807 ** Retrieve a single line of input text.
1808 **
1809 ** If in==0 then read from standard input and prompt before each line.
1810 ** If isContinuation is true, then a continuation prompt is appropriate.
1811 ** If isContinuation is zero, then the main prompt should be used.
1812 **
1813 ** If zPrior is not NULL then it is a buffer from a prior call to this
1814 ** routine that can be reused.
1815 **
1816 ** The result is stored in space obtained from malloc() and must either
1817 ** be freed by the caller or else passed back into this routine via the
1818 ** zPrior argument for reuse.
1819 */
1820 #ifndef SQLITE_SHELL_FIDDLE
one_input_line(FILE * in,char * zPrior,int isContinuation)1821 static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
1822   char *zPrompt;
1823   char *zResult;
1824   if( in!=0 ){
1825     zResult = local_getline(zPrior, in);
1826   }else{
1827     zPrompt = isContinuation ? CONTINUATION_PROMPT : mainPrompt;
1828 #if SHELL_USE_LOCAL_GETLINE
1829     sputz(stdout, zPrompt);
1830     fflush(stdout);
1831     do{
1832       zResult = local_getline(zPrior, stdin);
1833       zPrior = 0;
1834       /* ^C trap creates a false EOF, so let "interrupt" thread catch up. */
1835       if( zResult==0 ) sqlite3_sleep(50);
1836     }while( zResult==0 && seenInterrupt>0 );
1837 #else
1838     free(zPrior);
1839     zResult = shell_readline(zPrompt);
1840     while( zResult==0 ){
1841       /* ^C trap creates a false EOF, so let "interrupt" thread catch up. */
1842       sqlite3_sleep(50);
1843       if( seenInterrupt==0 ) break;
1844       zResult = shell_readline("");
1845     }
1846     if( zResult && *zResult ) shell_add_history(zResult);
1847 #endif
1848   }
1849   return zResult;
1850 }
1851 #endif /* !SQLITE_SHELL_FIDDLE */
1852 
1853 /*
1854 ** Return the value of a hexadecimal digit.  Return -1 if the input
1855 ** is not a hex digit.
1856 */
hexDigitValue(char c)1857 static int hexDigitValue(char c){
1858   if( c>='0' && c<='9' ) return c - '0';
1859   if( c>='a' && c<='f' ) return c - 'a' + 10;
1860   if( c>='A' && c<='F' ) return c - 'A' + 10;
1861   return -1;
1862 }
1863 
1864 /*
1865 ** Interpret zArg as an integer value, possibly with suffixes.
1866 */
integerValue(const char * zArg)1867 static sqlite3_int64 integerValue(const char *zArg){
1868   sqlite3_int64 v = 0;
1869   static const struct { char *zSuffix; int iMult; } aMult[] = {
1870     { "KiB", 1024 },
1871     { "MiB", 1024*1024 },
1872     { "GiB", 1024*1024*1024 },
1873     { "KB",  1000 },
1874     { "MB",  1000000 },
1875     { "GB",  1000000000 },
1876     { "K",   1000 },
1877     { "M",   1000000 },
1878     { "G",   1000000000 },
1879   };
1880   int i;
1881   int isNeg = 0;
1882   if( zArg[0]=='-' ){
1883     isNeg = 1;
1884     zArg++;
1885   }else if( zArg[0]=='+' ){
1886     zArg++;
1887   }
1888   if( zArg[0]=='0' && zArg[1]=='x' ){
1889     int x;
1890     zArg += 2;
1891     while( (x = hexDigitValue(zArg[0]))>=0 ){
1892       v = (v<<4) + x;
1893       zArg++;
1894     }
1895   }else{
1896     while( IsDigit(zArg[0]) ){
1897       v = v*10 + zArg[0] - '0';
1898       zArg++;
1899     }
1900   }
1901   for(i=0; i<ArraySize(aMult); i++){
1902     if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
1903       v *= aMult[i].iMult;
1904       break;
1905     }
1906   }
1907   return isNeg? -v : v;
1908 }
1909 
1910 /*
1911 ** A variable length string to which one can append text.
1912 */
1913 typedef struct ShellText ShellText;
1914 struct ShellText {
1915   char *z;
1916   int n;
1917   int nAlloc;
1918 };
1919 
1920 /*
1921 ** Initialize and destroy a ShellText object
1922 */
initText(ShellText * p)1923 static void initText(ShellText *p){
1924   memset(p, 0, sizeof(*p));
1925 }
freeText(ShellText * p)1926 static void freeText(ShellText *p){
1927   free(p->z);
1928   initText(p);
1929 }
1930 
1931 /* zIn is either a pointer to a NULL-terminated string in memory obtained
1932 ** from malloc(), or a NULL pointer. The string pointed to by zAppend is
1933 ** added to zIn, and the result returned in memory obtained from malloc().
1934 ** zIn, if it was not NULL, is freed.
1935 **
1936 ** If the third argument, quote, is not '\0', then it is used as a
1937 ** quote character for zAppend.
1938 */
appendText(ShellText * p,const char * zAppend,char quote)1939 static void appendText(ShellText *p, const char *zAppend, char quote){
1940   i64 len;
1941   i64 i;
1942   i64 nAppend = strlen30(zAppend);
1943 
1944   len = nAppend+p->n+1;
1945   if( quote ){
1946     len += 2;
1947     for(i=0; i<nAppend; i++){
1948       if( zAppend[i]==quote ) len++;
1949     }
1950   }
1951 
1952   if( p->z==0 || p->n+len>=p->nAlloc ){
1953     p->nAlloc = p->nAlloc*2 + len + 20;
1954     p->z = realloc(p->z, p->nAlloc);
1955     shell_check_oom(p->z);
1956   }
1957 
1958   if( quote ){
1959     char *zCsr = p->z+p->n;
1960     *zCsr++ = quote;
1961     for(i=0; i<nAppend; i++){
1962       *zCsr++ = zAppend[i];
1963       if( zAppend[i]==quote ) *zCsr++ = quote;
1964     }
1965     *zCsr++ = quote;
1966     p->n = (int)(zCsr - p->z);
1967     *zCsr = '\0';
1968   }else{
1969     memcpy(p->z+p->n, zAppend, nAppend);
1970     p->n += nAppend;
1971     p->z[p->n] = '\0';
1972   }
1973 }
1974 
1975 /*
1976 ** Attempt to determine if identifier zName needs to be quoted, either
1977 ** because it contains non-alphanumeric characters, or because it is an
1978 ** SQLite keyword.  Be conservative in this estimate:  When in doubt assume
1979 ** that quoting is required.
1980 **
1981 ** Return '"' if quoting is required.  Return 0 if no quoting is required.
1982 */
quoteChar(const char * zName)1983 static char quoteChar(const char *zName){
1984   int i;
1985   if( zName==0 ) return '"';
1986   if( !isalpha((unsigned char)zName[0]) && zName[0]!='_' ) return '"';
1987   for(i=0; zName[i]; i++){
1988     if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ) return '"';
1989   }
1990   return sqlite3_keyword_check(zName, i) ? '"' : 0;
1991 }
1992 
1993 /*
1994 ** Construct a fake object name and column list to describe the structure
1995 ** of the view, virtual table, or table valued function zSchema.zName.
1996 */
shellFakeSchema(sqlite3 * db,const char * zSchema,const char * zName)1997 static char *shellFakeSchema(
1998   sqlite3 *db,            /* The database connection containing the vtab */
1999   const char *zSchema,    /* Schema of the database holding the vtab */
2000   const char *zName       /* The name of the virtual table */
2001 ){
2002   sqlite3_stmt *pStmt = 0;
2003   char *zSql;
2004   ShellText s;
2005   char cQuote;
2006   char *zDiv = "(";
2007   int nRow = 0;
2008 
2009   zSql = sqlite3_mprintf("PRAGMA \"%w\".table_info=%Q;",
2010                          zSchema ? zSchema : "main", zName);
2011   shell_check_oom(zSql);
2012   sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
2013   sqlite3_free(zSql);
2014   initText(&s);
2015   if( zSchema ){
2016     cQuote = quoteChar(zSchema);
2017     if( cQuote && sqlite3_stricmp(zSchema,"temp")==0 ) cQuote = 0;
2018     appendText(&s, zSchema, cQuote);
2019     appendText(&s, ".", 0);
2020   }
2021   cQuote = quoteChar(zName);
2022   appendText(&s, zName, cQuote);
2023   while( sqlite3_step(pStmt)==SQLITE_ROW ){
2024     const char *zCol = (const char*)sqlite3_column_text(pStmt, 1);
2025     nRow++;
2026     appendText(&s, zDiv, 0);
2027     zDiv = ",";
2028     if( zCol==0 ) zCol = "";
2029     cQuote = quoteChar(zCol);
2030     appendText(&s, zCol, cQuote);
2031   }
2032   appendText(&s, ")", 0);
2033   sqlite3_finalize(pStmt);
2034   if( nRow==0 ){
2035     freeText(&s);
2036     s.z = 0;
2037   }
2038   return s.z;
2039 }
2040 
2041 /*
2042 ** SQL function:  strtod(X)
2043 **
2044 ** Use the C-library strtod() function to convert string X into a double.
2045 ** Used for comparing the accuracy of SQLite's internal text-to-float conversion
2046 ** routines against the C-library.
2047 */
shellStrtod(sqlite3_context * pCtx,int nVal,sqlite3_value ** apVal)2048 static void shellStrtod(
2049   sqlite3_context *pCtx,
2050   int nVal,
2051   sqlite3_value **apVal
2052 ){
2053   char *z = (char*)sqlite3_value_text(apVal[0]);
2054   UNUSED_PARAMETER(nVal);
2055   if( z==0 ) return;
2056   sqlite3_result_double(pCtx, strtod(z,0));
2057 }
2058 
2059 /*
2060 ** SQL function:  dtostr(X)
2061 **
2062 ** Use the C-library printf() function to convert real value X into a string.
2063 ** Used for comparing the accuracy of SQLite's internal float-to-text conversion
2064 ** routines against the C-library.
2065 */
shellDtostr(sqlite3_context * pCtx,int nVal,sqlite3_value ** apVal)2066 static void shellDtostr(
2067   sqlite3_context *pCtx,
2068   int nVal,
2069   sqlite3_value **apVal
2070 ){
2071   double r = sqlite3_value_double(apVal[0]);
2072   int n = nVal>=2 ? sqlite3_value_int(apVal[1]) : 26;
2073   char z[400];
2074   if( n<1 ) n = 1;
2075   if( n>350 ) n = 350;
2076   sqlite3_snprintf(sizeof(z), z, "%#+.*e", n, r);
2077   sqlite3_result_text(pCtx, z, -1, SQLITE_TRANSIENT);
2078 }
2079 
2080 
2081 /*
2082 ** SQL function:  shell_module_schema(X)
2083 **
2084 ** Return a fake schema for the table-valued function or eponymous virtual
2085 ** table X.
2086 */
shellModuleSchema(sqlite3_context * pCtx,int nVal,sqlite3_value ** apVal)2087 static void shellModuleSchema(
2088   sqlite3_context *pCtx,
2089   int nVal,
2090   sqlite3_value **apVal
2091 ){
2092   const char *zName;
2093   char *zFake;
2094   UNUSED_PARAMETER(nVal);
2095   zName = (const char*)sqlite3_value_text(apVal[0]);
2096   zFake = zName? shellFakeSchema(sqlite3_context_db_handle(pCtx), 0, zName) : 0;
2097   if( zFake ){
2098     sqlite3_result_text(pCtx, sqlite3_mprintf("/* %s */", zFake),
2099                         -1, sqlite3_free);
2100     free(zFake);
2101   }
2102 }
2103 
2104 /*
2105 ** SQL function:  shell_add_schema(S,X)
2106 **
2107 ** Add the schema name X to the CREATE statement in S and return the result.
2108 ** Examples:
2109 **
2110 **    CREATE TABLE t1(x)   ->   CREATE TABLE xyz.t1(x);
2111 **
2112 ** Also works on
2113 **
2114 **    CREATE INDEX
2115 **    CREATE UNIQUE INDEX
2116 **    CREATE VIEW
2117 **    CREATE TRIGGER
2118 **    CREATE VIRTUAL TABLE
2119 **
2120 ** This UDF is used by the .schema command to insert the schema name of
2121 ** attached databases into the middle of the sqlite_schema.sql field.
2122 */
shellAddSchemaName(sqlite3_context * pCtx,int nVal,sqlite3_value ** apVal)2123 static void shellAddSchemaName(
2124   sqlite3_context *pCtx,
2125   int nVal,
2126   sqlite3_value **apVal
2127 ){
2128   static const char *aPrefix[] = {
2129      "TABLE",
2130      "INDEX",
2131      "UNIQUE INDEX",
2132      "VIEW",
2133      "TRIGGER",
2134      "VIRTUAL TABLE"
2135   };
2136   int i = 0;
2137   const char *zIn = (const char*)sqlite3_value_text(apVal[0]);
2138   const char *zSchema = (const char*)sqlite3_value_text(apVal[1]);
2139   const char *zName = (const char*)sqlite3_value_text(apVal[2]);
2140   sqlite3 *db = sqlite3_context_db_handle(pCtx);
2141   UNUSED_PARAMETER(nVal);
2142   if( zIn!=0 && cli_strncmp(zIn, "CREATE ", 7)==0 ){
2143     for(i=0; i<ArraySize(aPrefix); i++){
2144       int n = strlen30(aPrefix[i]);
2145       if( cli_strncmp(zIn+7, aPrefix[i], n)==0 && zIn[n+7]==' ' ){
2146         char *z = 0;
2147         char *zFake = 0;
2148         if( zSchema ){
2149           char cQuote = quoteChar(zSchema);
2150           if( cQuote && sqlite3_stricmp(zSchema,"temp")!=0 ){
2151             z = sqlite3_mprintf("%.*s \"%w\".%s", n+7, zIn, zSchema, zIn+n+8);
2152           }else{
2153             z = sqlite3_mprintf("%.*s %s.%s", n+7, zIn, zSchema, zIn+n+8);
2154           }
2155         }
2156         if( zName
2157          && aPrefix[i][0]=='V'
2158          && (zFake = shellFakeSchema(db, zSchema, zName))!=0
2159         ){
2160           if( z==0 ){
2161             z = sqlite3_mprintf("%s\n/* %s */", zIn, zFake);
2162           }else{
2163             z = sqlite3_mprintf("%z\n/* %s */", z, zFake);
2164           }
2165           free(zFake);
2166         }
2167         if( z ){
2168           sqlite3_result_text(pCtx, z, -1, sqlite3_free);
2169           return;
2170         }
2171       }
2172     }
2173   }
2174   sqlite3_result_value(pCtx, apVal[0]);
2175 }
2176 
2177 /*
2178 ** The source code for several run-time loadable extensions is inserted
2179 ** below by the ../tool/mkshellc.tcl script.  Before processing that included
2180 ** code, we need to override some macros to make the included program code
2181 ** work here in the middle of this regular program.
2182 */
2183 #define SQLITE_EXTENSION_INIT1
2184 #define SQLITE_EXTENSION_INIT2(X) (void)(X)
2185 
2186 #if defined(_WIN32) && defined(_MSC_VER)
2187 /************************* Begin test_windirent.h ******************/
2188 /*
2189 ** 2015 November 30
2190 **
2191 ** The author disclaims copyright to this source code.  In place of
2192 ** a legal notice, here is a blessing:
2193 **
2194 **    May you do good and not evil.
2195 **    May you find forgiveness for yourself and forgive others.
2196 **    May you share freely, never taking more than you give.
2197 **
2198 *************************************************************************
2199 ** This file contains declarations for most of the opendir() family of
2200 ** POSIX functions on Win32 using the MSVCRT.
2201 */
2202 
2203 #if defined(_WIN32) && defined(_MSC_VER) && !defined(SQLITE_WINDIRENT_H)
2204 #define SQLITE_WINDIRENT_H
2205 
2206 /*
2207 ** We need several data types from the Windows SDK header.
2208 */
2209 
2210 #ifndef WIN32_LEAN_AND_MEAN
2211 #define WIN32_LEAN_AND_MEAN
2212 #endif
2213 
2214 #include "windows.h"
2215 
2216 /*
2217 ** We need several support functions from the SQLite core.
2218 */
2219 
2220 /* #include "sqlite3.h" */
2221 
2222 /*
2223 ** We need several things from the ANSI and MSVCRT headers.
2224 */
2225 
2226 #include <stdio.h>
2227 #include <stdlib.h>
2228 #include <errno.h>
2229 #include <io.h>
2230 #include <limits.h>
2231 #include <sys/types.h>
2232 #include <sys/stat.h>
2233 
2234 /*
2235 ** We may need several defines that should have been in "sys/stat.h".
2236 */
2237 
2238 #ifndef S_ISREG
2239 #define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG)
2240 #endif
2241 
2242 #ifndef S_ISDIR
2243 #define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
2244 #endif
2245 
2246 #ifndef S_ISLNK
2247 #define S_ISLNK(mode) (0)
2248 #endif
2249 
2250 /*
2251 ** We may need to provide the "mode_t" type.
2252 */
2253 
2254 #ifndef MODE_T_DEFINED
2255   #define MODE_T_DEFINED
2256   typedef unsigned short mode_t;
2257 #endif
2258 
2259 /*
2260 ** We may need to provide the "ino_t" type.
2261 */
2262 
2263 #ifndef INO_T_DEFINED
2264   #define INO_T_DEFINED
2265   typedef unsigned short ino_t;
2266 #endif
2267 
2268 /*
2269 ** We need to define "NAME_MAX" if it was not present in "limits.h".
2270 */
2271 
2272 #ifndef NAME_MAX
2273 #  ifdef FILENAME_MAX
2274 #    define NAME_MAX (FILENAME_MAX)
2275 #  else
2276 #    define NAME_MAX (260)
2277 #  endif
2278 #endif
2279 
2280 /*
2281 ** We need to define "NULL_INTPTR_T" and "BAD_INTPTR_T".
2282 */
2283 
2284 #ifndef NULL_INTPTR_T
2285 #  define NULL_INTPTR_T ((intptr_t)(0))
2286 #endif
2287 
2288 #ifndef BAD_INTPTR_T
2289 #  define BAD_INTPTR_T ((intptr_t)(-1))
2290 #endif
2291 
2292 /*
2293 ** We need to provide the necessary structures and related types.
2294 */
2295 
2296 #ifndef DIRENT_DEFINED
2297 #define DIRENT_DEFINED
2298 typedef struct DIRENT DIRENT;
2299 typedef DIRENT *LPDIRENT;
2300 struct DIRENT {
2301   ino_t d_ino;               /* Sequence number, do not use. */
2302   unsigned d_attributes;     /* Win32 file attributes. */
2303   char d_name[NAME_MAX + 1]; /* Name within the directory. */
2304 };
2305 #endif
2306 
2307 #ifndef DIR_DEFINED
2308 #define DIR_DEFINED
2309 typedef struct DIR DIR;
2310 typedef DIR *LPDIR;
2311 struct DIR {
2312   intptr_t d_handle; /* Value returned by "_findfirst". */
2313   DIRENT d_first;    /* DIRENT constructed based on "_findfirst". */
2314   DIRENT d_next;     /* DIRENT constructed based on "_findnext". */
2315 };
2316 #endif
2317 
2318 /*
2319 ** Provide a macro, for use by the implementation, to determine if a
2320 ** particular directory entry should be skipped over when searching for
2321 ** the next directory entry that should be returned by the readdir() or
2322 ** readdir_r() functions.
2323 */
2324 
2325 #ifndef is_filtered
2326 #  define is_filtered(a) ((((a).attrib)&_A_HIDDEN) || (((a).attrib)&_A_SYSTEM))
2327 #endif
2328 
2329 /*
2330 ** Provide the function prototype for the POSIX compatible getenv()
2331 ** function.  This function is not thread-safe.
2332 */
2333 
2334 extern const char *windirent_getenv(const char *name);
2335 
2336 /*
2337 ** Finally, we can provide the function prototypes for the opendir(),
2338 ** readdir(), readdir_r(), and closedir() POSIX functions.
2339 */
2340 
2341 extern LPDIR opendir(const char *dirname);
2342 extern LPDIRENT readdir(LPDIR dirp);
2343 extern INT readdir_r(LPDIR dirp, LPDIRENT entry, LPDIRENT *result);
2344 extern INT closedir(LPDIR dirp);
2345 
2346 #endif /* defined(WIN32) && defined(_MSC_VER) */
2347 
2348 /************************* End test_windirent.h ********************/
2349 /************************* Begin test_windirent.c ******************/
2350 /*
2351 ** 2015 November 30
2352 **
2353 ** The author disclaims copyright to this source code.  In place of
2354 ** a legal notice, here is a blessing:
2355 **
2356 **    May you do good and not evil.
2357 **    May you find forgiveness for yourself and forgive others.
2358 **    May you share freely, never taking more than you give.
2359 **
2360 *************************************************************************
2361 ** This file contains code to implement most of the opendir() family of
2362 ** POSIX functions on Win32 using the MSVCRT.
2363 */
2364 
2365 #if defined(_WIN32) && defined(_MSC_VER)
2366 /* #include "test_windirent.h" */
2367 
2368 /*
2369 ** Implementation of the POSIX getenv() function using the Win32 API.
2370 ** This function is not thread-safe.
2371 */
windirent_getenv(const char * name)2372 const char *windirent_getenv(
2373   const char *name
2374 ){
2375   static char value[32768]; /* Maximum length, per MSDN */
2376   DWORD dwSize = sizeof(value) / sizeof(char); /* Size in chars */
2377   DWORD dwRet; /* Value returned by GetEnvironmentVariableA() */
2378 
2379   memset(value, 0, sizeof(value));
2380   dwRet = GetEnvironmentVariableA(name, value, dwSize);
2381   if( dwRet==0 || dwRet>dwSize ){
2382     /*
2383     ** The function call to GetEnvironmentVariableA() failed -OR-
2384     ** the buffer is not large enough.  Either way, return NULL.
2385     */
2386     return 0;
2387   }else{
2388     /*
2389     ** The function call to GetEnvironmentVariableA() succeeded
2390     ** -AND- the buffer contains the entire value.
2391     */
2392     return value;
2393   }
2394 }
2395 
2396 /*
2397 ** Implementation of the POSIX opendir() function using the MSVCRT.
2398 */
opendir(const char * dirname)2399 LPDIR opendir(
2400   const char *dirname
2401 ){
2402   struct _finddata_t data;
2403   LPDIR dirp = (LPDIR)sqlite3_malloc(sizeof(DIR));
2404   SIZE_T namesize = sizeof(data.name) / sizeof(data.name[0]);
2405 
2406   if( dirp==NULL ) return NULL;
2407   memset(dirp, 0, sizeof(DIR));
2408 
2409   /* TODO: Remove this if Unix-style root paths are not used. */
2410   if( sqlite3_stricmp(dirname, "/")==0 ){
2411     dirname = windirent_getenv("SystemDrive");
2412   }
2413 
2414   memset(&data, 0, sizeof(struct _finddata_t));
2415   _snprintf(data.name, namesize, "%s\\*", dirname);
2416   dirp->d_handle = _findfirst(data.name, &data);
2417 
2418   if( dirp->d_handle==BAD_INTPTR_T ){
2419     closedir(dirp);
2420     return NULL;
2421   }
2422 
2423   /* TODO: Remove this block to allow hidden and/or system files. */
2424   if( is_filtered(data) ){
2425 next:
2426 
2427     memset(&data, 0, sizeof(struct _finddata_t));
2428     if( _findnext(dirp->d_handle, &data)==-1 ){
2429       closedir(dirp);
2430       return NULL;
2431     }
2432 
2433     /* TODO: Remove this block to allow hidden and/or system files. */
2434     if( is_filtered(data) ) goto next;
2435   }
2436 
2437   dirp->d_first.d_attributes = data.attrib;
2438   strncpy(dirp->d_first.d_name, data.name, NAME_MAX);
2439   dirp->d_first.d_name[NAME_MAX] = '\0';
2440 
2441   return dirp;
2442 }
2443 
2444 /*
2445 ** Implementation of the POSIX readdir() function using the MSVCRT.
2446 */
readdir(LPDIR dirp)2447 LPDIRENT readdir(
2448   LPDIR dirp
2449 ){
2450   struct _finddata_t data;
2451 
2452   if( dirp==NULL ) return NULL;
2453 
2454   if( dirp->d_first.d_ino==0 ){
2455     dirp->d_first.d_ino++;
2456     dirp->d_next.d_ino++;
2457 
2458     return &dirp->d_first;
2459   }
2460 
2461 next:
2462 
2463   memset(&data, 0, sizeof(struct _finddata_t));
2464   if( _findnext(dirp->d_handle, &data)==-1 ) return NULL;
2465 
2466   /* TODO: Remove this block to allow hidden and/or system files. */
2467   if( is_filtered(data) ) goto next;
2468 
2469   dirp->d_next.d_ino++;
2470   dirp->d_next.d_attributes = data.attrib;
2471   strncpy(dirp->d_next.d_name, data.name, NAME_MAX);
2472   dirp->d_next.d_name[NAME_MAX] = '\0';
2473 
2474   return &dirp->d_next;
2475 }
2476 
2477 /*
2478 ** Implementation of the POSIX readdir_r() function using the MSVCRT.
2479 */
readdir_r(LPDIR dirp,LPDIRENT entry,LPDIRENT * result)2480 INT readdir_r(
2481   LPDIR dirp,
2482   LPDIRENT entry,
2483   LPDIRENT *result
2484 ){
2485   struct _finddata_t data;
2486 
2487   if( dirp==NULL ) return EBADF;
2488 
2489   if( dirp->d_first.d_ino==0 ){
2490     dirp->d_first.d_ino++;
2491     dirp->d_next.d_ino++;
2492 
2493     entry->d_ino = dirp->d_first.d_ino;
2494     entry->d_attributes = dirp->d_first.d_attributes;
2495     strncpy(entry->d_name, dirp->d_first.d_name, NAME_MAX);
2496     entry->d_name[NAME_MAX] = '\0';
2497 
2498     *result = entry;
2499     return 0;
2500   }
2501 
2502 next:
2503 
2504   memset(&data, 0, sizeof(struct _finddata_t));
2505   if( _findnext(dirp->d_handle, &data)==-1 ){
2506     *result = NULL;
2507     return ENOENT;
2508   }
2509 
2510   /* TODO: Remove this block to allow hidden and/or system files. */
2511   if( is_filtered(data) ) goto next;
2512 
2513   entry->d_ino = (ino_t)-1; /* not available */
2514   entry->d_attributes = data.attrib;
2515   strncpy(entry->d_name, data.name, NAME_MAX);
2516   entry->d_name[NAME_MAX] = '\0';
2517 
2518   *result = entry;
2519   return 0;
2520 }
2521 
2522 /*
2523 ** Implementation of the POSIX closedir() function using the MSVCRT.
2524 */
closedir(LPDIR dirp)2525 INT closedir(
2526   LPDIR dirp
2527 ){
2528   INT result = 0;
2529 
2530   if( dirp==NULL ) return EINVAL;
2531 
2532   if( dirp->d_handle!=NULL_INTPTR_T && dirp->d_handle!=BAD_INTPTR_T ){
2533     result = _findclose(dirp->d_handle);
2534   }
2535 
2536   sqlite3_free(dirp);
2537   return result;
2538 }
2539 
2540 #endif /* defined(WIN32) && defined(_MSC_VER) */
2541 
2542 /************************* End test_windirent.c ********************/
2543 #define dirent DIRENT
2544 #endif
2545 /************************* Begin ../ext/misc/memtrace.c ******************/
2546 /*
2547 ** 2019-01-21
2548 **
2549 ** The author disclaims copyright to this source code.  In place of
2550 ** a legal notice, here is a blessing:
2551 **
2552 **    May you do good and not evil.
2553 **    May you find forgiveness for yourself and forgive others.
2554 **    May you share freely, never taking more than you give.
2555 **
2556 *************************************************************************
2557 **
2558 ** This file implements an extension that uses the SQLITE_CONFIG_MALLOC
2559 ** mechanism to add a tracing layer on top of SQLite.  If this extension
2560 ** is registered prior to sqlite3_initialize(), it will cause all memory
2561 ** allocation activities to be logged on standard output, or to some other
2562 ** FILE specified by the initializer.
2563 **
2564 ** This file needs to be compiled into the application that uses it.
2565 **
2566 ** This extension is used to implement the --memtrace option of the
2567 ** command-line shell.
2568 */
2569 #include <assert.h>
2570 #include <string.h>
2571 #include <stdio.h>
2572 
2573 /* The original memory allocation routines */
2574 static sqlite3_mem_methods memtraceBase;
2575 static FILE *memtraceOut;
2576 
2577 /* Methods that trace memory allocations */
memtraceMalloc(int n)2578 static void *memtraceMalloc(int n){
2579   if( memtraceOut ){
2580     fprintf(memtraceOut, "MEMTRACE: allocate %d bytes\n",
2581             memtraceBase.xRoundup(n));
2582   }
2583   return memtraceBase.xMalloc(n);
2584 }
memtraceFree(void * p)2585 static void memtraceFree(void *p){
2586   if( p==0 ) return;
2587   if( memtraceOut ){
2588     fprintf(memtraceOut, "MEMTRACE: free %d bytes\n", memtraceBase.xSize(p));
2589   }
2590   memtraceBase.xFree(p);
2591 }
memtraceRealloc(void * p,int n)2592 static void *memtraceRealloc(void *p, int n){
2593   if( p==0 ) return memtraceMalloc(n);
2594   if( n==0 ){
2595     memtraceFree(p);
2596     return 0;
2597   }
2598   if( memtraceOut ){
2599     fprintf(memtraceOut, "MEMTRACE: resize %d -> %d bytes\n",
2600             memtraceBase.xSize(p), memtraceBase.xRoundup(n));
2601   }
2602   return memtraceBase.xRealloc(p, n);
2603 }
memtraceSize(void * p)2604 static int memtraceSize(void *p){
2605   return memtraceBase.xSize(p);
2606 }
memtraceRoundup(int n)2607 static int memtraceRoundup(int n){
2608   return memtraceBase.xRoundup(n);
2609 }
memtraceInit(void * p)2610 static int memtraceInit(void *p){
2611   return memtraceBase.xInit(p);
2612 }
memtraceShutdown(void * p)2613 static void memtraceShutdown(void *p){
2614   memtraceBase.xShutdown(p);
2615 }
2616 
2617 /* The substitute memory allocator */
2618 static sqlite3_mem_methods ersaztMethods = {
2619   memtraceMalloc,
2620   memtraceFree,
2621   memtraceRealloc,
2622   memtraceSize,
2623   memtraceRoundup,
2624   memtraceInit,
2625   memtraceShutdown,
2626   0
2627 };
2628 
2629 /* Begin tracing memory allocations to out. */
sqlite3MemTraceActivate(FILE * out)2630 int sqlite3MemTraceActivate(FILE *out){
2631   int rc = SQLITE_OK;
2632   if( memtraceBase.xMalloc==0 ){
2633     rc = sqlite3_config(SQLITE_CONFIG_GETMALLOC, &memtraceBase);
2634     if( rc==SQLITE_OK ){
2635       rc = sqlite3_config(SQLITE_CONFIG_MALLOC, &ersaztMethods);
2636     }
2637   }
2638   memtraceOut = out;
2639   return rc;
2640 }
2641 
2642 /* Deactivate memory tracing */
sqlite3MemTraceDeactivate(void)2643 int sqlite3MemTraceDeactivate(void){
2644   int rc = SQLITE_OK;
2645   if( memtraceBase.xMalloc!=0 ){
2646     rc = sqlite3_config(SQLITE_CONFIG_MALLOC, &memtraceBase);
2647     if( rc==SQLITE_OK ){
2648       memset(&memtraceBase, 0, sizeof(memtraceBase));
2649     }
2650   }
2651   memtraceOut = 0;
2652   return rc;
2653 }
2654 
2655 /************************* End ../ext/misc/memtrace.c ********************/
2656 /************************* Begin ../ext/misc/pcachetrace.c ******************/
2657 /*
2658 ** 2023-06-21
2659 **
2660 ** The author disclaims copyright to this source code.  In place of
2661 ** a legal notice, here is a blessing:
2662 **
2663 **    May you do good and not evil.
2664 **    May you find forgiveness for yourself and forgive others.
2665 **    May you share freely, never taking more than you give.
2666 **
2667 *************************************************************************
2668 **
2669 ** This file implements an extension that uses the SQLITE_CONFIG_PCACHE2
2670 ** mechanism to add a tracing layer on top of pluggable page cache of
2671 ** SQLite.  If this extension is registered prior to sqlite3_initialize(),
2672 ** it will cause all page cache activities to be logged on standard output,
2673 ** or to some other FILE specified by the initializer.
2674 **
2675 ** This file needs to be compiled into the application that uses it.
2676 **
2677 ** This extension is used to implement the --pcachetrace option of the
2678 ** command-line shell.
2679 */
2680 #include <assert.h>
2681 #include <string.h>
2682 #include <stdio.h>
2683 
2684 /* The original page cache routines */
2685 static sqlite3_pcache_methods2 pcacheBase;
2686 static FILE *pcachetraceOut;
2687 
2688 /* Methods that trace pcache activity */
pcachetraceInit(void * pArg)2689 static int pcachetraceInit(void *pArg){
2690   int nRes;
2691   if( pcachetraceOut ){
2692     fprintf(pcachetraceOut, "PCACHETRACE: xInit(%p)\n", pArg);
2693   }
2694   nRes = pcacheBase.xInit(pArg);
2695   if( pcachetraceOut ){
2696     fprintf(pcachetraceOut, "PCACHETRACE: xInit(%p) -> %d\n", pArg, nRes);
2697   }
2698   return nRes;
2699 }
pcachetraceShutdown(void * pArg)2700 static void pcachetraceShutdown(void *pArg){
2701   if( pcachetraceOut ){
2702     fprintf(pcachetraceOut, "PCACHETRACE: xShutdown(%p)\n", pArg);
2703   }
2704   pcacheBase.xShutdown(pArg);
2705 }
pcachetraceCreate(int szPage,int szExtra,int bPurge)2706 static sqlite3_pcache *pcachetraceCreate(int szPage, int szExtra, int bPurge){
2707   sqlite3_pcache *pRes;
2708   if( pcachetraceOut ){
2709     fprintf(pcachetraceOut, "PCACHETRACE: xCreate(%d,%d,%d)\n",
2710             szPage, szExtra, bPurge);
2711   }
2712   pRes = pcacheBase.xCreate(szPage, szExtra, bPurge);
2713   if( pcachetraceOut ){
2714     fprintf(pcachetraceOut, "PCACHETRACE: xCreate(%d,%d,%d) -> %p\n",
2715             szPage, szExtra, bPurge, pRes);
2716   }
2717   return pRes;
2718 }
pcachetraceCachesize(sqlite3_pcache * p,int nCachesize)2719 static void pcachetraceCachesize(sqlite3_pcache *p, int nCachesize){
2720   if( pcachetraceOut ){
2721     fprintf(pcachetraceOut, "PCACHETRACE: xCachesize(%p, %d)\n", p, nCachesize);
2722   }
2723   pcacheBase.xCachesize(p, nCachesize);
2724 }
pcachetracePagecount(sqlite3_pcache * p)2725 static int pcachetracePagecount(sqlite3_pcache *p){
2726   int nRes;
2727   if( pcachetraceOut ){
2728     fprintf(pcachetraceOut, "PCACHETRACE: xPagecount(%p)\n", p);
2729   }
2730   nRes = pcacheBase.xPagecount(p);
2731   if( pcachetraceOut ){
2732     fprintf(pcachetraceOut, "PCACHETRACE: xPagecount(%p) -> %d\n", p, nRes);
2733   }
2734   return nRes;
2735 }
pcachetraceFetch(sqlite3_pcache * p,unsigned key,int crFg)2736 static sqlite3_pcache_page *pcachetraceFetch(
2737   sqlite3_pcache *p,
2738   unsigned key,
2739   int crFg
2740 ){
2741   sqlite3_pcache_page *pRes;
2742   if( pcachetraceOut ){
2743     fprintf(pcachetraceOut, "PCACHETRACE: xFetch(%p,%u,%d)\n", p, key, crFg);
2744   }
2745   pRes = pcacheBase.xFetch(p, key, crFg);
2746   if( pcachetraceOut ){
2747     fprintf(pcachetraceOut, "PCACHETRACE: xFetch(%p,%u,%d) -> %p\n",
2748             p, key, crFg, pRes);
2749   }
2750   return pRes;
2751 }
pcachetraceUnpin(sqlite3_pcache * p,sqlite3_pcache_page * pPg,int bDiscard)2752 static void pcachetraceUnpin(
2753   sqlite3_pcache *p,
2754   sqlite3_pcache_page *pPg,
2755   int bDiscard
2756 ){
2757   if( pcachetraceOut ){
2758     fprintf(pcachetraceOut, "PCACHETRACE: xUnpin(%p, %p, %d)\n",
2759             p, pPg, bDiscard);
2760   }
2761   pcacheBase.xUnpin(p, pPg, bDiscard);
2762 }
pcachetraceRekey(sqlite3_pcache * p,sqlite3_pcache_page * pPg,unsigned oldKey,unsigned newKey)2763 static void pcachetraceRekey(
2764   sqlite3_pcache *p,
2765   sqlite3_pcache_page *pPg,
2766   unsigned oldKey,
2767   unsigned newKey
2768 ){
2769   if( pcachetraceOut ){
2770     fprintf(pcachetraceOut, "PCACHETRACE: xRekey(%p, %p, %u, %u)\n",
2771         p, pPg, oldKey, newKey);
2772   }
2773   pcacheBase.xRekey(p, pPg, oldKey, newKey);
2774 }
pcachetraceTruncate(sqlite3_pcache * p,unsigned n)2775 static void pcachetraceTruncate(sqlite3_pcache *p, unsigned n){
2776   if( pcachetraceOut ){
2777     fprintf(pcachetraceOut, "PCACHETRACE: xTruncate(%p, %u)\n", p, n);
2778   }
2779   pcacheBase.xTruncate(p, n);
2780 }
pcachetraceDestroy(sqlite3_pcache * p)2781 static void pcachetraceDestroy(sqlite3_pcache *p){
2782   if( pcachetraceOut ){
2783     fprintf(pcachetraceOut, "PCACHETRACE: xDestroy(%p)\n", p);
2784   }
2785   pcacheBase.xDestroy(p);
2786 }
pcachetraceShrink(sqlite3_pcache * p)2787 static void pcachetraceShrink(sqlite3_pcache *p){
2788   if( pcachetraceOut ){
2789     fprintf(pcachetraceOut, "PCACHETRACE: xShrink(%p)\n", p);
2790   }
2791   pcacheBase.xShrink(p);
2792 }
2793 
2794 /* The substitute pcache methods */
2795 static sqlite3_pcache_methods2 ersaztPcacheMethods = {
2796   0,
2797   0,
2798   pcachetraceInit,
2799   pcachetraceShutdown,
2800   pcachetraceCreate,
2801   pcachetraceCachesize,
2802   pcachetracePagecount,
2803   pcachetraceFetch,
2804   pcachetraceUnpin,
2805   pcachetraceRekey,
2806   pcachetraceTruncate,
2807   pcachetraceDestroy,
2808   pcachetraceShrink
2809 };
2810 
2811 /* Begin tracing memory allocations to out. */
sqlite3PcacheTraceActivate(FILE * out)2812 int sqlite3PcacheTraceActivate(FILE *out){
2813   int rc = SQLITE_OK;
2814   if( pcacheBase.xFetch==0 ){
2815     rc = sqlite3_config(SQLITE_CONFIG_GETPCACHE2, &pcacheBase);
2816     if( rc==SQLITE_OK ){
2817       rc = sqlite3_config(SQLITE_CONFIG_PCACHE2, &ersaztPcacheMethods);
2818     }
2819   }
2820   pcachetraceOut = out;
2821   return rc;
2822 }
2823 
2824 /* Deactivate memory tracing */
sqlite3PcacheTraceDeactivate(void)2825 int sqlite3PcacheTraceDeactivate(void){
2826   int rc = SQLITE_OK;
2827   if( pcacheBase.xFetch!=0 ){
2828     rc = sqlite3_config(SQLITE_CONFIG_PCACHE2, &pcacheBase);
2829     if( rc==SQLITE_OK ){
2830       memset(&pcacheBase, 0, sizeof(pcacheBase));
2831     }
2832   }
2833   pcachetraceOut = 0;
2834   return rc;
2835 }
2836 
2837 /************************* End ../ext/misc/pcachetrace.c ********************/
2838 /************************* Begin ../ext/misc/shathree.c ******************/
2839 /*
2840 ** 2017-03-08
2841 **
2842 ** The author disclaims copyright to this source code.  In place of
2843 ** a legal notice, here is a blessing:
2844 **
2845 **    May you do good and not evil.
2846 **    May you find forgiveness for yourself and forgive others.
2847 **    May you share freely, never taking more than you give.
2848 **
2849 ******************************************************************************
2850 **
2851 ** This SQLite extension implements functions that compute SHA3 hashes
2852 ** in the way described by the (U.S.) NIST FIPS 202 SHA-3 Standard.
2853 ** Two SQL functions are implemented:
2854 **
2855 **     sha3(X,SIZE)
2856 **     sha3_query(Y,SIZE)
2857 **
2858 ** The sha3(X) function computes the SHA3 hash of the input X, or NULL if
2859 ** X is NULL.
2860 **
2861 ** The sha3_query(Y) function evaluates all queries in the SQL statements of Y
2862 ** and returns a hash of their results.
2863 **
2864 ** The SIZE argument is optional.  If omitted, the SHA3-256 hash algorithm
2865 ** is used.  If SIZE is included it must be one of the integers 224, 256,
2866 ** 384, or 512, to determine SHA3 hash variant that is computed.
2867 */
2868 /* #include "sqlite3ext.h" */
2869 SQLITE_EXTENSION_INIT1
2870 #include <assert.h>
2871 #include <string.h>
2872 #include <stdarg.h>
2873 
2874 #ifndef SQLITE_AMALGAMATION
2875 /* typedef sqlite3_uint64 u64; */
2876 #endif /* SQLITE_AMALGAMATION */
2877 
2878 /******************************************************************************
2879 ** The Hash Engine
2880 */
2881 /*
2882 ** Macros to determine whether the machine is big or little endian,
2883 ** and whether or not that determination is run-time or compile-time.
2884 **
2885 ** For best performance, an attempt is made to guess at the byte-order
2886 ** using C-preprocessor macros.  If that is unsuccessful, or if
2887 ** -DSHA3_BYTEORDER=0 is set, then byte-order is determined
2888 ** at run-time.
2889 */
2890 #ifndef SHA3_BYTEORDER
2891 # if defined(i386)     || defined(__i386__)   || defined(_M_IX86) ||    \
2892      defined(__x86_64) || defined(__x86_64__) || defined(_M_X64)  ||    \
2893      defined(_M_AMD64) || defined(_M_ARM)     || defined(__x86)   ||    \
2894      defined(__arm__)
2895 #   define SHA3_BYTEORDER    1234
2896 # elif defined(sparc)    || defined(__ppc__)
2897 #   define SHA3_BYTEORDER    4321
2898 # else
2899 #   define SHA3_BYTEORDER 0
2900 # endif
2901 #endif
2902 
2903 
2904 /*
2905 ** State structure for a SHA3 hash in progress
2906 */
2907 typedef struct SHA3Context SHA3Context;
2908 struct SHA3Context {
2909   union {
2910     u64 s[25];                /* Keccak state. 5x5 lines of 64 bits each */
2911     unsigned char x[1600];    /* ... or 1600 bytes */
2912   } u;
2913   unsigned nRate;        /* Bytes of input accepted per Keccak iteration */
2914   unsigned nLoaded;      /* Input bytes loaded into u.x[] so far this cycle */
2915   unsigned ixMask;       /* Insert next input into u.x[nLoaded^ixMask]. */
2916 };
2917 
2918 /*
2919 ** A single step of the Keccak mixing function for a 1600-bit state
2920 */
KeccakF1600Step(SHA3Context * p)2921 static void KeccakF1600Step(SHA3Context *p){
2922   int i;
2923   u64 b0, b1, b2, b3, b4;
2924   u64 c0, c1, c2, c3, c4;
2925   u64 d0, d1, d2, d3, d4;
2926   static const u64 RC[] = {
2927     0x0000000000000001ULL,  0x0000000000008082ULL,
2928     0x800000000000808aULL,  0x8000000080008000ULL,
2929     0x000000000000808bULL,  0x0000000080000001ULL,
2930     0x8000000080008081ULL,  0x8000000000008009ULL,
2931     0x000000000000008aULL,  0x0000000000000088ULL,
2932     0x0000000080008009ULL,  0x000000008000000aULL,
2933     0x000000008000808bULL,  0x800000000000008bULL,
2934     0x8000000000008089ULL,  0x8000000000008003ULL,
2935     0x8000000000008002ULL,  0x8000000000000080ULL,
2936     0x000000000000800aULL,  0x800000008000000aULL,
2937     0x8000000080008081ULL,  0x8000000000008080ULL,
2938     0x0000000080000001ULL,  0x8000000080008008ULL
2939   };
2940 # define a00 (p->u.s[0])
2941 # define a01 (p->u.s[1])
2942 # define a02 (p->u.s[2])
2943 # define a03 (p->u.s[3])
2944 # define a04 (p->u.s[4])
2945 # define a10 (p->u.s[5])
2946 # define a11 (p->u.s[6])
2947 # define a12 (p->u.s[7])
2948 # define a13 (p->u.s[8])
2949 # define a14 (p->u.s[9])
2950 # define a20 (p->u.s[10])
2951 # define a21 (p->u.s[11])
2952 # define a22 (p->u.s[12])
2953 # define a23 (p->u.s[13])
2954 # define a24 (p->u.s[14])
2955 # define a30 (p->u.s[15])
2956 # define a31 (p->u.s[16])
2957 # define a32 (p->u.s[17])
2958 # define a33 (p->u.s[18])
2959 # define a34 (p->u.s[19])
2960 # define a40 (p->u.s[20])
2961 # define a41 (p->u.s[21])
2962 # define a42 (p->u.s[22])
2963 # define a43 (p->u.s[23])
2964 # define a44 (p->u.s[24])
2965 # define ROL64(a,x) ((a<<x)|(a>>(64-x)))
2966 
2967   for(i=0; i<24; i+=4){
2968     c0 = a00^a10^a20^a30^a40;
2969     c1 = a01^a11^a21^a31^a41;
2970     c2 = a02^a12^a22^a32^a42;
2971     c3 = a03^a13^a23^a33^a43;
2972     c4 = a04^a14^a24^a34^a44;
2973     d0 = c4^ROL64(c1, 1);
2974     d1 = c0^ROL64(c2, 1);
2975     d2 = c1^ROL64(c3, 1);
2976     d3 = c2^ROL64(c4, 1);
2977     d4 = c3^ROL64(c0, 1);
2978 
2979     b0 = (a00^d0);
2980     b1 = ROL64((a11^d1), 44);
2981     b2 = ROL64((a22^d2), 43);
2982     b3 = ROL64((a33^d3), 21);
2983     b4 = ROL64((a44^d4), 14);
2984     a00 =   b0 ^((~b1)&  b2 );
2985     a00 ^= RC[i];
2986     a11 =   b1 ^((~b2)&  b3 );
2987     a22 =   b2 ^((~b3)&  b4 );
2988     a33 =   b3 ^((~b4)&  b0 );
2989     a44 =   b4 ^((~b0)&  b1 );
2990 
2991     b2 = ROL64((a20^d0), 3);
2992     b3 = ROL64((a31^d1), 45);
2993     b4 = ROL64((a42^d2), 61);
2994     b0 = ROL64((a03^d3), 28);
2995     b1 = ROL64((a14^d4), 20);
2996     a20 =   b0 ^((~b1)&  b2 );
2997     a31 =   b1 ^((~b2)&  b3 );
2998     a42 =   b2 ^((~b3)&  b4 );
2999     a03 =   b3 ^((~b4)&  b0 );
3000     a14 =   b4 ^((~b0)&  b1 );
3001 
3002     b4 = ROL64((a40^d0), 18);
3003     b0 = ROL64((a01^d1), 1);
3004     b1 = ROL64((a12^d2), 6);
3005     b2 = ROL64((a23^d3), 25);
3006     b3 = ROL64((a34^d4), 8);
3007     a40 =   b0 ^((~b1)&  b2 );
3008     a01 =   b1 ^((~b2)&  b3 );
3009     a12 =   b2 ^((~b3)&  b4 );
3010     a23 =   b3 ^((~b4)&  b0 );
3011     a34 =   b4 ^((~b0)&  b1 );
3012 
3013     b1 = ROL64((a10^d0), 36);
3014     b2 = ROL64((a21^d1), 10);
3015     b3 = ROL64((a32^d2), 15);
3016     b4 = ROL64((a43^d3), 56);
3017     b0 = ROL64((a04^d4), 27);
3018     a10 =   b0 ^((~b1)&  b2 );
3019     a21 =   b1 ^((~b2)&  b3 );
3020     a32 =   b2 ^((~b3)&  b4 );
3021     a43 =   b3 ^((~b4)&  b0 );
3022     a04 =   b4 ^((~b0)&  b1 );
3023 
3024     b3 = ROL64((a30^d0), 41);
3025     b4 = ROL64((a41^d1), 2);
3026     b0 = ROL64((a02^d2), 62);
3027     b1 = ROL64((a13^d3), 55);
3028     b2 = ROL64((a24^d4), 39);
3029     a30 =   b0 ^((~b1)&  b2 );
3030     a41 =   b1 ^((~b2)&  b3 );
3031     a02 =   b2 ^((~b3)&  b4 );
3032     a13 =   b3 ^((~b4)&  b0 );
3033     a24 =   b4 ^((~b0)&  b1 );
3034 
3035     c0 = a00^a20^a40^a10^a30;
3036     c1 = a11^a31^a01^a21^a41;
3037     c2 = a22^a42^a12^a32^a02;
3038     c3 = a33^a03^a23^a43^a13;
3039     c4 = a44^a14^a34^a04^a24;
3040     d0 = c4^ROL64(c1, 1);
3041     d1 = c0^ROL64(c2, 1);
3042     d2 = c1^ROL64(c3, 1);
3043     d3 = c2^ROL64(c4, 1);
3044     d4 = c3^ROL64(c0, 1);
3045 
3046     b0 = (a00^d0);
3047     b1 = ROL64((a31^d1), 44);
3048     b2 = ROL64((a12^d2), 43);
3049     b3 = ROL64((a43^d3), 21);
3050     b4 = ROL64((a24^d4), 14);
3051     a00 =   b0 ^((~b1)&  b2 );
3052     a00 ^= RC[i+1];
3053     a31 =   b1 ^((~b2)&  b3 );
3054     a12 =   b2 ^((~b3)&  b4 );
3055     a43 =   b3 ^((~b4)&  b0 );
3056     a24 =   b4 ^((~b0)&  b1 );
3057 
3058     b2 = ROL64((a40^d0), 3);
3059     b3 = ROL64((a21^d1), 45);
3060     b4 = ROL64((a02^d2), 61);
3061     b0 = ROL64((a33^d3), 28);
3062     b1 = ROL64((a14^d4), 20);
3063     a40 =   b0 ^((~b1)&  b2 );
3064     a21 =   b1 ^((~b2)&  b3 );
3065     a02 =   b2 ^((~b3)&  b4 );
3066     a33 =   b3 ^((~b4)&  b0 );
3067     a14 =   b4 ^((~b0)&  b1 );
3068 
3069     b4 = ROL64((a30^d0), 18);
3070     b0 = ROL64((a11^d1), 1);
3071     b1 = ROL64((a42^d2), 6);
3072     b2 = ROL64((a23^d3), 25);
3073     b3 = ROL64((a04^d4), 8);
3074     a30 =   b0 ^((~b1)&  b2 );
3075     a11 =   b1 ^((~b2)&  b3 );
3076     a42 =   b2 ^((~b3)&  b4 );
3077     a23 =   b3 ^((~b4)&  b0 );
3078     a04 =   b4 ^((~b0)&  b1 );
3079 
3080     b1 = ROL64((a20^d0), 36);
3081     b2 = ROL64((a01^d1), 10);
3082     b3 = ROL64((a32^d2), 15);
3083     b4 = ROL64((a13^d3), 56);
3084     b0 = ROL64((a44^d4), 27);
3085     a20 =   b0 ^((~b1)&  b2 );
3086     a01 =   b1 ^((~b2)&  b3 );
3087     a32 =   b2 ^((~b3)&  b4 );
3088     a13 =   b3 ^((~b4)&  b0 );
3089     a44 =   b4 ^((~b0)&  b1 );
3090 
3091     b3 = ROL64((a10^d0), 41);
3092     b4 = ROL64((a41^d1), 2);
3093     b0 = ROL64((a22^d2), 62);
3094     b1 = ROL64((a03^d3), 55);
3095     b2 = ROL64((a34^d4), 39);
3096     a10 =   b0 ^((~b1)&  b2 );
3097     a41 =   b1 ^((~b2)&  b3 );
3098     a22 =   b2 ^((~b3)&  b4 );
3099     a03 =   b3 ^((~b4)&  b0 );
3100     a34 =   b4 ^((~b0)&  b1 );
3101 
3102     c0 = a00^a40^a30^a20^a10;
3103     c1 = a31^a21^a11^a01^a41;
3104     c2 = a12^a02^a42^a32^a22;
3105     c3 = a43^a33^a23^a13^a03;
3106     c4 = a24^a14^a04^a44^a34;
3107     d0 = c4^ROL64(c1, 1);
3108     d1 = c0^ROL64(c2, 1);
3109     d2 = c1^ROL64(c3, 1);
3110     d3 = c2^ROL64(c4, 1);
3111     d4 = c3^ROL64(c0, 1);
3112 
3113     b0 = (a00^d0);
3114     b1 = ROL64((a21^d1), 44);
3115     b2 = ROL64((a42^d2), 43);
3116     b3 = ROL64((a13^d3), 21);
3117     b4 = ROL64((a34^d4), 14);
3118     a00 =   b0 ^((~b1)&  b2 );
3119     a00 ^= RC[i+2];
3120     a21 =   b1 ^((~b2)&  b3 );
3121     a42 =   b2 ^((~b3)&  b4 );
3122     a13 =   b3 ^((~b4)&  b0 );
3123     a34 =   b4 ^((~b0)&  b1 );
3124 
3125     b2 = ROL64((a30^d0), 3);
3126     b3 = ROL64((a01^d1), 45);
3127     b4 = ROL64((a22^d2), 61);
3128     b0 = ROL64((a43^d3), 28);
3129     b1 = ROL64((a14^d4), 20);
3130     a30 =   b0 ^((~b1)&  b2 );
3131     a01 =   b1 ^((~b2)&  b3 );
3132     a22 =   b2 ^((~b3)&  b4 );
3133     a43 =   b3 ^((~b4)&  b0 );
3134     a14 =   b4 ^((~b0)&  b1 );
3135 
3136     b4 = ROL64((a10^d0), 18);
3137     b0 = ROL64((a31^d1), 1);
3138     b1 = ROL64((a02^d2), 6);
3139     b2 = ROL64((a23^d3), 25);
3140     b3 = ROL64((a44^d4), 8);
3141     a10 =   b0 ^((~b1)&  b2 );
3142     a31 =   b1 ^((~b2)&  b3 );
3143     a02 =   b2 ^((~b3)&  b4 );
3144     a23 =   b3 ^((~b4)&  b0 );
3145     a44 =   b4 ^((~b0)&  b1 );
3146 
3147     b1 = ROL64((a40^d0), 36);
3148     b2 = ROL64((a11^d1), 10);
3149     b3 = ROL64((a32^d2), 15);
3150     b4 = ROL64((a03^d3), 56);
3151     b0 = ROL64((a24^d4), 27);
3152     a40 =   b0 ^((~b1)&  b2 );
3153     a11 =   b1 ^((~b2)&  b3 );
3154     a32 =   b2 ^((~b3)&  b4 );
3155     a03 =   b3 ^((~b4)&  b0 );
3156     a24 =   b4 ^((~b0)&  b1 );
3157 
3158     b3 = ROL64((a20^d0), 41);
3159     b4 = ROL64((a41^d1), 2);
3160     b0 = ROL64((a12^d2), 62);
3161     b1 = ROL64((a33^d3), 55);
3162     b2 = ROL64((a04^d4), 39);
3163     a20 =   b0 ^((~b1)&  b2 );
3164     a41 =   b1 ^((~b2)&  b3 );
3165     a12 =   b2 ^((~b3)&  b4 );
3166     a33 =   b3 ^((~b4)&  b0 );
3167     a04 =   b4 ^((~b0)&  b1 );
3168 
3169     c0 = a00^a30^a10^a40^a20;
3170     c1 = a21^a01^a31^a11^a41;
3171     c2 = a42^a22^a02^a32^a12;
3172     c3 = a13^a43^a23^a03^a33;
3173     c4 = a34^a14^a44^a24^a04;
3174     d0 = c4^ROL64(c1, 1);
3175     d1 = c0^ROL64(c2, 1);
3176     d2 = c1^ROL64(c3, 1);
3177     d3 = c2^ROL64(c4, 1);
3178     d4 = c3^ROL64(c0, 1);
3179 
3180     b0 = (a00^d0);
3181     b1 = ROL64((a01^d1), 44);
3182     b2 = ROL64((a02^d2), 43);
3183     b3 = ROL64((a03^d3), 21);
3184     b4 = ROL64((a04^d4), 14);
3185     a00 =   b0 ^((~b1)&  b2 );
3186     a00 ^= RC[i+3];
3187     a01 =   b1 ^((~b2)&  b3 );
3188     a02 =   b2 ^((~b3)&  b4 );
3189     a03 =   b3 ^((~b4)&  b0 );
3190     a04 =   b4 ^((~b0)&  b1 );
3191 
3192     b2 = ROL64((a10^d0), 3);
3193     b3 = ROL64((a11^d1), 45);
3194     b4 = ROL64((a12^d2), 61);
3195     b0 = ROL64((a13^d3), 28);
3196     b1 = ROL64((a14^d4), 20);
3197     a10 =   b0 ^((~b1)&  b2 );
3198     a11 =   b1 ^((~b2)&  b3 );
3199     a12 =   b2 ^((~b3)&  b4 );
3200     a13 =   b3 ^((~b4)&  b0 );
3201     a14 =   b4 ^((~b0)&  b1 );
3202 
3203     b4 = ROL64((a20^d0), 18);
3204     b0 = ROL64((a21^d1), 1);
3205     b1 = ROL64((a22^d2), 6);
3206     b2 = ROL64((a23^d3), 25);
3207     b3 = ROL64((a24^d4), 8);
3208     a20 =   b0 ^((~b1)&  b2 );
3209     a21 =   b1 ^((~b2)&  b3 );
3210     a22 =   b2 ^((~b3)&  b4 );
3211     a23 =   b3 ^((~b4)&  b0 );
3212     a24 =   b4 ^((~b0)&  b1 );
3213 
3214     b1 = ROL64((a30^d0), 36);
3215     b2 = ROL64((a31^d1), 10);
3216     b3 = ROL64((a32^d2), 15);
3217     b4 = ROL64((a33^d3), 56);
3218     b0 = ROL64((a34^d4), 27);
3219     a30 =   b0 ^((~b1)&  b2 );
3220     a31 =   b1 ^((~b2)&  b3 );
3221     a32 =   b2 ^((~b3)&  b4 );
3222     a33 =   b3 ^((~b4)&  b0 );
3223     a34 =   b4 ^((~b0)&  b1 );
3224 
3225     b3 = ROL64((a40^d0), 41);
3226     b4 = ROL64((a41^d1), 2);
3227     b0 = ROL64((a42^d2), 62);
3228     b1 = ROL64((a43^d3), 55);
3229     b2 = ROL64((a44^d4), 39);
3230     a40 =   b0 ^((~b1)&  b2 );
3231     a41 =   b1 ^((~b2)&  b3 );
3232     a42 =   b2 ^((~b3)&  b4 );
3233     a43 =   b3 ^((~b4)&  b0 );
3234     a44 =   b4 ^((~b0)&  b1 );
3235   }
3236 }
3237 
3238 /*
3239 ** Initialize a new hash.  iSize determines the size of the hash
3240 ** in bits and should be one of 224, 256, 384, or 512.  Or iSize
3241 ** can be zero to use the default hash size of 256 bits.
3242 */
SHA3Init(SHA3Context * p,int iSize)3243 static void SHA3Init(SHA3Context *p, int iSize){
3244   memset(p, 0, sizeof(*p));
3245   if( iSize>=128 && iSize<=512 ){
3246     p->nRate = (1600 - ((iSize + 31)&~31)*2)/8;
3247   }else{
3248     p->nRate = (1600 - 2*256)/8;
3249   }
3250 #if SHA3_BYTEORDER==1234
3251   /* Known to be little-endian at compile-time. No-op */
3252 #elif SHA3_BYTEORDER==4321
3253   p->ixMask = 7;  /* Big-endian */
3254 #else
3255   {
3256     static unsigned int one = 1;
3257     if( 1==*(unsigned char*)&one ){
3258       /* Little endian.  No byte swapping. */
3259       p->ixMask = 0;
3260     }else{
3261       /* Big endian.  Byte swap. */
3262       p->ixMask = 7;
3263     }
3264   }
3265 #endif
3266 }
3267 
3268 /*
3269 ** Make consecutive calls to the SHA3Update function to add new content
3270 ** to the hash
3271 */
SHA3Update(SHA3Context * p,const unsigned char * aData,unsigned int nData)3272 static void SHA3Update(
3273   SHA3Context *p,
3274   const unsigned char *aData,
3275   unsigned int nData
3276 ){
3277   unsigned int i = 0;
3278   if( aData==0 ) return;
3279 #if SHA3_BYTEORDER==1234
3280   if( (p->nLoaded % 8)==0 && ((aData - (const unsigned char*)0)&7)==0 ){
3281     for(; i+7<nData; i+=8){
3282       p->u.s[p->nLoaded/8] ^= *(u64*)&aData[i];
3283       p->nLoaded += 8;
3284       if( p->nLoaded>=p->nRate ){
3285         KeccakF1600Step(p);
3286         p->nLoaded = 0;
3287       }
3288     }
3289   }
3290 #endif
3291   for(; i<nData; i++){
3292 #if SHA3_BYTEORDER==1234
3293     p->u.x[p->nLoaded] ^= aData[i];
3294 #elif SHA3_BYTEORDER==4321
3295     p->u.x[p->nLoaded^0x07] ^= aData[i];
3296 #else
3297     p->u.x[p->nLoaded^p->ixMask] ^= aData[i];
3298 #endif
3299     p->nLoaded++;
3300     if( p->nLoaded==p->nRate ){
3301       KeccakF1600Step(p);
3302       p->nLoaded = 0;
3303     }
3304   }
3305 }
3306 
3307 /*
3308 ** After all content has been added, invoke SHA3Final() to compute
3309 ** the final hash.  The function returns a pointer to the binary
3310 ** hash value.
3311 */
SHA3Final(SHA3Context * p)3312 static unsigned char *SHA3Final(SHA3Context *p){
3313   unsigned int i;
3314   if( p->nLoaded==p->nRate-1 ){
3315     const unsigned char c1 = 0x86;
3316     SHA3Update(p, &c1, 1);
3317   }else{
3318     const unsigned char c2 = 0x06;
3319     const unsigned char c3 = 0x80;
3320     SHA3Update(p, &c2, 1);
3321     p->nLoaded = p->nRate - 1;
3322     SHA3Update(p, &c3, 1);
3323   }
3324   for(i=0; i<p->nRate; i++){
3325     p->u.x[i+p->nRate] = p->u.x[i^p->ixMask];
3326   }
3327   return &p->u.x[p->nRate];
3328 }
3329 /* End of the hashing logic
3330 *****************************************************************************/
3331 
3332 /*
3333 ** Implementation of the sha3(X,SIZE) function.
3334 **
3335 ** Return a BLOB which is the SIZE-bit SHA3 hash of X.  The default
3336 ** size is 256.  If X is a BLOB, it is hashed as is.
3337 ** For all other non-NULL types of input, X is converted into a UTF-8 string
3338 ** and the string is hashed without the trailing 0x00 terminator.  The hash
3339 ** of a NULL value is NULL.
3340 */
sha3Func(sqlite3_context * context,int argc,sqlite3_value ** argv)3341 static void sha3Func(
3342   sqlite3_context *context,
3343   int argc,
3344   sqlite3_value **argv
3345 ){
3346   SHA3Context cx;
3347   int eType = sqlite3_value_type(argv[0]);
3348   int nByte = sqlite3_value_bytes(argv[0]);
3349   int iSize;
3350   if( argc==1 ){
3351     iSize = 256;
3352   }else{
3353     iSize = sqlite3_value_int(argv[1]);
3354     if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){
3355       sqlite3_result_error(context, "SHA3 size should be one of: 224 256 "
3356                                     "384 512", -1);
3357       return;
3358     }
3359   }
3360   if( eType==SQLITE_NULL ) return;
3361   SHA3Init(&cx, iSize);
3362   if( eType==SQLITE_BLOB ){
3363     SHA3Update(&cx, sqlite3_value_blob(argv[0]), nByte);
3364   }else{
3365     SHA3Update(&cx, sqlite3_value_text(argv[0]), nByte);
3366   }
3367   sqlite3_result_blob(context, SHA3Final(&cx), iSize/8, SQLITE_TRANSIENT);
3368 }
3369 
3370 /* Compute a string using sqlite3_vsnprintf() with a maximum length
3371 ** of 50 bytes and add it to the hash.
3372 */
sha3_step_vformat(SHA3Context * p,const char * zFormat,...)3373 static void sha3_step_vformat(
3374   SHA3Context *p,                 /* Add content to this context */
3375   const char *zFormat,
3376   ...
3377 ){
3378   va_list ap;
3379   int n;
3380   char zBuf[50];
3381   va_start(ap, zFormat);
3382   sqlite3_vsnprintf(sizeof(zBuf),zBuf,zFormat,ap);
3383   va_end(ap);
3384   n = (int)strlen(zBuf);
3385   SHA3Update(p, (unsigned char*)zBuf, n);
3386 }
3387 
3388 /*
3389 ** Implementation of the sha3_query(SQL,SIZE) function.
3390 **
3391 ** This function compiles and runs the SQL statement(s) given in the
3392 ** argument. The results are hashed using a SIZE-bit SHA3.  The default
3393 ** size is 256.
3394 **
3395 ** The format of the byte stream that is hashed is summarized as follows:
3396 **
3397 **       S<n>:<sql>
3398 **       R
3399 **       N
3400 **       I<int>
3401 **       F<ieee-float>
3402 **       B<size>:<bytes>
3403 **       T<size>:<text>
3404 **
3405 ** <sql> is the original SQL text for each statement run and <n> is
3406 ** the size of that text.  The SQL text is UTF-8.  A single R character
3407 ** occurs before the start of each row.  N means a NULL value.
3408 ** I mean an 8-byte little-endian integer <int>.  F is a floating point
3409 ** number with an 8-byte little-endian IEEE floating point value <ieee-float>.
3410 ** B means blobs of <size> bytes.  T means text rendered as <size>
3411 ** bytes of UTF-8.  The <n> and <size> values are expressed as an ASCII
3412 ** text integers.
3413 **
3414 ** For each SQL statement in the X input, there is one S segment.  Each
3415 ** S segment is followed by zero or more R segments, one for each row in the
3416 ** result set.  After each R, there are one or more N, I, F, B, or T segments,
3417 ** one for each column in the result set.  Segments are concatentated directly
3418 ** with no delimiters of any kind.
3419 */
sha3QueryFunc(sqlite3_context * context,int argc,sqlite3_value ** argv)3420 static void sha3QueryFunc(
3421   sqlite3_context *context,
3422   int argc,
3423   sqlite3_value **argv
3424 ){
3425   sqlite3 *db = sqlite3_context_db_handle(context);
3426   const char *zSql = (const char*)sqlite3_value_text(argv[0]);
3427   sqlite3_stmt *pStmt = 0;
3428   int nCol;                   /* Number of columns in the result set */
3429   int i;                      /* Loop counter */
3430   int rc;
3431   int n;
3432   const char *z;
3433   SHA3Context cx;
3434   int iSize;
3435 
3436   if( argc==1 ){
3437     iSize = 256;
3438   }else{
3439     iSize = sqlite3_value_int(argv[1]);
3440     if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){
3441       sqlite3_result_error(context, "SHA3 size should be one of: 224 256 "
3442                                     "384 512", -1);
3443       return;
3444     }
3445   }
3446   if( zSql==0 ) return;
3447   SHA3Init(&cx, iSize);
3448   while( zSql[0] ){
3449     rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zSql);
3450     if( rc ){
3451       char *zMsg = sqlite3_mprintf("error SQL statement [%s]: %s",
3452                                    zSql, sqlite3_errmsg(db));
3453       sqlite3_finalize(pStmt);
3454       sqlite3_result_error(context, zMsg, -1);
3455       sqlite3_free(zMsg);
3456       return;
3457     }
3458     if( !sqlite3_stmt_readonly(pStmt) ){
3459       char *zMsg = sqlite3_mprintf("non-query: [%s]", sqlite3_sql(pStmt));
3460       sqlite3_finalize(pStmt);
3461       sqlite3_result_error(context, zMsg, -1);
3462       sqlite3_free(zMsg);
3463       return;
3464     }
3465     nCol = sqlite3_column_count(pStmt);
3466     z = sqlite3_sql(pStmt);
3467     if( z ){
3468       n = (int)strlen(z);
3469       sha3_step_vformat(&cx,"S%d:",n);
3470       SHA3Update(&cx,(unsigned char*)z,n);
3471     }
3472 
3473     /* Compute a hash over the result of the query */
3474     while( SQLITE_ROW==sqlite3_step(pStmt) ){
3475       SHA3Update(&cx,(const unsigned char*)"R",1);
3476       for(i=0; i<nCol; i++){
3477         switch( sqlite3_column_type(pStmt,i) ){
3478           case SQLITE_NULL: {
3479             SHA3Update(&cx, (const unsigned char*)"N",1);
3480             break;
3481           }
3482           case SQLITE_INTEGER: {
3483             sqlite3_uint64 u;
3484             int j;
3485             unsigned char x[9];
3486             sqlite3_int64 v = sqlite3_column_int64(pStmt,i);
3487             memcpy(&u, &v, 8);
3488             for(j=8; j>=1; j--){
3489               x[j] = u & 0xff;
3490               u >>= 8;
3491             }
3492             x[0] = 'I';
3493             SHA3Update(&cx, x, 9);
3494             break;
3495           }
3496           case SQLITE_FLOAT: {
3497             sqlite3_uint64 u;
3498             int j;
3499             unsigned char x[9];
3500             double r = sqlite3_column_double(pStmt,i);
3501             memcpy(&u, &r, 8);
3502             for(j=8; j>=1; j--){
3503               x[j] = u & 0xff;
3504               u >>= 8;
3505             }
3506             x[0] = 'F';
3507             SHA3Update(&cx,x,9);
3508             break;
3509           }
3510           case SQLITE_TEXT: {
3511             int n2 = sqlite3_column_bytes(pStmt, i);
3512             const unsigned char *z2 = sqlite3_column_text(pStmt, i);
3513             sha3_step_vformat(&cx,"T%d:",n2);
3514             SHA3Update(&cx, z2, n2);
3515             break;
3516           }
3517           case SQLITE_BLOB: {
3518             int n2 = sqlite3_column_bytes(pStmt, i);
3519             const unsigned char *z2 = sqlite3_column_blob(pStmt, i);
3520             sha3_step_vformat(&cx,"B%d:",n2);
3521             SHA3Update(&cx, z2, n2);
3522             break;
3523           }
3524         }
3525       }
3526     }
3527     sqlite3_finalize(pStmt);
3528   }
3529   sqlite3_result_blob(context, SHA3Final(&cx), iSize/8, SQLITE_TRANSIENT);
3530 }
3531 
3532 
3533 #ifdef _WIN32
3534 
3535 #endif
sqlite3_shathree_init(sqlite3 * db,char ** pzErrMsg,const sqlite3_api_routines * pApi)3536 int sqlite3_shathree_init(
3537   sqlite3 *db,
3538   char **pzErrMsg,
3539   const sqlite3_api_routines *pApi
3540 ){
3541   int rc = SQLITE_OK;
3542   SQLITE_EXTENSION_INIT2(pApi);
3543   (void)pzErrMsg;  /* Unused parameter */
3544   rc = sqlite3_create_function(db, "sha3", 1,
3545                       SQLITE_UTF8 | SQLITE_INNOCUOUS | SQLITE_DETERMINISTIC,
3546                       0, sha3Func, 0, 0);
3547   if( rc==SQLITE_OK ){
3548     rc = sqlite3_create_function(db, "sha3", 2,
3549                       SQLITE_UTF8 | SQLITE_INNOCUOUS | SQLITE_DETERMINISTIC,
3550                       0, sha3Func, 0, 0);
3551   }
3552   if( rc==SQLITE_OK ){
3553     rc = sqlite3_create_function(db, "sha3_query", 1,
3554                       SQLITE_UTF8 | SQLITE_DIRECTONLY,
3555                       0, sha3QueryFunc, 0, 0);
3556   }
3557   if( rc==SQLITE_OK ){
3558     rc = sqlite3_create_function(db, "sha3_query", 2,
3559                       SQLITE_UTF8 | SQLITE_DIRECTONLY,
3560                       0, sha3QueryFunc, 0, 0);
3561   }
3562   return rc;
3563 }
3564 
3565 /************************* End ../ext/misc/shathree.c ********************/
3566 /************************* Begin ../ext/misc/uint.c ******************/
3567 /*
3568 ** 2020-04-14
3569 **
3570 ** The author disclaims copyright to this source code.  In place of
3571 ** a legal notice, here is a blessing:
3572 **
3573 **    May you do good and not evil.
3574 **    May you find forgiveness for yourself and forgive others.
3575 **    May you share freely, never taking more than you give.
3576 **
3577 ******************************************************************************
3578 **
3579 ** This SQLite extension implements the UINT collating sequence.
3580 **
3581 ** UINT works like BINARY for text, except that embedded strings
3582 ** of digits compare in numeric order.
3583 **
3584 **     *   Leading zeros are handled properly, in the sense that
3585 **         they do not mess of the maginitude comparison of embedded
3586 **         strings of digits.  "x00123y" is equal to "x123y".
3587 **
3588 **     *   Only unsigned integers are recognized.  Plus and minus
3589 **         signs are ignored.  Decimal points and exponential notation
3590 **         are ignored.
3591 **
3592 **     *   Embedded integers can be of arbitrary length.  Comparison
3593 **         is *not* limited integers that can be expressed as a
3594 **         64-bit machine integer.
3595 */
3596 /* #include "sqlite3ext.h" */
3597 SQLITE_EXTENSION_INIT1
3598 #include <assert.h>
3599 #include <string.h>
3600 #include <ctype.h>
3601 
3602 /*
3603 ** Compare text in lexicographic order, except strings of digits
3604 ** compare in numeric order.
3605 */
uintCollFunc(void * notUsed,int nKey1,const void * pKey1,int nKey2,const void * pKey2)3606 static int uintCollFunc(
3607   void *notUsed,
3608   int nKey1, const void *pKey1,
3609   int nKey2, const void *pKey2
3610 ){
3611   const unsigned char *zA = (const unsigned char*)pKey1;
3612   const unsigned char *zB = (const unsigned char*)pKey2;
3613   int i=0, j=0, x;
3614   (void)notUsed;
3615   while( i<nKey1 && j<nKey2 ){
3616     x = zA[i] - zB[j];
3617     if( isdigit(zA[i]) ){
3618       int k;
3619       if( !isdigit(zB[j]) ) return x;
3620       while( i<nKey1 && zA[i]=='0' ){ i++; }
3621       while( j<nKey2 && zB[j]=='0' ){ j++; }
3622       k = 0;
3623       while( i+k<nKey1 && isdigit(zA[i+k])
3624              && j+k<nKey2 && isdigit(zB[j+k]) ){
3625         k++;
3626       }
3627       if( i+k<nKey1 && isdigit(zA[i+k]) ){
3628         return +1;
3629       }else if( j+k<nKey2 && isdigit(zB[j+k]) ){
3630         return -1;
3631       }else{
3632         x = memcmp(zA+i, zB+j, k);
3633         if( x ) return x;
3634         i += k;
3635         j += k;
3636       }
3637     }else if( x ){
3638       return x;
3639     }else{
3640       i++;
3641       j++;
3642     }
3643   }
3644   return (nKey1 - i) - (nKey2 - j);
3645 }
3646 
3647 #ifdef _WIN32
3648 
3649 #endif
sqlite3_uint_init(sqlite3 * db,char ** pzErrMsg,const sqlite3_api_routines * pApi)3650 int sqlite3_uint_init(
3651   sqlite3 *db,
3652   char **pzErrMsg,
3653   const sqlite3_api_routines *pApi
3654 ){
3655   SQLITE_EXTENSION_INIT2(pApi);
3656   (void)pzErrMsg;  /* Unused parameter */
3657   return sqlite3_create_collation(db, "uint", SQLITE_UTF8, 0, uintCollFunc);
3658 }
3659 
3660 /************************* End ../ext/misc/uint.c ********************/
3661 /************************* Begin ../ext/misc/decimal.c ******************/
3662 /*
3663 ** 2020-06-22
3664 **
3665 ** The author disclaims copyright to this source code.  In place of
3666 ** a legal notice, here is a blessing:
3667 **
3668 **    May you do good and not evil.
3669 **    May you find forgiveness for yourself and forgive others.
3670 **    May you share freely, never taking more than you give.
3671 **
3672 ******************************************************************************
3673 **
3674 ** Routines to implement arbitrary-precision decimal math.
3675 **
3676 ** The focus here is on simplicity and correctness, not performance.
3677 */
3678 /* #include "sqlite3ext.h" */
3679 SQLITE_EXTENSION_INIT1
3680 #include <assert.h>
3681 #include <string.h>
3682 #include <ctype.h>
3683 #include <stdlib.h>
3684 
3685 /* Mark a function parameter as unused, to suppress nuisance compiler
3686 ** warnings. */
3687 #ifndef UNUSED_PARAMETER
3688 # define UNUSED_PARAMETER(X)  (void)(X)
3689 #endif
3690 
3691 
3692 /* A decimal object */
3693 typedef struct Decimal Decimal;
3694 struct Decimal {
3695   char sign;        /* 0 for positive, 1 for negative */
3696   char oom;         /* True if an OOM is encountered */
3697   char isNull;      /* True if holds a NULL rather than a number */
3698   char isInit;      /* True upon initialization */
3699   int nDigit;       /* Total number of digits */
3700   int nFrac;        /* Number of digits to the right of the decimal point */
3701   signed char *a;   /* Array of digits.  Most significant first. */
3702 };
3703 
3704 /*
3705 ** Release memory held by a Decimal, but do not free the object itself.
3706 */
decimal_clear(Decimal * p)3707 static void decimal_clear(Decimal *p){
3708   sqlite3_free(p->a);
3709 }
3710 
3711 /*
3712 ** Destroy a Decimal object
3713 */
decimal_free(Decimal * p)3714 static void decimal_free(Decimal *p){
3715   if( p ){
3716     decimal_clear(p);
3717     sqlite3_free(p);
3718   }
3719 }
3720 
3721 /*
3722 ** Allocate a new Decimal object initialized to the text in zIn[].
3723 ** Return NULL if any kind of error occurs.
3724 */
decimalNewFromText(const char * zIn,int n)3725 static Decimal *decimalNewFromText(const char *zIn, int n){
3726   Decimal *p = 0;
3727   int i;
3728   int iExp = 0;
3729 
3730   p = sqlite3_malloc( sizeof(*p) );
3731   if( p==0 ) goto new_from_text_failed;
3732   p->sign = 0;
3733   p->oom = 0;
3734   p->isInit = 1;
3735   p->isNull = 0;
3736   p->nDigit = 0;
3737   p->nFrac = 0;
3738   p->a = sqlite3_malloc64( n+1 );
3739   if( p->a==0 ) goto new_from_text_failed;
3740   for(i=0; isspace(zIn[i]); i++){}
3741   if( zIn[i]=='-' ){
3742     p->sign = 1;
3743     i++;
3744   }else if( zIn[i]=='+' ){
3745     i++;
3746   }
3747   while( i<n && zIn[i]=='0' ) i++;
3748   while( i<n ){
3749     char c = zIn[i];
3750     if( c>='0' && c<='9' ){
3751       p->a[p->nDigit++] = c - '0';
3752     }else if( c=='.' ){
3753       p->nFrac = p->nDigit + 1;
3754     }else if( c=='e' || c=='E' ){
3755       int j = i+1;
3756       int neg = 0;
3757       if( j>=n ) break;
3758       if( zIn[j]=='-' ){
3759         neg = 1;
3760         j++;
3761       }else if( zIn[j]=='+' ){
3762         j++;
3763       }
3764       while( j<n && iExp<1000000 ){
3765         if( zIn[j]>='0' && zIn[j]<='9' ){
3766           iExp = iExp*10 + zIn[j] - '0';
3767         }
3768         j++;
3769       }
3770       if( neg ) iExp = -iExp;
3771       break;
3772     }
3773     i++;
3774   }
3775   if( p->nFrac ){
3776     p->nFrac = p->nDigit - (p->nFrac - 1);
3777   }
3778   if( iExp>0 ){
3779     if( p->nFrac>0 ){
3780       if( iExp<=p->nFrac ){
3781         p->nFrac -= iExp;
3782         iExp = 0;
3783       }else{
3784         iExp -= p->nFrac;
3785         p->nFrac = 0;
3786       }
3787     }
3788     if( iExp>0 ){
3789       p->a = sqlite3_realloc64(p->a, p->nDigit + iExp + 1 );
3790       if( p->a==0 ) goto new_from_text_failed;
3791       memset(p->a+p->nDigit, 0, iExp);
3792       p->nDigit += iExp;
3793     }
3794   }else if( iExp<0 ){
3795     int nExtra;
3796     iExp = -iExp;
3797     nExtra = p->nDigit - p->nFrac - 1;
3798     if( nExtra ){
3799       if( nExtra>=iExp ){
3800         p->nFrac += iExp;
3801         iExp  = 0;
3802       }else{
3803         iExp -= nExtra;
3804         p->nFrac = p->nDigit - 1;
3805       }
3806     }
3807     if( iExp>0 ){
3808       p->a = sqlite3_realloc64(p->a, p->nDigit + iExp + 1 );
3809       if( p->a==0 ) goto new_from_text_failed;
3810       memmove(p->a+iExp, p->a, p->nDigit);
3811       memset(p->a, 0, iExp);
3812       p->nDigit += iExp;
3813       p->nFrac += iExp;
3814     }
3815   }
3816   return p;
3817 
3818 new_from_text_failed:
3819   if( p ){
3820     if( p->a ) sqlite3_free(p->a);
3821     sqlite3_free(p);
3822   }
3823   return 0;
3824 }
3825 
3826 /* Forward reference */
3827 static Decimal *decimalFromDouble(double);
3828 
3829 /*
3830 ** Allocate a new Decimal object from an sqlite3_value.  Return a pointer
3831 ** to the new object, or NULL if there is an error.  If the pCtx argument
3832 ** is not NULL, then errors are reported on it as well.
3833 **
3834 ** If the pIn argument is SQLITE_TEXT or SQLITE_INTEGER, it is converted
3835 ** directly into a Decimal.  For SQLITE_FLOAT or for SQLITE_BLOB of length
3836 ** 8 bytes, the resulting double value is expanded into its decimal equivalent.
3837 ** If pIn is NULL or if it is a BLOB that is not exactly 8 bytes in length,
3838 ** then NULL is returned.
3839 */
decimal_new(sqlite3_context * pCtx,sqlite3_value * pIn,int bTextOnly)3840 static Decimal *decimal_new(
3841   sqlite3_context *pCtx,       /* Report error here, if not null */
3842   sqlite3_value *pIn,          /* Construct the decimal object from this */
3843   int bTextOnly                /* Always interpret pIn as text if true */
3844 ){
3845   Decimal *p = 0;
3846   int eType = sqlite3_value_type(pIn);
3847   if( bTextOnly && (eType==SQLITE_FLOAT || eType==SQLITE_BLOB) ){
3848     eType = SQLITE_TEXT;
3849   }
3850   switch( eType ){
3851     case SQLITE_TEXT:
3852     case SQLITE_INTEGER: {
3853       const char *zIn = (const char*)sqlite3_value_text(pIn);
3854       int n = sqlite3_value_bytes(pIn);
3855       p = decimalNewFromText(zIn, n);
3856       if( p==0 ) goto new_failed;
3857       break;
3858     }
3859 
3860     case SQLITE_FLOAT: {
3861       p = decimalFromDouble(sqlite3_value_double(pIn));
3862       break;
3863     }
3864 
3865     case SQLITE_BLOB: {
3866       const unsigned char *x;
3867       unsigned int i;
3868       sqlite3_uint64 v = 0;
3869       double r;
3870 
3871       if( sqlite3_value_bytes(pIn)!=sizeof(r) ) break;
3872       x = sqlite3_value_blob(pIn);
3873       for(i=0; i<sizeof(r); i++){
3874         v = (v<<8) | x[i];
3875       }
3876       memcpy(&r, &v, sizeof(r));
3877       p = decimalFromDouble(r);
3878       break;
3879     }
3880 
3881     case SQLITE_NULL: {
3882       break;
3883     }
3884   }
3885   return p;
3886 
3887 new_failed:
3888   if( pCtx ) sqlite3_result_error_nomem(pCtx);
3889   sqlite3_free(p);
3890   return 0;
3891 }
3892 
3893 /*
3894 ** Make the given Decimal the result.
3895 */
decimal_result(sqlite3_context * pCtx,Decimal * p)3896 static void decimal_result(sqlite3_context *pCtx, Decimal *p){
3897   char *z;
3898   int i, j;
3899   int n;
3900   if( p==0 || p->oom ){
3901     sqlite3_result_error_nomem(pCtx);
3902     return;
3903   }
3904   if( p->isNull ){
3905     sqlite3_result_null(pCtx);
3906     return;
3907   }
3908   z = sqlite3_malloc( p->nDigit+4 );
3909   if( z==0 ){
3910     sqlite3_result_error_nomem(pCtx);
3911     return;
3912   }
3913   i = 0;
3914   if( p->nDigit==0 || (p->nDigit==1 && p->a[0]==0) ){
3915     p->sign = 0;
3916   }
3917   if( p->sign ){
3918     z[0] = '-';
3919     i = 1;
3920   }
3921   n = p->nDigit - p->nFrac;
3922   if( n<=0 ){
3923     z[i++] = '0';
3924   }
3925   j = 0;
3926   while( n>1 && p->a[j]==0 ){
3927     j++;
3928     n--;
3929   }
3930   while( n>0  ){
3931     z[i++] = p->a[j] + '0';
3932     j++;
3933     n--;
3934   }
3935   if( p->nFrac ){
3936     z[i++] = '.';
3937     do{
3938       z[i++] = p->a[j] + '0';
3939       j++;
3940     }while( j<p->nDigit );
3941   }
3942   z[i] = 0;
3943   sqlite3_result_text(pCtx, z, i, sqlite3_free);
3944 }
3945 
3946 /*
3947 ** Make the given Decimal the result in an format similar to  '%+#e'.
3948 ** In other words, show exponential notation with leading and trailing
3949 ** zeros omitted.
3950 */
decimal_result_sci(sqlite3_context * pCtx,Decimal * p)3951 static void decimal_result_sci(sqlite3_context *pCtx, Decimal *p){
3952   char *z;       /* The output buffer */
3953   int i;         /* Loop counter */
3954   int nZero;     /* Number of leading zeros */
3955   int nDigit;    /* Number of digits not counting trailing zeros */
3956   int nFrac;     /* Digits to the right of the decimal point */
3957   int exp;       /* Exponent value */
3958   signed char zero;     /* Zero value */
3959   signed char *a;       /* Array of digits */
3960 
3961   if( p==0 || p->oom ){
3962     sqlite3_result_error_nomem(pCtx);
3963     return;
3964   }
3965   if( p->isNull ){
3966     sqlite3_result_null(pCtx);
3967     return;
3968   }
3969   for(nDigit=p->nDigit; nDigit>0 && p->a[nDigit-1]==0; nDigit--){}
3970   for(nZero=0; nZero<nDigit && p->a[nZero]==0; nZero++){}
3971   nFrac = p->nFrac + (nDigit - p->nDigit);
3972   nDigit -= nZero;
3973   z = sqlite3_malloc( nDigit+20 );
3974   if( z==0 ){
3975     sqlite3_result_error_nomem(pCtx);
3976     return;
3977   }
3978   if( nDigit==0 ){
3979     zero = 0;
3980     a = &zero;
3981     nDigit = 1;
3982     nFrac = 0;
3983   }else{
3984     a = &p->a[nZero];
3985   }
3986   if( p->sign && nDigit>0 ){
3987     z[0] = '-';
3988   }else{
3989     z[0] = '+';
3990   }
3991   z[1] = a[0]+'0';
3992   z[2] = '.';
3993   if( nDigit==1 ){
3994     z[3] = '0';
3995     i = 4;
3996   }else{
3997     for(i=1; i<nDigit; i++){
3998       z[2+i] = a[i]+'0';
3999     }
4000     i = nDigit+2;
4001   }
4002   exp = nDigit - nFrac - 1;
4003   sqlite3_snprintf(nDigit+20-i, &z[i], "e%+03d", exp);
4004   sqlite3_result_text(pCtx, z, -1, sqlite3_free);
4005 }
4006 
4007 /*
4008 ** Compare to Decimal objects.  Return negative, 0, or positive if the
4009 ** first object is less than, equal to, or greater than the second.
4010 **
4011 ** Preconditions for this routine:
4012 **
4013 **    pA!=0
4014 **    pA->isNull==0
4015 **    pB!=0
4016 **    pB->isNull==0
4017 */
decimal_cmp(const Decimal * pA,const Decimal * pB)4018 static int decimal_cmp(const Decimal *pA, const Decimal *pB){
4019   int nASig, nBSig, rc, n;
4020   if( pA->sign!=pB->sign ){
4021     return pA->sign ? -1 : +1;
4022   }
4023   if( pA->sign ){
4024     const Decimal *pTemp = pA;
4025     pA = pB;
4026     pB = pTemp;
4027   }
4028   nASig = pA->nDigit - pA->nFrac;
4029   nBSig = pB->nDigit - pB->nFrac;
4030   if( nASig!=nBSig ){
4031     return nASig - nBSig;
4032   }
4033   n = pA->nDigit;
4034   if( n>pB->nDigit ) n = pB->nDigit;
4035   rc = memcmp(pA->a, pB->a, n);
4036   if( rc==0 ){
4037     rc = pA->nDigit - pB->nDigit;
4038   }
4039   return rc;
4040 }
4041 
4042 /*
4043 ** SQL Function:   decimal_cmp(X, Y)
4044 **
4045 ** Return negative, zero, or positive if X is less then, equal to, or
4046 ** greater than Y.
4047 */
decimalCmpFunc(sqlite3_context * context,int argc,sqlite3_value ** argv)4048 static void decimalCmpFunc(
4049   sqlite3_context *context,
4050   int argc,
4051   sqlite3_value **argv
4052 ){
4053   Decimal *pA = 0, *pB = 0;
4054   int rc;
4055 
4056   UNUSED_PARAMETER(argc);
4057   pA = decimal_new(context, argv[0], 1);
4058   if( pA==0 || pA->isNull ) goto cmp_done;
4059   pB = decimal_new(context, argv[1], 1);
4060   if( pB==0 || pB->isNull ) goto cmp_done;
4061   rc = decimal_cmp(pA, pB);
4062   if( rc<0 ) rc = -1;
4063   else if( rc>0 ) rc = +1;
4064   sqlite3_result_int(context, rc);
4065 cmp_done:
4066   decimal_free(pA);
4067   decimal_free(pB);
4068 }
4069 
4070 /*
4071 ** Expand the Decimal so that it has a least nDigit digits and nFrac
4072 ** digits to the right of the decimal point.
4073 */
decimal_expand(Decimal * p,int nDigit,int nFrac)4074 static void decimal_expand(Decimal *p, int nDigit, int nFrac){
4075   int nAddSig;
4076   int nAddFrac;
4077   if( p==0 ) return;
4078   nAddFrac = nFrac - p->nFrac;
4079   nAddSig = (nDigit - p->nDigit) - nAddFrac;
4080   if( nAddFrac==0 && nAddSig==0 ) return;
4081   p->a = sqlite3_realloc64(p->a, nDigit+1);
4082   if( p->a==0 ){
4083     p->oom = 1;
4084     return;
4085   }
4086   if( nAddSig ){
4087     memmove(p->a+nAddSig, p->a, p->nDigit);
4088     memset(p->a, 0, nAddSig);
4089     p->nDigit += nAddSig;
4090   }
4091   if( nAddFrac ){
4092     memset(p->a+p->nDigit, 0, nAddFrac);
4093     p->nDigit += nAddFrac;
4094     p->nFrac += nAddFrac;
4095   }
4096 }
4097 
4098 /*
4099 ** Add the value pB into pA.   A := A + B.
4100 **
4101 ** Both pA and pB might become denormalized by this routine.
4102 */
decimal_add(Decimal * pA,Decimal * pB)4103 static void decimal_add(Decimal *pA, Decimal *pB){
4104   int nSig, nFrac, nDigit;
4105   int i, rc;
4106   if( pA==0 ){
4107     return;
4108   }
4109   if( pA->oom || pB==0 || pB->oom ){
4110     pA->oom = 1;
4111     return;
4112   }
4113   if( pA->isNull || pB->isNull ){
4114     pA->isNull = 1;
4115     return;
4116   }
4117   nSig = pA->nDigit - pA->nFrac;
4118   if( nSig && pA->a[0]==0 ) nSig--;
4119   if( nSig<pB->nDigit-pB->nFrac ){
4120     nSig = pB->nDigit - pB->nFrac;
4121   }
4122   nFrac = pA->nFrac;
4123   if( nFrac<pB->nFrac ) nFrac = pB->nFrac;
4124   nDigit = nSig + nFrac + 1;
4125   decimal_expand(pA, nDigit, nFrac);
4126   decimal_expand(pB, nDigit, nFrac);
4127   if( pA->oom || pB->oom ){
4128     pA->oom = 1;
4129   }else{
4130     if( pA->sign==pB->sign ){
4131       int carry = 0;
4132       for(i=nDigit-1; i>=0; i--){
4133         int x = pA->a[i] + pB->a[i] + carry;
4134         if( x>=10 ){
4135           carry = 1;
4136           pA->a[i] = x - 10;
4137         }else{
4138           carry = 0;
4139           pA->a[i] = x;
4140         }
4141       }
4142     }else{
4143       signed char *aA, *aB;
4144       int borrow = 0;
4145       rc = memcmp(pA->a, pB->a, nDigit);
4146       if( rc<0 ){
4147         aA = pB->a;
4148         aB = pA->a;
4149         pA->sign = !pA->sign;
4150       }else{
4151         aA = pA->a;
4152         aB = pB->a;
4153       }
4154       for(i=nDigit-1; i>=0; i--){
4155         int x = aA[i] - aB[i] - borrow;
4156         if( x<0 ){
4157           pA->a[i] = x+10;
4158           borrow = 1;
4159         }else{
4160           pA->a[i] = x;
4161           borrow = 0;
4162         }
4163       }
4164     }
4165   }
4166 }
4167 
4168 /*
4169 ** Multiply A by B.   A := A * B
4170 **
4171 ** All significant digits after the decimal point are retained.
4172 ** Trailing zeros after the decimal point are omitted as long as
4173 ** the number of digits after the decimal point is no less than
4174 ** either the number of digits in either input.
4175 */
decimalMul(Decimal * pA,Decimal * pB)4176 static void decimalMul(Decimal *pA, Decimal *pB){
4177   signed char *acc = 0;
4178   int i, j, k;
4179   int minFrac;
4180 
4181   if( pA==0 || pA->oom || pA->isNull
4182    || pB==0 || pB->oom || pB->isNull
4183   ){
4184     goto mul_end;
4185   }
4186   acc = sqlite3_malloc64( pA->nDigit + pB->nDigit + 2 );
4187   if( acc==0 ){
4188     pA->oom = 1;
4189     goto mul_end;
4190   }
4191   memset(acc, 0, pA->nDigit + pB->nDigit + 2);
4192   minFrac = pA->nFrac;
4193   if( pB->nFrac<minFrac ) minFrac = pB->nFrac;
4194   for(i=pA->nDigit-1; i>=0; i--){
4195     signed char f = pA->a[i];
4196     int carry = 0, x;
4197     for(j=pB->nDigit-1, k=i+j+3; j>=0; j--, k--){
4198       x = acc[k] + f*pB->a[j] + carry;
4199       acc[k] = x%10;
4200       carry = x/10;
4201     }
4202     x = acc[k] + carry;
4203     acc[k] = x%10;
4204     acc[k-1] += x/10;
4205   }
4206   sqlite3_free(pA->a);
4207   pA->a = acc;
4208   acc = 0;
4209   pA->nDigit += pB->nDigit + 2;
4210   pA->nFrac += pB->nFrac;
4211   pA->sign ^= pB->sign;
4212   while( pA->nFrac>minFrac && pA->a[pA->nDigit-1]==0 ){
4213     pA->nFrac--;
4214     pA->nDigit--;
4215   }
4216 
4217 mul_end:
4218   sqlite3_free(acc);
4219 }
4220 
4221 /*
4222 ** Create a new Decimal object that contains an integer power of 2.
4223 */
decimalPow2(int N)4224 static Decimal *decimalPow2(int N){
4225   Decimal *pA = 0;      /* The result to be returned */
4226   Decimal *pX = 0;      /* Multiplier */
4227   if( N<-20000 || N>20000 ) goto pow2_fault;
4228   pA = decimalNewFromText("1.0", 3);
4229   if( pA==0 || pA->oom ) goto pow2_fault;
4230   if( N==0 ) return pA;
4231   if( N>0 ){
4232     pX = decimalNewFromText("2.0", 3);
4233   }else{
4234     N = -N;
4235     pX = decimalNewFromText("0.5", 3);
4236   }
4237   if( pX==0 || pX->oom ) goto pow2_fault;
4238   while( 1 /* Exit by break */ ){
4239     if( N & 1 ){
4240       decimalMul(pA, pX);
4241       if( pA->oom ) goto pow2_fault;
4242     }
4243     N >>= 1;
4244     if( N==0 ) break;
4245     decimalMul(pX, pX);
4246   }
4247   decimal_free(pX);
4248   return pA;
4249 
4250 pow2_fault:
4251   decimal_free(pA);
4252   decimal_free(pX);
4253   return 0;
4254 }
4255 
4256 /*
4257 ** Use an IEEE754 binary64 ("double") to generate a new Decimal object.
4258 */
decimalFromDouble(double r)4259 static Decimal *decimalFromDouble(double r){
4260   sqlite3_int64 m, a;
4261   int e;
4262   int isNeg;
4263   Decimal *pA;
4264   Decimal *pX;
4265   char zNum[100];
4266   if( r<0.0 ){
4267     isNeg = 1;
4268     r = -r;
4269   }else{
4270     isNeg = 0;
4271   }
4272   memcpy(&a,&r,sizeof(a));
4273   if( a==0 ){
4274     e = 0;
4275     m = 0;
4276   }else{
4277     e = a>>52;
4278     m = a & ((((sqlite3_int64)1)<<52)-1);
4279     if( e==0 ){
4280       m <<= 1;
4281     }else{
4282       m |= ((sqlite3_int64)1)<<52;
4283     }
4284     while( e<1075 && m>0 && (m&1)==0 ){
4285       m >>= 1;
4286       e++;
4287     }
4288     if( isNeg ) m = -m;
4289     e = e - 1075;
4290     if( e>971 ){
4291       return 0;  /* A NaN or an Infinity */
4292     }
4293   }
4294 
4295   /* At this point m is the integer significand and e is the exponent */
4296   sqlite3_snprintf(sizeof(zNum), zNum, "%lld", m);
4297   pA = decimalNewFromText(zNum, (int)strlen(zNum));
4298   pX = decimalPow2(e);
4299   decimalMul(pA, pX);
4300   decimal_free(pX);
4301   return pA;
4302 }
4303 
4304 /*
4305 ** SQL Function:   decimal(X)
4306 ** OR:             decimal_exp(X)
4307 **
4308 ** Convert input X into decimal and then back into text.
4309 **
4310 ** If X is originally a float, then a full decimal expansion of that floating
4311 ** point value is done.  Or if X is an 8-byte blob, it is interpreted
4312 ** as a float and similarly expanded.
4313 **
4314 ** The decimal_exp(X) function returns the result in exponential notation.
4315 ** decimal(X) returns a complete decimal, without the e+NNN at the end.
4316 */
decimalFunc(sqlite3_context * context,int argc,sqlite3_value ** argv)4317 static void decimalFunc(
4318   sqlite3_context *context,
4319   int argc,
4320   sqlite3_value **argv
4321 ){
4322   Decimal *p =  decimal_new(context, argv[0], 0);
4323   UNUSED_PARAMETER(argc);
4324   if( p ){
4325     if( sqlite3_user_data(context)!=0 ){
4326       decimal_result_sci(context, p);
4327     }else{
4328       decimal_result(context, p);
4329     }
4330     decimal_free(p);
4331   }
4332 }
4333 
4334 /*
4335 ** Compare text in decimal order.
4336 */
decimalCollFunc(void * notUsed,int nKey1,const void * pKey1,int nKey2,const void * pKey2)4337 static int decimalCollFunc(
4338   void *notUsed,
4339   int nKey1, const void *pKey1,
4340   int nKey2, const void *pKey2
4341 ){
4342   const unsigned char *zA = (const unsigned char*)pKey1;
4343   const unsigned char *zB = (const unsigned char*)pKey2;
4344   Decimal *pA = decimalNewFromText((const char*)zA, nKey1);
4345   Decimal *pB = decimalNewFromText((const char*)zB, nKey2);
4346   int rc;
4347   UNUSED_PARAMETER(notUsed);
4348   if( pA==0 || pB==0 ){
4349     rc = 0;
4350   }else{
4351     rc = decimal_cmp(pA, pB);
4352   }
4353   decimal_free(pA);
4354   decimal_free(pB);
4355   return rc;
4356 }
4357 
4358 
4359 /*
4360 ** SQL Function:   decimal_add(X, Y)
4361 **                 decimal_sub(X, Y)
4362 **
4363 ** Return the sum or difference of X and Y.
4364 */
decimalAddFunc(sqlite3_context * context,int argc,sqlite3_value ** argv)4365 static void decimalAddFunc(
4366   sqlite3_context *context,
4367   int argc,
4368   sqlite3_value **argv
4369 ){
4370   Decimal *pA = decimal_new(context, argv[0], 1);
4371   Decimal *pB = decimal_new(context, argv[1], 1);
4372   UNUSED_PARAMETER(argc);
4373   decimal_add(pA, pB);
4374   decimal_result(context, pA);
4375   decimal_free(pA);
4376   decimal_free(pB);
4377 }
decimalSubFunc(sqlite3_context * context,int argc,sqlite3_value ** argv)4378 static void decimalSubFunc(
4379   sqlite3_context *context,
4380   int argc,
4381   sqlite3_value **argv
4382 ){
4383   Decimal *pA = decimal_new(context, argv[0], 1);
4384   Decimal *pB = decimal_new(context, argv[1], 1);
4385   UNUSED_PARAMETER(argc);
4386   if( pB ){
4387     pB->sign = !pB->sign;
4388     decimal_add(pA, pB);
4389     decimal_result(context, pA);
4390   }
4391   decimal_free(pA);
4392   decimal_free(pB);
4393 }
4394 
4395 /* Aggregate funcion:   decimal_sum(X)
4396 **
4397 ** Works like sum() except that it uses decimal arithmetic for unlimited
4398 ** precision.
4399 */
decimalSumStep(sqlite3_context * context,int argc,sqlite3_value ** argv)4400 static void decimalSumStep(
4401   sqlite3_context *context,
4402   int argc,
4403   sqlite3_value **argv
4404 ){
4405   Decimal *p;
4406   Decimal *pArg;
4407   UNUSED_PARAMETER(argc);
4408   p = sqlite3_aggregate_context(context, sizeof(*p));
4409   if( p==0 ) return;
4410   if( !p->isInit ){
4411     p->isInit = 1;
4412     p->a = sqlite3_malloc(2);
4413     if( p->a==0 ){
4414       p->oom = 1;
4415     }else{
4416       p->a[0] = 0;
4417     }
4418     p->nDigit = 1;
4419     p->nFrac = 0;
4420   }
4421   if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
4422   pArg = decimal_new(context, argv[0], 1);
4423   decimal_add(p, pArg);
4424   decimal_free(pArg);
4425 }
decimalSumInverse(sqlite3_context * context,int argc,sqlite3_value ** argv)4426 static void decimalSumInverse(
4427   sqlite3_context *context,
4428   int argc,
4429   sqlite3_value **argv
4430 ){
4431   Decimal *p;
4432   Decimal *pArg;
4433   UNUSED_PARAMETER(argc);
4434   p = sqlite3_aggregate_context(context, sizeof(*p));
4435   if( p==0 ) return;
4436   if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
4437   pArg = decimal_new(context, argv[0], 1);
4438   if( pArg ) pArg->sign = !pArg->sign;
4439   decimal_add(p, pArg);
4440   decimal_free(pArg);
4441 }
decimalSumValue(sqlite3_context * context)4442 static void decimalSumValue(sqlite3_context *context){
4443   Decimal *p = sqlite3_aggregate_context(context, 0);
4444   if( p==0 ) return;
4445   decimal_result(context, p);
4446 }
decimalSumFinalize(sqlite3_context * context)4447 static void decimalSumFinalize(sqlite3_context *context){
4448   Decimal *p = sqlite3_aggregate_context(context, 0);
4449   if( p==0 ) return;
4450   decimal_result(context, p);
4451   decimal_clear(p);
4452 }
4453 
4454 /*
4455 ** SQL Function:   decimal_mul(X, Y)
4456 **
4457 ** Return the product of X and Y.
4458 */
decimalMulFunc(sqlite3_context * context,int argc,sqlite3_value ** argv)4459 static void decimalMulFunc(
4460   sqlite3_context *context,
4461   int argc,
4462   sqlite3_value **argv
4463 ){
4464   Decimal *pA = decimal_new(context, argv[0], 1);
4465   Decimal *pB = decimal_new(context, argv[1], 1);
4466   UNUSED_PARAMETER(argc);
4467   if( pA==0 || pA->oom || pA->isNull
4468    || pB==0 || pB->oom || pB->isNull
4469   ){
4470     goto mul_end;
4471   }
4472   decimalMul(pA, pB);
4473   if( pA->oom ){
4474     goto mul_end;
4475   }
4476   decimal_result(context, pA);
4477 
4478 mul_end:
4479   decimal_free(pA);
4480   decimal_free(pB);
4481 }
4482 
4483 /*
4484 ** SQL Function:   decimal_pow2(N)
4485 **
4486 ** Return the N-th power of 2.  N must be an integer.
4487 */
decimalPow2Func(sqlite3_context * context,int argc,sqlite3_value ** argv)4488 static void decimalPow2Func(
4489   sqlite3_context *context,
4490   int argc,
4491   sqlite3_value **argv
4492 ){
4493   UNUSED_PARAMETER(argc);
4494   if( sqlite3_value_type(argv[0])==SQLITE_INTEGER ){
4495     Decimal *pA = decimalPow2(sqlite3_value_int(argv[0]));
4496     decimal_result_sci(context, pA);
4497     decimal_free(pA);
4498   }
4499 }
4500 
4501 #ifdef _WIN32
4502 
4503 #endif
sqlite3_decimal_init(sqlite3 * db,char ** pzErrMsg,const sqlite3_api_routines * pApi)4504 int sqlite3_decimal_init(
4505   sqlite3 *db,
4506   char **pzErrMsg,
4507   const sqlite3_api_routines *pApi
4508 ){
4509   int rc = SQLITE_OK;
4510   static const struct {
4511     const char *zFuncName;
4512     int nArg;
4513     int iArg;
4514     void (*xFunc)(sqlite3_context*,int,sqlite3_value**);
4515   } aFunc[] = {
4516     { "decimal",       1, 0,  decimalFunc        },
4517     { "decimal_exp",   1, 1,  decimalFunc        },
4518     { "decimal_cmp",   2, 0,  decimalCmpFunc     },
4519     { "decimal_add",   2, 0,  decimalAddFunc     },
4520     { "decimal_sub",   2, 0,  decimalSubFunc     },
4521     { "decimal_mul",   2, 0,  decimalMulFunc     },
4522     { "decimal_pow2",  1, 0,  decimalPow2Func    },
4523   };
4524   unsigned int i;
4525   (void)pzErrMsg;  /* Unused parameter */
4526 
4527   SQLITE_EXTENSION_INIT2(pApi);
4528 
4529   for(i=0; i<(int)(sizeof(aFunc)/sizeof(aFunc[0])) && rc==SQLITE_OK; i++){
4530     rc = sqlite3_create_function(db, aFunc[i].zFuncName, aFunc[i].nArg,
4531                    SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC,
4532                    aFunc[i].iArg ? db : 0, aFunc[i].xFunc, 0, 0);
4533   }
4534   if( rc==SQLITE_OK ){
4535     rc = sqlite3_create_window_function(db, "decimal_sum", 1,
4536                    SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC, 0,
4537                    decimalSumStep, decimalSumFinalize,
4538                    decimalSumValue, decimalSumInverse, 0);
4539   }
4540   if( rc==SQLITE_OK ){
4541     rc = sqlite3_create_collation(db, "decimal", SQLITE_UTF8,
4542                                   0, decimalCollFunc);
4543   }
4544   return rc;
4545 }
4546 
4547 /************************* End ../ext/misc/decimal.c ********************/
4548 #undef sqlite3_base_init
4549 #define sqlite3_base_init sqlite3_base64_init
4550 /************************* Begin ../ext/misc/base64.c ******************/
4551 /*
4552 ** 2022-11-18
4553 **
4554 ** The author disclaims copyright to this source code.  In place of
4555 ** a legal notice, here is a blessing:
4556 **
4557 **    May you do good and not evil.
4558 **    May you find forgiveness for yourself and forgive others.
4559 **    May you share freely, never taking more than you give.
4560 **
4561 *************************************************************************
4562 **
4563 ** This is a SQLite extension for converting in either direction
4564 ** between a (binary) blob and base64 text. Base64 can transit a
4565 ** sane USASCII channel unmolested. It also plays nicely in CSV or
4566 ** written as TCL brace-enclosed literals or SQL string literals,
4567 ** and can be used unmodified in XML-like documents.
4568 **
4569 ** This is an independent implementation of conversions specified in
4570 ** RFC 4648, done on the above date by the author (Larry Brasfield)
4571 ** who thereby has the right to put this into the public domain.
4572 **
4573 ** The conversions meet RFC 4648 requirements, provided that this
4574 ** C source specifies that line-feeds are included in the encoded
4575 ** data to limit visible line lengths to 72 characters and to
4576 ** terminate any encoded blob having non-zero length.
4577 **
4578 ** Length limitations are not imposed except that the runtime
4579 ** SQLite string or blob length limits are respected. Otherwise,
4580 ** any length binary sequence can be represented and recovered.
4581 ** Generated base64 sequences, with their line-feeds included,
4582 ** can be concatenated; the result converted back to binary will
4583 ** be the concatenation of the represented binary sequences.
4584 **
4585 ** This SQLite3 extension creates a function, base64(x), which
4586 ** either: converts text x containing base64 to a returned blob;
4587 ** or converts a blob x to returned text containing base64. An
4588 ** error will be thrown for other input argument types.
4589 **
4590 ** This code relies on UTF-8 encoding only with respect to the
4591 ** meaning of the first 128 (7-bit) codes matching that of USASCII.
4592 ** It will fail miserably if somehow made to try to convert EBCDIC.
4593 ** Because it is table-driven, it could be enhanced to handle that,
4594 ** but the world and SQLite have moved on from that anachronism.
4595 **
4596 ** To build the extension:
4597 ** Set shell variable SQDIR=<your favorite SQLite checkout directory>
4598 ** *Nix: gcc -O2 -shared -I$SQDIR -fPIC -o base64.so base64.c
4599 ** OSX: gcc -O2 -dynamiclib -fPIC -I$SQDIR -o base64.dylib base64.c
4600 ** Win32: gcc -O2 -shared -I%SQDIR% -o base64.dll base64.c
4601 ** Win32: cl /Os -I%SQDIR% base64.c -link -dll -out:base64.dll
4602 */
4603 
4604 #include <assert.h>
4605 
4606 /* #include "sqlite3ext.h" */
4607 
4608 #ifndef deliberate_fall_through
4609 /* Quiet some compilers about some of our intentional code. */
4610 # if GCC_VERSION>=7000000
4611 #  define deliberate_fall_through __attribute__((fallthrough));
4612 # else
4613 #  define deliberate_fall_through
4614 # endif
4615 #endif
4616 
4617 SQLITE_EXTENSION_INIT1;
4618 
4619 #define PC 0x80 /* pad character */
4620 #define WS 0x81 /* whitespace */
4621 #define ND 0x82 /* Not above or digit-value */
4622 #define PAD_CHAR '='
4623 
4624 #ifndef U8_TYPEDEF
4625 /* typedef unsigned char u8; */
4626 #define U8_TYPEDEF
4627 #endif
4628 
4629 /* Decoding table, ASCII (7-bit) value to base 64 digit value or other */
4630 static const u8 b64DigitValues[128] = {
4631   /*                             HT LF VT  FF CR       */
4632     ND,ND,ND,ND, ND,ND,ND,ND, ND,WS,WS,WS, WS,WS,ND,ND,
4633   /*                                                US */
4634     ND,ND,ND,ND, ND,ND,ND,ND, ND,ND,ND,ND, ND,ND,ND,ND,
4635   /*sp                                  +            / */
4636     WS,ND,ND,ND, ND,ND,ND,ND, ND,ND,ND,62, ND,ND,ND,63,
4637   /* 0  1            5            9            =       */
4638     52,53,54,55, 56,57,58,59, 60,61,ND,ND, ND,PC,ND,ND,
4639   /*    A                                            O */
4640     ND, 0, 1, 2,  3, 4, 5, 6,  7, 8, 9,10, 11,12,13,14,
4641   /* P                               Z                 */
4642     15,16,17,18, 19,20,21,22, 23,24,25,ND, ND,ND,ND,ND,
4643   /*    a                                            o */
4644     ND,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40,
4645   /* p                               z                 */
4646     41,42,43,44, 45,46,47,48, 49,50,51,ND, ND,ND,ND,ND
4647 };
4648 
4649 static const char b64Numerals[64+1]
4650 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
4651 
4652 #define BX_DV_PROTO(c) \
4653   ((((u8)(c))<0x80)? (u8)(b64DigitValues[(u8)(c)]) : 0x80)
4654 #define IS_BX_DIGIT(bdp) (((u8)(bdp))<0x80)
4655 #define IS_BX_WS(bdp) ((bdp)==WS)
4656 #define IS_BX_PAD(bdp) ((bdp)==PC)
4657 #define BX_NUMERAL(dv) (b64Numerals[(u8)(dv)])
4658 /* Width of base64 lines. Should be an integer multiple of 4. */
4659 #define B64_DARK_MAX 72
4660 
4661 /* Encode a byte buffer into base64 text with linefeeds appended to limit
4662 ** encoded group lengths to B64_DARK_MAX or to terminate the last group.
4663 */
toBase64(u8 * pIn,int nbIn,char * pOut)4664 static char* toBase64( u8 *pIn, int nbIn, char *pOut ){
4665   int nCol = 0;
4666   while( nbIn >= 3 ){
4667     /* Do the bit-shuffle, exploiting unsigned input to avoid masking. */
4668     pOut[0] = BX_NUMERAL(pIn[0]>>2);
4669     pOut[1] = BX_NUMERAL(((pIn[0]<<4)|(pIn[1]>>4))&0x3f);
4670     pOut[2] = BX_NUMERAL(((pIn[1]&0xf)<<2)|(pIn[2]>>6));
4671     pOut[3] = BX_NUMERAL(pIn[2]&0x3f);
4672     pOut += 4;
4673     nbIn -= 3;
4674     pIn += 3;
4675     if( (nCol += 4)>=B64_DARK_MAX || nbIn<=0 ){
4676       *pOut++ = '\n';
4677       nCol = 0;
4678     }
4679   }
4680   if( nbIn > 0 ){
4681     signed char nco = nbIn+1;
4682     int nbe;
4683     unsigned long qv = *pIn++;
4684     for( nbe=1; nbe<3; ++nbe ){
4685       qv <<= 8;
4686       if( nbe<nbIn ) qv |= *pIn++;
4687     }
4688     for( nbe=3; nbe>=0; --nbe ){
4689       char ce = (nbe<nco)? BX_NUMERAL((u8)(qv & 0x3f)) : PAD_CHAR;
4690       qv >>= 6;
4691       pOut[nbe] = ce;
4692     }
4693     pOut += 4;
4694     *pOut++ = '\n';
4695   }
4696   *pOut = 0;
4697   return pOut;
4698 }
4699 
4700 /* Skip over text which is not base64 numeral(s). */
skipNonB64(char * s,int nc)4701 static char * skipNonB64( char *s, int nc ){
4702   char c;
4703   while( nc-- > 0 && (c = *s) && !IS_BX_DIGIT(BX_DV_PROTO(c)) ) ++s;
4704   return s;
4705 }
4706 
4707 /* Decode base64 text into a byte buffer. */
fromBase64(char * pIn,int ncIn,u8 * pOut)4708 static u8* fromBase64( char *pIn, int ncIn, u8 *pOut ){
4709   if( ncIn>0 && pIn[ncIn-1]=='\n' ) --ncIn;
4710   while( ncIn>0 && *pIn!=PAD_CHAR ){
4711     static signed char nboi[] = { 0, 0, 1, 2, 3 };
4712     char *pUse = skipNonB64(pIn, ncIn);
4713     unsigned long qv = 0L;
4714     int nti, nbo, nac;
4715     ncIn -= (pUse - pIn);
4716     pIn = pUse;
4717     nti = (ncIn>4)? 4 : ncIn;
4718     ncIn -= nti;
4719     nbo = nboi[nti];
4720     if( nbo==0 ) break;
4721     for( nac=0; nac<4; ++nac ){
4722       char c = (nac<nti)? *pIn++ : b64Numerals[0];
4723       u8 bdp = BX_DV_PROTO(c);
4724       switch( bdp ){
4725       case ND:
4726         /*  Treat dark non-digits as pad, but they terminate decode too. */
4727         ncIn = 0;
4728         deliberate_fall_through;
4729       case WS:
4730         /* Treat whitespace as pad and terminate this group.*/
4731         nti = nac;
4732         deliberate_fall_through;
4733       case PC:
4734         bdp = 0;
4735         --nbo;
4736         deliberate_fall_through;
4737       default: /* bdp is the digit value. */
4738         qv = qv<<6 | bdp;
4739         break;
4740       }
4741     }
4742     switch( nbo ){
4743     case 3:
4744       pOut[2] = (qv) & 0xff;
4745     case 2:
4746       pOut[1] = (qv>>8) & 0xff;
4747     case 1:
4748       pOut[0] = (qv>>16) & 0xff;
4749     }
4750     pOut += nbo;
4751   }
4752   return pOut;
4753 }
4754 
4755 /* This function does the work for the SQLite base64(x) UDF. */
base64(sqlite3_context * context,int na,sqlite3_value * av[])4756 static void base64(sqlite3_context *context, int na, sqlite3_value *av[]){
4757   int nb, nc, nv = sqlite3_value_bytes(av[0]);
4758   int nvMax = sqlite3_limit(sqlite3_context_db_handle(context),
4759                             SQLITE_LIMIT_LENGTH, -1);
4760   char *cBuf;
4761   u8 *bBuf;
4762   assert(na==1);
4763   switch( sqlite3_value_type(av[0]) ){
4764   case SQLITE_BLOB:
4765     nb = nv;
4766     nc = 4*(nv+2/3); /* quads needed */
4767     nc += (nc+(B64_DARK_MAX-1))/B64_DARK_MAX + 1; /* LFs and a 0-terminator */
4768     if( nvMax < nc ){
4769       sqlite3_result_error(context, "blob expanded to base64 too big", -1);
4770       return;
4771     }
4772     bBuf = (u8*)sqlite3_value_blob(av[0]);
4773     if( !bBuf ){
4774       if( SQLITE_NOMEM==sqlite3_errcode(sqlite3_context_db_handle(context)) ){
4775         goto memFail;
4776       }
4777       sqlite3_result_text(context,"",-1,SQLITE_STATIC);
4778       break;
4779     }
4780     cBuf = sqlite3_malloc(nc);
4781     if( !cBuf ) goto memFail;
4782     nc = (int)(toBase64(bBuf, nb, cBuf) - cBuf);
4783     sqlite3_result_text(context, cBuf, nc, sqlite3_free);
4784     break;
4785   case SQLITE_TEXT:
4786     nc = nv;
4787     nb = 3*((nv+3)/4); /* may overestimate due to LF and padding */
4788     if( nvMax < nb ){
4789       sqlite3_result_error(context, "blob from base64 may be too big", -1);
4790       return;
4791     }else if( nb<1 ){
4792       nb = 1;
4793     }
4794     cBuf = (char *)sqlite3_value_text(av[0]);
4795     if( !cBuf ){
4796       if( SQLITE_NOMEM==sqlite3_errcode(sqlite3_context_db_handle(context)) ){
4797         goto memFail;
4798       }
4799       sqlite3_result_zeroblob(context, 0);
4800       break;
4801     }
4802     bBuf = sqlite3_malloc(nb);
4803     if( !bBuf ) goto memFail;
4804     nb = (int)(fromBase64(cBuf, nc, bBuf) - bBuf);
4805     sqlite3_result_blob(context, bBuf, nb, sqlite3_free);
4806     break;
4807   default:
4808     sqlite3_result_error(context, "base64 accepts only blob or text", -1);
4809     return;
4810   }
4811   return;
4812  memFail:
4813   sqlite3_result_error(context, "base64 OOM", -1);
4814 }
4815 
4816 /*
4817 ** Establish linkage to running SQLite library.
4818 */
4819 #ifndef SQLITE_SHELL_EXTFUNCS
4820 #ifdef _WIN32
4821 
4822 #endif
sqlite3_base_init(sqlite3 * db,char ** pzErr,const sqlite3_api_routines * pApi)4823 int sqlite3_base_init
4824 #else
4825 static int sqlite3_base64_init
4826 #endif
4827 (sqlite3 *db, char **pzErr, const sqlite3_api_routines *pApi){
4828   SQLITE_EXTENSION_INIT2(pApi);
4829   (void)pzErr;
4830   return sqlite3_create_function
4831     (db, "base64", 1,
4832      SQLITE_DETERMINISTIC|SQLITE_INNOCUOUS|SQLITE_DIRECTONLY|SQLITE_UTF8,
4833      0, base64, 0, 0);
4834 }
4835 
4836 /*
4837 ** Define some macros to allow this extension to be built into the shell
4838 ** conveniently, in conjunction with use of SQLITE_SHELL_EXTFUNCS. This
4839 ** allows shell.c, as distributed, to have this extension built in.
4840 */
4841 #define BASE64_INIT(db) sqlite3_base64_init(db, 0, 0)
4842 #define BASE64_EXPOSE(db, pzErr) /* Not needed, ..._init() does this. */
4843 
4844 /************************* End ../ext/misc/base64.c ********************/
4845 #undef sqlite3_base_init
4846 #define sqlite3_base_init sqlite3_base85_init
4847 #define OMIT_BASE85_CHECKER
4848 /************************* Begin ../ext/misc/base85.c ******************/
4849 /*
4850 ** 2022-11-16
4851 **
4852 ** The author disclaims copyright to this source code.  In place of
4853 ** a legal notice, here is a blessing:
4854 **
4855 **    May you do good and not evil.
4856 **    May you find forgiveness for yourself and forgive others.
4857 **    May you share freely, never taking more than you give.
4858 **
4859 *************************************************************************
4860 **
4861 ** This is a utility for converting binary to base85 or vice-versa.
4862 ** It can be built as a standalone program or an SQLite3 extension.
4863 **
4864 ** Much like base64 representations, base85 can be sent through a
4865 ** sane USASCII channel unmolested. It also plays nicely in CSV or
4866 ** written as TCL brace-enclosed literals or SQL string literals.
4867 ** It is not suited for unmodified use in XML-like documents.
4868 **
4869 ** The encoding used resembles Ascii85, but was devised by the author
4870 ** (Larry Brasfield) before Mozilla, Adobe, ZMODEM or other Ascii85
4871 ** variant sources existed, in the 1984 timeframe on a VAX mainframe.
4872 ** Further, this is an independent implementation of a base85 system.
4873 ** Hence, the author has rightfully put this into the public domain.
4874 **
4875 ** Base85 numerals are taken from the set of 7-bit USASCII codes,
4876 ** excluding control characters and Space ! " ' ( ) { | } ~ Del
4877 ** in code order representing digit values 0 to 84 (base 10.)
4878 **
4879 ** Groups of 4 bytes, interpreted as big-endian 32-bit values,
4880 ** are represented as 5-digit base85 numbers with MS to LS digit
4881 ** order. Groups of 1-3 bytes are represented with 2-4 digits,
4882 ** still big-endian but 8-24 bit values. (Using big-endian yields
4883 ** the simplest transition to byte groups smaller than 4 bytes.
4884 ** These byte groups can also be considered base-256 numbers.)
4885 ** Groups of 0 bytes are represented with 0 digits and vice-versa.
4886 ** No pad characters are used; Encoded base85 numeral sequence
4887 ** (aka "group") length maps 1-to-1 to the decoded binary length.
4888 **
4889 ** Any character not in the base85 numeral set delimits groups.
4890 ** When base85 is streamed or stored in containers of indefinite
4891 ** size, newline is used to separate it into sub-sequences of no
4892 ** more than 80 digits so that fgets() can be used to read it.
4893 **
4894 ** Length limitations are not imposed except that the runtime
4895 ** SQLite string or blob length limits are respected. Otherwise,
4896 ** any length binary sequence can be represented and recovered.
4897 ** Base85 sequences can be concatenated by separating them with
4898 ** a non-base85 character; the conversion to binary will then
4899 ** be the concatenation of the represented binary sequences.
4900 
4901 ** The standalone program either converts base85 on stdin to create
4902 ** a binary file or converts a binary file to base85 on stdout.
4903 ** Read or make it blurt its help for invocation details.
4904 **
4905 ** The SQLite3 extension creates a function, base85(x), which will
4906 ** either convert text base85 to a blob or a blob to text base85
4907 ** and return the result (or throw an error for other types.)
4908 ** Unless built with OMIT_BASE85_CHECKER defined, it also creates a
4909 ** function, is_base85(t), which returns 1 iff the text t contains
4910 ** nothing other than base85 numerals and whitespace, or 0 otherwise.
4911 **
4912 ** To build the extension:
4913 ** Set shell variable SQDIR=<your favorite SQLite checkout directory>
4914 ** and variable OPTS to -DOMIT_BASE85_CHECKER if is_base85() unwanted.
4915 ** *Nix: gcc -O2 -shared -I$SQDIR $OPTS -fPIC -o base85.so base85.c
4916 ** OSX: gcc -O2 -dynamiclib -fPIC -I$SQDIR $OPTS -o base85.dylib base85.c
4917 ** Win32: gcc -O2 -shared -I%SQDIR% %OPTS% -o base85.dll base85.c
4918 ** Win32: cl /Os -I%SQDIR% %OPTS% base85.c -link -dll -out:base85.dll
4919 **
4920 ** To build the standalone program, define PP symbol BASE85_STANDALONE. Eg.
4921 ** *Nix or OSX: gcc -O2 -DBASE85_STANDALONE base85.c -o base85
4922 ** Win32: gcc -O2 -DBASE85_STANDALONE -o base85.exe base85.c
4923 ** Win32: cl /Os /MD -DBASE85_STANDALONE base85.c
4924 */
4925 
4926 #include <stdio.h>
4927 #include <memory.h>
4928 #include <string.h>
4929 #include <assert.h>
4930 #ifndef OMIT_BASE85_CHECKER
4931 # include <ctype.h>
4932 #endif
4933 
4934 #ifndef BASE85_STANDALONE
4935 
4936 /* # include "sqlite3ext.h" */
4937 
4938 SQLITE_EXTENSION_INIT1;
4939 
4940 #else
4941 
4942 # ifdef _WIN32
4943 #  include <io.h>
4944 #  include <fcntl.h>
4945 # else
4946 #  define setmode(fd,m)
4947 # endif
4948 
4949 static char *zHelp =
4950   "Usage: base85 <dirFlag> <binFile>\n"
4951   " <dirFlag> is either -r to read or -w to write <binFile>,\n"
4952   "   content to be converted to/from base85 on stdout/stdin.\n"
4953   " <binFile> names a binary file to be rendered or created.\n"
4954   "   Or, the name '-' refers to the stdin or stdout stream.\n"
4955   ;
4956 
sayHelp()4957 static void sayHelp(){
4958   printf("%s", zHelp);
4959 }
4960 #endif
4961 
4962 #ifndef U8_TYPEDEF
4963 /* typedef unsigned char u8; */
4964 #define U8_TYPEDEF
4965 #endif
4966 
4967 /* Classify c according to interval within USASCII set w.r.t. base85
4968  * Values of 1 and 3 are base85 numerals. Values of 0, 2, or 4 are not.
4969  */
4970 #define B85_CLASS( c ) (((c)>='#')+((c)>'&')+((c)>='*')+((c)>'z'))
4971 
4972 /* Provide digitValue to b85Numeral offset as a function of above class. */
4973 static u8 b85_cOffset[] = { 0, '#', 0, '*'-4, 0 };
4974 #define B85_DNOS( c ) b85_cOffset[B85_CLASS(c)]
4975 
4976 /* Say whether c is a base85 numeral. */
4977 #define IS_B85( c ) (B85_CLASS(c) & 1)
4978 
4979 #if 0 /* Not used, */
4980 static u8 base85DigitValue( char c ){
4981   u8 dv = (u8)(c - '#');
4982   if( dv>87 ) return 0xff;
4983   return (dv > 3)? dv-3 : dv;
4984 }
4985 #endif
4986 
4987 /* Width of base64 lines. Should be an integer multiple of 5. */
4988 #define B85_DARK_MAX 80
4989 
4990 
skipNonB85(char * s,int nc)4991 static char * skipNonB85( char *s, int nc ){
4992   char c;
4993   while( nc-- > 0 && (c = *s) && !IS_B85(c) ) ++s;
4994   return s;
4995 }
4996 
4997 /* Convert small integer, known to be in 0..84 inclusive, to base85 numeral.
4998  * Do not use the macro form with argument expression having a side-effect.*/
4999 #if 0
5000 static char base85Numeral( u8 b ){
5001   return (b < 4)? (char)(b + '#') : (char)(b - 4 + '*');
5002 }
5003 #else
5004 # define base85Numeral( dn )\
5005   ((char)(((dn) < 4)? (char)((dn) + '#') : (char)((dn) - 4 + '*')))
5006 #endif
5007 
putcs(char * pc,char * s)5008 static char *putcs(char *pc, char *s){
5009   char c;
5010   while( (c = *s++)!=0 ) *pc++ = c;
5011   return pc;
5012 }
5013 
5014 /* Encode a byte buffer into base85 text. If pSep!=0, it's a C string
5015 ** to be appended to encoded groups to limit their length to B85_DARK_MAX
5016 ** or to terminate the last group (to aid concatenation.)
5017 */
toBase85(u8 * pIn,int nbIn,char * pOut,char * pSep)5018 static char* toBase85( u8 *pIn, int nbIn, char *pOut, char *pSep ){
5019   int nCol = 0;
5020   while( nbIn >= 4 ){
5021     int nco = 5;
5022     unsigned long qbv = (((unsigned long)pIn[0])<<24) |
5023                         (pIn[1]<<16) | (pIn[2]<<8) | pIn[3];
5024     while( nco > 0 ){
5025       unsigned nqv = (unsigned)(qbv/85UL);
5026       unsigned char dv = qbv - 85UL*nqv;
5027       qbv = nqv;
5028       pOut[--nco] = base85Numeral(dv);
5029     }
5030     nbIn -= 4;
5031     pIn += 4;
5032     pOut += 5;
5033     if( pSep && (nCol += 5)>=B85_DARK_MAX ){
5034       pOut = putcs(pOut, pSep);
5035       nCol = 0;
5036     }
5037   }
5038   if( nbIn > 0 ){
5039     int nco = nbIn + 1;
5040     unsigned long qv = *pIn++;
5041     int nbe = 1;
5042     while( nbe++ < nbIn ){
5043       qv = (qv<<8) | *pIn++;
5044     }
5045     nCol += nco;
5046     while( nco > 0 ){
5047       u8 dv = (u8)(qv % 85);
5048       qv /= 85;
5049       pOut[--nco] = base85Numeral(dv);
5050     }
5051     pOut += (nbIn+1);
5052   }
5053   if( pSep && nCol>0 ) pOut = putcs(pOut, pSep);
5054   *pOut = 0;
5055   return pOut;
5056 }
5057 
5058 /* Decode base85 text into a byte buffer. */
fromBase85(char * pIn,int ncIn,u8 * pOut)5059 static u8* fromBase85( char *pIn, int ncIn, u8 *pOut ){
5060   if( ncIn>0 && pIn[ncIn-1]=='\n' ) --ncIn;
5061   while( ncIn>0 ){
5062     static signed char nboi[] = { 0, 0, 1, 2, 3, 4 };
5063     char *pUse = skipNonB85(pIn, ncIn);
5064     unsigned long qv = 0L;
5065     int nti, nbo;
5066     ncIn -= (pUse - pIn);
5067     pIn = pUse;
5068     nti = (ncIn>5)? 5 : ncIn;
5069     nbo = nboi[nti];
5070     if( nbo==0 ) break;
5071     while( nti>0 ){
5072       char c = *pIn++;
5073       u8 cdo = B85_DNOS(c);
5074       --ncIn;
5075       if( cdo==0 ) break;
5076       qv = 85 * qv + (c - cdo);
5077       --nti;
5078     }
5079     nbo -= nti; /* Adjust for early (non-digit) end of group. */
5080     switch( nbo ){
5081     case 4:
5082       *pOut++ = (qv >> 24)&0xff;
5083     case 3:
5084       *pOut++ = (qv >> 16)&0xff;
5085     case 2:
5086       *pOut++ = (qv >> 8)&0xff;
5087     case 1:
5088       *pOut++ = qv&0xff;
5089     case 0:
5090       break;
5091     }
5092   }
5093   return pOut;
5094 }
5095 
5096 #ifndef OMIT_BASE85_CHECKER
5097 /* Say whether input char sequence is all (base85 and/or whitespace).*/
allBase85(char * p,int len)5098 static int allBase85( char *p, int len ){
5099   char c;
5100   while( len-- > 0 && (c = *p++) != 0 ){
5101     if( !IS_B85(c) && !isspace(c) ) return 0;
5102   }
5103   return 1;
5104 }
5105 #endif
5106 
5107 #ifndef BASE85_STANDALONE
5108 
5109 # ifndef OMIT_BASE85_CHECKER
5110 /* This function does the work for the SQLite is_base85(t) UDF. */
is_base85(sqlite3_context * context,int na,sqlite3_value * av[])5111 static void is_base85(sqlite3_context *context, int na, sqlite3_value *av[]){
5112   assert(na==1);
5113   switch( sqlite3_value_type(av[0]) ){
5114   case SQLITE_TEXT:
5115     {
5116       int rv = allBase85( (char *)sqlite3_value_text(av[0]),
5117                           sqlite3_value_bytes(av[0]) );
5118       sqlite3_result_int(context, rv);
5119     }
5120     break;
5121   case SQLITE_NULL:
5122     sqlite3_result_null(context);
5123     break;
5124   default:
5125     sqlite3_result_error(context, "is_base85 accepts only text or NULL", -1);
5126     return;
5127   }
5128 }
5129 # endif
5130 
5131 /* This function does the work for the SQLite base85(x) UDF. */
base85(sqlite3_context * context,int na,sqlite3_value * av[])5132 static void base85(sqlite3_context *context, int na, sqlite3_value *av[]){
5133   int nb, nc, nv = sqlite3_value_bytes(av[0]);
5134   int nvMax = sqlite3_limit(sqlite3_context_db_handle(context),
5135                             SQLITE_LIMIT_LENGTH, -1);
5136   char *cBuf;
5137   u8 *bBuf;
5138   assert(na==1);
5139   switch( sqlite3_value_type(av[0]) ){
5140   case SQLITE_BLOB:
5141     nb = nv;
5142     /*    ulongs    tail   newlines  tailenc+nul*/
5143     nc = 5*(nv/4) + nv%4 + nv/64+1 + 2;
5144     if( nvMax < nc ){
5145       sqlite3_result_error(context, "blob expanded to base85 too big", -1);
5146       return;
5147     }
5148     bBuf = (u8*)sqlite3_value_blob(av[0]);
5149     if( !bBuf ){
5150       if( SQLITE_NOMEM==sqlite3_errcode(sqlite3_context_db_handle(context)) ){
5151         goto memFail;
5152       }
5153       sqlite3_result_text(context,"",-1,SQLITE_STATIC);
5154       break;
5155     }
5156     cBuf = sqlite3_malloc(nc);
5157     if( !cBuf ) goto memFail;
5158     nc = (int)(toBase85(bBuf, nb, cBuf, "\n") - cBuf);
5159     sqlite3_result_text(context, cBuf, nc, sqlite3_free);
5160     break;
5161   case SQLITE_TEXT:
5162     nc = nv;
5163     nb = 4*(nv/5) + nv%5; /* may overestimate */
5164     if( nvMax < nb ){
5165       sqlite3_result_error(context, "blob from base85 may be too big", -1);
5166       return;
5167     }else if( nb<1 ){
5168       nb = 1;
5169     }
5170     cBuf = (char *)sqlite3_value_text(av[0]);
5171     if( !cBuf ){
5172       if( SQLITE_NOMEM==sqlite3_errcode(sqlite3_context_db_handle(context)) ){
5173         goto memFail;
5174       }
5175       sqlite3_result_zeroblob(context, 0);
5176       break;
5177     }
5178     bBuf = sqlite3_malloc(nb);
5179     if( !bBuf ) goto memFail;
5180     nb = (int)(fromBase85(cBuf, nc, bBuf) - bBuf);
5181     sqlite3_result_blob(context, bBuf, nb, sqlite3_free);
5182     break;
5183   default:
5184     sqlite3_result_error(context, "base85 accepts only blob or text.", -1);
5185     return;
5186   }
5187   return;
5188  memFail:
5189   sqlite3_result_error(context, "base85 OOM", -1);
5190 }
5191 
5192 /*
5193 ** Establish linkage to running SQLite library.
5194 */
5195 #ifndef SQLITE_SHELL_EXTFUNCS
5196 #ifdef _WIN32
5197 
5198 #endif
sqlite3_base_init(sqlite3 * db,char ** pzErr,const sqlite3_api_routines * pApi)5199 int sqlite3_base_init
5200 #else
5201 static int sqlite3_base85_init
5202 #endif
5203 (sqlite3 *db, char **pzErr, const sqlite3_api_routines *pApi){
5204   SQLITE_EXTENSION_INIT2(pApi);
5205   (void)pzErr;
5206 # ifndef OMIT_BASE85_CHECKER
5207   {
5208     int rc = sqlite3_create_function
5209       (db, "is_base85", 1,
5210        SQLITE_DETERMINISTIC|SQLITE_INNOCUOUS|SQLITE_UTF8,
5211        0, is_base85, 0, 0);
5212     if( rc!=SQLITE_OK ) return rc;
5213   }
5214 # endif
5215   return sqlite3_create_function
5216     (db, "base85", 1,
5217      SQLITE_DETERMINISTIC|SQLITE_INNOCUOUS|SQLITE_DIRECTONLY|SQLITE_UTF8,
5218      0, base85, 0, 0);
5219 }
5220 
5221 /*
5222 ** Define some macros to allow this extension to be built into the shell
5223 ** conveniently, in conjunction with use of SQLITE_SHELL_EXTFUNCS. This
5224 ** allows shell.c, as distributed, to have this extension built in.
5225 */
5226 # define BASE85_INIT(db) sqlite3_base85_init(db, 0, 0)
5227 # define BASE85_EXPOSE(db, pzErr) /* Not needed, ..._init() does this. */
5228 
5229 #else /* standalone program */
5230 
main(int na,char * av[])5231 int main(int na, char *av[]){
5232   int cin;
5233   int rc = 0;
5234   u8 bBuf[4*(B85_DARK_MAX/5)];
5235   char cBuf[5*(sizeof(bBuf)/4)+2];
5236   size_t nio;
5237 # ifndef OMIT_BASE85_CHECKER
5238   int b85Clean = 1;
5239 # endif
5240   char rw;
5241   FILE *fb = 0, *foc = 0;
5242   char fmode[3] = "xb";
5243   if( na < 3 || av[1][0]!='-' || (rw = av[1][1])==0 || (rw!='r' && rw!='w') ){
5244     sayHelp();
5245     return 0;
5246   }
5247   fmode[0] = rw;
5248   if( av[2][0]=='-' && av[2][1]==0 ){
5249     switch( rw ){
5250     case 'r':
5251       fb = stdin;
5252       setmode(fileno(stdin), O_BINARY);
5253       break;
5254     case 'w':
5255       fb = stdout;
5256       setmode(fileno(stdout), O_BINARY);
5257       break;
5258     }
5259   }else{
5260     fb = fopen(av[2], fmode);
5261     foc = fb;
5262   }
5263   if( !fb ){
5264     fprintf(stderr, "Cannot open %s for %c\n", av[2], rw);
5265     rc = 1;
5266   }else{
5267     switch( rw ){
5268     case 'r':
5269       while( (nio = fread( bBuf, 1, sizeof(bBuf), fb))>0 ){
5270         toBase85( bBuf, (int)nio, cBuf, 0 );
5271         fprintf(stdout, "%s\n", cBuf);
5272       }
5273       break;
5274     case 'w':
5275       while( 0 != fgets(cBuf, sizeof(cBuf), stdin) ){
5276         int nc = strlen(cBuf);
5277         size_t nbo = fromBase85( cBuf, nc, bBuf ) - bBuf;
5278         if( 1 != fwrite(bBuf, nbo, 1, fb) ) rc = 1;
5279 # ifndef OMIT_BASE85_CHECKER
5280         b85Clean &= allBase85( cBuf, nc );
5281 # endif
5282       }
5283       break;
5284     default:
5285       sayHelp();
5286       rc = 1;
5287     }
5288     if( foc ) fclose(foc);
5289   }
5290 # ifndef OMIT_BASE85_CHECKER
5291   if( !b85Clean ){
5292     fprintf(stderr, "Base85 input had non-base85 dark or control content.\n");
5293   }
5294 # endif
5295   return rc;
5296 }
5297 
5298 #endif
5299 
5300 /************************* End ../ext/misc/base85.c ********************/
5301 /************************* Begin ../ext/misc/ieee754.c ******************/
5302 /*
5303 ** 2013-04-17
5304 **
5305 ** The author disclaims copyright to this source code.  In place of
5306 ** a legal notice, here is a blessing:
5307 **
5308 **    May you do good and not evil.
5309 **    May you find forgiveness for yourself and forgive others.
5310 **    May you share freely, never taking more than you give.
5311 **
5312 ******************************************************************************
5313 **
5314 ** This SQLite extension implements functions for the exact display
5315 ** and input of IEEE754 Binary64 floating-point numbers.
5316 **
5317 **   ieee754(X)
5318 **   ieee754(Y,Z)
5319 **
5320 ** In the first form, the value X should be a floating-point number.
5321 ** The function will return a string of the form 'ieee754(Y,Z)' where
5322 ** Y and Z are integers such that X==Y*pow(2,Z).
5323 **
5324 ** In the second form, Y and Z are integers which are the mantissa and
5325 ** base-2 exponent of a new floating point number.  The function returns
5326 ** a floating-point value equal to Y*pow(2,Z).
5327 **
5328 ** Examples:
5329 **
5330 **     ieee754(2.0)             ->     'ieee754(2,0)'
5331 **     ieee754(45.25)           ->     'ieee754(181,-2)'
5332 **     ieee754(2, 0)            ->     2.0
5333 **     ieee754(181, -2)         ->     45.25
5334 **
5335 ** Two additional functions break apart the one-argument ieee754()
5336 ** result into separate integer values:
5337 **
5338 **     ieee754_mantissa(45.25)  ->     181
5339 **     ieee754_exponent(45.25)  ->     -2
5340 **
5341 ** These functions convert binary64 numbers into blobs and back again.
5342 **
5343 **     ieee754_from_blob(x'3ff0000000000000')  ->  1.0
5344 **     ieee754_to_blob(1.0)                    ->  x'3ff0000000000000'
5345 **
5346 ** In all single-argument functions, if the argument is an 8-byte blob
5347 ** then that blob is interpreted as a big-endian binary64 value.
5348 **
5349 **
5350 ** EXACT DECIMAL REPRESENTATION OF BINARY64 VALUES
5351 ** -----------------------------------------------
5352 **
5353 ** This extension in combination with the separate 'decimal' extension
5354 ** can be used to compute the exact decimal representation of binary64
5355 ** values.  To begin, first compute a table of exponent values:
5356 **
5357 **    CREATE TABLE pow2(x INTEGER PRIMARY KEY, v TEXT);
5358 **    WITH RECURSIVE c(x,v) AS (
5359 **      VALUES(0,'1')
5360 **      UNION ALL
5361 **      SELECT x+1, decimal_mul(v,'2') FROM c WHERE x+1<=971
5362 **    ) INSERT INTO pow2(x,v) SELECT x, v FROM c;
5363 **    WITH RECURSIVE c(x,v) AS (
5364 **      VALUES(-1,'0.5')
5365 **      UNION ALL
5366 **      SELECT x-1, decimal_mul(v,'0.5') FROM c WHERE x-1>=-1075
5367 **    ) INSERT INTO pow2(x,v) SELECT x, v FROM c;
5368 **
5369 ** Then, to compute the exact decimal representation of a floating
5370 ** point value (the value 47.49 is used in the example) do:
5371 **
5372 **    WITH c(n) AS (VALUES(47.49))
5373 **          ---------------^^^^^---- Replace with whatever you want
5374 **    SELECT decimal_mul(ieee754_mantissa(c.n),pow2.v)
5375 **      FROM pow2, c WHERE pow2.x=ieee754_exponent(c.n);
5376 **
5377 ** Here is a query to show various boundry values for the binary64
5378 ** number format:
5379 **
5380 **    WITH c(name,bin) AS (VALUES
5381 **       ('minimum positive value',        x'0000000000000001'),
5382 **       ('maximum subnormal value',       x'000fffffffffffff'),
5383 **       ('mininum positive nornal value', x'0010000000000000'),
5384 **       ('maximum value',                 x'7fefffffffffffff'))
5385 **    SELECT c.name, decimal_mul(ieee754_mantissa(c.bin),pow2.v)
5386 **      FROM pow2, c WHERE pow2.x=ieee754_exponent(c.bin);
5387 **
5388 */
5389 /* #include "sqlite3ext.h" */
5390 SQLITE_EXTENSION_INIT1
5391 #include <assert.h>
5392 #include <string.h>
5393 
5394 /* Mark a function parameter as unused, to suppress nuisance compiler
5395 ** warnings. */
5396 #ifndef UNUSED_PARAMETER
5397 # define UNUSED_PARAMETER(X)  (void)(X)
5398 #endif
5399 
5400 /*
5401 ** Implementation of the ieee754() function
5402 */
ieee754func(sqlite3_context * context,int argc,sqlite3_value ** argv)5403 static void ieee754func(
5404   sqlite3_context *context,
5405   int argc,
5406   sqlite3_value **argv
5407 ){
5408   if( argc==1 ){
5409     sqlite3_int64 m, a;
5410     double r;
5411     int e;
5412     int isNeg;
5413     char zResult[100];
5414     assert( sizeof(m)==sizeof(r) );
5415     if( sqlite3_value_type(argv[0])==SQLITE_BLOB
5416      && sqlite3_value_bytes(argv[0])==sizeof(r)
5417     ){
5418       const unsigned char *x = sqlite3_value_blob(argv[0]);
5419       unsigned int i;
5420       sqlite3_uint64 v = 0;
5421       for(i=0; i<sizeof(r); i++){
5422         v = (v<<8) | x[i];
5423       }
5424       memcpy(&r, &v, sizeof(r));
5425     }else{
5426       r = sqlite3_value_double(argv[0]);
5427     }
5428     if( r<0.0 ){
5429       isNeg = 1;
5430       r = -r;
5431     }else{
5432       isNeg = 0;
5433     }
5434     memcpy(&a,&r,sizeof(a));
5435     if( a==0 ){
5436       e = 0;
5437       m = 0;
5438     }else{
5439       e = a>>52;
5440       m = a & ((((sqlite3_int64)1)<<52)-1);
5441       if( e==0 ){
5442         m <<= 1;
5443       }else{
5444         m |= ((sqlite3_int64)1)<<52;
5445       }
5446       while( e<1075 && m>0 && (m&1)==0 ){
5447         m >>= 1;
5448         e++;
5449       }
5450       if( isNeg ) m = -m;
5451     }
5452     switch( *(int*)sqlite3_user_data(context) ){
5453       case 0:
5454         sqlite3_snprintf(sizeof(zResult), zResult, "ieee754(%lld,%d)",
5455                          m, e-1075);
5456         sqlite3_result_text(context, zResult, -1, SQLITE_TRANSIENT);
5457         break;
5458       case 1:
5459         sqlite3_result_int64(context, m);
5460         break;
5461       case 2:
5462         sqlite3_result_int(context, e-1075);
5463         break;
5464     }
5465   }else{
5466     sqlite3_int64 m, e, a;
5467     double r;
5468     int isNeg = 0;
5469     m = sqlite3_value_int64(argv[0]);
5470     e = sqlite3_value_int64(argv[1]);
5471 
5472     /* Limit the range of e.  Ticket 22dea1cfdb9151e4 2021-03-02 */
5473     if( e>10000 ){
5474       e = 10000;
5475     }else if( e<-10000 ){
5476       e = -10000;
5477     }
5478 
5479     if( m<0 ){
5480       isNeg = 1;
5481       m = -m;
5482       if( m<0 ) return;
5483     }else if( m==0 && e>-1000 && e<1000 ){
5484       sqlite3_result_double(context, 0.0);
5485       return;
5486     }
5487     while( (m>>32)&0xffe00000 ){
5488       m >>= 1;
5489       e++;
5490     }
5491     while( m!=0 && ((m>>32)&0xfff00000)==0 ){
5492       m <<= 1;
5493       e--;
5494     }
5495     e += 1075;
5496     if( e<=0 ){
5497       /* Subnormal */
5498       if( 1-e >= 64 ){
5499         m = 0;
5500       }else{
5501         m >>= 1-e;
5502       }
5503       e = 0;
5504     }else if( e>0x7ff ){
5505       e = 0x7ff;
5506     }
5507     a = m & ((((sqlite3_int64)1)<<52)-1);
5508     a |= e<<52;
5509     if( isNeg ) a |= ((sqlite3_uint64)1)<<63;
5510     memcpy(&r, &a, sizeof(r));
5511     sqlite3_result_double(context, r);
5512   }
5513 }
5514 
5515 /*
5516 ** Functions to convert between blobs and floats.
5517 */
ieee754func_from_blob(sqlite3_context * context,int argc,sqlite3_value ** argv)5518 static void ieee754func_from_blob(
5519   sqlite3_context *context,
5520   int argc,
5521   sqlite3_value **argv
5522 ){
5523   UNUSED_PARAMETER(argc);
5524   if( sqlite3_value_type(argv[0])==SQLITE_BLOB
5525    && sqlite3_value_bytes(argv[0])==sizeof(double)
5526   ){
5527     double r;
5528     const unsigned char *x = sqlite3_value_blob(argv[0]);
5529     unsigned int i;
5530     sqlite3_uint64 v = 0;
5531     for(i=0; i<sizeof(r); i++){
5532       v = (v<<8) | x[i];
5533     }
5534     memcpy(&r, &v, sizeof(r));
5535     sqlite3_result_double(context, r);
5536   }
5537 }
ieee754func_to_blob(sqlite3_context * context,int argc,sqlite3_value ** argv)5538 static void ieee754func_to_blob(
5539   sqlite3_context *context,
5540   int argc,
5541   sqlite3_value **argv
5542 ){
5543   UNUSED_PARAMETER(argc);
5544   if( sqlite3_value_type(argv[0])==SQLITE_FLOAT
5545    || sqlite3_value_type(argv[0])==SQLITE_INTEGER
5546   ){
5547     double r = sqlite3_value_double(argv[0]);
5548     sqlite3_uint64 v;
5549     unsigned char a[sizeof(r)];
5550     unsigned int i;
5551     memcpy(&v, &r, sizeof(r));
5552     for(i=1; i<=sizeof(r); i++){
5553       a[sizeof(r)-i] = v&0xff;
5554       v >>= 8;
5555     }
5556     sqlite3_result_blob(context, a, sizeof(r), SQLITE_TRANSIENT);
5557   }
5558 }
5559 
5560 /*
5561 ** SQL Function:   ieee754_inc(r,N)
5562 **
5563 ** Move the floating point value r by N quantums and return the new
5564 ** values.
5565 **
5566 ** Behind the scenes: this routine merely casts r into a 64-bit unsigned
5567 ** integer, adds N, then casts the value back into float.
5568 **
5569 ** Example:  To find the smallest positive number:
5570 **
5571 **     SELECT ieee754_inc(0.0,+1);
5572 */
ieee754inc(sqlite3_context * context,int argc,sqlite3_value ** argv)5573 static void ieee754inc(
5574   sqlite3_context *context,
5575   int argc,
5576   sqlite3_value **argv
5577 ){
5578   double r;
5579   sqlite3_int64 N;
5580   sqlite3_uint64 m1, m2;
5581   double r2;
5582   UNUSED_PARAMETER(argc);
5583   r = sqlite3_value_double(argv[0]);
5584   N = sqlite3_value_int64(argv[1]);
5585   memcpy(&m1, &r, 8);
5586   m2 = m1 + N;
5587   memcpy(&r2, &m2, 8);
5588   sqlite3_result_double(context, r2);
5589 }
5590 
5591 
5592 #ifdef _WIN32
5593 
5594 #endif
sqlite3_ieee_init(sqlite3 * db,char ** pzErrMsg,const sqlite3_api_routines * pApi)5595 int sqlite3_ieee_init(
5596   sqlite3 *db,
5597   char **pzErrMsg,
5598   const sqlite3_api_routines *pApi
5599 ){
5600   static const struct {
5601     char *zFName;
5602     int nArg;
5603     int iAux;
5604     void (*xFunc)(sqlite3_context*,int,sqlite3_value**);
5605   } aFunc[] = {
5606     { "ieee754",           1,   0, ieee754func },
5607     { "ieee754",           2,   0, ieee754func },
5608     { "ieee754_mantissa",  1,   1, ieee754func },
5609     { "ieee754_exponent",  1,   2, ieee754func },
5610     { "ieee754_to_blob",   1,   0, ieee754func_to_blob },
5611     { "ieee754_from_blob", 1,   0, ieee754func_from_blob },
5612     { "ieee754_inc",       2,   0, ieee754inc  },
5613   };
5614   unsigned int i;
5615   int rc = SQLITE_OK;
5616   SQLITE_EXTENSION_INIT2(pApi);
5617   (void)pzErrMsg;  /* Unused parameter */
5618   for(i=0; i<sizeof(aFunc)/sizeof(aFunc[0]) && rc==SQLITE_OK; i++){
5619     rc = sqlite3_create_function(db, aFunc[i].zFName, aFunc[i].nArg,
5620                                SQLITE_UTF8|SQLITE_INNOCUOUS,
5621                                (void*)&aFunc[i].iAux,
5622                                aFunc[i].xFunc, 0, 0);
5623   }
5624   return rc;
5625 }
5626 
5627 /************************* End ../ext/misc/ieee754.c ********************/
5628 /************************* Begin ../ext/misc/series.c ******************/
5629 /*
5630 ** 2015-08-18, 2023-04-28
5631 **
5632 ** The author disclaims copyright to this source code.  In place of
5633 ** a legal notice, here is a blessing:
5634 **
5635 **    May you do good and not evil.
5636 **    May you find forgiveness for yourself and forgive others.
5637 **    May you share freely, never taking more than you give.
5638 **
5639 *************************************************************************
5640 **
5641 ** This file demonstrates how to create a table-valued-function using
5642 ** a virtual table.  This demo implements the generate_series() function
5643 ** which gives the same results as the eponymous function in PostgreSQL,
5644 ** within the limitation that its arguments are signed 64-bit integers.
5645 **
5646 ** Considering its equivalents to generate_series(start,stop,step): A
5647 ** value V[n] sequence is produced for integer n ascending from 0 where
5648 **  ( V[n] == start + n * step  &&  sgn(V[n] - stop) * sgn(step) >= 0 )
5649 ** for each produced value (independent of production time ordering.)
5650 **
5651 ** All parameters must be either integer or convertable to integer.
5652 ** The start parameter is required.
5653 ** The stop parameter defaults to (1<<32)-1 (aka 4294967295 or 0xffffffff)
5654 ** The step parameter defaults to 1 and 0 is treated as 1.
5655 **
5656 ** Examples:
5657 **
5658 **      SELECT * FROM generate_series(0,100,5);
5659 **
5660 ** The query above returns integers from 0 through 100 counting by steps
5661 ** of 5.
5662 **
5663 **      SELECT * FROM generate_series(0,100);
5664 **
5665 ** Integers from 0 through 100 with a step size of 1.
5666 **
5667 **      SELECT * FROM generate_series(20) LIMIT 10;
5668 **
5669 ** Integers 20 through 29.
5670 **
5671 **      SELECT * FROM generate_series(0,-100,-5);
5672 **
5673 ** Integers 0 -5 -10 ... -100.
5674 **
5675 **      SELECT * FROM generate_series(0,-1);
5676 **
5677 ** Empty sequence.
5678 **
5679 ** HOW IT WORKS
5680 **
5681 ** The generate_series "function" is really a virtual table with the
5682 ** following schema:
5683 **
5684 **     CREATE TABLE generate_series(
5685 **       value,
5686 **       start HIDDEN,
5687 **       stop HIDDEN,
5688 **       step HIDDEN
5689 **     );
5690 **
5691 ** The virtual table also has a rowid, logically equivalent to n+1 where
5692 ** "n" is the ascending integer in the aforesaid production definition.
5693 **
5694 ** Function arguments in queries against this virtual table are translated
5695 ** into equality constraints against successive hidden columns.  In other
5696 ** words, the following pairs of queries are equivalent to each other:
5697 **
5698 **    SELECT * FROM generate_series(0,100,5);
5699 **    SELECT * FROM generate_series WHERE start=0 AND stop=100 AND step=5;
5700 **
5701 **    SELECT * FROM generate_series(0,100);
5702 **    SELECT * FROM generate_series WHERE start=0 AND stop=100;
5703 **
5704 **    SELECT * FROM generate_series(20) LIMIT 10;
5705 **    SELECT * FROM generate_series WHERE start=20 LIMIT 10;
5706 **
5707 ** The generate_series virtual table implementation leaves the xCreate method
5708 ** set to NULL.  This means that it is not possible to do a CREATE VIRTUAL
5709 ** TABLE command with "generate_series" as the USING argument.  Instead, there
5710 ** is a single generate_series virtual table that is always available without
5711 ** having to be created first.
5712 **
5713 ** The xBestIndex method looks for equality constraints against the hidden
5714 ** start, stop, and step columns, and if present, it uses those constraints
5715 ** to bound the sequence of generated values.  If the equality constraints
5716 ** are missing, it uses 0 for start, 4294967295 for stop, and 1 for step.
5717 ** xBestIndex returns a small cost when both start and stop are available,
5718 ** and a very large cost if either start or stop are unavailable.  This
5719 ** encourages the query planner to order joins such that the bounds of the
5720 ** series are well-defined.
5721 */
5722 /* #include "sqlite3ext.h" */
5723 SQLITE_EXTENSION_INIT1
5724 #include <assert.h>
5725 #include <string.h>
5726 #include <limits.h>
5727 
5728 #ifndef SQLITE_OMIT_VIRTUALTABLE
5729 /*
5730 ** Return that member of a generate_series(...) sequence whose 0-based
5731 ** index is ix. The 0th member is given by smBase. The sequence members
5732 ** progress per ix increment by smStep.
5733 */
genSeqMember(sqlite3_int64 smBase,sqlite3_int64 smStep,sqlite3_uint64 ix)5734 static sqlite3_int64 genSeqMember(
5735   sqlite3_int64 smBase,
5736   sqlite3_int64 smStep,
5737   sqlite3_uint64 ix
5738 ){
5739   static const sqlite3_uint64 mxI64 =
5740       ((sqlite3_uint64)0x7fffffff)<<32 | 0xffffffff;
5741   if( ix>=mxI64 ){
5742     /* Get ix into signed i64 range. */
5743     ix -= mxI64;
5744     /* With 2's complement ALU, this next can be 1 step, but is split into
5745      * 2 for UBSAN's satisfaction (and hypothetical 1's complement ALUs.) */
5746     smBase += (mxI64/2) * smStep;
5747     smBase += (mxI64 - mxI64/2) * smStep;
5748   }
5749   /* Under UBSAN (or on 1's complement machines), must do this last term
5750    * in steps to avoid the dreaded (and harmless) signed multiply overlow. */
5751   if( ix>=2 ){
5752     sqlite3_int64 ix2 = (sqlite3_int64)ix/2;
5753     smBase += ix2*smStep;
5754     ix -= ix2;
5755   }
5756   return smBase + ((sqlite3_int64)ix)*smStep;
5757 }
5758 
5759 /* typedef unsigned char u8; */
5760 
5761 typedef struct SequenceSpec {
5762   sqlite3_int64 iBase;         /* Starting value ("start") */
5763   sqlite3_int64 iTerm;         /* Given terminal value ("stop") */
5764   sqlite3_int64 iStep;         /* Increment ("step") */
5765   sqlite3_uint64 uSeqIndexMax; /* maximum sequence index (aka "n") */
5766   sqlite3_uint64 uSeqIndexNow; /* Current index during generation */
5767   sqlite3_int64 iValueNow;     /* Current value during generation */
5768   u8 isNotEOF;                 /* Sequence generation not exhausted */
5769   u8 isReversing;              /* Sequence is being reverse generated */
5770 } SequenceSpec;
5771 
5772 /*
5773 ** Prepare a SequenceSpec for use in generating an integer series
5774 ** given initialized iBase, iTerm and iStep values. Sequence is
5775 ** initialized per given isReversing. Other members are computed.
5776 */
setupSequence(SequenceSpec * pss)5777 static void setupSequence( SequenceSpec *pss ){
5778   int bSameSigns;
5779   pss->uSeqIndexMax = 0;
5780   pss->isNotEOF = 0;
5781   bSameSigns = (pss->iBase < 0)==(pss->iTerm < 0);
5782   if( pss->iTerm < pss->iBase ){
5783     sqlite3_uint64 nuspan = 0;
5784     if( bSameSigns ){
5785       nuspan = (sqlite3_uint64)(pss->iBase - pss->iTerm);
5786     }else{
5787       /* Under UBSAN (or on 1's complement machines), must do this in steps.
5788        * In this clause, iBase>=0 and iTerm<0 . */
5789       nuspan = 1;
5790       nuspan += pss->iBase;
5791       nuspan += -(pss->iTerm+1);
5792     }
5793     if( pss->iStep<0 ){
5794       pss->isNotEOF = 1;
5795       if( nuspan==ULONG_MAX ){
5796         pss->uSeqIndexMax = ( pss->iStep>LLONG_MIN )? nuspan/-pss->iStep : 1;
5797       }else if( pss->iStep>LLONG_MIN ){
5798         pss->uSeqIndexMax = nuspan/-pss->iStep;
5799       }
5800     }
5801   }else if( pss->iTerm > pss->iBase ){
5802     sqlite3_uint64 puspan = 0;
5803     if( bSameSigns ){
5804       puspan = (sqlite3_uint64)(pss->iTerm - pss->iBase);
5805     }else{
5806       /* Under UBSAN (or on 1's complement machines), must do this in steps.
5807        * In this clause, iTerm>=0 and iBase<0 . */
5808       puspan = 1;
5809       puspan += pss->iTerm;
5810       puspan += -(pss->iBase+1);
5811     }
5812     if( pss->iStep>0 ){
5813       pss->isNotEOF = 1;
5814       pss->uSeqIndexMax = puspan/pss->iStep;
5815     }
5816   }else if( pss->iTerm == pss->iBase ){
5817       pss->isNotEOF = 1;
5818       pss->uSeqIndexMax = 0;
5819   }
5820   pss->uSeqIndexNow = (pss->isReversing)? pss->uSeqIndexMax : 0;
5821   pss->iValueNow = (pss->isReversing)
5822     ? genSeqMember(pss->iBase, pss->iStep, pss->uSeqIndexMax)
5823     : pss->iBase;
5824 }
5825 
5826 /*
5827 ** Progress sequence generator to yield next value, if any.
5828 ** Leave its state to either yield next value or be at EOF.
5829 ** Return whether there is a next value, or 0 at EOF.
5830 */
progressSequence(SequenceSpec * pss)5831 static int progressSequence( SequenceSpec *pss ){
5832   if( !pss->isNotEOF ) return 0;
5833   if( pss->isReversing ){
5834     if( pss->uSeqIndexNow > 0 ){
5835       pss->uSeqIndexNow--;
5836       pss->iValueNow -= pss->iStep;
5837     }else{
5838       pss->isNotEOF = 0;
5839     }
5840   }else{
5841     if( pss->uSeqIndexNow < pss->uSeqIndexMax ){
5842       pss->uSeqIndexNow++;
5843       pss->iValueNow += pss->iStep;
5844     }else{
5845       pss->isNotEOF = 0;
5846     }
5847   }
5848   return pss->isNotEOF;
5849 }
5850 
5851 /* series_cursor is a subclass of sqlite3_vtab_cursor which will
5852 ** serve as the underlying representation of a cursor that scans
5853 ** over rows of the result
5854 */
5855 typedef struct series_cursor series_cursor;
5856 struct series_cursor {
5857   sqlite3_vtab_cursor base;  /* Base class - must be first */
5858   SequenceSpec ss;           /* (this) Derived class data */
5859 };
5860 
5861 /*
5862 ** The seriesConnect() method is invoked to create a new
5863 ** series_vtab that describes the generate_series virtual table.
5864 **
5865 ** Think of this routine as the constructor for series_vtab objects.
5866 **
5867 ** All this routine needs to do is:
5868 **
5869 **    (1) Allocate the series_vtab object and initialize all fields.
5870 **
5871 **    (2) Tell SQLite (via the sqlite3_declare_vtab() interface) what the
5872 **        result set of queries against generate_series will look like.
5873 */
seriesConnect(sqlite3 * db,void * pUnused,int argcUnused,const char * const * argvUnused,sqlite3_vtab ** ppVtab,char ** pzErrUnused)5874 static int seriesConnect(
5875   sqlite3 *db,
5876   void *pUnused,
5877   int argcUnused, const char *const*argvUnused,
5878   sqlite3_vtab **ppVtab,
5879   char **pzErrUnused
5880 ){
5881   sqlite3_vtab *pNew;
5882   int rc;
5883 
5884 /* Column numbers */
5885 #define SERIES_COLUMN_VALUE 0
5886 #define SERIES_COLUMN_START 1
5887 #define SERIES_COLUMN_STOP  2
5888 #define SERIES_COLUMN_STEP  3
5889 
5890   (void)pUnused;
5891   (void)argcUnused;
5892   (void)argvUnused;
5893   (void)pzErrUnused;
5894   rc = sqlite3_declare_vtab(db,
5895      "CREATE TABLE x(value,start hidden,stop hidden,step hidden)");
5896   if( rc==SQLITE_OK ){
5897     pNew = *ppVtab = sqlite3_malloc( sizeof(*pNew) );
5898     if( pNew==0 ) return SQLITE_NOMEM;
5899     memset(pNew, 0, sizeof(*pNew));
5900     sqlite3_vtab_config(db, SQLITE_VTAB_INNOCUOUS);
5901   }
5902   return rc;
5903 }
5904 
5905 /*
5906 ** This method is the destructor for series_cursor objects.
5907 */
seriesDisconnect(sqlite3_vtab * pVtab)5908 static int seriesDisconnect(sqlite3_vtab *pVtab){
5909   sqlite3_free(pVtab);
5910   return SQLITE_OK;
5911 }
5912 
5913 /*
5914 ** Constructor for a new series_cursor object.
5915 */
seriesOpen(sqlite3_vtab * pUnused,sqlite3_vtab_cursor ** ppCursor)5916 static int seriesOpen(sqlite3_vtab *pUnused, sqlite3_vtab_cursor **ppCursor){
5917   series_cursor *pCur;
5918   (void)pUnused;
5919   pCur = sqlite3_malloc( sizeof(*pCur) );
5920   if( pCur==0 ) return SQLITE_NOMEM;
5921   memset(pCur, 0, sizeof(*pCur));
5922   *ppCursor = &pCur->base;
5923   return SQLITE_OK;
5924 }
5925 
5926 /*
5927 ** Destructor for a series_cursor.
5928 */
seriesClose(sqlite3_vtab_cursor * cur)5929 static int seriesClose(sqlite3_vtab_cursor *cur){
5930   sqlite3_free(cur);
5931   return SQLITE_OK;
5932 }
5933 
5934 
5935 /*
5936 ** Advance a series_cursor to its next row of output.
5937 */
seriesNext(sqlite3_vtab_cursor * cur)5938 static int seriesNext(sqlite3_vtab_cursor *cur){
5939   series_cursor *pCur = (series_cursor*)cur;
5940   progressSequence( & pCur->ss );
5941   return SQLITE_OK;
5942 }
5943 
5944 /*
5945 ** Return values of columns for the row at which the series_cursor
5946 ** is currently pointing.
5947 */
seriesColumn(sqlite3_vtab_cursor * cur,sqlite3_context * ctx,int i)5948 static int seriesColumn(
5949   sqlite3_vtab_cursor *cur,   /* The cursor */
5950   sqlite3_context *ctx,       /* First argument to sqlite3_result_...() */
5951   int i                       /* Which column to return */
5952 ){
5953   series_cursor *pCur = (series_cursor*)cur;
5954   sqlite3_int64 x = 0;
5955   switch( i ){
5956     case SERIES_COLUMN_START:  x = pCur->ss.iBase; break;
5957     case SERIES_COLUMN_STOP:   x = pCur->ss.iTerm; break;
5958     case SERIES_COLUMN_STEP:   x = pCur->ss.iStep;   break;
5959     default:                   x = pCur->ss.iValueNow;  break;
5960   }
5961   sqlite3_result_int64(ctx, x);
5962   return SQLITE_OK;
5963 }
5964 
5965 #ifndef LARGEST_UINT64
5966 #define LARGEST_UINT64 (0xffffffff|(((sqlite3_uint64)0xffffffff)<<32))
5967 #endif
5968 
5969 /*
5970 ** Return the rowid for the current row, logically equivalent to n+1 where
5971 ** "n" is the ascending integer in the aforesaid production definition.
5972 */
seriesRowid(sqlite3_vtab_cursor * cur,sqlite_int64 * pRowid)5973 static int seriesRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
5974   series_cursor *pCur = (series_cursor*)cur;
5975   sqlite3_uint64 n = pCur->ss.uSeqIndexNow;
5976   *pRowid = (sqlite3_int64)((n<LARGEST_UINT64)? n+1 : 0);
5977   return SQLITE_OK;
5978 }
5979 
5980 /*
5981 ** Return TRUE if the cursor has been moved off of the last
5982 ** row of output.
5983 */
seriesEof(sqlite3_vtab_cursor * cur)5984 static int seriesEof(sqlite3_vtab_cursor *cur){
5985   series_cursor *pCur = (series_cursor*)cur;
5986   return !pCur->ss.isNotEOF;
5987 }
5988 
5989 /* True to cause run-time checking of the start=, stop=, and/or step=
5990 ** parameters.  The only reason to do this is for testing the
5991 ** constraint checking logic for virtual tables in the SQLite core.
5992 */
5993 #ifndef SQLITE_SERIES_CONSTRAINT_VERIFY
5994 # define SQLITE_SERIES_CONSTRAINT_VERIFY 0
5995 #endif
5996 
5997 /*
5998 ** This method is called to "rewind" the series_cursor object back
5999 ** to the first row of output.  This method is always called at least
6000 ** once prior to any call to seriesColumn() or seriesRowid() or
6001 ** seriesEof().
6002 **
6003 ** The query plan selected by seriesBestIndex is passed in the idxNum
6004 ** parameter.  (idxStr is not used in this implementation.)  idxNum
6005 ** is a bitmask showing which constraints are available:
6006 **
6007 **   0x01:    start=VALUE
6008 **   0x02:    stop=VALUE
6009 **   0x04:    step=VALUE
6010 **   0x08:    descending order
6011 **   0x10:    ascending order
6012 **   0x20:    LIMIT  VALUE
6013 **   0x40:    OFFSET  VALUE
6014 **
6015 ** This routine should initialize the cursor and position it so that it
6016 ** is pointing at the first row, or pointing off the end of the table
6017 ** (so that seriesEof() will return true) if the table is empty.
6018 */
seriesFilter(sqlite3_vtab_cursor * pVtabCursor,int idxNum,const char * idxStrUnused,int argc,sqlite3_value ** argv)6019 static int seriesFilter(
6020   sqlite3_vtab_cursor *pVtabCursor,
6021   int idxNum, const char *idxStrUnused,
6022   int argc, sqlite3_value **argv
6023 ){
6024   series_cursor *pCur = (series_cursor *)pVtabCursor;
6025   int i = 0;
6026   (void)idxStrUnused;
6027   if( idxNum & 0x01 ){
6028     pCur->ss.iBase = sqlite3_value_int64(argv[i++]);
6029   }else{
6030     pCur->ss.iBase = 0;
6031   }
6032   if( idxNum & 0x02 ){
6033     pCur->ss.iTerm = sqlite3_value_int64(argv[i++]);
6034   }else{
6035     pCur->ss.iTerm = 0xffffffff;
6036   }
6037   if( idxNum & 0x04 ){
6038     pCur->ss.iStep = sqlite3_value_int64(argv[i++]);
6039     if( pCur->ss.iStep==0 ){
6040       pCur->ss.iStep = 1;
6041     }else if( pCur->ss.iStep<0 ){
6042       if( (idxNum & 0x10)==0 ) idxNum |= 0x08;
6043     }
6044   }else{
6045     pCur->ss.iStep = 1;
6046   }
6047   if( idxNum & 0x20 ){
6048     sqlite3_int64 iLimit = sqlite3_value_int64(argv[i++]);
6049     sqlite3_int64 iTerm;
6050     if( idxNum & 0x40 ){
6051       sqlite3_int64 iOffset = sqlite3_value_int64(argv[i++]);
6052       if( iOffset>0 ){
6053         pCur->ss.iBase += pCur->ss.iStep*iOffset;
6054       }
6055     }
6056     if( iLimit>=0 ){
6057       iTerm = pCur->ss.iBase + (iLimit - 1)*pCur->ss.iStep;
6058       if( pCur->ss.iStep<0 ){
6059         if( iTerm>pCur->ss.iTerm ) pCur->ss.iTerm = iTerm;
6060       }else{
6061         if( iTerm<pCur->ss.iTerm ) pCur->ss.iTerm = iTerm;
6062       }
6063     }
6064   }
6065   for(i=0; i<argc; i++){
6066     if( sqlite3_value_type(argv[i])==SQLITE_NULL ){
6067       /* If any of the constraints have a NULL value, then return no rows.
6068       ** See ticket https://www.sqlite.org/src/info/fac496b61722daf2 */
6069       pCur->ss.iBase = 1;
6070       pCur->ss.iTerm = 0;
6071       pCur->ss.iStep = 1;
6072       break;
6073     }
6074   }
6075   if( idxNum & 0x08 ){
6076     pCur->ss.isReversing = pCur->ss.iStep > 0;
6077   }else{
6078     pCur->ss.isReversing = pCur->ss.iStep < 0;
6079   }
6080   setupSequence( &pCur->ss );
6081   return SQLITE_OK;
6082 }
6083 
6084 /*
6085 ** SQLite will invoke this method one or more times while planning a query
6086 ** that uses the generate_series virtual table.  This routine needs to create
6087 ** a query plan for each invocation and compute an estimated cost for that
6088 ** plan.
6089 **
6090 ** In this implementation idxNum is used to represent the
6091 ** query plan.  idxStr is unused.
6092 **
6093 ** The query plan is represented by bits in idxNum:
6094 **
6095 **   0x01  start = $value  -- constraint exists
6096 **   0x02  stop = $value   -- constraint exists
6097 **   0x04  step = $value   -- constraint exists
6098 **   0x08  output is in descending order
6099 **   0x10  output is in ascending order
6100 **   0x20  LIMIT $value    -- constraint exists
6101 **   0x40  OFFSET $value   -- constraint exists
6102 */
seriesBestIndex(sqlite3_vtab * pVTab,sqlite3_index_info * pIdxInfo)6103 static int seriesBestIndex(
6104   sqlite3_vtab *pVTab,
6105   sqlite3_index_info *pIdxInfo
6106 ){
6107   int i, j;              /* Loop over constraints */
6108   int idxNum = 0;        /* The query plan bitmask */
6109 #ifndef ZERO_ARGUMENT_GENERATE_SERIES
6110   int bStartSeen = 0;    /* EQ constraint seen on the START column */
6111 #endif
6112   int unusableMask = 0;  /* Mask of unusable constraints */
6113   int nArg = 0;          /* Number of arguments that seriesFilter() expects */
6114   int aIdx[5];           /* Constraints on start, stop, step, LIMIT, OFFSET */
6115   const struct sqlite3_index_constraint *pConstraint;
6116 
6117   /* This implementation assumes that the start, stop, and step columns
6118   ** are the last three columns in the virtual table. */
6119   assert( SERIES_COLUMN_STOP == SERIES_COLUMN_START+1 );
6120   assert( SERIES_COLUMN_STEP == SERIES_COLUMN_START+2 );
6121 
6122   aIdx[0] = aIdx[1] = aIdx[2] = aIdx[3] = aIdx[4] = -1;
6123   pConstraint = pIdxInfo->aConstraint;
6124   for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){
6125     int iCol;    /* 0 for start, 1 for stop, 2 for step */
6126     int iMask;   /* bitmask for those column */
6127     int op = pConstraint->op;
6128     if( op>=SQLITE_INDEX_CONSTRAINT_LIMIT
6129      && op<=SQLITE_INDEX_CONSTRAINT_OFFSET
6130     ){
6131       if( pConstraint->usable==0 ){
6132         /* do nothing */
6133       }else if( op==SQLITE_INDEX_CONSTRAINT_LIMIT ){
6134         aIdx[3] = i;
6135         idxNum |= 0x20;
6136       }else{
6137         assert( op==SQLITE_INDEX_CONSTRAINT_OFFSET );
6138         aIdx[4] = i;
6139         idxNum |= 0x40;
6140       }
6141       continue;
6142     }
6143     if( pConstraint->iColumn<SERIES_COLUMN_START ) continue;
6144     iCol = pConstraint->iColumn - SERIES_COLUMN_START;
6145     assert( iCol>=0 && iCol<=2 );
6146     iMask = 1 << iCol;
6147 #ifndef ZERO_ARGUMENT_GENERATE_SERIES
6148     if( iCol==0 && op==SQLITE_INDEX_CONSTRAINT_EQ ){
6149       bStartSeen = 1;
6150     }
6151 #endif
6152     if( pConstraint->usable==0 ){
6153       unusableMask |=  iMask;
6154       continue;
6155     }else if( op==SQLITE_INDEX_CONSTRAINT_EQ ){
6156       idxNum |= iMask;
6157       aIdx[iCol] = i;
6158     }
6159   }
6160   if( aIdx[3]==0 ){
6161     /* Ignore OFFSET if LIMIT is omitted */
6162     idxNum &= ~0x60;
6163     aIdx[4] = 0;
6164   }
6165   for(i=0; i<5; i++){
6166     if( (j = aIdx[i])>=0 ){
6167       pIdxInfo->aConstraintUsage[j].argvIndex = ++nArg;
6168       pIdxInfo->aConstraintUsage[j].omit =
6169          !SQLITE_SERIES_CONSTRAINT_VERIFY || i>=3;
6170     }
6171   }
6172   /* The current generate_column() implementation requires at least one
6173   ** argument (the START value).  Legacy versions assumed START=0 if the
6174   ** first argument was omitted.  Compile with -DZERO_ARGUMENT_GENERATE_SERIES
6175   ** to obtain the legacy behavior */
6176 #ifndef ZERO_ARGUMENT_GENERATE_SERIES
6177   if( !bStartSeen ){
6178     sqlite3_free(pVTab->zErrMsg);
6179     pVTab->zErrMsg = sqlite3_mprintf(
6180         "first argument to \"generate_series()\" missing or unusable");
6181     return SQLITE_ERROR;
6182   }
6183 #endif
6184   if( (unusableMask & ~idxNum)!=0 ){
6185     /* The start, stop, and step columns are inputs.  Therefore if there
6186     ** are unusable constraints on any of start, stop, or step then
6187     ** this plan is unusable */
6188     return SQLITE_CONSTRAINT;
6189   }
6190   if( (idxNum & 0x03)==0x03 ){
6191     /* Both start= and stop= boundaries are available.  This is the
6192     ** the preferred case */
6193     pIdxInfo->estimatedCost = (double)(2 - ((idxNum&4)!=0));
6194     pIdxInfo->estimatedRows = 1000;
6195     if( pIdxInfo->nOrderBy>=1 && pIdxInfo->aOrderBy[0].iColumn==0 ){
6196       if( pIdxInfo->aOrderBy[0].desc ){
6197         idxNum |= 0x08;
6198       }else{
6199         idxNum |= 0x10;
6200       }
6201       pIdxInfo->orderByConsumed = 1;
6202     }
6203   }else if( (idxNum & 0x21)==0x21 ){
6204     /* We have start= and LIMIT */
6205     pIdxInfo->estimatedRows = 2500;
6206   }else{
6207     /* If either boundary is missing, we have to generate a huge span
6208     ** of numbers.  Make this case very expensive so that the query
6209     ** planner will work hard to avoid it. */
6210     pIdxInfo->estimatedRows = 2147483647;
6211   }
6212   pIdxInfo->idxNum = idxNum;
6213   return SQLITE_OK;
6214 }
6215 
6216 /*
6217 ** This following structure defines all the methods for the
6218 ** generate_series virtual table.
6219 */
6220 static sqlite3_module seriesModule = {
6221   0,                         /* iVersion */
6222   0,                         /* xCreate */
6223   seriesConnect,             /* xConnect */
6224   seriesBestIndex,           /* xBestIndex */
6225   seriesDisconnect,          /* xDisconnect */
6226   0,                         /* xDestroy */
6227   seriesOpen,                /* xOpen - open a cursor */
6228   seriesClose,               /* xClose - close a cursor */
6229   seriesFilter,              /* xFilter - configure scan constraints */
6230   seriesNext,                /* xNext - advance a cursor */
6231   seriesEof,                 /* xEof - check for end of scan */
6232   seriesColumn,              /* xColumn - read data */
6233   seriesRowid,               /* xRowid - read data */
6234   0,                         /* xUpdate */
6235   0,                         /* xBegin */
6236   0,                         /* xSync */
6237   0,                         /* xCommit */
6238   0,                         /* xRollback */
6239   0,                         /* xFindMethod */
6240   0,                         /* xRename */
6241   0,                         /* xSavepoint */
6242   0,                         /* xRelease */
6243   0,                         /* xRollbackTo */
6244   0,                         /* xShadowName */
6245   0                          /* xIntegrity */
6246 };
6247 
6248 #endif /* SQLITE_OMIT_VIRTUALTABLE */
6249 
6250 #ifdef _WIN32
6251 
6252 #endif
sqlite3_series_init(sqlite3 * db,char ** pzErrMsg,const sqlite3_api_routines * pApi)6253 int sqlite3_series_init(
6254   sqlite3 *db,
6255   char **pzErrMsg,
6256   const sqlite3_api_routines *pApi
6257 ){
6258   int rc = SQLITE_OK;
6259   SQLITE_EXTENSION_INIT2(pApi);
6260 #ifndef SQLITE_OMIT_VIRTUALTABLE
6261   if( sqlite3_libversion_number()<3008012 && pzErrMsg!=0 ){
6262     *pzErrMsg = sqlite3_mprintf(
6263         "generate_series() requires SQLite 3.8.12 or later");
6264     return SQLITE_ERROR;
6265   }
6266   rc = sqlite3_create_module(db, "generate_series", &seriesModule, 0);
6267 #endif
6268   return rc;
6269 }
6270 
6271 /************************* End ../ext/misc/series.c ********************/
6272 /************************* Begin ../ext/misc/regexp.c ******************/
6273 /*
6274 ** 2012-11-13
6275 **
6276 ** The author disclaims copyright to this source code.  In place of
6277 ** a legal notice, here is a blessing:
6278 **
6279 **    May you do good and not evil.
6280 **    May you find forgiveness for yourself and forgive others.
6281 **    May you share freely, never taking more than you give.
6282 **
6283 ******************************************************************************
6284 **
6285 ** The code in this file implements a compact but reasonably
6286 ** efficient regular-expression matcher for posix extended regular
6287 ** expressions against UTF8 text.
6288 **
6289 ** This file is an SQLite extension.  It registers a single function
6290 ** named "regexp(A,B)" where A is the regular expression and B is the
6291 ** string to be matched.  By registering this function, SQLite will also
6292 ** then implement the "B regexp A" operator.  Note that with the function
6293 ** the regular expression comes first, but with the operator it comes
6294 ** second.
6295 **
6296 **  The following regular expression syntax is supported:
6297 **
6298 **     X*      zero or more occurrences of X
6299 **     X+      one or more occurrences of X
6300 **     X?      zero or one occurrences of X
6301 **     X{p,q}  between p and q occurrences of X
6302 **     (X)     match X
6303 **     X|Y     X or Y
6304 **     ^X      X occurring at the beginning of the string
6305 **     X$      X occurring at the end of the string
6306 **     .       Match any single character
6307 **     \c      Character c where c is one of \{}()[]|*+?.
6308 **     \c      C-language escapes for c in afnrtv.  ex: \t or \n
6309 **     \uXXXX  Where XXXX is exactly 4 hex digits, unicode value XXXX
6310 **     \xXX    Where XX is exactly 2 hex digits, unicode value XX
6311 **     [abc]   Any single character from the set abc
6312 **     [^abc]  Any single character not in the set abc
6313 **     [a-z]   Any single character in the range a-z
6314 **     [^a-z]  Any single character not in the range a-z
6315 **     \b      Word boundary
6316 **     \w      Word character.  [A-Za-z0-9_]
6317 **     \W      Non-word character
6318 **     \d      Digit
6319 **     \D      Non-digit
6320 **     \s      Whitespace character
6321 **     \S      Non-whitespace character
6322 **
6323 ** A nondeterministic finite automaton (NFA) is used for matching, so the
6324 ** performance is bounded by O(N*M) where N is the size of the regular
6325 ** expression and M is the size of the input string.  The matcher never
6326 ** exhibits exponential behavior.  Note that the X{p,q} operator expands
6327 ** to p copies of X following by q-p copies of X? and that the size of the
6328 ** regular expression in the O(N*M) performance bound is computed after
6329 ** this expansion.
6330 */
6331 #include <string.h>
6332 #include <stdlib.h>
6333 /* #include "sqlite3ext.h" */
6334 SQLITE_EXTENSION_INIT1
6335 
6336 /*
6337 ** The following #defines change the names of some functions implemented in
6338 ** this file to prevent name collisions with C-library functions of the
6339 ** same name.
6340 */
6341 #define re_match   sqlite3re_match
6342 #define re_compile sqlite3re_compile
6343 #define re_free    sqlite3re_free
6344 
6345 /* The end-of-input character */
6346 #define RE_EOF            0    /* End of input */
6347 #define RE_START  0xfffffff    /* Start of input - larger than an UTF-8 */
6348 
6349 /* The NFA is implemented as sequence of opcodes taken from the following
6350 ** set.  Each opcode has a single integer argument.
6351 */
6352 #define RE_OP_MATCH       1    /* Match the one character in the argument */
6353 #define RE_OP_ANY         2    /* Match any one character.  (Implements ".") */
6354 #define RE_OP_ANYSTAR     3    /* Special optimized version of .* */
6355 #define RE_OP_FORK        4    /* Continue to both next and opcode at iArg */
6356 #define RE_OP_GOTO        5    /* Jump to opcode at iArg */
6357 #define RE_OP_ACCEPT      6    /* Halt and indicate a successful match */
6358 #define RE_OP_CC_INC      7    /* Beginning of a [...] character class */
6359 #define RE_OP_CC_EXC      8    /* Beginning of a [^...] character class */
6360 #define RE_OP_CC_VALUE    9    /* Single value in a character class */
6361 #define RE_OP_CC_RANGE   10    /* Range of values in a character class */
6362 #define RE_OP_WORD       11    /* Perl word character [A-Za-z0-9_] */
6363 #define RE_OP_NOTWORD    12    /* Not a perl word character */
6364 #define RE_OP_DIGIT      13    /* digit:  [0-9] */
6365 #define RE_OP_NOTDIGIT   14    /* Not a digit */
6366 #define RE_OP_SPACE      15    /* space:  [ \t\n\r\v\f] */
6367 #define RE_OP_NOTSPACE   16    /* Not a digit */
6368 #define RE_OP_BOUNDARY   17    /* Boundary between word and non-word */
6369 #define RE_OP_ATSTART    18    /* Currently at the start of the string */
6370 
6371 #if defined(SQLITE_DEBUG)
6372 /* Opcode names used for symbolic debugging */
6373 static const char *ReOpName[] = {
6374   "EOF",
6375   "MATCH",
6376   "ANY",
6377   "ANYSTAR",
6378   "FORK",
6379   "GOTO",
6380   "ACCEPT",
6381   "CC_INC",
6382   "CC_EXC",
6383   "CC_VALUE",
6384   "CC_RANGE",
6385   "WORD",
6386   "NOTWORD",
6387   "DIGIT",
6388   "NOTDIGIT",
6389   "SPACE",
6390   "NOTSPACE",
6391   "BOUNDARY",
6392   "ATSTART",
6393 };
6394 #endif /* SQLITE_DEBUG */
6395 
6396 
6397 /* Each opcode is a "state" in the NFA */
6398 typedef unsigned short ReStateNumber;
6399 
6400 /* Because this is an NFA and not a DFA, multiple states can be active at
6401 ** once.  An instance of the following object records all active states in
6402 ** the NFA.  The implementation is optimized for the common case where the
6403 ** number of actives states is small.
6404 */
6405 typedef struct ReStateSet {
6406   unsigned nState;            /* Number of current states */
6407   ReStateNumber *aState;      /* Current states */
6408 } ReStateSet;
6409 
6410 /* An input string read one character at a time.
6411 */
6412 typedef struct ReInput ReInput;
6413 struct ReInput {
6414   const unsigned char *z;  /* All text */
6415   int i;                   /* Next byte to read */
6416   int mx;                  /* EOF when i>=mx */
6417 };
6418 
6419 /* A compiled NFA (or an NFA that is in the process of being compiled) is
6420 ** an instance of the following object.
6421 */
6422 typedef struct ReCompiled ReCompiled;
6423 struct ReCompiled {
6424   ReInput sIn;                /* Regular expression text */
6425   const char *zErr;           /* Error message to return */
6426   char *aOp;                  /* Operators for the virtual machine */
6427   int *aArg;                  /* Arguments to each operator */
6428   unsigned (*xNextChar)(ReInput*);  /* Next character function */
6429   unsigned char zInit[12];    /* Initial text to match */
6430   int nInit;                  /* Number of bytes in zInit */
6431   unsigned nState;            /* Number of entries in aOp[] and aArg[] */
6432   unsigned nAlloc;            /* Slots allocated for aOp[] and aArg[] */
6433 };
6434 
6435 /* Add a state to the given state set if it is not already there */
re_add_state(ReStateSet * pSet,int newState)6436 static void re_add_state(ReStateSet *pSet, int newState){
6437   unsigned i;
6438   for(i=0; i<pSet->nState; i++) if( pSet->aState[i]==newState ) return;
6439   pSet->aState[pSet->nState++] = (ReStateNumber)newState;
6440 }
6441 
6442 /* Extract the next unicode character from *pzIn and return it.  Advance
6443 ** *pzIn to the first byte past the end of the character returned.  To
6444 ** be clear:  this routine converts utf8 to unicode.  This routine is
6445 ** optimized for the common case where the next character is a single byte.
6446 */
re_next_char(ReInput * p)6447 static unsigned re_next_char(ReInput *p){
6448   unsigned c;
6449   if( p->i>=p->mx ) return 0;
6450   c = p->z[p->i++];
6451   if( c>=0x80 ){
6452     if( (c&0xe0)==0xc0 && p->i<p->mx && (p->z[p->i]&0xc0)==0x80 ){
6453       c = (c&0x1f)<<6 | (p->z[p->i++]&0x3f);
6454       if( c<0x80 ) c = 0xfffd;
6455     }else if( (c&0xf0)==0xe0 && p->i+1<p->mx && (p->z[p->i]&0xc0)==0x80
6456            && (p->z[p->i+1]&0xc0)==0x80 ){
6457       c = (c&0x0f)<<12 | ((p->z[p->i]&0x3f)<<6) | (p->z[p->i+1]&0x3f);
6458       p->i += 2;
6459       if( c<=0x7ff || (c>=0xd800 && c<=0xdfff) ) c = 0xfffd;
6460     }else if( (c&0xf8)==0xf0 && p->i+2<p->mx && (p->z[p->i]&0xc0)==0x80
6461            && (p->z[p->i+1]&0xc0)==0x80 && (p->z[p->i+2]&0xc0)==0x80 ){
6462       c = (c&0x07)<<18 | ((p->z[p->i]&0x3f)<<12) | ((p->z[p->i+1]&0x3f)<<6)
6463                        | (p->z[p->i+2]&0x3f);
6464       p->i += 3;
6465       if( c<=0xffff || c>0x10ffff ) c = 0xfffd;
6466     }else{
6467       c = 0xfffd;
6468     }
6469   }
6470   return c;
6471 }
re_next_char_nocase(ReInput * p)6472 static unsigned re_next_char_nocase(ReInput *p){
6473   unsigned c = re_next_char(p);
6474   if( c>='A' && c<='Z' ) c += 'a' - 'A';
6475   return c;
6476 }
6477 
6478 /* Return true if c is a perl "word" character:  [A-Za-z0-9_] */
re_word_char(int c)6479 static int re_word_char(int c){
6480   return (c>='0' && c<='9') || (c>='a' && c<='z')
6481       || (c>='A' && c<='Z') || c=='_';
6482 }
6483 
6484 /* Return true if c is a "digit" character:  [0-9] */
re_digit_char(int c)6485 static int re_digit_char(int c){
6486   return (c>='0' && c<='9');
6487 }
6488 
6489 /* Return true if c is a perl "space" character:  [ \t\r\n\v\f] */
re_space_char(int c)6490 static int re_space_char(int c){
6491   return c==' ' || c=='\t' || c=='\n' || c=='\r' || c=='\v' || c=='\f';
6492 }
6493 
6494 /* Run a compiled regular expression on the zero-terminated input
6495 ** string zIn[].  Return true on a match and false if there is no match.
6496 */
re_match(ReCompiled * pRe,const unsigned char * zIn,int nIn)6497 static int re_match(ReCompiled *pRe, const unsigned char *zIn, int nIn){
6498   ReStateSet aStateSet[2], *pThis, *pNext;
6499   ReStateNumber aSpace[100];
6500   ReStateNumber *pToFree;
6501   unsigned int i = 0;
6502   unsigned int iSwap = 0;
6503   int c = RE_START;
6504   int cPrev = 0;
6505   int rc = 0;
6506   ReInput in;
6507 
6508   in.z = zIn;
6509   in.i = 0;
6510   in.mx = nIn>=0 ? nIn : (int)strlen((char const*)zIn);
6511 
6512   /* Look for the initial prefix match, if there is one. */
6513   if( pRe->nInit ){
6514     unsigned char x = pRe->zInit[0];
6515     while( in.i+pRe->nInit<=in.mx
6516      && (zIn[in.i]!=x ||
6517          strncmp((const char*)zIn+in.i, (const char*)pRe->zInit, pRe->nInit)!=0)
6518     ){
6519       in.i++;
6520     }
6521     if( in.i+pRe->nInit>in.mx ) return 0;
6522     c = RE_START-1;
6523   }
6524 
6525   if( pRe->nState<=(sizeof(aSpace)/(sizeof(aSpace[0])*2)) ){
6526     pToFree = 0;
6527     aStateSet[0].aState = aSpace;
6528   }else{
6529     pToFree = sqlite3_malloc64( sizeof(ReStateNumber)*2*pRe->nState );
6530     if( pToFree==0 ) return -1;
6531     aStateSet[0].aState = pToFree;
6532   }
6533   aStateSet[1].aState = &aStateSet[0].aState[pRe->nState];
6534   pNext = &aStateSet[1];
6535   pNext->nState = 0;
6536   re_add_state(pNext, 0);
6537   while( c!=RE_EOF && pNext->nState>0 ){
6538     cPrev = c;
6539     c = pRe->xNextChar(&in);
6540     pThis = pNext;
6541     pNext = &aStateSet[iSwap];
6542     iSwap = 1 - iSwap;
6543     pNext->nState = 0;
6544     for(i=0; i<pThis->nState; i++){
6545       int x = pThis->aState[i];
6546       switch( pRe->aOp[x] ){
6547         case RE_OP_MATCH: {
6548           if( pRe->aArg[x]==c ) re_add_state(pNext, x+1);
6549           break;
6550         }
6551         case RE_OP_ATSTART: {
6552           if( cPrev==RE_START ) re_add_state(pThis, x+1);
6553           break;
6554         }
6555         case RE_OP_ANY: {
6556           if( c!=0 ) re_add_state(pNext, x+1);
6557           break;
6558         }
6559         case RE_OP_WORD: {
6560           if( re_word_char(c) ) re_add_state(pNext, x+1);
6561           break;
6562         }
6563         case RE_OP_NOTWORD: {
6564           if( !re_word_char(c) && c!=0 ) re_add_state(pNext, x+1);
6565           break;
6566         }
6567         case RE_OP_DIGIT: {
6568           if( re_digit_char(c) ) re_add_state(pNext, x+1);
6569           break;
6570         }
6571         case RE_OP_NOTDIGIT: {
6572           if( !re_digit_char(c) && c!=0 ) re_add_state(pNext, x+1);
6573           break;
6574         }
6575         case RE_OP_SPACE: {
6576           if( re_space_char(c) ) re_add_state(pNext, x+1);
6577           break;
6578         }
6579         case RE_OP_NOTSPACE: {
6580           if( !re_space_char(c) && c!=0 ) re_add_state(pNext, x+1);
6581           break;
6582         }
6583         case RE_OP_BOUNDARY: {
6584           if( re_word_char(c)!=re_word_char(cPrev) ) re_add_state(pThis, x+1);
6585           break;
6586         }
6587         case RE_OP_ANYSTAR: {
6588           re_add_state(pNext, x);
6589           re_add_state(pThis, x+1);
6590           break;
6591         }
6592         case RE_OP_FORK: {
6593           re_add_state(pThis, x+pRe->aArg[x]);
6594           re_add_state(pThis, x+1);
6595           break;
6596         }
6597         case RE_OP_GOTO: {
6598           re_add_state(pThis, x+pRe->aArg[x]);
6599           break;
6600         }
6601         case RE_OP_ACCEPT: {
6602           rc = 1;
6603           goto re_match_end;
6604         }
6605         case RE_OP_CC_EXC: {
6606           if( c==0 ) break;
6607           /* fall-through */ goto re_op_cc_inc;
6608         }
6609         case RE_OP_CC_INC: re_op_cc_inc: {
6610           int j = 1;
6611           int n = pRe->aArg[x];
6612           int hit = 0;
6613           for(j=1; j>0 && j<n; j++){
6614             if( pRe->aOp[x+j]==RE_OP_CC_VALUE ){
6615               if( pRe->aArg[x+j]==c ){
6616                 hit = 1;
6617                 j = -1;
6618               }
6619             }else{
6620               if( pRe->aArg[x+j]<=c && pRe->aArg[x+j+1]>=c ){
6621                 hit = 1;
6622                 j = -1;
6623               }else{
6624                 j++;
6625               }
6626             }
6627           }
6628           if( pRe->aOp[x]==RE_OP_CC_EXC ) hit = !hit;
6629           if( hit ) re_add_state(pNext, x+n);
6630           break;
6631         }
6632       }
6633     }
6634   }
6635   for(i=0; i<pNext->nState; i++){
6636     int x = pNext->aState[i];
6637     while( pRe->aOp[x]==RE_OP_GOTO ) x += pRe->aArg[x];
6638     if( pRe->aOp[x]==RE_OP_ACCEPT ){ rc = 1; break; }
6639   }
6640 re_match_end:
6641   sqlite3_free(pToFree);
6642   return rc;
6643 }
6644 
6645 /* Resize the opcode and argument arrays for an RE under construction.
6646 */
re_resize(ReCompiled * p,int N)6647 static int re_resize(ReCompiled *p, int N){
6648   char *aOp;
6649   int *aArg;
6650   aOp = sqlite3_realloc64(p->aOp, N*sizeof(p->aOp[0]));
6651   if( aOp==0 ) return 1;
6652   p->aOp = aOp;
6653   aArg = sqlite3_realloc64(p->aArg, N*sizeof(p->aArg[0]));
6654   if( aArg==0 ) return 1;
6655   p->aArg = aArg;
6656   p->nAlloc = N;
6657   return 0;
6658 }
6659 
6660 /* Insert a new opcode and argument into an RE under construction.  The
6661 ** insertion point is just prior to existing opcode iBefore.
6662 */
re_insert(ReCompiled * p,int iBefore,int op,int arg)6663 static int re_insert(ReCompiled *p, int iBefore, int op, int arg){
6664   int i;
6665   if( p->nAlloc<=p->nState && re_resize(p, p->nAlloc*2) ) return 0;
6666   for(i=p->nState; i>iBefore; i--){
6667     p->aOp[i] = p->aOp[i-1];
6668     p->aArg[i] = p->aArg[i-1];
6669   }
6670   p->nState++;
6671   p->aOp[iBefore] = (char)op;
6672   p->aArg[iBefore] = arg;
6673   return iBefore;
6674 }
6675 
6676 /* Append a new opcode and argument to the end of the RE under construction.
6677 */
re_append(ReCompiled * p,int op,int arg)6678 static int re_append(ReCompiled *p, int op, int arg){
6679   return re_insert(p, p->nState, op, arg);
6680 }
6681 
6682 /* Make a copy of N opcodes starting at iStart onto the end of the RE
6683 ** under construction.
6684 */
re_copy(ReCompiled * p,int iStart,int N)6685 static void re_copy(ReCompiled *p, int iStart, int N){
6686   if( p->nState+N>=p->nAlloc && re_resize(p, p->nAlloc*2+N) ) return;
6687   memcpy(&p->aOp[p->nState], &p->aOp[iStart], N*sizeof(p->aOp[0]));
6688   memcpy(&p->aArg[p->nState], &p->aArg[iStart], N*sizeof(p->aArg[0]));
6689   p->nState += N;
6690 }
6691 
6692 /* Return true if c is a hexadecimal digit character:  [0-9a-fA-F]
6693 ** If c is a hex digit, also set *pV = (*pV)*16 + valueof(c).  If
6694 ** c is not a hex digit *pV is unchanged.
6695 */
re_hex(int c,int * pV)6696 static int re_hex(int c, int *pV){
6697   if( c>='0' && c<='9' ){
6698     c -= '0';
6699   }else if( c>='a' && c<='f' ){
6700     c -= 'a' - 10;
6701   }else if( c>='A' && c<='F' ){
6702     c -= 'A' - 10;
6703   }else{
6704     return 0;
6705   }
6706   *pV = (*pV)*16 + (c & 0xff);
6707   return 1;
6708 }
6709 
6710 /* A backslash character has been seen, read the next character and
6711 ** return its interpretation.
6712 */
re_esc_char(ReCompiled * p)6713 static unsigned re_esc_char(ReCompiled *p){
6714   static const char zEsc[] = "afnrtv\\()*.+?[$^{|}]";
6715   static const char zTrans[] = "\a\f\n\r\t\v";
6716   int i, v = 0;
6717   char c;
6718   if( p->sIn.i>=p->sIn.mx ) return 0;
6719   c = p->sIn.z[p->sIn.i];
6720   if( c=='u' && p->sIn.i+4<p->sIn.mx ){
6721     const unsigned char *zIn = p->sIn.z + p->sIn.i;
6722     if( re_hex(zIn[1],&v)
6723      && re_hex(zIn[2],&v)
6724      && re_hex(zIn[3],&v)
6725      && re_hex(zIn[4],&v)
6726     ){
6727       p->sIn.i += 5;
6728       return v;
6729     }
6730   }
6731   if( c=='x' && p->sIn.i+2<p->sIn.mx ){
6732     const unsigned char *zIn = p->sIn.z + p->sIn.i;
6733     if( re_hex(zIn[1],&v)
6734      && re_hex(zIn[2],&v)
6735     ){
6736       p->sIn.i += 3;
6737       return v;
6738     }
6739   }
6740   for(i=0; zEsc[i] && zEsc[i]!=c; i++){}
6741   if( zEsc[i] ){
6742     if( i<6 ) c = zTrans[i];
6743     p->sIn.i++;
6744   }else{
6745     p->zErr = "unknown \\ escape";
6746   }
6747   return c;
6748 }
6749 
6750 /* Forward declaration */
6751 static const char *re_subcompile_string(ReCompiled*);
6752 
6753 /* Peek at the next byte of input */
rePeek(ReCompiled * p)6754 static unsigned char rePeek(ReCompiled *p){
6755   return p->sIn.i<p->sIn.mx ? p->sIn.z[p->sIn.i] : 0;
6756 }
6757 
6758 /* Compile RE text into a sequence of opcodes.  Continue up to the
6759 ** first unmatched ")" character, then return.  If an error is found,
6760 ** return a pointer to the error message string.
6761 */
re_subcompile_re(ReCompiled * p)6762 static const char *re_subcompile_re(ReCompiled *p){
6763   const char *zErr;
6764   int iStart, iEnd, iGoto;
6765   iStart = p->nState;
6766   zErr = re_subcompile_string(p);
6767   if( zErr ) return zErr;
6768   while( rePeek(p)=='|' ){
6769     iEnd = p->nState;
6770     re_insert(p, iStart, RE_OP_FORK, iEnd + 2 - iStart);
6771     iGoto = re_append(p, RE_OP_GOTO, 0);
6772     p->sIn.i++;
6773     zErr = re_subcompile_string(p);
6774     if( zErr ) return zErr;
6775     p->aArg[iGoto] = p->nState - iGoto;
6776   }
6777   return 0;
6778 }
6779 
6780 /* Compile an element of regular expression text (anything that can be
6781 ** an operand to the "|" operator).  Return NULL on success or a pointer
6782 ** to the error message if there is a problem.
6783 */
re_subcompile_string(ReCompiled * p)6784 static const char *re_subcompile_string(ReCompiled *p){
6785   int iPrev = -1;
6786   int iStart;
6787   unsigned c;
6788   const char *zErr;
6789   while( (c = p->xNextChar(&p->sIn))!=0 ){
6790     iStart = p->nState;
6791     switch( c ){
6792       case '|':
6793       case ')': {
6794         p->sIn.i--;
6795         return 0;
6796       }
6797       case '(': {
6798         zErr = re_subcompile_re(p);
6799         if( zErr ) return zErr;
6800         if( rePeek(p)!=')' ) return "unmatched '('";
6801         p->sIn.i++;
6802         break;
6803       }
6804       case '.': {
6805         if( rePeek(p)=='*' ){
6806           re_append(p, RE_OP_ANYSTAR, 0);
6807           p->sIn.i++;
6808         }else{
6809           re_append(p, RE_OP_ANY, 0);
6810         }
6811         break;
6812       }
6813       case '*': {
6814         if( iPrev<0 ) return "'*' without operand";
6815         re_insert(p, iPrev, RE_OP_GOTO, p->nState - iPrev + 1);
6816         re_append(p, RE_OP_FORK, iPrev - p->nState + 1);
6817         break;
6818       }
6819       case '+': {
6820         if( iPrev<0 ) return "'+' without operand";
6821         re_append(p, RE_OP_FORK, iPrev - p->nState);
6822         break;
6823       }
6824       case '?': {
6825         if( iPrev<0 ) return "'?' without operand";
6826         re_insert(p, iPrev, RE_OP_FORK, p->nState - iPrev+1);
6827         break;
6828       }
6829       case '$': {
6830         re_append(p, RE_OP_MATCH, RE_EOF);
6831         break;
6832       }
6833       case '^': {
6834         re_append(p, RE_OP_ATSTART, 0);
6835         break;
6836       }
6837       case '{': {
6838         int m = 0, n = 0;
6839         int sz, j;
6840         if( iPrev<0 ) return "'{m,n}' without operand";
6841         while( (c=rePeek(p))>='0' && c<='9' ){ m = m*10 + c - '0'; p->sIn.i++; }
6842         n = m;
6843         if( c==',' ){
6844           p->sIn.i++;
6845           n = 0;
6846           while( (c=rePeek(p))>='0' && c<='9' ){ n = n*10 + c-'0'; p->sIn.i++; }
6847         }
6848         if( c!='}' ) return "unmatched '{'";
6849         if( n>0 && n<m ) return "n less than m in '{m,n}'";
6850         p->sIn.i++;
6851         sz = p->nState - iPrev;
6852         if( m==0 ){
6853           if( n==0 ) return "both m and n are zero in '{m,n}'";
6854           re_insert(p, iPrev, RE_OP_FORK, sz+1);
6855           iPrev++;
6856           n--;
6857         }else{
6858           for(j=1; j<m; j++) re_copy(p, iPrev, sz);
6859         }
6860         for(j=m; j<n; j++){
6861           re_append(p, RE_OP_FORK, sz+1);
6862           re_copy(p, iPrev, sz);
6863         }
6864         if( n==0 && m>0 ){
6865           re_append(p, RE_OP_FORK, -sz);
6866         }
6867         break;
6868       }
6869       case '[': {
6870         unsigned int iFirst = p->nState;
6871         if( rePeek(p)=='^' ){
6872           re_append(p, RE_OP_CC_EXC, 0);
6873           p->sIn.i++;
6874         }else{
6875           re_append(p, RE_OP_CC_INC, 0);
6876         }
6877         while( (c = p->xNextChar(&p->sIn))!=0 ){
6878           if( c=='[' && rePeek(p)==':' ){
6879             return "POSIX character classes not supported";
6880           }
6881           if( c=='\\' ) c = re_esc_char(p);
6882           if( rePeek(p)=='-' ){
6883             re_append(p, RE_OP_CC_RANGE, c);
6884             p->sIn.i++;
6885             c = p->xNextChar(&p->sIn);
6886             if( c=='\\' ) c = re_esc_char(p);
6887             re_append(p, RE_OP_CC_RANGE, c);
6888           }else{
6889             re_append(p, RE_OP_CC_VALUE, c);
6890           }
6891           if( rePeek(p)==']' ){ p->sIn.i++; break; }
6892         }
6893         if( c==0 ) return "unclosed '['";
6894         if( p->nState>iFirst ) p->aArg[iFirst] = p->nState - iFirst;
6895         break;
6896       }
6897       case '\\': {
6898         int specialOp = 0;
6899         switch( rePeek(p) ){
6900           case 'b': specialOp = RE_OP_BOUNDARY;   break;
6901           case 'd': specialOp = RE_OP_DIGIT;      break;
6902           case 'D': specialOp = RE_OP_NOTDIGIT;   break;
6903           case 's': specialOp = RE_OP_SPACE;      break;
6904           case 'S': specialOp = RE_OP_NOTSPACE;   break;
6905           case 'w': specialOp = RE_OP_WORD;       break;
6906           case 'W': specialOp = RE_OP_NOTWORD;    break;
6907         }
6908         if( specialOp ){
6909           p->sIn.i++;
6910           re_append(p, specialOp, 0);
6911         }else{
6912           c = re_esc_char(p);
6913           re_append(p, RE_OP_MATCH, c);
6914         }
6915         break;
6916       }
6917       default: {
6918         re_append(p, RE_OP_MATCH, c);
6919         break;
6920       }
6921     }
6922     iPrev = iStart;
6923   }
6924   return 0;
6925 }
6926 
6927 /* Free and reclaim all the memory used by a previously compiled
6928 ** regular expression.  Applications should invoke this routine once
6929 ** for every call to re_compile() to avoid memory leaks.
6930 */
re_free(ReCompiled * pRe)6931 static void re_free(ReCompiled *pRe){
6932   if( pRe ){
6933     sqlite3_free(pRe->aOp);
6934     sqlite3_free(pRe->aArg);
6935     sqlite3_free(pRe);
6936   }
6937 }
6938 
6939 /*
6940 ** Compile a textual regular expression in zIn[] into a compiled regular
6941 ** expression suitable for us by re_match() and return a pointer to the
6942 ** compiled regular expression in *ppRe.  Return NULL on success or an
6943 ** error message if something goes wrong.
6944 */
re_compile(ReCompiled ** ppRe,const char * zIn,int noCase)6945 static const char *re_compile(ReCompiled **ppRe, const char *zIn, int noCase){
6946   ReCompiled *pRe;
6947   const char *zErr;
6948   int i, j;
6949 
6950   *ppRe = 0;
6951   pRe = sqlite3_malloc( sizeof(*pRe) );
6952   if( pRe==0 ){
6953     return "out of memory";
6954   }
6955   memset(pRe, 0, sizeof(*pRe));
6956   pRe->xNextChar = noCase ? re_next_char_nocase : re_next_char;
6957   if( re_resize(pRe, 30) ){
6958     re_free(pRe);
6959     return "out of memory";
6960   }
6961   if( zIn[0]=='^' ){
6962     zIn++;
6963   }else{
6964     re_append(pRe, RE_OP_ANYSTAR, 0);
6965   }
6966   pRe->sIn.z = (unsigned char*)zIn;
6967   pRe->sIn.i = 0;
6968   pRe->sIn.mx = (int)strlen(zIn);
6969   zErr = re_subcompile_re(pRe);
6970   if( zErr ){
6971     re_free(pRe);
6972     return zErr;
6973   }
6974   if( pRe->sIn.i>=pRe->sIn.mx ){
6975     re_append(pRe, RE_OP_ACCEPT, 0);
6976     *ppRe = pRe;
6977   }else{
6978     re_free(pRe);
6979     return "unrecognized character";
6980   }
6981 
6982   /* The following is a performance optimization.  If the regex begins with
6983   ** ".*" (if the input regex lacks an initial "^") and afterwards there are
6984   ** one or more matching characters, enter those matching characters into
6985   ** zInit[].  The re_match() routine can then search ahead in the input
6986   ** string looking for the initial match without having to run the whole
6987   ** regex engine over the string.  Do not worry about trying to match
6988   ** unicode characters beyond plane 0 - those are very rare and this is
6989   ** just an optimization. */
6990   if( pRe->aOp[0]==RE_OP_ANYSTAR && !noCase ){
6991     for(j=0, i=1; j<(int)sizeof(pRe->zInit)-2 && pRe->aOp[i]==RE_OP_MATCH; i++){
6992       unsigned x = pRe->aArg[i];
6993       if( x<=0x7f ){
6994         pRe->zInit[j++] = (unsigned char)x;
6995       }else if( x<=0x7ff ){
6996         pRe->zInit[j++] = (unsigned char)(0xc0 | (x>>6));
6997         pRe->zInit[j++] = 0x80 | (x&0x3f);
6998       }else if( x<=0xffff ){
6999         pRe->zInit[j++] = (unsigned char)(0xe0 | (x>>12));
7000         pRe->zInit[j++] = 0x80 | ((x>>6)&0x3f);
7001         pRe->zInit[j++] = 0x80 | (x&0x3f);
7002       }else{
7003         break;
7004       }
7005     }
7006     if( j>0 && pRe->zInit[j-1]==0 ) j--;
7007     pRe->nInit = j;
7008   }
7009   return pRe->zErr;
7010 }
7011 
7012 /*
7013 ** Implementation of the regexp() SQL function.  This function implements
7014 ** the build-in REGEXP operator.  The first argument to the function is the
7015 ** pattern and the second argument is the string.  So, the SQL statements:
7016 **
7017 **       A REGEXP B
7018 **
7019 ** is implemented as regexp(B,A).
7020 */
re_sql_func(sqlite3_context * context,int argc,sqlite3_value ** argv)7021 static void re_sql_func(
7022   sqlite3_context *context,
7023   int argc,
7024   sqlite3_value **argv
7025 ){
7026   ReCompiled *pRe;          /* Compiled regular expression */
7027   const char *zPattern;     /* The regular expression */
7028   const unsigned char *zStr;/* String being searched */
7029   const char *zErr;         /* Compile error message */
7030   int setAux = 0;           /* True to invoke sqlite3_set_auxdata() */
7031 
7032   (void)argc;  /* Unused */
7033   pRe = sqlite3_get_auxdata(context, 0);
7034   if( pRe==0 ){
7035     zPattern = (const char*)sqlite3_value_text(argv[0]);
7036     if( zPattern==0 ) return;
7037     zErr = re_compile(&pRe, zPattern, sqlite3_user_data(context)!=0);
7038     if( zErr ){
7039       re_free(pRe);
7040       sqlite3_result_error(context, zErr, -1);
7041       return;
7042     }
7043     if( pRe==0 ){
7044       sqlite3_result_error_nomem(context);
7045       return;
7046     }
7047     setAux = 1;
7048   }
7049   zStr = (const unsigned char*)sqlite3_value_text(argv[1]);
7050   if( zStr!=0 ){
7051     sqlite3_result_int(context, re_match(pRe, zStr, -1));
7052   }
7053   if( setAux ){
7054     sqlite3_set_auxdata(context, 0, pRe, (void(*)(void*))re_free);
7055   }
7056 }
7057 
7058 #if defined(SQLITE_DEBUG)
7059 /*
7060 ** This function is used for testing and debugging only.  It is only available
7061 ** if the SQLITE_DEBUG compile-time option is used.
7062 **
7063 ** Compile a regular expression and then convert the compiled expression into
7064 ** text and return that text.
7065 */
re_bytecode_func(sqlite3_context * context,int argc,sqlite3_value ** argv)7066 static void re_bytecode_func(
7067   sqlite3_context *context,
7068   int argc,
7069   sqlite3_value **argv
7070 ){
7071   const char *zPattern;
7072   const char *zErr;
7073   ReCompiled *pRe;
7074   sqlite3_str *pStr;
7075   int i;
7076   int n;
7077   char *z;
7078   (void)argc;
7079 
7080   zPattern = (const char*)sqlite3_value_text(argv[0]);
7081   if( zPattern==0 ) return;
7082   zErr = re_compile(&pRe, zPattern, sqlite3_user_data(context)!=0);
7083   if( zErr ){
7084     re_free(pRe);
7085     sqlite3_result_error(context, zErr, -1);
7086     return;
7087   }
7088   if( pRe==0 ){
7089     sqlite3_result_error_nomem(context);
7090     return;
7091   }
7092   pStr = sqlite3_str_new(0);
7093   if( pStr==0 ) goto re_bytecode_func_err;
7094   if( pRe->nInit>0 ){
7095     sqlite3_str_appendf(pStr, "INIT     ");
7096     for(i=0; i<pRe->nInit; i++){
7097       sqlite3_str_appendf(pStr, "%02x", pRe->zInit[i]);
7098     }
7099     sqlite3_str_appendf(pStr, "\n");
7100   }
7101   for(i=0; (unsigned)i<pRe->nState; i++){
7102     sqlite3_str_appendf(pStr, "%-8s %4d\n",
7103          ReOpName[(unsigned char)pRe->aOp[i]], pRe->aArg[i]);
7104   }
7105   n = sqlite3_str_length(pStr);
7106   z = sqlite3_str_finish(pStr);
7107   if( n==0 ){
7108     sqlite3_free(z);
7109   }else{
7110     sqlite3_result_text(context, z, n-1, sqlite3_free);
7111   }
7112 
7113 re_bytecode_func_err:
7114   re_free(pRe);
7115 }
7116 
7117 #endif /* SQLITE_DEBUG */
7118 
7119 
7120 /*
7121 ** Invoke this routine to register the regexp() function with the
7122 ** SQLite database connection.
7123 */
7124 #ifdef _WIN32
7125 
7126 #endif
sqlite3_regexp_init(sqlite3 * db,char ** pzErrMsg,const sqlite3_api_routines * pApi)7127 int sqlite3_regexp_init(
7128   sqlite3 *db,
7129   char **pzErrMsg,
7130   const sqlite3_api_routines *pApi
7131 ){
7132   int rc = SQLITE_OK;
7133   SQLITE_EXTENSION_INIT2(pApi);
7134   (void)pzErrMsg;  /* Unused */
7135   rc = sqlite3_create_function(db, "regexp", 2,
7136                             SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC,
7137                             0, re_sql_func, 0, 0);
7138   if( rc==SQLITE_OK ){
7139     /* The regexpi(PATTERN,STRING) function is a case-insensitive version
7140     ** of regexp(PATTERN,STRING). */
7141     rc = sqlite3_create_function(db, "regexpi", 2,
7142                             SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC,
7143                             (void*)db, re_sql_func, 0, 0);
7144 #if defined(SQLITE_DEBUG)
7145     if( rc==SQLITE_OK ){
7146       rc = sqlite3_create_function(db, "regexp_bytecode", 1,
7147                             SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC,
7148                             0, re_bytecode_func, 0, 0);
7149     }
7150 #endif /* SQLITE_DEBUG */
7151   }
7152   return rc;
7153 }
7154 
7155 /************************* End ../ext/misc/regexp.c ********************/
7156 #ifndef SQLITE_SHELL_FIDDLE
7157 /************************* Begin ../ext/misc/fileio.c ******************/
7158 /*
7159 ** 2014-06-13
7160 **
7161 ** The author disclaims copyright to this source code.  In place of
7162 ** a legal notice, here is a blessing:
7163 **
7164 **    May you do good and not evil.
7165 **    May you find forgiveness for yourself and forgive others.
7166 **    May you share freely, never taking more than you give.
7167 **
7168 ******************************************************************************
7169 **
7170 ** This SQLite extension implements SQL functions readfile() and
7171 ** writefile(), and eponymous virtual type "fsdir".
7172 **
7173 ** WRITEFILE(FILE, DATA [, MODE [, MTIME]]):
7174 **
7175 **   If neither of the optional arguments is present, then this UDF
7176 **   function writes blob DATA to file FILE. If successful, the number
7177 **   of bytes written is returned. If an error occurs, NULL is returned.
7178 **
7179 **   If the first option argument - MODE - is present, then it must
7180 **   be passed an integer value that corresponds to a POSIX mode
7181 **   value (file type + permissions, as returned in the stat.st_mode
7182 **   field by the stat() system call). Three types of files may
7183 **   be written/created:
7184 **
7185 **     regular files:  (mode & 0170000)==0100000
7186 **     symbolic links: (mode & 0170000)==0120000
7187 **     directories:    (mode & 0170000)==0040000
7188 **
7189 **   For a directory, the DATA is ignored. For a symbolic link, it is
7190 **   interpreted as text and used as the target of the link. For a
7191 **   regular file, it is interpreted as a blob and written into the
7192 **   named file. Regardless of the type of file, its permissions are
7193 **   set to (mode & 0777) before returning.
7194 **
7195 **   If the optional MTIME argument is present, then it is interpreted
7196 **   as an integer - the number of seconds since the unix epoch. The
7197 **   modification-time of the target file is set to this value before
7198 **   returning.
7199 **
7200 **   If three or more arguments are passed to this function and an
7201 **   error is encountered, an exception is raised.
7202 **
7203 ** READFILE(FILE):
7204 **
7205 **   Read and return the contents of file FILE (type blob) from disk.
7206 **
7207 ** FSDIR:
7208 **
7209 **   Used as follows:
7210 **
7211 **     SELECT * FROM fsdir($path [, $dir]);
7212 **
7213 **   Parameter $path is an absolute or relative pathname. If the file that it
7214 **   refers to does not exist, it is an error. If the path refers to a regular
7215 **   file or symbolic link, it returns a single row. Or, if the path refers
7216 **   to a directory, it returns one row for the directory, and one row for each
7217 **   file within the hierarchy rooted at $path.
7218 **
7219 **   Each row has the following columns:
7220 **
7221 **     name:  Path to file or directory (text value).
7222 **     mode:  Value of stat.st_mode for directory entry (an integer).
7223 **     mtime: Value of stat.st_mtime for directory entry (an integer).
7224 **     data:  For a regular file, a blob containing the file data. For a
7225 **            symlink, a text value containing the text of the link. For a
7226 **            directory, NULL.
7227 **
7228 **   If a non-NULL value is specified for the optional $dir parameter and
7229 **   $path is a relative path, then $path is interpreted relative to $dir.
7230 **   And the paths returned in the "name" column of the table are also
7231 **   relative to directory $dir.
7232 **
7233 ** Notes on building this extension for Windows:
7234 **   Unless linked statically with the SQLite library, a preprocessor
7235 **   symbol, FILEIO_WIN32_DLL, must be #define'd to create a stand-alone
7236 **   DLL form of this extension for WIN32. See its use below for details.
7237 */
7238 /* #include "sqlite3ext.h" */
7239 SQLITE_EXTENSION_INIT1
7240 #include <stdio.h>
7241 #include <string.h>
7242 #include <assert.h>
7243 
7244 #include <sys/types.h>
7245 #include <sys/stat.h>
7246 #include <fcntl.h>
7247 #if !defined(_WIN32) && !defined(WIN32)
7248 #  include <unistd.h>
7249 #  include <dirent.h>
7250 #  include <utime.h>
7251 #  include <sys/time.h>
7252 #else
7253 #  include "windows.h"
7254 #  include <io.h>
7255 #  include <direct.h>
7256 /* #  include "test_windirent.h" */
7257 #  define dirent DIRENT
7258 #  ifndef chmod
7259 #    define chmod _chmod
7260 #  endif
7261 #  ifndef stat
7262 #    define stat _stat
7263 #  endif
7264 #  define mkdir(path,mode) _mkdir(path)
7265 #  define lstat(path,buf) stat(path,buf)
7266 #endif
7267 #include <time.h>
7268 #include <errno.h>
7269 
7270 
7271 /*
7272 ** Structure of the fsdir() table-valued function
7273 */
7274                  /*    0    1    2     3    4           5             */
7275 #define FSDIR_SCHEMA "(name,mode,mtime,data,path HIDDEN,dir HIDDEN)"
7276 #define FSDIR_COLUMN_NAME     0     /* Name of the file */
7277 #define FSDIR_COLUMN_MODE     1     /* Access mode */
7278 #define FSDIR_COLUMN_MTIME    2     /* Last modification time */
7279 #define FSDIR_COLUMN_DATA     3     /* File content */
7280 #define FSDIR_COLUMN_PATH     4     /* Path to top of search */
7281 #define FSDIR_COLUMN_DIR      5     /* Path is relative to this directory */
7282 
7283 
7284 /*
7285 ** Set the result stored by context ctx to a blob containing the
7286 ** contents of file zName.  Or, leave the result unchanged (NULL)
7287 ** if the file does not exist or is unreadable.
7288 **
7289 ** If the file exceeds the SQLite blob size limit, through an
7290 ** SQLITE_TOOBIG error.
7291 **
7292 ** Throw an SQLITE_IOERR if there are difficulties pulling the file
7293 ** off of disk.
7294 */
readFileContents(sqlite3_context * ctx,const char * zName)7295 static void readFileContents(sqlite3_context *ctx, const char *zName){
7296   FILE *in;
7297   sqlite3_int64 nIn;
7298   void *pBuf;
7299   sqlite3 *db;
7300   int mxBlob;
7301 
7302   in = fopen(zName, "rb");
7303   if( in==0 ){
7304     /* File does not exist or is unreadable. Leave the result set to NULL. */
7305     return;
7306   }
7307   fseek(in, 0, SEEK_END);
7308   nIn = ftell(in);
7309   rewind(in);
7310   db = sqlite3_context_db_handle(ctx);
7311   mxBlob = sqlite3_limit(db, SQLITE_LIMIT_LENGTH, -1);
7312   if( nIn>mxBlob ){
7313     sqlite3_result_error_code(ctx, SQLITE_TOOBIG);
7314     fclose(in);
7315     return;
7316   }
7317   pBuf = sqlite3_malloc64( nIn ? nIn : 1 );
7318   if( pBuf==0 ){
7319     sqlite3_result_error_nomem(ctx);
7320     fclose(in);
7321     return;
7322   }
7323   if( nIn==(sqlite3_int64)fread(pBuf, 1, (size_t)nIn, in) ){
7324     sqlite3_result_blob64(ctx, pBuf, nIn, sqlite3_free);
7325   }else{
7326     sqlite3_result_error_code(ctx, SQLITE_IOERR);
7327     sqlite3_free(pBuf);
7328   }
7329   fclose(in);
7330 }
7331 
7332 /*
7333 ** Implementation of the "readfile(X)" SQL function.  The entire content
7334 ** of the file named X is read and returned as a BLOB.  NULL is returned
7335 ** if the file does not exist or is unreadable.
7336 */
readfileFunc(sqlite3_context * context,int argc,sqlite3_value ** argv)7337 static void readfileFunc(
7338   sqlite3_context *context,
7339   int argc,
7340   sqlite3_value **argv
7341 ){
7342   const char *zName;
7343   (void)(argc);  /* Unused parameter */
7344   zName = (const char*)sqlite3_value_text(argv[0]);
7345   if( zName==0 ) return;
7346   readFileContents(context, zName);
7347 }
7348 
7349 /*
7350 ** Set the error message contained in context ctx to the results of
7351 ** vprintf(zFmt, ...).
7352 */
ctxErrorMsg(sqlite3_context * ctx,const char * zFmt,...)7353 static void ctxErrorMsg(sqlite3_context *ctx, const char *zFmt, ...){
7354   char *zMsg = 0;
7355   va_list ap;
7356   va_start(ap, zFmt);
7357   zMsg = sqlite3_vmprintf(zFmt, ap);
7358   sqlite3_result_error(ctx, zMsg, -1);
7359   sqlite3_free(zMsg);
7360   va_end(ap);
7361 }
7362 
7363 #if defined(_WIN32)
7364 /*
7365 ** This function is designed to convert a Win32 FILETIME structure into the
7366 ** number of seconds since the Unix Epoch (1970-01-01 00:00:00 UTC).
7367 */
fileTimeToUnixTime(LPFILETIME pFileTime)7368 static sqlite3_uint64 fileTimeToUnixTime(
7369   LPFILETIME pFileTime
7370 ){
7371   SYSTEMTIME epochSystemTime;
7372   ULARGE_INTEGER epochIntervals;
7373   FILETIME epochFileTime;
7374   ULARGE_INTEGER fileIntervals;
7375 
7376   memset(&epochSystemTime, 0, sizeof(SYSTEMTIME));
7377   epochSystemTime.wYear = 1970;
7378   epochSystemTime.wMonth = 1;
7379   epochSystemTime.wDay = 1;
7380   SystemTimeToFileTime(&epochSystemTime, &epochFileTime);
7381   epochIntervals.LowPart = epochFileTime.dwLowDateTime;
7382   epochIntervals.HighPart = epochFileTime.dwHighDateTime;
7383 
7384   fileIntervals.LowPart = pFileTime->dwLowDateTime;
7385   fileIntervals.HighPart = pFileTime->dwHighDateTime;
7386 
7387   return (fileIntervals.QuadPart - epochIntervals.QuadPart) / 10000000;
7388 }
7389 
7390 
7391 #if defined(FILEIO_WIN32_DLL) && (defined(_WIN32) || defined(WIN32))
7392 #  /* To allow a standalone DLL, use this next replacement function: */
7393 #  undef sqlite3_win32_utf8_to_unicode
7394 #  define sqlite3_win32_utf8_to_unicode utf8_to_utf16
7395 #
utf8_to_utf16(const char * z)7396 LPWSTR utf8_to_utf16(const char *z){
7397   int nAllot = MultiByteToWideChar(CP_UTF8, 0, z, -1, NULL, 0);
7398   LPWSTR rv = sqlite3_malloc(nAllot * sizeof(WCHAR));
7399   if( rv!=0 && 0 < MultiByteToWideChar(CP_UTF8, 0, z, -1, rv, nAllot) )
7400     return rv;
7401   sqlite3_free(rv);
7402   return 0;
7403 }
7404 #endif
7405 
7406 /*
7407 ** This function attempts to normalize the time values found in the stat()
7408 ** buffer to UTC.  This is necessary on Win32, where the runtime library
7409 ** appears to return these values as local times.
7410 */
statTimesToUtc(const char * zPath,struct stat * pStatBuf)7411 static void statTimesToUtc(
7412   const char *zPath,
7413   struct stat *pStatBuf
7414 ){
7415   HANDLE hFindFile;
7416   WIN32_FIND_DATAW fd;
7417   LPWSTR zUnicodeName;
7418   extern LPWSTR sqlite3_win32_utf8_to_unicode(const char*);
7419   zUnicodeName = sqlite3_win32_utf8_to_unicode(zPath);
7420   if( zUnicodeName ){
7421     memset(&fd, 0, sizeof(WIN32_FIND_DATAW));
7422     hFindFile = FindFirstFileW(zUnicodeName, &fd);
7423     if( hFindFile!=NULL ){
7424       pStatBuf->st_ctime = (time_t)fileTimeToUnixTime(&fd.ftCreationTime);
7425       pStatBuf->st_atime = (time_t)fileTimeToUnixTime(&fd.ftLastAccessTime);
7426       pStatBuf->st_mtime = (time_t)fileTimeToUnixTime(&fd.ftLastWriteTime);
7427       FindClose(hFindFile);
7428     }
7429     sqlite3_free(zUnicodeName);
7430   }
7431 }
7432 #endif
7433 
7434 /*
7435 ** This function is used in place of stat().  On Windows, special handling
7436 ** is required in order for the included time to be returned as UTC.  On all
7437 ** other systems, this function simply calls stat().
7438 */
fileStat(const char * zPath,struct stat * pStatBuf)7439 static int fileStat(
7440   const char *zPath,
7441   struct stat *pStatBuf
7442 ){
7443 #if defined(_WIN32)
7444   int rc = stat(zPath, pStatBuf);
7445   if( rc==0 ) statTimesToUtc(zPath, pStatBuf);
7446   return rc;
7447 #else
7448   return stat(zPath, pStatBuf);
7449 #endif
7450 }
7451 
7452 /*
7453 ** This function is used in place of lstat().  On Windows, special handling
7454 ** is required in order for the included time to be returned as UTC.  On all
7455 ** other systems, this function simply calls lstat().
7456 */
fileLinkStat(const char * zPath,struct stat * pStatBuf)7457 static int fileLinkStat(
7458   const char *zPath,
7459   struct stat *pStatBuf
7460 ){
7461 #if defined(_WIN32)
7462   int rc = lstat(zPath, pStatBuf);
7463   if( rc==0 ) statTimesToUtc(zPath, pStatBuf);
7464   return rc;
7465 #else
7466   return lstat(zPath, pStatBuf);
7467 #endif
7468 }
7469 
7470 /*
7471 ** Argument zFile is the name of a file that will be created and/or written
7472 ** by SQL function writefile(). This function ensures that the directory
7473 ** zFile will be written to exists, creating it if required. The permissions
7474 ** for any path components created by this function are set in accordance
7475 ** with the current umask.
7476 **
7477 ** If an OOM condition is encountered, SQLITE_NOMEM is returned. Otherwise,
7478 ** SQLITE_OK is returned if the directory is successfully created, or
7479 ** SQLITE_ERROR otherwise.
7480 */
makeDirectory(const char * zFile)7481 static int makeDirectory(
7482   const char *zFile
7483 ){
7484   char *zCopy = sqlite3_mprintf("%s", zFile);
7485   int rc = SQLITE_OK;
7486 
7487   if( zCopy==0 ){
7488     rc = SQLITE_NOMEM;
7489   }else{
7490     int nCopy = (int)strlen(zCopy);
7491     int i = 1;
7492 
7493     while( rc==SQLITE_OK ){
7494       struct stat sStat;
7495       int rc2;
7496 
7497       for(; zCopy[i]!='/' && i<nCopy; i++);
7498       if( i==nCopy ) break;
7499       zCopy[i] = '\0';
7500 
7501       rc2 = fileStat(zCopy, &sStat);
7502       if( rc2!=0 ){
7503         if( mkdir(zCopy, 0777) ) rc = SQLITE_ERROR;
7504       }else{
7505         if( !S_ISDIR(sStat.st_mode) ) rc = SQLITE_ERROR;
7506       }
7507       zCopy[i] = '/';
7508       i++;
7509     }
7510 
7511     sqlite3_free(zCopy);
7512   }
7513 
7514   return rc;
7515 }
7516 
7517 /*
7518 ** This function does the work for the writefile() UDF. Refer to
7519 ** header comments at the top of this file for details.
7520 */
writeFile(sqlite3_context * pCtx,const char * zFile,sqlite3_value * pData,mode_t mode,sqlite3_int64 mtime)7521 static int writeFile(
7522   sqlite3_context *pCtx,          /* Context to return bytes written in */
7523   const char *zFile,              /* File to write */
7524   sqlite3_value *pData,           /* Data to write */
7525   mode_t mode,                    /* MODE parameter passed to writefile() */
7526   sqlite3_int64 mtime             /* MTIME parameter (or -1 to not set time) */
7527 ){
7528   if( zFile==0 ) return 1;
7529 #if !defined(_WIN32) && !defined(WIN32)
7530   if( S_ISLNK(mode) ){
7531     const char *zTo = (const char*)sqlite3_value_text(pData);
7532     if( zTo==0 ) return 1;
7533     unlink(zFile);
7534     if( symlink(zTo, zFile)<0 ) return 1;
7535   }else
7536 #endif
7537   {
7538     if( S_ISDIR(mode) ){
7539       if( mkdir(zFile, mode) ){
7540         /* The mkdir() call to create the directory failed. This might not
7541         ** be an error though - if there is already a directory at the same
7542         ** path and either the permissions already match or can be changed
7543         ** to do so using chmod(), it is not an error.  */
7544         struct stat sStat;
7545         if( errno!=EEXIST
7546          || 0!=fileStat(zFile, &sStat)
7547          || !S_ISDIR(sStat.st_mode)
7548          || ((sStat.st_mode&0777)!=(mode&0777) && 0!=chmod(zFile, mode&0777))
7549         ){
7550           return 1;
7551         }
7552       }
7553     }else{
7554       sqlite3_int64 nWrite = 0;
7555       const char *z;
7556       int rc = 0;
7557       FILE *out = fopen(zFile, "wb");
7558       if( out==0 ) return 1;
7559       z = (const char*)sqlite3_value_blob(pData);
7560       if( z ){
7561         sqlite3_int64 n = fwrite(z, 1, sqlite3_value_bytes(pData), out);
7562         nWrite = sqlite3_value_bytes(pData);
7563         if( nWrite!=n ){
7564           rc = 1;
7565         }
7566       }
7567       fclose(out);
7568       if( rc==0 && mode && chmod(zFile, mode & 0777) ){
7569         rc = 1;
7570       }
7571       if( rc ) return 2;
7572       sqlite3_result_int64(pCtx, nWrite);
7573     }
7574   }
7575 
7576   if( mtime>=0 ){
7577 #if defined(_WIN32)
7578 #if !SQLITE_OS_WINRT
7579     /* Windows */
7580     FILETIME lastAccess;
7581     FILETIME lastWrite;
7582     SYSTEMTIME currentTime;
7583     LONGLONG intervals;
7584     HANDLE hFile;
7585     LPWSTR zUnicodeName;
7586     extern LPWSTR sqlite3_win32_utf8_to_unicode(const char*);
7587 
7588     GetSystemTime(&currentTime);
7589     SystemTimeToFileTime(&currentTime, &lastAccess);
7590     intervals = Int32x32To64(mtime, 10000000) + 116444736000000000;
7591     lastWrite.dwLowDateTime = (DWORD)intervals;
7592     lastWrite.dwHighDateTime = intervals >> 32;
7593     zUnicodeName = sqlite3_win32_utf8_to_unicode(zFile);
7594     if( zUnicodeName==0 ){
7595       return 1;
7596     }
7597     hFile = CreateFileW(
7598       zUnicodeName, FILE_WRITE_ATTRIBUTES, 0, NULL, OPEN_EXISTING,
7599       FILE_FLAG_BACKUP_SEMANTICS, NULL
7600     );
7601     sqlite3_free(zUnicodeName);
7602     if( hFile!=INVALID_HANDLE_VALUE ){
7603       BOOL bResult = SetFileTime(hFile, NULL, &lastAccess, &lastWrite);
7604       CloseHandle(hFile);
7605       return !bResult;
7606     }else{
7607       return 1;
7608     }
7609 #endif
7610 #elif defined(AT_FDCWD) && 0 /* utimensat() is not universally available */
7611     /* Recent unix */
7612     struct timespec times[2];
7613     times[0].tv_nsec = times[1].tv_nsec = 0;
7614     times[0].tv_sec = time(0);
7615     times[1].tv_sec = mtime;
7616     if( utimensat(AT_FDCWD, zFile, times, AT_SYMLINK_NOFOLLOW) ){
7617       return 1;
7618     }
7619 #else
7620     /* Legacy unix.
7621     **
7622     ** Do not use utimes() on a symbolic link - it sees through the link and
7623     ** modifies the timestamps on the target. Or fails if the target does
7624     ** not exist.  */
7625     if( 0==S_ISLNK(mode) ){
7626       struct timeval times[2];
7627       times[0].tv_usec = times[1].tv_usec = 0;
7628       times[0].tv_sec = time(0);
7629       times[1].tv_sec = mtime;
7630       if( utimes(zFile, times) ){
7631         return 1;
7632       }
7633     }
7634 #endif
7635   }
7636 
7637   return 0;
7638 }
7639 
7640 /*
7641 ** Implementation of the "writefile(W,X[,Y[,Z]]])" SQL function.
7642 ** Refer to header comments at the top of this file for details.
7643 */
writefileFunc(sqlite3_context * context,int argc,sqlite3_value ** argv)7644 static void writefileFunc(
7645   sqlite3_context *context,
7646   int argc,
7647   sqlite3_value **argv
7648 ){
7649   const char *zFile;
7650   mode_t mode = 0;
7651   int res;
7652   sqlite3_int64 mtime = -1;
7653 
7654   if( argc<2 || argc>4 ){
7655     sqlite3_result_error(context,
7656         "wrong number of arguments to function writefile()", -1
7657     );
7658     return;
7659   }
7660 
7661   zFile = (const char*)sqlite3_value_text(argv[0]);
7662   if( zFile==0 ) return;
7663   if( argc>=3 ){
7664     mode = (mode_t)sqlite3_value_int(argv[2]);
7665   }
7666   if( argc==4 ){
7667     mtime = sqlite3_value_int64(argv[3]);
7668   }
7669 
7670   res = writeFile(context, zFile, argv[1], mode, mtime);
7671   if( res==1 && errno==ENOENT ){
7672     if( makeDirectory(zFile)==SQLITE_OK ){
7673       res = writeFile(context, zFile, argv[1], mode, mtime);
7674     }
7675   }
7676 
7677   if( argc>2 && res!=0 ){
7678     if( S_ISLNK(mode) ){
7679       ctxErrorMsg(context, "failed to create symlink: %s", zFile);
7680     }else if( S_ISDIR(mode) ){
7681       ctxErrorMsg(context, "failed to create directory: %s", zFile);
7682     }else{
7683       ctxErrorMsg(context, "failed to write file: %s", zFile);
7684     }
7685   }
7686 }
7687 
7688 /*
7689 ** SQL function:   lsmode(MODE)
7690 **
7691 ** Given a numberic st_mode from stat(), convert it into a human-readable
7692 ** text string in the style of "ls -l".
7693 */
lsModeFunc(sqlite3_context * context,int argc,sqlite3_value ** argv)7694 static void lsModeFunc(
7695   sqlite3_context *context,
7696   int argc,
7697   sqlite3_value **argv
7698 ){
7699   int i;
7700   int iMode = sqlite3_value_int(argv[0]);
7701   char z[16];
7702   (void)argc;
7703   if( S_ISLNK(iMode) ){
7704     z[0] = 'l';
7705   }else if( S_ISREG(iMode) ){
7706     z[0] = '-';
7707   }else if( S_ISDIR(iMode) ){
7708     z[0] = 'd';
7709   }else{
7710     z[0] = '?';
7711   }
7712   for(i=0; i<3; i++){
7713     int m = (iMode >> ((2-i)*3));
7714     char *a = &z[1 + i*3];
7715     a[0] = (m & 0x4) ? 'r' : '-';
7716     a[1] = (m & 0x2) ? 'w' : '-';
7717     a[2] = (m & 0x1) ? 'x' : '-';
7718   }
7719   z[10] = '\0';
7720   sqlite3_result_text(context, z, -1, SQLITE_TRANSIENT);
7721 }
7722 
7723 #ifndef SQLITE_OMIT_VIRTUALTABLE
7724 
7725 /*
7726 ** Cursor type for recursively iterating through a directory structure.
7727 */
7728 typedef struct fsdir_cursor fsdir_cursor;
7729 typedef struct FsdirLevel FsdirLevel;
7730 
7731 struct FsdirLevel {
7732   DIR *pDir;                 /* From opendir() */
7733   char *zDir;                /* Name of directory (nul-terminated) */
7734 };
7735 
7736 struct fsdir_cursor {
7737   sqlite3_vtab_cursor base;  /* Base class - must be first */
7738 
7739   int nLvl;                  /* Number of entries in aLvl[] array */
7740   int iLvl;                  /* Index of current entry */
7741   FsdirLevel *aLvl;          /* Hierarchy of directories being traversed */
7742 
7743   const char *zBase;
7744   int nBase;
7745 
7746   struct stat sStat;         /* Current lstat() results */
7747   char *zPath;               /* Path to current entry */
7748   sqlite3_int64 iRowid;      /* Current rowid */
7749 };
7750 
7751 typedef struct fsdir_tab fsdir_tab;
7752 struct fsdir_tab {
7753   sqlite3_vtab base;         /* Base class - must be first */
7754 };
7755 
7756 /*
7757 ** Construct a new fsdir virtual table object.
7758 */
fsdirConnect(sqlite3 * db,void * pAux,int argc,const char * const * argv,sqlite3_vtab ** ppVtab,char ** pzErr)7759 static int fsdirConnect(
7760   sqlite3 *db,
7761   void *pAux,
7762   int argc, const char *const*argv,
7763   sqlite3_vtab **ppVtab,
7764   char **pzErr
7765 ){
7766   fsdir_tab *pNew = 0;
7767   int rc;
7768   (void)pAux;
7769   (void)argc;
7770   (void)argv;
7771   (void)pzErr;
7772   rc = sqlite3_declare_vtab(db, "CREATE TABLE x" FSDIR_SCHEMA);
7773   if( rc==SQLITE_OK ){
7774     pNew = (fsdir_tab*)sqlite3_malloc( sizeof(*pNew) );
7775     if( pNew==0 ) return SQLITE_NOMEM;
7776     memset(pNew, 0, sizeof(*pNew));
7777     sqlite3_vtab_config(db, SQLITE_VTAB_DIRECTONLY);
7778   }
7779   *ppVtab = (sqlite3_vtab*)pNew;
7780   return rc;
7781 }
7782 
7783 /*
7784 ** This method is the destructor for fsdir vtab objects.
7785 */
fsdirDisconnect(sqlite3_vtab * pVtab)7786 static int fsdirDisconnect(sqlite3_vtab *pVtab){
7787   sqlite3_free(pVtab);
7788   return SQLITE_OK;
7789 }
7790 
7791 /*
7792 ** Constructor for a new fsdir_cursor object.
7793 */
fsdirOpen(sqlite3_vtab * p,sqlite3_vtab_cursor ** ppCursor)7794 static int fsdirOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){
7795   fsdir_cursor *pCur;
7796   (void)p;
7797   pCur = sqlite3_malloc( sizeof(*pCur) );
7798   if( pCur==0 ) return SQLITE_NOMEM;
7799   memset(pCur, 0, sizeof(*pCur));
7800   pCur->iLvl = -1;
7801   *ppCursor = &pCur->base;
7802   return SQLITE_OK;
7803 }
7804 
7805 /*
7806 ** Reset a cursor back to the state it was in when first returned
7807 ** by fsdirOpen().
7808 */
fsdirResetCursor(fsdir_cursor * pCur)7809 static void fsdirResetCursor(fsdir_cursor *pCur){
7810   int i;
7811   for(i=0; i<=pCur->iLvl; i++){
7812     FsdirLevel *pLvl = &pCur->aLvl[i];
7813     if( pLvl->pDir ) closedir(pLvl->pDir);
7814     sqlite3_free(pLvl->zDir);
7815   }
7816   sqlite3_free(pCur->zPath);
7817   sqlite3_free(pCur->aLvl);
7818   pCur->aLvl = 0;
7819   pCur->zPath = 0;
7820   pCur->zBase = 0;
7821   pCur->nBase = 0;
7822   pCur->nLvl = 0;
7823   pCur->iLvl = -1;
7824   pCur->iRowid = 1;
7825 }
7826 
7827 /*
7828 ** Destructor for an fsdir_cursor.
7829 */
fsdirClose(sqlite3_vtab_cursor * cur)7830 static int fsdirClose(sqlite3_vtab_cursor *cur){
7831   fsdir_cursor *pCur = (fsdir_cursor*)cur;
7832 
7833   fsdirResetCursor(pCur);
7834   sqlite3_free(pCur);
7835   return SQLITE_OK;
7836 }
7837 
7838 /*
7839 ** Set the error message for the virtual table associated with cursor
7840 ** pCur to the results of vprintf(zFmt, ...).
7841 */
fsdirSetErrmsg(fsdir_cursor * pCur,const char * zFmt,...)7842 static void fsdirSetErrmsg(fsdir_cursor *pCur, const char *zFmt, ...){
7843   va_list ap;
7844   va_start(ap, zFmt);
7845   pCur->base.pVtab->zErrMsg = sqlite3_vmprintf(zFmt, ap);
7846   va_end(ap);
7847 }
7848 
7849 
7850 /*
7851 ** Advance an fsdir_cursor to its next row of output.
7852 */
fsdirNext(sqlite3_vtab_cursor * cur)7853 static int fsdirNext(sqlite3_vtab_cursor *cur){
7854   fsdir_cursor *pCur = (fsdir_cursor*)cur;
7855   mode_t m = pCur->sStat.st_mode;
7856 
7857   pCur->iRowid++;
7858   if( S_ISDIR(m) ){
7859     /* Descend into this directory */
7860     int iNew = pCur->iLvl + 1;
7861     FsdirLevel *pLvl;
7862     if( iNew>=pCur->nLvl ){
7863       int nNew = iNew+1;
7864       sqlite3_int64 nByte = nNew*sizeof(FsdirLevel);
7865       FsdirLevel *aNew = (FsdirLevel*)sqlite3_realloc64(pCur->aLvl, nByte);
7866       if( aNew==0 ) return SQLITE_NOMEM;
7867       memset(&aNew[pCur->nLvl], 0, sizeof(FsdirLevel)*(nNew-pCur->nLvl));
7868       pCur->aLvl = aNew;
7869       pCur->nLvl = nNew;
7870     }
7871     pCur->iLvl = iNew;
7872     pLvl = &pCur->aLvl[iNew];
7873 
7874     pLvl->zDir = pCur->zPath;
7875     pCur->zPath = 0;
7876     pLvl->pDir = opendir(pLvl->zDir);
7877     if( pLvl->pDir==0 ){
7878       fsdirSetErrmsg(pCur, "cannot read directory: %s", pCur->zPath);
7879       return SQLITE_ERROR;
7880     }
7881   }
7882 
7883   while( pCur->iLvl>=0 ){
7884     FsdirLevel *pLvl = &pCur->aLvl[pCur->iLvl];
7885     struct dirent *pEntry = readdir(pLvl->pDir);
7886     if( pEntry ){
7887       if( pEntry->d_name[0]=='.' ){
7888        if( pEntry->d_name[1]=='.' && pEntry->d_name[2]=='\0' ) continue;
7889        if( pEntry->d_name[1]=='\0' ) continue;
7890       }
7891       sqlite3_free(pCur->zPath);
7892       pCur->zPath = sqlite3_mprintf("%s/%s", pLvl->zDir, pEntry->d_name);
7893       if( pCur->zPath==0 ) return SQLITE_NOMEM;
7894       if( fileLinkStat(pCur->zPath, &pCur->sStat) ){
7895         fsdirSetErrmsg(pCur, "cannot stat file: %s", pCur->zPath);
7896         return SQLITE_ERROR;
7897       }
7898       return SQLITE_OK;
7899     }
7900     closedir(pLvl->pDir);
7901     sqlite3_free(pLvl->zDir);
7902     pLvl->pDir = 0;
7903     pLvl->zDir = 0;
7904     pCur->iLvl--;
7905   }
7906 
7907   /* EOF */
7908   sqlite3_free(pCur->zPath);
7909   pCur->zPath = 0;
7910   return SQLITE_OK;
7911 }
7912 
7913 /*
7914 ** Return values of columns for the row at which the series_cursor
7915 ** is currently pointing.
7916 */
fsdirColumn(sqlite3_vtab_cursor * cur,sqlite3_context * ctx,int i)7917 static int fsdirColumn(
7918   sqlite3_vtab_cursor *cur,   /* The cursor */
7919   sqlite3_context *ctx,       /* First argument to sqlite3_result_...() */
7920   int i                       /* Which column to return */
7921 ){
7922   fsdir_cursor *pCur = (fsdir_cursor*)cur;
7923   switch( i ){
7924     case FSDIR_COLUMN_NAME: {
7925       sqlite3_result_text(ctx, &pCur->zPath[pCur->nBase], -1, SQLITE_TRANSIENT);
7926       break;
7927     }
7928 
7929     case FSDIR_COLUMN_MODE:
7930       sqlite3_result_int64(ctx, pCur->sStat.st_mode);
7931       break;
7932 
7933     case FSDIR_COLUMN_MTIME:
7934       sqlite3_result_int64(ctx, pCur->sStat.st_mtime);
7935       break;
7936 
7937     case FSDIR_COLUMN_DATA: {
7938       mode_t m = pCur->sStat.st_mode;
7939       if( S_ISDIR(m) ){
7940         sqlite3_result_null(ctx);
7941 #if !defined(_WIN32) && !defined(WIN32)
7942       }else if( S_ISLNK(m) ){
7943         char aStatic[64];
7944         char *aBuf = aStatic;
7945         sqlite3_int64 nBuf = 64;
7946         int n;
7947 
7948         while( 1 ){
7949           n = readlink(pCur->zPath, aBuf, nBuf);
7950           if( n<nBuf ) break;
7951           if( aBuf!=aStatic ) sqlite3_free(aBuf);
7952           nBuf = nBuf*2;
7953           aBuf = sqlite3_malloc64(nBuf);
7954           if( aBuf==0 ){
7955             sqlite3_result_error_nomem(ctx);
7956             return SQLITE_NOMEM;
7957           }
7958         }
7959 
7960         sqlite3_result_text(ctx, aBuf, n, SQLITE_TRANSIENT);
7961         if( aBuf!=aStatic ) sqlite3_free(aBuf);
7962 #endif
7963       }else{
7964         readFileContents(ctx, pCur->zPath);
7965       }
7966     }
7967     case FSDIR_COLUMN_PATH:
7968     default: {
7969       /* The FSDIR_COLUMN_PATH and FSDIR_COLUMN_DIR are input parameters.
7970       ** always return their values as NULL */
7971       break;
7972     }
7973   }
7974   return SQLITE_OK;
7975 }
7976 
7977 /*
7978 ** Return the rowid for the current row. In this implementation, the
7979 ** first row returned is assigned rowid value 1, and each subsequent
7980 ** row a value 1 more than that of the previous.
7981 */
fsdirRowid(sqlite3_vtab_cursor * cur,sqlite_int64 * pRowid)7982 static int fsdirRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
7983   fsdir_cursor *pCur = (fsdir_cursor*)cur;
7984   *pRowid = pCur->iRowid;
7985   return SQLITE_OK;
7986 }
7987 
7988 /*
7989 ** Return TRUE if the cursor has been moved off of the last
7990 ** row of output.
7991 */
fsdirEof(sqlite3_vtab_cursor * cur)7992 static int fsdirEof(sqlite3_vtab_cursor *cur){
7993   fsdir_cursor *pCur = (fsdir_cursor*)cur;
7994   return (pCur->zPath==0);
7995 }
7996 
7997 /*
7998 ** xFilter callback.
7999 **
8000 ** idxNum==1   PATH parameter only
8001 ** idxNum==2   Both PATH and DIR supplied
8002 */
fsdirFilter(sqlite3_vtab_cursor * cur,int idxNum,const char * idxStr,int argc,sqlite3_value ** argv)8003 static int fsdirFilter(
8004   sqlite3_vtab_cursor *cur,
8005   int idxNum, const char *idxStr,
8006   int argc, sqlite3_value **argv
8007 ){
8008   const char *zDir = 0;
8009   fsdir_cursor *pCur = (fsdir_cursor*)cur;
8010   (void)idxStr;
8011   fsdirResetCursor(pCur);
8012 
8013   if( idxNum==0 ){
8014     fsdirSetErrmsg(pCur, "table function fsdir requires an argument");
8015     return SQLITE_ERROR;
8016   }
8017 
8018   assert( argc==idxNum && (argc==1 || argc==2) );
8019   zDir = (const char*)sqlite3_value_text(argv[0]);
8020   if( zDir==0 ){
8021     fsdirSetErrmsg(pCur, "table function fsdir requires a non-NULL argument");
8022     return SQLITE_ERROR;
8023   }
8024   if( argc==2 ){
8025     pCur->zBase = (const char*)sqlite3_value_text(argv[1]);
8026   }
8027   if( pCur->zBase ){
8028     pCur->nBase = (int)strlen(pCur->zBase)+1;
8029     pCur->zPath = sqlite3_mprintf("%s/%s", pCur->zBase, zDir);
8030   }else{
8031     pCur->zPath = sqlite3_mprintf("%s", zDir);
8032   }
8033 
8034   if( pCur->zPath==0 ){
8035     return SQLITE_NOMEM;
8036   }
8037   if( fileLinkStat(pCur->zPath, &pCur->sStat) ){
8038     fsdirSetErrmsg(pCur, "cannot stat file: %s", pCur->zPath);
8039     return SQLITE_ERROR;
8040   }
8041 
8042   return SQLITE_OK;
8043 }
8044 
8045 /*
8046 ** SQLite will invoke this method one or more times while planning a query
8047 ** that uses the generate_series virtual table.  This routine needs to create
8048 ** a query plan for each invocation and compute an estimated cost for that
8049 ** plan.
8050 **
8051 ** In this implementation idxNum is used to represent the
8052 ** query plan.  idxStr is unused.
8053 **
8054 ** The query plan is represented by values of idxNum:
8055 **
8056 **  (1)  The path value is supplied by argv[0]
8057 **  (2)  Path is in argv[0] and dir is in argv[1]
8058 */
fsdirBestIndex(sqlite3_vtab * tab,sqlite3_index_info * pIdxInfo)8059 static int fsdirBestIndex(
8060   sqlite3_vtab *tab,
8061   sqlite3_index_info *pIdxInfo
8062 ){
8063   int i;                 /* Loop over constraints */
8064   int idxPath = -1;      /* Index in pIdxInfo->aConstraint of PATH= */
8065   int idxDir = -1;       /* Index in pIdxInfo->aConstraint of DIR= */
8066   int seenPath = 0;      /* True if an unusable PATH= constraint is seen */
8067   int seenDir = 0;       /* True if an unusable DIR= constraint is seen */
8068   const struct sqlite3_index_constraint *pConstraint;
8069 
8070   (void)tab;
8071   pConstraint = pIdxInfo->aConstraint;
8072   for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){
8073     if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue;
8074     switch( pConstraint->iColumn ){
8075       case FSDIR_COLUMN_PATH: {
8076         if( pConstraint->usable ){
8077           idxPath = i;
8078           seenPath = 0;
8079         }else if( idxPath<0 ){
8080           seenPath = 1;
8081         }
8082         break;
8083       }
8084       case FSDIR_COLUMN_DIR: {
8085         if( pConstraint->usable ){
8086           idxDir = i;
8087           seenDir = 0;
8088         }else if( idxDir<0 ){
8089           seenDir = 1;
8090         }
8091         break;
8092       }
8093     }
8094   }
8095   if( seenPath || seenDir ){
8096     /* If input parameters are unusable, disallow this plan */
8097     return SQLITE_CONSTRAINT;
8098   }
8099 
8100   if( idxPath<0 ){
8101     pIdxInfo->idxNum = 0;
8102     /* The pIdxInfo->estimatedCost should have been initialized to a huge
8103     ** number.  Leave it unchanged. */
8104     pIdxInfo->estimatedRows = 0x7fffffff;
8105   }else{
8106     pIdxInfo->aConstraintUsage[idxPath].omit = 1;
8107     pIdxInfo->aConstraintUsage[idxPath].argvIndex = 1;
8108     if( idxDir>=0 ){
8109       pIdxInfo->aConstraintUsage[idxDir].omit = 1;
8110       pIdxInfo->aConstraintUsage[idxDir].argvIndex = 2;
8111       pIdxInfo->idxNum = 2;
8112       pIdxInfo->estimatedCost = 10.0;
8113     }else{
8114       pIdxInfo->idxNum = 1;
8115       pIdxInfo->estimatedCost = 100.0;
8116     }
8117   }
8118 
8119   return SQLITE_OK;
8120 }
8121 
8122 /*
8123 ** Register the "fsdir" virtual table.
8124 */
fsdirRegister(sqlite3 * db)8125 static int fsdirRegister(sqlite3 *db){
8126   static sqlite3_module fsdirModule = {
8127     0,                         /* iVersion */
8128     0,                         /* xCreate */
8129     fsdirConnect,              /* xConnect */
8130     fsdirBestIndex,            /* xBestIndex */
8131     fsdirDisconnect,           /* xDisconnect */
8132     0,                         /* xDestroy */
8133     fsdirOpen,                 /* xOpen - open a cursor */
8134     fsdirClose,                /* xClose - close a cursor */
8135     fsdirFilter,               /* xFilter - configure scan constraints */
8136     fsdirNext,                 /* xNext - advance a cursor */
8137     fsdirEof,                  /* xEof - check for end of scan */
8138     fsdirColumn,               /* xColumn - read data */
8139     fsdirRowid,                /* xRowid - read data */
8140     0,                         /* xUpdate */
8141     0,                         /* xBegin */
8142     0,                         /* xSync */
8143     0,                         /* xCommit */
8144     0,                         /* xRollback */
8145     0,                         /* xFindMethod */
8146     0,                         /* xRename */
8147     0,                         /* xSavepoint */
8148     0,                         /* xRelease */
8149     0,                         /* xRollbackTo */
8150     0,                         /* xShadowName */
8151     0                          /* xIntegrity */
8152   };
8153 
8154   int rc = sqlite3_create_module(db, "fsdir", &fsdirModule, 0);
8155   return rc;
8156 }
8157 #else         /* SQLITE_OMIT_VIRTUALTABLE */
8158 # define fsdirRegister(x) SQLITE_OK
8159 #endif
8160 
8161 #ifdef _WIN32
8162 
8163 #endif
sqlite3_fileio_init(sqlite3 * db,char ** pzErrMsg,const sqlite3_api_routines * pApi)8164 int sqlite3_fileio_init(
8165   sqlite3 *db,
8166   char **pzErrMsg,
8167   const sqlite3_api_routines *pApi
8168 ){
8169   int rc = SQLITE_OK;
8170   SQLITE_EXTENSION_INIT2(pApi);
8171   (void)pzErrMsg;  /* Unused parameter */
8172   rc = sqlite3_create_function(db, "readfile", 1,
8173                                SQLITE_UTF8|SQLITE_DIRECTONLY, 0,
8174                                readfileFunc, 0, 0);
8175   if( rc==SQLITE_OK ){
8176     rc = sqlite3_create_function(db, "writefile", -1,
8177                                  SQLITE_UTF8|SQLITE_DIRECTONLY, 0,
8178                                  writefileFunc, 0, 0);
8179   }
8180   if( rc==SQLITE_OK ){
8181     rc = sqlite3_create_function(db, "lsmode", 1, SQLITE_UTF8, 0,
8182                                  lsModeFunc, 0, 0);
8183   }
8184   if( rc==SQLITE_OK ){
8185     rc = fsdirRegister(db);
8186   }
8187   return rc;
8188 }
8189 
8190 #if defined(FILEIO_WIN32_DLL) && (defined(_WIN32) || defined(WIN32))
8191 /* To allow a standalone DLL, make test_windirent.c use the same
8192  * redefined SQLite API calls as the above extension code does.
8193  * Just pull in this .c to accomplish this. As a beneficial side
8194  * effect, this extension becomes a single translation unit. */
8195 #  include "test_windirent.c"
8196 #endif
8197 
8198 /************************* End ../ext/misc/fileio.c ********************/
8199 /************************* Begin ../ext/misc/completion.c ******************/
8200 /*
8201 ** 2017-07-10
8202 **
8203 ** The author disclaims copyright to this source code.  In place of
8204 ** a legal notice, here is a blessing:
8205 **
8206 **    May you do good and not evil.
8207 **    May you find forgiveness for yourself and forgive others.
8208 **    May you share freely, never taking more than you give.
8209 **
8210 *************************************************************************
8211 **
8212 ** This file implements an eponymous virtual table that returns suggested
8213 ** completions for a partial SQL input.
8214 **
8215 ** Suggested usage:
8216 **
8217 **     SELECT DISTINCT candidate COLLATE nocase
8218 **       FROM completion($prefix,$wholeline)
8219 **      ORDER BY 1;
8220 **
8221 ** The two query parameters are optional.  $prefix is the text of the
8222 ** current word being typed and that is to be completed.  $wholeline is
8223 ** the complete input line, used for context.
8224 **
8225 ** The raw completion() table might return the same candidate multiple
8226 ** times, for example if the same column name is used to two or more
8227 ** tables.  And the candidates are returned in an arbitrary order.  Hence,
8228 ** the DISTINCT and ORDER BY are recommended.
8229 **
8230 ** This virtual table operates at the speed of human typing, and so there
8231 ** is no attempt to make it fast.  Even a slow implementation will be much
8232 ** faster than any human can type.
8233 **
8234 */
8235 /* #include "sqlite3ext.h" */
8236 SQLITE_EXTENSION_INIT1
8237 #include <assert.h>
8238 #include <string.h>
8239 #include <ctype.h>
8240 
8241 #ifndef SQLITE_OMIT_VIRTUALTABLE
8242 
8243 /* completion_vtab is a subclass of sqlite3_vtab which will
8244 ** serve as the underlying representation of a completion virtual table
8245 */
8246 typedef struct completion_vtab completion_vtab;
8247 struct completion_vtab {
8248   sqlite3_vtab base;  /* Base class - must be first */
8249   sqlite3 *db;        /* Database connection for this completion vtab */
8250 };
8251 
8252 /* completion_cursor is a subclass of sqlite3_vtab_cursor which will
8253 ** serve as the underlying representation of a cursor that scans
8254 ** over rows of the result
8255 */
8256 typedef struct completion_cursor completion_cursor;
8257 struct completion_cursor {
8258   sqlite3_vtab_cursor base;  /* Base class - must be first */
8259   sqlite3 *db;               /* Database connection for this cursor */
8260   int nPrefix, nLine;        /* Number of bytes in zPrefix and zLine */
8261   char *zPrefix;             /* The prefix for the word we want to complete */
8262   char *zLine;               /* The whole that we want to complete */
8263   const char *zCurrentRow;   /* Current output row */
8264   int szRow;                 /* Length of the zCurrentRow string */
8265   sqlite3_stmt *pStmt;       /* Current statement */
8266   sqlite3_int64 iRowid;      /* The rowid */
8267   int ePhase;                /* Current phase */
8268   int j;                     /* inter-phase counter */
8269 };
8270 
8271 /* Values for ePhase:
8272 */
8273 #define COMPLETION_FIRST_PHASE   1
8274 #define COMPLETION_KEYWORDS      1
8275 #define COMPLETION_PRAGMAS       2
8276 #define COMPLETION_FUNCTIONS     3
8277 #define COMPLETION_COLLATIONS    4
8278 #define COMPLETION_INDEXES       5
8279 #define COMPLETION_TRIGGERS      6
8280 #define COMPLETION_DATABASES     7
8281 #define COMPLETION_TABLES        8    /* Also VIEWs and TRIGGERs */
8282 #define COMPLETION_COLUMNS       9
8283 #define COMPLETION_MODULES       10
8284 #define COMPLETION_EOF           11
8285 
8286 /*
8287 ** The completionConnect() method is invoked to create a new
8288 ** completion_vtab that describes the completion virtual table.
8289 **
8290 ** Think of this routine as the constructor for completion_vtab objects.
8291 **
8292 ** All this routine needs to do is:
8293 **
8294 **    (1) Allocate the completion_vtab object and initialize all fields.
8295 **
8296 **    (2) Tell SQLite (via the sqlite3_declare_vtab() interface) what the
8297 **        result set of queries against completion will look like.
8298 */
completionConnect(sqlite3 * db,void * pAux,int argc,const char * const * argv,sqlite3_vtab ** ppVtab,char ** pzErr)8299 static int completionConnect(
8300   sqlite3 *db,
8301   void *pAux,
8302   int argc, const char *const*argv,
8303   sqlite3_vtab **ppVtab,
8304   char **pzErr
8305 ){
8306   completion_vtab *pNew;
8307   int rc;
8308 
8309   (void)(pAux);    /* Unused parameter */
8310   (void)(argc);    /* Unused parameter */
8311   (void)(argv);    /* Unused parameter */
8312   (void)(pzErr);   /* Unused parameter */
8313 
8314 /* Column numbers */
8315 #define COMPLETION_COLUMN_CANDIDATE 0  /* Suggested completion of the input */
8316 #define COMPLETION_COLUMN_PREFIX    1  /* Prefix of the word to be completed */
8317 #define COMPLETION_COLUMN_WHOLELINE 2  /* Entire line seen so far */
8318 #define COMPLETION_COLUMN_PHASE     3  /* ePhase - used for debugging only */
8319 
8320   sqlite3_vtab_config(db, SQLITE_VTAB_INNOCUOUS);
8321   rc = sqlite3_declare_vtab(db,
8322       "CREATE TABLE x("
8323       "  candidate TEXT,"
8324       "  prefix TEXT HIDDEN,"
8325       "  wholeline TEXT HIDDEN,"
8326       "  phase INT HIDDEN"        /* Used for debugging only */
8327       ")");
8328   if( rc==SQLITE_OK ){
8329     pNew = sqlite3_malloc( sizeof(*pNew) );
8330     *ppVtab = (sqlite3_vtab*)pNew;
8331     if( pNew==0 ) return SQLITE_NOMEM;
8332     memset(pNew, 0, sizeof(*pNew));
8333     pNew->db = db;
8334   }
8335   return rc;
8336 }
8337 
8338 /*
8339 ** This method is the destructor for completion_cursor objects.
8340 */
completionDisconnect(sqlite3_vtab * pVtab)8341 static int completionDisconnect(sqlite3_vtab *pVtab){
8342   sqlite3_free(pVtab);
8343   return SQLITE_OK;
8344 }
8345 
8346 /*
8347 ** Constructor for a new completion_cursor object.
8348 */
completionOpen(sqlite3_vtab * p,sqlite3_vtab_cursor ** ppCursor)8349 static int completionOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){
8350   completion_cursor *pCur;
8351   pCur = sqlite3_malloc( sizeof(*pCur) );
8352   if( pCur==0 ) return SQLITE_NOMEM;
8353   memset(pCur, 0, sizeof(*pCur));
8354   pCur->db = ((completion_vtab*)p)->db;
8355   *ppCursor = &pCur->base;
8356   return SQLITE_OK;
8357 }
8358 
8359 /*
8360 ** Reset the completion_cursor.
8361 */
completionCursorReset(completion_cursor * pCur)8362 static void completionCursorReset(completion_cursor *pCur){
8363   sqlite3_free(pCur->zPrefix);   pCur->zPrefix = 0;  pCur->nPrefix = 0;
8364   sqlite3_free(pCur->zLine);     pCur->zLine = 0;    pCur->nLine = 0;
8365   sqlite3_finalize(pCur->pStmt); pCur->pStmt = 0;
8366   pCur->j = 0;
8367 }
8368 
8369 /*
8370 ** Destructor for a completion_cursor.
8371 */
completionClose(sqlite3_vtab_cursor * cur)8372 static int completionClose(sqlite3_vtab_cursor *cur){
8373   completionCursorReset((completion_cursor*)cur);
8374   sqlite3_free(cur);
8375   return SQLITE_OK;
8376 }
8377 
8378 /*
8379 ** Advance a completion_cursor to its next row of output.
8380 **
8381 ** The ->ePhase, ->j, and ->pStmt fields of the completion_cursor object
8382 ** record the current state of the scan.  This routine sets ->zCurrentRow
8383 ** to the current row of output and then returns.  If no more rows remain,
8384 ** then ->ePhase is set to COMPLETION_EOF which will signal the virtual
8385 ** table that has reached the end of its scan.
8386 **
8387 ** The current implementation just lists potential identifiers and
8388 ** keywords and filters them by zPrefix.  Future enhancements should
8389 ** take zLine into account to try to restrict the set of identifiers and
8390 ** keywords based on what would be legal at the current point of input.
8391 */
completionNext(sqlite3_vtab_cursor * cur)8392 static int completionNext(sqlite3_vtab_cursor *cur){
8393   completion_cursor *pCur = (completion_cursor*)cur;
8394   int eNextPhase = 0;  /* Next phase to try if current phase reaches end */
8395   int iCol = -1;       /* If >=0, step pCur->pStmt and use the i-th column */
8396   pCur->iRowid++;
8397   while( pCur->ePhase!=COMPLETION_EOF ){
8398     switch( pCur->ePhase ){
8399       case COMPLETION_KEYWORDS: {
8400         if( pCur->j >= sqlite3_keyword_count() ){
8401           pCur->zCurrentRow = 0;
8402           pCur->ePhase = COMPLETION_DATABASES;
8403         }else{
8404           sqlite3_keyword_name(pCur->j++, &pCur->zCurrentRow, &pCur->szRow);
8405         }
8406         iCol = -1;
8407         break;
8408       }
8409       case COMPLETION_DATABASES: {
8410         if( pCur->pStmt==0 ){
8411           sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1,
8412                              &pCur->pStmt, 0);
8413         }
8414         iCol = 1;
8415         eNextPhase = COMPLETION_TABLES;
8416         break;
8417       }
8418       case COMPLETION_TABLES: {
8419         if( pCur->pStmt==0 ){
8420           sqlite3_stmt *pS2;
8421           char *zSql = 0;
8422           const char *zSep = "";
8423           sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1, &pS2, 0);
8424           while( sqlite3_step(pS2)==SQLITE_ROW ){
8425             const char *zDb = (const char*)sqlite3_column_text(pS2, 1);
8426             zSql = sqlite3_mprintf(
8427                "%z%s"
8428                "SELECT name FROM \"%w\".sqlite_schema",
8429                zSql, zSep, zDb
8430             );
8431             if( zSql==0 ) return SQLITE_NOMEM;
8432             zSep = " UNION ";
8433           }
8434           sqlite3_finalize(pS2);
8435           sqlite3_prepare_v2(pCur->db, zSql, -1, &pCur->pStmt, 0);
8436           sqlite3_free(zSql);
8437         }
8438         iCol = 0;
8439         eNextPhase = COMPLETION_COLUMNS;
8440         break;
8441       }
8442       case COMPLETION_COLUMNS: {
8443         if( pCur->pStmt==0 ){
8444           sqlite3_stmt *pS2;
8445           char *zSql = 0;
8446           const char *zSep = "";
8447           sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1, &pS2, 0);
8448           while( sqlite3_step(pS2)==SQLITE_ROW ){
8449             const char *zDb = (const char*)sqlite3_column_text(pS2, 1);
8450             zSql = sqlite3_mprintf(
8451                "%z%s"
8452                "SELECT pti.name FROM \"%w\".sqlite_schema AS sm"
8453                        " JOIN pragma_table_info(sm.name,%Q) AS pti"
8454                " WHERE sm.type='table'",
8455                zSql, zSep, zDb, zDb
8456             );
8457             if( zSql==0 ) return SQLITE_NOMEM;
8458             zSep = " UNION ";
8459           }
8460           sqlite3_finalize(pS2);
8461           sqlite3_prepare_v2(pCur->db, zSql, -1, &pCur->pStmt, 0);
8462           sqlite3_free(zSql);
8463         }
8464         iCol = 0;
8465         eNextPhase = COMPLETION_EOF;
8466         break;
8467       }
8468     }
8469     if( iCol<0 ){
8470       /* This case is when the phase presets zCurrentRow */
8471       if( pCur->zCurrentRow==0 ) continue;
8472     }else{
8473       if( sqlite3_step(pCur->pStmt)==SQLITE_ROW ){
8474         /* Extract the next row of content */
8475         pCur->zCurrentRow = (const char*)sqlite3_column_text(pCur->pStmt, iCol);
8476         pCur->szRow = sqlite3_column_bytes(pCur->pStmt, iCol);
8477       }else{
8478         /* When all rows are finished, advance to the next phase */
8479         sqlite3_finalize(pCur->pStmt);
8480         pCur->pStmt = 0;
8481         pCur->ePhase = eNextPhase;
8482         continue;
8483       }
8484     }
8485     if( pCur->nPrefix==0 ) break;
8486     if( pCur->nPrefix<=pCur->szRow
8487      && sqlite3_strnicmp(pCur->zPrefix, pCur->zCurrentRow, pCur->nPrefix)==0
8488     ){
8489       break;
8490     }
8491   }
8492 
8493   return SQLITE_OK;
8494 }
8495 
8496 /*
8497 ** Return values of columns for the row at which the completion_cursor
8498 ** is currently pointing.
8499 */
completionColumn(sqlite3_vtab_cursor * cur,sqlite3_context * ctx,int i)8500 static int completionColumn(
8501   sqlite3_vtab_cursor *cur,   /* The cursor */
8502   sqlite3_context *ctx,       /* First argument to sqlite3_result_...() */
8503   int i                       /* Which column to return */
8504 ){
8505   completion_cursor *pCur = (completion_cursor*)cur;
8506   switch( i ){
8507     case COMPLETION_COLUMN_CANDIDATE: {
8508       sqlite3_result_text(ctx, pCur->zCurrentRow, pCur->szRow,SQLITE_TRANSIENT);
8509       break;
8510     }
8511     case COMPLETION_COLUMN_PREFIX: {
8512       sqlite3_result_text(ctx, pCur->zPrefix, -1, SQLITE_TRANSIENT);
8513       break;
8514     }
8515     case COMPLETION_COLUMN_WHOLELINE: {
8516       sqlite3_result_text(ctx, pCur->zLine, -1, SQLITE_TRANSIENT);
8517       break;
8518     }
8519     case COMPLETION_COLUMN_PHASE: {
8520       sqlite3_result_int(ctx, pCur->ePhase);
8521       break;
8522     }
8523   }
8524   return SQLITE_OK;
8525 }
8526 
8527 /*
8528 ** Return the rowid for the current row.  In this implementation, the
8529 ** rowid is the same as the output value.
8530 */
completionRowid(sqlite3_vtab_cursor * cur,sqlite_int64 * pRowid)8531 static int completionRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
8532   completion_cursor *pCur = (completion_cursor*)cur;
8533   *pRowid = pCur->iRowid;
8534   return SQLITE_OK;
8535 }
8536 
8537 /*
8538 ** Return TRUE if the cursor has been moved off of the last
8539 ** row of output.
8540 */
completionEof(sqlite3_vtab_cursor * cur)8541 static int completionEof(sqlite3_vtab_cursor *cur){
8542   completion_cursor *pCur = (completion_cursor*)cur;
8543   return pCur->ePhase >= COMPLETION_EOF;
8544 }
8545 
8546 /*
8547 ** This method is called to "rewind" the completion_cursor object back
8548 ** to the first row of output.  This method is always called at least
8549 ** once prior to any call to completionColumn() or completionRowid() or
8550 ** completionEof().
8551 */
completionFilter(sqlite3_vtab_cursor * pVtabCursor,int idxNum,const char * idxStr,int argc,sqlite3_value ** argv)8552 static int completionFilter(
8553   sqlite3_vtab_cursor *pVtabCursor,
8554   int idxNum, const char *idxStr,
8555   int argc, sqlite3_value **argv
8556 ){
8557   completion_cursor *pCur = (completion_cursor *)pVtabCursor;
8558   int iArg = 0;
8559   (void)(idxStr);   /* Unused parameter */
8560   (void)(argc);     /* Unused parameter */
8561   completionCursorReset(pCur);
8562   if( idxNum & 1 ){
8563     pCur->nPrefix = sqlite3_value_bytes(argv[iArg]);
8564     if( pCur->nPrefix>0 ){
8565       pCur->zPrefix = sqlite3_mprintf("%s", sqlite3_value_text(argv[iArg]));
8566       if( pCur->zPrefix==0 ) return SQLITE_NOMEM;
8567     }
8568     iArg = 1;
8569   }
8570   if( idxNum & 2 ){
8571     pCur->nLine = sqlite3_value_bytes(argv[iArg]);
8572     if( pCur->nLine>0 ){
8573       pCur->zLine = sqlite3_mprintf("%s", sqlite3_value_text(argv[iArg]));
8574       if( pCur->zLine==0 ) return SQLITE_NOMEM;
8575     }
8576   }
8577   if( pCur->zLine!=0 && pCur->zPrefix==0 ){
8578     int i = pCur->nLine;
8579     while( i>0 && (isalnum(pCur->zLine[i-1]) || pCur->zLine[i-1]=='_') ){
8580       i--;
8581     }
8582     pCur->nPrefix = pCur->nLine - i;
8583     if( pCur->nPrefix>0 ){
8584       pCur->zPrefix = sqlite3_mprintf("%.*s", pCur->nPrefix, pCur->zLine + i);
8585       if( pCur->zPrefix==0 ) return SQLITE_NOMEM;
8586     }
8587   }
8588   pCur->iRowid = 0;
8589   pCur->ePhase = COMPLETION_FIRST_PHASE;
8590   return completionNext(pVtabCursor);
8591 }
8592 
8593 /*
8594 ** SQLite will invoke this method one or more times while planning a query
8595 ** that uses the completion virtual table.  This routine needs to create
8596 ** a query plan for each invocation and compute an estimated cost for that
8597 ** plan.
8598 **
8599 ** There are two hidden parameters that act as arguments to the table-valued
8600 ** function:  "prefix" and "wholeline".  Bit 0 of idxNum is set if "prefix"
8601 ** is available and bit 1 is set if "wholeline" is available.
8602 */
completionBestIndex(sqlite3_vtab * tab,sqlite3_index_info * pIdxInfo)8603 static int completionBestIndex(
8604   sqlite3_vtab *tab,
8605   sqlite3_index_info *pIdxInfo
8606 ){
8607   int i;                 /* Loop over constraints */
8608   int idxNum = 0;        /* The query plan bitmask */
8609   int prefixIdx = -1;    /* Index of the start= constraint, or -1 if none */
8610   int wholelineIdx = -1; /* Index of the stop= constraint, or -1 if none */
8611   int nArg = 0;          /* Number of arguments that completeFilter() expects */
8612   const struct sqlite3_index_constraint *pConstraint;
8613 
8614   (void)(tab);    /* Unused parameter */
8615   pConstraint = pIdxInfo->aConstraint;
8616   for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){
8617     if( pConstraint->usable==0 ) continue;
8618     if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue;
8619     switch( pConstraint->iColumn ){
8620       case COMPLETION_COLUMN_PREFIX:
8621         prefixIdx = i;
8622         idxNum |= 1;
8623         break;
8624       case COMPLETION_COLUMN_WHOLELINE:
8625         wholelineIdx = i;
8626         idxNum |= 2;
8627         break;
8628     }
8629   }
8630   if( prefixIdx>=0 ){
8631     pIdxInfo->aConstraintUsage[prefixIdx].argvIndex = ++nArg;
8632     pIdxInfo->aConstraintUsage[prefixIdx].omit = 1;
8633   }
8634   if( wholelineIdx>=0 ){
8635     pIdxInfo->aConstraintUsage[wholelineIdx].argvIndex = ++nArg;
8636     pIdxInfo->aConstraintUsage[wholelineIdx].omit = 1;
8637   }
8638   pIdxInfo->idxNum = idxNum;
8639   pIdxInfo->estimatedCost = (double)5000 - 1000*nArg;
8640   pIdxInfo->estimatedRows = 500 - 100*nArg;
8641   return SQLITE_OK;
8642 }
8643 
8644 /*
8645 ** This following structure defines all the methods for the
8646 ** completion virtual table.
8647 */
8648 static sqlite3_module completionModule = {
8649   0,                         /* iVersion */
8650   0,                         /* xCreate */
8651   completionConnect,         /* xConnect */
8652   completionBestIndex,       /* xBestIndex */
8653   completionDisconnect,      /* xDisconnect */
8654   0,                         /* xDestroy */
8655   completionOpen,            /* xOpen - open a cursor */
8656   completionClose,           /* xClose - close a cursor */
8657   completionFilter,          /* xFilter - configure scan constraints */
8658   completionNext,            /* xNext - advance a cursor */
8659   completionEof,             /* xEof - check for end of scan */
8660   completionColumn,          /* xColumn - read data */
8661   completionRowid,           /* xRowid - read data */
8662   0,                         /* xUpdate */
8663   0,                         /* xBegin */
8664   0,                         /* xSync */
8665   0,                         /* xCommit */
8666   0,                         /* xRollback */
8667   0,                         /* xFindMethod */
8668   0,                         /* xRename */
8669   0,                         /* xSavepoint */
8670   0,                         /* xRelease */
8671   0,                         /* xRollbackTo */
8672   0,                         /* xShadowName */
8673   0                          /* xIntegrity */
8674 };
8675 
8676 #endif /* SQLITE_OMIT_VIRTUALTABLE */
8677 
sqlite3CompletionVtabInit(sqlite3 * db)8678 int sqlite3CompletionVtabInit(sqlite3 *db){
8679   int rc = SQLITE_OK;
8680 #ifndef SQLITE_OMIT_VIRTUALTABLE
8681   rc = sqlite3_create_module(db, "completion", &completionModule, 0);
8682 #endif
8683   return rc;
8684 }
8685 
8686 #ifdef _WIN32
8687 
8688 #endif
sqlite3_completion_init(sqlite3 * db,char ** pzErrMsg,const sqlite3_api_routines * pApi)8689 int sqlite3_completion_init(
8690   sqlite3 *db,
8691   char **pzErrMsg,
8692   const sqlite3_api_routines *pApi
8693 ){
8694   int rc = SQLITE_OK;
8695   SQLITE_EXTENSION_INIT2(pApi);
8696   (void)(pzErrMsg);  /* Unused parameter */
8697 #ifndef SQLITE_OMIT_VIRTUALTABLE
8698   rc = sqlite3CompletionVtabInit(db);
8699 #endif
8700   return rc;
8701 }
8702 
8703 /************************* End ../ext/misc/completion.c ********************/
8704 /************************* Begin ../ext/misc/appendvfs.c ******************/
8705 /*
8706 ** 2017-10-20
8707 **
8708 ** The author disclaims copyright to this source code.  In place of
8709 ** a legal notice, here is a blessing:
8710 **
8711 **    May you do good and not evil.
8712 **    May you find forgiveness for yourself and forgive others.
8713 **    May you share freely, never taking more than you give.
8714 **
8715 ******************************************************************************
8716 **
8717 ** This file implements a VFS shim that allows an SQLite database to be
8718 ** appended onto the end of some other file, such as an executable.
8719 **
8720 ** A special record must appear at the end of the file that identifies the
8721 ** file as an appended database and provides the offset to the first page
8722 ** of the exposed content. (Or, it is the length of the content prefix.)
8723 ** For best performance page 1 should be located at a disk page boundary,
8724 ** though that is not required.
8725 **
8726 ** When opening a database using this VFS, the connection might treat
8727 ** the file as an ordinary SQLite database, or it might treat it as a
8728 ** database appended onto some other file.  The decision is made by
8729 ** applying the following rules in order:
8730 **
8731 **  (1)  An empty file is an ordinary database.
8732 **
8733 **  (2)  If the file ends with the appendvfs trailer string
8734 **       "Start-Of-SQLite3-NNNNNNNN" that file is an appended database.
8735 **
8736 **  (3)  If the file begins with the standard SQLite prefix string
8737 **       "SQLite format 3", that file is an ordinary database.
8738 **
8739 **  (4)  If none of the above apply and the SQLITE_OPEN_CREATE flag is
8740 **       set, then a new database is appended to the already existing file.
8741 **
8742 **  (5)  Otherwise, SQLITE_CANTOPEN is returned.
8743 **
8744 ** To avoid unnecessary complications with the PENDING_BYTE, the size of
8745 ** the file containing the database is limited to 1GiB. (1073741824 bytes)
8746 ** This VFS will not read or write past the 1GiB mark.  This restriction
8747 ** might be lifted in future versions.  For now, if you need a larger
8748 ** database, then keep it in a separate file.
8749 **
8750 ** If the file being opened is a plain database (not an appended one), then
8751 ** this shim is a pass-through into the default underlying VFS. (rule 3)
8752 **/
8753 /* #include "sqlite3ext.h" */
8754 SQLITE_EXTENSION_INIT1
8755 #include <string.h>
8756 #include <assert.h>
8757 
8758 /* The append mark at the end of the database is:
8759 **
8760 **     Start-Of-SQLite3-NNNNNNNN
8761 **     123456789 123456789 12345
8762 **
8763 ** The NNNNNNNN represents a 64-bit big-endian unsigned integer which is
8764 ** the offset to page 1, and also the length of the prefix content.
8765 */
8766 #define APND_MARK_PREFIX     "Start-Of-SQLite3-"
8767 #define APND_MARK_PREFIX_SZ  17
8768 #define APND_MARK_FOS_SZ      8
8769 #define APND_MARK_SIZE       (APND_MARK_PREFIX_SZ+APND_MARK_FOS_SZ)
8770 
8771 /*
8772 ** Maximum size of the combined prefix + database + append-mark.  This
8773 ** must be less than 0x40000000 to avoid locking issues on Windows.
8774 */
8775 #define APND_MAX_SIZE  (0x40000000)
8776 
8777 /*
8778 ** Try to align the database to an even multiple of APND_ROUNDUP bytes.
8779 */
8780 #ifndef APND_ROUNDUP
8781 #define APND_ROUNDUP 4096
8782 #endif
8783 #define APND_ALIGN_MASK         ((sqlite3_int64)(APND_ROUNDUP-1))
8784 #define APND_START_ROUNDUP(fsz) (((fsz)+APND_ALIGN_MASK) & ~APND_ALIGN_MASK)
8785 
8786 /*
8787 ** Forward declaration of objects used by this utility
8788 */
8789 typedef struct sqlite3_vfs ApndVfs;
8790 typedef struct ApndFile ApndFile;
8791 
8792 /* Access to a lower-level VFS that (might) implement dynamic loading,
8793 ** access to randomness, etc.
8794 */
8795 #define ORIGVFS(p)  ((sqlite3_vfs*)((p)->pAppData))
8796 #define ORIGFILE(p) ((sqlite3_file*)(((ApndFile*)(p))+1))
8797 
8798 /* An open appendvfs file
8799 **
8800 ** An instance of this structure describes the appended database file.
8801 ** A separate sqlite3_file object is always appended. The appended
8802 ** sqlite3_file object (which can be accessed using ORIGFILE()) describes
8803 ** the entire file, including the prefix, the database, and the
8804 ** append-mark.
8805 **
8806 ** The structure of an AppendVFS database is like this:
8807 **
8808 **   +-------------+---------+----------+-------------+
8809 **   | prefix-file | padding | database | append-mark |
8810 **   +-------------+---------+----------+-------------+
8811 **                           ^          ^
8812 **                           |          |
8813 **                         iPgOne      iMark
8814 **
8815 **
8816 ** "prefix file" -  file onto which the database has been appended.
8817 ** "padding"     -  zero or more bytes inserted so that "database"
8818 **                  starts on an APND_ROUNDUP boundary
8819 ** "database"    -  The SQLite database file
8820 ** "append-mark" -  The 25-byte "Start-Of-SQLite3-NNNNNNNN" that indicates
8821 **                  the offset from the start of prefix-file to the start
8822 **                  of "database".
8823 **
8824 ** The size of the database is iMark - iPgOne.
8825 **
8826 ** The NNNNNNNN in the "Start-Of-SQLite3-NNNNNNNN" suffix is the value
8827 ** of iPgOne stored as a big-ending 64-bit integer.
8828 **
8829 ** iMark will be the size of the underlying file minus 25 (APND_MARKSIZE).
8830 ** Or, iMark is -1 to indicate that it has not yet been written.
8831 */
8832 struct ApndFile {
8833   sqlite3_file base;        /* Subclass.  MUST BE FIRST! */
8834   sqlite3_int64 iPgOne;     /* Offset to the start of the database */
8835   sqlite3_int64 iMark;      /* Offset of the append mark.  -1 if unwritten */
8836   /* Always followed by another sqlite3_file that describes the whole file */
8837 };
8838 
8839 /*
8840 ** Methods for ApndFile
8841 */
8842 static int apndClose(sqlite3_file*);
8843 static int apndRead(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst);
8844 static int apndWrite(sqlite3_file*,const void*,int iAmt, sqlite3_int64 iOfst);
8845 static int apndTruncate(sqlite3_file*, sqlite3_int64 size);
8846 static int apndSync(sqlite3_file*, int flags);
8847 static int apndFileSize(sqlite3_file*, sqlite3_int64 *pSize);
8848 static int apndLock(sqlite3_file*, int);
8849 static int apndUnlock(sqlite3_file*, int);
8850 static int apndCheckReservedLock(sqlite3_file*, int *pResOut);
8851 static int apndFileControl(sqlite3_file*, int op, void *pArg);
8852 static int apndSectorSize(sqlite3_file*);
8853 static int apndDeviceCharacteristics(sqlite3_file*);
8854 static int apndShmMap(sqlite3_file*, int iPg, int pgsz, int, void volatile**);
8855 static int apndShmLock(sqlite3_file*, int offset, int n, int flags);
8856 static void apndShmBarrier(sqlite3_file*);
8857 static int apndShmUnmap(sqlite3_file*, int deleteFlag);
8858 static int apndFetch(sqlite3_file*, sqlite3_int64 iOfst, int iAmt, void **pp);
8859 static int apndUnfetch(sqlite3_file*, sqlite3_int64 iOfst, void *p);
8860 
8861 /*
8862 ** Methods for ApndVfs
8863 */
8864 static int apndOpen(sqlite3_vfs*, const char *, sqlite3_file*, int , int *);
8865 static int apndDelete(sqlite3_vfs*, const char *zName, int syncDir);
8866 static int apndAccess(sqlite3_vfs*, const char *zName, int flags, int *);
8867 static int apndFullPathname(sqlite3_vfs*, const char *zName, int, char *zOut);
8868 static void *apndDlOpen(sqlite3_vfs*, const char *zFilename);
8869 static void apndDlError(sqlite3_vfs*, int nByte, char *zErrMsg);
8870 static void (*apndDlSym(sqlite3_vfs *pVfs, void *p, const char*zSym))(void);
8871 static void apndDlClose(sqlite3_vfs*, void*);
8872 static int apndRandomness(sqlite3_vfs*, int nByte, char *zOut);
8873 static int apndSleep(sqlite3_vfs*, int microseconds);
8874 static int apndCurrentTime(sqlite3_vfs*, double*);
8875 static int apndGetLastError(sqlite3_vfs*, int, char *);
8876 static int apndCurrentTimeInt64(sqlite3_vfs*, sqlite3_int64*);
8877 static int apndSetSystemCall(sqlite3_vfs*, const char*,sqlite3_syscall_ptr);
8878 static sqlite3_syscall_ptr apndGetSystemCall(sqlite3_vfs*, const char *z);
8879 static const char *apndNextSystemCall(sqlite3_vfs*, const char *zName);
8880 
8881 static sqlite3_vfs apnd_vfs = {
8882   3,                            /* iVersion (set when registered) */
8883   0,                            /* szOsFile (set when registered) */
8884   1024,                         /* mxPathname */
8885   0,                            /* pNext */
8886   "apndvfs",                    /* zName */
8887   0,                            /* pAppData (set when registered) */
8888   apndOpen,                     /* xOpen */
8889   apndDelete,                   /* xDelete */
8890   apndAccess,                   /* xAccess */
8891   apndFullPathname,             /* xFullPathname */
8892   apndDlOpen,                   /* xDlOpen */
8893   apndDlError,                  /* xDlError */
8894   apndDlSym,                    /* xDlSym */
8895   apndDlClose,                  /* xDlClose */
8896   apndRandomness,               /* xRandomness */
8897   apndSleep,                    /* xSleep */
8898   apndCurrentTime,              /* xCurrentTime */
8899   apndGetLastError,             /* xGetLastError */
8900   apndCurrentTimeInt64,         /* xCurrentTimeInt64 */
8901   apndSetSystemCall,            /* xSetSystemCall */
8902   apndGetSystemCall,            /* xGetSystemCall */
8903   apndNextSystemCall            /* xNextSystemCall */
8904 };
8905 
8906 static const sqlite3_io_methods apnd_io_methods = {
8907   3,                              /* iVersion */
8908   apndClose,                      /* xClose */
8909   apndRead,                       /* xRead */
8910   apndWrite,                      /* xWrite */
8911   apndTruncate,                   /* xTruncate */
8912   apndSync,                       /* xSync */
8913   apndFileSize,                   /* xFileSize */
8914   apndLock,                       /* xLock */
8915   apndUnlock,                     /* xUnlock */
8916   apndCheckReservedLock,          /* xCheckReservedLock */
8917   apndFileControl,                /* xFileControl */
8918   apndSectorSize,                 /* xSectorSize */
8919   apndDeviceCharacteristics,      /* xDeviceCharacteristics */
8920   apndShmMap,                     /* xShmMap */
8921   apndShmLock,                    /* xShmLock */
8922   apndShmBarrier,                 /* xShmBarrier */
8923   apndShmUnmap,                   /* xShmUnmap */
8924   apndFetch,                      /* xFetch */
8925   apndUnfetch                     /* xUnfetch */
8926 };
8927 
8928 /*
8929 ** Close an apnd-file.
8930 */
apndClose(sqlite3_file * pFile)8931 static int apndClose(sqlite3_file *pFile){
8932   pFile = ORIGFILE(pFile);
8933   return pFile->pMethods->xClose(pFile);
8934 }
8935 
8936 /*
8937 ** Read data from an apnd-file.
8938 */
apndRead(sqlite3_file * pFile,void * zBuf,int iAmt,sqlite_int64 iOfst)8939 static int apndRead(
8940   sqlite3_file *pFile,
8941   void *zBuf,
8942   int iAmt,
8943   sqlite_int64 iOfst
8944 ){
8945   ApndFile *paf = (ApndFile *)pFile;
8946   pFile = ORIGFILE(pFile);
8947   return pFile->pMethods->xRead(pFile, zBuf, iAmt, paf->iPgOne+iOfst);
8948 }
8949 
8950 /*
8951 ** Add the append-mark onto what should become the end of the file.
8952 *  If and only if this succeeds, internal ApndFile.iMark is updated.
8953 *  Parameter iWriteEnd is the appendvfs-relative offset of the new mark.
8954 */
apndWriteMark(ApndFile * paf,sqlite3_file * pFile,sqlite_int64 iWriteEnd)8955 static int apndWriteMark(
8956   ApndFile *paf,
8957   sqlite3_file *pFile,
8958   sqlite_int64 iWriteEnd
8959 ){
8960   sqlite_int64 iPgOne = paf->iPgOne;
8961   unsigned char a[APND_MARK_SIZE];
8962   int i = APND_MARK_FOS_SZ;
8963   int rc;
8964   assert(pFile == ORIGFILE(paf));
8965   memcpy(a, APND_MARK_PREFIX, APND_MARK_PREFIX_SZ);
8966   while( --i >= 0 ){
8967     a[APND_MARK_PREFIX_SZ+i] = (unsigned char)(iPgOne & 0xff);
8968     iPgOne >>= 8;
8969   }
8970   iWriteEnd += paf->iPgOne;
8971   if( SQLITE_OK==(rc = pFile->pMethods->xWrite
8972                   (pFile, a, APND_MARK_SIZE, iWriteEnd)) ){
8973     paf->iMark = iWriteEnd;
8974   }
8975   return rc;
8976 }
8977 
8978 /*
8979 ** Write data to an apnd-file.
8980 */
apndWrite(sqlite3_file * pFile,const void * zBuf,int iAmt,sqlite_int64 iOfst)8981 static int apndWrite(
8982   sqlite3_file *pFile,
8983   const void *zBuf,
8984   int iAmt,
8985   sqlite_int64 iOfst
8986 ){
8987   ApndFile *paf = (ApndFile *)pFile;
8988   sqlite_int64 iWriteEnd = iOfst + iAmt;
8989   if( iWriteEnd>=APND_MAX_SIZE ) return SQLITE_FULL;
8990   pFile = ORIGFILE(pFile);
8991   /* If append-mark is absent or will be overwritten, write it. */
8992   if( paf->iMark < 0 || paf->iPgOne + iWriteEnd > paf->iMark ){
8993     int rc = apndWriteMark(paf, pFile, iWriteEnd);
8994     if( SQLITE_OK!=rc ) return rc;
8995   }
8996   return pFile->pMethods->xWrite(pFile, zBuf, iAmt, paf->iPgOne+iOfst);
8997 }
8998 
8999 /*
9000 ** Truncate an apnd-file.
9001 */
apndTruncate(sqlite3_file * pFile,sqlite_int64 size)9002 static int apndTruncate(sqlite3_file *pFile, sqlite_int64 size){
9003   ApndFile *paf = (ApndFile *)pFile;
9004   pFile = ORIGFILE(pFile);
9005   /* The append mark goes out first so truncate failure does not lose it. */
9006   if( SQLITE_OK!=apndWriteMark(paf, pFile, size) ) return SQLITE_IOERR;
9007   /* Truncate underlying file just past append mark */
9008   return pFile->pMethods->xTruncate(pFile, paf->iMark+APND_MARK_SIZE);
9009 }
9010 
9011 /*
9012 ** Sync an apnd-file.
9013 */
apndSync(sqlite3_file * pFile,int flags)9014 static int apndSync(sqlite3_file *pFile, int flags){
9015   pFile = ORIGFILE(pFile);
9016   return pFile->pMethods->xSync(pFile, flags);
9017 }
9018 
9019 /*
9020 ** Return the current file-size of an apnd-file.
9021 ** If the append mark is not yet there, the file-size is 0.
9022 */
apndFileSize(sqlite3_file * pFile,sqlite_int64 * pSize)9023 static int apndFileSize(sqlite3_file *pFile, sqlite_int64 *pSize){
9024   ApndFile *paf = (ApndFile *)pFile;
9025   *pSize = ( paf->iMark >= 0 )? (paf->iMark - paf->iPgOne) : 0;
9026   return SQLITE_OK;
9027 }
9028 
9029 /*
9030 ** Lock an apnd-file.
9031 */
apndLock(sqlite3_file * pFile,int eLock)9032 static int apndLock(sqlite3_file *pFile, int eLock){
9033   pFile = ORIGFILE(pFile);
9034   return pFile->pMethods->xLock(pFile, eLock);
9035 }
9036 
9037 /*
9038 ** Unlock an apnd-file.
9039 */
apndUnlock(sqlite3_file * pFile,int eLock)9040 static int apndUnlock(sqlite3_file *pFile, int eLock){
9041   pFile = ORIGFILE(pFile);
9042   return pFile->pMethods->xUnlock(pFile, eLock);
9043 }
9044 
9045 /*
9046 ** Check if another file-handle holds a RESERVED lock on an apnd-file.
9047 */
apndCheckReservedLock(sqlite3_file * pFile,int * pResOut)9048 static int apndCheckReservedLock(sqlite3_file *pFile, int *pResOut){
9049   pFile = ORIGFILE(pFile);
9050   return pFile->pMethods->xCheckReservedLock(pFile, pResOut);
9051 }
9052 
9053 /*
9054 ** File control method. For custom operations on an apnd-file.
9055 */
apndFileControl(sqlite3_file * pFile,int op,void * pArg)9056 static int apndFileControl(sqlite3_file *pFile, int op, void *pArg){
9057   ApndFile *paf = (ApndFile *)pFile;
9058   int rc;
9059   pFile = ORIGFILE(pFile);
9060   if( op==SQLITE_FCNTL_SIZE_HINT ) *(sqlite3_int64*)pArg += paf->iPgOne;
9061   rc = pFile->pMethods->xFileControl(pFile, op, pArg);
9062   if( rc==SQLITE_OK && op==SQLITE_FCNTL_VFSNAME ){
9063     *(char**)pArg = sqlite3_mprintf("apnd(%lld)/%z", paf->iPgOne,*(char**)pArg);
9064   }
9065   return rc;
9066 }
9067 
9068 /*
9069 ** Return the sector-size in bytes for an apnd-file.
9070 */
apndSectorSize(sqlite3_file * pFile)9071 static int apndSectorSize(sqlite3_file *pFile){
9072   pFile = ORIGFILE(pFile);
9073   return pFile->pMethods->xSectorSize(pFile);
9074 }
9075 
9076 /*
9077 ** Return the device characteristic flags supported by an apnd-file.
9078 */
apndDeviceCharacteristics(sqlite3_file * pFile)9079 static int apndDeviceCharacteristics(sqlite3_file *pFile){
9080   pFile = ORIGFILE(pFile);
9081   return pFile->pMethods->xDeviceCharacteristics(pFile);
9082 }
9083 
9084 /* Create a shared memory file mapping */
apndShmMap(sqlite3_file * pFile,int iPg,int pgsz,int bExtend,void volatile ** pp)9085 static int apndShmMap(
9086   sqlite3_file *pFile,
9087   int iPg,
9088   int pgsz,
9089   int bExtend,
9090   void volatile **pp
9091 ){
9092   pFile = ORIGFILE(pFile);
9093   return pFile->pMethods->xShmMap(pFile,iPg,pgsz,bExtend,pp);
9094 }
9095 
9096 /* Perform locking on a shared-memory segment */
apndShmLock(sqlite3_file * pFile,int offset,int n,int flags)9097 static int apndShmLock(sqlite3_file *pFile, int offset, int n, int flags){
9098   pFile = ORIGFILE(pFile);
9099   return pFile->pMethods->xShmLock(pFile,offset,n,flags);
9100 }
9101 
9102 /* Memory barrier operation on shared memory */
apndShmBarrier(sqlite3_file * pFile)9103 static void apndShmBarrier(sqlite3_file *pFile){
9104   pFile = ORIGFILE(pFile);
9105   pFile->pMethods->xShmBarrier(pFile);
9106 }
9107 
9108 /* Unmap a shared memory segment */
apndShmUnmap(sqlite3_file * pFile,int deleteFlag)9109 static int apndShmUnmap(sqlite3_file *pFile, int deleteFlag){
9110   pFile = ORIGFILE(pFile);
9111   return pFile->pMethods->xShmUnmap(pFile,deleteFlag);
9112 }
9113 
9114 /* Fetch a page of a memory-mapped file */
apndFetch(sqlite3_file * pFile,sqlite3_int64 iOfst,int iAmt,void ** pp)9115 static int apndFetch(
9116   sqlite3_file *pFile,
9117   sqlite3_int64 iOfst,
9118   int iAmt,
9119   void **pp
9120 ){
9121   ApndFile *p = (ApndFile *)pFile;
9122   if( p->iMark < 0 || iOfst+iAmt > p->iMark ){
9123     return SQLITE_IOERR; /* Cannot read what is not yet there. */
9124   }
9125   pFile = ORIGFILE(pFile);
9126   return pFile->pMethods->xFetch(pFile, iOfst+p->iPgOne, iAmt, pp);
9127 }
9128 
9129 /* Release a memory-mapped page */
apndUnfetch(sqlite3_file * pFile,sqlite3_int64 iOfst,void * pPage)9130 static int apndUnfetch(sqlite3_file *pFile, sqlite3_int64 iOfst, void *pPage){
9131   ApndFile *p = (ApndFile *)pFile;
9132   pFile = ORIGFILE(pFile);
9133   return pFile->pMethods->xUnfetch(pFile, iOfst+p->iPgOne, pPage);
9134 }
9135 
9136 /*
9137 ** Try to read the append-mark off the end of a file.  Return the
9138 ** start of the appended database if the append-mark is present.
9139 ** If there is no valid append-mark, return -1;
9140 **
9141 ** An append-mark is only valid if the NNNNNNNN start-of-database offset
9142 ** indicates that the appended database contains at least one page.  The
9143 ** start-of-database value must be a multiple of 512.
9144 */
apndReadMark(sqlite3_int64 sz,sqlite3_file * pFile)9145 static sqlite3_int64 apndReadMark(sqlite3_int64 sz, sqlite3_file *pFile){
9146   int rc, i;
9147   sqlite3_int64 iMark;
9148   int msbs = 8 * (APND_MARK_FOS_SZ-1);
9149   unsigned char a[APND_MARK_SIZE];
9150 
9151   if( APND_MARK_SIZE!=(sz & 0x1ff) ) return -1;
9152   rc = pFile->pMethods->xRead(pFile, a, APND_MARK_SIZE, sz-APND_MARK_SIZE);
9153   if( rc ) return -1;
9154   if( memcmp(a, APND_MARK_PREFIX, APND_MARK_PREFIX_SZ)!=0 ) return -1;
9155   iMark = ((sqlite3_int64)(a[APND_MARK_PREFIX_SZ] & 0x7f)) << msbs;
9156   for(i=1; i<8; i++){
9157     msbs -= 8;
9158     iMark |= (sqlite3_int64)a[APND_MARK_PREFIX_SZ+i]<<msbs;
9159   }
9160   if( iMark > (sz - APND_MARK_SIZE - 512) ) return -1;
9161   if( iMark & 0x1ff ) return -1;
9162   return iMark;
9163 }
9164 
9165 static const char apvfsSqliteHdr[] = "SQLite format 3";
9166 /*
9167 ** Check to see if the file is an appendvfs SQLite database file.
9168 ** Return true iff it is such. Parameter sz is the file's size.
9169 */
apndIsAppendvfsDatabase(sqlite3_int64 sz,sqlite3_file * pFile)9170 static int apndIsAppendvfsDatabase(sqlite3_int64 sz, sqlite3_file *pFile){
9171   int rc;
9172   char zHdr[16];
9173   sqlite3_int64 iMark = apndReadMark(sz, pFile);
9174   if( iMark>=0 ){
9175     /* If file has the correct end-marker, the expected odd size, and the
9176     ** SQLite DB type marker where the end-marker puts it, then it
9177     ** is an appendvfs database.
9178     */
9179     rc = pFile->pMethods->xRead(pFile, zHdr, sizeof(zHdr), iMark);
9180     if( SQLITE_OK==rc
9181      && memcmp(zHdr, apvfsSqliteHdr, sizeof(zHdr))==0
9182      && (sz & 0x1ff) == APND_MARK_SIZE
9183      && sz>=512+APND_MARK_SIZE
9184     ){
9185       return 1; /* It's an appendvfs database */
9186     }
9187   }
9188   return 0;
9189 }
9190 
9191 /*
9192 ** Check to see if the file is an ordinary SQLite database file.
9193 ** Return true iff so. Parameter sz is the file's size.
9194 */
apndIsOrdinaryDatabaseFile(sqlite3_int64 sz,sqlite3_file * pFile)9195 static int apndIsOrdinaryDatabaseFile(sqlite3_int64 sz, sqlite3_file *pFile){
9196   char zHdr[16];
9197   if( apndIsAppendvfsDatabase(sz, pFile) /* rule 2 */
9198    || (sz & 0x1ff) != 0
9199    || SQLITE_OK!=pFile->pMethods->xRead(pFile, zHdr, sizeof(zHdr), 0)
9200    || memcmp(zHdr, apvfsSqliteHdr, sizeof(zHdr))!=0
9201   ){
9202     return 0;
9203   }else{
9204     return 1;
9205   }
9206 }
9207 
9208 /*
9209 ** Open an apnd file handle.
9210 */
apndOpen(sqlite3_vfs * pApndVfs,const char * zName,sqlite3_file * pFile,int flags,int * pOutFlags)9211 static int apndOpen(
9212   sqlite3_vfs *pApndVfs,
9213   const char *zName,
9214   sqlite3_file *pFile,
9215   int flags,
9216   int *pOutFlags
9217 ){
9218   ApndFile *pApndFile = (ApndFile*)pFile;
9219   sqlite3_file *pBaseFile = ORIGFILE(pFile);
9220   sqlite3_vfs *pBaseVfs = ORIGVFS(pApndVfs);
9221   int rc;
9222   sqlite3_int64 sz = 0;
9223   if( (flags & SQLITE_OPEN_MAIN_DB)==0 ){
9224     /* The appendvfs is not to be used for transient or temporary databases.
9225     ** Just use the base VFS open to initialize the given file object and
9226     ** open the underlying file. (Appendvfs is then unused for this file.)
9227     */
9228     return pBaseVfs->xOpen(pBaseVfs, zName, pFile, flags, pOutFlags);
9229   }
9230   memset(pApndFile, 0, sizeof(ApndFile));
9231   pFile->pMethods = &apnd_io_methods;
9232   pApndFile->iMark = -1;    /* Append mark not yet written */
9233 
9234   rc = pBaseVfs->xOpen(pBaseVfs, zName, pBaseFile, flags, pOutFlags);
9235   if( rc==SQLITE_OK ){
9236     rc = pBaseFile->pMethods->xFileSize(pBaseFile, &sz);
9237     if( rc ){
9238       pBaseFile->pMethods->xClose(pBaseFile);
9239     }
9240   }
9241   if( rc ){
9242     pFile->pMethods = 0;
9243     return rc;
9244   }
9245   if( apndIsOrdinaryDatabaseFile(sz, pBaseFile) ){
9246     /* The file being opened appears to be just an ordinary DB. Copy
9247     ** the base dispatch-table so this instance mimics the base VFS.
9248     */
9249     memmove(pApndFile, pBaseFile, pBaseVfs->szOsFile);
9250     return SQLITE_OK;
9251   }
9252   pApndFile->iPgOne = apndReadMark(sz, pFile);
9253   if( pApndFile->iPgOne>=0 ){
9254     pApndFile->iMark = sz - APND_MARK_SIZE; /* Append mark found */
9255     return SQLITE_OK;
9256   }
9257   if( (flags & SQLITE_OPEN_CREATE)==0 ){
9258     pBaseFile->pMethods->xClose(pBaseFile);
9259     rc = SQLITE_CANTOPEN;
9260     pFile->pMethods = 0;
9261   }else{
9262     /* Round newly added appendvfs location to #define'd page boundary.
9263     ** Note that nothing has yet been written to the underlying file.
9264     ** The append mark will be written along with first content write.
9265     ** Until then, paf->iMark value indicates it is not yet written.
9266     */
9267     pApndFile->iPgOne = APND_START_ROUNDUP(sz);
9268   }
9269   return rc;
9270 }
9271 
9272 /*
9273 ** Delete an apnd file.
9274 ** For an appendvfs, this could mean delete the appendvfs portion,
9275 ** leaving the appendee as it was before it gained an appendvfs.
9276 ** For now, this code deletes the underlying file too.
9277 */
apndDelete(sqlite3_vfs * pVfs,const char * zPath,int dirSync)9278 static int apndDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){
9279   return ORIGVFS(pVfs)->xDelete(ORIGVFS(pVfs), zPath, dirSync);
9280 }
9281 
9282 /*
9283 ** All other VFS methods are pass-thrus.
9284 */
apndAccess(sqlite3_vfs * pVfs,const char * zPath,int flags,int * pResOut)9285 static int apndAccess(
9286   sqlite3_vfs *pVfs,
9287   const char *zPath,
9288   int flags,
9289   int *pResOut
9290 ){
9291   return ORIGVFS(pVfs)->xAccess(ORIGVFS(pVfs), zPath, flags, pResOut);
9292 }
apndFullPathname(sqlite3_vfs * pVfs,const char * zPath,int nOut,char * zOut)9293 static int apndFullPathname(
9294   sqlite3_vfs *pVfs,
9295   const char *zPath,
9296   int nOut,
9297   char *zOut
9298 ){
9299   return ORIGVFS(pVfs)->xFullPathname(ORIGVFS(pVfs),zPath,nOut,zOut);
9300 }
apndDlOpen(sqlite3_vfs * pVfs,const char * zPath)9301 static void *apndDlOpen(sqlite3_vfs *pVfs, const char *zPath){
9302   return ORIGVFS(pVfs)->xDlOpen(ORIGVFS(pVfs), zPath);
9303 }
apndDlError(sqlite3_vfs * pVfs,int nByte,char * zErrMsg)9304 static void apndDlError(sqlite3_vfs *pVfs, int nByte, char *zErrMsg){
9305   ORIGVFS(pVfs)->xDlError(ORIGVFS(pVfs), nByte, zErrMsg);
9306 }
apndDlSym(sqlite3_vfs * pVfs,void * p,const char * zSym)9307 static void (*apndDlSym(sqlite3_vfs *pVfs, void *p, const char *zSym))(void){
9308   return ORIGVFS(pVfs)->xDlSym(ORIGVFS(pVfs), p, zSym);
9309 }
apndDlClose(sqlite3_vfs * pVfs,void * pHandle)9310 static void apndDlClose(sqlite3_vfs *pVfs, void *pHandle){
9311   ORIGVFS(pVfs)->xDlClose(ORIGVFS(pVfs), pHandle);
9312 }
apndRandomness(sqlite3_vfs * pVfs,int nByte,char * zBufOut)9313 static int apndRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){
9314   return ORIGVFS(pVfs)->xRandomness(ORIGVFS(pVfs), nByte, zBufOut);
9315 }
apndSleep(sqlite3_vfs * pVfs,int nMicro)9316 static int apndSleep(sqlite3_vfs *pVfs, int nMicro){
9317   return ORIGVFS(pVfs)->xSleep(ORIGVFS(pVfs), nMicro);
9318 }
apndCurrentTime(sqlite3_vfs * pVfs,double * pTimeOut)9319 static int apndCurrentTime(sqlite3_vfs *pVfs, double *pTimeOut){
9320   return ORIGVFS(pVfs)->xCurrentTime(ORIGVFS(pVfs), pTimeOut);
9321 }
apndGetLastError(sqlite3_vfs * pVfs,int a,char * b)9322 static int apndGetLastError(sqlite3_vfs *pVfs, int a, char *b){
9323   return ORIGVFS(pVfs)->xGetLastError(ORIGVFS(pVfs), a, b);
9324 }
apndCurrentTimeInt64(sqlite3_vfs * pVfs,sqlite3_int64 * p)9325 static int apndCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *p){
9326   return ORIGVFS(pVfs)->xCurrentTimeInt64(ORIGVFS(pVfs), p);
9327 }
apndSetSystemCall(sqlite3_vfs * pVfs,const char * zName,sqlite3_syscall_ptr pCall)9328 static int apndSetSystemCall(
9329   sqlite3_vfs *pVfs,
9330   const char *zName,
9331   sqlite3_syscall_ptr pCall
9332 ){
9333   return ORIGVFS(pVfs)->xSetSystemCall(ORIGVFS(pVfs),zName,pCall);
9334 }
apndGetSystemCall(sqlite3_vfs * pVfs,const char * zName)9335 static sqlite3_syscall_ptr apndGetSystemCall(
9336   sqlite3_vfs *pVfs,
9337   const char *zName
9338 ){
9339   return ORIGVFS(pVfs)->xGetSystemCall(ORIGVFS(pVfs),zName);
9340 }
apndNextSystemCall(sqlite3_vfs * pVfs,const char * zName)9341 static const char *apndNextSystemCall(sqlite3_vfs *pVfs, const char *zName){
9342   return ORIGVFS(pVfs)->xNextSystemCall(ORIGVFS(pVfs), zName);
9343 }
9344 
9345 
9346 #ifdef _WIN32
9347 
9348 #endif
9349 /*
9350 ** This routine is called when the extension is loaded.
9351 ** Register the new VFS.
9352 */
sqlite3_appendvfs_init(sqlite3 * db,char ** pzErrMsg,const sqlite3_api_routines * pApi)9353 int sqlite3_appendvfs_init(
9354   sqlite3 *db,
9355   char **pzErrMsg,
9356   const sqlite3_api_routines *pApi
9357 ){
9358   int rc = SQLITE_OK;
9359   sqlite3_vfs *pOrig;
9360   SQLITE_EXTENSION_INIT2(pApi);
9361   (void)pzErrMsg;
9362   (void)db;
9363   pOrig = sqlite3_vfs_find(0);
9364   if( pOrig==0 ) return SQLITE_ERROR;
9365   apnd_vfs.iVersion = pOrig->iVersion;
9366   apnd_vfs.pAppData = pOrig;
9367   apnd_vfs.szOsFile = pOrig->szOsFile + sizeof(ApndFile);
9368   rc = sqlite3_vfs_register(&apnd_vfs, 0);
9369 #ifdef APPENDVFS_TEST
9370   if( rc==SQLITE_OK ){
9371     rc = sqlite3_auto_extension((void(*)(void))apndvfsRegister);
9372   }
9373 #endif
9374   if( rc==SQLITE_OK ) rc = SQLITE_OK_LOAD_PERMANENTLY;
9375   return rc;
9376 }
9377 
9378 /************************* End ../ext/misc/appendvfs.c ********************/
9379 #endif
9380 #ifdef SQLITE_HAVE_ZLIB
9381 /************************* Begin ../ext/misc/zipfile.c ******************/
9382 /*
9383 ** 2017-12-26
9384 **
9385 ** The author disclaims copyright to this source code.  In place of
9386 ** a legal notice, here is a blessing:
9387 **
9388 **    May you do good and not evil.
9389 **    May you find forgiveness for yourself and forgive others.
9390 **    May you share freely, never taking more than you give.
9391 **
9392 ******************************************************************************
9393 **
9394 ** This file implements a virtual table for reading and writing ZIP archive
9395 ** files.
9396 **
9397 ** Usage example:
9398 **
9399 **     SELECT name, sz, datetime(mtime,'unixepoch') FROM zipfile($filename);
9400 **
9401 ** Current limitations:
9402 **
9403 **    *  No support for encryption
9404 **    *  No support for ZIP archives spanning multiple files
9405 **    *  No support for zip64 extensions
9406 **    *  Only the "inflate/deflate" (zlib) compression method is supported
9407 */
9408 /* #include "sqlite3ext.h" */
9409 SQLITE_EXTENSION_INIT1
9410 #include <stdio.h>
9411 #include <string.h>
9412 #include <assert.h>
9413 #include <stdint.h>
9414 
9415 #include <zlib.h>
9416 
9417 #ifndef SQLITE_OMIT_VIRTUALTABLE
9418 
9419 #ifndef SQLITE_AMALGAMATION
9420 
9421 #ifndef UINT32_TYPE
9422 # ifdef HAVE_UINT32_T
9423 #  define UINT32_TYPE uint32_t
9424 # else
9425 #  define UINT32_TYPE unsigned int
9426 # endif
9427 #endif
9428 #ifndef UINT16_TYPE
9429 # ifdef HAVE_UINT16_T
9430 #  define UINT16_TYPE uint16_t
9431 # else
9432 #  define UINT16_TYPE unsigned short int
9433 # endif
9434 #endif
9435 /* typedef sqlite3_int64 i64; */
9436 /* typedef unsigned char u8; */
9437 /* typedef UINT32_TYPE u32;           // 4-byte unsigned integer // */
9438 /* typedef UINT16_TYPE u16;           // 2-byte unsigned integer // */
9439 #define MIN(a,b) ((a)<(b) ? (a) : (b))
9440 
9441 #if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST)
9442 # define SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS 1
9443 #endif
9444 #if defined(SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS)
9445 # define ALWAYS(X)      (1)
9446 # define NEVER(X)       (0)
9447 #elif !defined(NDEBUG)
9448 # define ALWAYS(X)      ((X)?1:(assert(0),0))
9449 # define NEVER(X)       ((X)?(assert(0),1):0)
9450 #else
9451 # define ALWAYS(X)      (X)
9452 # define NEVER(X)       (X)
9453 #endif
9454 
9455 #endif   /* SQLITE_AMALGAMATION */
9456 
9457 /*
9458 ** Definitions for mode bitmasks S_IFDIR, S_IFREG and S_IFLNK.
9459 **
9460 ** In some ways it would be better to obtain these values from system
9461 ** header files. But, the dependency is undesirable and (a) these
9462 ** have been stable for decades, (b) the values are part of POSIX and
9463 ** are also made explicit in [man stat], and (c) are part of the
9464 ** file format for zip archives.
9465 */
9466 #ifndef S_IFDIR
9467 # define S_IFDIR 0040000
9468 #endif
9469 #ifndef S_IFREG
9470 # define S_IFREG 0100000
9471 #endif
9472 #ifndef S_IFLNK
9473 # define S_IFLNK 0120000
9474 #endif
9475 
9476 static const char ZIPFILE_SCHEMA[] =
9477   "CREATE TABLE y("
9478     "name PRIMARY KEY,"  /* 0: Name of file in zip archive */
9479     "mode,"              /* 1: POSIX mode for file */
9480     "mtime,"             /* 2: Last modification time (secs since 1970)*/
9481     "sz,"                /* 3: Size of object */
9482     "rawdata,"           /* 4: Raw data */
9483     "data,"              /* 5: Uncompressed data */
9484     "method,"            /* 6: Compression method (integer) */
9485     "z HIDDEN"           /* 7: Name of zip file */
9486   ") WITHOUT ROWID;";
9487 
9488 #define ZIPFILE_F_COLUMN_IDX 7    /* Index of column "file" in the above */
9489 #define ZIPFILE_BUFFER_SIZE (64*1024)
9490 
9491 
9492 /*
9493 ** Magic numbers used to read and write zip files.
9494 **
9495 ** ZIPFILE_NEWENTRY_MADEBY:
9496 **   Use this value for the "version-made-by" field in new zip file
9497 **   entries. The upper byte indicates "unix", and the lower byte
9498 **   indicates that the zip file matches pkzip specification 3.0.
9499 **   This is what info-zip seems to do.
9500 **
9501 ** ZIPFILE_NEWENTRY_REQUIRED:
9502 **   Value for "version-required-to-extract" field of new entries.
9503 **   Version 2.0 is required to support folders and deflate compression.
9504 **
9505 ** ZIPFILE_NEWENTRY_FLAGS:
9506 **   Value for "general-purpose-bit-flags" field of new entries. Bit
9507 **   11 means "utf-8 filename and comment".
9508 **
9509 ** ZIPFILE_SIGNATURE_CDS:
9510 **   First 4 bytes of a valid CDS record.
9511 **
9512 ** ZIPFILE_SIGNATURE_LFH:
9513 **   First 4 bytes of a valid LFH record.
9514 **
9515 ** ZIPFILE_SIGNATURE_EOCD
9516 **   First 4 bytes of a valid EOCD record.
9517 */
9518 #define ZIPFILE_EXTRA_TIMESTAMP   0x5455
9519 #define ZIPFILE_NEWENTRY_MADEBY   ((3<<8) + 30)
9520 #define ZIPFILE_NEWENTRY_REQUIRED 20
9521 #define ZIPFILE_NEWENTRY_FLAGS    0x800
9522 #define ZIPFILE_SIGNATURE_CDS     0x02014b50
9523 #define ZIPFILE_SIGNATURE_LFH     0x04034b50
9524 #define ZIPFILE_SIGNATURE_EOCD    0x06054b50
9525 
9526 /*
9527 ** The sizes of the fixed-size part of each of the three main data
9528 ** structures in a zip archive.
9529 */
9530 #define ZIPFILE_LFH_FIXED_SZ      30
9531 #define ZIPFILE_EOCD_FIXED_SZ     22
9532 #define ZIPFILE_CDS_FIXED_SZ      46
9533 
9534 /*
9535 *** 4.3.16  End of central directory record:
9536 ***
9537 ***   end of central dir signature    4 bytes  (0x06054b50)
9538 ***   number of this disk             2 bytes
9539 ***   number of the disk with the
9540 ***   start of the central directory  2 bytes
9541 ***   total number of entries in the
9542 ***   central directory on this disk  2 bytes
9543 ***   total number of entries in
9544 ***   the central directory           2 bytes
9545 ***   size of the central directory   4 bytes
9546 ***   offset of start of central
9547 ***   directory with respect to
9548 ***   the starting disk number        4 bytes
9549 ***   .ZIP file comment length        2 bytes
9550 ***   .ZIP file comment       (variable size)
9551 */
9552 typedef struct ZipfileEOCD ZipfileEOCD;
9553 struct ZipfileEOCD {
9554   u16 iDisk;
9555   u16 iFirstDisk;
9556   u16 nEntry;
9557   u16 nEntryTotal;
9558   u32 nSize;
9559   u32 iOffset;
9560 };
9561 
9562 /*
9563 *** 4.3.12  Central directory structure:
9564 ***
9565 *** ...
9566 ***
9567 ***   central file header signature   4 bytes  (0x02014b50)
9568 ***   version made by                 2 bytes
9569 ***   version needed to extract       2 bytes
9570 ***   general purpose bit flag        2 bytes
9571 ***   compression method              2 bytes
9572 ***   last mod file time              2 bytes
9573 ***   last mod file date              2 bytes
9574 ***   crc-32                          4 bytes
9575 ***   compressed size                 4 bytes
9576 ***   uncompressed size               4 bytes
9577 ***   file name length                2 bytes
9578 ***   extra field length              2 bytes
9579 ***   file comment length             2 bytes
9580 ***   disk number start               2 bytes
9581 ***   internal file attributes        2 bytes
9582 ***   external file attributes        4 bytes
9583 ***   relative offset of local header 4 bytes
9584 */
9585 typedef struct ZipfileCDS ZipfileCDS;
9586 struct ZipfileCDS {
9587   u16 iVersionMadeBy;
9588   u16 iVersionExtract;
9589   u16 flags;
9590   u16 iCompression;
9591   u16 mTime;
9592   u16 mDate;
9593   u32 crc32;
9594   u32 szCompressed;
9595   u32 szUncompressed;
9596   u16 nFile;
9597   u16 nExtra;
9598   u16 nComment;
9599   u16 iDiskStart;
9600   u16 iInternalAttr;
9601   u32 iExternalAttr;
9602   u32 iOffset;
9603   char *zFile;                    /* Filename (sqlite3_malloc()) */
9604 };
9605 
9606 /*
9607 *** 4.3.7  Local file header:
9608 ***
9609 ***   local file header signature     4 bytes  (0x04034b50)
9610 ***   version needed to extract       2 bytes
9611 ***   general purpose bit flag        2 bytes
9612 ***   compression method              2 bytes
9613 ***   last mod file time              2 bytes
9614 ***   last mod file date              2 bytes
9615 ***   crc-32                          4 bytes
9616 ***   compressed size                 4 bytes
9617 ***   uncompressed size               4 bytes
9618 ***   file name length                2 bytes
9619 ***   extra field length              2 bytes
9620 ***
9621 */
9622 typedef struct ZipfileLFH ZipfileLFH;
9623 struct ZipfileLFH {
9624   u16 iVersionExtract;
9625   u16 flags;
9626   u16 iCompression;
9627   u16 mTime;
9628   u16 mDate;
9629   u32 crc32;
9630   u32 szCompressed;
9631   u32 szUncompressed;
9632   u16 nFile;
9633   u16 nExtra;
9634 };
9635 
9636 typedef struct ZipfileEntry ZipfileEntry;
9637 struct ZipfileEntry {
9638   ZipfileCDS cds;            /* Parsed CDS record */
9639   u32 mUnixTime;             /* Modification time, in UNIX format */
9640   u8 *aExtra;                /* cds.nExtra+cds.nComment bytes of extra data */
9641   i64 iDataOff;              /* Offset to data in file (if aData==0) */
9642   u8 *aData;                 /* cds.szCompressed bytes of compressed data */
9643   ZipfileEntry *pNext;       /* Next element in in-memory CDS */
9644 };
9645 
9646 /*
9647 ** Cursor type for zipfile tables.
9648 */
9649 typedef struct ZipfileCsr ZipfileCsr;
9650 struct ZipfileCsr {
9651   sqlite3_vtab_cursor base;  /* Base class - must be first */
9652   i64 iId;                   /* Cursor ID */
9653   u8 bEof;                   /* True when at EOF */
9654   u8 bNoop;                  /* If next xNext() call is no-op */
9655 
9656   /* Used outside of write transactions */
9657   FILE *pFile;               /* Zip file */
9658   i64 iNextOff;              /* Offset of next record in central directory */
9659   ZipfileEOCD eocd;          /* Parse of central directory record */
9660 
9661   ZipfileEntry *pFreeEntry;  /* Free this list when cursor is closed or reset */
9662   ZipfileEntry *pCurrent;    /* Current entry */
9663   ZipfileCsr *pCsrNext;      /* Next cursor on same virtual table */
9664 };
9665 
9666 typedef struct ZipfileTab ZipfileTab;
9667 struct ZipfileTab {
9668   sqlite3_vtab base;         /* Base class - must be first */
9669   char *zFile;               /* Zip file this table accesses (may be NULL) */
9670   sqlite3 *db;               /* Host database connection */
9671   u8 *aBuffer;               /* Temporary buffer used for various tasks */
9672 
9673   ZipfileCsr *pCsrList;      /* List of cursors */
9674   i64 iNextCsrid;
9675 
9676   /* The following are used by write transactions only */
9677   ZipfileEntry *pFirstEntry; /* Linked list of all files (if pWriteFd!=0) */
9678   ZipfileEntry *pLastEntry;  /* Last element in pFirstEntry list */
9679   FILE *pWriteFd;            /* File handle open on zip archive */
9680   i64 szCurrent;             /* Current size of zip archive */
9681   i64 szOrig;                /* Size of archive at start of transaction */
9682 };
9683 
9684 /*
9685 ** Set the error message contained in context ctx to the results of
9686 ** vprintf(zFmt, ...).
9687 */
zipfileCtxErrorMsg(sqlite3_context * ctx,const char * zFmt,...)9688 static void zipfileCtxErrorMsg(sqlite3_context *ctx, const char *zFmt, ...){
9689   char *zMsg = 0;
9690   va_list ap;
9691   va_start(ap, zFmt);
9692   zMsg = sqlite3_vmprintf(zFmt, ap);
9693   sqlite3_result_error(ctx, zMsg, -1);
9694   sqlite3_free(zMsg);
9695   va_end(ap);
9696 }
9697 
9698 /*
9699 ** If string zIn is quoted, dequote it in place. Otherwise, if the string
9700 ** is not quoted, do nothing.
9701 */
zipfileDequote(char * zIn)9702 static void zipfileDequote(char *zIn){
9703   char q = zIn[0];
9704   if( q=='"' || q=='\'' || q=='`' || q=='[' ){
9705     int iIn = 1;
9706     int iOut = 0;
9707     if( q=='[' ) q = ']';
9708     while( ALWAYS(zIn[iIn]) ){
9709       char c = zIn[iIn++];
9710       if( c==q && zIn[iIn++]!=q ) break;
9711       zIn[iOut++] = c;
9712     }
9713     zIn[iOut] = '\0';
9714   }
9715 }
9716 
9717 /*
9718 ** Construct a new ZipfileTab virtual table object.
9719 **
9720 **   argv[0]   -> module name  ("zipfile")
9721 **   argv[1]   -> database name
9722 **   argv[2]   -> table name
9723 **   argv[...] -> "column name" and other module argument fields.
9724 */
zipfileConnect(sqlite3 * db,void * pAux,int argc,const char * const * argv,sqlite3_vtab ** ppVtab,char ** pzErr)9725 static int zipfileConnect(
9726   sqlite3 *db,
9727   void *pAux,
9728   int argc, const char *const*argv,
9729   sqlite3_vtab **ppVtab,
9730   char **pzErr
9731 ){
9732   int nByte = sizeof(ZipfileTab) + ZIPFILE_BUFFER_SIZE;
9733   int nFile = 0;
9734   const char *zFile = 0;
9735   ZipfileTab *pNew = 0;
9736   int rc;
9737   (void)pAux;
9738 
9739   /* If the table name is not "zipfile", require that the argument be
9740   ** specified. This stops zipfile tables from being created as:
9741   **
9742   **   CREATE VIRTUAL TABLE zzz USING zipfile();
9743   **
9744   ** It does not prevent:
9745   **
9746   **   CREATE VIRTUAL TABLE zipfile USING zipfile();
9747   */
9748   assert( 0==sqlite3_stricmp(argv[0], "zipfile") );
9749   if( (0!=sqlite3_stricmp(argv[2], "zipfile") && argc<4) || argc>4 ){
9750     *pzErr = sqlite3_mprintf("zipfile constructor requires one argument");
9751     return SQLITE_ERROR;
9752   }
9753 
9754   if( argc>3 ){
9755     zFile = argv[3];
9756     nFile = (int)strlen(zFile)+1;
9757   }
9758 
9759   rc = sqlite3_declare_vtab(db, ZIPFILE_SCHEMA);
9760   if( rc==SQLITE_OK ){
9761     pNew = (ZipfileTab*)sqlite3_malloc64((sqlite3_int64)nByte+nFile);
9762     if( pNew==0 ) return SQLITE_NOMEM;
9763     memset(pNew, 0, nByte+nFile);
9764     pNew->db = db;
9765     pNew->aBuffer = (u8*)&pNew[1];
9766     if( zFile ){
9767       pNew->zFile = (char*)&pNew->aBuffer[ZIPFILE_BUFFER_SIZE];
9768       memcpy(pNew->zFile, zFile, nFile);
9769       zipfileDequote(pNew->zFile);
9770     }
9771   }
9772   sqlite3_vtab_config(db, SQLITE_VTAB_DIRECTONLY);
9773   *ppVtab = (sqlite3_vtab*)pNew;
9774   return rc;
9775 }
9776 
9777 /*
9778 ** Free the ZipfileEntry structure indicated by the only argument.
9779 */
zipfileEntryFree(ZipfileEntry * p)9780 static void zipfileEntryFree(ZipfileEntry *p){
9781   if( p ){
9782     sqlite3_free(p->cds.zFile);
9783     sqlite3_free(p);
9784   }
9785 }
9786 
9787 /*
9788 ** Release resources that should be freed at the end of a write
9789 ** transaction.
9790 */
zipfileCleanupTransaction(ZipfileTab * pTab)9791 static void zipfileCleanupTransaction(ZipfileTab *pTab){
9792   ZipfileEntry *pEntry;
9793   ZipfileEntry *pNext;
9794 
9795   if( pTab->pWriteFd ){
9796     fclose(pTab->pWriteFd);
9797     pTab->pWriteFd = 0;
9798   }
9799   for(pEntry=pTab->pFirstEntry; pEntry; pEntry=pNext){
9800     pNext = pEntry->pNext;
9801     zipfileEntryFree(pEntry);
9802   }
9803   pTab->pFirstEntry = 0;
9804   pTab->pLastEntry = 0;
9805   pTab->szCurrent = 0;
9806   pTab->szOrig = 0;
9807 }
9808 
9809 /*
9810 ** This method is the destructor for zipfile vtab objects.
9811 */
zipfileDisconnect(sqlite3_vtab * pVtab)9812 static int zipfileDisconnect(sqlite3_vtab *pVtab){
9813   zipfileCleanupTransaction((ZipfileTab*)pVtab);
9814   sqlite3_free(pVtab);
9815   return SQLITE_OK;
9816 }
9817 
9818 /*
9819 ** Constructor for a new ZipfileCsr object.
9820 */
zipfileOpen(sqlite3_vtab * p,sqlite3_vtab_cursor ** ppCsr)9821 static int zipfileOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCsr){
9822   ZipfileTab *pTab = (ZipfileTab*)p;
9823   ZipfileCsr *pCsr;
9824   pCsr = sqlite3_malloc(sizeof(*pCsr));
9825   *ppCsr = (sqlite3_vtab_cursor*)pCsr;
9826   if( pCsr==0 ){
9827     return SQLITE_NOMEM;
9828   }
9829   memset(pCsr, 0, sizeof(*pCsr));
9830   pCsr->iId = ++pTab->iNextCsrid;
9831   pCsr->pCsrNext = pTab->pCsrList;
9832   pTab->pCsrList = pCsr;
9833   return SQLITE_OK;
9834 }
9835 
9836 /*
9837 ** Reset a cursor back to the state it was in when first returned
9838 ** by zipfileOpen().
9839 */
zipfileResetCursor(ZipfileCsr * pCsr)9840 static void zipfileResetCursor(ZipfileCsr *pCsr){
9841   ZipfileEntry *p;
9842   ZipfileEntry *pNext;
9843 
9844   pCsr->bEof = 0;
9845   if( pCsr->pFile ){
9846     fclose(pCsr->pFile);
9847     pCsr->pFile = 0;
9848     zipfileEntryFree(pCsr->pCurrent);
9849     pCsr->pCurrent = 0;
9850   }
9851 
9852   for(p=pCsr->pFreeEntry; p; p=pNext){
9853     pNext = p->pNext;
9854     zipfileEntryFree(p);
9855   }
9856 }
9857 
9858 /*
9859 ** Destructor for an ZipfileCsr.
9860 */
zipfileClose(sqlite3_vtab_cursor * cur)9861 static int zipfileClose(sqlite3_vtab_cursor *cur){
9862   ZipfileCsr *pCsr = (ZipfileCsr*)cur;
9863   ZipfileTab *pTab = (ZipfileTab*)(pCsr->base.pVtab);
9864   ZipfileCsr **pp;
9865   zipfileResetCursor(pCsr);
9866 
9867   /* Remove this cursor from the ZipfileTab.pCsrList list. */
9868   for(pp=&pTab->pCsrList; *pp!=pCsr; pp=&((*pp)->pCsrNext));
9869   *pp = pCsr->pCsrNext;
9870 
9871   sqlite3_free(pCsr);
9872   return SQLITE_OK;
9873 }
9874 
9875 /*
9876 ** Set the error message for the virtual table associated with cursor
9877 ** pCsr to the results of vprintf(zFmt, ...).
9878 */
zipfileTableErr(ZipfileTab * pTab,const char * zFmt,...)9879 static void zipfileTableErr(ZipfileTab *pTab, const char *zFmt, ...){
9880   va_list ap;
9881   va_start(ap, zFmt);
9882   sqlite3_free(pTab->base.zErrMsg);
9883   pTab->base.zErrMsg = sqlite3_vmprintf(zFmt, ap);
9884   va_end(ap);
9885 }
zipfileCursorErr(ZipfileCsr * pCsr,const char * zFmt,...)9886 static void zipfileCursorErr(ZipfileCsr *pCsr, const char *zFmt, ...){
9887   va_list ap;
9888   va_start(ap, zFmt);
9889   sqlite3_free(pCsr->base.pVtab->zErrMsg);
9890   pCsr->base.pVtab->zErrMsg = sqlite3_vmprintf(zFmt, ap);
9891   va_end(ap);
9892 }
9893 
9894 /*
9895 ** Read nRead bytes of data from offset iOff of file pFile into buffer
9896 ** aRead[]. Return SQLITE_OK if successful, or an SQLite error code
9897 ** otherwise.
9898 **
9899 ** If an error does occur, output variable (*pzErrmsg) may be set to point
9900 ** to an English language error message. It is the responsibility of the
9901 ** caller to eventually free this buffer using
9902 ** sqlite3_free().
9903 */
zipfileReadData(FILE * pFile,u8 * aRead,int nRead,i64 iOff,char ** pzErrmsg)9904 static int zipfileReadData(
9905   FILE *pFile,                    /* Read from this file */
9906   u8 *aRead,                      /* Read into this buffer */
9907   int nRead,                      /* Number of bytes to read */
9908   i64 iOff,                       /* Offset to read from */
9909   char **pzErrmsg                 /* OUT: Error message (from sqlite3_malloc) */
9910 ){
9911   size_t n;
9912   fseek(pFile, (long)iOff, SEEK_SET);
9913   n = fread(aRead, 1, nRead, pFile);
9914   if( (int)n!=nRead ){
9915     *pzErrmsg = sqlite3_mprintf("error in fread()");
9916     return SQLITE_ERROR;
9917   }
9918   return SQLITE_OK;
9919 }
9920 
zipfileAppendData(ZipfileTab * pTab,const u8 * aWrite,int nWrite)9921 static int zipfileAppendData(
9922   ZipfileTab *pTab,
9923   const u8 *aWrite,
9924   int nWrite
9925 ){
9926   if( nWrite>0 ){
9927     size_t n = nWrite;
9928     fseek(pTab->pWriteFd, (long)pTab->szCurrent, SEEK_SET);
9929     n = fwrite(aWrite, 1, nWrite, pTab->pWriteFd);
9930     if( (int)n!=nWrite ){
9931       pTab->base.zErrMsg = sqlite3_mprintf("error in fwrite()");
9932       return SQLITE_ERROR;
9933     }
9934     pTab->szCurrent += nWrite;
9935   }
9936   return SQLITE_OK;
9937 }
9938 
9939 /*
9940 ** Read and return a 16-bit little-endian unsigned integer from buffer aBuf.
9941 */
zipfileGetU16(const u8 * aBuf)9942 static u16 zipfileGetU16(const u8 *aBuf){
9943   return (aBuf[1] << 8) + aBuf[0];
9944 }
9945 
9946 /*
9947 ** Read and return a 32-bit little-endian unsigned integer from buffer aBuf.
9948 */
zipfileGetU32(const u8 * aBuf)9949 static u32 zipfileGetU32(const u8 *aBuf){
9950   if( aBuf==0 ) return 0;
9951   return ((u32)(aBuf[3]) << 24)
9952        + ((u32)(aBuf[2]) << 16)
9953        + ((u32)(aBuf[1]) <<  8)
9954        + ((u32)(aBuf[0]) <<  0);
9955 }
9956 
9957 /*
9958 ** Write a 16-bit little endiate integer into buffer aBuf.
9959 */
zipfilePutU16(u8 * aBuf,u16 val)9960 static void zipfilePutU16(u8 *aBuf, u16 val){
9961   aBuf[0] = val & 0xFF;
9962   aBuf[1] = (val>>8) & 0xFF;
9963 }
9964 
9965 /*
9966 ** Write a 32-bit little endiate integer into buffer aBuf.
9967 */
zipfilePutU32(u8 * aBuf,u32 val)9968 static void zipfilePutU32(u8 *aBuf, u32 val){
9969   aBuf[0] = val & 0xFF;
9970   aBuf[1] = (val>>8) & 0xFF;
9971   aBuf[2] = (val>>16) & 0xFF;
9972   aBuf[3] = (val>>24) & 0xFF;
9973 }
9974 
9975 #define zipfileRead32(aBuf) ( aBuf+=4, zipfileGetU32(aBuf-4) )
9976 #define zipfileRead16(aBuf) ( aBuf+=2, zipfileGetU16(aBuf-2) )
9977 
9978 #define zipfileWrite32(aBuf,val) { zipfilePutU32(aBuf,val); aBuf+=4; }
9979 #define zipfileWrite16(aBuf,val) { zipfilePutU16(aBuf,val); aBuf+=2; }
9980 
9981 /*
9982 ** Magic numbers used to read CDS records.
9983 */
9984 #define ZIPFILE_CDS_NFILE_OFF        28
9985 #define ZIPFILE_CDS_SZCOMPRESSED_OFF 20
9986 
9987 /*
9988 ** Decode the CDS record in buffer aBuf into (*pCDS). Return SQLITE_ERROR
9989 ** if the record is not well-formed, or SQLITE_OK otherwise.
9990 */
zipfileReadCDS(u8 * aBuf,ZipfileCDS * pCDS)9991 static int zipfileReadCDS(u8 *aBuf, ZipfileCDS *pCDS){
9992   u8 *aRead = aBuf;
9993   u32 sig = zipfileRead32(aRead);
9994   int rc = SQLITE_OK;
9995   if( sig!=ZIPFILE_SIGNATURE_CDS ){
9996     rc = SQLITE_ERROR;
9997   }else{
9998     pCDS->iVersionMadeBy = zipfileRead16(aRead);
9999     pCDS->iVersionExtract = zipfileRead16(aRead);
10000     pCDS->flags = zipfileRead16(aRead);
10001     pCDS->iCompression = zipfileRead16(aRead);
10002     pCDS->mTime = zipfileRead16(aRead);
10003     pCDS->mDate = zipfileRead16(aRead);
10004     pCDS->crc32 = zipfileRead32(aRead);
10005     pCDS->szCompressed = zipfileRead32(aRead);
10006     pCDS->szUncompressed = zipfileRead32(aRead);
10007     assert( aRead==&aBuf[ZIPFILE_CDS_NFILE_OFF] );
10008     pCDS->nFile = zipfileRead16(aRead);
10009     pCDS->nExtra = zipfileRead16(aRead);
10010     pCDS->nComment = zipfileRead16(aRead);
10011     pCDS->iDiskStart = zipfileRead16(aRead);
10012     pCDS->iInternalAttr = zipfileRead16(aRead);
10013     pCDS->iExternalAttr = zipfileRead32(aRead);
10014     pCDS->iOffset = zipfileRead32(aRead);
10015     assert( aRead==&aBuf[ZIPFILE_CDS_FIXED_SZ] );
10016   }
10017 
10018   return rc;
10019 }
10020 
10021 /*
10022 ** Decode the LFH record in buffer aBuf into (*pLFH). Return SQLITE_ERROR
10023 ** if the record is not well-formed, or SQLITE_OK otherwise.
10024 */
zipfileReadLFH(u8 * aBuffer,ZipfileLFH * pLFH)10025 static int zipfileReadLFH(
10026   u8 *aBuffer,
10027   ZipfileLFH *pLFH
10028 ){
10029   u8 *aRead = aBuffer;
10030   int rc = SQLITE_OK;
10031 
10032   u32 sig = zipfileRead32(aRead);
10033   if( sig!=ZIPFILE_SIGNATURE_LFH ){
10034     rc = SQLITE_ERROR;
10035   }else{
10036     pLFH->iVersionExtract = zipfileRead16(aRead);
10037     pLFH->flags = zipfileRead16(aRead);
10038     pLFH->iCompression = zipfileRead16(aRead);
10039     pLFH->mTime = zipfileRead16(aRead);
10040     pLFH->mDate = zipfileRead16(aRead);
10041     pLFH->crc32 = zipfileRead32(aRead);
10042     pLFH->szCompressed = zipfileRead32(aRead);
10043     pLFH->szUncompressed = zipfileRead32(aRead);
10044     pLFH->nFile = zipfileRead16(aRead);
10045     pLFH->nExtra = zipfileRead16(aRead);
10046   }
10047   return rc;
10048 }
10049 
10050 
10051 /*
10052 ** Buffer aExtra (size nExtra bytes) contains zip archive "extra" fields.
10053 ** Scan through this buffer to find an "extra-timestamp" field. If one
10054 ** exists, extract the 32-bit modification-timestamp from it and store
10055 ** the value in output parameter *pmTime.
10056 **
10057 ** Zero is returned if no extra-timestamp record could be found (and so
10058 ** *pmTime is left unchanged), or non-zero otherwise.
10059 **
10060 ** The general format of an extra field is:
10061 **
10062 **   Header ID    2 bytes
10063 **   Data Size    2 bytes
10064 **   Data         N bytes
10065 */
zipfileScanExtra(u8 * aExtra,int nExtra,u32 * pmTime)10066 static int zipfileScanExtra(u8 *aExtra, int nExtra, u32 *pmTime){
10067   int ret = 0;
10068   u8 *p = aExtra;
10069   u8 *pEnd = &aExtra[nExtra];
10070 
10071   while( p<pEnd ){
10072     u16 id = zipfileRead16(p);
10073     u16 nByte = zipfileRead16(p);
10074 
10075     switch( id ){
10076       case ZIPFILE_EXTRA_TIMESTAMP: {
10077         u8 b = p[0];
10078         if( b & 0x01 ){     /* 0x01 -> modtime is present */
10079           *pmTime = zipfileGetU32(&p[1]);
10080           ret = 1;
10081         }
10082         break;
10083       }
10084     }
10085 
10086     p += nByte;
10087   }
10088   return ret;
10089 }
10090 
10091 /*
10092 ** Convert the standard MS-DOS timestamp stored in the mTime and mDate
10093 ** fields of the CDS structure passed as the only argument to a 32-bit
10094 ** UNIX seconds-since-the-epoch timestamp. Return the result.
10095 **
10096 ** "Standard" MS-DOS time format:
10097 **
10098 **   File modification time:
10099 **     Bits 00-04: seconds divided by 2
10100 **     Bits 05-10: minute
10101 **     Bits 11-15: hour
10102 **   File modification date:
10103 **     Bits 00-04: day
10104 **     Bits 05-08: month (1-12)
10105 **     Bits 09-15: years from 1980
10106 **
10107 ** https://msdn.microsoft.com/en-us/library/9kkf9tah.aspx
10108 */
zipfileMtime(ZipfileCDS * pCDS)10109 static u32 zipfileMtime(ZipfileCDS *pCDS){
10110   int Y,M,D,X1,X2,A,B,sec,min,hr;
10111   i64 JDsec;
10112   Y = (1980 + ((pCDS->mDate >> 9) & 0x7F));
10113   M = ((pCDS->mDate >> 5) & 0x0F);
10114   D = (pCDS->mDate & 0x1F);
10115   sec = (pCDS->mTime & 0x1F)*2;
10116   min = (pCDS->mTime >> 5) & 0x3F;
10117   hr = (pCDS->mTime >> 11) & 0x1F;
10118   if( M<=2 ){
10119     Y--;
10120     M += 12;
10121   }
10122   X1 = 36525*(Y+4716)/100;
10123   X2 = 306001*(M+1)/10000;
10124   A = Y/100;
10125   B = 2 - A + (A/4);
10126   JDsec = (i64)((X1 + X2 + D + B - 1524.5)*86400) + hr*3600 + min*60 + sec;
10127   return (u32)(JDsec - (i64)24405875*(i64)8640);
10128 }
10129 
10130 /*
10131 ** The opposite of zipfileMtime(). This function populates the mTime and
10132 ** mDate fields of the CDS structure passed as the first argument according
10133 ** to the UNIX timestamp value passed as the second.
10134 */
zipfileMtimeToDos(ZipfileCDS * pCds,u32 mUnixTime)10135 static void zipfileMtimeToDos(ZipfileCDS *pCds, u32 mUnixTime){
10136   /* Convert unix timestamp to JD (2440588 is noon on 1/1/1970) */
10137   i64 JD = (i64)2440588 + mUnixTime / (24*60*60);
10138 
10139   int A, B, C, D, E;
10140   int yr, mon, day;
10141   int hr, min, sec;
10142 
10143   A = (int)((JD - 1867216.25)/36524.25);
10144   A = (int)(JD + 1 + A - (A/4));
10145   B = A + 1524;
10146   C = (int)((B - 122.1)/365.25);
10147   D = (36525*(C&32767))/100;
10148   E = (int)((B-D)/30.6001);
10149 
10150   day = B - D - (int)(30.6001*E);
10151   mon = (E<14 ? E-1 : E-13);
10152   yr = mon>2 ? C-4716 : C-4715;
10153 
10154   hr = (mUnixTime % (24*60*60)) / (60*60);
10155   min = (mUnixTime % (60*60)) / 60;
10156   sec = (mUnixTime % 60);
10157 
10158   if( yr>=1980 ){
10159     pCds->mDate = (u16)(day + (mon << 5) + ((yr-1980) << 9));
10160     pCds->mTime = (u16)(sec/2 + (min<<5) + (hr<<11));
10161   }else{
10162     pCds->mDate = pCds->mTime = 0;
10163   }
10164 
10165   assert( mUnixTime<315507600
10166        || mUnixTime==zipfileMtime(pCds)
10167        || ((mUnixTime % 2) && mUnixTime-1==zipfileMtime(pCds))
10168        /* || (mUnixTime % 2) */
10169   );
10170 }
10171 
10172 /*
10173 ** If aBlob is not NULL, then it is a pointer to a buffer (nBlob bytes in
10174 ** size) containing an entire zip archive image. Or, if aBlob is NULL,
10175 ** then pFile is a file-handle open on a zip file. In either case, this
10176 ** function creates a ZipfileEntry object based on the zip archive entry
10177 ** for which the CDS record is at offset iOff.
10178 **
10179 ** If successful, SQLITE_OK is returned and (*ppEntry) set to point to
10180 ** the new object. Otherwise, an SQLite error code is returned and the
10181 ** final value of (*ppEntry) undefined.
10182 */
zipfileGetEntry(ZipfileTab * pTab,const u8 * aBlob,int nBlob,FILE * pFile,i64 iOff,ZipfileEntry ** ppEntry)10183 static int zipfileGetEntry(
10184   ZipfileTab *pTab,               /* Store any error message here */
10185   const u8 *aBlob,                /* Pointer to in-memory file image */
10186   int nBlob,                      /* Size of aBlob[] in bytes */
10187   FILE *pFile,                    /* If aBlob==0, read from this file */
10188   i64 iOff,                       /* Offset of CDS record */
10189   ZipfileEntry **ppEntry          /* OUT: Pointer to new object */
10190 ){
10191   u8 *aRead;
10192   char **pzErr = &pTab->base.zErrMsg;
10193   int rc = SQLITE_OK;
10194   (void)nBlob;
10195 
10196   if( aBlob==0 ){
10197     aRead = pTab->aBuffer;
10198     rc = zipfileReadData(pFile, aRead, ZIPFILE_CDS_FIXED_SZ, iOff, pzErr);
10199   }else{
10200     aRead = (u8*)&aBlob[iOff];
10201   }
10202 
10203   if( rc==SQLITE_OK ){
10204     sqlite3_int64 nAlloc;
10205     ZipfileEntry *pNew;
10206 
10207     int nFile = zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF]);
10208     int nExtra = zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF+2]);
10209     nExtra += zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF+4]);
10210 
10211     nAlloc = sizeof(ZipfileEntry) + nExtra;
10212     if( aBlob ){
10213       nAlloc += zipfileGetU32(&aRead[ZIPFILE_CDS_SZCOMPRESSED_OFF]);
10214     }
10215 
10216     pNew = (ZipfileEntry*)sqlite3_malloc64(nAlloc);
10217     if( pNew==0 ){
10218       rc = SQLITE_NOMEM;
10219     }else{
10220       memset(pNew, 0, sizeof(ZipfileEntry));
10221       rc = zipfileReadCDS(aRead, &pNew->cds);
10222       if( rc!=SQLITE_OK ){
10223         *pzErr = sqlite3_mprintf("failed to read CDS at offset %lld", iOff);
10224       }else if( aBlob==0 ){
10225         rc = zipfileReadData(
10226             pFile, aRead, nExtra+nFile, iOff+ZIPFILE_CDS_FIXED_SZ, pzErr
10227         );
10228       }else{
10229         aRead = (u8*)&aBlob[iOff + ZIPFILE_CDS_FIXED_SZ];
10230       }
10231     }
10232 
10233     if( rc==SQLITE_OK ){
10234       u32 *pt = &pNew->mUnixTime;
10235       pNew->cds.zFile = sqlite3_mprintf("%.*s", nFile, aRead);
10236       pNew->aExtra = (u8*)&pNew[1];
10237       memcpy(pNew->aExtra, &aRead[nFile], nExtra);
10238       if( pNew->cds.zFile==0 ){
10239         rc = SQLITE_NOMEM;
10240       }else if( 0==zipfileScanExtra(&aRead[nFile], pNew->cds.nExtra, pt) ){
10241         pNew->mUnixTime = zipfileMtime(&pNew->cds);
10242       }
10243     }
10244 
10245     if( rc==SQLITE_OK ){
10246       static const int szFix = ZIPFILE_LFH_FIXED_SZ;
10247       ZipfileLFH lfh;
10248       if( pFile ){
10249         rc = zipfileReadData(pFile, aRead, szFix, pNew->cds.iOffset, pzErr);
10250       }else{
10251         aRead = (u8*)&aBlob[pNew->cds.iOffset];
10252       }
10253 
10254       if( rc==SQLITE_OK ) rc = zipfileReadLFH(aRead, &lfh);
10255       if( rc==SQLITE_OK ){
10256         pNew->iDataOff =  pNew->cds.iOffset + ZIPFILE_LFH_FIXED_SZ;
10257         pNew->iDataOff += lfh.nFile + lfh.nExtra;
10258         if( aBlob && pNew->cds.szCompressed ){
10259           pNew->aData = &pNew->aExtra[nExtra];
10260           memcpy(pNew->aData, &aBlob[pNew->iDataOff], pNew->cds.szCompressed);
10261         }
10262       }else{
10263         *pzErr = sqlite3_mprintf("failed to read LFH at offset %d",
10264             (int)pNew->cds.iOffset
10265         );
10266       }
10267     }
10268 
10269     if( rc!=SQLITE_OK ){
10270       zipfileEntryFree(pNew);
10271     }else{
10272       *ppEntry = pNew;
10273     }
10274   }
10275 
10276   return rc;
10277 }
10278 
10279 /*
10280 ** Advance an ZipfileCsr to its next row of output.
10281 */
zipfileNext(sqlite3_vtab_cursor * cur)10282 static int zipfileNext(sqlite3_vtab_cursor *cur){
10283   ZipfileCsr *pCsr = (ZipfileCsr*)cur;
10284   int rc = SQLITE_OK;
10285 
10286   if( pCsr->pFile ){
10287     i64 iEof = pCsr->eocd.iOffset + pCsr->eocd.nSize;
10288     zipfileEntryFree(pCsr->pCurrent);
10289     pCsr->pCurrent = 0;
10290     if( pCsr->iNextOff>=iEof ){
10291       pCsr->bEof = 1;
10292     }else{
10293       ZipfileEntry *p = 0;
10294       ZipfileTab *pTab = (ZipfileTab*)(cur->pVtab);
10295       rc = zipfileGetEntry(pTab, 0, 0, pCsr->pFile, pCsr->iNextOff, &p);
10296       if( rc==SQLITE_OK ){
10297         pCsr->iNextOff += ZIPFILE_CDS_FIXED_SZ;
10298         pCsr->iNextOff += (int)p->cds.nExtra + p->cds.nFile + p->cds.nComment;
10299       }
10300       pCsr->pCurrent = p;
10301     }
10302   }else{
10303     if( !pCsr->bNoop ){
10304       pCsr->pCurrent = pCsr->pCurrent->pNext;
10305     }
10306     if( pCsr->pCurrent==0 ){
10307       pCsr->bEof = 1;
10308     }
10309   }
10310 
10311   pCsr->bNoop = 0;
10312   return rc;
10313 }
10314 
zipfileFree(void * p)10315 static void zipfileFree(void *p) {
10316   sqlite3_free(p);
10317 }
10318 
10319 /*
10320 ** Buffer aIn (size nIn bytes) contains compressed data. Uncompressed, the
10321 ** size is nOut bytes. This function uncompresses the data and sets the
10322 ** return value in context pCtx to the result (a blob).
10323 **
10324 ** If an error occurs, an error code is left in pCtx instead.
10325 */
zipfileInflate(sqlite3_context * pCtx,const u8 * aIn,int nIn,int nOut)10326 static void zipfileInflate(
10327   sqlite3_context *pCtx,          /* Store result here */
10328   const u8 *aIn,                  /* Compressed data */
10329   int nIn,                        /* Size of buffer aIn[] in bytes */
10330   int nOut                        /* Expected output size */
10331 ){
10332   u8 *aRes = sqlite3_malloc(nOut);
10333   if( aRes==0 ){
10334     sqlite3_result_error_nomem(pCtx);
10335   }else{
10336     int err;
10337     z_stream str;
10338     memset(&str, 0, sizeof(str));
10339 
10340     str.next_in = (Byte*)aIn;
10341     str.avail_in = nIn;
10342     str.next_out = (Byte*)aRes;
10343     str.avail_out = nOut;
10344 
10345     err = inflateInit2(&str, -15);
10346     if( err!=Z_OK ){
10347       zipfileCtxErrorMsg(pCtx, "inflateInit2() failed (%d)", err);
10348     }else{
10349       err = inflate(&str, Z_NO_FLUSH);
10350       if( err!=Z_STREAM_END ){
10351         zipfileCtxErrorMsg(pCtx, "inflate() failed (%d)", err);
10352       }else{
10353         sqlite3_result_blob(pCtx, aRes, nOut, zipfileFree);
10354         aRes = 0;
10355       }
10356     }
10357     sqlite3_free(aRes);
10358     inflateEnd(&str);
10359   }
10360 }
10361 
10362 /*
10363 ** Buffer aIn (size nIn bytes) contains uncompressed data. This function
10364 ** compresses it and sets (*ppOut) to point to a buffer containing the
10365 ** compressed data. The caller is responsible for eventually calling
10366 ** sqlite3_free() to release buffer (*ppOut). Before returning, (*pnOut)
10367 ** is set to the size of buffer (*ppOut) in bytes.
10368 **
10369 ** If no error occurs, SQLITE_OK is returned. Otherwise, an SQLite error
10370 ** code is returned and an error message left in virtual-table handle
10371 ** pTab. The values of (*ppOut) and (*pnOut) are left unchanged in this
10372 ** case.
10373 */
zipfileDeflate(const u8 * aIn,int nIn,u8 ** ppOut,int * pnOut,char ** pzErr)10374 static int zipfileDeflate(
10375   const u8 *aIn, int nIn,         /* Input */
10376   u8 **ppOut, int *pnOut,         /* Output */
10377   char **pzErr                    /* OUT: Error message */
10378 ){
10379   int rc = SQLITE_OK;
10380   sqlite3_int64 nAlloc;
10381   z_stream str;
10382   u8 *aOut;
10383 
10384   memset(&str, 0, sizeof(str));
10385   str.next_in = (Bytef*)aIn;
10386   str.avail_in = nIn;
10387   deflateInit2(&str, 9, Z_DEFLATED, -15, 8, Z_DEFAULT_STRATEGY);
10388 
10389   nAlloc = deflateBound(&str, nIn);
10390   aOut = (u8*)sqlite3_malloc64(nAlloc);
10391   if( aOut==0 ){
10392     rc = SQLITE_NOMEM;
10393   }else{
10394     int res;
10395     str.next_out = aOut;
10396     str.avail_out = nAlloc;
10397     res = deflate(&str, Z_FINISH);
10398     if( res==Z_STREAM_END ){
10399       *ppOut = aOut;
10400       *pnOut = (int)str.total_out;
10401     }else{
10402       sqlite3_free(aOut);
10403       *pzErr = sqlite3_mprintf("zipfile: deflate() error");
10404       rc = SQLITE_ERROR;
10405     }
10406     deflateEnd(&str);
10407   }
10408 
10409   return rc;
10410 }
10411 
10412 
10413 /*
10414 ** Return values of columns for the row at which the series_cursor
10415 ** is currently pointing.
10416 */
zipfileColumn(sqlite3_vtab_cursor * cur,sqlite3_context * ctx,int i)10417 static int zipfileColumn(
10418   sqlite3_vtab_cursor *cur,   /* The cursor */
10419   sqlite3_context *ctx,       /* First argument to sqlite3_result_...() */
10420   int i                       /* Which column to return */
10421 ){
10422   ZipfileCsr *pCsr = (ZipfileCsr*)cur;
10423   ZipfileCDS *pCDS = &pCsr->pCurrent->cds;
10424   int rc = SQLITE_OK;
10425   switch( i ){
10426     case 0:   /* name */
10427       sqlite3_result_text(ctx, pCDS->zFile, -1, SQLITE_TRANSIENT);
10428       break;
10429     case 1:   /* mode */
10430       /* TODO: Whether or not the following is correct surely depends on
10431       ** the platform on which the archive was created.  */
10432       sqlite3_result_int(ctx, pCDS->iExternalAttr >> 16);
10433       break;
10434     case 2: { /* mtime */
10435       sqlite3_result_int64(ctx, pCsr->pCurrent->mUnixTime);
10436       break;
10437     }
10438     case 3: { /* sz */
10439       if( sqlite3_vtab_nochange(ctx)==0 ){
10440         sqlite3_result_int64(ctx, pCDS->szUncompressed);
10441       }
10442       break;
10443     }
10444     case 4:   /* rawdata */
10445       if( sqlite3_vtab_nochange(ctx) ) break;
10446     case 5: { /* data */
10447       if( i==4 || pCDS->iCompression==0 || pCDS->iCompression==8 ){
10448         int sz = pCDS->szCompressed;
10449         int szFinal = pCDS->szUncompressed;
10450         if( szFinal>0 ){
10451           u8 *aBuf;
10452           u8 *aFree = 0;
10453           if( pCsr->pCurrent->aData ){
10454             aBuf = pCsr->pCurrent->aData;
10455           }else{
10456             aBuf = aFree = sqlite3_malloc64(sz);
10457             if( aBuf==0 ){
10458               rc = SQLITE_NOMEM;
10459             }else{
10460               FILE *pFile = pCsr->pFile;
10461               if( pFile==0 ){
10462                 pFile = ((ZipfileTab*)(pCsr->base.pVtab))->pWriteFd;
10463               }
10464               rc = zipfileReadData(pFile, aBuf, sz, pCsr->pCurrent->iDataOff,
10465                   &pCsr->base.pVtab->zErrMsg
10466               );
10467             }
10468           }
10469           if( rc==SQLITE_OK ){
10470             if( i==5 && pCDS->iCompression ){
10471               zipfileInflate(ctx, aBuf, sz, szFinal);
10472             }else{
10473               sqlite3_result_blob(ctx, aBuf, sz, SQLITE_TRANSIENT);
10474             }
10475           }
10476           sqlite3_free(aFree);
10477         }else{
10478           /* Figure out if this is a directory or a zero-sized file. Consider
10479           ** it to be a directory either if the mode suggests so, or if
10480           ** the final character in the name is '/'.  */
10481           u32 mode = pCDS->iExternalAttr >> 16;
10482           if( !(mode & S_IFDIR)
10483            && pCDS->nFile>=1
10484            && pCDS->zFile[pCDS->nFile-1]!='/'
10485           ){
10486             sqlite3_result_blob(ctx, "", 0, SQLITE_STATIC);
10487           }
10488         }
10489       }
10490       break;
10491     }
10492     case 6:   /* method */
10493       sqlite3_result_int(ctx, pCDS->iCompression);
10494       break;
10495     default:  /* z */
10496       assert( i==7 );
10497       sqlite3_result_int64(ctx, pCsr->iId);
10498       break;
10499   }
10500 
10501   return rc;
10502 }
10503 
10504 /*
10505 ** Return TRUE if the cursor is at EOF.
10506 */
zipfileEof(sqlite3_vtab_cursor * cur)10507 static int zipfileEof(sqlite3_vtab_cursor *cur){
10508   ZipfileCsr *pCsr = (ZipfileCsr*)cur;
10509   return pCsr->bEof;
10510 }
10511 
10512 /*
10513 ** If aBlob is not NULL, then it points to a buffer nBlob bytes in size
10514 ** containing an entire zip archive image. Or, if aBlob is NULL, then pFile
10515 ** is guaranteed to be a file-handle open on a zip file.
10516 **
10517 ** This function attempts to locate the EOCD record within the zip archive
10518 ** and populate *pEOCD with the results of decoding it. SQLITE_OK is
10519 ** returned if successful. Otherwise, an SQLite error code is returned and
10520 ** an English language error message may be left in virtual-table pTab.
10521 */
zipfileReadEOCD(ZipfileTab * pTab,const u8 * aBlob,int nBlob,FILE * pFile,ZipfileEOCD * pEOCD)10522 static int zipfileReadEOCD(
10523   ZipfileTab *pTab,               /* Return errors here */
10524   const u8 *aBlob,                /* Pointer to in-memory file image */
10525   int nBlob,                      /* Size of aBlob[] in bytes */
10526   FILE *pFile,                    /* Read from this file if aBlob==0 */
10527   ZipfileEOCD *pEOCD              /* Object to populate */
10528 ){
10529   u8 *aRead = pTab->aBuffer;      /* Temporary buffer */
10530   int nRead;                      /* Bytes to read from file */
10531   int rc = SQLITE_OK;
10532 
10533   memset(pEOCD, 0, sizeof(ZipfileEOCD));
10534   if( aBlob==0 ){
10535     i64 iOff;                     /* Offset to read from */
10536     i64 szFile;                   /* Total size of file in bytes */
10537     fseek(pFile, 0, SEEK_END);
10538     szFile = (i64)ftell(pFile);
10539     if( szFile==0 ){
10540       return SQLITE_OK;
10541     }
10542     nRead = (int)(MIN(szFile, ZIPFILE_BUFFER_SIZE));
10543     iOff = szFile - nRead;
10544     rc = zipfileReadData(pFile, aRead, nRead, iOff, &pTab->base.zErrMsg);
10545   }else{
10546     nRead = (int)(MIN(nBlob, ZIPFILE_BUFFER_SIZE));
10547     aRead = (u8*)&aBlob[nBlob-nRead];
10548   }
10549 
10550   if( rc==SQLITE_OK ){
10551     int i;
10552 
10553     /* Scan backwards looking for the signature bytes */
10554     for(i=nRead-20; i>=0; i--){
10555       if( aRead[i]==0x50 && aRead[i+1]==0x4b
10556        && aRead[i+2]==0x05 && aRead[i+3]==0x06
10557       ){
10558         break;
10559       }
10560     }
10561     if( i<0 ){
10562       pTab->base.zErrMsg = sqlite3_mprintf(
10563           "cannot find end of central directory record"
10564       );
10565       return SQLITE_ERROR;
10566     }
10567 
10568     aRead += i+4;
10569     pEOCD->iDisk = zipfileRead16(aRead);
10570     pEOCD->iFirstDisk = zipfileRead16(aRead);
10571     pEOCD->nEntry = zipfileRead16(aRead);
10572     pEOCD->nEntryTotal = zipfileRead16(aRead);
10573     pEOCD->nSize = zipfileRead32(aRead);
10574     pEOCD->iOffset = zipfileRead32(aRead);
10575   }
10576 
10577   return rc;
10578 }
10579 
10580 /*
10581 ** Add object pNew to the linked list that begins at ZipfileTab.pFirstEntry
10582 ** and ends with pLastEntry. If argument pBefore is NULL, then pNew is added
10583 ** to the end of the list. Otherwise, it is added to the list immediately
10584 ** before pBefore (which is guaranteed to be a part of said list).
10585 */
zipfileAddEntry(ZipfileTab * pTab,ZipfileEntry * pBefore,ZipfileEntry * pNew)10586 static void zipfileAddEntry(
10587   ZipfileTab *pTab,
10588   ZipfileEntry *pBefore,
10589   ZipfileEntry *pNew
10590 ){
10591   assert( (pTab->pFirstEntry==0)==(pTab->pLastEntry==0) );
10592   assert( pNew->pNext==0 );
10593   if( pBefore==0 ){
10594     if( pTab->pFirstEntry==0 ){
10595       pTab->pFirstEntry = pTab->pLastEntry = pNew;
10596     }else{
10597       assert( pTab->pLastEntry->pNext==0 );
10598       pTab->pLastEntry->pNext = pNew;
10599       pTab->pLastEntry = pNew;
10600     }
10601   }else{
10602     ZipfileEntry **pp;
10603     for(pp=&pTab->pFirstEntry; *pp!=pBefore; pp=&((*pp)->pNext));
10604     pNew->pNext = pBefore;
10605     *pp = pNew;
10606   }
10607 }
10608 
zipfileLoadDirectory(ZipfileTab * pTab,const u8 * aBlob,int nBlob)10609 static int zipfileLoadDirectory(ZipfileTab *pTab, const u8 *aBlob, int nBlob){
10610   ZipfileEOCD eocd;
10611   int rc;
10612   int i;
10613   i64 iOff;
10614 
10615   rc = zipfileReadEOCD(pTab, aBlob, nBlob, pTab->pWriteFd, &eocd);
10616   iOff = eocd.iOffset;
10617   for(i=0; rc==SQLITE_OK && i<eocd.nEntry; i++){
10618     ZipfileEntry *pNew = 0;
10619     rc = zipfileGetEntry(pTab, aBlob, nBlob, pTab->pWriteFd, iOff, &pNew);
10620 
10621     if( rc==SQLITE_OK ){
10622       zipfileAddEntry(pTab, 0, pNew);
10623       iOff += ZIPFILE_CDS_FIXED_SZ;
10624       iOff += (int)pNew->cds.nExtra + pNew->cds.nFile + pNew->cds.nComment;
10625     }
10626   }
10627   return rc;
10628 }
10629 
10630 /*
10631 ** xFilter callback.
10632 */
zipfileFilter(sqlite3_vtab_cursor * cur,int idxNum,const char * idxStr,int argc,sqlite3_value ** argv)10633 static int zipfileFilter(
10634   sqlite3_vtab_cursor *cur,
10635   int idxNum, const char *idxStr,
10636   int argc, sqlite3_value **argv
10637 ){
10638   ZipfileTab *pTab = (ZipfileTab*)cur->pVtab;
10639   ZipfileCsr *pCsr = (ZipfileCsr*)cur;
10640   const char *zFile = 0;          /* Zip file to scan */
10641   int rc = SQLITE_OK;             /* Return Code */
10642   int bInMemory = 0;              /* True for an in-memory zipfile */
10643 
10644   (void)idxStr;
10645   (void)argc;
10646 
10647   zipfileResetCursor(pCsr);
10648 
10649   if( pTab->zFile ){
10650     zFile = pTab->zFile;
10651   }else if( idxNum==0 ){
10652     zipfileCursorErr(pCsr, "zipfile() function requires an argument");
10653     return SQLITE_ERROR;
10654   }else if( sqlite3_value_type(argv[0])==SQLITE_BLOB ){
10655     static const u8 aEmptyBlob = 0;
10656     const u8 *aBlob = (const u8*)sqlite3_value_blob(argv[0]);
10657     int nBlob = sqlite3_value_bytes(argv[0]);
10658     assert( pTab->pFirstEntry==0 );
10659     if( aBlob==0 ){
10660       aBlob = &aEmptyBlob;
10661       nBlob = 0;
10662     }
10663     rc = zipfileLoadDirectory(pTab, aBlob, nBlob);
10664     pCsr->pFreeEntry = pTab->pFirstEntry;
10665     pTab->pFirstEntry = pTab->pLastEntry = 0;
10666     if( rc!=SQLITE_OK ) return rc;
10667     bInMemory = 1;
10668   }else{
10669     zFile = (const char*)sqlite3_value_text(argv[0]);
10670   }
10671 
10672   if( 0==pTab->pWriteFd && 0==bInMemory ){
10673     pCsr->pFile = zFile ? fopen(zFile, "rb") : 0;
10674     if( pCsr->pFile==0 ){
10675       zipfileCursorErr(pCsr, "cannot open file: %s", zFile);
10676       rc = SQLITE_ERROR;
10677     }else{
10678       rc = zipfileReadEOCD(pTab, 0, 0, pCsr->pFile, &pCsr->eocd);
10679       if( rc==SQLITE_OK ){
10680         if( pCsr->eocd.nEntry==0 ){
10681           pCsr->bEof = 1;
10682         }else{
10683           pCsr->iNextOff = pCsr->eocd.iOffset;
10684           rc = zipfileNext(cur);
10685         }
10686       }
10687     }
10688   }else{
10689     pCsr->bNoop = 1;
10690     pCsr->pCurrent = pCsr->pFreeEntry ? pCsr->pFreeEntry : pTab->pFirstEntry;
10691     rc = zipfileNext(cur);
10692   }
10693 
10694   return rc;
10695 }
10696 
10697 /*
10698 ** xBestIndex callback.
10699 */
zipfileBestIndex(sqlite3_vtab * tab,sqlite3_index_info * pIdxInfo)10700 static int zipfileBestIndex(
10701   sqlite3_vtab *tab,
10702   sqlite3_index_info *pIdxInfo
10703 ){
10704   int i;
10705   int idx = -1;
10706   int unusable = 0;
10707   (void)tab;
10708 
10709   for(i=0; i<pIdxInfo->nConstraint; i++){
10710     const struct sqlite3_index_constraint *pCons = &pIdxInfo->aConstraint[i];
10711     if( pCons->iColumn!=ZIPFILE_F_COLUMN_IDX ) continue;
10712     if( pCons->usable==0 ){
10713       unusable = 1;
10714     }else if( pCons->op==SQLITE_INDEX_CONSTRAINT_EQ ){
10715       idx = i;
10716     }
10717   }
10718   pIdxInfo->estimatedCost = 1000.0;
10719   if( idx>=0 ){
10720     pIdxInfo->aConstraintUsage[idx].argvIndex = 1;
10721     pIdxInfo->aConstraintUsage[idx].omit = 1;
10722     pIdxInfo->idxNum = 1;
10723   }else if( unusable ){
10724     return SQLITE_CONSTRAINT;
10725   }
10726   return SQLITE_OK;
10727 }
10728 
zipfileNewEntry(const char * zPath)10729 static ZipfileEntry *zipfileNewEntry(const char *zPath){
10730   ZipfileEntry *pNew;
10731   pNew = sqlite3_malloc(sizeof(ZipfileEntry));
10732   if( pNew ){
10733     memset(pNew, 0, sizeof(ZipfileEntry));
10734     pNew->cds.zFile = sqlite3_mprintf("%s", zPath);
10735     if( pNew->cds.zFile==0 ){
10736       sqlite3_free(pNew);
10737       pNew = 0;
10738     }
10739   }
10740   return pNew;
10741 }
10742 
zipfileSerializeLFH(ZipfileEntry * pEntry,u8 * aBuf)10743 static int zipfileSerializeLFH(ZipfileEntry *pEntry, u8 *aBuf){
10744   ZipfileCDS *pCds = &pEntry->cds;
10745   u8 *a = aBuf;
10746 
10747   pCds->nExtra = 9;
10748 
10749   /* Write the LFH itself */
10750   zipfileWrite32(a, ZIPFILE_SIGNATURE_LFH);
10751   zipfileWrite16(a, pCds->iVersionExtract);
10752   zipfileWrite16(a, pCds->flags);
10753   zipfileWrite16(a, pCds->iCompression);
10754   zipfileWrite16(a, pCds->mTime);
10755   zipfileWrite16(a, pCds->mDate);
10756   zipfileWrite32(a, pCds->crc32);
10757   zipfileWrite32(a, pCds->szCompressed);
10758   zipfileWrite32(a, pCds->szUncompressed);
10759   zipfileWrite16(a, (u16)pCds->nFile);
10760   zipfileWrite16(a, pCds->nExtra);
10761   assert( a==&aBuf[ZIPFILE_LFH_FIXED_SZ] );
10762 
10763   /* Add the file name */
10764   memcpy(a, pCds->zFile, (int)pCds->nFile);
10765   a += (int)pCds->nFile;
10766 
10767   /* The "extra" data */
10768   zipfileWrite16(a, ZIPFILE_EXTRA_TIMESTAMP);
10769   zipfileWrite16(a, 5);
10770   *a++ = 0x01;
10771   zipfileWrite32(a, pEntry->mUnixTime);
10772 
10773   return a-aBuf;
10774 }
10775 
zipfileAppendEntry(ZipfileTab * pTab,ZipfileEntry * pEntry,const u8 * pData,int nData)10776 static int zipfileAppendEntry(
10777   ZipfileTab *pTab,
10778   ZipfileEntry *pEntry,
10779   const u8 *pData,
10780   int nData
10781 ){
10782   u8 *aBuf = pTab->aBuffer;
10783   int nBuf;
10784   int rc;
10785 
10786   nBuf = zipfileSerializeLFH(pEntry, aBuf);
10787   rc = zipfileAppendData(pTab, aBuf, nBuf);
10788   if( rc==SQLITE_OK ){
10789     pEntry->iDataOff = pTab->szCurrent;
10790     rc = zipfileAppendData(pTab, pData, nData);
10791   }
10792 
10793   return rc;
10794 }
10795 
zipfileGetMode(sqlite3_value * pVal,int bIsDir,u32 * pMode,char ** pzErr)10796 static int zipfileGetMode(
10797   sqlite3_value *pVal,
10798   int bIsDir,                     /* If true, default to directory */
10799   u32 *pMode,                     /* OUT: Mode value */
10800   char **pzErr                    /* OUT: Error message */
10801 ){
10802   const char *z = (const char*)sqlite3_value_text(pVal);
10803   u32 mode = 0;
10804   if( z==0 ){
10805     mode = (bIsDir ? (S_IFDIR + 0755) : (S_IFREG + 0644));
10806   }else if( z[0]>='0' && z[0]<='9' ){
10807     mode = (unsigned int)sqlite3_value_int(pVal);
10808   }else{
10809     const char zTemplate[11] = "-rwxrwxrwx";
10810     int i;
10811     if( strlen(z)!=10 ) goto parse_error;
10812     switch( z[0] ){
10813       case '-': mode |= S_IFREG; break;
10814       case 'd': mode |= S_IFDIR; break;
10815       case 'l': mode |= S_IFLNK; break;
10816       default: goto parse_error;
10817     }
10818     for(i=1; i<10; i++){
10819       if( z[i]==zTemplate[i] ) mode |= 1 << (9-i);
10820       else if( z[i]!='-' ) goto parse_error;
10821     }
10822   }
10823   if( ((mode & S_IFDIR)==0)==bIsDir ){
10824     /* The "mode" attribute is a directory, but data has been specified.
10825     ** Or vice-versa - no data but "mode" is a file or symlink.  */
10826     *pzErr = sqlite3_mprintf("zipfile: mode does not match data");
10827     return SQLITE_CONSTRAINT;
10828   }
10829   *pMode = mode;
10830   return SQLITE_OK;
10831 
10832  parse_error:
10833   *pzErr = sqlite3_mprintf("zipfile: parse error in mode: %s", z);
10834   return SQLITE_ERROR;
10835 }
10836 
10837 /*
10838 ** Both (const char*) arguments point to nul-terminated strings. Argument
10839 ** nB is the value of strlen(zB). This function returns 0 if the strings are
10840 ** identical, ignoring any trailing '/' character in either path.  */
zipfileComparePath(const char * zA,const char * zB,int nB)10841 static int zipfileComparePath(const char *zA, const char *zB, int nB){
10842   int nA = (int)strlen(zA);
10843   if( nA>0 && zA[nA-1]=='/' ) nA--;
10844   if( nB>0 && zB[nB-1]=='/' ) nB--;
10845   if( nA==nB && memcmp(zA, zB, nA)==0 ) return 0;
10846   return 1;
10847 }
10848 
zipfileBegin(sqlite3_vtab * pVtab)10849 static int zipfileBegin(sqlite3_vtab *pVtab){
10850   ZipfileTab *pTab = (ZipfileTab*)pVtab;
10851   int rc = SQLITE_OK;
10852 
10853   assert( pTab->pWriteFd==0 );
10854   if( pTab->zFile==0 || pTab->zFile[0]==0 ){
10855     pTab->base.zErrMsg = sqlite3_mprintf("zipfile: missing filename");
10856     return SQLITE_ERROR;
10857   }
10858 
10859   /* Open a write fd on the file. Also load the entire central directory
10860   ** structure into memory. During the transaction any new file data is
10861   ** appended to the archive file, but the central directory is accumulated
10862   ** in main-memory until the transaction is committed.  */
10863   pTab->pWriteFd = fopen(pTab->zFile, "ab+");
10864   if( pTab->pWriteFd==0 ){
10865     pTab->base.zErrMsg = sqlite3_mprintf(
10866         "zipfile: failed to open file %s for writing", pTab->zFile
10867         );
10868     rc = SQLITE_ERROR;
10869   }else{
10870     fseek(pTab->pWriteFd, 0, SEEK_END);
10871     pTab->szCurrent = pTab->szOrig = (i64)ftell(pTab->pWriteFd);
10872     rc = zipfileLoadDirectory(pTab, 0, 0);
10873   }
10874 
10875   if( rc!=SQLITE_OK ){
10876     zipfileCleanupTransaction(pTab);
10877   }
10878 
10879   return rc;
10880 }
10881 
10882 /*
10883 ** Return the current time as a 32-bit timestamp in UNIX epoch format (like
10884 ** time(2)).
10885 */
zipfileTime(void)10886 static u32 zipfileTime(void){
10887   sqlite3_vfs *pVfs = sqlite3_vfs_find(0);
10888   u32 ret;
10889   if( pVfs==0 ) return 0;
10890   if( pVfs->iVersion>=2 && pVfs->xCurrentTimeInt64 ){
10891     i64 ms;
10892     pVfs->xCurrentTimeInt64(pVfs, &ms);
10893     ret = (u32)((ms/1000) - ((i64)24405875 * 8640));
10894   }else{
10895     double day;
10896     pVfs->xCurrentTime(pVfs, &day);
10897     ret = (u32)((day - 2440587.5) * 86400);
10898   }
10899   return ret;
10900 }
10901 
10902 /*
10903 ** Return a 32-bit timestamp in UNIX epoch format.
10904 **
10905 ** If the value passed as the only argument is either NULL or an SQL NULL,
10906 ** return the current time. Otherwise, return the value stored in (*pVal)
10907 ** cast to a 32-bit unsigned integer.
10908 */
zipfileGetTime(sqlite3_value * pVal)10909 static u32 zipfileGetTime(sqlite3_value *pVal){
10910   if( pVal==0 || sqlite3_value_type(pVal)==SQLITE_NULL ){
10911     return zipfileTime();
10912   }
10913   return (u32)sqlite3_value_int64(pVal);
10914 }
10915 
10916 /*
10917 ** Unless it is NULL, entry pOld is currently part of the pTab->pFirstEntry
10918 ** linked list.  Remove it from the list and free the object.
10919 */
zipfileRemoveEntryFromList(ZipfileTab * pTab,ZipfileEntry * pOld)10920 static void zipfileRemoveEntryFromList(ZipfileTab *pTab, ZipfileEntry *pOld){
10921   if( pOld ){
10922     if( pTab->pFirstEntry==pOld ){
10923       pTab->pFirstEntry = pOld->pNext;
10924       if( pTab->pLastEntry==pOld ) pTab->pLastEntry = 0;
10925     }else{
10926       ZipfileEntry *p;
10927       for(p=pTab->pFirstEntry; p; p=p->pNext){
10928         if( p->pNext==pOld ){
10929           p->pNext = pOld->pNext;
10930           if( pTab->pLastEntry==pOld ) pTab->pLastEntry = p;
10931           break;
10932         }
10933       }
10934     }
10935     zipfileEntryFree(pOld);
10936   }
10937 }
10938 
10939 /*
10940 ** xUpdate method.
10941 */
zipfileUpdate(sqlite3_vtab * pVtab,int nVal,sqlite3_value ** apVal,sqlite_int64 * pRowid)10942 static int zipfileUpdate(
10943   sqlite3_vtab *pVtab,
10944   int nVal,
10945   sqlite3_value **apVal,
10946   sqlite_int64 *pRowid
10947 ){
10948   ZipfileTab *pTab = (ZipfileTab*)pVtab;
10949   int rc = SQLITE_OK;             /* Return Code */
10950   ZipfileEntry *pNew = 0;         /* New in-memory CDS entry */
10951 
10952   u32 mode = 0;                   /* Mode for new entry */
10953   u32 mTime = 0;                  /* Modification time for new entry */
10954   i64 sz = 0;                     /* Uncompressed size */
10955   const char *zPath = 0;          /* Path for new entry */
10956   int nPath = 0;                  /* strlen(zPath) */
10957   const u8 *pData = 0;            /* Pointer to buffer containing content */
10958   int nData = 0;                  /* Size of pData buffer in bytes */
10959   int iMethod = 0;                /* Compression method for new entry */
10960   u8 *pFree = 0;                  /* Free this */
10961   char *zFree = 0;                /* Also free this */
10962   ZipfileEntry *pOld = 0;
10963   ZipfileEntry *pOld2 = 0;
10964   int bUpdate = 0;                /* True for an update that modifies "name" */
10965   int bIsDir = 0;
10966   u32 iCrc32 = 0;
10967 
10968   (void)pRowid;
10969 
10970   if( pTab->pWriteFd==0 ){
10971     rc = zipfileBegin(pVtab);
10972     if( rc!=SQLITE_OK ) return rc;
10973   }
10974 
10975   /* If this is a DELETE or UPDATE, find the archive entry to delete. */
10976   if( sqlite3_value_type(apVal[0])!=SQLITE_NULL ){
10977     const char *zDelete = (const char*)sqlite3_value_text(apVal[0]);
10978     int nDelete = (int)strlen(zDelete);
10979     if( nVal>1 ){
10980       const char *zUpdate = (const char*)sqlite3_value_text(apVal[1]);
10981       if( zUpdate && zipfileComparePath(zUpdate, zDelete, nDelete)!=0 ){
10982         bUpdate = 1;
10983       }
10984     }
10985     for(pOld=pTab->pFirstEntry; 1; pOld=pOld->pNext){
10986       if( zipfileComparePath(pOld->cds.zFile, zDelete, nDelete)==0 ){
10987         break;
10988       }
10989       assert( pOld->pNext );
10990     }
10991   }
10992 
10993   if( nVal>1 ){
10994     /* Check that "sz" and "rawdata" are both NULL: */
10995     if( sqlite3_value_type(apVal[5])!=SQLITE_NULL ){
10996       zipfileTableErr(pTab, "sz must be NULL");
10997       rc = SQLITE_CONSTRAINT;
10998     }
10999     if( sqlite3_value_type(apVal[6])!=SQLITE_NULL ){
11000       zipfileTableErr(pTab, "rawdata must be NULL");
11001       rc = SQLITE_CONSTRAINT;
11002     }
11003 
11004     if( rc==SQLITE_OK ){
11005       if( sqlite3_value_type(apVal[7])==SQLITE_NULL ){
11006         /* data=NULL. A directory */
11007         bIsDir = 1;
11008       }else{
11009         /* Value specified for "data", and possibly "method". This must be
11010         ** a regular file or a symlink. */
11011         const u8 *aIn = sqlite3_value_blob(apVal[7]);
11012         int nIn = sqlite3_value_bytes(apVal[7]);
11013         int bAuto = sqlite3_value_type(apVal[8])==SQLITE_NULL;
11014 
11015         iMethod = sqlite3_value_int(apVal[8]);
11016         sz = nIn;
11017         pData = aIn;
11018         nData = nIn;
11019         if( iMethod!=0 && iMethod!=8 ){
11020           zipfileTableErr(pTab, "unknown compression method: %d", iMethod);
11021           rc = SQLITE_CONSTRAINT;
11022         }else{
11023           if( bAuto || iMethod ){
11024             int nCmp;
11025             rc = zipfileDeflate(aIn, nIn, &pFree, &nCmp, &pTab->base.zErrMsg);
11026             if( rc==SQLITE_OK ){
11027               if( iMethod || nCmp<nIn ){
11028                 iMethod = 8;
11029                 pData = pFree;
11030                 nData = nCmp;
11031               }
11032             }
11033           }
11034           iCrc32 = crc32(0, aIn, nIn);
11035         }
11036       }
11037     }
11038 
11039     if( rc==SQLITE_OK ){
11040       rc = zipfileGetMode(apVal[3], bIsDir, &mode, &pTab->base.zErrMsg);
11041     }
11042 
11043     if( rc==SQLITE_OK ){
11044       zPath = (const char*)sqlite3_value_text(apVal[2]);
11045       if( zPath==0 ) zPath = "";
11046       nPath = (int)strlen(zPath);
11047       mTime = zipfileGetTime(apVal[4]);
11048     }
11049 
11050     if( rc==SQLITE_OK && bIsDir ){
11051       /* For a directory, check that the last character in the path is a
11052       ** '/'. This appears to be required for compatibility with info-zip
11053       ** (the unzip command on unix). It does not create directories
11054       ** otherwise.  */
11055       if( nPath<=0 || zPath[nPath-1]!='/' ){
11056         zFree = sqlite3_mprintf("%s/", zPath);
11057         zPath = (const char*)zFree;
11058         if( zFree==0 ){
11059           rc = SQLITE_NOMEM;
11060           nPath = 0;
11061         }else{
11062           nPath = (int)strlen(zPath);
11063         }
11064       }
11065     }
11066 
11067     /* Check that we're not inserting a duplicate entry -OR- updating an
11068     ** entry with a path, thereby making it into a duplicate. */
11069     if( (pOld==0 || bUpdate) && rc==SQLITE_OK ){
11070       ZipfileEntry *p;
11071       for(p=pTab->pFirstEntry; p; p=p->pNext){
11072         if( zipfileComparePath(p->cds.zFile, zPath, nPath)==0 ){
11073           switch( sqlite3_vtab_on_conflict(pTab->db) ){
11074             case SQLITE_IGNORE: {
11075               goto zipfile_update_done;
11076             }
11077             case SQLITE_REPLACE: {
11078               pOld2 = p;
11079               break;
11080             }
11081             default: {
11082               zipfileTableErr(pTab, "duplicate name: \"%s\"", zPath);
11083               rc = SQLITE_CONSTRAINT;
11084               break;
11085             }
11086           }
11087           break;
11088         }
11089       }
11090     }
11091 
11092     if( rc==SQLITE_OK ){
11093       /* Create the new CDS record. */
11094       pNew = zipfileNewEntry(zPath);
11095       if( pNew==0 ){
11096         rc = SQLITE_NOMEM;
11097       }else{
11098         pNew->cds.iVersionMadeBy = ZIPFILE_NEWENTRY_MADEBY;
11099         pNew->cds.iVersionExtract = ZIPFILE_NEWENTRY_REQUIRED;
11100         pNew->cds.flags = ZIPFILE_NEWENTRY_FLAGS;
11101         pNew->cds.iCompression = (u16)iMethod;
11102         zipfileMtimeToDos(&pNew->cds, mTime);
11103         pNew->cds.crc32 = iCrc32;
11104         pNew->cds.szCompressed = nData;
11105         pNew->cds.szUncompressed = (u32)sz;
11106         pNew->cds.iExternalAttr = (mode<<16);
11107         pNew->cds.iOffset = (u32)pTab->szCurrent;
11108         pNew->cds.nFile = (u16)nPath;
11109         pNew->mUnixTime = (u32)mTime;
11110         rc = zipfileAppendEntry(pTab, pNew, pData, nData);
11111         zipfileAddEntry(pTab, pOld, pNew);
11112       }
11113     }
11114   }
11115 
11116   if( rc==SQLITE_OK && (pOld || pOld2) ){
11117     ZipfileCsr *pCsr;
11118     for(pCsr=pTab->pCsrList; pCsr; pCsr=pCsr->pCsrNext){
11119       if( pCsr->pCurrent && (pCsr->pCurrent==pOld || pCsr->pCurrent==pOld2) ){
11120         pCsr->pCurrent = pCsr->pCurrent->pNext;
11121         pCsr->bNoop = 1;
11122       }
11123     }
11124 
11125     zipfileRemoveEntryFromList(pTab, pOld);
11126     zipfileRemoveEntryFromList(pTab, pOld2);
11127   }
11128 
11129 zipfile_update_done:
11130   sqlite3_free(pFree);
11131   sqlite3_free(zFree);
11132   return rc;
11133 }
11134 
zipfileSerializeEOCD(ZipfileEOCD * p,u8 * aBuf)11135 static int zipfileSerializeEOCD(ZipfileEOCD *p, u8 *aBuf){
11136   u8 *a = aBuf;
11137   zipfileWrite32(a, ZIPFILE_SIGNATURE_EOCD);
11138   zipfileWrite16(a, p->iDisk);
11139   zipfileWrite16(a, p->iFirstDisk);
11140   zipfileWrite16(a, p->nEntry);
11141   zipfileWrite16(a, p->nEntryTotal);
11142   zipfileWrite32(a, p->nSize);
11143   zipfileWrite32(a, p->iOffset);
11144   zipfileWrite16(a, 0);        /* Size of trailing comment in bytes*/
11145 
11146   return a-aBuf;
11147 }
11148 
zipfileAppendEOCD(ZipfileTab * pTab,ZipfileEOCD * p)11149 static int zipfileAppendEOCD(ZipfileTab *pTab, ZipfileEOCD *p){
11150   int nBuf = zipfileSerializeEOCD(p, pTab->aBuffer);
11151   assert( nBuf==ZIPFILE_EOCD_FIXED_SZ );
11152   return zipfileAppendData(pTab, pTab->aBuffer, nBuf);
11153 }
11154 
11155 /*
11156 ** Serialize the CDS structure into buffer aBuf[]. Return the number
11157 ** of bytes written.
11158 */
zipfileSerializeCDS(ZipfileEntry * pEntry,u8 * aBuf)11159 static int zipfileSerializeCDS(ZipfileEntry *pEntry, u8 *aBuf){
11160   u8 *a = aBuf;
11161   ZipfileCDS *pCDS = &pEntry->cds;
11162 
11163   if( pEntry->aExtra==0 ){
11164     pCDS->nExtra = 9;
11165   }
11166 
11167   zipfileWrite32(a, ZIPFILE_SIGNATURE_CDS);
11168   zipfileWrite16(a, pCDS->iVersionMadeBy);
11169   zipfileWrite16(a, pCDS->iVersionExtract);
11170   zipfileWrite16(a, pCDS->flags);
11171   zipfileWrite16(a, pCDS->iCompression);
11172   zipfileWrite16(a, pCDS->mTime);
11173   zipfileWrite16(a, pCDS->mDate);
11174   zipfileWrite32(a, pCDS->crc32);
11175   zipfileWrite32(a, pCDS->szCompressed);
11176   zipfileWrite32(a, pCDS->szUncompressed);
11177   assert( a==&aBuf[ZIPFILE_CDS_NFILE_OFF] );
11178   zipfileWrite16(a, pCDS->nFile);
11179   zipfileWrite16(a, pCDS->nExtra);
11180   zipfileWrite16(a, pCDS->nComment);
11181   zipfileWrite16(a, pCDS->iDiskStart);
11182   zipfileWrite16(a, pCDS->iInternalAttr);
11183   zipfileWrite32(a, pCDS->iExternalAttr);
11184   zipfileWrite32(a, pCDS->iOffset);
11185 
11186   memcpy(a, pCDS->zFile, pCDS->nFile);
11187   a += pCDS->nFile;
11188 
11189   if( pEntry->aExtra ){
11190     int n = (int)pCDS->nExtra + (int)pCDS->nComment;
11191     memcpy(a, pEntry->aExtra, n);
11192     a += n;
11193   }else{
11194     assert( pCDS->nExtra==9 );
11195     zipfileWrite16(a, ZIPFILE_EXTRA_TIMESTAMP);
11196     zipfileWrite16(a, 5);
11197     *a++ = 0x01;
11198     zipfileWrite32(a, pEntry->mUnixTime);
11199   }
11200 
11201   return a-aBuf;
11202 }
11203 
zipfileCommit(sqlite3_vtab * pVtab)11204 static int zipfileCommit(sqlite3_vtab *pVtab){
11205   ZipfileTab *pTab = (ZipfileTab*)pVtab;
11206   int rc = SQLITE_OK;
11207   if( pTab->pWriteFd ){
11208     i64 iOffset = pTab->szCurrent;
11209     ZipfileEntry *p;
11210     ZipfileEOCD eocd;
11211     int nEntry = 0;
11212 
11213     /* Write out all entries */
11214     for(p=pTab->pFirstEntry; rc==SQLITE_OK && p; p=p->pNext){
11215       int n = zipfileSerializeCDS(p, pTab->aBuffer);
11216       rc = zipfileAppendData(pTab, pTab->aBuffer, n);
11217       nEntry++;
11218     }
11219 
11220     /* Write out the EOCD record */
11221     eocd.iDisk = 0;
11222     eocd.iFirstDisk = 0;
11223     eocd.nEntry = (u16)nEntry;
11224     eocd.nEntryTotal = (u16)nEntry;
11225     eocd.nSize = (u32)(pTab->szCurrent - iOffset);
11226     eocd.iOffset = (u32)iOffset;
11227     rc = zipfileAppendEOCD(pTab, &eocd);
11228 
11229     zipfileCleanupTransaction(pTab);
11230   }
11231   return rc;
11232 }
11233 
zipfileRollback(sqlite3_vtab * pVtab)11234 static int zipfileRollback(sqlite3_vtab *pVtab){
11235   return zipfileCommit(pVtab);
11236 }
11237 
zipfileFindCursor(ZipfileTab * pTab,i64 iId)11238 static ZipfileCsr *zipfileFindCursor(ZipfileTab *pTab, i64 iId){
11239   ZipfileCsr *pCsr;
11240   for(pCsr=pTab->pCsrList; pCsr; pCsr=pCsr->pCsrNext){
11241     if( iId==pCsr->iId ) break;
11242   }
11243   return pCsr;
11244 }
11245 
zipfileFunctionCds(sqlite3_context * context,int argc,sqlite3_value ** argv)11246 static void zipfileFunctionCds(
11247   sqlite3_context *context,
11248   int argc,
11249   sqlite3_value **argv
11250 ){
11251   ZipfileCsr *pCsr;
11252   ZipfileTab *pTab = (ZipfileTab*)sqlite3_user_data(context);
11253   assert( argc>0 );
11254 
11255   pCsr = zipfileFindCursor(pTab, sqlite3_value_int64(argv[0]));
11256   if( pCsr ){
11257     ZipfileCDS *p = &pCsr->pCurrent->cds;
11258     char *zRes = sqlite3_mprintf("{"
11259         "\"version-made-by\" : %u, "
11260         "\"version-to-extract\" : %u, "
11261         "\"flags\" : %u, "
11262         "\"compression\" : %u, "
11263         "\"time\" : %u, "
11264         "\"date\" : %u, "
11265         "\"crc32\" : %u, "
11266         "\"compressed-size\" : %u, "
11267         "\"uncompressed-size\" : %u, "
11268         "\"file-name-length\" : %u, "
11269         "\"extra-field-length\" : %u, "
11270         "\"file-comment-length\" : %u, "
11271         "\"disk-number-start\" : %u, "
11272         "\"internal-attr\" : %u, "
11273         "\"external-attr\" : %u, "
11274         "\"offset\" : %u }",
11275         (u32)p->iVersionMadeBy, (u32)p->iVersionExtract,
11276         (u32)p->flags, (u32)p->iCompression,
11277         (u32)p->mTime, (u32)p->mDate,
11278         (u32)p->crc32, (u32)p->szCompressed,
11279         (u32)p->szUncompressed, (u32)p->nFile,
11280         (u32)p->nExtra, (u32)p->nComment,
11281         (u32)p->iDiskStart, (u32)p->iInternalAttr,
11282         (u32)p->iExternalAttr, (u32)p->iOffset
11283     );
11284 
11285     if( zRes==0 ){
11286       sqlite3_result_error_nomem(context);
11287     }else{
11288       sqlite3_result_text(context, zRes, -1, SQLITE_TRANSIENT);
11289       sqlite3_free(zRes);
11290     }
11291   }
11292 }
11293 
11294 /*
11295 ** xFindFunction method.
11296 */
zipfileFindFunction(sqlite3_vtab * pVtab,int nArg,const char * zName,void (** pxFunc)(sqlite3_context *,int,sqlite3_value **),void ** ppArg)11297 static int zipfileFindFunction(
11298   sqlite3_vtab *pVtab,            /* Virtual table handle */
11299   int nArg,                       /* Number of SQL function arguments */
11300   const char *zName,              /* Name of SQL function */
11301   void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), /* OUT: Result */
11302   void **ppArg                    /* OUT: User data for *pxFunc */
11303 ){
11304   (void)nArg;
11305   if( sqlite3_stricmp("zipfile_cds", zName)==0 ){
11306     *pxFunc = zipfileFunctionCds;
11307     *ppArg = (void*)pVtab;
11308     return 1;
11309   }
11310   return 0;
11311 }
11312 
11313 typedef struct ZipfileBuffer ZipfileBuffer;
11314 struct ZipfileBuffer {
11315   u8 *a;                          /* Pointer to buffer */
11316   int n;                          /* Size of buffer in bytes */
11317   int nAlloc;                     /* Byte allocated at a[] */
11318 };
11319 
11320 typedef struct ZipfileCtx ZipfileCtx;
11321 struct ZipfileCtx {
11322   int nEntry;
11323   ZipfileBuffer body;
11324   ZipfileBuffer cds;
11325 };
11326 
zipfileBufferGrow(ZipfileBuffer * pBuf,int nByte)11327 static int zipfileBufferGrow(ZipfileBuffer *pBuf, int nByte){
11328   if( pBuf->n+nByte>pBuf->nAlloc ){
11329     u8 *aNew;
11330     sqlite3_int64 nNew = pBuf->n ? pBuf->n*2 : 512;
11331     int nReq = pBuf->n + nByte;
11332 
11333     while( nNew<nReq ) nNew = nNew*2;
11334     aNew = sqlite3_realloc64(pBuf->a, nNew);
11335     if( aNew==0 ) return SQLITE_NOMEM;
11336     pBuf->a = aNew;
11337     pBuf->nAlloc = (int)nNew;
11338   }
11339   return SQLITE_OK;
11340 }
11341 
11342 /*
11343 ** xStep() callback for the zipfile() aggregate. This can be called in
11344 ** any of the following ways:
11345 **
11346 **   SELECT zipfile(name,data) ...
11347 **   SELECT zipfile(name,mode,mtime,data) ...
11348 **   SELECT zipfile(name,mode,mtime,data,method) ...
11349 */
zipfileStep(sqlite3_context * pCtx,int nVal,sqlite3_value ** apVal)11350 static void zipfileStep(sqlite3_context *pCtx, int nVal, sqlite3_value **apVal){
11351   ZipfileCtx *p;                  /* Aggregate function context */
11352   ZipfileEntry e;                 /* New entry to add to zip archive */
11353 
11354   sqlite3_value *pName = 0;
11355   sqlite3_value *pMode = 0;
11356   sqlite3_value *pMtime = 0;
11357   sqlite3_value *pData = 0;
11358   sqlite3_value *pMethod = 0;
11359 
11360   int bIsDir = 0;
11361   u32 mode;
11362   int rc = SQLITE_OK;
11363   char *zErr = 0;
11364 
11365   int iMethod = -1;               /* Compression method to use (0 or 8) */
11366 
11367   const u8 *aData = 0;            /* Possibly compressed data for new entry */
11368   int nData = 0;                  /* Size of aData[] in bytes */
11369   int szUncompressed = 0;         /* Size of data before compression */
11370   u8 *aFree = 0;                  /* Free this before returning */
11371   u32 iCrc32 = 0;                 /* crc32 of uncompressed data */
11372 
11373   char *zName = 0;                /* Path (name) of new entry */
11374   int nName = 0;                  /* Size of zName in bytes */
11375   char *zFree = 0;                /* Free this before returning */
11376   int nByte;
11377 
11378   memset(&e, 0, sizeof(e));
11379   p = (ZipfileCtx*)sqlite3_aggregate_context(pCtx, sizeof(ZipfileCtx));
11380   if( p==0 ) return;
11381 
11382   /* Martial the arguments into stack variables */
11383   if( nVal!=2 && nVal!=4 && nVal!=5 ){
11384     zErr = sqlite3_mprintf("wrong number of arguments to function zipfile()");
11385     rc = SQLITE_ERROR;
11386     goto zipfile_step_out;
11387   }
11388   pName = apVal[0];
11389   if( nVal==2 ){
11390     pData = apVal[1];
11391   }else{
11392     pMode = apVal[1];
11393     pMtime = apVal[2];
11394     pData = apVal[3];
11395     if( nVal==5 ){
11396       pMethod = apVal[4];
11397     }
11398   }
11399 
11400   /* Check that the 'name' parameter looks ok. */
11401   zName = (char*)sqlite3_value_text(pName);
11402   nName = sqlite3_value_bytes(pName);
11403   if( zName==0 ){
11404     zErr = sqlite3_mprintf("first argument to zipfile() must be non-NULL");
11405     rc = SQLITE_ERROR;
11406     goto zipfile_step_out;
11407   }
11408 
11409   /* Inspect the 'method' parameter. This must be either 0 (store), 8 (use
11410   ** deflate compression) or NULL (choose automatically).  */
11411   if( pMethod && SQLITE_NULL!=sqlite3_value_type(pMethod) ){
11412     iMethod = (int)sqlite3_value_int64(pMethod);
11413     if( iMethod!=0 && iMethod!=8 ){
11414       zErr = sqlite3_mprintf("illegal method value: %d", iMethod);
11415       rc = SQLITE_ERROR;
11416       goto zipfile_step_out;
11417     }
11418   }
11419 
11420   /* Now inspect the data. If this is NULL, then the new entry must be a
11421   ** directory.  Otherwise, figure out whether or not the data should
11422   ** be deflated or simply stored in the zip archive. */
11423   if( sqlite3_value_type(pData)==SQLITE_NULL ){
11424     bIsDir = 1;
11425     iMethod = 0;
11426   }else{
11427     aData = sqlite3_value_blob(pData);
11428     szUncompressed = nData = sqlite3_value_bytes(pData);
11429     iCrc32 = crc32(0, aData, nData);
11430     if( iMethod<0 || iMethod==8 ){
11431       int nOut = 0;
11432       rc = zipfileDeflate(aData, nData, &aFree, &nOut, &zErr);
11433       if( rc!=SQLITE_OK ){
11434         goto zipfile_step_out;
11435       }
11436       if( iMethod==8 || nOut<nData ){
11437         aData = aFree;
11438         nData = nOut;
11439         iMethod = 8;
11440       }else{
11441         iMethod = 0;
11442       }
11443     }
11444   }
11445 
11446   /* Decode the "mode" argument. */
11447   rc = zipfileGetMode(pMode, bIsDir, &mode, &zErr);
11448   if( rc ) goto zipfile_step_out;
11449 
11450   /* Decode the "mtime" argument. */
11451   e.mUnixTime = zipfileGetTime(pMtime);
11452 
11453   /* If this is a directory entry, ensure that there is exactly one '/'
11454   ** at the end of the path. Or, if this is not a directory and the path
11455   ** ends in '/' it is an error. */
11456   if( bIsDir==0 ){
11457     if( nName>0 && zName[nName-1]=='/' ){
11458       zErr = sqlite3_mprintf("non-directory name must not end with /");
11459       rc = SQLITE_ERROR;
11460       goto zipfile_step_out;
11461     }
11462   }else{
11463     if( nName==0 || zName[nName-1]!='/' ){
11464       zName = zFree = sqlite3_mprintf("%s/", zName);
11465       if( zName==0 ){
11466         rc = SQLITE_NOMEM;
11467         goto zipfile_step_out;
11468       }
11469       nName = (int)strlen(zName);
11470     }else{
11471       while( nName>1 && zName[nName-2]=='/' ) nName--;
11472     }
11473   }
11474 
11475   /* Assemble the ZipfileEntry object for the new zip archive entry */
11476   e.cds.iVersionMadeBy = ZIPFILE_NEWENTRY_MADEBY;
11477   e.cds.iVersionExtract = ZIPFILE_NEWENTRY_REQUIRED;
11478   e.cds.flags = ZIPFILE_NEWENTRY_FLAGS;
11479   e.cds.iCompression = (u16)iMethod;
11480   zipfileMtimeToDos(&e.cds, (u32)e.mUnixTime);
11481   e.cds.crc32 = iCrc32;
11482   e.cds.szCompressed = nData;
11483   e.cds.szUncompressed = szUncompressed;
11484   e.cds.iExternalAttr = (mode<<16);
11485   e.cds.iOffset = p->body.n;
11486   e.cds.nFile = (u16)nName;
11487   e.cds.zFile = zName;
11488 
11489   /* Append the LFH to the body of the new archive */
11490   nByte = ZIPFILE_LFH_FIXED_SZ + e.cds.nFile + 9;
11491   if( (rc = zipfileBufferGrow(&p->body, nByte)) ) goto zipfile_step_out;
11492   p->body.n += zipfileSerializeLFH(&e, &p->body.a[p->body.n]);
11493 
11494   /* Append the data to the body of the new archive */
11495   if( nData>0 ){
11496     if( (rc = zipfileBufferGrow(&p->body, nData)) ) goto zipfile_step_out;
11497     memcpy(&p->body.a[p->body.n], aData, nData);
11498     p->body.n += nData;
11499   }
11500 
11501   /* Append the CDS record to the directory of the new archive */
11502   nByte = ZIPFILE_CDS_FIXED_SZ + e.cds.nFile + 9;
11503   if( (rc = zipfileBufferGrow(&p->cds, nByte)) ) goto zipfile_step_out;
11504   p->cds.n += zipfileSerializeCDS(&e, &p->cds.a[p->cds.n]);
11505 
11506   /* Increment the count of entries in the archive */
11507   p->nEntry++;
11508 
11509  zipfile_step_out:
11510   sqlite3_free(aFree);
11511   sqlite3_free(zFree);
11512   if( rc ){
11513     if( zErr ){
11514       sqlite3_result_error(pCtx, zErr, -1);
11515     }else{
11516       sqlite3_result_error_code(pCtx, rc);
11517     }
11518   }
11519   sqlite3_free(zErr);
11520 }
11521 
11522 /*
11523 ** xFinalize() callback for zipfile aggregate function.
11524 */
zipfileFinal(sqlite3_context * pCtx)11525 static void zipfileFinal(sqlite3_context *pCtx){
11526   ZipfileCtx *p;
11527   ZipfileEOCD eocd;
11528   sqlite3_int64 nZip;
11529   u8 *aZip;
11530 
11531   p = (ZipfileCtx*)sqlite3_aggregate_context(pCtx, sizeof(ZipfileCtx));
11532   if( p==0 ) return;
11533   if( p->nEntry>0 ){
11534     memset(&eocd, 0, sizeof(eocd));
11535     eocd.nEntry = (u16)p->nEntry;
11536     eocd.nEntryTotal = (u16)p->nEntry;
11537     eocd.nSize = p->cds.n;
11538     eocd.iOffset = p->body.n;
11539 
11540     nZip = p->body.n + p->cds.n + ZIPFILE_EOCD_FIXED_SZ;
11541     aZip = (u8*)sqlite3_malloc64(nZip);
11542     if( aZip==0 ){
11543       sqlite3_result_error_nomem(pCtx);
11544     }else{
11545       memcpy(aZip, p->body.a, p->body.n);
11546       memcpy(&aZip[p->body.n], p->cds.a, p->cds.n);
11547       zipfileSerializeEOCD(&eocd, &aZip[p->body.n + p->cds.n]);
11548       sqlite3_result_blob(pCtx, aZip, (int)nZip, zipfileFree);
11549     }
11550   }
11551 
11552   sqlite3_free(p->body.a);
11553   sqlite3_free(p->cds.a);
11554 }
11555 
11556 
11557 /*
11558 ** Register the "zipfile" virtual table.
11559 */
zipfileRegister(sqlite3 * db)11560 static int zipfileRegister(sqlite3 *db){
11561   static sqlite3_module zipfileModule = {
11562     1,                         /* iVersion */
11563     zipfileConnect,            /* xCreate */
11564     zipfileConnect,            /* xConnect */
11565     zipfileBestIndex,          /* xBestIndex */
11566     zipfileDisconnect,         /* xDisconnect */
11567     zipfileDisconnect,         /* xDestroy */
11568     zipfileOpen,               /* xOpen - open a cursor */
11569     zipfileClose,              /* xClose - close a cursor */
11570     zipfileFilter,             /* xFilter - configure scan constraints */
11571     zipfileNext,               /* xNext - advance a cursor */
11572     zipfileEof,                /* xEof - check for end of scan */
11573     zipfileColumn,             /* xColumn - read data */
11574     0,                         /* xRowid - read data */
11575     zipfileUpdate,             /* xUpdate */
11576     zipfileBegin,              /* xBegin */
11577     0,                         /* xSync */
11578     zipfileCommit,             /* xCommit */
11579     zipfileRollback,           /* xRollback */
11580     zipfileFindFunction,       /* xFindMethod */
11581     0,                         /* xRename */
11582     0,                         /* xSavepoint */
11583     0,                         /* xRelease */
11584     0,                         /* xRollback */
11585     0,                         /* xShadowName */
11586     0                          /* xIntegrity */
11587   };
11588 
11589   int rc = sqlite3_create_module(db, "zipfile"  , &zipfileModule, 0);
11590   if( rc==SQLITE_OK ) rc = sqlite3_overload_function(db, "zipfile_cds", -1);
11591   if( rc==SQLITE_OK ){
11592     rc = sqlite3_create_function(db, "zipfile", -1, SQLITE_UTF8, 0, 0,
11593         zipfileStep, zipfileFinal
11594     );
11595   }
11596   assert( sizeof(i64)==8 );
11597   assert( sizeof(u32)==4 );
11598   assert( sizeof(u16)==2 );
11599   assert( sizeof(u8)==1 );
11600   return rc;
11601 }
11602 #else         /* SQLITE_OMIT_VIRTUALTABLE */
11603 # define zipfileRegister(x) SQLITE_OK
11604 #endif
11605 
11606 #ifdef _WIN32
11607 
11608 #endif
sqlite3_zipfile_init(sqlite3 * db,char ** pzErrMsg,const sqlite3_api_routines * pApi)11609 int sqlite3_zipfile_init(
11610   sqlite3 *db,
11611   char **pzErrMsg,
11612   const sqlite3_api_routines *pApi
11613 ){
11614   SQLITE_EXTENSION_INIT2(pApi);
11615   (void)pzErrMsg;  /* Unused parameter */
11616   return zipfileRegister(db);
11617 }
11618 
11619 /************************* End ../ext/misc/zipfile.c ********************/
11620 /************************* Begin ../ext/misc/sqlar.c ******************/
11621 /*
11622 ** 2017-12-17
11623 **
11624 ** The author disclaims copyright to this source code.  In place of
11625 ** a legal notice, here is a blessing:
11626 **
11627 **    May you do good and not evil.
11628 **    May you find forgiveness for yourself and forgive others.
11629 **    May you share freely, never taking more than you give.
11630 **
11631 ******************************************************************************
11632 **
11633 ** Utility functions sqlar_compress() and sqlar_uncompress(). Useful
11634 ** for working with sqlar archives and used by the shell tool's built-in
11635 ** sqlar support.
11636 */
11637 /* #include "sqlite3ext.h" */
11638 SQLITE_EXTENSION_INIT1
11639 #include <zlib.h>
11640 #include <assert.h>
11641 
11642 /*
11643 ** Implementation of the "sqlar_compress(X)" SQL function.
11644 **
11645 ** If the type of X is SQLITE_BLOB, and compressing that blob using
11646 ** zlib utility function compress() yields a smaller blob, return the
11647 ** compressed blob. Otherwise, return a copy of X.
11648 **
11649 ** SQLar uses the "zlib format" for compressed content.  The zlib format
11650 ** contains a two-byte identification header and a four-byte checksum at
11651 ** the end.  This is different from ZIP which uses the raw deflate format.
11652 **
11653 ** Future enhancements to SQLar might add support for new compression formats.
11654 ** If so, those new formats will be identified by alternative headers in the
11655 ** compressed data.
11656 */
sqlarCompressFunc(sqlite3_context * context,int argc,sqlite3_value ** argv)11657 static void sqlarCompressFunc(
11658   sqlite3_context *context,
11659   int argc,
11660   sqlite3_value **argv
11661 ){
11662   assert( argc==1 );
11663   if( sqlite3_value_type(argv[0])==SQLITE_BLOB ){
11664     const Bytef *pData = sqlite3_value_blob(argv[0]);
11665     uLong nData = sqlite3_value_bytes(argv[0]);
11666     uLongf nOut = compressBound(nData);
11667     Bytef *pOut;
11668 
11669     pOut = (Bytef*)sqlite3_malloc(nOut);
11670     if( pOut==0 ){
11671       sqlite3_result_error_nomem(context);
11672       return;
11673     }else{
11674       if( Z_OK!=compress(pOut, &nOut, pData, nData) ){
11675         sqlite3_result_error(context, "error in compress()", -1);
11676       }else if( nOut<nData ){
11677         sqlite3_result_blob(context, pOut, nOut, SQLITE_TRANSIENT);
11678       }else{
11679         sqlite3_result_value(context, argv[0]);
11680       }
11681       sqlite3_free(pOut);
11682     }
11683   }else{
11684     sqlite3_result_value(context, argv[0]);
11685   }
11686 }
11687 
11688 /*
11689 ** Implementation of the "sqlar_uncompress(X,SZ)" SQL function
11690 **
11691 ** Parameter SZ is interpreted as an integer. If it is less than or
11692 ** equal to zero, then this function returns a copy of X. Or, if
11693 ** SZ is equal to the size of X when interpreted as a blob, also
11694 ** return a copy of X. Otherwise, decompress blob X using zlib
11695 ** utility function uncompress() and return the results (another
11696 ** blob).
11697 */
sqlarUncompressFunc(sqlite3_context * context,int argc,sqlite3_value ** argv)11698 static void sqlarUncompressFunc(
11699   sqlite3_context *context,
11700   int argc,
11701   sqlite3_value **argv
11702 ){
11703   uLong nData;
11704   sqlite3_int64 sz;
11705 
11706   assert( argc==2 );
11707   sz = sqlite3_value_int(argv[1]);
11708 
11709   if( sz<=0 || sz==(nData = sqlite3_value_bytes(argv[0])) ){
11710     sqlite3_result_value(context, argv[0]);
11711   }else{
11712     uLongf szf = sz;
11713     const Bytef *pData= sqlite3_value_blob(argv[0]);
11714     Bytef *pOut = sqlite3_malloc(sz);
11715     if( pOut==0 ){
11716       sqlite3_result_error_nomem(context);
11717     }else if( Z_OK!=uncompress(pOut, &szf, pData, nData) ){
11718       sqlite3_result_error(context, "error in uncompress()", -1);
11719     }else{
11720       sqlite3_result_blob(context, pOut, szf, SQLITE_TRANSIENT);
11721     }
11722     sqlite3_free(pOut);
11723   }
11724 }
11725 
11726 #ifdef _WIN32
11727 
11728 #endif
sqlite3_sqlar_init(sqlite3 * db,char ** pzErrMsg,const sqlite3_api_routines * pApi)11729 int sqlite3_sqlar_init(
11730   sqlite3 *db,
11731   char **pzErrMsg,
11732   const sqlite3_api_routines *pApi
11733 ){
11734   int rc = SQLITE_OK;
11735   SQLITE_EXTENSION_INIT2(pApi);
11736   (void)pzErrMsg;  /* Unused parameter */
11737   rc = sqlite3_create_function(db, "sqlar_compress", 1,
11738                                SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
11739                                sqlarCompressFunc, 0, 0);
11740   if( rc==SQLITE_OK ){
11741     rc = sqlite3_create_function(db, "sqlar_uncompress", 2,
11742                                  SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
11743                                  sqlarUncompressFunc, 0, 0);
11744   }
11745   return rc;
11746 }
11747 
11748 /************************* End ../ext/misc/sqlar.c ********************/
11749 #endif
11750 /************************* Begin ../ext/expert/sqlite3expert.h ******************/
11751 /*
11752 ** 2017 April 07
11753 **
11754 ** The author disclaims copyright to this source code.  In place of
11755 ** a legal notice, here is a blessing:
11756 **
11757 **    May you do good and not evil.
11758 **    May you find forgiveness for yourself and forgive others.
11759 **    May you share freely, never taking more than you give.
11760 **
11761 *************************************************************************
11762 */
11763 #if !defined(SQLITEEXPERT_H)
11764 #define SQLITEEXPERT_H 1
11765 /* #include "sqlite3.h" */
11766 
11767 typedef struct sqlite3expert sqlite3expert;
11768 
11769 /*
11770 ** Create a new sqlite3expert object.
11771 **
11772 ** If successful, a pointer to the new object is returned and (*pzErr) set
11773 ** to NULL. Or, if an error occurs, NULL is returned and (*pzErr) set to
11774 ** an English-language error message. In this case it is the responsibility
11775 ** of the caller to eventually free the error message buffer using
11776 ** sqlite3_free().
11777 */
11778 sqlite3expert *sqlite3_expert_new(sqlite3 *db, char **pzErr);
11779 
11780 /*
11781 ** Configure an sqlite3expert object.
11782 **
11783 ** EXPERT_CONFIG_SAMPLE:
11784 **   By default, sqlite3_expert_analyze() generates sqlite_stat1 data for
11785 **   each candidate index. This involves scanning and sorting the entire
11786 **   contents of each user database table once for each candidate index
11787 **   associated with the table. For large databases, this can be
11788 **   prohibitively slow. This option allows the sqlite3expert object to
11789 **   be configured so that sqlite_stat1 data is instead generated based on a
11790 **   subset of each table, or so that no sqlite_stat1 data is used at all.
11791 **
11792 **   A single integer argument is passed to this option. If the value is less
11793 **   than or equal to zero, then no sqlite_stat1 data is generated or used by
11794 **   the analysis - indexes are recommended based on the database schema only.
11795 **   Or, if the value is 100 or greater, complete sqlite_stat1 data is
11796 **   generated for each candidate index (this is the default). Finally, if the
11797 **   value falls between 0 and 100, then it represents the percentage of user
11798 **   table rows that should be considered when generating sqlite_stat1 data.
11799 **
11800 **   Examples:
11801 **
11802 **     // Do not generate any sqlite_stat1 data
11803 **     sqlite3_expert_config(pExpert, EXPERT_CONFIG_SAMPLE, 0);
11804 **
11805 **     // Generate sqlite_stat1 data based on 10% of the rows in each table.
11806 **     sqlite3_expert_config(pExpert, EXPERT_CONFIG_SAMPLE, 10);
11807 */
11808 int sqlite3_expert_config(sqlite3expert *p, int op, ...);
11809 
11810 #define EXPERT_CONFIG_SAMPLE 1    /* int */
11811 
11812 /*
11813 ** Specify zero or more SQL statements to be included in the analysis.
11814 **
11815 ** Buffer zSql must contain zero or more complete SQL statements. This
11816 ** function parses all statements contained in the buffer and adds them
11817 ** to the internal list of statements to analyze. If successful, SQLITE_OK
11818 ** is returned and (*pzErr) set to NULL. Or, if an error occurs - for example
11819 ** due to a error in the SQL - an SQLite error code is returned and (*pzErr)
11820 ** may be set to point to an English language error message. In this case
11821 ** the caller is responsible for eventually freeing the error message buffer
11822 ** using sqlite3_free().
11823 **
11824 ** If an error does occur while processing one of the statements in the
11825 ** buffer passed as the second argument, none of the statements in the
11826 ** buffer are added to the analysis.
11827 **
11828 ** This function must be called before sqlite3_expert_analyze(). If a call
11829 ** to this function is made on an sqlite3expert object that has already
11830 ** been passed to sqlite3_expert_analyze() SQLITE_MISUSE is returned
11831 ** immediately and no statements are added to the analysis.
11832 */
11833 int sqlite3_expert_sql(
11834   sqlite3expert *p,               /* From a successful sqlite3_expert_new() */
11835   const char *zSql,               /* SQL statement(s) to add */
11836   char **pzErr                    /* OUT: Error message (if any) */
11837 );
11838 
11839 
11840 /*
11841 ** This function is called after the sqlite3expert object has been configured
11842 ** with all SQL statements using sqlite3_expert_sql() to actually perform
11843 ** the analysis. Once this function has been called, it is not possible to
11844 ** add further SQL statements to the analysis.
11845 **
11846 ** If successful, SQLITE_OK is returned and (*pzErr) is set to NULL. Or, if
11847 ** an error occurs, an SQLite error code is returned and (*pzErr) set to
11848 ** point to a buffer containing an English language error message. In this
11849 ** case it is the responsibility of the caller to eventually free the buffer
11850 ** using sqlite3_free().
11851 **
11852 ** If an error does occur within this function, the sqlite3expert object
11853 ** is no longer useful for any purpose. At that point it is no longer
11854 ** possible to add further SQL statements to the object or to re-attempt
11855 ** the analysis. The sqlite3expert object must still be freed using a call
11856 ** sqlite3_expert_destroy().
11857 */
11858 int sqlite3_expert_analyze(sqlite3expert *p, char **pzErr);
11859 
11860 /*
11861 ** Return the total number of statements loaded using sqlite3_expert_sql().
11862 ** The total number of SQL statements may be different from the total number
11863 ** to calls to sqlite3_expert_sql().
11864 */
11865 int sqlite3_expert_count(sqlite3expert*);
11866 
11867 /*
11868 ** Return a component of the report.
11869 **
11870 ** This function is called after sqlite3_expert_analyze() to extract the
11871 ** results of the analysis. Each call to this function returns either a
11872 ** NULL pointer or a pointer to a buffer containing a nul-terminated string.
11873 ** The value passed as the third argument must be one of the EXPERT_REPORT_*
11874 ** #define constants defined below.
11875 **
11876 ** For some EXPERT_REPORT_* parameters, the buffer returned contains
11877 ** information relating to a specific SQL statement. In these cases that
11878 ** SQL statement is identified by the value passed as the second argument.
11879 ** SQL statements are numbered from 0 in the order in which they are parsed.
11880 ** If an out-of-range value (less than zero or equal to or greater than the
11881 ** value returned by sqlite3_expert_count()) is passed as the second argument
11882 ** along with such an EXPERT_REPORT_* parameter, NULL is always returned.
11883 **
11884 ** EXPERT_REPORT_SQL:
11885 **   Return the text of SQL statement iStmt.
11886 **
11887 ** EXPERT_REPORT_INDEXES:
11888 **   Return a buffer containing the CREATE INDEX statements for all recommended
11889 **   indexes for statement iStmt. If there are no new recommeded indexes, NULL
11890 **   is returned.
11891 **
11892 ** EXPERT_REPORT_PLAN:
11893 **   Return a buffer containing the EXPLAIN QUERY PLAN output for SQL query
11894 **   iStmt after the proposed indexes have been added to the database schema.
11895 **
11896 ** EXPERT_REPORT_CANDIDATES:
11897 **   Return a pointer to a buffer containing the CREATE INDEX statements
11898 **   for all indexes that were tested (for all SQL statements). The iStmt
11899 **   parameter is ignored for EXPERT_REPORT_CANDIDATES calls.
11900 */
11901 const char *sqlite3_expert_report(sqlite3expert*, int iStmt, int eReport);
11902 
11903 /*
11904 ** Values for the third argument passed to sqlite3_expert_report().
11905 */
11906 #define EXPERT_REPORT_SQL        1
11907 #define EXPERT_REPORT_INDEXES    2
11908 #define EXPERT_REPORT_PLAN       3
11909 #define EXPERT_REPORT_CANDIDATES 4
11910 
11911 /*
11912 ** Free an (sqlite3expert*) handle and all associated resources. There
11913 ** should be one call to this function for each successful call to
11914 ** sqlite3-expert_new().
11915 */
11916 void sqlite3_expert_destroy(sqlite3expert*);
11917 
11918 #endif  /* !defined(SQLITEEXPERT_H) */
11919 
11920 /************************* End ../ext/expert/sqlite3expert.h ********************/
11921 /************************* Begin ../ext/expert/sqlite3expert.c ******************/
11922 /*
11923 ** 2017 April 09
11924 **
11925 ** The author disclaims copyright to this source code.  In place of
11926 ** a legal notice, here is a blessing:
11927 **
11928 **    May you do good and not evil.
11929 **    May you find forgiveness for yourself and forgive others.
11930 **    May you share freely, never taking more than you give.
11931 **
11932 *************************************************************************
11933 */
11934 /* #include "sqlite3expert.h" */
11935 #include <assert.h>
11936 #include <string.h>
11937 #include <stdio.h>
11938 
11939 #if !defined(SQLITE_AMALGAMATION)
11940 #if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST)
11941 # define SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS 1
11942 #endif
11943 #if defined(SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS)
11944 # define ALWAYS(X)      (1)
11945 # define NEVER(X)       (0)
11946 #elif !defined(NDEBUG)
11947 # define ALWAYS(X)      ((X)?1:(assert(0),0))
11948 # define NEVER(X)       ((X)?(assert(0),1):0)
11949 #else
11950 # define ALWAYS(X)      (X)
11951 # define NEVER(X)       (X)
11952 #endif
11953 #endif /* !defined(SQLITE_AMALGAMATION) */
11954 
11955 
11956 #ifndef SQLITE_OMIT_VIRTUALTABLE
11957 
11958 /* typedef sqlite3_int64 i64; */
11959 /* typedef sqlite3_uint64 u64; */
11960 
11961 typedef struct IdxColumn IdxColumn;
11962 typedef struct IdxConstraint IdxConstraint;
11963 typedef struct IdxScan IdxScan;
11964 typedef struct IdxStatement IdxStatement;
11965 typedef struct IdxTable IdxTable;
11966 typedef struct IdxWrite IdxWrite;
11967 
11968 #define STRLEN  (int)strlen
11969 
11970 /*
11971 ** A temp table name that we assume no user database will actually use.
11972 ** If this assumption proves incorrect triggers on the table with the
11973 ** conflicting name will be ignored.
11974 */
11975 #define UNIQUE_TABLE_NAME "t592690916721053953805701627921227776"
11976 
11977 /*
11978 ** A single constraint. Equivalent to either "col = ?" or "col < ?" (or
11979 ** any other type of single-ended range constraint on a column).
11980 **
11981 ** pLink:
11982 **   Used to temporarily link IdxConstraint objects into lists while
11983 **   creating candidate indexes.
11984 */
11985 struct IdxConstraint {
11986   char *zColl;                    /* Collation sequence */
11987   int bRange;                     /* True for range, false for eq */
11988   int iCol;                       /* Constrained table column */
11989   int bFlag;                      /* Used by idxFindCompatible() */
11990   int bDesc;                      /* True if ORDER BY <expr> DESC */
11991   IdxConstraint *pNext;           /* Next constraint in pEq or pRange list */
11992   IdxConstraint *pLink;           /* See above */
11993 };
11994 
11995 /*
11996 ** A single scan of a single table.
11997 */
11998 struct IdxScan {
11999   IdxTable *pTab;                 /* Associated table object */
12000   int iDb;                        /* Database containing table zTable */
12001   i64 covering;                   /* Mask of columns required for cov. index */
12002   IdxConstraint *pOrder;          /* ORDER BY columns */
12003   IdxConstraint *pEq;             /* List of == constraints */
12004   IdxConstraint *pRange;          /* List of < constraints */
12005   IdxScan *pNextScan;             /* Next IdxScan object for same analysis */
12006 };
12007 
12008 /*
12009 ** Information regarding a single database table. Extracted from
12010 ** "PRAGMA table_info" by function idxGetTableInfo().
12011 */
12012 struct IdxColumn {
12013   char *zName;
12014   char *zColl;
12015   int iPk;
12016 };
12017 struct IdxTable {
12018   int nCol;
12019   char *zName;                    /* Table name */
12020   IdxColumn *aCol;
12021   IdxTable *pNext;                /* Next table in linked list of all tables */
12022 };
12023 
12024 /*
12025 ** An object of the following type is created for each unique table/write-op
12026 ** seen. The objects are stored in a singly-linked list beginning at
12027 ** sqlite3expert.pWrite.
12028 */
12029 struct IdxWrite {
12030   IdxTable *pTab;
12031   int eOp;                        /* SQLITE_UPDATE, DELETE or INSERT */
12032   IdxWrite *pNext;
12033 };
12034 
12035 /*
12036 ** Each statement being analyzed is represented by an instance of this
12037 ** structure.
12038 */
12039 struct IdxStatement {
12040   int iId;                        /* Statement number */
12041   char *zSql;                     /* SQL statement */
12042   char *zIdx;                     /* Indexes */
12043   char *zEQP;                     /* Plan */
12044   IdxStatement *pNext;
12045 };
12046 
12047 
12048 /*
12049 ** A hash table for storing strings. With space for a payload string
12050 ** with each entry. Methods are:
12051 **
12052 **   idxHashInit()
12053 **   idxHashClear()
12054 **   idxHashAdd()
12055 **   idxHashSearch()
12056 */
12057 #define IDX_HASH_SIZE 1023
12058 typedef struct IdxHashEntry IdxHashEntry;
12059 typedef struct IdxHash IdxHash;
12060 struct IdxHashEntry {
12061   char *zKey;                     /* nul-terminated key */
12062   char *zVal;                     /* nul-terminated value string */
12063   char *zVal2;                    /* nul-terminated value string 2 */
12064   IdxHashEntry *pHashNext;        /* Next entry in same hash bucket */
12065   IdxHashEntry *pNext;            /* Next entry in hash */
12066 };
12067 struct IdxHash {
12068   IdxHashEntry *pFirst;
12069   IdxHashEntry *aHash[IDX_HASH_SIZE];
12070 };
12071 
12072 /*
12073 ** sqlite3expert object.
12074 */
12075 struct sqlite3expert {
12076   int iSample;                    /* Percentage of tables to sample for stat1 */
12077   sqlite3 *db;                    /* User database */
12078   sqlite3 *dbm;                   /* In-memory db for this analysis */
12079   sqlite3 *dbv;                   /* Vtab schema for this analysis */
12080   IdxTable *pTable;               /* List of all IdxTable objects */
12081   IdxScan *pScan;                 /* List of scan objects */
12082   IdxWrite *pWrite;               /* List of write objects */
12083   IdxStatement *pStatement;       /* List of IdxStatement objects */
12084   int bRun;                       /* True once analysis has run */
12085   char **pzErrmsg;
12086   int rc;                         /* Error code from whereinfo hook */
12087   IdxHash hIdx;                   /* Hash containing all candidate indexes */
12088   char *zCandidates;              /* For EXPERT_REPORT_CANDIDATES */
12089 };
12090 
12091 
12092 /*
12093 ** Allocate and return nByte bytes of zeroed memory using sqlite3_malloc().
12094 ** If the allocation fails, set *pRc to SQLITE_NOMEM and return NULL.
12095 */
idxMalloc(int * pRc,int nByte)12096 static void *idxMalloc(int *pRc, int nByte){
12097   void *pRet;
12098   assert( *pRc==SQLITE_OK );
12099   assert( nByte>0 );
12100   pRet = sqlite3_malloc(nByte);
12101   if( pRet ){
12102     memset(pRet, 0, nByte);
12103   }else{
12104     *pRc = SQLITE_NOMEM;
12105   }
12106   return pRet;
12107 }
12108 
12109 /*
12110 ** Initialize an IdxHash hash table.
12111 */
idxHashInit(IdxHash * pHash)12112 static void idxHashInit(IdxHash *pHash){
12113   memset(pHash, 0, sizeof(IdxHash));
12114 }
12115 
12116 /*
12117 ** Reset an IdxHash hash table.
12118 */
idxHashClear(IdxHash * pHash)12119 static void idxHashClear(IdxHash *pHash){
12120   int i;
12121   for(i=0; i<IDX_HASH_SIZE; i++){
12122     IdxHashEntry *pEntry;
12123     IdxHashEntry *pNext;
12124     for(pEntry=pHash->aHash[i]; pEntry; pEntry=pNext){
12125       pNext = pEntry->pHashNext;
12126       sqlite3_free(pEntry->zVal2);
12127       sqlite3_free(pEntry);
12128     }
12129   }
12130   memset(pHash, 0, sizeof(IdxHash));
12131 }
12132 
12133 /*
12134 ** Return the index of the hash bucket that the string specified by the
12135 ** arguments to this function belongs.
12136 */
idxHashString(const char * z,int n)12137 static int idxHashString(const char *z, int n){
12138   unsigned int ret = 0;
12139   int i;
12140   for(i=0; i<n; i++){
12141     ret += (ret<<3) + (unsigned char)(z[i]);
12142   }
12143   return (int)(ret % IDX_HASH_SIZE);
12144 }
12145 
12146 /*
12147 ** If zKey is already present in the hash table, return non-zero and do
12148 ** nothing. Otherwise, add an entry with key zKey and payload string zVal to
12149 ** the hash table passed as the second argument.
12150 */
idxHashAdd(int * pRc,IdxHash * pHash,const char * zKey,const char * zVal)12151 static int idxHashAdd(
12152   int *pRc,
12153   IdxHash *pHash,
12154   const char *zKey,
12155   const char *zVal
12156 ){
12157   int nKey = STRLEN(zKey);
12158   int iHash = idxHashString(zKey, nKey);
12159   int nVal = (zVal ? STRLEN(zVal) : 0);
12160   IdxHashEntry *pEntry;
12161   assert( iHash>=0 );
12162   for(pEntry=pHash->aHash[iHash]; pEntry; pEntry=pEntry->pHashNext){
12163     if( STRLEN(pEntry->zKey)==nKey && 0==memcmp(pEntry->zKey, zKey, nKey) ){
12164       return 1;
12165     }
12166   }
12167   pEntry = idxMalloc(pRc, sizeof(IdxHashEntry) + nKey+1 + nVal+1);
12168   if( pEntry ){
12169     pEntry->zKey = (char*)&pEntry[1];
12170     memcpy(pEntry->zKey, zKey, nKey);
12171     if( zVal ){
12172       pEntry->zVal = &pEntry->zKey[nKey+1];
12173       memcpy(pEntry->zVal, zVal, nVal);
12174     }
12175     pEntry->pHashNext = pHash->aHash[iHash];
12176     pHash->aHash[iHash] = pEntry;
12177 
12178     pEntry->pNext = pHash->pFirst;
12179     pHash->pFirst = pEntry;
12180   }
12181   return 0;
12182 }
12183 
12184 /*
12185 ** If zKey/nKey is present in the hash table, return a pointer to the
12186 ** hash-entry object.
12187 */
idxHashFind(IdxHash * pHash,const char * zKey,int nKey)12188 static IdxHashEntry *idxHashFind(IdxHash *pHash, const char *zKey, int nKey){
12189   int iHash;
12190   IdxHashEntry *pEntry;
12191   if( nKey<0 ) nKey = STRLEN(zKey);
12192   iHash = idxHashString(zKey, nKey);
12193   assert( iHash>=0 );
12194   for(pEntry=pHash->aHash[iHash]; pEntry; pEntry=pEntry->pHashNext){
12195     if( STRLEN(pEntry->zKey)==nKey && 0==memcmp(pEntry->zKey, zKey, nKey) ){
12196       return pEntry;
12197     }
12198   }
12199   return 0;
12200 }
12201 
12202 /*
12203 ** If the hash table contains an entry with a key equal to the string
12204 ** passed as the final two arguments to this function, return a pointer
12205 ** to the payload string. Otherwise, if zKey/nKey is not present in the
12206 ** hash table, return NULL.
12207 */
idxHashSearch(IdxHash * pHash,const char * zKey,int nKey)12208 static const char *idxHashSearch(IdxHash *pHash, const char *zKey, int nKey){
12209   IdxHashEntry *pEntry = idxHashFind(pHash, zKey, nKey);
12210   if( pEntry ) return pEntry->zVal;
12211   return 0;
12212 }
12213 
12214 /*
12215 ** Allocate and return a new IdxConstraint object. Set the IdxConstraint.zColl
12216 ** variable to point to a copy of nul-terminated string zColl.
12217 */
idxNewConstraint(int * pRc,const char * zColl)12218 static IdxConstraint *idxNewConstraint(int *pRc, const char *zColl){
12219   IdxConstraint *pNew;
12220   int nColl = STRLEN(zColl);
12221 
12222   assert( *pRc==SQLITE_OK );
12223   pNew = (IdxConstraint*)idxMalloc(pRc, sizeof(IdxConstraint) * nColl + 1);
12224   if( pNew ){
12225     pNew->zColl = (char*)&pNew[1];
12226     memcpy(pNew->zColl, zColl, nColl+1);
12227   }
12228   return pNew;
12229 }
12230 
12231 /*
12232 ** An error associated with database handle db has just occurred. Pass
12233 ** the error message to callback function xOut.
12234 */
idxDatabaseError(sqlite3 * db,char ** pzErrmsg)12235 static void idxDatabaseError(
12236   sqlite3 *db,                    /* Database handle */
12237   char **pzErrmsg                 /* Write error here */
12238 ){
12239   *pzErrmsg = sqlite3_mprintf("%s", sqlite3_errmsg(db));
12240 }
12241 
12242 /*
12243 ** Prepare an SQL statement.
12244 */
idxPrepareStmt(sqlite3 * db,sqlite3_stmt ** ppStmt,char ** pzErrmsg,const char * zSql)12245 static int idxPrepareStmt(
12246   sqlite3 *db,                    /* Database handle to compile against */
12247   sqlite3_stmt **ppStmt,          /* OUT: Compiled SQL statement */
12248   char **pzErrmsg,                /* OUT: sqlite3_malloc()ed error message */
12249   const char *zSql                /* SQL statement to compile */
12250 ){
12251   int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0);
12252   if( rc!=SQLITE_OK ){
12253     *ppStmt = 0;
12254     idxDatabaseError(db, pzErrmsg);
12255   }
12256   return rc;
12257 }
12258 
12259 /*
12260 ** Prepare an SQL statement using the results of a printf() formatting.
12261 */
idxPrintfPrepareStmt(sqlite3 * db,sqlite3_stmt ** ppStmt,char ** pzErrmsg,const char * zFmt,...)12262 static int idxPrintfPrepareStmt(
12263   sqlite3 *db,                    /* Database handle to compile against */
12264   sqlite3_stmt **ppStmt,          /* OUT: Compiled SQL statement */
12265   char **pzErrmsg,                /* OUT: sqlite3_malloc()ed error message */
12266   const char *zFmt,               /* printf() format of SQL statement */
12267   ...                             /* Trailing printf() arguments */
12268 ){
12269   va_list ap;
12270   int rc;
12271   char *zSql;
12272   va_start(ap, zFmt);
12273   zSql = sqlite3_vmprintf(zFmt, ap);
12274   if( zSql==0 ){
12275     rc = SQLITE_NOMEM;
12276   }else{
12277     rc = idxPrepareStmt(db, ppStmt, pzErrmsg, zSql);
12278     sqlite3_free(zSql);
12279   }
12280   va_end(ap);
12281   return rc;
12282 }
12283 
12284 
12285 /*************************************************************************
12286 ** Beginning of virtual table implementation.
12287 */
12288 typedef struct ExpertVtab ExpertVtab;
12289 struct ExpertVtab {
12290   sqlite3_vtab base;
12291   IdxTable *pTab;
12292   sqlite3expert *pExpert;
12293 };
12294 
12295 typedef struct ExpertCsr ExpertCsr;
12296 struct ExpertCsr {
12297   sqlite3_vtab_cursor base;
12298   sqlite3_stmt *pData;
12299 };
12300 
expertDequote(const char * zIn)12301 static char *expertDequote(const char *zIn){
12302   int n = STRLEN(zIn);
12303   char *zRet = sqlite3_malloc(n);
12304 
12305   assert( zIn[0]=='\'' );
12306   assert( zIn[n-1]=='\'' );
12307 
12308   if( zRet ){
12309     int iOut = 0;
12310     int iIn = 0;
12311     for(iIn=1; iIn<(n-1); iIn++){
12312       if( zIn[iIn]=='\'' ){
12313         assert( zIn[iIn+1]=='\'' );
12314         iIn++;
12315       }
12316       zRet[iOut++] = zIn[iIn];
12317     }
12318     zRet[iOut] = '\0';
12319   }
12320 
12321   return zRet;
12322 }
12323 
12324 /*
12325 ** This function is the implementation of both the xConnect and xCreate
12326 ** methods of the r-tree virtual table.
12327 **
12328 **   argv[0]   -> module name
12329 **   argv[1]   -> database name
12330 **   argv[2]   -> table name
12331 **   argv[...] -> column names...
12332 */
expertConnect(sqlite3 * db,void * pAux,int argc,const char * const * argv,sqlite3_vtab ** ppVtab,char ** pzErr)12333 static int expertConnect(
12334   sqlite3 *db,
12335   void *pAux,
12336   int argc, const char *const*argv,
12337   sqlite3_vtab **ppVtab,
12338   char **pzErr
12339 ){
12340   sqlite3expert *pExpert = (sqlite3expert*)pAux;
12341   ExpertVtab *p = 0;
12342   int rc;
12343 
12344   if( argc!=4 ){
12345     *pzErr = sqlite3_mprintf("internal error!");
12346     rc = SQLITE_ERROR;
12347   }else{
12348     char *zCreateTable = expertDequote(argv[3]);
12349     if( zCreateTable ){
12350       rc = sqlite3_declare_vtab(db, zCreateTable);
12351       if( rc==SQLITE_OK ){
12352         p = idxMalloc(&rc, sizeof(ExpertVtab));
12353       }
12354       if( rc==SQLITE_OK ){
12355         p->pExpert = pExpert;
12356         p->pTab = pExpert->pTable;
12357         assert( sqlite3_stricmp(p->pTab->zName, argv[2])==0 );
12358       }
12359       sqlite3_free(zCreateTable);
12360     }else{
12361       rc = SQLITE_NOMEM;
12362     }
12363   }
12364 
12365   *ppVtab = (sqlite3_vtab*)p;
12366   return rc;
12367 }
12368 
expertDisconnect(sqlite3_vtab * pVtab)12369 static int expertDisconnect(sqlite3_vtab *pVtab){
12370   ExpertVtab *p = (ExpertVtab*)pVtab;
12371   sqlite3_free(p);
12372   return SQLITE_OK;
12373 }
12374 
expertBestIndex(sqlite3_vtab * pVtab,sqlite3_index_info * pIdxInfo)12375 static int expertBestIndex(sqlite3_vtab *pVtab, sqlite3_index_info *pIdxInfo){
12376   ExpertVtab *p = (ExpertVtab*)pVtab;
12377   int rc = SQLITE_OK;
12378   int n = 0;
12379   IdxScan *pScan;
12380   const int opmask =
12381     SQLITE_INDEX_CONSTRAINT_EQ | SQLITE_INDEX_CONSTRAINT_GT |
12382     SQLITE_INDEX_CONSTRAINT_LT | SQLITE_INDEX_CONSTRAINT_GE |
12383     SQLITE_INDEX_CONSTRAINT_LE;
12384 
12385   pScan = idxMalloc(&rc, sizeof(IdxScan));
12386   if( pScan ){
12387     int i;
12388 
12389     /* Link the new scan object into the list */
12390     pScan->pTab = p->pTab;
12391     pScan->pNextScan = p->pExpert->pScan;
12392     p->pExpert->pScan = pScan;
12393 
12394     /* Add the constraints to the IdxScan object */
12395     for(i=0; i<pIdxInfo->nConstraint; i++){
12396       struct sqlite3_index_constraint *pCons = &pIdxInfo->aConstraint[i];
12397       if( pCons->usable
12398        && pCons->iColumn>=0
12399        && p->pTab->aCol[pCons->iColumn].iPk==0
12400        && (pCons->op & opmask)
12401       ){
12402         IdxConstraint *pNew;
12403         const char *zColl = sqlite3_vtab_collation(pIdxInfo, i);
12404         pNew = idxNewConstraint(&rc, zColl);
12405         if( pNew ){
12406           pNew->iCol = pCons->iColumn;
12407           if( pCons->op==SQLITE_INDEX_CONSTRAINT_EQ ){
12408             pNew->pNext = pScan->pEq;
12409             pScan->pEq = pNew;
12410           }else{
12411             pNew->bRange = 1;
12412             pNew->pNext = pScan->pRange;
12413             pScan->pRange = pNew;
12414           }
12415         }
12416         n++;
12417         pIdxInfo->aConstraintUsage[i].argvIndex = n;
12418       }
12419     }
12420 
12421     /* Add the ORDER BY to the IdxScan object */
12422     for(i=pIdxInfo->nOrderBy-1; i>=0; i--){
12423       int iCol = pIdxInfo->aOrderBy[i].iColumn;
12424       if( iCol>=0 ){
12425         IdxConstraint *pNew = idxNewConstraint(&rc, p->pTab->aCol[iCol].zColl);
12426         if( pNew ){
12427           pNew->iCol = iCol;
12428           pNew->bDesc = pIdxInfo->aOrderBy[i].desc;
12429           pNew->pNext = pScan->pOrder;
12430           pNew->pLink = pScan->pOrder;
12431           pScan->pOrder = pNew;
12432           n++;
12433         }
12434       }
12435     }
12436   }
12437 
12438   pIdxInfo->estimatedCost = 1000000.0 / (n+1);
12439   return rc;
12440 }
12441 
expertUpdate(sqlite3_vtab * pVtab,int nData,sqlite3_value ** azData,sqlite_int64 * pRowid)12442 static int expertUpdate(
12443   sqlite3_vtab *pVtab,
12444   int nData,
12445   sqlite3_value **azData,
12446   sqlite_int64 *pRowid
12447 ){
12448   (void)pVtab;
12449   (void)nData;
12450   (void)azData;
12451   (void)pRowid;
12452   return SQLITE_OK;
12453 }
12454 
12455 /*
12456 ** Virtual table module xOpen method.
12457 */
expertOpen(sqlite3_vtab * pVTab,sqlite3_vtab_cursor ** ppCursor)12458 static int expertOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){
12459   int rc = SQLITE_OK;
12460   ExpertCsr *pCsr;
12461   (void)pVTab;
12462   pCsr = idxMalloc(&rc, sizeof(ExpertCsr));
12463   *ppCursor = (sqlite3_vtab_cursor*)pCsr;
12464   return rc;
12465 }
12466 
12467 /*
12468 ** Virtual table module xClose method.
12469 */
expertClose(sqlite3_vtab_cursor * cur)12470 static int expertClose(sqlite3_vtab_cursor *cur){
12471   ExpertCsr *pCsr = (ExpertCsr*)cur;
12472   sqlite3_finalize(pCsr->pData);
12473   sqlite3_free(pCsr);
12474   return SQLITE_OK;
12475 }
12476 
12477 /*
12478 ** Virtual table module xEof method.
12479 **
12480 ** Return non-zero if the cursor does not currently point to a valid
12481 ** record (i.e if the scan has finished), or zero otherwise.
12482 */
expertEof(sqlite3_vtab_cursor * cur)12483 static int expertEof(sqlite3_vtab_cursor *cur){
12484   ExpertCsr *pCsr = (ExpertCsr*)cur;
12485   return pCsr->pData==0;
12486 }
12487 
12488 /*
12489 ** Virtual table module xNext method.
12490 */
expertNext(sqlite3_vtab_cursor * cur)12491 static int expertNext(sqlite3_vtab_cursor *cur){
12492   ExpertCsr *pCsr = (ExpertCsr*)cur;
12493   int rc = SQLITE_OK;
12494 
12495   assert( pCsr->pData );
12496   rc = sqlite3_step(pCsr->pData);
12497   if( rc!=SQLITE_ROW ){
12498     rc = sqlite3_finalize(pCsr->pData);
12499     pCsr->pData = 0;
12500   }else{
12501     rc = SQLITE_OK;
12502   }
12503 
12504   return rc;
12505 }
12506 
12507 /*
12508 ** Virtual table module xRowid method.
12509 */
expertRowid(sqlite3_vtab_cursor * cur,sqlite_int64 * pRowid)12510 static int expertRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
12511   (void)cur;
12512   *pRowid = 0;
12513   return SQLITE_OK;
12514 }
12515 
12516 /*
12517 ** Virtual table module xColumn method.
12518 */
expertColumn(sqlite3_vtab_cursor * cur,sqlite3_context * ctx,int i)12519 static int expertColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){
12520   ExpertCsr *pCsr = (ExpertCsr*)cur;
12521   sqlite3_value *pVal;
12522   pVal = sqlite3_column_value(pCsr->pData, i);
12523   if( pVal ){
12524     sqlite3_result_value(ctx, pVal);
12525   }
12526   return SQLITE_OK;
12527 }
12528 
12529 /*
12530 ** Virtual table module xFilter method.
12531 */
expertFilter(sqlite3_vtab_cursor * cur,int idxNum,const char * idxStr,int argc,sqlite3_value ** argv)12532 static int expertFilter(
12533   sqlite3_vtab_cursor *cur,
12534   int idxNum, const char *idxStr,
12535   int argc, sqlite3_value **argv
12536 ){
12537   ExpertCsr *pCsr = (ExpertCsr*)cur;
12538   ExpertVtab *pVtab = (ExpertVtab*)(cur->pVtab);
12539   sqlite3expert *pExpert = pVtab->pExpert;
12540   int rc;
12541 
12542   (void)idxNum;
12543   (void)idxStr;
12544   (void)argc;
12545   (void)argv;
12546   rc = sqlite3_finalize(pCsr->pData);
12547   pCsr->pData = 0;
12548   if( rc==SQLITE_OK ){
12549     rc = idxPrintfPrepareStmt(pExpert->db, &pCsr->pData, &pVtab->base.zErrMsg,
12550         "SELECT * FROM main.%Q WHERE sample()", pVtab->pTab->zName
12551     );
12552   }
12553 
12554   if( rc==SQLITE_OK ){
12555     rc = expertNext(cur);
12556   }
12557   return rc;
12558 }
12559 
idxRegisterVtab(sqlite3expert * p)12560 static int idxRegisterVtab(sqlite3expert *p){
12561   static sqlite3_module expertModule = {
12562     2,                            /* iVersion */
12563     expertConnect,                /* xCreate - create a table */
12564     expertConnect,                /* xConnect - connect to an existing table */
12565     expertBestIndex,              /* xBestIndex - Determine search strategy */
12566     expertDisconnect,             /* xDisconnect - Disconnect from a table */
12567     expertDisconnect,             /* xDestroy - Drop a table */
12568     expertOpen,                   /* xOpen - open a cursor */
12569     expertClose,                  /* xClose - close a cursor */
12570     expertFilter,                 /* xFilter - configure scan constraints */
12571     expertNext,                   /* xNext - advance a cursor */
12572     expertEof,                    /* xEof */
12573     expertColumn,                 /* xColumn - read data */
12574     expertRowid,                  /* xRowid - read data */
12575     expertUpdate,                 /* xUpdate - write data */
12576     0,                            /* xBegin - begin transaction */
12577     0,                            /* xSync - sync transaction */
12578     0,                            /* xCommit - commit transaction */
12579     0,                            /* xRollback - rollback transaction */
12580     0,                            /* xFindFunction - function overloading */
12581     0,                            /* xRename - rename the table */
12582     0,                            /* xSavepoint */
12583     0,                            /* xRelease */
12584     0,                            /* xRollbackTo */
12585     0,                            /* xShadowName */
12586     0,                            /* xIntegrity */
12587   };
12588 
12589   return sqlite3_create_module(p->dbv, "expert", &expertModule, (void*)p);
12590 }
12591 /*
12592 ** End of virtual table implementation.
12593 *************************************************************************/
12594 /*
12595 ** Finalize SQL statement pStmt. If (*pRc) is SQLITE_OK when this function
12596 ** is called, set it to the return value of sqlite3_finalize() before
12597 ** returning. Otherwise, discard the sqlite3_finalize() return value.
12598 */
idxFinalize(int * pRc,sqlite3_stmt * pStmt)12599 static void idxFinalize(int *pRc, sqlite3_stmt *pStmt){
12600   int rc = sqlite3_finalize(pStmt);
12601   if( *pRc==SQLITE_OK ) *pRc = rc;
12602 }
12603 
12604 /*
12605 ** Attempt to allocate an IdxTable structure corresponding to table zTab
12606 ** in the main database of connection db. If successful, set (*ppOut) to
12607 ** point to the new object and return SQLITE_OK. Otherwise, return an
12608 ** SQLite error code and set (*ppOut) to NULL. In this case *pzErrmsg may be
12609 ** set to point to an error string.
12610 **
12611 ** It is the responsibility of the caller to eventually free either the
12612 ** IdxTable object or error message using sqlite3_free().
12613 */
idxGetTableInfo(sqlite3 * db,const char * zTab,IdxTable ** ppOut,char ** pzErrmsg)12614 static int idxGetTableInfo(
12615   sqlite3 *db,                    /* Database connection to read details from */
12616   const char *zTab,               /* Table name */
12617   IdxTable **ppOut,               /* OUT: New object (if successful) */
12618   char **pzErrmsg                 /* OUT: Error message (if not) */
12619 ){
12620   sqlite3_stmt *p1 = 0;
12621   int nCol = 0;
12622   int nTab;
12623   int nByte;
12624   IdxTable *pNew = 0;
12625   int rc, rc2;
12626   char *pCsr = 0;
12627   int nPk = 0;
12628 
12629   *ppOut = 0;
12630   if( zTab==0 ) return SQLITE_ERROR;
12631   nTab = STRLEN(zTab);
12632   nByte = sizeof(IdxTable) + nTab + 1;
12633   rc = idxPrintfPrepareStmt(db, &p1, pzErrmsg, "PRAGMA table_xinfo=%Q", zTab);
12634   while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(p1) ){
12635     const char *zCol = (const char*)sqlite3_column_text(p1, 1);
12636     const char *zColSeq = 0;
12637     if( zCol==0 ){
12638       rc = SQLITE_ERROR;
12639       break;
12640     }
12641     nByte += 1 + STRLEN(zCol);
12642     rc = sqlite3_table_column_metadata(
12643         db, "main", zTab, zCol, 0, &zColSeq, 0, 0, 0
12644     );
12645     if( zColSeq==0 ) zColSeq = "binary";
12646     nByte += 1 + STRLEN(zColSeq);
12647     nCol++;
12648     nPk += (sqlite3_column_int(p1, 5)>0);
12649   }
12650   rc2 = sqlite3_reset(p1);
12651   if( rc==SQLITE_OK ) rc = rc2;
12652 
12653   nByte += sizeof(IdxColumn) * nCol;
12654   if( rc==SQLITE_OK ){
12655     pNew = idxMalloc(&rc, nByte);
12656   }
12657   if( rc==SQLITE_OK ){
12658     pNew->aCol = (IdxColumn*)&pNew[1];
12659     pNew->nCol = nCol;
12660     pCsr = (char*)&pNew->aCol[nCol];
12661   }
12662 
12663   nCol = 0;
12664   while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(p1) ){
12665     const char *zCol = (const char*)sqlite3_column_text(p1, 1);
12666     const char *zColSeq = 0;
12667     int nCopy;
12668     if( zCol==0 ) continue;
12669     nCopy = STRLEN(zCol) + 1;
12670     pNew->aCol[nCol].zName = pCsr;
12671     pNew->aCol[nCol].iPk = (sqlite3_column_int(p1, 5)==1 && nPk==1);
12672     memcpy(pCsr, zCol, nCopy);
12673     pCsr += nCopy;
12674 
12675     rc = sqlite3_table_column_metadata(
12676         db, "main", zTab, zCol, 0, &zColSeq, 0, 0, 0
12677     );
12678     if( rc==SQLITE_OK ){
12679       if( zColSeq==0 ) zColSeq = "binary";
12680       nCopy = STRLEN(zColSeq) + 1;
12681       pNew->aCol[nCol].zColl = pCsr;
12682       memcpy(pCsr, zColSeq, nCopy);
12683       pCsr += nCopy;
12684     }
12685 
12686     nCol++;
12687   }
12688   idxFinalize(&rc, p1);
12689 
12690   if( rc!=SQLITE_OK ){
12691     sqlite3_free(pNew);
12692     pNew = 0;
12693   }else if( ALWAYS(pNew!=0) ){
12694     pNew->zName = pCsr;
12695     if( ALWAYS(pNew->zName!=0) ) memcpy(pNew->zName, zTab, nTab+1);
12696   }
12697 
12698   *ppOut = pNew;
12699   return rc;
12700 }
12701 
12702 /*
12703 ** This function is a no-op if *pRc is set to anything other than
12704 ** SQLITE_OK when it is called.
12705 **
12706 ** If *pRc is initially set to SQLITE_OK, then the text specified by
12707 ** the printf() style arguments is appended to zIn and the result returned
12708 ** in a buffer allocated by sqlite3_malloc(). sqlite3_free() is called on
12709 ** zIn before returning.
12710 */
idxAppendText(int * pRc,char * zIn,const char * zFmt,...)12711 static char *idxAppendText(int *pRc, char *zIn, const char *zFmt, ...){
12712   va_list ap;
12713   char *zAppend = 0;
12714   char *zRet = 0;
12715   int nIn = zIn ? STRLEN(zIn) : 0;
12716   int nAppend = 0;
12717   va_start(ap, zFmt);
12718   if( *pRc==SQLITE_OK ){
12719     zAppend = sqlite3_vmprintf(zFmt, ap);
12720     if( zAppend ){
12721       nAppend = STRLEN(zAppend);
12722       zRet = (char*)sqlite3_malloc(nIn + nAppend + 1);
12723     }
12724     if( zAppend && zRet ){
12725       if( nIn ) memcpy(zRet, zIn, nIn);
12726       memcpy(&zRet[nIn], zAppend, nAppend+1);
12727     }else{
12728       sqlite3_free(zRet);
12729       zRet = 0;
12730       *pRc = SQLITE_NOMEM;
12731     }
12732     sqlite3_free(zAppend);
12733     sqlite3_free(zIn);
12734   }
12735   va_end(ap);
12736   return zRet;
12737 }
12738 
12739 /*
12740 ** Return true if zId must be quoted in order to use it as an SQL
12741 ** identifier, or false otherwise.
12742 */
idxIdentifierRequiresQuotes(const char * zId)12743 static int idxIdentifierRequiresQuotes(const char *zId){
12744   int i;
12745   int nId = STRLEN(zId);
12746 
12747   if( sqlite3_keyword_check(zId, nId) ) return 1;
12748 
12749   for(i=0; zId[i]; i++){
12750     if( !(zId[i]=='_')
12751      && !(zId[i]>='0' && zId[i]<='9')
12752      && !(zId[i]>='a' && zId[i]<='z')
12753      && !(zId[i]>='A' && zId[i]<='Z')
12754     ){
12755       return 1;
12756     }
12757   }
12758   return 0;
12759 }
12760 
12761 /*
12762 ** This function appends an index column definition suitable for constraint
12763 ** pCons to the string passed as zIn and returns the result.
12764 */
idxAppendColDefn(int * pRc,char * zIn,IdxTable * pTab,IdxConstraint * pCons)12765 static char *idxAppendColDefn(
12766   int *pRc,                       /* IN/OUT: Error code */
12767   char *zIn,                      /* Column defn accumulated so far */
12768   IdxTable *pTab,                 /* Table index will be created on */
12769   IdxConstraint *pCons
12770 ){
12771   char *zRet = zIn;
12772   IdxColumn *p = &pTab->aCol[pCons->iCol];
12773   if( zRet ) zRet = idxAppendText(pRc, zRet, ", ");
12774 
12775   if( idxIdentifierRequiresQuotes(p->zName) ){
12776     zRet = idxAppendText(pRc, zRet, "%Q", p->zName);
12777   }else{
12778     zRet = idxAppendText(pRc, zRet, "%s", p->zName);
12779   }
12780 
12781   if( sqlite3_stricmp(p->zColl, pCons->zColl) ){
12782     if( idxIdentifierRequiresQuotes(pCons->zColl) ){
12783       zRet = idxAppendText(pRc, zRet, " COLLATE %Q", pCons->zColl);
12784     }else{
12785       zRet = idxAppendText(pRc, zRet, " COLLATE %s", pCons->zColl);
12786     }
12787   }
12788 
12789   if( pCons->bDesc ){
12790     zRet = idxAppendText(pRc, zRet, " DESC");
12791   }
12792   return zRet;
12793 }
12794 
12795 /*
12796 ** Search database dbm for an index compatible with the one idxCreateFromCons()
12797 ** would create from arguments pScan, pEq and pTail. If no error occurs and
12798 ** such an index is found, return non-zero. Or, if no such index is found,
12799 ** return zero.
12800 **
12801 ** If an error occurs, set *pRc to an SQLite error code and return zero.
12802 */
idxFindCompatible(int * pRc,sqlite3 * dbm,IdxScan * pScan,IdxConstraint * pEq,IdxConstraint * pTail)12803 static int idxFindCompatible(
12804   int *pRc,                       /* OUT: Error code */
12805   sqlite3* dbm,                   /* Database to search */
12806   IdxScan *pScan,                 /* Scan for table to search for index on */
12807   IdxConstraint *pEq,             /* List of == constraints */
12808   IdxConstraint *pTail            /* List of range constraints */
12809 ){
12810   const char *zTbl = pScan->pTab->zName;
12811   sqlite3_stmt *pIdxList = 0;
12812   IdxConstraint *pIter;
12813   int nEq = 0;                    /* Number of elements in pEq */
12814   int rc;
12815 
12816   /* Count the elements in list pEq */
12817   for(pIter=pEq; pIter; pIter=pIter->pLink) nEq++;
12818 
12819   rc = idxPrintfPrepareStmt(dbm, &pIdxList, 0, "PRAGMA index_list=%Q", zTbl);
12820   while( rc==SQLITE_OK && sqlite3_step(pIdxList)==SQLITE_ROW ){
12821     int bMatch = 1;
12822     IdxConstraint *pT = pTail;
12823     sqlite3_stmt *pInfo = 0;
12824     const char *zIdx = (const char*)sqlite3_column_text(pIdxList, 1);
12825     if( zIdx==0 ) continue;
12826 
12827     /* Zero the IdxConstraint.bFlag values in the pEq list */
12828     for(pIter=pEq; pIter; pIter=pIter->pLink) pIter->bFlag = 0;
12829 
12830     rc = idxPrintfPrepareStmt(dbm, &pInfo, 0, "PRAGMA index_xInfo=%Q", zIdx);
12831     while( rc==SQLITE_OK && sqlite3_step(pInfo)==SQLITE_ROW ){
12832       int iIdx = sqlite3_column_int(pInfo, 0);
12833       int iCol = sqlite3_column_int(pInfo, 1);
12834       const char *zColl = (const char*)sqlite3_column_text(pInfo, 4);
12835 
12836       if( iIdx<nEq ){
12837         for(pIter=pEq; pIter; pIter=pIter->pLink){
12838           if( pIter->bFlag ) continue;
12839           if( pIter->iCol!=iCol ) continue;
12840           if( sqlite3_stricmp(pIter->zColl, zColl) ) continue;
12841           pIter->bFlag = 1;
12842           break;
12843         }
12844         if( pIter==0 ){
12845           bMatch = 0;
12846           break;
12847         }
12848       }else{
12849         if( pT ){
12850           if( pT->iCol!=iCol || sqlite3_stricmp(pT->zColl, zColl) ){
12851             bMatch = 0;
12852             break;
12853           }
12854           pT = pT->pLink;
12855         }
12856       }
12857     }
12858     idxFinalize(&rc, pInfo);
12859 
12860     if( rc==SQLITE_OK && bMatch ){
12861       sqlite3_finalize(pIdxList);
12862       return 1;
12863     }
12864   }
12865   idxFinalize(&rc, pIdxList);
12866 
12867   *pRc = rc;
12868   return 0;
12869 }
12870 
12871 /* Callback for sqlite3_exec() with query with leading count(*) column.
12872  * The first argument is expected to be an int*, referent to be incremented
12873  * if that leading column is not exactly '0'.
12874  */
countNonzeros(void * pCount,int nc,char * azResults[],char * azColumns[])12875 static int countNonzeros(void* pCount, int nc,
12876                          char* azResults[], char* azColumns[]){
12877   (void)azColumns;  /* Suppress unused parameter warning */
12878   if( nc>0 && (azResults[0][0]!='0' || azResults[0][1]!=0) ){
12879     *((int *)pCount) += 1;
12880   }
12881   return 0;
12882 }
12883 
idxCreateFromCons(sqlite3expert * p,IdxScan * pScan,IdxConstraint * pEq,IdxConstraint * pTail)12884 static int idxCreateFromCons(
12885   sqlite3expert *p,
12886   IdxScan *pScan,
12887   IdxConstraint *pEq,
12888   IdxConstraint *pTail
12889 ){
12890   sqlite3 *dbm = p->dbm;
12891   int rc = SQLITE_OK;
12892   if( (pEq || pTail) && 0==idxFindCompatible(&rc, dbm, pScan, pEq, pTail) ){
12893     IdxTable *pTab = pScan->pTab;
12894     char *zCols = 0;
12895     char *zIdx = 0;
12896     IdxConstraint *pCons;
12897     unsigned int h = 0;
12898     const char *zFmt;
12899 
12900     for(pCons=pEq; pCons; pCons=pCons->pLink){
12901       zCols = idxAppendColDefn(&rc, zCols, pTab, pCons);
12902     }
12903     for(pCons=pTail; pCons; pCons=pCons->pLink){
12904       zCols = idxAppendColDefn(&rc, zCols, pTab, pCons);
12905     }
12906 
12907     if( rc==SQLITE_OK ){
12908       /* Hash the list of columns to come up with a name for the index */
12909       const char *zTable = pScan->pTab->zName;
12910       int quoteTable = idxIdentifierRequiresQuotes(zTable);
12911       char *zName = 0;          /* Index name */
12912       int collisions = 0;
12913       do{
12914         int i;
12915         char *zFind;
12916         for(i=0; zCols[i]; i++){
12917           h += ((h<<3) + zCols[i]);
12918         }
12919         sqlite3_free(zName);
12920         zName = sqlite3_mprintf("%s_idx_%08x", zTable, h);
12921         if( zName==0 ) break;
12922         /* Is is unique among table, view and index names? */
12923         zFmt = "SELECT count(*) FROM sqlite_schema WHERE name=%Q"
12924           " AND type in ('index','table','view')";
12925         zFind = sqlite3_mprintf(zFmt, zName);
12926         i = 0;
12927         rc = sqlite3_exec(dbm, zFind, countNonzeros, &i, 0);
12928         assert(rc==SQLITE_OK);
12929         sqlite3_free(zFind);
12930         if( i==0 ){
12931           collisions = 0;
12932           break;
12933         }
12934         ++collisions;
12935       }while( collisions<50 && zName!=0 );
12936       if( collisions ){
12937         /* This return means "Gave up trying to find a unique index name." */
12938         rc = SQLITE_BUSY_TIMEOUT;
12939       }else if( zName==0 ){
12940         rc = SQLITE_NOMEM;
12941       }else{
12942         if( quoteTable ){
12943           zFmt = "CREATE INDEX \"%w\" ON \"%w\"(%s)";
12944         }else{
12945           zFmt = "CREATE INDEX %s ON %s(%s)";
12946         }
12947         zIdx = sqlite3_mprintf(zFmt, zName, zTable, zCols);
12948         if( !zIdx ){
12949           rc = SQLITE_NOMEM;
12950         }else{
12951           rc = sqlite3_exec(dbm, zIdx, 0, 0, p->pzErrmsg);
12952           if( rc!=SQLITE_OK ){
12953             rc = SQLITE_BUSY_TIMEOUT;
12954           }else{
12955             idxHashAdd(&rc, &p->hIdx, zName, zIdx);
12956           }
12957         }
12958         sqlite3_free(zName);
12959         sqlite3_free(zIdx);
12960       }
12961     }
12962 
12963     sqlite3_free(zCols);
12964   }
12965   return rc;
12966 }
12967 
12968 /*
12969 ** Return true if list pList (linked by IdxConstraint.pLink) contains
12970 ** a constraint compatible with *p. Otherwise return false.
12971 */
idxFindConstraint(IdxConstraint * pList,IdxConstraint * p)12972 static int idxFindConstraint(IdxConstraint *pList, IdxConstraint *p){
12973   IdxConstraint *pCmp;
12974   for(pCmp=pList; pCmp; pCmp=pCmp->pLink){
12975     if( p->iCol==pCmp->iCol ) return 1;
12976   }
12977   return 0;
12978 }
12979 
idxCreateFromWhere(sqlite3expert * p,IdxScan * pScan,IdxConstraint * pTail)12980 static int idxCreateFromWhere(
12981   sqlite3expert *p,
12982   IdxScan *pScan,                 /* Create indexes for this scan */
12983   IdxConstraint *pTail            /* range/ORDER BY constraints for inclusion */
12984 ){
12985   IdxConstraint *p1 = 0;
12986   IdxConstraint *pCon;
12987   int rc;
12988 
12989   /* Gather up all the == constraints. */
12990   for(pCon=pScan->pEq; pCon; pCon=pCon->pNext){
12991     if( !idxFindConstraint(p1, pCon) && !idxFindConstraint(pTail, pCon) ){
12992       pCon->pLink = p1;
12993       p1 = pCon;
12994     }
12995   }
12996 
12997   /* Create an index using the == constraints collected above. And the
12998   ** range constraint/ORDER BY terms passed in by the caller, if any. */
12999   rc = idxCreateFromCons(p, pScan, p1, pTail);
13000 
13001   /* If no range/ORDER BY passed by the caller, create a version of the
13002   ** index for each range constraint.  */
13003   if( pTail==0 ){
13004     for(pCon=pScan->pRange; rc==SQLITE_OK && pCon; pCon=pCon->pNext){
13005       assert( pCon->pLink==0 );
13006       if( !idxFindConstraint(p1, pCon) && !idxFindConstraint(pTail, pCon) ){
13007         rc = idxCreateFromCons(p, pScan, p1, pCon);
13008       }
13009     }
13010   }
13011 
13012   return rc;
13013 }
13014 
13015 /*
13016 ** Create candidate indexes in database [dbm] based on the data in
13017 ** linked-list pScan.
13018 */
idxCreateCandidates(sqlite3expert * p)13019 static int idxCreateCandidates(sqlite3expert *p){
13020   int rc = SQLITE_OK;
13021   IdxScan *pIter;
13022 
13023   for(pIter=p->pScan; pIter && rc==SQLITE_OK; pIter=pIter->pNextScan){
13024     rc = idxCreateFromWhere(p, pIter, 0);
13025     if( rc==SQLITE_OK && pIter->pOrder ){
13026       rc = idxCreateFromWhere(p, pIter, pIter->pOrder);
13027     }
13028   }
13029 
13030   return rc;
13031 }
13032 
13033 /*
13034 ** Free all elements of the linked list starting at pConstraint.
13035 */
idxConstraintFree(IdxConstraint * pConstraint)13036 static void idxConstraintFree(IdxConstraint *pConstraint){
13037   IdxConstraint *pNext;
13038   IdxConstraint *p;
13039 
13040   for(p=pConstraint; p; p=pNext){
13041     pNext = p->pNext;
13042     sqlite3_free(p);
13043   }
13044 }
13045 
13046 /*
13047 ** Free all elements of the linked list starting from pScan up until pLast
13048 ** (pLast is not freed).
13049 */
idxScanFree(IdxScan * pScan,IdxScan * pLast)13050 static void idxScanFree(IdxScan *pScan, IdxScan *pLast){
13051   IdxScan *p;
13052   IdxScan *pNext;
13053   for(p=pScan; p!=pLast; p=pNext){
13054     pNext = p->pNextScan;
13055     idxConstraintFree(p->pOrder);
13056     idxConstraintFree(p->pEq);
13057     idxConstraintFree(p->pRange);
13058     sqlite3_free(p);
13059   }
13060 }
13061 
13062 /*
13063 ** Free all elements of the linked list starting from pStatement up
13064 ** until pLast (pLast is not freed).
13065 */
idxStatementFree(IdxStatement * pStatement,IdxStatement * pLast)13066 static void idxStatementFree(IdxStatement *pStatement, IdxStatement *pLast){
13067   IdxStatement *p;
13068   IdxStatement *pNext;
13069   for(p=pStatement; p!=pLast; p=pNext){
13070     pNext = p->pNext;
13071     sqlite3_free(p->zEQP);
13072     sqlite3_free(p->zIdx);
13073     sqlite3_free(p);
13074   }
13075 }
13076 
13077 /*
13078 ** Free the linked list of IdxTable objects starting at pTab.
13079 */
idxTableFree(IdxTable * pTab)13080 static void idxTableFree(IdxTable *pTab){
13081   IdxTable *pIter;
13082   IdxTable *pNext;
13083   for(pIter=pTab; pIter; pIter=pNext){
13084     pNext = pIter->pNext;
13085     sqlite3_free(pIter);
13086   }
13087 }
13088 
13089 /*
13090 ** Free the linked list of IdxWrite objects starting at pTab.
13091 */
idxWriteFree(IdxWrite * pTab)13092 static void idxWriteFree(IdxWrite *pTab){
13093   IdxWrite *pIter;
13094   IdxWrite *pNext;
13095   for(pIter=pTab; pIter; pIter=pNext){
13096     pNext = pIter->pNext;
13097     sqlite3_free(pIter);
13098   }
13099 }
13100 
13101 
13102 
13103 /*
13104 ** This function is called after candidate indexes have been created. It
13105 ** runs all the queries to see which indexes they prefer, and populates
13106 ** IdxStatement.zIdx and IdxStatement.zEQP with the results.
13107 */
idxFindIndexes(sqlite3expert * p,char ** pzErr)13108 static int idxFindIndexes(
13109   sqlite3expert *p,
13110   char **pzErr                         /* OUT: Error message (sqlite3_malloc) */
13111 ){
13112   IdxStatement *pStmt;
13113   sqlite3 *dbm = p->dbm;
13114   int rc = SQLITE_OK;
13115 
13116   IdxHash hIdx;
13117   idxHashInit(&hIdx);
13118 
13119   for(pStmt=p->pStatement; rc==SQLITE_OK && pStmt; pStmt=pStmt->pNext){
13120     IdxHashEntry *pEntry;
13121     sqlite3_stmt *pExplain = 0;
13122     idxHashClear(&hIdx);
13123     rc = idxPrintfPrepareStmt(dbm, &pExplain, pzErr,
13124         "EXPLAIN QUERY PLAN %s", pStmt->zSql
13125     );
13126     while( rc==SQLITE_OK && sqlite3_step(pExplain)==SQLITE_ROW ){
13127       /* int iId = sqlite3_column_int(pExplain, 0); */
13128       /* int iParent = sqlite3_column_int(pExplain, 1); */
13129       /* int iNotUsed = sqlite3_column_int(pExplain, 2); */
13130       const char *zDetail = (const char*)sqlite3_column_text(pExplain, 3);
13131       int nDetail;
13132       int i;
13133 
13134       if( !zDetail ) continue;
13135       nDetail = STRLEN(zDetail);
13136 
13137       for(i=0; i<nDetail; i++){
13138         const char *zIdx = 0;
13139         if( i+13<nDetail && memcmp(&zDetail[i], " USING INDEX ", 13)==0 ){
13140           zIdx = &zDetail[i+13];
13141         }else if( i+22<nDetail
13142             && memcmp(&zDetail[i], " USING COVERING INDEX ", 22)==0
13143         ){
13144           zIdx = &zDetail[i+22];
13145         }
13146         if( zIdx ){
13147           const char *zSql;
13148           int nIdx = 0;
13149           while( zIdx[nIdx]!='\0' && (zIdx[nIdx]!=' ' || zIdx[nIdx+1]!='(') ){
13150             nIdx++;
13151           }
13152           zSql = idxHashSearch(&p->hIdx, zIdx, nIdx);
13153           if( zSql ){
13154             idxHashAdd(&rc, &hIdx, zSql, 0);
13155             if( rc ) goto find_indexes_out;
13156           }
13157           break;
13158         }
13159       }
13160 
13161       if( zDetail[0]!='-' ){
13162         pStmt->zEQP = idxAppendText(&rc, pStmt->zEQP, "%s\n", zDetail);
13163       }
13164     }
13165 
13166     for(pEntry=hIdx.pFirst; pEntry; pEntry=pEntry->pNext){
13167       pStmt->zIdx = idxAppendText(&rc, pStmt->zIdx, "%s;\n", pEntry->zKey);
13168     }
13169 
13170     idxFinalize(&rc, pExplain);
13171   }
13172 
13173  find_indexes_out:
13174   idxHashClear(&hIdx);
13175   return rc;
13176 }
13177 
idxAuthCallback(void * pCtx,int eOp,const char * z3,const char * z4,const char * zDb,const char * zTrigger)13178 static int idxAuthCallback(
13179   void *pCtx,
13180   int eOp,
13181   const char *z3,
13182   const char *z4,
13183   const char *zDb,
13184   const char *zTrigger
13185 ){
13186   int rc = SQLITE_OK;
13187   (void)z4;
13188   (void)zTrigger;
13189   if( eOp==SQLITE_INSERT || eOp==SQLITE_UPDATE || eOp==SQLITE_DELETE ){
13190     if( sqlite3_stricmp(zDb, "main")==0 ){
13191       sqlite3expert *p = (sqlite3expert*)pCtx;
13192       IdxTable *pTab;
13193       for(pTab=p->pTable; pTab; pTab=pTab->pNext){
13194         if( 0==sqlite3_stricmp(z3, pTab->zName) ) break;
13195       }
13196       if( pTab ){
13197         IdxWrite *pWrite;
13198         for(pWrite=p->pWrite; pWrite; pWrite=pWrite->pNext){
13199           if( pWrite->pTab==pTab && pWrite->eOp==eOp ) break;
13200         }
13201         if( pWrite==0 ){
13202           pWrite = idxMalloc(&rc, sizeof(IdxWrite));
13203           if( rc==SQLITE_OK ){
13204             pWrite->pTab = pTab;
13205             pWrite->eOp = eOp;
13206             pWrite->pNext = p->pWrite;
13207             p->pWrite = pWrite;
13208           }
13209         }
13210       }
13211     }
13212   }
13213   return rc;
13214 }
13215 
idxProcessOneTrigger(sqlite3expert * p,IdxWrite * pWrite,char ** pzErr)13216 static int idxProcessOneTrigger(
13217   sqlite3expert *p,
13218   IdxWrite *pWrite,
13219   char **pzErr
13220 ){
13221   static const char *zInt = UNIQUE_TABLE_NAME;
13222   static const char *zDrop = "DROP TABLE " UNIQUE_TABLE_NAME;
13223   IdxTable *pTab = pWrite->pTab;
13224   const char *zTab = pTab->zName;
13225   const char *zSql =
13226     "SELECT 'CREATE TEMP' || substr(sql, 7) FROM sqlite_schema "
13227     "WHERE tbl_name = %Q AND type IN ('table', 'trigger') "
13228     "ORDER BY type;";
13229   sqlite3_stmt *pSelect = 0;
13230   int rc = SQLITE_OK;
13231   char *zWrite = 0;
13232 
13233   /* Create the table and its triggers in the temp schema */
13234   rc = idxPrintfPrepareStmt(p->db, &pSelect, pzErr, zSql, zTab, zTab);
13235   while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSelect) ){
13236     const char *zCreate = (const char*)sqlite3_column_text(pSelect, 0);
13237     if( zCreate==0 ) continue;
13238     rc = sqlite3_exec(p->dbv, zCreate, 0, 0, pzErr);
13239   }
13240   idxFinalize(&rc, pSelect);
13241 
13242   /* Rename the table in the temp schema to zInt */
13243   if( rc==SQLITE_OK ){
13244     char *z = sqlite3_mprintf("ALTER TABLE temp.%Q RENAME TO %Q", zTab, zInt);
13245     if( z==0 ){
13246       rc = SQLITE_NOMEM;
13247     }else{
13248       rc = sqlite3_exec(p->dbv, z, 0, 0, pzErr);
13249       sqlite3_free(z);
13250     }
13251   }
13252 
13253   switch( pWrite->eOp ){
13254     case SQLITE_INSERT: {
13255       int i;
13256       zWrite = idxAppendText(&rc, zWrite, "INSERT INTO %Q VALUES(", zInt);
13257       for(i=0; i<pTab->nCol; i++){
13258         zWrite = idxAppendText(&rc, zWrite, "%s?", i==0 ? "" : ", ");
13259       }
13260       zWrite = idxAppendText(&rc, zWrite, ")");
13261       break;
13262     }
13263     case SQLITE_UPDATE: {
13264       int i;
13265       zWrite = idxAppendText(&rc, zWrite, "UPDATE %Q SET ", zInt);
13266       for(i=0; i<pTab->nCol; i++){
13267         zWrite = idxAppendText(&rc, zWrite, "%s%Q=?", i==0 ? "" : ", ",
13268             pTab->aCol[i].zName
13269         );
13270       }
13271       break;
13272     }
13273     default: {
13274       assert( pWrite->eOp==SQLITE_DELETE );
13275       if( rc==SQLITE_OK ){
13276         zWrite = sqlite3_mprintf("DELETE FROM %Q", zInt);
13277         if( zWrite==0 ) rc = SQLITE_NOMEM;
13278       }
13279     }
13280   }
13281 
13282   if( rc==SQLITE_OK ){
13283     sqlite3_stmt *pX = 0;
13284     rc = sqlite3_prepare_v2(p->dbv, zWrite, -1, &pX, 0);
13285     idxFinalize(&rc, pX);
13286     if( rc!=SQLITE_OK ){
13287       idxDatabaseError(p->dbv, pzErr);
13288     }
13289   }
13290   sqlite3_free(zWrite);
13291 
13292   if( rc==SQLITE_OK ){
13293     rc = sqlite3_exec(p->dbv, zDrop, 0, 0, pzErr);
13294   }
13295 
13296   return rc;
13297 }
13298 
idxProcessTriggers(sqlite3expert * p,char ** pzErr)13299 static int idxProcessTriggers(sqlite3expert *p, char **pzErr){
13300   int rc = SQLITE_OK;
13301   IdxWrite *pEnd = 0;
13302   IdxWrite *pFirst = p->pWrite;
13303 
13304   while( rc==SQLITE_OK && pFirst!=pEnd ){
13305     IdxWrite *pIter;
13306     for(pIter=pFirst; rc==SQLITE_OK && pIter!=pEnd; pIter=pIter->pNext){
13307       rc = idxProcessOneTrigger(p, pIter, pzErr);
13308     }
13309     pEnd = pFirst;
13310     pFirst = p->pWrite;
13311   }
13312 
13313   return rc;
13314 }
13315 
13316 
idxCreateVtabSchema(sqlite3expert * p,char ** pzErrmsg)13317 static int idxCreateVtabSchema(sqlite3expert *p, char **pzErrmsg){
13318   int rc = idxRegisterVtab(p);
13319   sqlite3_stmt *pSchema = 0;
13320 
13321   /* For each table in the main db schema:
13322   **
13323   **   1) Add an entry to the p->pTable list, and
13324   **   2) Create the equivalent virtual table in dbv.
13325   */
13326   rc = idxPrepareStmt(p->db, &pSchema, pzErrmsg,
13327       "SELECT type, name, sql, 1 FROM sqlite_schema "
13328       "WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%%' "
13329       " UNION ALL "
13330       "SELECT type, name, sql, 2 FROM sqlite_schema "
13331       "WHERE type = 'trigger'"
13332       "  AND tbl_name IN(SELECT name FROM sqlite_schema WHERE type = 'view') "
13333       "ORDER BY 4, 1"
13334   );
13335   while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSchema) ){
13336     const char *zType = (const char*)sqlite3_column_text(pSchema, 0);
13337     const char *zName = (const char*)sqlite3_column_text(pSchema, 1);
13338     const char *zSql = (const char*)sqlite3_column_text(pSchema, 2);
13339 
13340     if( zType==0 || zName==0 ) continue;
13341     if( zType[0]=='v' || zType[1]=='r' ){
13342       if( zSql ) rc = sqlite3_exec(p->dbv, zSql, 0, 0, pzErrmsg);
13343     }else{
13344       IdxTable *pTab;
13345       rc = idxGetTableInfo(p->db, zName, &pTab, pzErrmsg);
13346       if( rc==SQLITE_OK ){
13347         int i;
13348         char *zInner = 0;
13349         char *zOuter = 0;
13350         pTab->pNext = p->pTable;
13351         p->pTable = pTab;
13352 
13353         /* The statement the vtab will pass to sqlite3_declare_vtab() */
13354         zInner = idxAppendText(&rc, 0, "CREATE TABLE x(");
13355         for(i=0; i<pTab->nCol; i++){
13356           zInner = idxAppendText(&rc, zInner, "%s%Q COLLATE %s",
13357               (i==0 ? "" : ", "), pTab->aCol[i].zName, pTab->aCol[i].zColl
13358           );
13359         }
13360         zInner = idxAppendText(&rc, zInner, ")");
13361 
13362         /* The CVT statement to create the vtab */
13363         zOuter = idxAppendText(&rc, 0,
13364             "CREATE VIRTUAL TABLE %Q USING expert(%Q)", zName, zInner
13365         );
13366         if( rc==SQLITE_OK ){
13367           rc = sqlite3_exec(p->dbv, zOuter, 0, 0, pzErrmsg);
13368         }
13369         sqlite3_free(zInner);
13370         sqlite3_free(zOuter);
13371       }
13372     }
13373   }
13374   idxFinalize(&rc, pSchema);
13375   return rc;
13376 }
13377 
13378 struct IdxSampleCtx {
13379   int iTarget;
13380   double target;                  /* Target nRet/nRow value */
13381   double nRow;                    /* Number of rows seen */
13382   double nRet;                    /* Number of rows returned */
13383 };
13384 
idxSampleFunc(sqlite3_context * pCtx,int argc,sqlite3_value ** argv)13385 static void idxSampleFunc(
13386   sqlite3_context *pCtx,
13387   int argc,
13388   sqlite3_value **argv
13389 ){
13390   struct IdxSampleCtx *p = (struct IdxSampleCtx*)sqlite3_user_data(pCtx);
13391   int bRet;
13392 
13393   (void)argv;
13394   assert( argc==0 );
13395   if( p->nRow==0.0 ){
13396     bRet = 1;
13397   }else{
13398     bRet = (p->nRet / p->nRow) <= p->target;
13399     if( bRet==0 ){
13400       unsigned short rnd;
13401       sqlite3_randomness(2, (void*)&rnd);
13402       bRet = ((int)rnd % 100) <= p->iTarget;
13403     }
13404   }
13405 
13406   sqlite3_result_int(pCtx, bRet);
13407   p->nRow += 1.0;
13408   p->nRet += (double)bRet;
13409 }
13410 
13411 struct IdxRemCtx {
13412   int nSlot;
13413   struct IdxRemSlot {
13414     int eType;                    /* SQLITE_NULL, INTEGER, REAL, TEXT, BLOB */
13415     i64 iVal;                     /* SQLITE_INTEGER value */
13416     double rVal;                  /* SQLITE_FLOAT value */
13417     int nByte;                    /* Bytes of space allocated at z */
13418     int n;                        /* Size of buffer z */
13419     char *z;                      /* SQLITE_TEXT/BLOB value */
13420   } aSlot[1];
13421 };
13422 
13423 /*
13424 ** Implementation of scalar function rem().
13425 */
idxRemFunc(sqlite3_context * pCtx,int argc,sqlite3_value ** argv)13426 static void idxRemFunc(
13427   sqlite3_context *pCtx,
13428   int argc,
13429   sqlite3_value **argv
13430 ){
13431   struct IdxRemCtx *p = (struct IdxRemCtx*)sqlite3_user_data(pCtx);
13432   struct IdxRemSlot *pSlot;
13433   int iSlot;
13434   assert( argc==2 );
13435 
13436   iSlot = sqlite3_value_int(argv[0]);
13437   assert( iSlot<=p->nSlot );
13438   pSlot = &p->aSlot[iSlot];
13439 
13440   switch( pSlot->eType ){
13441     case SQLITE_NULL:
13442       /* no-op */
13443       break;
13444 
13445     case SQLITE_INTEGER:
13446       sqlite3_result_int64(pCtx, pSlot->iVal);
13447       break;
13448 
13449     case SQLITE_FLOAT:
13450       sqlite3_result_double(pCtx, pSlot->rVal);
13451       break;
13452 
13453     case SQLITE_BLOB:
13454       sqlite3_result_blob(pCtx, pSlot->z, pSlot->n, SQLITE_TRANSIENT);
13455       break;
13456 
13457     case SQLITE_TEXT:
13458       sqlite3_result_text(pCtx, pSlot->z, pSlot->n, SQLITE_TRANSIENT);
13459       break;
13460   }
13461 
13462   pSlot->eType = sqlite3_value_type(argv[1]);
13463   switch( pSlot->eType ){
13464     case SQLITE_NULL:
13465       /* no-op */
13466       break;
13467 
13468     case SQLITE_INTEGER:
13469       pSlot->iVal = sqlite3_value_int64(argv[1]);
13470       break;
13471 
13472     case SQLITE_FLOAT:
13473       pSlot->rVal = sqlite3_value_double(argv[1]);
13474       break;
13475 
13476     case SQLITE_BLOB:
13477     case SQLITE_TEXT: {
13478       int nByte = sqlite3_value_bytes(argv[1]);
13479       const void *pData = 0;
13480       if( nByte>pSlot->nByte ){
13481         char *zNew = (char*)sqlite3_realloc(pSlot->z, nByte*2);
13482         if( zNew==0 ){
13483           sqlite3_result_error_nomem(pCtx);
13484           return;
13485         }
13486         pSlot->nByte = nByte*2;
13487         pSlot->z = zNew;
13488       }
13489       pSlot->n = nByte;
13490       if( pSlot->eType==SQLITE_BLOB ){
13491         pData = sqlite3_value_blob(argv[1]);
13492         if( pData ) memcpy(pSlot->z, pData, nByte);
13493       }else{
13494         pData = sqlite3_value_text(argv[1]);
13495         memcpy(pSlot->z, pData, nByte);
13496       }
13497       break;
13498     }
13499   }
13500 }
13501 
idxLargestIndex(sqlite3 * db,int * pnMax,char ** pzErr)13502 static int idxLargestIndex(sqlite3 *db, int *pnMax, char **pzErr){
13503   int rc = SQLITE_OK;
13504   const char *zMax =
13505     "SELECT max(i.seqno) FROM "
13506     "  sqlite_schema AS s, "
13507     "  pragma_index_list(s.name) AS l, "
13508     "  pragma_index_info(l.name) AS i "
13509     "WHERE s.type = 'table'";
13510   sqlite3_stmt *pMax = 0;
13511 
13512   *pnMax = 0;
13513   rc = idxPrepareStmt(db, &pMax, pzErr, zMax);
13514   if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pMax) ){
13515     *pnMax = sqlite3_column_int(pMax, 0) + 1;
13516   }
13517   idxFinalize(&rc, pMax);
13518 
13519   return rc;
13520 }
13521 
idxPopulateOneStat1(sqlite3expert * p,sqlite3_stmt * pIndexXInfo,sqlite3_stmt * pWriteStat,const char * zTab,const char * zIdx,char ** pzErr)13522 static int idxPopulateOneStat1(
13523   sqlite3expert *p,
13524   sqlite3_stmt *pIndexXInfo,
13525   sqlite3_stmt *pWriteStat,
13526   const char *zTab,
13527   const char *zIdx,
13528   char **pzErr
13529 ){
13530   char *zCols = 0;
13531   char *zOrder = 0;
13532   char *zQuery = 0;
13533   int nCol = 0;
13534   int i;
13535   sqlite3_stmt *pQuery = 0;
13536   int *aStat = 0;
13537   int rc = SQLITE_OK;
13538 
13539   assert( p->iSample>0 );
13540 
13541   /* Formulate the query text */
13542   sqlite3_bind_text(pIndexXInfo, 1, zIdx, -1, SQLITE_STATIC);
13543   while( SQLITE_OK==rc && SQLITE_ROW==sqlite3_step(pIndexXInfo) ){
13544     const char *zComma = zCols==0 ? "" : ", ";
13545     const char *zName = (const char*)sqlite3_column_text(pIndexXInfo, 0);
13546     const char *zColl = (const char*)sqlite3_column_text(pIndexXInfo, 1);
13547     zCols = idxAppendText(&rc, zCols,
13548         "%sx.%Q IS rem(%d, x.%Q) COLLATE %s", zComma, zName, nCol, zName, zColl
13549     );
13550     zOrder = idxAppendText(&rc, zOrder, "%s%d", zComma, ++nCol);
13551   }
13552   sqlite3_reset(pIndexXInfo);
13553   if( rc==SQLITE_OK ){
13554     if( p->iSample==100 ){
13555       zQuery = sqlite3_mprintf(
13556           "SELECT %s FROM %Q x ORDER BY %s", zCols, zTab, zOrder
13557       );
13558     }else{
13559       zQuery = sqlite3_mprintf(
13560           "SELECT %s FROM temp."UNIQUE_TABLE_NAME" x ORDER BY %s", zCols, zOrder
13561       );
13562     }
13563   }
13564   sqlite3_free(zCols);
13565   sqlite3_free(zOrder);
13566 
13567   /* Formulate the query text */
13568   if( rc==SQLITE_OK ){
13569     sqlite3 *dbrem = (p->iSample==100 ? p->db : p->dbv);
13570     rc = idxPrepareStmt(dbrem, &pQuery, pzErr, zQuery);
13571   }
13572   sqlite3_free(zQuery);
13573 
13574   if( rc==SQLITE_OK ){
13575     aStat = (int*)idxMalloc(&rc, sizeof(int)*(nCol+1));
13576   }
13577   if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pQuery) ){
13578     IdxHashEntry *pEntry;
13579     char *zStat = 0;
13580     for(i=0; i<=nCol; i++) aStat[i] = 1;
13581     while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pQuery) ){
13582       aStat[0]++;
13583       for(i=0; i<nCol; i++){
13584         if( sqlite3_column_int(pQuery, i)==0 ) break;
13585       }
13586       for(/*no-op*/; i<nCol; i++){
13587         aStat[i+1]++;
13588       }
13589     }
13590 
13591     if( rc==SQLITE_OK ){
13592       int s0 = aStat[0];
13593       zStat = sqlite3_mprintf("%d", s0);
13594       if( zStat==0 ) rc = SQLITE_NOMEM;
13595       for(i=1; rc==SQLITE_OK && i<=nCol; i++){
13596         zStat = idxAppendText(&rc, zStat, " %d", (s0+aStat[i]/2) / aStat[i]);
13597       }
13598     }
13599 
13600     if( rc==SQLITE_OK ){
13601       sqlite3_bind_text(pWriteStat, 1, zTab, -1, SQLITE_STATIC);
13602       sqlite3_bind_text(pWriteStat, 2, zIdx, -1, SQLITE_STATIC);
13603       sqlite3_bind_text(pWriteStat, 3, zStat, -1, SQLITE_STATIC);
13604       sqlite3_step(pWriteStat);
13605       rc = sqlite3_reset(pWriteStat);
13606     }
13607 
13608     pEntry = idxHashFind(&p->hIdx, zIdx, STRLEN(zIdx));
13609     if( pEntry ){
13610       assert( pEntry->zVal2==0 );
13611       pEntry->zVal2 = zStat;
13612     }else{
13613       sqlite3_free(zStat);
13614     }
13615   }
13616   sqlite3_free(aStat);
13617   idxFinalize(&rc, pQuery);
13618 
13619   return rc;
13620 }
13621 
idxBuildSampleTable(sqlite3expert * p,const char * zTab)13622 static int idxBuildSampleTable(sqlite3expert *p, const char *zTab){
13623   int rc;
13624   char *zSql;
13625 
13626   rc = sqlite3_exec(p->dbv,"DROP TABLE IF EXISTS temp."UNIQUE_TABLE_NAME,0,0,0);
13627   if( rc!=SQLITE_OK ) return rc;
13628 
13629   zSql = sqlite3_mprintf(
13630       "CREATE TABLE temp." UNIQUE_TABLE_NAME " AS SELECT * FROM %Q", zTab
13631   );
13632   if( zSql==0 ) return SQLITE_NOMEM;
13633   rc = sqlite3_exec(p->dbv, zSql, 0, 0, 0);
13634   sqlite3_free(zSql);
13635 
13636   return rc;
13637 }
13638 
13639 /*
13640 ** This function is called as part of sqlite3_expert_analyze(). Candidate
13641 ** indexes have already been created in database sqlite3expert.dbm, this
13642 ** function populates sqlite_stat1 table in the same database.
13643 **
13644 ** The stat1 data is generated by querying the
13645 */
idxPopulateStat1(sqlite3expert * p,char ** pzErr)13646 static int idxPopulateStat1(sqlite3expert *p, char **pzErr){
13647   int rc = SQLITE_OK;
13648   int nMax =0;
13649   struct IdxRemCtx *pCtx = 0;
13650   struct IdxSampleCtx samplectx;
13651   int i;
13652   i64 iPrev = -100000;
13653   sqlite3_stmt *pAllIndex = 0;
13654   sqlite3_stmt *pIndexXInfo = 0;
13655   sqlite3_stmt *pWrite = 0;
13656 
13657   const char *zAllIndex =
13658     "SELECT s.rowid, s.name, l.name FROM "
13659     "  sqlite_schema AS s, "
13660     "  pragma_index_list(s.name) AS l "
13661     "WHERE s.type = 'table'";
13662   const char *zIndexXInfo =
13663     "SELECT name, coll FROM pragma_index_xinfo(?) WHERE key";
13664   const char *zWrite = "INSERT INTO sqlite_stat1 VALUES(?, ?, ?)";
13665 
13666   /* If iSample==0, no sqlite_stat1 data is required. */
13667   if( p->iSample==0 ) return SQLITE_OK;
13668 
13669   rc = idxLargestIndex(p->dbm, &nMax, pzErr);
13670   if( nMax<=0 || rc!=SQLITE_OK ) return rc;
13671 
13672   rc = sqlite3_exec(p->dbm, "ANALYZE; PRAGMA writable_schema=1", 0, 0, 0);
13673 
13674   if( rc==SQLITE_OK ){
13675     int nByte = sizeof(struct IdxRemCtx) + (sizeof(struct IdxRemSlot) * nMax);
13676     pCtx = (struct IdxRemCtx*)idxMalloc(&rc, nByte);
13677   }
13678 
13679   if( rc==SQLITE_OK ){
13680     sqlite3 *dbrem = (p->iSample==100 ? p->db : p->dbv);
13681     rc = sqlite3_create_function(
13682         dbrem, "rem", 2, SQLITE_UTF8, (void*)pCtx, idxRemFunc, 0, 0
13683     );
13684   }
13685   if( rc==SQLITE_OK ){
13686     rc = sqlite3_create_function(
13687         p->db, "sample", 0, SQLITE_UTF8, (void*)&samplectx, idxSampleFunc, 0, 0
13688     );
13689   }
13690 
13691   if( rc==SQLITE_OK ){
13692     pCtx->nSlot = nMax+1;
13693     rc = idxPrepareStmt(p->dbm, &pAllIndex, pzErr, zAllIndex);
13694   }
13695   if( rc==SQLITE_OK ){
13696     rc = idxPrepareStmt(p->dbm, &pIndexXInfo, pzErr, zIndexXInfo);
13697   }
13698   if( rc==SQLITE_OK ){
13699     rc = idxPrepareStmt(p->dbm, &pWrite, pzErr, zWrite);
13700   }
13701 
13702   while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pAllIndex) ){
13703     i64 iRowid = sqlite3_column_int64(pAllIndex, 0);
13704     const char *zTab = (const char*)sqlite3_column_text(pAllIndex, 1);
13705     const char *zIdx = (const char*)sqlite3_column_text(pAllIndex, 2);
13706     if( zTab==0 || zIdx==0 ) continue;
13707     if( p->iSample<100 && iPrev!=iRowid ){
13708       samplectx.target = (double)p->iSample / 100.0;
13709       samplectx.iTarget = p->iSample;
13710       samplectx.nRow = 0.0;
13711       samplectx.nRet = 0.0;
13712       rc = idxBuildSampleTable(p, zTab);
13713       if( rc!=SQLITE_OK ) break;
13714     }
13715     rc = idxPopulateOneStat1(p, pIndexXInfo, pWrite, zTab, zIdx, pzErr);
13716     iPrev = iRowid;
13717   }
13718   if( rc==SQLITE_OK && p->iSample<100 ){
13719     rc = sqlite3_exec(p->dbv,
13720         "DROP TABLE IF EXISTS temp." UNIQUE_TABLE_NAME, 0,0,0
13721     );
13722   }
13723 
13724   idxFinalize(&rc, pAllIndex);
13725   idxFinalize(&rc, pIndexXInfo);
13726   idxFinalize(&rc, pWrite);
13727 
13728   if( pCtx ){
13729     for(i=0; i<pCtx->nSlot; i++){
13730       sqlite3_free(pCtx->aSlot[i].z);
13731     }
13732     sqlite3_free(pCtx);
13733   }
13734 
13735   if( rc==SQLITE_OK ){
13736     rc = sqlite3_exec(p->dbm, "ANALYZE sqlite_schema", 0, 0, 0);
13737   }
13738 
13739   sqlite3_exec(p->db, "DROP TABLE IF EXISTS temp."UNIQUE_TABLE_NAME,0,0,0);
13740   return rc;
13741 }
13742 
13743 /*
13744 ** Define and possibly pretend to use a useless collation sequence.
13745 ** This pretense allows expert to accept SQL using custom collations.
13746 */
dummyCompare(void * up1,int up2,const void * up3,int up4,const void * up5)13747 int dummyCompare(void *up1, int up2, const void *up3, int up4, const void *up5){
13748   (void)up1;
13749   (void)up2;
13750   (void)up3;
13751   (void)up4;
13752   (void)up5;
13753   assert(0); /* VDBE should never be run. */
13754   return 0;
13755 }
13756 /* And a callback to register above upon actual need */
useDummyCS(void * up1,sqlite3 * db,int etr,const char * zName)13757 void useDummyCS(void *up1, sqlite3 *db, int etr, const char *zName){
13758   (void)up1;
13759   sqlite3_create_collation_v2(db, zName, etr, 0, dummyCompare, 0);
13760 }
13761 
13762 #if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) \
13763   && !defined(SQLITE_OMIT_INTROSPECTION_PRAGMAS)
13764 /*
13765 ** dummy functions for no-op implementation of UDFs during expert's work
13766 */
dummyUDF(sqlite3_context * up1,int up2,sqlite3_value ** up3)13767 void dummyUDF(sqlite3_context *up1, int up2, sqlite3_value **up3){
13768   (void)up1;
13769   (void)up2;
13770   (void)up3;
13771   assert(0); /* VDBE should never be run. */
13772 }
dummyUDFvalue(sqlite3_context * up1)13773 void dummyUDFvalue(sqlite3_context *up1){
13774   (void)up1;
13775   assert(0); /* VDBE should never be run. */
13776 }
13777 
13778 /*
13779 ** Register UDFs from user database with another.
13780 */
registerUDFs(sqlite3 * dbSrc,sqlite3 * dbDst)13781 int registerUDFs(sqlite3 *dbSrc, sqlite3 *dbDst){
13782   sqlite3_stmt *pStmt;
13783   int rc = sqlite3_prepare_v2(dbSrc,
13784             "SELECT name,type,enc,narg,flags "
13785             "FROM pragma_function_list() "
13786             "WHERE builtin==0", -1, &pStmt, 0);
13787   if( rc==SQLITE_OK ){
13788     while( SQLITE_ROW==(rc = sqlite3_step(pStmt)) ){
13789       int nargs = sqlite3_column_int(pStmt,3);
13790       int flags = sqlite3_column_int(pStmt,4);
13791       const char *name = (char*)sqlite3_column_text(pStmt,0);
13792       const char *type = (char*)sqlite3_column_text(pStmt,1);
13793       const char *enc = (char*)sqlite3_column_text(pStmt,2);
13794       if( name==0 || type==0 || enc==0 ){
13795         /* no-op.  Only happens on OOM */
13796       }else{
13797         int ienc = SQLITE_UTF8;
13798         int rcf = SQLITE_ERROR;
13799         if( strcmp(enc,"utf16le")==0 ) ienc = SQLITE_UTF16LE;
13800         else if( strcmp(enc,"utf16be")==0 ) ienc = SQLITE_UTF16BE;
13801         ienc |= (flags & (SQLITE_DETERMINISTIC|SQLITE_DIRECTONLY));
13802         if( strcmp(type,"w")==0 ){
13803           rcf = sqlite3_create_window_function(dbDst,name,nargs,ienc,0,
13804                                                dummyUDF,dummyUDFvalue,0,0,0);
13805         }else if( strcmp(type,"a")==0 ){
13806           rcf = sqlite3_create_function(dbDst,name,nargs,ienc,0,
13807                                         0,dummyUDF,dummyUDFvalue);
13808         }else if( strcmp(type,"s")==0 ){
13809           rcf = sqlite3_create_function(dbDst,name,nargs,ienc,0,
13810                                         dummyUDF,0,0);
13811         }
13812         if( rcf!=SQLITE_OK ){
13813           rc = rcf;
13814           break;
13815         }
13816       }
13817     }
13818     sqlite3_finalize(pStmt);
13819     if( rc==SQLITE_DONE ) rc = SQLITE_OK;
13820   }
13821   return rc;
13822 }
13823 #endif
13824 
13825 /*
13826 ** Allocate a new sqlite3expert object.
13827 */
sqlite3_expert_new(sqlite3 * db,char ** pzErrmsg)13828 sqlite3expert *sqlite3_expert_new(sqlite3 *db, char **pzErrmsg){
13829   int rc = SQLITE_OK;
13830   sqlite3expert *pNew;
13831 
13832   pNew = (sqlite3expert*)idxMalloc(&rc, sizeof(sqlite3expert));
13833 
13834   /* Open two in-memory databases to work with. The "vtab database" (dbv)
13835   ** will contain a virtual table corresponding to each real table in
13836   ** the user database schema, and a copy of each view. It is used to
13837   ** collect information regarding the WHERE, ORDER BY and other clauses
13838   ** of the user's query.
13839   */
13840   if( rc==SQLITE_OK ){
13841     pNew->db = db;
13842     pNew->iSample = 100;
13843     rc = sqlite3_open(":memory:", &pNew->dbv);
13844   }
13845   if( rc==SQLITE_OK ){
13846     rc = sqlite3_open(":memory:", &pNew->dbm);
13847     if( rc==SQLITE_OK ){
13848       sqlite3_db_config(pNew->dbm, SQLITE_DBCONFIG_TRIGGER_EQP, 1, (int*)0);
13849     }
13850   }
13851 
13852   /* Allow custom collations to be dealt with through prepare. */
13853   if( rc==SQLITE_OK ) rc = sqlite3_collation_needed(pNew->dbm,0,useDummyCS);
13854   if( rc==SQLITE_OK ) rc = sqlite3_collation_needed(pNew->dbv,0,useDummyCS);
13855 
13856 #if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) \
13857   && !defined(SQLITE_OMIT_INTROSPECTION_PRAGMAS)
13858   /* Register UDFs from database [db] with [dbm] and [dbv]. */
13859   if( rc==SQLITE_OK ){
13860     rc = registerUDFs(pNew->db, pNew->dbm);
13861   }
13862   if( rc==SQLITE_OK ){
13863     rc = registerUDFs(pNew->db, pNew->dbv);
13864   }
13865 #endif
13866 
13867   /* Copy the entire schema of database [db] into [dbm]. */
13868   if( rc==SQLITE_OK ){
13869     sqlite3_stmt *pSql = 0;
13870     rc = idxPrintfPrepareStmt(pNew->db, &pSql, pzErrmsg,
13871         "SELECT sql FROM sqlite_schema WHERE name NOT LIKE 'sqlite_%%'"
13872         " AND sql NOT LIKE 'CREATE VIRTUAL %%' ORDER BY rowid"
13873     );
13874     while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
13875       const char *zSql = (const char*)sqlite3_column_text(pSql, 0);
13876       if( zSql ) rc = sqlite3_exec(pNew->dbm, zSql, 0, 0, pzErrmsg);
13877     }
13878     idxFinalize(&rc, pSql);
13879   }
13880 
13881   /* Create the vtab schema */
13882   if( rc==SQLITE_OK ){
13883     rc = idxCreateVtabSchema(pNew, pzErrmsg);
13884   }
13885 
13886   /* Register the auth callback with dbv */
13887   if( rc==SQLITE_OK ){
13888     sqlite3_set_authorizer(pNew->dbv, idxAuthCallback, (void*)pNew);
13889   }
13890 
13891   /* If an error has occurred, free the new object and reutrn NULL. Otherwise,
13892   ** return the new sqlite3expert handle.  */
13893   if( rc!=SQLITE_OK ){
13894     sqlite3_expert_destroy(pNew);
13895     pNew = 0;
13896   }
13897   return pNew;
13898 }
13899 
13900 /*
13901 ** Configure an sqlite3expert object.
13902 */
sqlite3_expert_config(sqlite3expert * p,int op,...)13903 int sqlite3_expert_config(sqlite3expert *p, int op, ...){
13904   int rc = SQLITE_OK;
13905   va_list ap;
13906   va_start(ap, op);
13907   switch( op ){
13908     case EXPERT_CONFIG_SAMPLE: {
13909       int iVal = va_arg(ap, int);
13910       if( iVal<0 ) iVal = 0;
13911       if( iVal>100 ) iVal = 100;
13912       p->iSample = iVal;
13913       break;
13914     }
13915     default:
13916       rc = SQLITE_NOTFOUND;
13917       break;
13918   }
13919 
13920   va_end(ap);
13921   return rc;
13922 }
13923 
13924 /*
13925 ** Add an SQL statement to the analysis.
13926 */
sqlite3_expert_sql(sqlite3expert * p,const char * zSql,char ** pzErr)13927 int sqlite3_expert_sql(
13928   sqlite3expert *p,               /* From sqlite3_expert_new() */
13929   const char *zSql,               /* SQL statement to add */
13930   char **pzErr                    /* OUT: Error message (if any) */
13931 ){
13932   IdxScan *pScanOrig = p->pScan;
13933   IdxStatement *pStmtOrig = p->pStatement;
13934   int rc = SQLITE_OK;
13935   const char *zStmt = zSql;
13936 
13937   if( p->bRun ) return SQLITE_MISUSE;
13938 
13939   while( rc==SQLITE_OK && zStmt && zStmt[0] ){
13940     sqlite3_stmt *pStmt = 0;
13941     /* Ensure that the provided statement compiles against user's DB. */
13942     rc = idxPrepareStmt(p->db, &pStmt, pzErr, zStmt);
13943     if( rc!=SQLITE_OK ) break;
13944     sqlite3_finalize(pStmt);
13945     rc = sqlite3_prepare_v2(p->dbv, zStmt, -1, &pStmt, &zStmt);
13946     if( rc==SQLITE_OK ){
13947       if( pStmt ){
13948         IdxStatement *pNew;
13949         const char *z = sqlite3_sql(pStmt);
13950         int n = STRLEN(z);
13951         pNew = (IdxStatement*)idxMalloc(&rc, sizeof(IdxStatement) + n+1);
13952         if( rc==SQLITE_OK ){
13953           pNew->zSql = (char*)&pNew[1];
13954           memcpy(pNew->zSql, z, n+1);
13955           pNew->pNext = p->pStatement;
13956           if( p->pStatement ) pNew->iId = p->pStatement->iId+1;
13957           p->pStatement = pNew;
13958         }
13959         sqlite3_finalize(pStmt);
13960       }
13961     }else{
13962       idxDatabaseError(p->dbv, pzErr);
13963     }
13964   }
13965 
13966   if( rc!=SQLITE_OK ){
13967     idxScanFree(p->pScan, pScanOrig);
13968     idxStatementFree(p->pStatement, pStmtOrig);
13969     p->pScan = pScanOrig;
13970     p->pStatement = pStmtOrig;
13971   }
13972 
13973   return rc;
13974 }
13975 
sqlite3_expert_analyze(sqlite3expert * p,char ** pzErr)13976 int sqlite3_expert_analyze(sqlite3expert *p, char **pzErr){
13977   int rc;
13978   IdxHashEntry *pEntry;
13979 
13980   /* Do trigger processing to collect any extra IdxScan structures */
13981   rc = idxProcessTriggers(p, pzErr);
13982 
13983   /* Create candidate indexes within the in-memory database file */
13984   if( rc==SQLITE_OK ){
13985     rc = idxCreateCandidates(p);
13986   }else if ( rc==SQLITE_BUSY_TIMEOUT ){
13987     if( pzErr )
13988       *pzErr = sqlite3_mprintf("Cannot find a unique index name to propose.");
13989     return rc;
13990   }
13991 
13992   /* Generate the stat1 data */
13993   if( rc==SQLITE_OK ){
13994     rc = idxPopulateStat1(p, pzErr);
13995   }
13996 
13997   /* Formulate the EXPERT_REPORT_CANDIDATES text */
13998   for(pEntry=p->hIdx.pFirst; pEntry; pEntry=pEntry->pNext){
13999     p->zCandidates = idxAppendText(&rc, p->zCandidates,
14000         "%s;%s%s\n", pEntry->zVal,
14001         pEntry->zVal2 ? " -- stat1: " : "", pEntry->zVal2
14002     );
14003   }
14004 
14005   /* Figure out which of the candidate indexes are preferred by the query
14006   ** planner and report the results to the user.  */
14007   if( rc==SQLITE_OK ){
14008     rc = idxFindIndexes(p, pzErr);
14009   }
14010 
14011   if( rc==SQLITE_OK ){
14012     p->bRun = 1;
14013   }
14014   return rc;
14015 }
14016 
14017 /*
14018 ** Return the total number of statements that have been added to this
14019 ** sqlite3expert using sqlite3_expert_sql().
14020 */
sqlite3_expert_count(sqlite3expert * p)14021 int sqlite3_expert_count(sqlite3expert *p){
14022   int nRet = 0;
14023   if( p->pStatement ) nRet = p->pStatement->iId+1;
14024   return nRet;
14025 }
14026 
14027 /*
14028 ** Return a component of the report.
14029 */
sqlite3_expert_report(sqlite3expert * p,int iStmt,int eReport)14030 const char *sqlite3_expert_report(sqlite3expert *p, int iStmt, int eReport){
14031   const char *zRet = 0;
14032   IdxStatement *pStmt;
14033 
14034   if( p->bRun==0 ) return 0;
14035   for(pStmt=p->pStatement; pStmt && pStmt->iId!=iStmt; pStmt=pStmt->pNext);
14036   switch( eReport ){
14037     case EXPERT_REPORT_SQL:
14038       if( pStmt ) zRet = pStmt->zSql;
14039       break;
14040     case EXPERT_REPORT_INDEXES:
14041       if( pStmt ) zRet = pStmt->zIdx;
14042       break;
14043     case EXPERT_REPORT_PLAN:
14044       if( pStmt ) zRet = pStmt->zEQP;
14045       break;
14046     case EXPERT_REPORT_CANDIDATES:
14047       zRet = p->zCandidates;
14048       break;
14049   }
14050   return zRet;
14051 }
14052 
14053 /*
14054 ** Free an sqlite3expert object.
14055 */
sqlite3_expert_destroy(sqlite3expert * p)14056 void sqlite3_expert_destroy(sqlite3expert *p){
14057   if( p ){
14058     sqlite3_close(p->dbm);
14059     sqlite3_close(p->dbv);
14060     idxScanFree(p->pScan, 0);
14061     idxStatementFree(p->pStatement, 0);
14062     idxTableFree(p->pTable);
14063     idxWriteFree(p->pWrite);
14064     idxHashClear(&p->hIdx);
14065     sqlite3_free(p->zCandidates);
14066     sqlite3_free(p);
14067   }
14068 }
14069 
14070 #endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
14071 
14072 /************************* End ../ext/expert/sqlite3expert.c ********************/
14073 
14074 /************************* Begin ../ext/intck/sqlite3intck.h ******************/
14075 /*
14076 ** 2024-02-08
14077 **
14078 ** The author disclaims copyright to this source code.  In place of
14079 ** a legal notice, here is a blessing:
14080 **
14081 **    May you do good and not evil.
14082 **    May you find forgiveness for yourself and forgive others.
14083 **    May you share freely, never taking more than you give.
14084 **
14085 *************************************************************************
14086 */
14087 
14088 /*
14089 ** Incremental Integrity-Check Extension
14090 ** -------------------------------------
14091 **
14092 ** This module contains code to check whether or not an SQLite database
14093 ** is well-formed or corrupt. This is the same task as performed by SQLite's
14094 ** built-in "PRAGMA integrity_check" command. This module differs from
14095 ** "PRAGMA integrity_check" in that:
14096 **
14097 **   +  It is less thorough - this module does not detect certain types
14098 **      of corruption that are detected by the PRAGMA command. However,
14099 **      it does detect all kinds of corruption that are likely to cause
14100 **      errors in SQLite applications.
14101 **
14102 **   +  It is slower. Sometimes up to three times slower.
14103 **
14104 **   +  It allows integrity-check operations to be split into multiple
14105 **      transactions, so that the database does not need to be read-locked
14106 **      for the duration of the integrity-check.
14107 **
14108 ** One way to use the API to run integrity-check on the "main" database
14109 ** of handle db is:
14110 **
14111 **   int rc = SQLITE_OK;
14112 **   sqlite3_intck *p = 0;
14113 **
14114 **   sqlite3_intck_open(db, "main", &p);
14115 **   while( SQLITE_OK==sqlite3_intck_step(p) ){
14116 **     const char *zMsg = sqlite3_intck_message(p);
14117 **     if( zMsg ) printf("corruption: %s\n", zMsg);
14118 **   }
14119 **   rc = sqlite3_intck_error(p, &zErr);
14120 **   if( rc!=SQLITE_OK ){
14121 **     printf("error occured (rc=%d), (errmsg=%s)\n", rc, zErr);
14122 **   }
14123 **   sqlite3_intck_close(p);
14124 **
14125 ** Usually, the sqlite3_intck object opens a read transaction within the
14126 ** first call to sqlite3_intck_step() and holds it open until the
14127 ** integrity-check is complete. However, if sqlite3_intck_unlock() is
14128 ** called, the read transaction is ended and a new read transaction opened
14129 ** by the subsequent call to sqlite3_intck_step().
14130 */
14131 
14132 #ifndef _SQLITE_INTCK_H
14133 #define _SQLITE_INTCK_H
14134 
14135 /* #include "sqlite3.h" */
14136 
14137 #ifdef __cplusplus
14138 extern "C" {
14139 #endif
14140 
14141 /*
14142 ** An ongoing incremental integrity-check operation is represented by an
14143 ** opaque pointer of the following type.
14144 */
14145 typedef struct sqlite3_intck sqlite3_intck;
14146 
14147 /*
14148 ** Open a new incremental integrity-check object. If successful, populate
14149 ** output variable (*ppOut) with the new object handle and return SQLITE_OK.
14150 ** Or, if an error occurs, set (*ppOut) to NULL and return an SQLite error
14151 ** code (e.g. SQLITE_NOMEM).
14152 **
14153 ** The integrity-check will be conducted on database zDb (which must be "main",
14154 ** "temp", or the name of an attached database) of database handle db. Once
14155 ** this function has been called successfully, the caller should not use
14156 ** database handle db until the integrity-check object has been destroyed
14157 ** using sqlite3_intck_close().
14158 */
14159 int sqlite3_intck_open(
14160   sqlite3 *db,                    /* Database handle */
14161   const char *zDb,                /* Database name ("main", "temp" etc.) */
14162   sqlite3_intck **ppOut           /* OUT: New sqlite3_intck handle */
14163 );
14164 
14165 /*
14166 ** Close and release all resources associated with a handle opened by an
14167 ** earlier call to sqlite3_intck_open(). The results of using an
14168 ** integrity-check handle after it has been passed to this function are
14169 ** undefined.
14170 */
14171 void sqlite3_intck_close(sqlite3_intck *pCk);
14172 
14173 /*
14174 ** Do the next step of the integrity-check operation specified by the handle
14175 ** passed as the only argument. This function returns SQLITE_DONE if the
14176 ** integrity-check operation is finished, or an SQLite error code if
14177 ** an error occurs, or SQLITE_OK if no error occurs but the integrity-check
14178 ** is not finished. It is not considered an error if database corruption
14179 ** is encountered.
14180 **
14181 ** Following a successful call to sqlite3_intck_step() (one that returns
14182 ** SQLITE_OK), sqlite3_intck_message() returns a non-NULL value if
14183 ** corruption was detected in the db.
14184 **
14185 ** If an error occurs and a value other than SQLITE_OK or SQLITE_DONE is
14186 ** returned, then the integrity-check handle is placed in an error state.
14187 ** In this state all subsequent calls to sqlite3_intck_step() or
14188 ** sqlite3_intck_unlock() will immediately return the same error. The
14189 ** sqlite3_intck_error() method may be used to obtain an English language
14190 ** error message in this case.
14191 */
14192 int sqlite3_intck_step(sqlite3_intck *pCk);
14193 
14194 /*
14195 ** If the previous call to sqlite3_intck_step() encountered corruption
14196 ** within the database, then this function returns a pointer to a buffer
14197 ** containing a nul-terminated string describing the corruption in
14198 ** English. If the previous call to sqlite3_intck_step() did not encounter
14199 ** corruption, or if there was no previous call, this function returns
14200 ** NULL.
14201 */
14202 const char *sqlite3_intck_message(sqlite3_intck *pCk);
14203 
14204 /*
14205 ** Close any read-transaction opened by an earlier call to
14206 ** sqlite3_intck_step(). Any subsequent call to sqlite3_intck_step() will
14207 ** open a new transaction. Return SQLITE_OK if successful, or an SQLite error
14208 ** code otherwise.
14209 **
14210 ** If an error occurs, then the integrity-check handle is placed in an error
14211 ** state. In this state all subsequent calls to sqlite3_intck_step() or
14212 ** sqlite3_intck_unlock() will immediately return the same error. The
14213 ** sqlite3_intck_error() method may be used to obtain an English language
14214 ** error message in this case.
14215 */
14216 int sqlite3_intck_unlock(sqlite3_intck *pCk);
14217 
14218 /*
14219 ** If an error has occurred in an earlier call to sqlite3_intck_step()
14220 ** or sqlite3_intck_unlock(), then this method returns the associated
14221 ** SQLite error code. Additionally, if pzErr is not NULL, then (*pzErr)
14222 ** may be set to point to a nul-terminated string containing an English
14223 ** language error message. Or, if no error message is available, to
14224 ** NULL.
14225 **
14226 ** If no error has occurred within sqlite3_intck_step() or
14227 ** sqlite_intck_unlock() calls on the handle passed as the first argument,
14228 ** then SQLITE_OK is returned and (*pzErr) set to NULL.
14229 */
14230 int sqlite3_intck_error(sqlite3_intck *pCk, const char **pzErr);
14231 
14232 /*
14233 ** This API is used for testing only. It returns the full-text of an SQL
14234 ** statement used to test object zObj, which may be a table or index.
14235 ** The returned buffer is valid until the next call to either this function
14236 ** or sqlite3_intck_close() on the same sqlite3_intck handle.
14237 */
14238 const char *sqlite3_intck_test_sql(sqlite3_intck *pCk, const char *zObj);
14239 
14240 
14241 #ifdef __cplusplus
14242 }  /* end of the 'extern "C"' block */
14243 #endif
14244 
14245 #endif /* ifndef _SQLITE_INTCK_H */
14246 
14247 /************************* End ../ext/intck/sqlite3intck.h ********************/
14248 /************************* Begin ../ext/intck/sqlite3intck.c ******************/
14249 /*
14250 ** 2024-02-08
14251 **
14252 ** The author disclaims copyright to this source code.  In place of
14253 ** a legal notice, here is a blessing:
14254 **
14255 **    May you do good and not evil.
14256 **    May you find forgiveness for yourself and forgive others.
14257 **    May you share freely, never taking more than you give.
14258 **
14259 *************************************************************************
14260 */
14261 
14262 /* #include "sqlite3intck.h" */
14263 #include <string.h>
14264 #include <assert.h>
14265 
14266 #include <stdio.h>
14267 #include <stdlib.h>
14268 
14269 /*
14270 ** nKeyVal:
14271 **   The number of values that make up the 'key' for the current pCheck
14272 **   statement.
14273 **
14274 ** rc:
14275 **   Error code returned by most recent sqlite3_intck_step() or
14276 **   sqlite3_intck_unlock() call. This is set to SQLITE_DONE when
14277 **   the integrity-check operation is finished.
14278 **
14279 ** zErr:
14280 **   If the object has entered the error state, this is the error message.
14281 **   Is freed using sqlite3_free() when the object is deleted.
14282 **
14283 ** zTestSql:
14284 **   The value returned by the most recent call to sqlite3_intck_testsql().
14285 **   Each call to testsql() frees the previous zTestSql value (using
14286 **   sqlite3_free()) and replaces it with the new value it will return.
14287 */
14288 struct sqlite3_intck {
14289   sqlite3 *db;
14290   const char *zDb;                /* Copy of zDb parameter to _open() */
14291   char *zObj;                     /* Current object. Or NULL. */
14292 
14293   sqlite3_stmt *pCheck;           /* Current check statement */
14294   char *zKey;
14295   int nKeyVal;
14296 
14297   char *zMessage;
14298   int bCorruptSchema;
14299 
14300   int rc;                         /* Error code */
14301   char *zErr;                     /* Error message */
14302   char *zTestSql;                 /* Returned by sqlite3_intck_test_sql() */
14303 };
14304 
14305 
14306 /*
14307 ** Some error has occurred while using database p->db. Save the error message
14308 ** and error code currently held by the database handle in p->rc and p->zErr.
14309 */
intckSaveErrmsg(sqlite3_intck * p)14310 static void intckSaveErrmsg(sqlite3_intck *p){
14311   p->rc = sqlite3_errcode(p->db);
14312   sqlite3_free(p->zErr);
14313   p->zErr = sqlite3_mprintf("%s", sqlite3_errmsg(p->db));
14314 }
14315 
14316 /*
14317 ** If the handle passed as the first argument is already in the error state,
14318 ** then this function is a no-op (returns NULL immediately). Otherwise, if an
14319 ** error occurs within this function, it leaves an error in said handle.
14320 **
14321 ** Otherwise, this function attempts to prepare SQL statement zSql and
14322 ** return the resulting statement handle to the user.
14323 */
intckPrepare(sqlite3_intck * p,const char * zSql)14324 static sqlite3_stmt *intckPrepare(sqlite3_intck *p, const char *zSql){
14325   sqlite3_stmt *pRet = 0;
14326   if( p->rc==SQLITE_OK ){
14327     p->rc = sqlite3_prepare_v2(p->db, zSql, -1, &pRet, 0);
14328     if( p->rc!=SQLITE_OK ){
14329       intckSaveErrmsg(p);
14330       assert( pRet==0 );
14331     }
14332   }
14333   return pRet;
14334 }
14335 
14336 /*
14337 ** If the handle passed as the first argument is already in the error state,
14338 ** then this function is a no-op (returns NULL immediately). Otherwise, if an
14339 ** error occurs within this function, it leaves an error in said handle.
14340 **
14341 ** Otherwise, this function treats argument zFmt as a printf() style format
14342 ** string. It formats it according to the trailing arguments and then
14343 ** attempts to prepare the results and return the resulting prepared
14344 ** statement.
14345 */
intckPrepareFmt(sqlite3_intck * p,const char * zFmt,...)14346 static sqlite3_stmt *intckPrepareFmt(sqlite3_intck *p, const char *zFmt, ...){
14347   sqlite3_stmt *pRet = 0;
14348   va_list ap;
14349   char *zSql = 0;
14350   va_start(ap, zFmt);
14351   zSql = sqlite3_vmprintf(zFmt, ap);
14352   if( p->rc==SQLITE_OK && zSql==0 ){
14353     p->rc = SQLITE_NOMEM;
14354   }
14355   pRet = intckPrepare(p, zSql);
14356   sqlite3_free(zSql);
14357   va_end(ap);
14358   return pRet;
14359 }
14360 
14361 /*
14362 ** Finalize SQL statement pStmt. If an error occurs and the handle passed
14363 ** as the first argument does not already contain an error, store the
14364 ** error in the handle.
14365 */
intckFinalize(sqlite3_intck * p,sqlite3_stmt * pStmt)14366 static void intckFinalize(sqlite3_intck *p, sqlite3_stmt *pStmt){
14367   int rc = sqlite3_finalize(pStmt);
14368   if( p->rc==SQLITE_OK && rc!=SQLITE_OK ){
14369     intckSaveErrmsg(p);
14370   }
14371 }
14372 
14373 /*
14374 ** If there is already an error in handle p, return it. Otherwise, call
14375 ** sqlite3_step() on the statement handle and return that value.
14376 */
intckStep(sqlite3_intck * p,sqlite3_stmt * pStmt)14377 static int intckStep(sqlite3_intck *p, sqlite3_stmt *pStmt){
14378   if( p->rc ) return p->rc;
14379   return sqlite3_step(pStmt);
14380 }
14381 
14382 /*
14383 ** Execute SQL statement zSql. There is no way to obtain any results
14384 ** returned by the statement. This function uses the sqlite3_intck error
14385 ** code convention.
14386 */
intckExec(sqlite3_intck * p,const char * zSql)14387 static void intckExec(sqlite3_intck *p, const char *zSql){
14388   sqlite3_stmt *pStmt = 0;
14389   pStmt = intckPrepare(p, zSql);
14390   intckStep(p, pStmt);
14391   intckFinalize(p, pStmt);
14392 }
14393 
14394 /*
14395 ** A wrapper around sqlite3_mprintf() that uses the sqlite3_intck error
14396 ** code convention.
14397 */
intckMprintf(sqlite3_intck * p,const char * zFmt,...)14398 static char *intckMprintf(sqlite3_intck *p, const char *zFmt, ...){
14399   va_list ap;
14400   char *zRet = 0;
14401   va_start(ap, zFmt);
14402   zRet = sqlite3_vmprintf(zFmt, ap);
14403   if( p->rc==SQLITE_OK ){
14404     if( zRet==0 ){
14405       p->rc = SQLITE_NOMEM;
14406     }
14407   }else{
14408     sqlite3_free(zRet);
14409     zRet = 0;
14410   }
14411   return zRet;
14412 }
14413 
14414 /*
14415 ** This is used by sqlite3_intck_unlock() to save the vector key value
14416 ** required to restart the current pCheck query as a nul-terminated string
14417 ** in p->zKey.
14418 */
intckSaveKey(sqlite3_intck * p)14419 static void intckSaveKey(sqlite3_intck *p){
14420   int ii;
14421   char *zSql = 0;
14422   sqlite3_stmt *pStmt = 0;
14423   sqlite3_stmt *pXinfo = 0;
14424   const char *zDir = 0;
14425 
14426   assert( p->pCheck );
14427   assert( p->zKey==0 );
14428 
14429   pXinfo = intckPrepareFmt(p,
14430       "SELECT group_concat(desc, '') FROM %Q.sqlite_schema s, "
14431       "pragma_index_xinfo(%Q, %Q) "
14432       "WHERE s.type='index' AND s.name=%Q",
14433       p->zDb, p->zObj, p->zDb, p->zObj
14434   );
14435   if( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pXinfo) ){
14436     zDir = (const char*)sqlite3_column_text(pXinfo, 0);
14437   }
14438 
14439   if( zDir==0 ){
14440     /* Object is a table, not an index. This is the easy case,as there are
14441     ** no DESC columns or NULL values in a primary key.  */
14442     const char *zSep = "SELECT '(' || ";
14443     for(ii=0; ii<p->nKeyVal; ii++){
14444       zSql = intckMprintf(p, "%z%squote(?)", zSql, zSep);
14445       zSep = " || ', ' || ";
14446     }
14447     zSql = intckMprintf(p, "%z || ')'", zSql);
14448   }else{
14449 
14450     /* Object is an index. */
14451     assert( p->nKeyVal>1 );
14452     for(ii=p->nKeyVal; ii>0; ii--){
14453       int bLastIsDesc = zDir[ii-1]=='1';
14454       int bLastIsNull = sqlite3_column_type(p->pCheck, ii)==SQLITE_NULL;
14455       const char *zLast = sqlite3_column_name(p->pCheck, ii);
14456       char *zLhs = 0;
14457       char *zRhs = 0;
14458       char *zWhere = 0;
14459 
14460       if( bLastIsNull ){
14461         if( bLastIsDesc ) continue;
14462         zWhere = intckMprintf(p, "'%s IS NOT NULL'", zLast);
14463       }else{
14464         const char *zOp = bLastIsDesc ? "<" : ">";
14465         zWhere = intckMprintf(p, "'%s %s ' || quote(?%d)", zLast, zOp, ii);
14466       }
14467 
14468       if( ii>1 ){
14469         const char *zLhsSep = "";
14470         const char *zRhsSep = "";
14471         int jj;
14472         for(jj=0; jj<ii-1; jj++){
14473           const char *zAlias = (const char*)sqlite3_column_name(p->pCheck,jj+1);
14474           zLhs = intckMprintf(p, "%z%s%s", zLhs, zLhsSep, zAlias);
14475           zRhs = intckMprintf(p, "%z%squote(?%d)", zRhs, zRhsSep, jj+1);
14476           zLhsSep = ",";
14477           zRhsSep = " || ',' || ";
14478         }
14479 
14480         zWhere = intckMprintf(p,
14481             "'(%z) IS (' || %z || ') AND ' || %z",
14482             zLhs, zRhs, zWhere);
14483       }
14484       zWhere = intckMprintf(p, "'WHERE ' || %z", zWhere);
14485 
14486       zSql = intckMprintf(p, "%z%s(quote( %z ) )",
14487           zSql,
14488           (zSql==0 ? "VALUES" : ",\n      "),
14489           zWhere
14490       );
14491     }
14492     zSql = intckMprintf(p,
14493         "WITH wc(q) AS (\n%z\n)"
14494         "SELECT 'VALUES' || group_concat('(' || q || ')', ',\n      ') FROM wc"
14495         , zSql
14496     );
14497   }
14498 
14499   pStmt = intckPrepare(p, zSql);
14500   if( p->rc==SQLITE_OK ){
14501     for(ii=0; ii<p->nKeyVal; ii++){
14502       sqlite3_bind_value(pStmt, ii+1, sqlite3_column_value(p->pCheck, ii+1));
14503     }
14504     if( SQLITE_ROW==sqlite3_step(pStmt) ){
14505       p->zKey = intckMprintf(p,"%s",(const char*)sqlite3_column_text(pStmt, 0));
14506     }
14507     intckFinalize(p, pStmt);
14508   }
14509 
14510   sqlite3_free(zSql);
14511   intckFinalize(p, pXinfo);
14512 }
14513 
14514 /*
14515 ** Find the next database object (table or index) to check. If successful,
14516 ** set sqlite3_intck.zObj to point to a nul-terminated buffer containing
14517 ** the object's name before returning.
14518 */
intckFindObject(sqlite3_intck * p)14519 static void intckFindObject(sqlite3_intck *p){
14520   sqlite3_stmt *pStmt = 0;
14521   char *zPrev = p->zObj;
14522   p->zObj = 0;
14523 
14524   assert( p->rc==SQLITE_OK );
14525   assert( p->pCheck==0 );
14526 
14527   pStmt = intckPrepareFmt(p,
14528     "WITH tables(table_name) AS ("
14529     "  SELECT name"
14530     "  FROM %Q.sqlite_schema WHERE (type='table' OR type='index') AND rootpage"
14531     "  UNION ALL "
14532     "  SELECT 'sqlite_schema'"
14533     ")"
14534     "SELECT table_name FROM tables "
14535     "WHERE ?1 IS NULL OR table_name%s?1 "
14536     "ORDER BY 1"
14537     , p->zDb, (p->zKey ? ">=" : ">")
14538   );
14539 
14540   if( p->rc==SQLITE_OK ){
14541     sqlite3_bind_text(pStmt, 1, zPrev, -1, SQLITE_TRANSIENT);
14542     if( sqlite3_step(pStmt)==SQLITE_ROW ){
14543       p->zObj = intckMprintf(p,"%s",(const char*)sqlite3_column_text(pStmt, 0));
14544     }
14545   }
14546   intckFinalize(p, pStmt);
14547 
14548   /* If this is a new object, ensure the previous key value is cleared. */
14549   if( sqlite3_stricmp(p->zObj, zPrev) ){
14550     sqlite3_free(p->zKey);
14551     p->zKey = 0;
14552   }
14553 
14554   sqlite3_free(zPrev);
14555 }
14556 
14557 /*
14558 ** Return the size in bytes of the first token in nul-terminated buffer z.
14559 ** For the purposes of this call, a token is either:
14560 **
14561 **   *  a quoted SQL string,
14562 *    *  a contiguous series of ascii alphabet characters, or
14563 *    *  any other single byte.
14564 */
intckGetToken(const char * z)14565 static int intckGetToken(const char *z){
14566   char c = z[0];
14567   int iRet = 1;
14568   if( c=='\'' || c=='"' || c=='`' ){
14569     while( 1 ){
14570       if( z[iRet]==c ){
14571         iRet++;
14572         if( z[iRet]!=c ) break;
14573       }
14574       iRet++;
14575     }
14576   }
14577   else if( c=='[' ){
14578     while( z[iRet++]!=']' && z[iRet] );
14579   }
14580   else if( (c>='A' && c<='Z') || (c>='a' && c<='z') ){
14581     while( (z[iRet]>='A' && z[iRet]<='Z') || (z[iRet]>='a' && z[iRet]<='z') ){
14582       iRet++;
14583     }
14584   }
14585 
14586   return iRet;
14587 }
14588 
14589 /*
14590 ** Return true if argument c is an ascii whitespace character.
14591 */
intckIsSpace(char c)14592 static int intckIsSpace(char c){
14593   return (c==' ' || c=='\t' || c=='\n' || c=='\r');
14594 }
14595 
14596 /*
14597 ** Argument z points to the text of a CREATE INDEX statement. This function
14598 ** identifies the part of the text that contains either the index WHERE
14599 ** clause (if iCol<0) or the iCol'th column of the index.
14600 **
14601 ** If (iCol<0), the identified fragment does not include the "WHERE" keyword,
14602 ** only the expression that follows it. If (iCol>=0) then the identified
14603 ** fragment does not include any trailing sort-order keywords - "ASC" or
14604 ** "DESC".
14605 **
14606 ** If the CREATE INDEX statement does not contain the requested field or
14607 ** clause, NULL is returned and (*pnByte) is set to 0. Otherwise, a pointer to
14608 ** the identified fragment is returned and output parameter (*pnByte) set
14609 ** to its size in bytes.
14610 */
intckParseCreateIndex(const char * z,int iCol,int * pnByte)14611 static const char *intckParseCreateIndex(const char *z, int iCol, int *pnByte){
14612   int iOff = 0;
14613   int iThisCol = 0;
14614   int iStart = 0;
14615   int nOpen = 0;
14616 
14617   const char *zRet = 0;
14618   int nRet = 0;
14619 
14620   int iEndOfCol = 0;
14621 
14622   /* Skip forward until the first "(" token */
14623   while( z[iOff]!='(' ){
14624     iOff += intckGetToken(&z[iOff]);
14625     if( z[iOff]=='\0' ) return 0;
14626   }
14627   assert( z[iOff]=='(' );
14628 
14629   nOpen = 1;
14630   iOff++;
14631   iStart = iOff;
14632   while( z[iOff] ){
14633     const char *zToken = &z[iOff];
14634     int nToken = 0;
14635 
14636     /* Check if this is the end of the current column - either a "," or ")"
14637     ** when nOpen==1.  */
14638     if( nOpen==1 ){
14639       if( z[iOff]==',' || z[iOff]==')' ){
14640         if( iCol==iThisCol ){
14641           int iEnd = iEndOfCol ? iEndOfCol : iOff;
14642           nRet = (iEnd - iStart);
14643           zRet = &z[iStart];
14644           break;
14645         }
14646         iStart = iOff+1;
14647         while( intckIsSpace(z[iStart]) ) iStart++;
14648         iThisCol++;
14649       }
14650       if( z[iOff]==')' ) break;
14651     }
14652     if( z[iOff]=='(' ) nOpen++;
14653     if( z[iOff]==')' ) nOpen--;
14654     nToken = intckGetToken(zToken);
14655 
14656     if( (nToken==3 && 0==sqlite3_strnicmp(zToken, "ASC", nToken))
14657      || (nToken==4 && 0==sqlite3_strnicmp(zToken, "DESC", nToken))
14658     ){
14659       iEndOfCol = iOff;
14660     }else if( 0==intckIsSpace(zToken[0]) ){
14661       iEndOfCol = 0;
14662     }
14663 
14664     iOff += nToken;
14665   }
14666 
14667   /* iStart is now the byte offset of 1 byte passed the final ')' in the
14668   ** CREATE INDEX statement. Try to find a WHERE clause to return.  */
14669   while( zRet==0 && z[iOff] ){
14670     int n = intckGetToken(&z[iOff]);
14671     if( n==5 && 0==sqlite3_strnicmp(&z[iOff], "where", 5) ){
14672       zRet = &z[iOff+5];
14673       nRet = (int)strlen(zRet);
14674     }
14675     iOff += n;
14676   }
14677 
14678   /* Trim any whitespace from the start and end of the returned string. */
14679   if( zRet ){
14680     while( intckIsSpace(zRet[0]) ){
14681       nRet--;
14682       zRet++;
14683     }
14684     while( nRet>0 && intckIsSpace(zRet[nRet-1]) ) nRet--;
14685   }
14686 
14687   *pnByte = nRet;
14688   return zRet;
14689 }
14690 
14691 /*
14692 ** User-defined SQL function wrapper for intckParseCreateIndex():
14693 **
14694 **     SELECT parse_create_index(<sql>, <icol>);
14695 */
intckParseCreateIndexFunc(sqlite3_context * pCtx,int nVal,sqlite3_value ** apVal)14696 static void intckParseCreateIndexFunc(
14697   sqlite3_context *pCtx,
14698   int nVal,
14699   sqlite3_value **apVal
14700 ){
14701   const char *zSql = (const char*)sqlite3_value_text(apVal[0]);
14702   int idx = sqlite3_value_int(apVal[1]);
14703   const char *zRes = 0;
14704   int nRes = 0;
14705 
14706   assert( nVal==2 );
14707   if( zSql ){
14708     zRes = intckParseCreateIndex(zSql, idx, &nRes);
14709   }
14710   sqlite3_result_text(pCtx, zRes, nRes, SQLITE_TRANSIENT);
14711 }
14712 
14713 /*
14714 ** Return true if sqlite3_intck.db has automatic indexes enabled, false
14715 ** otherwise.
14716 */
intckGetAutoIndex(sqlite3_intck * p)14717 static int intckGetAutoIndex(sqlite3_intck *p){
14718   int bRet = 0;
14719   sqlite3_stmt *pStmt = 0;
14720   pStmt = intckPrepare(p, "PRAGMA automatic_index");
14721   if( SQLITE_ROW==intckStep(p, pStmt) ){
14722     bRet = sqlite3_column_int(pStmt, 0);
14723   }
14724   intckFinalize(p, pStmt);
14725   return bRet;
14726 }
14727 
14728 /*
14729 ** Return true if zObj is an index, or false otherwise.
14730 */
intckIsIndex(sqlite3_intck * p,const char * zObj)14731 static int intckIsIndex(sqlite3_intck *p, const char *zObj){
14732   int bRet = 0;
14733   sqlite3_stmt *pStmt = 0;
14734   pStmt = intckPrepareFmt(p,
14735       "SELECT 1 FROM %Q.sqlite_schema WHERE name=%Q AND type='index'",
14736       p->zDb, zObj
14737   );
14738   if( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
14739     bRet = 1;
14740   }
14741   intckFinalize(p, pStmt);
14742   return bRet;
14743 }
14744 
14745 /*
14746 ** Return a pointer to a nul-terminated buffer containing the SQL statement
14747 ** used to check database object zObj (a table or index) for corruption.
14748 ** If parameter zPrev is not NULL, then it must be a string containing the
14749 ** vector key required to restart the check where it left off last time.
14750 ** If pnKeyVal is not NULL, then (*pnKeyVal) is set to the number of
14751 ** columns in the vector key value for the specified object.
14752 **
14753 ** This function uses the sqlite3_intck error code convention.
14754 */
intckCheckObjectSql(sqlite3_intck * p,const char * zObj,const char * zPrev,int * pnKeyVal)14755 static char *intckCheckObjectSql(
14756   sqlite3_intck *p,               /* Integrity check object */
14757   const char *zObj,               /* Object (table or index) to scan */
14758   const char *zPrev,              /* Restart key vector, if any */
14759   int *pnKeyVal                   /* OUT: Number of key-values for this scan */
14760 ){
14761   char *zRet = 0;
14762   sqlite3_stmt *pStmt = 0;
14763   int bAutoIndex = 0;
14764   int bIsIndex = 0;
14765 
14766   const char *zCommon =
14767       /* Relation without_rowid also contains just one row. Column "b" is
14768       ** set to true if the table being examined is a WITHOUT ROWID table,
14769       ** or false otherwise.  */
14770       ", without_rowid(b) AS ("
14771       "  SELECT EXISTS ("
14772       "    SELECT 1 FROM tabname, pragma_index_list(tab, db) AS l"
14773       "      WHERE origin='pk' "
14774       "      AND NOT EXISTS (SELECT 1 FROM sqlite_schema WHERE name=l.name)"
14775       "  )"
14776       ")"
14777       ""
14778       /* Table idx_cols contains 1 row for each column in each index on the
14779       ** table being checked. Columns are:
14780       **
14781       **   idx_name: Name of the index.
14782       **   idx_ispk: True if this index is the PK of a WITHOUT ROWID table.
14783       **   col_name: Name of indexed column, or NULL for index on expression.
14784       **   col_expr: Indexed expression, including COLLATE clause.
14785       **   col_alias: Alias used for column in 'intck_wrapper' table.
14786       */
14787       ", idx_cols(idx_name, idx_ispk, col_name, col_expr, col_alias) AS ("
14788       "  SELECT l.name, (l.origin=='pk' AND w.b), i.name, COALESCE(("
14789       "    SELECT parse_create_index(sql, i.seqno) FROM "
14790       "    sqlite_schema WHERE name = l.name"
14791       "  ), format('\"%w\"', i.name) || ' COLLATE ' || quote(i.coll)),"
14792       "  'c' || row_number() OVER ()"
14793       "  FROM "
14794       "      tabname t,"
14795       "      without_rowid w,"
14796       "      pragma_index_list(t.tab, t.db) l,"
14797       "      pragma_index_xinfo(l.name) i"
14798       "      WHERE i.key"
14799       "  UNION ALL"
14800       "  SELECT '', 1, '_rowid_', '_rowid_', 'r1' FROM without_rowid WHERE b=0"
14801       ")"
14802       ""
14803       ""
14804       /*
14805       ** For a PK declared as "PRIMARY KEY(a, b) ... WITHOUT ROWID", where
14806       ** the intck_wrapper aliases of "a" and "b" are "c1" and "c2":
14807       **
14808       **   o_pk:   "o.c1, o.c2"
14809       **   i_pk:   "i.'a', i.'b'"
14810       **   ...
14811       **   n_pk:   2
14812       */
14813       ", tabpk(db, tab, idx, o_pk, i_pk, q_pk, eq_pk, ps_pk, pk_pk, n_pk) AS ("
14814       "    WITH pkfields(f, a) AS ("
14815       "      SELECT i.col_name, i.col_alias FROM idx_cols i WHERE i.idx_ispk"
14816       "    )"
14817       "    SELECT t.db, t.tab, t.idx, "
14818       "           group_concat(a, ', '), "
14819       "           group_concat('i.'||quote(f), ', '), "
14820       "           group_concat('quote(o.'||a||')', ' || '','' || '),  "
14821       "           format('(%s)==(%s)',"
14822       "               group_concat('o.'||a, ', '), "
14823       "               group_concat(format('\"%w\"', f), ', ')"
14824       "           ),"
14825       "           group_concat('%s', ','),"
14826       "           group_concat('quote('||a||')', ', '),  "
14827       "           count(*)"
14828       "    FROM tabname t, pkfields"
14829       ")"
14830       ""
14831       ", idx(name, match_expr, partial, partial_alias, idx_ps, idx_idx) AS ("
14832       "  SELECT idx_name,"
14833       "    format('(%s,%s) IS (%s,%s)', "
14834       "           group_concat(i.col_expr, ', '), i_pk,"
14835       "           group_concat('o.'||i.col_alias, ', '), o_pk"
14836       "    ), "
14837       "    parse_create_index("
14838       "        (SELECT sql FROM sqlite_schema WHERE name=idx_name), -1"
14839       "    ),"
14840       "    'cond' || row_number() OVER ()"
14841       "    , group_concat('%s', ',')"
14842       "    , group_concat('quote('||i.col_alias||')', ', ')"
14843       "  FROM tabpk t, "
14844       "       without_rowid w,"
14845       "       idx_cols i"
14846       "  WHERE i.idx_ispk==0 "
14847       "  GROUP BY idx_name"
14848       ")"
14849       ""
14850       ", wrapper_with(s) AS ("
14851       "  SELECT 'intck_wrapper AS (\n  SELECT\n    ' || ("
14852       "      WITH f(a, b) AS ("
14853       "        SELECT col_expr, col_alias FROM idx_cols"
14854       "          UNION ALL "
14855       "        SELECT partial, partial_alias FROM idx WHERE partial IS NOT NULL"
14856       "      )"
14857       "      SELECT group_concat(format('%s AS %s', a, b), ',\n    ') FROM f"
14858       "    )"
14859       "    || format('\n  FROM %Q.%Q ', t.db, t.tab)"
14860            /* If the object being checked is a table, append "NOT INDEXED".
14861            ** Otherwise, append "INDEXED BY <index>", and then, if the index
14862            ** is a partial index " WHERE <condition>".  */
14863       "    || CASE WHEN t.idx IS NULL THEN "
14864       "        'NOT INDEXED'"
14865       "       ELSE"
14866       "        format('INDEXED BY %Q%s', t.idx, ' WHERE '||i.partial)"
14867       "       END"
14868       "    || '\n)'"
14869       "    FROM tabname t LEFT JOIN idx i ON (i.name=t.idx)"
14870       ")"
14871       ""
14872   ;
14873 
14874   bAutoIndex = intckGetAutoIndex(p);
14875   if( bAutoIndex ) intckExec(p, "PRAGMA automatic_index = 0");
14876 
14877   bIsIndex = intckIsIndex(p, zObj);
14878   if( bIsIndex ){
14879     pStmt = intckPrepareFmt(p,
14880       /* Table idxname contains a single row. The first column, "db", contains
14881       ** the name of the db containing the table (e.g. "main") and the second,
14882       ** "tab", the name of the table itself.  */
14883       "WITH tabname(db, tab, idx) AS ("
14884       "  SELECT %Q, (SELECT tbl_name FROM %Q.sqlite_schema WHERE name=%Q), %Q "
14885       ")"
14886       ""
14887       ", whereclause(w_c) AS (%s)"
14888       ""
14889       "%s" /* zCommon */
14890       ""
14891       ", case_statement(c) AS ("
14892       "  SELECT "
14893       "    'CASE WHEN (' || group_concat(col_alias, ', ') || ', 1) IS (\n' "
14894       "    || '      SELECT ' || group_concat(col_expr, ', ') || ', 1 FROM '"
14895       "    || format('%%Q.%%Q NOT INDEXED WHERE %%s\n', t.db, t.tab, p.eq_pk)"
14896       "    || '    )\n  THEN NULL\n    '"
14897       "    || 'ELSE format(''surplus entry ('"
14898       "    ||   group_concat('%%s', ',') || ',' || p.ps_pk"
14899       "    || ') in index ' || t.idx || ''', ' "
14900       "    ||   group_concat('quote('||i.col_alias||')', ', ') || ', ' || p.pk_pk"
14901       "    || ')'"
14902       "    || '\n  END AS error_message'"
14903       "  FROM tabname t, tabpk p, idx_cols i WHERE i.idx_name=t.idx"
14904       ")"
14905       ""
14906       ", thiskey(k, n) AS ("
14907       "    SELECT group_concat(i.col_alias, ', ') || ', ' || p.o_pk, "
14908       "           count(*) + p.n_pk "
14909       "    FROM tabpk p, idx_cols i WHERE i.idx_name=p.idx"
14910       ")"
14911       ""
14912       ", main_select(m, n) AS ("
14913       "  SELECT format("
14914       "      'WITH %%s\n' ||"
14915       "      ', idx_checker AS (\n' ||"
14916       "      '  SELECT %%s,\n' ||"
14917       "      '  %%s\n' || "
14918       "      '  FROM intck_wrapper AS o\n' ||"
14919       "      ')\n',"
14920       "      ww.s, c, t.k"
14921       "  ), t.n"
14922       "  FROM case_statement, wrapper_with ww, thiskey t"
14923       ")"
14924 
14925       "SELECT m || "
14926       "    group_concat('SELECT * FROM idx_checker ' || w_c, ' UNION ALL '), n"
14927       " FROM "
14928       "main_select, whereclause "
14929       , p->zDb, p->zDb, zObj, zObj
14930       , zPrev ? zPrev : "VALUES('')", zCommon
14931       );
14932   }else{
14933     pStmt = intckPrepareFmt(p,
14934       /* Table tabname contains a single row. The first column, "db", contains
14935       ** the name of the db containing the table (e.g. "main") and the second,
14936       ** "tab", the name of the table itself.  */
14937       "WITH tabname(db, tab, idx, prev) AS (SELECT %Q, %Q, NULL, %Q)"
14938       ""
14939       "%s" /* zCommon */
14940 
14941       /* expr(e) contains one row for each index on table zObj. Value e
14942       ** is set to an expression that evaluates to NULL if the required
14943       ** entry is present in the index, or an error message otherwise.  */
14944       ", expr(e, p) AS ("
14945       "  SELECT format('CASE WHEN EXISTS \n"
14946       "    (SELECT 1 FROM %%Q.%%Q AS i INDEXED BY %%Q WHERE %%s%%s)\n"
14947       "    THEN NULL\n"
14948       "    ELSE format(''entry (%%s,%%s) missing from index %%s'', %%s, %%s)\n"
14949       "  END\n'"
14950       "    , t.db, t.tab, i.name, i.match_expr, ' AND (' || partial || ')',"
14951       "      i.idx_ps, t.ps_pk, i.name, i.idx_idx, t.pk_pk),"
14952       "    CASE WHEN partial IS NULL THEN NULL ELSE i.partial_alias END"
14953       "  FROM tabpk t, idx i"
14954       ")"
14955 
14956       ", numbered(ii, cond, e) AS ("
14957       "  SELECT 0, 'n.ii=0', 'NULL'"
14958       "    UNION ALL "
14959       "  SELECT row_number() OVER (),"
14960       "      '(n.ii='||row_number() OVER ()||COALESCE(' AND '||p||')', ')'), e"
14961       "  FROM expr"
14962       ")"
14963 
14964       ", counter_with(w) AS ("
14965       "    SELECT 'WITH intck_counter(ii) AS (\n  ' || "
14966       "       group_concat('SELECT '||ii, ' UNION ALL\n  ') "
14967       "    || '\n)' FROM numbered"
14968       ")"
14969       ""
14970       ", case_statement(c) AS ("
14971       "    SELECT 'CASE ' || "
14972       "    group_concat(format('\n  WHEN %%s THEN (%%s)', cond, e), '') ||"
14973       "    '\nEND AS error_message'"
14974       "    FROM numbered"
14975       ")"
14976       ""
14977 
14978       /* This table contains a single row consisting of a single value -
14979       ** the text of an SQL expression that may be used by the main SQL
14980       ** statement to output an SQL literal that can be used to resume
14981       ** the scan if it is suspended. e.g. for a rowid table, an expression
14982       ** like:
14983       **
14984       **     format('(%d,%d)', _rowid_, n.ii)
14985       */
14986       ", thiskey(k, n) AS ("
14987       "    SELECT o_pk || ', ii', n_pk+1 FROM tabpk"
14988       ")"
14989       ""
14990       ", whereclause(w_c) AS ("
14991       "    SELECT CASE WHEN prev!='' THEN "
14992       "    '\nWHERE (' || o_pk ||', n.ii) > ' || prev"
14993       "    ELSE ''"
14994       "    END"
14995       "    FROM tabpk, tabname"
14996       ")"
14997       ""
14998       ", main_select(m, n) AS ("
14999       "  SELECT format("
15000       "      '%%s, %%s\nSELECT %%s,\n%%s\nFROM intck_wrapper AS o"
15001                ", intck_counter AS n%%s\nORDER BY %%s', "
15002       "      w, ww.s, c, thiskey.k, whereclause.w_c, t.o_pk"
15003       "  ), thiskey.n"
15004       "  FROM case_statement, tabpk t, counter_with, "
15005       "       wrapper_with ww, thiskey, whereclause"
15006       ")"
15007 
15008       "SELECT m, n FROM main_select",
15009       p->zDb, zObj, zPrev, zCommon
15010     );
15011   }
15012 
15013   while( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
15014     zRet = intckMprintf(p, "%s", (const char*)sqlite3_column_text(pStmt, 0));
15015     if( pnKeyVal ){
15016       *pnKeyVal = sqlite3_column_int(pStmt, 1);
15017     }
15018   }
15019   intckFinalize(p, pStmt);
15020 
15021   if( bAutoIndex ) intckExec(p, "PRAGMA automatic_index = 1");
15022   return zRet;
15023 }
15024 
15025 /*
15026 ** Open a new integrity-check object.
15027 */
sqlite3_intck_open(sqlite3 * db,const char * zDbArg,sqlite3_intck ** ppOut)15028 int sqlite3_intck_open(
15029   sqlite3 *db,                    /* Database handle to operate on */
15030   const char *zDbArg,             /* "main", "temp" etc. */
15031   sqlite3_intck **ppOut           /* OUT: New integrity-check handle */
15032 ){
15033   sqlite3_intck *pNew = 0;
15034   int rc = SQLITE_OK;
15035   const char *zDb = zDbArg ? zDbArg : "main";
15036   int nDb = (int)strlen(zDb);
15037 
15038   pNew = (sqlite3_intck*)sqlite3_malloc(sizeof(*pNew) + nDb + 1);
15039   if( pNew==0 ){
15040     rc = SQLITE_NOMEM;
15041   }else{
15042     memset(pNew, 0, sizeof(*pNew));
15043     pNew->db = db;
15044     pNew->zDb = (const char*)&pNew[1];
15045     memcpy(&pNew[1], zDb, nDb+1);
15046     rc = sqlite3_create_function(db, "parse_create_index",
15047         2, SQLITE_UTF8, 0, intckParseCreateIndexFunc, 0, 0
15048     );
15049     if( rc!=SQLITE_OK ){
15050       sqlite3_intck_close(pNew);
15051       pNew = 0;
15052     }
15053   }
15054 
15055   *ppOut = pNew;
15056   return rc;
15057 }
15058 
15059 /*
15060 ** Free the integrity-check object.
15061 */
sqlite3_intck_close(sqlite3_intck * p)15062 void sqlite3_intck_close(sqlite3_intck *p){
15063   if( p ){
15064     sqlite3_finalize(p->pCheck);
15065     sqlite3_create_function(
15066         p->db, "parse_create_index", 1, SQLITE_UTF8, 0, 0, 0, 0
15067     );
15068     sqlite3_free(p->zObj);
15069     sqlite3_free(p->zKey);
15070     sqlite3_free(p->zTestSql);
15071     sqlite3_free(p->zErr);
15072     sqlite3_free(p->zMessage);
15073     sqlite3_free(p);
15074   }
15075 }
15076 
15077 /*
15078 ** Step the integrity-check object.
15079 */
sqlite3_intck_step(sqlite3_intck * p)15080 int sqlite3_intck_step(sqlite3_intck *p){
15081   if( p->rc==SQLITE_OK ){
15082 
15083     if( p->zMessage ){
15084       sqlite3_free(p->zMessage);
15085       p->zMessage = 0;
15086     }
15087 
15088     if( p->bCorruptSchema ){
15089       p->rc = SQLITE_DONE;
15090     }else
15091     if( p->pCheck==0 ){
15092       intckFindObject(p);
15093       if( p->rc==SQLITE_OK ){
15094         if( p->zObj ){
15095           char *zSql = 0;
15096           zSql = intckCheckObjectSql(p, p->zObj, p->zKey, &p->nKeyVal);
15097           p->pCheck = intckPrepare(p, zSql);
15098           sqlite3_free(zSql);
15099           sqlite3_free(p->zKey);
15100           p->zKey = 0;
15101         }else{
15102           p->rc = SQLITE_DONE;
15103         }
15104       }else if( p->rc==SQLITE_CORRUPT ){
15105         p->rc = SQLITE_OK;
15106         p->zMessage = intckMprintf(p, "%s",
15107             "corruption found while reading database schema"
15108         );
15109         p->bCorruptSchema = 1;
15110       }
15111     }
15112 
15113     if( p->pCheck ){
15114       assert( p->rc==SQLITE_OK );
15115       if( sqlite3_step(p->pCheck)==SQLITE_ROW ){
15116         /* Normal case, do nothing. */
15117       }else{
15118         intckFinalize(p, p->pCheck);
15119         p->pCheck = 0;
15120         p->nKeyVal = 0;
15121         if( p->rc==SQLITE_CORRUPT ){
15122           p->rc = SQLITE_OK;
15123           p->zMessage = intckMprintf(p,
15124               "corruption found while scanning database object %s", p->zObj
15125           );
15126         }
15127       }
15128     }
15129   }
15130 
15131   return p->rc;
15132 }
15133 
15134 /*
15135 ** Return a message describing the corruption encountered by the most recent
15136 ** call to sqlite3_intck_step(), or NULL if no corruption was encountered.
15137 */
sqlite3_intck_message(sqlite3_intck * p)15138 const char *sqlite3_intck_message(sqlite3_intck *p){
15139   assert( p->pCheck==0 || p->zMessage==0 );
15140   if( p->zMessage ){
15141     return p->zMessage;
15142   }
15143   if( p->pCheck ){
15144     return (const char*)sqlite3_column_text(p->pCheck, 0);
15145   }
15146   return 0;
15147 }
15148 
15149 /*
15150 ** Return the error code and message.
15151 */
sqlite3_intck_error(sqlite3_intck * p,const char ** pzErr)15152 int sqlite3_intck_error(sqlite3_intck *p, const char **pzErr){
15153   if( pzErr ) *pzErr = p->zErr;
15154   return (p->rc==SQLITE_DONE ? SQLITE_OK : p->rc);
15155 }
15156 
15157 /*
15158 ** Close any read transaction the integrity-check object is holding open
15159 ** on the database.
15160 */
sqlite3_intck_unlock(sqlite3_intck * p)15161 int sqlite3_intck_unlock(sqlite3_intck *p){
15162   if( p->rc==SQLITE_OK && p->pCheck ){
15163     assert( p->zKey==0 && p->nKeyVal>0 );
15164     intckSaveKey(p);
15165     intckFinalize(p, p->pCheck);
15166     p->pCheck = 0;
15167   }
15168   return p->rc;
15169 }
15170 
15171 /*
15172 ** Return the SQL statement used to check object zObj. Or, if zObj is
15173 ** NULL, the current SQL statement.
15174 */
sqlite3_intck_test_sql(sqlite3_intck * p,const char * zObj)15175 const char *sqlite3_intck_test_sql(sqlite3_intck *p, const char *zObj){
15176   sqlite3_free(p->zTestSql);
15177   if( zObj ){
15178     p->zTestSql = intckCheckObjectSql(p, zObj, 0, 0);
15179   }else{
15180     if( p->zObj ){
15181       p->zTestSql = intckCheckObjectSql(p, p->zObj, p->zKey, 0);
15182     }else{
15183       sqlite3_free(p->zTestSql);
15184       p->zTestSql = 0;
15185     }
15186   }
15187   return p->zTestSql;
15188 }
15189 
15190 /************************* End ../ext/intck/sqlite3intck.c ********************/
15191 
15192 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
15193 #define SQLITE_SHELL_HAVE_RECOVER 1
15194 #else
15195 #define SQLITE_SHELL_HAVE_RECOVER 0
15196 #endif
15197 #if SQLITE_SHELL_HAVE_RECOVER
15198 /************************* Begin ../ext/recover/sqlite3recover.h ******************/
15199 /*
15200 ** 2022-08-27
15201 **
15202 ** The author disclaims copyright to this source code.  In place of
15203 ** a legal notice, here is a blessing:
15204 **
15205 **    May you do good and not evil.
15206 **    May you find forgiveness for yourself and forgive others.
15207 **    May you share freely, never taking more than you give.
15208 **
15209 *************************************************************************
15210 **
15211 ** This file contains the public interface to the "recover" extension -
15212 ** an SQLite extension designed to recover data from corrupted database
15213 ** files.
15214 */
15215 
15216 /*
15217 ** OVERVIEW:
15218 **
15219 ** To use the API to recover data from a corrupted database, an
15220 ** application:
15221 **
15222 **   1) Creates an sqlite3_recover handle by calling either
15223 **      sqlite3_recover_init() or sqlite3_recover_init_sql().
15224 **
15225 **   2) Configures the new handle using one or more calls to
15226 **      sqlite3_recover_config().
15227 **
15228 **   3) Executes the recovery by repeatedly calling sqlite3_recover_step() on
15229 **      the handle until it returns something other than SQLITE_OK. If it
15230 **      returns SQLITE_DONE, then the recovery operation completed without
15231 **      error. If it returns some other non-SQLITE_OK value, then an error
15232 **      has occurred.
15233 **
15234 **   4) Retrieves any error code and English language error message using the
15235 **      sqlite3_recover_errcode() and sqlite3_recover_errmsg() APIs,
15236 **      respectively.
15237 **
15238 **   5) Destroys the sqlite3_recover handle and frees all resources
15239 **      using sqlite3_recover_finish().
15240 **
15241 ** The application may abandon the recovery operation at any point
15242 ** before it is finished by passing the sqlite3_recover handle to
15243 ** sqlite3_recover_finish(). This is not an error, but the final state
15244 ** of the output database, or the results of running the partial script
15245 ** delivered to the SQL callback, are undefined.
15246 */
15247 
15248 #ifndef _SQLITE_RECOVER_H
15249 #define _SQLITE_RECOVER_H
15250 
15251 /* #include "sqlite3.h" */
15252 
15253 #ifdef __cplusplus
15254 extern "C" {
15255 #endif
15256 
15257 /*
15258 ** An instance of the sqlite3_recover object represents a recovery
15259 ** operation in progress.
15260 **
15261 ** Constructors:
15262 **
15263 **    sqlite3_recover_init()
15264 **    sqlite3_recover_init_sql()
15265 **
15266 ** Destructor:
15267 **
15268 **    sqlite3_recover_finish()
15269 **
15270 ** Methods:
15271 **
15272 **    sqlite3_recover_config()
15273 **    sqlite3_recover_errcode()
15274 **    sqlite3_recover_errmsg()
15275 **    sqlite3_recover_run()
15276 **    sqlite3_recover_step()
15277 */
15278 typedef struct sqlite3_recover sqlite3_recover;
15279 
15280 /*
15281 ** These two APIs attempt to create and return a new sqlite3_recover object.
15282 ** In both cases the first two arguments identify the (possibly
15283 ** corrupt) database to recover data from. The first argument is an open
15284 ** database handle and the second the name of a database attached to that
15285 ** handle (i.e. "main", "temp" or the name of an attached database).
15286 **
15287 ** If sqlite3_recover_init() is used to create the new sqlite3_recover
15288 ** handle, then data is recovered into a new database, identified by
15289 ** string parameter zUri. zUri may be an absolute or relative file path,
15290 ** or may be an SQLite URI. If the identified database file already exists,
15291 ** it is overwritten.
15292 **
15293 ** If sqlite3_recover_init_sql() is invoked, then any recovered data will
15294 ** be returned to the user as a series of SQL statements. Executing these
15295 ** SQL statements results in the same database as would have been created
15296 ** had sqlite3_recover_init() been used. For each SQL statement in the
15297 ** output, the callback function passed as the third argument (xSql) is
15298 ** invoked once. The first parameter is a passed a copy of the fourth argument
15299 ** to this function (pCtx) as its first parameter, and a pointer to a
15300 ** nul-terminated buffer containing the SQL statement formated as UTF-8 as
15301 ** the second. If the xSql callback returns any value other than SQLITE_OK,
15302 ** then processing is immediately abandoned and the value returned used as
15303 ** the recover handle error code (see below).
15304 **
15305 ** If an out-of-memory error occurs, NULL may be returned instead of
15306 ** a valid handle. In all other cases, it is the responsibility of the
15307 ** application to avoid resource leaks by ensuring that
15308 ** sqlite3_recover_finish() is called on all allocated handles.
15309 */
15310 sqlite3_recover *sqlite3_recover_init(
15311   sqlite3* db,
15312   const char *zDb,
15313   const char *zUri
15314 );
15315 sqlite3_recover *sqlite3_recover_init_sql(
15316   sqlite3* db,
15317   const char *zDb,
15318   int (*xSql)(void*, const char*),
15319   void *pCtx
15320 );
15321 
15322 /*
15323 ** Configure an sqlite3_recover object that has just been created using
15324 ** sqlite3_recover_init() or sqlite3_recover_init_sql(). This function
15325 ** may only be called before the first call to sqlite3_recover_step()
15326 ** or sqlite3_recover_run() on the object.
15327 **
15328 ** The second argument passed to this function must be one of the
15329 ** SQLITE_RECOVER_* symbols defined below. Valid values for the third argument
15330 ** depend on the specific SQLITE_RECOVER_* symbol in use.
15331 **
15332 ** SQLITE_OK is returned if the configuration operation was successful,
15333 ** or an SQLite error code otherwise.
15334 */
15335 int sqlite3_recover_config(sqlite3_recover*, int op, void *pArg);
15336 
15337 /*
15338 ** SQLITE_RECOVER_LOST_AND_FOUND:
15339 **   The pArg argument points to a string buffer containing the name
15340 **   of a "lost-and-found" table in the output database, or NULL. If
15341 **   the argument is non-NULL and the database contains seemingly
15342 **   valid pages that cannot be associated with any table in the
15343 **   recovered part of the schema, data is extracted from these
15344 **   pages to add to the lost-and-found table.
15345 **
15346 ** SQLITE_RECOVER_FREELIST_CORRUPT:
15347 **   The pArg value must actually be a pointer to a value of type
15348 **   int containing value 0 or 1 cast as a (void*). If this option is set
15349 **   (argument is 1) and a lost-and-found table has been configured using
15350 **   SQLITE_RECOVER_LOST_AND_FOUND, then is assumed that the freelist is
15351 **   corrupt and an attempt is made to recover records from pages that
15352 **   appear to be linked into the freelist. Otherwise, pages on the freelist
15353 **   are ignored. Setting this option can recover more data from the
15354 **   database, but often ends up "recovering" deleted records. The default
15355 **   value is 0 (clear).
15356 **
15357 ** SQLITE_RECOVER_ROWIDS:
15358 **   The pArg value must actually be a pointer to a value of type
15359 **   int containing value 0 or 1 cast as a (void*). If this option is set
15360 **   (argument is 1), then an attempt is made to recover rowid values
15361 **   that are not also INTEGER PRIMARY KEY values. If this option is
15362 **   clear, then new rowids are assigned to all recovered rows. The
15363 **   default value is 1 (set).
15364 **
15365 ** SQLITE_RECOVER_SLOWINDEXES:
15366 **   The pArg value must actually be a pointer to a value of type
15367 **   int containing value 0 or 1 cast as a (void*). If this option is clear
15368 **   (argument is 0), then when creating an output database, the recover
15369 **   module creates and populates non-UNIQUE indexes right at the end of the
15370 **   recovery operation - after all recoverable data has been inserted
15371 **   into the new database. This is faster overall, but means that the
15372 **   final call to sqlite3_recover_step() for a recovery operation may
15373 **   be need to create a large number of indexes, which may be very slow.
15374 **
15375 **   Or, if this option is set (argument is 1), then non-UNIQUE indexes
15376 **   are created in the output database before it is populated with
15377 **   recovered data. This is slower overall, but avoids the slow call
15378 **   to sqlite3_recover_step() at the end of the recovery operation.
15379 **
15380 **   The default option value is 0.
15381 */
15382 #define SQLITE_RECOVER_LOST_AND_FOUND   1
15383 #define SQLITE_RECOVER_FREELIST_CORRUPT 2
15384 #define SQLITE_RECOVER_ROWIDS           3
15385 #define SQLITE_RECOVER_SLOWINDEXES      4
15386 
15387 /*
15388 ** Perform a unit of work towards the recovery operation. This function
15389 ** must normally be called multiple times to complete database recovery.
15390 **
15391 ** If no error occurs but the recovery operation is not completed, this
15392 ** function returns SQLITE_OK. If recovery has been completed successfully
15393 ** then SQLITE_DONE is returned. If an error has occurred, then an SQLite
15394 ** error code (e.g. SQLITE_IOERR or SQLITE_NOMEM) is returned. It is not
15395 ** considered an error if some or all of the data cannot be recovered
15396 ** due to database corruption.
15397 **
15398 ** Once sqlite3_recover_step() has returned a value other than SQLITE_OK,
15399 ** all further such calls on the same recover handle are no-ops that return
15400 ** the same non-SQLITE_OK value.
15401 */
15402 int sqlite3_recover_step(sqlite3_recover*);
15403 
15404 /*
15405 ** Run the recovery operation to completion. Return SQLITE_OK if successful,
15406 ** or an SQLite error code otherwise. Calling this function is the same
15407 ** as executing:
15408 **
15409 **     while( SQLITE_OK==sqlite3_recover_step(p) );
15410 **     return sqlite3_recover_errcode(p);
15411 */
15412 int sqlite3_recover_run(sqlite3_recover*);
15413 
15414 /*
15415 ** If an error has been encountered during a prior call to
15416 ** sqlite3_recover_step(), then this function attempts to return a
15417 ** pointer to a buffer containing an English language explanation of
15418 ** the error. If no error message is available, or if an out-of memory
15419 ** error occurs while attempting to allocate a buffer in which to format
15420 ** the error message, NULL is returned.
15421 **
15422 ** The returned buffer remains valid until the sqlite3_recover handle is
15423 ** destroyed using sqlite3_recover_finish().
15424 */
15425 const char *sqlite3_recover_errmsg(sqlite3_recover*);
15426 
15427 /*
15428 ** If this function is called on an sqlite3_recover handle after
15429 ** an error occurs, an SQLite error code is returned. Otherwise, SQLITE_OK.
15430 */
15431 int sqlite3_recover_errcode(sqlite3_recover*);
15432 
15433 /*
15434 ** Clean up a recovery object created by a call to sqlite3_recover_init().
15435 ** The results of using a recovery object with any API after it has been
15436 ** passed to this function are undefined.
15437 **
15438 ** This function returns the same value as sqlite3_recover_errcode().
15439 */
15440 int sqlite3_recover_finish(sqlite3_recover*);
15441 
15442 
15443 #ifdef __cplusplus
15444 }  /* end of the 'extern "C"' block */
15445 #endif
15446 
15447 #endif /* ifndef _SQLITE_RECOVER_H */
15448 
15449 /************************* End ../ext/recover/sqlite3recover.h ********************/
15450 # ifndef SQLITE_HAVE_SQLITE3R
15451 /************************* Begin ../ext/recover/dbdata.c ******************/
15452 /*
15453 ** 2019-04-17
15454 **
15455 ** The author disclaims copyright to this source code.  In place of
15456 ** a legal notice, here is a blessing:
15457 **
15458 **    May you do good and not evil.
15459 **    May you find forgiveness for yourself and forgive others.
15460 **    May you share freely, never taking more than you give.
15461 **
15462 ******************************************************************************
15463 **
15464 ** This file contains an implementation of two eponymous virtual tables,
15465 ** "sqlite_dbdata" and "sqlite_dbptr". Both modules require that the
15466 ** "sqlite_dbpage" eponymous virtual table be available.
15467 **
15468 ** SQLITE_DBDATA:
15469 **   sqlite_dbdata is used to extract data directly from a database b-tree
15470 **   page and its associated overflow pages, bypassing the b-tree layer.
15471 **   The table schema is equivalent to:
15472 **
15473 **     CREATE TABLE sqlite_dbdata(
15474 **       pgno INTEGER,
15475 **       cell INTEGER,
15476 **       field INTEGER,
15477 **       value ANY,
15478 **       schema TEXT HIDDEN
15479 **     );
15480 **
15481 **   IMPORTANT: THE VIRTUAL TABLE SCHEMA ABOVE IS SUBJECT TO CHANGE. IN THE
15482 **   FUTURE NEW NON-HIDDEN COLUMNS MAY BE ADDED BETWEEN "value" AND
15483 **   "schema".
15484 **
15485 **   Each page of the database is inspected. If it cannot be interpreted as
15486 **   a b-tree page, or if it is a b-tree page containing 0 entries, the
15487 **   sqlite_dbdata table contains no rows for that page.  Otherwise, the
15488 **   table contains one row for each field in the record associated with
15489 **   each cell on the page. For intkey b-trees, the key value is stored in
15490 **   field -1.
15491 **
15492 **   For example, for the database:
15493 **
15494 **     CREATE TABLE t1(a, b);     -- root page is page 2
15495 **     INSERT INTO t1(rowid, a, b) VALUES(5, 'v', 'five');
15496 **     INSERT INTO t1(rowid, a, b) VALUES(10, 'x', 'ten');
15497 **
15498 **   the sqlite_dbdata table contains, as well as from entries related to
15499 **   page 1, content equivalent to:
15500 **
15501 **     INSERT INTO sqlite_dbdata(pgno, cell, field, value) VALUES
15502 **         (2, 0, -1, 5     ),
15503 **         (2, 0,  0, 'v'   ),
15504 **         (2, 0,  1, 'five'),
15505 **         (2, 1, -1, 10    ),
15506 **         (2, 1,  0, 'x'   ),
15507 **         (2, 1,  1, 'ten' );
15508 **
15509 **   If database corruption is encountered, this module does not report an
15510 **   error. Instead, it attempts to extract as much data as possible and
15511 **   ignores the corruption.
15512 **
15513 ** SQLITE_DBPTR:
15514 **   The sqlite_dbptr table has the following schema:
15515 **
15516 **     CREATE TABLE sqlite_dbptr(
15517 **       pgno INTEGER,
15518 **       child INTEGER,
15519 **       schema TEXT HIDDEN
15520 **     );
15521 **
15522 **   It contains one entry for each b-tree pointer between a parent and
15523 **   child page in the database.
15524 */
15525 
15526 #if !defined(SQLITEINT_H)
15527 /* #include "sqlite3.h" */
15528 
15529 /* typedef unsigned char u8; */
15530 /* typedef unsigned int u32; */
15531 
15532 #endif
15533 #include <string.h>
15534 #include <assert.h>
15535 
15536 #ifndef SQLITE_OMIT_VIRTUALTABLE
15537 
15538 #define DBDATA_PADDING_BYTES 100
15539 
15540 typedef struct DbdataTable DbdataTable;
15541 typedef struct DbdataCursor DbdataCursor;
15542 typedef struct DbdataBuffer DbdataBuffer;
15543 
15544 /*
15545 ** Buffer type.
15546 */
15547 struct DbdataBuffer {
15548   u8 *aBuf;
15549   sqlite3_int64 nBuf;
15550 };
15551 
15552 /* Cursor object */
15553 struct DbdataCursor {
15554   sqlite3_vtab_cursor base;       /* Base class.  Must be first */
15555   sqlite3_stmt *pStmt;            /* For fetching database pages */
15556 
15557   int iPgno;                      /* Current page number */
15558   u8 *aPage;                      /* Buffer containing page */
15559   int nPage;                      /* Size of aPage[] in bytes */
15560   int nCell;                      /* Number of cells on aPage[] */
15561   int iCell;                      /* Current cell number */
15562   int bOnePage;                   /* True to stop after one page */
15563   int szDb;
15564   sqlite3_int64 iRowid;
15565 
15566   /* Only for the sqlite_dbdata table */
15567   DbdataBuffer rec;
15568   sqlite3_int64 nRec;             /* Size of pRec[] in bytes */
15569   sqlite3_int64 nHdr;             /* Size of header in bytes */
15570   int iField;                     /* Current field number */
15571   u8 *pHdrPtr;
15572   u8 *pPtr;
15573   u32 enc;                        /* Text encoding */
15574 
15575   sqlite3_int64 iIntkey;          /* Integer key value */
15576 };
15577 
15578 /* Table object */
15579 struct DbdataTable {
15580   sqlite3_vtab base;              /* Base class.  Must be first */
15581   sqlite3 *db;                    /* The database connection */
15582   sqlite3_stmt *pStmt;            /* For fetching database pages */
15583   int bPtr;                       /* True for sqlite3_dbptr table */
15584 };
15585 
15586 /* Column and schema definitions for sqlite_dbdata */
15587 #define DBDATA_COLUMN_PGNO        0
15588 #define DBDATA_COLUMN_CELL        1
15589 #define DBDATA_COLUMN_FIELD       2
15590 #define DBDATA_COLUMN_VALUE       3
15591 #define DBDATA_COLUMN_SCHEMA      4
15592 #define DBDATA_SCHEMA             \
15593       "CREATE TABLE x("           \
15594       "  pgno INTEGER,"           \
15595       "  cell INTEGER,"           \
15596       "  field INTEGER,"          \
15597       "  value ANY,"              \
15598       "  schema TEXT HIDDEN"      \
15599       ")"
15600 
15601 /* Column and schema definitions for sqlite_dbptr */
15602 #define DBPTR_COLUMN_PGNO         0
15603 #define DBPTR_COLUMN_CHILD        1
15604 #define DBPTR_COLUMN_SCHEMA       2
15605 #define DBPTR_SCHEMA              \
15606       "CREATE TABLE x("           \
15607       "  pgno INTEGER,"           \
15608       "  child INTEGER,"          \
15609       "  schema TEXT HIDDEN"      \
15610       ")"
15611 
15612 /*
15613 ** Ensure the buffer passed as the first argument is at least nMin bytes
15614 ** in size. If an error occurs while attempting to resize the buffer,
15615 ** SQLITE_NOMEM is returned. Otherwise, SQLITE_OK.
15616 */
dbdataBufferSize(DbdataBuffer * pBuf,sqlite3_int64 nMin)15617 static int dbdataBufferSize(DbdataBuffer *pBuf, sqlite3_int64 nMin){
15618   if( nMin>pBuf->nBuf ){
15619     sqlite3_int64 nNew = nMin+16384;
15620     u8 *aNew = (u8*)sqlite3_realloc64(pBuf->aBuf, nNew);
15621 
15622     if( aNew==0 ) return SQLITE_NOMEM;
15623     pBuf->aBuf = aNew;
15624     pBuf->nBuf = nNew;
15625   }
15626   return SQLITE_OK;
15627 }
15628 
15629 /*
15630 ** Release the allocation managed by buffer pBuf.
15631 */
dbdataBufferFree(DbdataBuffer * pBuf)15632 static void dbdataBufferFree(DbdataBuffer *pBuf){
15633   sqlite3_free(pBuf->aBuf);
15634   memset(pBuf, 0, sizeof(*pBuf));
15635 }
15636 
15637 /*
15638 ** Connect to an sqlite_dbdata (pAux==0) or sqlite_dbptr (pAux!=0) virtual
15639 ** table.
15640 */
dbdataConnect(sqlite3 * db,void * pAux,int argc,const char * const * argv,sqlite3_vtab ** ppVtab,char ** pzErr)15641 static int dbdataConnect(
15642   sqlite3 *db,
15643   void *pAux,
15644   int argc, const char *const*argv,
15645   sqlite3_vtab **ppVtab,
15646   char **pzErr
15647 ){
15648   DbdataTable *pTab = 0;
15649   int rc = sqlite3_declare_vtab(db, pAux ? DBPTR_SCHEMA : DBDATA_SCHEMA);
15650 
15651   (void)argc;
15652   (void)argv;
15653   (void)pzErr;
15654   sqlite3_vtab_config(db, SQLITE_VTAB_USES_ALL_SCHEMAS);
15655   if( rc==SQLITE_OK ){
15656     pTab = (DbdataTable*)sqlite3_malloc64(sizeof(DbdataTable));
15657     if( pTab==0 ){
15658       rc = SQLITE_NOMEM;
15659     }else{
15660       memset(pTab, 0, sizeof(DbdataTable));
15661       pTab->db = db;
15662       pTab->bPtr = (pAux!=0);
15663     }
15664   }
15665 
15666   *ppVtab = (sqlite3_vtab*)pTab;
15667   return rc;
15668 }
15669 
15670 /*
15671 ** Disconnect from or destroy a sqlite_dbdata or sqlite_dbptr virtual table.
15672 */
dbdataDisconnect(sqlite3_vtab * pVtab)15673 static int dbdataDisconnect(sqlite3_vtab *pVtab){
15674   DbdataTable *pTab = (DbdataTable*)pVtab;
15675   if( pTab ){
15676     sqlite3_finalize(pTab->pStmt);
15677     sqlite3_free(pVtab);
15678   }
15679   return SQLITE_OK;
15680 }
15681 
15682 /*
15683 ** This function interprets two types of constraints:
15684 **
15685 **       schema=?
15686 **       pgno=?
15687 **
15688 ** If neither are present, idxNum is set to 0. If schema=? is present,
15689 ** the 0x01 bit in idxNum is set. If pgno=? is present, the 0x02 bit
15690 ** in idxNum is set.
15691 **
15692 ** If both parameters are present, schema is in position 0 and pgno in
15693 ** position 1.
15694 */
dbdataBestIndex(sqlite3_vtab * tab,sqlite3_index_info * pIdx)15695 static int dbdataBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdx){
15696   DbdataTable *pTab = (DbdataTable*)tab;
15697   int i;
15698   int iSchema = -1;
15699   int iPgno = -1;
15700   int colSchema = (pTab->bPtr ? DBPTR_COLUMN_SCHEMA : DBDATA_COLUMN_SCHEMA);
15701 
15702   for(i=0; i<pIdx->nConstraint; i++){
15703     struct sqlite3_index_constraint *p = &pIdx->aConstraint[i];
15704     if( p->op==SQLITE_INDEX_CONSTRAINT_EQ ){
15705       if( p->iColumn==colSchema ){
15706         if( p->usable==0 ) return SQLITE_CONSTRAINT;
15707         iSchema = i;
15708       }
15709       if( p->iColumn==DBDATA_COLUMN_PGNO && p->usable ){
15710         iPgno = i;
15711       }
15712     }
15713   }
15714 
15715   if( iSchema>=0 ){
15716     pIdx->aConstraintUsage[iSchema].argvIndex = 1;
15717     pIdx->aConstraintUsage[iSchema].omit = 1;
15718   }
15719   if( iPgno>=0 ){
15720     pIdx->aConstraintUsage[iPgno].argvIndex = 1 + (iSchema>=0);
15721     pIdx->aConstraintUsage[iPgno].omit = 1;
15722     pIdx->estimatedCost = 100;
15723     pIdx->estimatedRows =  50;
15724 
15725     if( pTab->bPtr==0 && pIdx->nOrderBy && pIdx->aOrderBy[0].desc==0 ){
15726       int iCol = pIdx->aOrderBy[0].iColumn;
15727       if( pIdx->nOrderBy==1 ){
15728         pIdx->orderByConsumed = (iCol==0 || iCol==1);
15729       }else if( pIdx->nOrderBy==2 && pIdx->aOrderBy[1].desc==0 && iCol==0 ){
15730         pIdx->orderByConsumed = (pIdx->aOrderBy[1].iColumn==1);
15731       }
15732     }
15733 
15734   }else{
15735     pIdx->estimatedCost = 100000000;
15736     pIdx->estimatedRows = 1000000000;
15737   }
15738   pIdx->idxNum = (iSchema>=0 ? 0x01 : 0x00) | (iPgno>=0 ? 0x02 : 0x00);
15739   return SQLITE_OK;
15740 }
15741 
15742 /*
15743 ** Open a new sqlite_dbdata or sqlite_dbptr cursor.
15744 */
dbdataOpen(sqlite3_vtab * pVTab,sqlite3_vtab_cursor ** ppCursor)15745 static int dbdataOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){
15746   DbdataCursor *pCsr;
15747 
15748   pCsr = (DbdataCursor*)sqlite3_malloc64(sizeof(DbdataCursor));
15749   if( pCsr==0 ){
15750     return SQLITE_NOMEM;
15751   }else{
15752     memset(pCsr, 0, sizeof(DbdataCursor));
15753     pCsr->base.pVtab = pVTab;
15754   }
15755 
15756   *ppCursor = (sqlite3_vtab_cursor *)pCsr;
15757   return SQLITE_OK;
15758 }
15759 
15760 /*
15761 ** Restore a cursor object to the state it was in when first allocated
15762 ** by dbdataOpen().
15763 */
dbdataResetCursor(DbdataCursor * pCsr)15764 static void dbdataResetCursor(DbdataCursor *pCsr){
15765   DbdataTable *pTab = (DbdataTable*)(pCsr->base.pVtab);
15766   if( pTab->pStmt==0 ){
15767     pTab->pStmt = pCsr->pStmt;
15768   }else{
15769     sqlite3_finalize(pCsr->pStmt);
15770   }
15771   pCsr->pStmt = 0;
15772   pCsr->iPgno = 1;
15773   pCsr->iCell = 0;
15774   pCsr->iField = 0;
15775   pCsr->bOnePage = 0;
15776   sqlite3_free(pCsr->aPage);
15777   dbdataBufferFree(&pCsr->rec);
15778   pCsr->aPage = 0;
15779   pCsr->nRec = 0;
15780 }
15781 
15782 /*
15783 ** Close an sqlite_dbdata or sqlite_dbptr cursor.
15784 */
dbdataClose(sqlite3_vtab_cursor * pCursor)15785 static int dbdataClose(sqlite3_vtab_cursor *pCursor){
15786   DbdataCursor *pCsr = (DbdataCursor*)pCursor;
15787   dbdataResetCursor(pCsr);
15788   sqlite3_free(pCsr);
15789   return SQLITE_OK;
15790 }
15791 
15792 /*
15793 ** Utility methods to decode 16 and 32-bit big-endian unsigned integers.
15794 */
get_uint16(unsigned char * a)15795 static u32 get_uint16(unsigned char *a){
15796   return (a[0]<<8)|a[1];
15797 }
get_uint32(unsigned char * a)15798 static u32 get_uint32(unsigned char *a){
15799   return ((u32)a[0]<<24)
15800        | ((u32)a[1]<<16)
15801        | ((u32)a[2]<<8)
15802        | ((u32)a[3]);
15803 }
15804 
15805 /*
15806 ** Load page pgno from the database via the sqlite_dbpage virtual table.
15807 ** If successful, set (*ppPage) to point to a buffer containing the page
15808 ** data, (*pnPage) to the size of that buffer in bytes and return
15809 ** SQLITE_OK. In this case it is the responsibility of the caller to
15810 ** eventually free the buffer using sqlite3_free().
15811 **
15812 ** Or, if an error occurs, set both (*ppPage) and (*pnPage) to 0 and
15813 ** return an SQLite error code.
15814 */
dbdataLoadPage(DbdataCursor * pCsr,u32 pgno,u8 ** ppPage,int * pnPage)15815 static int dbdataLoadPage(
15816   DbdataCursor *pCsr,             /* Cursor object */
15817   u32 pgno,                       /* Page number of page to load */
15818   u8 **ppPage,                    /* OUT: pointer to page buffer */
15819   int *pnPage                     /* OUT: Size of (*ppPage) in bytes */
15820 ){
15821   int rc2;
15822   int rc = SQLITE_OK;
15823   sqlite3_stmt *pStmt = pCsr->pStmt;
15824 
15825   *ppPage = 0;
15826   *pnPage = 0;
15827   if( pgno>0 ){
15828     sqlite3_bind_int64(pStmt, 2, pgno);
15829     if( SQLITE_ROW==sqlite3_step(pStmt) ){
15830       int nCopy = sqlite3_column_bytes(pStmt, 0);
15831       if( nCopy>0 ){
15832         u8 *pPage;
15833         pPage = (u8*)sqlite3_malloc64(nCopy + DBDATA_PADDING_BYTES);
15834         if( pPage==0 ){
15835           rc = SQLITE_NOMEM;
15836         }else{
15837           const u8 *pCopy = sqlite3_column_blob(pStmt, 0);
15838           memcpy(pPage, pCopy, nCopy);
15839           memset(&pPage[nCopy], 0, DBDATA_PADDING_BYTES);
15840         }
15841         *ppPage = pPage;
15842         *pnPage = nCopy;
15843       }
15844     }
15845     rc2 = sqlite3_reset(pStmt);
15846     if( rc==SQLITE_OK ) rc = rc2;
15847   }
15848 
15849   return rc;
15850 }
15851 
15852 /*
15853 ** Read a varint.  Put the value in *pVal and return the number of bytes.
15854 */
dbdataGetVarint(const u8 * z,sqlite3_int64 * pVal)15855 static int dbdataGetVarint(const u8 *z, sqlite3_int64 *pVal){
15856   sqlite3_uint64 u = 0;
15857   int i;
15858   for(i=0; i<8; i++){
15859     u = (u<<7) + (z[i]&0x7f);
15860     if( (z[i]&0x80)==0 ){ *pVal = (sqlite3_int64)u; return i+1; }
15861   }
15862   u = (u<<8) + (z[i]&0xff);
15863   *pVal = (sqlite3_int64)u;
15864   return 9;
15865 }
15866 
15867 /*
15868 ** Like dbdataGetVarint(), but set the output to 0 if it is less than 0
15869 ** or greater than 0xFFFFFFFF. This can be used for all varints in an
15870 ** SQLite database except for key values in intkey tables.
15871 */
dbdataGetVarintU32(const u8 * z,sqlite3_int64 * pVal)15872 static int dbdataGetVarintU32(const u8 *z, sqlite3_int64 *pVal){
15873   sqlite3_int64 val;
15874   int nRet = dbdataGetVarint(z, &val);
15875   if( val<0 || val>0xFFFFFFFF ) val = 0;
15876   *pVal = val;
15877   return nRet;
15878 }
15879 
15880 /*
15881 ** Return the number of bytes of space used by an SQLite value of type
15882 ** eType.
15883 */
dbdataValueBytes(int eType)15884 static int dbdataValueBytes(int eType){
15885   switch( eType ){
15886     case 0: case 8: case 9:
15887     case 10: case 11:
15888       return 0;
15889     case 1:
15890       return 1;
15891     case 2:
15892       return 2;
15893     case 3:
15894       return 3;
15895     case 4:
15896       return 4;
15897     case 5:
15898       return 6;
15899     case 6:
15900     case 7:
15901       return 8;
15902     default:
15903       if( eType>0 ){
15904         return ((eType-12) / 2);
15905       }
15906       return 0;
15907   }
15908 }
15909 
15910 /*
15911 ** Load a value of type eType from buffer pData and use it to set the
15912 ** result of context object pCtx.
15913 */
dbdataValue(sqlite3_context * pCtx,u32 enc,int eType,u8 * pData,sqlite3_int64 nData)15914 static void dbdataValue(
15915   sqlite3_context *pCtx,
15916   u32 enc,
15917   int eType,
15918   u8 *pData,
15919   sqlite3_int64 nData
15920 ){
15921   if( eType>=0 ){
15922     if( dbdataValueBytes(eType)<=nData ){
15923       switch( eType ){
15924         case 0:
15925         case 10:
15926         case 11:
15927           sqlite3_result_null(pCtx);
15928           break;
15929 
15930         case 8:
15931           sqlite3_result_int(pCtx, 0);
15932           break;
15933         case 9:
15934           sqlite3_result_int(pCtx, 1);
15935           break;
15936 
15937         case 1: case 2: case 3: case 4: case 5: case 6: case 7: {
15938           sqlite3_uint64 v = (signed char)pData[0];
15939           pData++;
15940           switch( eType ){
15941             case 7:
15942             case 6:  v = (v<<16) + (pData[0]<<8) + pData[1];  pData += 2;
15943             case 5:  v = (v<<16) + (pData[0]<<8) + pData[1];  pData += 2;
15944             case 4:  v = (v<<8) + pData[0];  pData++;
15945             case 3:  v = (v<<8) + pData[0];  pData++;
15946             case 2:  v = (v<<8) + pData[0];  pData++;
15947           }
15948 
15949           if( eType==7 ){
15950             double r;
15951             memcpy(&r, &v, sizeof(r));
15952             sqlite3_result_double(pCtx, r);
15953           }else{
15954             sqlite3_result_int64(pCtx, (sqlite3_int64)v);
15955           }
15956           break;
15957         }
15958 
15959         default: {
15960           int n = ((eType-12) / 2);
15961           if( eType % 2 ){
15962             switch( enc ){
15963   #ifndef SQLITE_OMIT_UTF16
15964               case SQLITE_UTF16BE:
15965                 sqlite3_result_text16be(pCtx, (void*)pData, n, SQLITE_TRANSIENT);
15966                 break;
15967               case SQLITE_UTF16LE:
15968                 sqlite3_result_text16le(pCtx, (void*)pData, n, SQLITE_TRANSIENT);
15969                 break;
15970   #endif
15971               default:
15972                 sqlite3_result_text(pCtx, (char*)pData, n, SQLITE_TRANSIENT);
15973                 break;
15974             }
15975           }else{
15976             sqlite3_result_blob(pCtx, pData, n, SQLITE_TRANSIENT);
15977           }
15978         }
15979       }
15980     }else{
15981       if( eType==7 ){
15982         sqlite3_result_double(pCtx, 0.0);
15983       }else if( eType<7 ){
15984         sqlite3_result_int(pCtx, 0);
15985       }else if( eType%2 ){
15986         sqlite3_result_text(pCtx, "", 0, SQLITE_STATIC);
15987       }else{
15988         sqlite3_result_blob(pCtx, "", 0, SQLITE_STATIC);
15989       }
15990     }
15991   }
15992 }
15993 
15994 /* This macro is a copy of the MX_CELL() macro in the SQLite core. Given
15995 ** a page-size, it returns the maximum number of cells that may be present
15996 ** on the page.  */
15997 #define DBDATA_MX_CELL(pgsz) ((pgsz-8)/6)
15998 
15999 /* Maximum number of fields that may appear in a single record. This is
16000 ** the "hard-limit", according to comments in sqliteLimit.h. */
16001 #define DBDATA_MX_FIELD 32676
16002 
16003 /*
16004 ** Move an sqlite_dbdata or sqlite_dbptr cursor to the next entry.
16005 */
dbdataNext(sqlite3_vtab_cursor * pCursor)16006 static int dbdataNext(sqlite3_vtab_cursor *pCursor){
16007   DbdataCursor *pCsr = (DbdataCursor*)pCursor;
16008   DbdataTable *pTab = (DbdataTable*)pCursor->pVtab;
16009 
16010   pCsr->iRowid++;
16011   while( 1 ){
16012     int rc;
16013     int iOff = (pCsr->iPgno==1 ? 100 : 0);
16014     int bNextPage = 0;
16015 
16016     if( pCsr->aPage==0 ){
16017       while( 1 ){
16018         if( pCsr->bOnePage==0 && pCsr->iPgno>pCsr->szDb ) return SQLITE_OK;
16019         rc = dbdataLoadPage(pCsr, pCsr->iPgno, &pCsr->aPage, &pCsr->nPage);
16020         if( rc!=SQLITE_OK ) return rc;
16021         if( pCsr->aPage && pCsr->nPage>=256 ) break;
16022         sqlite3_free(pCsr->aPage);
16023         pCsr->aPage = 0;
16024         if( pCsr->bOnePage ) return SQLITE_OK;
16025         pCsr->iPgno++;
16026       }
16027 
16028       assert( iOff+3+2<=pCsr->nPage );
16029       pCsr->iCell = pTab->bPtr ? -2 : 0;
16030       pCsr->nCell = get_uint16(&pCsr->aPage[iOff+3]);
16031       if( pCsr->nCell>DBDATA_MX_CELL(pCsr->nPage) ){
16032         pCsr->nCell = DBDATA_MX_CELL(pCsr->nPage);
16033       }
16034     }
16035 
16036     if( pTab->bPtr ){
16037       if( pCsr->aPage[iOff]!=0x02 && pCsr->aPage[iOff]!=0x05 ){
16038         pCsr->iCell = pCsr->nCell;
16039       }
16040       pCsr->iCell++;
16041       if( pCsr->iCell>=pCsr->nCell ){
16042         sqlite3_free(pCsr->aPage);
16043         pCsr->aPage = 0;
16044         if( pCsr->bOnePage ) return SQLITE_OK;
16045         pCsr->iPgno++;
16046       }else{
16047         return SQLITE_OK;
16048       }
16049     }else{
16050       /* If there is no record loaded, load it now. */
16051       assert( pCsr->rec.aBuf!=0 || pCsr->nRec==0 );
16052       if( pCsr->nRec==0 ){
16053         int bHasRowid = 0;
16054         int nPointer = 0;
16055         sqlite3_int64 nPayload = 0;
16056         sqlite3_int64 nHdr = 0;
16057         int iHdr;
16058         int U, X;
16059         int nLocal;
16060 
16061         switch( pCsr->aPage[iOff] ){
16062           case 0x02:
16063             nPointer = 4;
16064             break;
16065           case 0x0a:
16066             break;
16067           case 0x0d:
16068             bHasRowid = 1;
16069             break;
16070           default:
16071             /* This is not a b-tree page with records on it. Continue. */
16072             pCsr->iCell = pCsr->nCell;
16073             break;
16074         }
16075 
16076         if( pCsr->iCell>=pCsr->nCell ){
16077           bNextPage = 1;
16078         }else{
16079           int iCellPtr = iOff + 8 + nPointer + pCsr->iCell*2;
16080 
16081           if( iCellPtr>pCsr->nPage ){
16082             bNextPage = 1;
16083           }else{
16084             iOff = get_uint16(&pCsr->aPage[iCellPtr]);
16085           }
16086 
16087           /* For an interior node cell, skip past the child-page number */
16088           iOff += nPointer;
16089 
16090           /* Load the "byte of payload including overflow" field */
16091           if( bNextPage || iOff>pCsr->nPage || iOff<=iCellPtr ){
16092             bNextPage = 1;
16093           }else{
16094             iOff += dbdataGetVarintU32(&pCsr->aPage[iOff], &nPayload);
16095             if( nPayload>0x7fffff00 ) nPayload &= 0x3fff;
16096             if( nPayload==0 ) nPayload = 1;
16097           }
16098 
16099           /* If this is a leaf intkey cell, load the rowid */
16100           if( bHasRowid && !bNextPage && iOff<pCsr->nPage ){
16101             iOff += dbdataGetVarint(&pCsr->aPage[iOff], &pCsr->iIntkey);
16102           }
16103 
16104           /* Figure out how much data to read from the local page */
16105           U = pCsr->nPage;
16106           if( bHasRowid ){
16107             X = U-35;
16108           }else{
16109             X = ((U-12)*64/255)-23;
16110           }
16111           if( nPayload<=X ){
16112             nLocal = nPayload;
16113           }else{
16114             int M, K;
16115             M = ((U-12)*32/255)-23;
16116             K = M+((nPayload-M)%(U-4));
16117             if( K<=X ){
16118               nLocal = K;
16119             }else{
16120               nLocal = M;
16121             }
16122           }
16123 
16124           if( bNextPage || nLocal+iOff>pCsr->nPage ){
16125             bNextPage = 1;
16126           }else{
16127 
16128             /* Allocate space for payload. And a bit more to catch small buffer
16129             ** overruns caused by attempting to read a varint or similar from
16130             ** near the end of a corrupt record.  */
16131             rc = dbdataBufferSize(&pCsr->rec, nPayload+DBDATA_PADDING_BYTES);
16132             if( rc!=SQLITE_OK ) return rc;
16133             assert( nPayload!=0 );
16134 
16135             /* Load the nLocal bytes of payload */
16136             memcpy(pCsr->rec.aBuf, &pCsr->aPage[iOff], nLocal);
16137             iOff += nLocal;
16138 
16139             /* Load content from overflow pages */
16140             if( nPayload>nLocal ){
16141               sqlite3_int64 nRem = nPayload - nLocal;
16142               u32 pgnoOvfl = get_uint32(&pCsr->aPage[iOff]);
16143               while( nRem>0 ){
16144                 u8 *aOvfl = 0;
16145                 int nOvfl = 0;
16146                 int nCopy;
16147                 rc = dbdataLoadPage(pCsr, pgnoOvfl, &aOvfl, &nOvfl);
16148                 assert( rc!=SQLITE_OK || aOvfl==0 || nOvfl==pCsr->nPage );
16149                 if( rc!=SQLITE_OK ) return rc;
16150                 if( aOvfl==0 ) break;
16151 
16152                 nCopy = U-4;
16153                 if( nCopy>nRem ) nCopy = nRem;
16154                 memcpy(&pCsr->rec.aBuf[nPayload-nRem], &aOvfl[4], nCopy);
16155                 nRem -= nCopy;
16156 
16157                 pgnoOvfl = get_uint32(aOvfl);
16158                 sqlite3_free(aOvfl);
16159               }
16160               nPayload -= nRem;
16161             }
16162             memset(&pCsr->rec.aBuf[nPayload], 0, DBDATA_PADDING_BYTES);
16163             pCsr->nRec = nPayload;
16164 
16165             iHdr = dbdataGetVarintU32(pCsr->rec.aBuf, &nHdr);
16166             if( nHdr>nPayload ) nHdr = 0;
16167             pCsr->nHdr = nHdr;
16168             pCsr->pHdrPtr = &pCsr->rec.aBuf[iHdr];
16169             pCsr->pPtr = &pCsr->rec.aBuf[pCsr->nHdr];
16170             pCsr->iField = (bHasRowid ? -1 : 0);
16171           }
16172         }
16173       }else{
16174         pCsr->iField++;
16175         if( pCsr->iField>0 ){
16176           sqlite3_int64 iType;
16177           if( pCsr->pHdrPtr>=&pCsr->rec.aBuf[pCsr->nRec]
16178            || pCsr->iField>=DBDATA_MX_FIELD
16179           ){
16180             bNextPage = 1;
16181           }else{
16182             int szField = 0;
16183             pCsr->pHdrPtr += dbdataGetVarintU32(pCsr->pHdrPtr, &iType);
16184             szField = dbdataValueBytes(iType);
16185             if( (pCsr->nRec - (pCsr->pPtr - pCsr->rec.aBuf))<szField ){
16186               pCsr->pPtr = &pCsr->rec.aBuf[pCsr->nRec];
16187             }else{
16188               pCsr->pPtr += szField;
16189             }
16190           }
16191         }
16192       }
16193 
16194       if( bNextPage ){
16195         sqlite3_free(pCsr->aPage);
16196         pCsr->aPage = 0;
16197         pCsr->nRec = 0;
16198         if( pCsr->bOnePage ) return SQLITE_OK;
16199         pCsr->iPgno++;
16200       }else{
16201         if( pCsr->iField<0 || pCsr->pHdrPtr<&pCsr->rec.aBuf[pCsr->nHdr] ){
16202           return SQLITE_OK;
16203         }
16204 
16205         /* Advance to the next cell. The next iteration of the loop will load
16206         ** the record and so on. */
16207         pCsr->nRec = 0;
16208         pCsr->iCell++;
16209       }
16210     }
16211   }
16212 
16213   assert( !"can't get here" );
16214   return SQLITE_OK;
16215 }
16216 
16217 /*
16218 ** Return true if the cursor is at EOF.
16219 */
dbdataEof(sqlite3_vtab_cursor * pCursor)16220 static int dbdataEof(sqlite3_vtab_cursor *pCursor){
16221   DbdataCursor *pCsr = (DbdataCursor*)pCursor;
16222   return pCsr->aPage==0;
16223 }
16224 
16225 /*
16226 ** Return true if nul-terminated string zSchema ends in "()". Or false
16227 ** otherwise.
16228 */
dbdataIsFunction(const char * zSchema)16229 static int dbdataIsFunction(const char *zSchema){
16230   size_t n = strlen(zSchema);
16231   if( n>2 && zSchema[n-2]=='(' && zSchema[n-1]==')' ){
16232     return (int)n-2;
16233   }
16234   return 0;
16235 }
16236 
16237 /*
16238 ** Determine the size in pages of database zSchema (where zSchema is
16239 ** "main", "temp" or the name of an attached database) and set
16240 ** pCsr->szDb accordingly. If successful, return SQLITE_OK. Otherwise,
16241 ** an SQLite error code.
16242 */
dbdataDbsize(DbdataCursor * pCsr,const char * zSchema)16243 static int dbdataDbsize(DbdataCursor *pCsr, const char *zSchema){
16244   DbdataTable *pTab = (DbdataTable*)pCsr->base.pVtab;
16245   char *zSql = 0;
16246   int rc, rc2;
16247   int nFunc = 0;
16248   sqlite3_stmt *pStmt = 0;
16249 
16250   if( (nFunc = dbdataIsFunction(zSchema))>0 ){
16251     zSql = sqlite3_mprintf("SELECT %.*s(0)", nFunc, zSchema);
16252   }else{
16253     zSql = sqlite3_mprintf("PRAGMA %Q.page_count", zSchema);
16254   }
16255   if( zSql==0 ) return SQLITE_NOMEM;
16256 
16257   rc = sqlite3_prepare_v2(pTab->db, zSql, -1, &pStmt, 0);
16258   sqlite3_free(zSql);
16259   if( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
16260     pCsr->szDb = sqlite3_column_int(pStmt, 0);
16261   }
16262   rc2 = sqlite3_finalize(pStmt);
16263   if( rc==SQLITE_OK ) rc = rc2;
16264   return rc;
16265 }
16266 
16267 /*
16268 ** Attempt to figure out the encoding of the database by retrieving page 1
16269 ** and inspecting the header field. If successful, set the pCsr->enc variable
16270 ** and return SQLITE_OK. Otherwise, return an SQLite error code.
16271 */
dbdataGetEncoding(DbdataCursor * pCsr)16272 static int dbdataGetEncoding(DbdataCursor *pCsr){
16273   int rc = SQLITE_OK;
16274   int nPg1 = 0;
16275   u8 *aPg1 = 0;
16276   rc = dbdataLoadPage(pCsr, 1, &aPg1, &nPg1);
16277   if( rc==SQLITE_OK && nPg1>=(56+4) ){
16278     pCsr->enc = get_uint32(&aPg1[56]);
16279   }
16280   sqlite3_free(aPg1);
16281   return rc;
16282 }
16283 
16284 
16285 /*
16286 ** xFilter method for sqlite_dbdata and sqlite_dbptr.
16287 */
dbdataFilter(sqlite3_vtab_cursor * pCursor,int idxNum,const char * idxStr,int argc,sqlite3_value ** argv)16288 static int dbdataFilter(
16289   sqlite3_vtab_cursor *pCursor,
16290   int idxNum, const char *idxStr,
16291   int argc, sqlite3_value **argv
16292 ){
16293   DbdataCursor *pCsr = (DbdataCursor*)pCursor;
16294   DbdataTable *pTab = (DbdataTable*)pCursor->pVtab;
16295   int rc = SQLITE_OK;
16296   const char *zSchema = "main";
16297   (void)idxStr;
16298   (void)argc;
16299 
16300   dbdataResetCursor(pCsr);
16301   assert( pCsr->iPgno==1 );
16302   if( idxNum & 0x01 ){
16303     zSchema = (const char*)sqlite3_value_text(argv[0]);
16304     if( zSchema==0 ) zSchema = "";
16305   }
16306   if( idxNum & 0x02 ){
16307     pCsr->iPgno = sqlite3_value_int(argv[(idxNum & 0x01)]);
16308     pCsr->bOnePage = 1;
16309   }else{
16310     rc = dbdataDbsize(pCsr, zSchema);
16311   }
16312 
16313   if( rc==SQLITE_OK ){
16314     int nFunc = 0;
16315     if( pTab->pStmt ){
16316       pCsr->pStmt = pTab->pStmt;
16317       pTab->pStmt = 0;
16318     }else if( (nFunc = dbdataIsFunction(zSchema))>0 ){
16319       char *zSql = sqlite3_mprintf("SELECT %.*s(?2)", nFunc, zSchema);
16320       if( zSql==0 ){
16321         rc = SQLITE_NOMEM;
16322       }else{
16323         rc = sqlite3_prepare_v2(pTab->db, zSql, -1, &pCsr->pStmt, 0);
16324         sqlite3_free(zSql);
16325       }
16326     }else{
16327       rc = sqlite3_prepare_v2(pTab->db,
16328           "SELECT data FROM sqlite_dbpage(?) WHERE pgno=?", -1,
16329           &pCsr->pStmt, 0
16330       );
16331     }
16332   }
16333   if( rc==SQLITE_OK ){
16334     rc = sqlite3_bind_text(pCsr->pStmt, 1, zSchema, -1, SQLITE_TRANSIENT);
16335   }
16336 
16337   /* Try to determine the encoding of the db by inspecting the header
16338   ** field on page 1. */
16339   if( rc==SQLITE_OK ){
16340     rc = dbdataGetEncoding(pCsr);
16341   }
16342 
16343   if( rc!=SQLITE_OK ){
16344     pTab->base.zErrMsg = sqlite3_mprintf("%s", sqlite3_errmsg(pTab->db));
16345   }
16346 
16347   if( rc==SQLITE_OK ){
16348     rc = dbdataNext(pCursor);
16349   }
16350   return rc;
16351 }
16352 
16353 /*
16354 ** Return a column for the sqlite_dbdata or sqlite_dbptr table.
16355 */
dbdataColumn(sqlite3_vtab_cursor * pCursor,sqlite3_context * ctx,int i)16356 static int dbdataColumn(
16357   sqlite3_vtab_cursor *pCursor,
16358   sqlite3_context *ctx,
16359   int i
16360 ){
16361   DbdataCursor *pCsr = (DbdataCursor*)pCursor;
16362   DbdataTable *pTab = (DbdataTable*)pCursor->pVtab;
16363   if( pTab->bPtr ){
16364     switch( i ){
16365       case DBPTR_COLUMN_PGNO:
16366         sqlite3_result_int64(ctx, pCsr->iPgno);
16367         break;
16368       case DBPTR_COLUMN_CHILD: {
16369         int iOff = pCsr->iPgno==1 ? 100 : 0;
16370         if( pCsr->iCell<0 ){
16371           iOff += 8;
16372         }else{
16373           iOff += 12 + pCsr->iCell*2;
16374           if( iOff>pCsr->nPage ) return SQLITE_OK;
16375           iOff = get_uint16(&pCsr->aPage[iOff]);
16376         }
16377         if( iOff<=pCsr->nPage ){
16378           sqlite3_result_int64(ctx, get_uint32(&pCsr->aPage[iOff]));
16379         }
16380         break;
16381       }
16382     }
16383   }else{
16384     switch( i ){
16385       case DBDATA_COLUMN_PGNO:
16386         sqlite3_result_int64(ctx, pCsr->iPgno);
16387         break;
16388       case DBDATA_COLUMN_CELL:
16389         sqlite3_result_int(ctx, pCsr->iCell);
16390         break;
16391       case DBDATA_COLUMN_FIELD:
16392         sqlite3_result_int(ctx, pCsr->iField);
16393         break;
16394       case DBDATA_COLUMN_VALUE: {
16395         if( pCsr->iField<0 ){
16396           sqlite3_result_int64(ctx, pCsr->iIntkey);
16397         }else if( &pCsr->rec.aBuf[pCsr->nRec] >= pCsr->pPtr ){
16398           sqlite3_int64 iType;
16399           dbdataGetVarintU32(pCsr->pHdrPtr, &iType);
16400           dbdataValue(
16401               ctx, pCsr->enc, iType, pCsr->pPtr,
16402               &pCsr->rec.aBuf[pCsr->nRec] - pCsr->pPtr
16403           );
16404         }
16405         break;
16406       }
16407     }
16408   }
16409   return SQLITE_OK;
16410 }
16411 
16412 /*
16413 ** Return the rowid for an sqlite_dbdata or sqlite_dptr table.
16414 */
dbdataRowid(sqlite3_vtab_cursor * pCursor,sqlite_int64 * pRowid)16415 static int dbdataRowid(sqlite3_vtab_cursor *pCursor, sqlite_int64 *pRowid){
16416   DbdataCursor *pCsr = (DbdataCursor*)pCursor;
16417   *pRowid = pCsr->iRowid;
16418   return SQLITE_OK;
16419 }
16420 
16421 
16422 /*
16423 ** Invoke this routine to register the "sqlite_dbdata" virtual table module
16424 */
sqlite3DbdataRegister(sqlite3 * db)16425 static int sqlite3DbdataRegister(sqlite3 *db){
16426   static sqlite3_module dbdata_module = {
16427     0,                            /* iVersion */
16428     0,                            /* xCreate */
16429     dbdataConnect,                /* xConnect */
16430     dbdataBestIndex,              /* xBestIndex */
16431     dbdataDisconnect,             /* xDisconnect */
16432     0,                            /* xDestroy */
16433     dbdataOpen,                   /* xOpen - open a cursor */
16434     dbdataClose,                  /* xClose - close a cursor */
16435     dbdataFilter,                 /* xFilter - configure scan constraints */
16436     dbdataNext,                   /* xNext - advance a cursor */
16437     dbdataEof,                    /* xEof - check for end of scan */
16438     dbdataColumn,                 /* xColumn - read data */
16439     dbdataRowid,                  /* xRowid - read data */
16440     0,                            /* xUpdate */
16441     0,                            /* xBegin */
16442     0,                            /* xSync */
16443     0,                            /* xCommit */
16444     0,                            /* xRollback */
16445     0,                            /* xFindMethod */
16446     0,                            /* xRename */
16447     0,                            /* xSavepoint */
16448     0,                            /* xRelease */
16449     0,                            /* xRollbackTo */
16450     0,                            /* xShadowName */
16451     0                             /* xIntegrity */
16452   };
16453 
16454   int rc = sqlite3_create_module(db, "sqlite_dbdata", &dbdata_module, 0);
16455   if( rc==SQLITE_OK ){
16456     rc = sqlite3_create_module(db, "sqlite_dbptr", &dbdata_module, (void*)1);
16457   }
16458   return rc;
16459 }
16460 
sqlite3_dbdata_init(sqlite3 * db,char ** pzErrMsg,const sqlite3_api_routines * pApi)16461 int sqlite3_dbdata_init(
16462   sqlite3 *db,
16463   char **pzErrMsg,
16464   const sqlite3_api_routines *pApi
16465 ){
16466   (void)pzErrMsg;
16467   return sqlite3DbdataRegister(db);
16468 }
16469 
16470 #endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
16471 
16472 /************************* End ../ext/recover/dbdata.c ********************/
16473 /************************* Begin ../ext/recover/sqlite3recover.c ******************/
16474 /*
16475 ** 2022-08-27
16476 **
16477 ** The author disclaims copyright to this source code.  In place of
16478 ** a legal notice, here is a blessing:
16479 **
16480 **    May you do good and not evil.
16481 **    May you find forgiveness for yourself and forgive others.
16482 **    May you share freely, never taking more than you give.
16483 **
16484 *************************************************************************
16485 **
16486 */
16487 
16488 
16489 /* #include "sqlite3recover.h" */
16490 #include <assert.h>
16491 #include <string.h>
16492 
16493 #ifndef SQLITE_OMIT_VIRTUALTABLE
16494 
16495 /*
16496 ** Declaration for public API function in file dbdata.c. This may be called
16497 ** with NULL as the final two arguments to register the sqlite_dbptr and
16498 ** sqlite_dbdata virtual tables with a database handle.
16499 */
16500 #ifdef _WIN32
16501 
16502 #endif
16503 int sqlite3_dbdata_init(sqlite3*, char**, const sqlite3_api_routines*);
16504 
16505 /* typedef unsigned int u32; */
16506 /* typedef unsigned char u8; */
16507 /* typedef sqlite3_int64 i64; */
16508 
16509 typedef struct RecoverTable RecoverTable;
16510 typedef struct RecoverColumn RecoverColumn;
16511 
16512 /*
16513 ** When recovering rows of data that can be associated with table
16514 ** definitions recovered from the sqlite_schema table, each table is
16515 ** represented by an instance of the following object.
16516 **
16517 ** iRoot:
16518 **   The root page in the original database. Not necessarily (and usually
16519 **   not) the same in the recovered database.
16520 **
16521 ** zTab:
16522 **   Name of the table.
16523 **
16524 ** nCol/aCol[]:
16525 **   aCol[] is an array of nCol columns. In the order in which they appear
16526 **   in the table.
16527 **
16528 ** bIntkey:
16529 **   Set to true for intkey tables, false for WITHOUT ROWID.
16530 **
16531 ** iRowidBind:
16532 **   Each column in the aCol[] array has associated with it the index of
16533 **   the bind parameter its values will be bound to in the INSERT statement
16534 **   used to construct the output database. If the table does has a rowid
16535 **   but not an INTEGER PRIMARY KEY column, then iRowidBind contains the
16536 **   index of the bind paramater to which the rowid value should be bound.
16537 **   Otherwise, it contains -1. If the table does contain an INTEGER PRIMARY
16538 **   KEY column, then the rowid value should be bound to the index associated
16539 **   with the column.
16540 **
16541 ** pNext:
16542 **   All RecoverTable objects used by the recovery operation are allocated
16543 **   and populated as part of creating the recovered database schema in
16544 **   the output database, before any non-schema data are recovered. They
16545 **   are then stored in a singly-linked list linked by this variable beginning
16546 **   at sqlite3_recover.pTblList.
16547 */
16548 struct RecoverTable {
16549   u32 iRoot;                      /* Root page in original database */
16550   char *zTab;                     /* Name of table */
16551   int nCol;                       /* Number of columns in table */
16552   RecoverColumn *aCol;            /* Array of columns */
16553   int bIntkey;                    /* True for intkey, false for without rowid */
16554   int iRowidBind;                 /* If >0, bind rowid to INSERT here */
16555   RecoverTable *pNext;
16556 };
16557 
16558 /*
16559 ** Each database column is represented by an instance of the following object
16560 ** stored in the RecoverTable.aCol[] array of the associated table.
16561 **
16562 ** iField:
16563 **   The index of the associated field within database records. Or -1 if
16564 **   there is no associated field (e.g. for virtual generated columns).
16565 **
16566 ** iBind:
16567 **   The bind index of the INSERT statement to bind this columns values
16568 **   to. Or 0 if there is no such index (iff (iField<0)).
16569 **
16570 ** bIPK:
16571 **   True if this is the INTEGER PRIMARY KEY column.
16572 **
16573 ** zCol:
16574 **   Name of column.
16575 **
16576 ** eHidden:
16577 **   A RECOVER_EHIDDEN_* constant value (see below for interpretation of each).
16578 */
16579 struct RecoverColumn {
16580   int iField;                     /* Field in record on disk */
16581   int iBind;                      /* Binding to use in INSERT */
16582   int bIPK;                       /* True for IPK column */
16583   char *zCol;
16584   int eHidden;
16585 };
16586 
16587 #define RECOVER_EHIDDEN_NONE    0      /* Normal database column */
16588 #define RECOVER_EHIDDEN_HIDDEN  1      /* Column is __HIDDEN__ */
16589 #define RECOVER_EHIDDEN_VIRTUAL 2      /* Virtual generated column */
16590 #define RECOVER_EHIDDEN_STORED  3      /* Stored generated column */
16591 
16592 /*
16593 ** Bitmap object used to track pages in the input database. Allocated
16594 ** and manipulated only by the following functions:
16595 **
16596 **     recoverBitmapAlloc()
16597 **     recoverBitmapFree()
16598 **     recoverBitmapSet()
16599 **     recoverBitmapQuery()
16600 **
16601 ** nPg:
16602 **   Largest page number that may be stored in the bitmap. The range
16603 **   of valid keys is 1 to nPg, inclusive.
16604 **
16605 ** aElem[]:
16606 **   Array large enough to contain a bit for each key. For key value
16607 **   iKey, the associated bit is the bit (iKey%32) of aElem[iKey/32].
16608 **   In other words, the following is true if bit iKey is set, or
16609 **   false if it is clear:
16610 **
16611 **       (aElem[iKey/32] & (1 << (iKey%32))) ? 1 : 0
16612 */
16613 typedef struct RecoverBitmap RecoverBitmap;
16614 struct RecoverBitmap {
16615   i64 nPg;                        /* Size of bitmap */
16616   u32 aElem[1];                   /* Array of 32-bit bitmasks */
16617 };
16618 
16619 /*
16620 ** State variables (part of the sqlite3_recover structure) used while
16621 ** recovering data for tables identified in the recovered schema (state
16622 ** RECOVER_STATE_WRITING).
16623 */
16624 typedef struct RecoverStateW1 RecoverStateW1;
16625 struct RecoverStateW1 {
16626   sqlite3_stmt *pTbls;
16627   sqlite3_stmt *pSel;
16628   sqlite3_stmt *pInsert;
16629   int nInsert;
16630 
16631   RecoverTable *pTab;             /* Table currently being written */
16632   int nMax;                       /* Max column count in any schema table */
16633   sqlite3_value **apVal;          /* Array of nMax values */
16634   int nVal;                       /* Number of valid entries in apVal[] */
16635   int bHaveRowid;
16636   i64 iRowid;
16637   i64 iPrevPage;
16638   int iPrevCell;
16639 };
16640 
16641 /*
16642 ** State variables (part of the sqlite3_recover structure) used while
16643 ** recovering data destined for the lost and found table (states
16644 ** RECOVER_STATE_LOSTANDFOUND[123]).
16645 */
16646 typedef struct RecoverStateLAF RecoverStateLAF;
16647 struct RecoverStateLAF {
16648   RecoverBitmap *pUsed;
16649   i64 nPg;                        /* Size of db in pages */
16650   sqlite3_stmt *pAllAndParent;
16651   sqlite3_stmt *pMapInsert;
16652   sqlite3_stmt *pMaxField;
16653   sqlite3_stmt *pUsedPages;
16654   sqlite3_stmt *pFindRoot;
16655   sqlite3_stmt *pInsert;          /* INSERT INTO lost_and_found ... */
16656   sqlite3_stmt *pAllPage;
16657   sqlite3_stmt *pPageData;
16658   sqlite3_value **apVal;
16659   int nMaxField;
16660 };
16661 
16662 /*
16663 ** Main recover handle structure.
16664 */
16665 struct sqlite3_recover {
16666   /* Copies of sqlite3_recover_init[_sql]() parameters */
16667   sqlite3 *dbIn;                  /* Input database */
16668   char *zDb;                      /* Name of input db ("main" etc.) */
16669   char *zUri;                     /* URI for output database */
16670   void *pSqlCtx;                  /* SQL callback context */
16671   int (*xSql)(void*,const char*); /* Pointer to SQL callback function */
16672 
16673   /* Values configured by sqlite3_recover_config() */
16674   char *zStateDb;                 /* State database to use (or NULL) */
16675   char *zLostAndFound;            /* Name of lost-and-found table (or NULL) */
16676   int bFreelistCorrupt;           /* SQLITE_RECOVER_FREELIST_CORRUPT setting */
16677   int bRecoverRowid;              /* SQLITE_RECOVER_ROWIDS setting */
16678   int bSlowIndexes;               /* SQLITE_RECOVER_SLOWINDEXES setting */
16679 
16680   int pgsz;
16681   int detected_pgsz;
16682   int nReserve;
16683   u8 *pPage1Disk;
16684   u8 *pPage1Cache;
16685 
16686   /* Error code and error message */
16687   int errCode;                    /* For sqlite3_recover_errcode() */
16688   char *zErrMsg;                  /* For sqlite3_recover_errmsg() */
16689 
16690   int eState;
16691   int bCloseTransaction;
16692 
16693   /* Variables used with eState==RECOVER_STATE_WRITING */
16694   RecoverStateW1 w1;
16695 
16696   /* Variables used with states RECOVER_STATE_LOSTANDFOUND[123] */
16697   RecoverStateLAF laf;
16698 
16699   /* Fields used within sqlite3_recover_run() */
16700   sqlite3 *dbOut;                 /* Output database */
16701   sqlite3_stmt *pGetPage;         /* SELECT against input db sqlite_dbdata */
16702   RecoverTable *pTblList;         /* List of tables recovered from schema */
16703 };
16704 
16705 /*
16706 ** The various states in which an sqlite3_recover object may exist:
16707 **
16708 **   RECOVER_STATE_INIT:
16709 **    The object is initially created in this state. sqlite3_recover_step()
16710 **    has yet to be called. This is the only state in which it is permitted
16711 **    to call sqlite3_recover_config().
16712 **
16713 **   RECOVER_STATE_WRITING:
16714 **
16715 **   RECOVER_STATE_LOSTANDFOUND1:
16716 **    State to populate the bitmap of pages used by other tables or the
16717 **    database freelist.
16718 **
16719 **   RECOVER_STATE_LOSTANDFOUND2:
16720 **    Populate the recovery.map table - used to figure out a "root" page
16721 **    for each lost page from in the database from which records are
16722 **    extracted.
16723 **
16724 **   RECOVER_STATE_LOSTANDFOUND3:
16725 **    Populate the lost-and-found table itself.
16726 */
16727 #define RECOVER_STATE_INIT           0
16728 #define RECOVER_STATE_WRITING        1
16729 #define RECOVER_STATE_LOSTANDFOUND1  2
16730 #define RECOVER_STATE_LOSTANDFOUND2  3
16731 #define RECOVER_STATE_LOSTANDFOUND3  4
16732 #define RECOVER_STATE_SCHEMA2        5
16733 #define RECOVER_STATE_DONE           6
16734 
16735 
16736 /*
16737 ** Global variables used by this extension.
16738 */
16739 typedef struct RecoverGlobal RecoverGlobal;
16740 struct RecoverGlobal {
16741   const sqlite3_io_methods *pMethods;
16742   sqlite3_recover *p;
16743 };
16744 static RecoverGlobal recover_g;
16745 
16746 /*
16747 ** Use this static SQLite mutex to protect the globals during the
16748 ** first call to sqlite3_recover_step().
16749 */
16750 #define RECOVER_MUTEX_ID SQLITE_MUTEX_STATIC_APP2
16751 
16752 
16753 /*
16754 ** Default value for SQLITE_RECOVER_ROWIDS (sqlite3_recover.bRecoverRowid).
16755 */
16756 #define RECOVER_ROWID_DEFAULT 1
16757 
16758 /*
16759 ** Mutex handling:
16760 **
16761 **    recoverEnterMutex()       -   Enter the recovery mutex
16762 **    recoverLeaveMutex()       -   Leave the recovery mutex
16763 **    recoverAssertMutexHeld()  -   Assert that the recovery mutex is held
16764 */
16765 #if defined(SQLITE_THREADSAFE) && SQLITE_THREADSAFE==0
16766 # define recoverEnterMutex()
16767 # define recoverLeaveMutex()
16768 #else
recoverEnterMutex(void)16769 static void recoverEnterMutex(void){
16770   sqlite3_mutex_enter(sqlite3_mutex_alloc(RECOVER_MUTEX_ID));
16771 }
recoverLeaveMutex(void)16772 static void recoverLeaveMutex(void){
16773   sqlite3_mutex_leave(sqlite3_mutex_alloc(RECOVER_MUTEX_ID));
16774 }
16775 #endif
16776 #if SQLITE_THREADSAFE+0>=1 && defined(SQLITE_DEBUG)
recoverAssertMutexHeld(void)16777 static void recoverAssertMutexHeld(void){
16778   assert( sqlite3_mutex_held(sqlite3_mutex_alloc(RECOVER_MUTEX_ID)) );
16779 }
16780 #else
16781 # define recoverAssertMutexHeld()
16782 #endif
16783 
16784 
16785 /*
16786 ** Like strlen(). But handles NULL pointer arguments.
16787 */
recoverStrlen(const char * zStr)16788 static int recoverStrlen(const char *zStr){
16789   if( zStr==0 ) return 0;
16790   return (int)(strlen(zStr)&0x7fffffff);
16791 }
16792 
16793 /*
16794 ** This function is a no-op if the recover handle passed as the first
16795 ** argument already contains an error (if p->errCode!=SQLITE_OK).
16796 **
16797 ** Otherwise, an attempt is made to allocate, zero and return a buffer nByte
16798 ** bytes in size. If successful, a pointer to the new buffer is returned. Or,
16799 ** if an OOM error occurs, NULL is returned and the handle error code
16800 ** (p->errCode) set to SQLITE_NOMEM.
16801 */
recoverMalloc(sqlite3_recover * p,i64 nByte)16802 static void *recoverMalloc(sqlite3_recover *p, i64 nByte){
16803   void *pRet = 0;
16804   assert( nByte>0 );
16805   if( p->errCode==SQLITE_OK ){
16806     pRet = sqlite3_malloc64(nByte);
16807     if( pRet ){
16808       memset(pRet, 0, nByte);
16809     }else{
16810       p->errCode = SQLITE_NOMEM;
16811     }
16812   }
16813   return pRet;
16814 }
16815 
16816 /*
16817 ** Set the error code and error message for the recover handle passed as
16818 ** the first argument. The error code is set to the value of parameter
16819 ** errCode.
16820 **
16821 ** Parameter zFmt must be a printf() style formatting string. The handle
16822 ** error message is set to the result of using any trailing arguments for
16823 ** parameter substitutions in the formatting string.
16824 **
16825 ** For example:
16826 **
16827 **   recoverError(p, SQLITE_ERROR, "no such table: %s", zTablename);
16828 */
recoverError(sqlite3_recover * p,int errCode,const char * zFmt,...)16829 static int recoverError(
16830   sqlite3_recover *p,
16831   int errCode,
16832   const char *zFmt, ...
16833 ){
16834   char *z = 0;
16835   va_list ap;
16836   va_start(ap, zFmt);
16837   if( zFmt ){
16838     z = sqlite3_vmprintf(zFmt, ap);
16839     va_end(ap);
16840   }
16841   sqlite3_free(p->zErrMsg);
16842   p->zErrMsg = z;
16843   p->errCode = errCode;
16844   return errCode;
16845 }
16846 
16847 
16848 /*
16849 ** This function is a no-op if p->errCode is initially other than SQLITE_OK.
16850 ** In this case it returns NULL.
16851 **
16852 ** Otherwise, an attempt is made to allocate and return a bitmap object
16853 ** large enough to store a bit for all page numbers between 1 and nPg,
16854 ** inclusive. The bitmap is initially zeroed.
16855 */
recoverBitmapAlloc(sqlite3_recover * p,i64 nPg)16856 static RecoverBitmap *recoverBitmapAlloc(sqlite3_recover *p, i64 nPg){
16857   int nElem = (nPg+1+31) / 32;
16858   int nByte = sizeof(RecoverBitmap) + nElem*sizeof(u32);
16859   RecoverBitmap *pRet = (RecoverBitmap*)recoverMalloc(p, nByte);
16860 
16861   if( pRet ){
16862     pRet->nPg = nPg;
16863   }
16864   return pRet;
16865 }
16866 
16867 /*
16868 ** Free a bitmap object allocated by recoverBitmapAlloc().
16869 */
recoverBitmapFree(RecoverBitmap * pMap)16870 static void recoverBitmapFree(RecoverBitmap *pMap){
16871   sqlite3_free(pMap);
16872 }
16873 
16874 /*
16875 ** Set the bit associated with page iPg in bitvec pMap.
16876 */
recoverBitmapSet(RecoverBitmap * pMap,i64 iPg)16877 static void recoverBitmapSet(RecoverBitmap *pMap, i64 iPg){
16878   if( iPg<=pMap->nPg ){
16879     int iElem = (iPg / 32);
16880     int iBit = (iPg % 32);
16881     pMap->aElem[iElem] |= (((u32)1) << iBit);
16882   }
16883 }
16884 
16885 /*
16886 ** Query bitmap object pMap for the state of the bit associated with page
16887 ** iPg. Return 1 if it is set, or 0 otherwise.
16888 */
recoverBitmapQuery(RecoverBitmap * pMap,i64 iPg)16889 static int recoverBitmapQuery(RecoverBitmap *pMap, i64 iPg){
16890   int ret = 1;
16891   if( iPg<=pMap->nPg && iPg>0 ){
16892     int iElem = (iPg / 32);
16893     int iBit = (iPg % 32);
16894     ret = (pMap->aElem[iElem] & (((u32)1) << iBit)) ? 1 : 0;
16895   }
16896   return ret;
16897 }
16898 
16899 /*
16900 ** Set the recover handle error to the error code and message returned by
16901 ** calling sqlite3_errcode() and sqlite3_errmsg(), respectively, on database
16902 ** handle db.
16903 */
recoverDbError(sqlite3_recover * p,sqlite3 * db)16904 static int recoverDbError(sqlite3_recover *p, sqlite3 *db){
16905   return recoverError(p, sqlite3_errcode(db), "%s", sqlite3_errmsg(db));
16906 }
16907 
16908 /*
16909 ** This function is a no-op if recover handle p already contains an error
16910 ** (if p->errCode!=SQLITE_OK).
16911 **
16912 ** Otherwise, it attempts to prepare the SQL statement in zSql against
16913 ** database handle db. If successful, the statement handle is returned.
16914 ** Or, if an error occurs, NULL is returned and an error left in the
16915 ** recover handle.
16916 */
recoverPrepare(sqlite3_recover * p,sqlite3 * db,const char * zSql)16917 static sqlite3_stmt *recoverPrepare(
16918   sqlite3_recover *p,
16919   sqlite3 *db,
16920   const char *zSql
16921 ){
16922   sqlite3_stmt *pStmt = 0;
16923   if( p->errCode==SQLITE_OK ){
16924     if( sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0) ){
16925       recoverDbError(p, db);
16926     }
16927   }
16928   return pStmt;
16929 }
16930 
16931 /*
16932 ** This function is a no-op if recover handle p already contains an error
16933 ** (if p->errCode!=SQLITE_OK).
16934 **
16935 ** Otherwise, argument zFmt is used as a printf() style format string,
16936 ** along with any trailing arguments, to create an SQL statement. This
16937 ** SQL statement is prepared against database handle db and, if successful,
16938 ** the statment handle returned. Or, if an error occurs - either during
16939 ** the printf() formatting or when preparing the resulting SQL - an
16940 ** error code and message are left in the recover handle.
16941 */
recoverPreparePrintf(sqlite3_recover * p,sqlite3 * db,const char * zFmt,...)16942 static sqlite3_stmt *recoverPreparePrintf(
16943   sqlite3_recover *p,
16944   sqlite3 *db,
16945   const char *zFmt, ...
16946 ){
16947   sqlite3_stmt *pStmt = 0;
16948   if( p->errCode==SQLITE_OK ){
16949     va_list ap;
16950     char *z;
16951     va_start(ap, zFmt);
16952     z = sqlite3_vmprintf(zFmt, ap);
16953     va_end(ap);
16954     if( z==0 ){
16955       p->errCode = SQLITE_NOMEM;
16956     }else{
16957       pStmt = recoverPrepare(p, db, z);
16958       sqlite3_free(z);
16959     }
16960   }
16961   return pStmt;
16962 }
16963 
16964 /*
16965 ** Reset SQLite statement handle pStmt. If the call to sqlite3_reset()
16966 ** indicates that an error occurred, and there is not already an error
16967 ** in the recover handle passed as the first argument, set the error
16968 ** code and error message appropriately.
16969 **
16970 ** This function returns a copy of the statement handle pointer passed
16971 ** as the second argument.
16972 */
recoverReset(sqlite3_recover * p,sqlite3_stmt * pStmt)16973 static sqlite3_stmt *recoverReset(sqlite3_recover *p, sqlite3_stmt *pStmt){
16974   int rc = sqlite3_reset(pStmt);
16975   if( rc!=SQLITE_OK && rc!=SQLITE_CONSTRAINT && p->errCode==SQLITE_OK ){
16976     recoverDbError(p, sqlite3_db_handle(pStmt));
16977   }
16978   return pStmt;
16979 }
16980 
16981 /*
16982 ** Finalize SQLite statement handle pStmt. If the call to sqlite3_reset()
16983 ** indicates that an error occurred, and there is not already an error
16984 ** in the recover handle passed as the first argument, set the error
16985 ** code and error message appropriately.
16986 */
recoverFinalize(sqlite3_recover * p,sqlite3_stmt * pStmt)16987 static void recoverFinalize(sqlite3_recover *p, sqlite3_stmt *pStmt){
16988   sqlite3 *db = sqlite3_db_handle(pStmt);
16989   int rc = sqlite3_finalize(pStmt);
16990   if( rc!=SQLITE_OK && p->errCode==SQLITE_OK ){
16991     recoverDbError(p, db);
16992   }
16993 }
16994 
16995 /*
16996 ** This function is a no-op if recover handle p already contains an error
16997 ** (if p->errCode!=SQLITE_OK). A copy of p->errCode is returned in this
16998 ** case.
16999 **
17000 ** Otherwise, execute SQL script zSql. If successful, return SQLITE_OK.
17001 ** Or, if an error occurs, leave an error code and message in the recover
17002 ** handle and return a copy of the error code.
17003 */
recoverExec(sqlite3_recover * p,sqlite3 * db,const char * zSql)17004 static int recoverExec(sqlite3_recover *p, sqlite3 *db, const char *zSql){
17005   if( p->errCode==SQLITE_OK ){
17006     int rc = sqlite3_exec(db, zSql, 0, 0, 0);
17007     if( rc ){
17008       recoverDbError(p, db);
17009     }
17010   }
17011   return p->errCode;
17012 }
17013 
17014 /*
17015 ** Bind the value pVal to parameter iBind of statement pStmt. Leave an
17016 ** error in the recover handle passed as the first argument if an error
17017 ** (e.g. an OOM) occurs.
17018 */
recoverBindValue(sqlite3_recover * p,sqlite3_stmt * pStmt,int iBind,sqlite3_value * pVal)17019 static void recoverBindValue(
17020   sqlite3_recover *p,
17021   sqlite3_stmt *pStmt,
17022   int iBind,
17023   sqlite3_value *pVal
17024 ){
17025   if( p->errCode==SQLITE_OK ){
17026     int rc = sqlite3_bind_value(pStmt, iBind, pVal);
17027     if( rc ) recoverError(p, rc, 0);
17028   }
17029 }
17030 
17031 /*
17032 ** This function is a no-op if recover handle p already contains an error
17033 ** (if p->errCode!=SQLITE_OK). NULL is returned in this case.
17034 **
17035 ** Otherwise, an attempt is made to interpret zFmt as a printf() style
17036 ** formatting string and the result of using the trailing arguments for
17037 ** parameter substitution with it written into a buffer obtained from
17038 ** sqlite3_malloc(). If successful, a pointer to the buffer is returned.
17039 ** It is the responsibility of the caller to eventually free the buffer
17040 ** using sqlite3_free().
17041 **
17042 ** Or, if an error occurs, an error code and message is left in the recover
17043 ** handle and NULL returned.
17044 */
recoverMPrintf(sqlite3_recover * p,const char * zFmt,...)17045 static char *recoverMPrintf(sqlite3_recover *p, const char *zFmt, ...){
17046   va_list ap;
17047   char *z;
17048   va_start(ap, zFmt);
17049   z = sqlite3_vmprintf(zFmt, ap);
17050   va_end(ap);
17051   if( p->errCode==SQLITE_OK ){
17052     if( z==0 ) p->errCode = SQLITE_NOMEM;
17053   }else{
17054     sqlite3_free(z);
17055     z = 0;
17056   }
17057   return z;
17058 }
17059 
17060 /*
17061 ** This function is a no-op if recover handle p already contains an error
17062 ** (if p->errCode!=SQLITE_OK). Zero is returned in this case.
17063 **
17064 ** Otherwise, execute "PRAGMA page_count" against the input database. If
17065 ** successful, return the integer result. Or, if an error occurs, leave an
17066 ** error code and error message in the sqlite3_recover handle and return
17067 ** zero.
17068 */
recoverPageCount(sqlite3_recover * p)17069 static i64 recoverPageCount(sqlite3_recover *p){
17070   i64 nPg = 0;
17071   if( p->errCode==SQLITE_OK ){
17072     sqlite3_stmt *pStmt = 0;
17073     pStmt = recoverPreparePrintf(p, p->dbIn, "PRAGMA %Q.page_count", p->zDb);
17074     if( pStmt ){
17075       sqlite3_step(pStmt);
17076       nPg = sqlite3_column_int64(pStmt, 0);
17077     }
17078     recoverFinalize(p, pStmt);
17079   }
17080   return nPg;
17081 }
17082 
17083 /*
17084 ** Implementation of SQL scalar function "read_i32". The first argument to
17085 ** this function must be a blob. The second a non-negative integer. This
17086 ** function reads and returns a 32-bit big-endian integer from byte
17087 ** offset (4*<arg2>) of the blob.
17088 **
17089 **     SELECT read_i32(<blob>, <idx>)
17090 */
recoverReadI32(sqlite3_context * context,int argc,sqlite3_value ** argv)17091 static void recoverReadI32(
17092   sqlite3_context *context,
17093   int argc,
17094   sqlite3_value **argv
17095 ){
17096   const unsigned char *pBlob;
17097   int nBlob;
17098   int iInt;
17099 
17100   assert( argc==2 );
17101   nBlob = sqlite3_value_bytes(argv[0]);
17102   pBlob = (const unsigned char*)sqlite3_value_blob(argv[0]);
17103   iInt = sqlite3_value_int(argv[1]) & 0xFFFF;
17104 
17105   if( (iInt+1)*4<=nBlob ){
17106     const unsigned char *a = &pBlob[iInt*4];
17107     i64 iVal = ((i64)a[0]<<24)
17108              + ((i64)a[1]<<16)
17109              + ((i64)a[2]<< 8)
17110              + ((i64)a[3]<< 0);
17111     sqlite3_result_int64(context, iVal);
17112   }
17113 }
17114 
17115 /*
17116 ** Implementation of SQL scalar function "page_is_used". This function
17117 ** is used as part of the procedure for locating orphan rows for the
17118 ** lost-and-found table, and it depends on those routines having populated
17119 ** the sqlite3_recover.laf.pUsed variable.
17120 **
17121 ** The only argument to this function is a page-number. It returns true
17122 ** if the page has already been used somehow during data recovery, or false
17123 ** otherwise.
17124 **
17125 **     SELECT page_is_used(<pgno>);
17126 */
recoverPageIsUsed(sqlite3_context * pCtx,int nArg,sqlite3_value ** apArg)17127 static void recoverPageIsUsed(
17128   sqlite3_context *pCtx,
17129   int nArg,
17130   sqlite3_value **apArg
17131 ){
17132   sqlite3_recover *p = (sqlite3_recover*)sqlite3_user_data(pCtx);
17133   i64 pgno = sqlite3_value_int64(apArg[0]);
17134   assert( nArg==1 );
17135   sqlite3_result_int(pCtx, recoverBitmapQuery(p->laf.pUsed, pgno));
17136 }
17137 
17138 /*
17139 ** The implementation of a user-defined SQL function invoked by the
17140 ** sqlite_dbdata and sqlite_dbptr virtual table modules to access pages
17141 ** of the database being recovered.
17142 **
17143 ** This function always takes a single integer argument. If the argument
17144 ** is zero, then the value returned is the number of pages in the db being
17145 ** recovered. If the argument is greater than zero, it is a page number.
17146 ** The value returned in this case is an SQL blob containing the data for
17147 ** the identified page of the db being recovered. e.g.
17148 **
17149 **     SELECT getpage(0);       -- return number of pages in db
17150 **     SELECT getpage(4);       -- return page 4 of db as a blob of data
17151 */
recoverGetPage(sqlite3_context * pCtx,int nArg,sqlite3_value ** apArg)17152 static void recoverGetPage(
17153   sqlite3_context *pCtx,
17154   int nArg,
17155   sqlite3_value **apArg
17156 ){
17157   sqlite3_recover *p = (sqlite3_recover*)sqlite3_user_data(pCtx);
17158   i64 pgno = sqlite3_value_int64(apArg[0]);
17159   sqlite3_stmt *pStmt = 0;
17160 
17161   assert( nArg==1 );
17162   if( pgno==0 ){
17163     i64 nPg = recoverPageCount(p);
17164     sqlite3_result_int64(pCtx, nPg);
17165     return;
17166   }else{
17167     if( p->pGetPage==0 ){
17168       pStmt = p->pGetPage = recoverPreparePrintf(
17169           p, p->dbIn, "SELECT data FROM sqlite_dbpage(%Q) WHERE pgno=?", p->zDb
17170       );
17171     }else if( p->errCode==SQLITE_OK ){
17172       pStmt = p->pGetPage;
17173     }
17174 
17175     if( pStmt ){
17176       sqlite3_bind_int64(pStmt, 1, pgno);
17177       if( SQLITE_ROW==sqlite3_step(pStmt) ){
17178         const u8 *aPg;
17179         int nPg;
17180         assert( p->errCode==SQLITE_OK );
17181         aPg = sqlite3_column_blob(pStmt, 0);
17182         nPg = sqlite3_column_bytes(pStmt, 0);
17183         if( pgno==1 && nPg==p->pgsz && 0==memcmp(p->pPage1Cache, aPg, nPg) ){
17184           aPg = p->pPage1Disk;
17185         }
17186         sqlite3_result_blob(pCtx, aPg, nPg-p->nReserve, SQLITE_TRANSIENT);
17187       }
17188       recoverReset(p, pStmt);
17189     }
17190   }
17191 
17192   if( p->errCode ){
17193     if( p->zErrMsg ) sqlite3_result_error(pCtx, p->zErrMsg, -1);
17194     sqlite3_result_error_code(pCtx, p->errCode);
17195   }
17196 }
17197 
17198 /*
17199 ** Find a string that is not found anywhere in z[].  Return a pointer
17200 ** to that string.
17201 **
17202 ** Try to use zA and zB first.  If both of those are already found in z[]
17203 ** then make up some string and store it in the buffer zBuf.
17204 */
recoverUnusedString(const char * z,const char * zA,const char * zB,char * zBuf)17205 static const char *recoverUnusedString(
17206   const char *z,                    /* Result must not appear anywhere in z */
17207   const char *zA, const char *zB,   /* Try these first */
17208   char *zBuf                        /* Space to store a generated string */
17209 ){
17210   unsigned i = 0;
17211   if( strstr(z, zA)==0 ) return zA;
17212   if( strstr(z, zB)==0 ) return zB;
17213   do{
17214     sqlite3_snprintf(20,zBuf,"(%s%u)", zA, i++);
17215   }while( strstr(z,zBuf)!=0 );
17216   return zBuf;
17217 }
17218 
17219 /*
17220 ** Implementation of scalar SQL function "escape_crnl".  The argument passed to
17221 ** this function is the output of built-in function quote(). If the first
17222 ** character of the input is "'", indicating that the value passed to quote()
17223 ** was a text value, then this function searches the input for "\n" and "\r"
17224 ** characters and adds a wrapper similar to the following:
17225 **
17226 **   replace(replace(<input>, '\n', char(10), '\r', char(13));
17227 **
17228 ** Or, if the first character of the input is not "'", then a copy of the input
17229 ** is returned.
17230 */
recoverEscapeCrnl(sqlite3_context * context,int argc,sqlite3_value ** argv)17231 static void recoverEscapeCrnl(
17232   sqlite3_context *context,
17233   int argc,
17234   sqlite3_value **argv
17235 ){
17236   const char *zText = (const char*)sqlite3_value_text(argv[0]);
17237   (void)argc;
17238   if( zText && zText[0]=='\'' ){
17239     int nText = sqlite3_value_bytes(argv[0]);
17240     int i;
17241     char zBuf1[20];
17242     char zBuf2[20];
17243     const char *zNL = 0;
17244     const char *zCR = 0;
17245     int nCR = 0;
17246     int nNL = 0;
17247 
17248     for(i=0; zText[i]; i++){
17249       if( zNL==0 && zText[i]=='\n' ){
17250         zNL = recoverUnusedString(zText, "\\n", "\\012", zBuf1);
17251         nNL = (int)strlen(zNL);
17252       }
17253       if( zCR==0 && zText[i]=='\r' ){
17254         zCR = recoverUnusedString(zText, "\\r", "\\015", zBuf2);
17255         nCR = (int)strlen(zCR);
17256       }
17257     }
17258 
17259     if( zNL || zCR ){
17260       int iOut = 0;
17261       i64 nMax = (nNL > nCR) ? nNL : nCR;
17262       i64 nAlloc = nMax * nText + (nMax+64)*2;
17263       char *zOut = (char*)sqlite3_malloc64(nAlloc);
17264       if( zOut==0 ){
17265         sqlite3_result_error_nomem(context);
17266         return;
17267       }
17268 
17269       if( zNL && zCR ){
17270         memcpy(&zOut[iOut], "replace(replace(", 16);
17271         iOut += 16;
17272       }else{
17273         memcpy(&zOut[iOut], "replace(", 8);
17274         iOut += 8;
17275       }
17276       for(i=0; zText[i]; i++){
17277         if( zText[i]=='\n' ){
17278           memcpy(&zOut[iOut], zNL, nNL);
17279           iOut += nNL;
17280         }else if( zText[i]=='\r' ){
17281           memcpy(&zOut[iOut], zCR, nCR);
17282           iOut += nCR;
17283         }else{
17284           zOut[iOut] = zText[i];
17285           iOut++;
17286         }
17287       }
17288 
17289       if( zNL ){
17290         memcpy(&zOut[iOut], ",'", 2); iOut += 2;
17291         memcpy(&zOut[iOut], zNL, nNL); iOut += nNL;
17292         memcpy(&zOut[iOut], "', char(10))", 12); iOut += 12;
17293       }
17294       if( zCR ){
17295         memcpy(&zOut[iOut], ",'", 2); iOut += 2;
17296         memcpy(&zOut[iOut], zCR, nCR); iOut += nCR;
17297         memcpy(&zOut[iOut], "', char(13))", 12); iOut += 12;
17298       }
17299 
17300       sqlite3_result_text(context, zOut, iOut, SQLITE_TRANSIENT);
17301       sqlite3_free(zOut);
17302       return;
17303     }
17304   }
17305 
17306   sqlite3_result_value(context, argv[0]);
17307 }
17308 
17309 /*
17310 ** This function is a no-op if recover handle p already contains an error
17311 ** (if p->errCode!=SQLITE_OK). A copy of the error code is returned in
17312 ** this case.
17313 **
17314 ** Otherwise, attempt to populate temporary table "recovery.schema" with the
17315 ** parts of the database schema that can be extracted from the input database.
17316 **
17317 ** If no error occurs, SQLITE_OK is returned. Otherwise, an error code
17318 ** and error message are left in the recover handle and a copy of the
17319 ** error code returned. It is not considered an error if part of all of
17320 ** the database schema cannot be recovered due to corruption.
17321 */
recoverCacheSchema(sqlite3_recover * p)17322 static int recoverCacheSchema(sqlite3_recover *p){
17323   return recoverExec(p, p->dbOut,
17324     "WITH RECURSIVE pages(p) AS ("
17325     "  SELECT 1"
17326     "    UNION"
17327     "  SELECT child FROM sqlite_dbptr('getpage()'), pages WHERE pgno=p"
17328     ")"
17329     "INSERT INTO recovery.schema SELECT"
17330     "  max(CASE WHEN field=0 THEN value ELSE NULL END),"
17331     "  max(CASE WHEN field=1 THEN value ELSE NULL END),"
17332     "  max(CASE WHEN field=2 THEN value ELSE NULL END),"
17333     "  max(CASE WHEN field=3 THEN value ELSE NULL END),"
17334     "  max(CASE WHEN field=4 THEN value ELSE NULL END)"
17335     "FROM sqlite_dbdata('getpage()') WHERE pgno IN ("
17336     "  SELECT p FROM pages"
17337     ") GROUP BY pgno, cell"
17338   );
17339 }
17340 
17341 /*
17342 ** If this recover handle is not in SQL callback mode (i.e. was not created
17343 ** using sqlite3_recover_init_sql()) of if an error has already occurred,
17344 ** this function is a no-op. Otherwise, issue a callback with SQL statement
17345 ** zSql as the parameter.
17346 **
17347 ** If the callback returns non-zero, set the recover handle error code to
17348 ** the value returned (so that the caller will abandon processing).
17349 */
recoverSqlCallback(sqlite3_recover * p,const char * zSql)17350 static void recoverSqlCallback(sqlite3_recover *p, const char *zSql){
17351   if( p->errCode==SQLITE_OK && p->xSql ){
17352     int res = p->xSql(p->pSqlCtx, zSql);
17353     if( res ){
17354       recoverError(p, SQLITE_ERROR, "callback returned an error - %d", res);
17355     }
17356   }
17357 }
17358 
17359 /*
17360 ** Transfer the following settings from the input database to the output
17361 ** database:
17362 **
17363 **   + page-size,
17364 **   + auto-vacuum settings,
17365 **   + database encoding,
17366 **   + user-version (PRAGMA user_version), and
17367 **   + application-id (PRAGMA application_id), and
17368 */
recoverTransferSettings(sqlite3_recover * p)17369 static void recoverTransferSettings(sqlite3_recover *p){
17370   const char *aPragma[] = {
17371     "encoding",
17372     "page_size",
17373     "auto_vacuum",
17374     "user_version",
17375     "application_id"
17376   };
17377   int ii;
17378 
17379   /* Truncate the output database to 0 pages in size. This is done by
17380   ** opening a new, empty, temp db, then using the backup API to clobber
17381   ** any existing output db with a copy of it. */
17382   if( p->errCode==SQLITE_OK ){
17383     sqlite3 *db2 = 0;
17384     int rc = sqlite3_open("", &db2);
17385     if( rc!=SQLITE_OK ){
17386       recoverDbError(p, db2);
17387       return;
17388     }
17389 
17390     for(ii=0; ii<(int)(sizeof(aPragma)/sizeof(aPragma[0])); ii++){
17391       const char *zPrag = aPragma[ii];
17392       sqlite3_stmt *p1 = 0;
17393       p1 = recoverPreparePrintf(p, p->dbIn, "PRAGMA %Q.%s", p->zDb, zPrag);
17394       if( p->errCode==SQLITE_OK && sqlite3_step(p1)==SQLITE_ROW ){
17395         const char *zArg = (const char*)sqlite3_column_text(p1, 0);
17396         char *z2 = recoverMPrintf(p, "PRAGMA %s = %Q", zPrag, zArg);
17397         recoverSqlCallback(p, z2);
17398         recoverExec(p, db2, z2);
17399         sqlite3_free(z2);
17400         if( zArg==0 ){
17401           recoverError(p, SQLITE_NOMEM, 0);
17402         }
17403       }
17404       recoverFinalize(p, p1);
17405     }
17406     recoverExec(p, db2, "CREATE TABLE t1(a); DROP TABLE t1;");
17407 
17408     if( p->errCode==SQLITE_OK ){
17409       sqlite3 *db = p->dbOut;
17410       sqlite3_backup *pBackup = sqlite3_backup_init(db, "main", db2, "main");
17411       if( pBackup ){
17412         sqlite3_backup_step(pBackup, -1);
17413         p->errCode = sqlite3_backup_finish(pBackup);
17414       }else{
17415         recoverDbError(p, db);
17416       }
17417     }
17418 
17419     sqlite3_close(db2);
17420   }
17421 }
17422 
17423 /*
17424 ** This function is a no-op if recover handle p already contains an error
17425 ** (if p->errCode!=SQLITE_OK). A copy of the error code is returned in
17426 ** this case.
17427 **
17428 ** Otherwise, an attempt is made to open the output database, attach
17429 ** and create the schema of the temporary database used to store
17430 ** intermediate data, and to register all required user functions and
17431 ** virtual table modules with the output handle.
17432 **
17433 ** If no error occurs, SQLITE_OK is returned. Otherwise, an error code
17434 ** and error message are left in the recover handle and a copy of the
17435 ** error code returned.
17436 */
recoverOpenOutput(sqlite3_recover * p)17437 static int recoverOpenOutput(sqlite3_recover *p){
17438   struct Func {
17439     const char *zName;
17440     int nArg;
17441     void (*xFunc)(sqlite3_context*,int,sqlite3_value **);
17442   } aFunc[] = {
17443     { "getpage", 1, recoverGetPage },
17444     { "page_is_used", 1, recoverPageIsUsed },
17445     { "read_i32", 2, recoverReadI32 },
17446     { "escape_crnl", 1, recoverEscapeCrnl },
17447   };
17448 
17449   const int flags = SQLITE_OPEN_URI|SQLITE_OPEN_CREATE|SQLITE_OPEN_READWRITE;
17450   sqlite3 *db = 0;                /* New database handle */
17451   int ii;                         /* For iterating through aFunc[] */
17452 
17453   assert( p->dbOut==0 );
17454 
17455   if( sqlite3_open_v2(p->zUri, &db, flags, 0) ){
17456     recoverDbError(p, db);
17457   }
17458 
17459   /* Register the sqlite_dbdata and sqlite_dbptr virtual table modules.
17460   ** These two are registered with the output database handle - this
17461   ** module depends on the input handle supporting the sqlite_dbpage
17462   ** virtual table only.  */
17463   if( p->errCode==SQLITE_OK ){
17464     p->errCode = sqlite3_dbdata_init(db, 0, 0);
17465   }
17466 
17467   /* Register the custom user-functions with the output handle. */
17468   for(ii=0;
17469       p->errCode==SQLITE_OK && ii<(int)(sizeof(aFunc)/sizeof(aFunc[0]));
17470       ii++){
17471     p->errCode = sqlite3_create_function(db, aFunc[ii].zName,
17472         aFunc[ii].nArg, SQLITE_UTF8, (void*)p, aFunc[ii].xFunc, 0, 0
17473     );
17474   }
17475 
17476   p->dbOut = db;
17477   return p->errCode;
17478 }
17479 
17480 /*
17481 ** Attach the auxiliary database 'recovery' to the output database handle.
17482 ** This temporary database is used during the recovery process and then
17483 ** discarded.
17484 */
recoverOpenRecovery(sqlite3_recover * p)17485 static void recoverOpenRecovery(sqlite3_recover *p){
17486   char *zSql = recoverMPrintf(p, "ATTACH %Q AS recovery;", p->zStateDb);
17487   recoverExec(p, p->dbOut, zSql);
17488   recoverExec(p, p->dbOut,
17489       "PRAGMA writable_schema = 1;"
17490       "CREATE TABLE recovery.map(pgno INTEGER PRIMARY KEY, parent INT);"
17491       "CREATE TABLE recovery.schema(type, name, tbl_name, rootpage, sql);"
17492   );
17493   sqlite3_free(zSql);
17494 }
17495 
17496 
17497 /*
17498 ** This function is a no-op if recover handle p already contains an error
17499 ** (if p->errCode!=SQLITE_OK).
17500 **
17501 ** Otherwise, argument zName must be the name of a table that has just been
17502 ** created in the output database. This function queries the output db
17503 ** for the schema of said table, and creates a RecoverTable object to
17504 ** store the schema in memory. The new RecoverTable object is linked into
17505 ** the list at sqlite3_recover.pTblList.
17506 **
17507 ** Parameter iRoot must be the root page of table zName in the INPUT
17508 ** database.
17509 */
recoverAddTable(sqlite3_recover * p,const char * zName,i64 iRoot)17510 static void recoverAddTable(
17511   sqlite3_recover *p,
17512   const char *zName,              /* Name of table created in output db */
17513   i64 iRoot                       /* Root page of same table in INPUT db */
17514 ){
17515   sqlite3_stmt *pStmt = recoverPreparePrintf(p, p->dbOut,
17516       "PRAGMA table_xinfo(%Q)", zName
17517   );
17518 
17519   if( pStmt ){
17520     int iPk = -1;
17521     int iBind = 1;
17522     RecoverTable *pNew = 0;
17523     int nCol = 0;
17524     int nName = recoverStrlen(zName);
17525     int nByte = 0;
17526     while( sqlite3_step(pStmt)==SQLITE_ROW ){
17527       nCol++;
17528       nByte += (sqlite3_column_bytes(pStmt, 1)+1);
17529     }
17530     nByte += sizeof(RecoverTable) + nCol*sizeof(RecoverColumn) + nName+1;
17531     recoverReset(p, pStmt);
17532 
17533     pNew = recoverMalloc(p, nByte);
17534     if( pNew ){
17535       int i = 0;
17536       int iField = 0;
17537       char *csr = 0;
17538       pNew->aCol = (RecoverColumn*)&pNew[1];
17539       pNew->zTab = csr = (char*)&pNew->aCol[nCol];
17540       pNew->nCol = nCol;
17541       pNew->iRoot = iRoot;
17542       memcpy(csr, zName, nName);
17543       csr += nName+1;
17544 
17545       for(i=0; sqlite3_step(pStmt)==SQLITE_ROW; i++){
17546         int iPKF = sqlite3_column_int(pStmt, 5);
17547         int n = sqlite3_column_bytes(pStmt, 1);
17548         const char *z = (const char*)sqlite3_column_text(pStmt, 1);
17549         const char *zType = (const char*)sqlite3_column_text(pStmt, 2);
17550         int eHidden = sqlite3_column_int(pStmt, 6);
17551 
17552         if( iPk==-1 && iPKF==1 && !sqlite3_stricmp("integer", zType) ) iPk = i;
17553         if( iPKF>1 ) iPk = -2;
17554         pNew->aCol[i].zCol = csr;
17555         pNew->aCol[i].eHidden = eHidden;
17556         if( eHidden==RECOVER_EHIDDEN_VIRTUAL ){
17557           pNew->aCol[i].iField = -1;
17558         }else{
17559           pNew->aCol[i].iField = iField++;
17560         }
17561         if( eHidden!=RECOVER_EHIDDEN_VIRTUAL
17562          && eHidden!=RECOVER_EHIDDEN_STORED
17563         ){
17564           pNew->aCol[i].iBind = iBind++;
17565         }
17566         memcpy(csr, z, n);
17567         csr += (n+1);
17568       }
17569 
17570       pNew->pNext = p->pTblList;
17571       p->pTblList = pNew;
17572       pNew->bIntkey = 1;
17573     }
17574 
17575     recoverFinalize(p, pStmt);
17576 
17577     pStmt = recoverPreparePrintf(p, p->dbOut, "PRAGMA index_xinfo(%Q)", zName);
17578     while( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){
17579       int iField = sqlite3_column_int(pStmt, 0);
17580       int iCol = sqlite3_column_int(pStmt, 1);
17581 
17582       assert( iCol<pNew->nCol );
17583       pNew->aCol[iCol].iField = iField;
17584 
17585       pNew->bIntkey = 0;
17586       iPk = -2;
17587     }
17588     recoverFinalize(p, pStmt);
17589 
17590     if( p->errCode==SQLITE_OK ){
17591       if( iPk>=0 ){
17592         pNew->aCol[iPk].bIPK = 1;
17593       }else if( pNew->bIntkey ){
17594         pNew->iRowidBind = iBind++;
17595       }
17596     }
17597   }
17598 }
17599 
17600 /*
17601 ** This function is called after recoverCacheSchema() has cached those parts
17602 ** of the input database schema that could be recovered in temporary table
17603 ** "recovery.schema". This function creates in the output database copies
17604 ** of all parts of that schema that must be created before the tables can
17605 ** be populated. Specifically, this means:
17606 **
17607 **     * all tables that are not VIRTUAL, and
17608 **     * UNIQUE indexes.
17609 **
17610 ** If the recovery handle uses SQL callbacks, then callbacks containing
17611 ** the associated "CREATE TABLE" and "CREATE INDEX" statements are made.
17612 **
17613 ** Additionally, records are added to the sqlite_schema table of the
17614 ** output database for any VIRTUAL tables. The CREATE VIRTUAL TABLE
17615 ** records are written directly to sqlite_schema, not actually executed.
17616 ** If the handle is in SQL callback mode, then callbacks are invoked
17617 ** with equivalent SQL statements.
17618 */
recoverWriteSchema1(sqlite3_recover * p)17619 static int recoverWriteSchema1(sqlite3_recover *p){
17620   sqlite3_stmt *pSelect = 0;
17621   sqlite3_stmt *pTblname = 0;
17622 
17623   pSelect = recoverPrepare(p, p->dbOut,
17624       "WITH dbschema(rootpage, name, sql, tbl, isVirtual, isIndex) AS ("
17625       "  SELECT rootpage, name, sql, "
17626       "    type='table', "
17627       "    sql LIKE 'create virtual%',"
17628       "    (type='index' AND (sql LIKE '%unique%' OR ?1))"
17629       "  FROM recovery.schema"
17630       ")"
17631       "SELECT rootpage, tbl, isVirtual, name, sql"
17632       " FROM dbschema "
17633       "  WHERE tbl OR isIndex"
17634       "  ORDER BY tbl DESC, name=='sqlite_sequence' DESC"
17635   );
17636 
17637   pTblname = recoverPrepare(p, p->dbOut,
17638       "SELECT name FROM sqlite_schema "
17639       "WHERE type='table' ORDER BY rowid DESC LIMIT 1"
17640   );
17641 
17642   if( pSelect ){
17643     sqlite3_bind_int(pSelect, 1, p->bSlowIndexes);
17644     while( sqlite3_step(pSelect)==SQLITE_ROW ){
17645       i64 iRoot = sqlite3_column_int64(pSelect, 0);
17646       int bTable = sqlite3_column_int(pSelect, 1);
17647       int bVirtual = sqlite3_column_int(pSelect, 2);
17648       const char *zName = (const char*)sqlite3_column_text(pSelect, 3);
17649       const char *zSql = (const char*)sqlite3_column_text(pSelect, 4);
17650       char *zFree = 0;
17651       int rc = SQLITE_OK;
17652 
17653       if( bVirtual ){
17654         zSql = (const char*)(zFree = recoverMPrintf(p,
17655             "INSERT INTO sqlite_schema VALUES('table', %Q, %Q, 0, %Q)",
17656             zName, zName, zSql
17657         ));
17658       }
17659       rc = sqlite3_exec(p->dbOut, zSql, 0, 0, 0);
17660       if( rc==SQLITE_OK ){
17661         recoverSqlCallback(p, zSql);
17662         if( bTable && !bVirtual ){
17663           if( SQLITE_ROW==sqlite3_step(pTblname) ){
17664             const char *zTbl = (const char*)sqlite3_column_text(pTblname, 0);
17665             if( zTbl ) recoverAddTable(p, zTbl, iRoot);
17666           }
17667           recoverReset(p, pTblname);
17668         }
17669       }else if( rc!=SQLITE_ERROR ){
17670         recoverDbError(p, p->dbOut);
17671       }
17672       sqlite3_free(zFree);
17673     }
17674   }
17675   recoverFinalize(p, pSelect);
17676   recoverFinalize(p, pTblname);
17677 
17678   return p->errCode;
17679 }
17680 
17681 /*
17682 ** This function is called after the output database has been populated. It
17683 ** adds all recovered schema elements that were not created in the output
17684 ** database by recoverWriteSchema1() - everything except for tables and
17685 ** UNIQUE indexes. Specifically:
17686 **
17687 **     * views,
17688 **     * triggers,
17689 **     * non-UNIQUE indexes.
17690 **
17691 ** If the recover handle is in SQL callback mode, then equivalent callbacks
17692 ** are issued to create the schema elements.
17693 */
recoverWriteSchema2(sqlite3_recover * p)17694 static int recoverWriteSchema2(sqlite3_recover *p){
17695   sqlite3_stmt *pSelect = 0;
17696 
17697   pSelect = recoverPrepare(p, p->dbOut,
17698       p->bSlowIndexes ?
17699       "SELECT rootpage, sql FROM recovery.schema "
17700       "  WHERE type!='table' AND type!='index'"
17701       :
17702       "SELECT rootpage, sql FROM recovery.schema "
17703       "  WHERE type!='table' AND (type!='index' OR sql NOT LIKE '%unique%')"
17704   );
17705 
17706   if( pSelect ){
17707     while( sqlite3_step(pSelect)==SQLITE_ROW ){
17708       const char *zSql = (const char*)sqlite3_column_text(pSelect, 1);
17709       int rc = sqlite3_exec(p->dbOut, zSql, 0, 0, 0);
17710       if( rc==SQLITE_OK ){
17711         recoverSqlCallback(p, zSql);
17712       }else if( rc!=SQLITE_ERROR ){
17713         recoverDbError(p, p->dbOut);
17714       }
17715     }
17716   }
17717   recoverFinalize(p, pSelect);
17718 
17719   return p->errCode;
17720 }
17721 
17722 /*
17723 ** This function is a no-op if recover handle p already contains an error
17724 ** (if p->errCode!=SQLITE_OK). In this case it returns NULL.
17725 **
17726 ** Otherwise, if the recover handle is configured to create an output
17727 ** database (was created by sqlite3_recover_init()), then this function
17728 ** prepares and returns an SQL statement to INSERT a new record into table
17729 ** pTab, assuming the first nField fields of a record extracted from disk
17730 ** are valid.
17731 **
17732 ** For example, if table pTab is:
17733 **
17734 **     CREATE TABLE name(a, b GENERATED ALWAYS AS (a+1) STORED, c, d, e);
17735 **
17736 ** And nField is 4, then the SQL statement prepared and returned is:
17737 **
17738 **     INSERT INTO (a, c, d) VALUES (?1, ?2, ?3);
17739 **
17740 ** In this case even though 4 values were extracted from the input db,
17741 ** only 3 are written to the output, as the generated STORED column
17742 ** cannot be written.
17743 **
17744 ** If the recover handle is in SQL callback mode, then the SQL statement
17745 ** prepared is such that evaluating it returns a single row containing
17746 ** a single text value - itself an SQL statement similar to the above,
17747 ** except with SQL literals in place of the variables. For example:
17748 **
17749 **     SELECT 'INSERT INTO (a, c, d) VALUES ('
17750 **          || quote(?1) || ', '
17751 **          || quote(?2) || ', '
17752 **          || quote(?3) || ')';
17753 **
17754 ** In either case, it is the responsibility of the caller to eventually
17755 ** free the statement handle using sqlite3_finalize().
17756 */
recoverInsertStmt(sqlite3_recover * p,RecoverTable * pTab,int nField)17757 static sqlite3_stmt *recoverInsertStmt(
17758   sqlite3_recover *p,
17759   RecoverTable *pTab,
17760   int nField
17761 ){
17762   sqlite3_stmt *pRet = 0;
17763   const char *zSep = "";
17764   const char *zSqlSep = "";
17765   char *zSql = 0;
17766   char *zFinal = 0;
17767   char *zBind = 0;
17768   int ii;
17769   int bSql = p->xSql ? 1 : 0;
17770 
17771   if( nField<=0 ) return 0;
17772 
17773   assert( nField<=pTab->nCol );
17774 
17775   zSql = recoverMPrintf(p, "INSERT OR IGNORE INTO %Q(", pTab->zTab);
17776 
17777   if( pTab->iRowidBind ){
17778     assert( pTab->bIntkey );
17779     zSql = recoverMPrintf(p, "%z_rowid_", zSql);
17780     if( bSql ){
17781       zBind = recoverMPrintf(p, "%zquote(?%d)", zBind, pTab->iRowidBind);
17782     }else{
17783       zBind = recoverMPrintf(p, "%z?%d", zBind, pTab->iRowidBind);
17784     }
17785     zSqlSep = "||', '||";
17786     zSep = ", ";
17787   }
17788 
17789   for(ii=0; ii<nField; ii++){
17790     int eHidden = pTab->aCol[ii].eHidden;
17791     if( eHidden!=RECOVER_EHIDDEN_VIRTUAL
17792      && eHidden!=RECOVER_EHIDDEN_STORED
17793     ){
17794       assert( pTab->aCol[ii].iField>=0 && pTab->aCol[ii].iBind>=1 );
17795       zSql = recoverMPrintf(p, "%z%s%Q", zSql, zSep, pTab->aCol[ii].zCol);
17796 
17797       if( bSql ){
17798         zBind = recoverMPrintf(p,
17799             "%z%sescape_crnl(quote(?%d))", zBind, zSqlSep, pTab->aCol[ii].iBind
17800         );
17801         zSqlSep = "||', '||";
17802       }else{
17803         zBind = recoverMPrintf(p, "%z%s?%d", zBind, zSep, pTab->aCol[ii].iBind);
17804       }
17805       zSep = ", ";
17806     }
17807   }
17808 
17809   if( bSql ){
17810     zFinal = recoverMPrintf(p, "SELECT %Q || ') VALUES (' || %s || ')'",
17811         zSql, zBind
17812     );
17813   }else{
17814     zFinal = recoverMPrintf(p, "%s) VALUES (%s)", zSql, zBind);
17815   }
17816 
17817   pRet = recoverPrepare(p, p->dbOut, zFinal);
17818   sqlite3_free(zSql);
17819   sqlite3_free(zBind);
17820   sqlite3_free(zFinal);
17821 
17822   return pRet;
17823 }
17824 
17825 
17826 /*
17827 ** Search the list of RecoverTable objects at p->pTblList for one that
17828 ** has root page iRoot in the input database. If such an object is found,
17829 ** return a pointer to it. Otherwise, return NULL.
17830 */
recoverFindTable(sqlite3_recover * p,u32 iRoot)17831 static RecoverTable *recoverFindTable(sqlite3_recover *p, u32 iRoot){
17832   RecoverTable *pRet = 0;
17833   for(pRet=p->pTblList; pRet && pRet->iRoot!=iRoot; pRet=pRet->pNext);
17834   return pRet;
17835 }
17836 
17837 /*
17838 ** This function attempts to create a lost and found table within the
17839 ** output db. If successful, it returns a pointer to a buffer containing
17840 ** the name of the new table. It is the responsibility of the caller to
17841 ** eventually free this buffer using sqlite3_free().
17842 **
17843 ** If an error occurs, NULL is returned and an error code and error
17844 ** message left in the recover handle.
17845 */
recoverLostAndFoundCreate(sqlite3_recover * p,int nField)17846 static char *recoverLostAndFoundCreate(
17847   sqlite3_recover *p,             /* Recover object */
17848   int nField                      /* Number of column fields in new table */
17849 ){
17850   char *zTbl = 0;
17851   sqlite3_stmt *pProbe = 0;
17852   int ii = 0;
17853 
17854   pProbe = recoverPrepare(p, p->dbOut,
17855     "SELECT 1 FROM sqlite_schema WHERE name=?"
17856   );
17857   for(ii=-1; zTbl==0 && p->errCode==SQLITE_OK && ii<1000; ii++){
17858     int bFail = 0;
17859     if( ii<0 ){
17860       zTbl = recoverMPrintf(p, "%s", p->zLostAndFound);
17861     }else{
17862       zTbl = recoverMPrintf(p, "%s_%d", p->zLostAndFound, ii);
17863     }
17864 
17865     if( p->errCode==SQLITE_OK ){
17866       sqlite3_bind_text(pProbe, 1, zTbl, -1, SQLITE_STATIC);
17867       if( SQLITE_ROW==sqlite3_step(pProbe) ){
17868         bFail = 1;
17869       }
17870       recoverReset(p, pProbe);
17871     }
17872 
17873     if( bFail ){
17874       sqlite3_clear_bindings(pProbe);
17875       sqlite3_free(zTbl);
17876       zTbl = 0;
17877     }
17878   }
17879   recoverFinalize(p, pProbe);
17880 
17881   if( zTbl ){
17882     const char *zSep = 0;
17883     char *zField = 0;
17884     char *zSql = 0;
17885 
17886     zSep = "rootpgno INTEGER, pgno INTEGER, nfield INTEGER, id INTEGER, ";
17887     for(ii=0; p->errCode==SQLITE_OK && ii<nField; ii++){
17888       zField = recoverMPrintf(p, "%z%sc%d", zField, zSep, ii);
17889       zSep = ", ";
17890     }
17891 
17892     zSql = recoverMPrintf(p, "CREATE TABLE %s(%s)", zTbl, zField);
17893     sqlite3_free(zField);
17894 
17895     recoverExec(p, p->dbOut, zSql);
17896     recoverSqlCallback(p, zSql);
17897     sqlite3_free(zSql);
17898   }else if( p->errCode==SQLITE_OK ){
17899     recoverError(
17900         p, SQLITE_ERROR, "failed to create %s output table", p->zLostAndFound
17901     );
17902   }
17903 
17904   return zTbl;
17905 }
17906 
17907 /*
17908 ** Synthesize and prepare an INSERT statement to write to the lost_and_found
17909 ** table in the output database. The name of the table is zTab, and it has
17910 ** nField c* fields.
17911 */
recoverLostAndFoundInsert(sqlite3_recover * p,const char * zTab,int nField)17912 static sqlite3_stmt *recoverLostAndFoundInsert(
17913   sqlite3_recover *p,
17914   const char *zTab,
17915   int nField
17916 ){
17917   int nTotal = nField + 4;
17918   int ii;
17919   char *zBind = 0;
17920   sqlite3_stmt *pRet = 0;
17921 
17922   if( p->xSql==0 ){
17923     for(ii=0; ii<nTotal; ii++){
17924       zBind = recoverMPrintf(p, "%z%s?", zBind, zBind?", ":"", ii);
17925     }
17926     pRet = recoverPreparePrintf(
17927         p, p->dbOut, "INSERT INTO %s VALUES(%s)", zTab, zBind
17928     );
17929   }else{
17930     const char *zSep = "";
17931     for(ii=0; ii<nTotal; ii++){
17932       zBind = recoverMPrintf(p, "%z%squote(?)", zBind, zSep);
17933       zSep = "|| ', ' ||";
17934     }
17935     pRet = recoverPreparePrintf(
17936         p, p->dbOut, "SELECT 'INSERT INTO %s VALUES(' || %s || ')'", zTab, zBind
17937     );
17938   }
17939 
17940   sqlite3_free(zBind);
17941   return pRet;
17942 }
17943 
17944 /*
17945 ** Input database page iPg contains data that will be written to the
17946 ** lost-and-found table of the output database. This function attempts
17947 ** to identify the root page of the tree that page iPg belonged to.
17948 ** If successful, it sets output variable (*piRoot) to the page number
17949 ** of the root page and returns SQLITE_OK. Otherwise, if an error occurs,
17950 ** an SQLite error code is returned and the final value of *piRoot
17951 ** undefined.
17952 */
recoverLostAndFoundFindRoot(sqlite3_recover * p,i64 iPg,i64 * piRoot)17953 static int recoverLostAndFoundFindRoot(
17954   sqlite3_recover *p,
17955   i64 iPg,
17956   i64 *piRoot
17957 ){
17958   RecoverStateLAF *pLaf = &p->laf;
17959 
17960   if( pLaf->pFindRoot==0 ){
17961     pLaf->pFindRoot = recoverPrepare(p, p->dbOut,
17962         "WITH RECURSIVE p(pgno) AS ("
17963         "  SELECT ?"
17964         "    UNION"
17965         "  SELECT parent FROM recovery.map AS m, p WHERE m.pgno=p.pgno"
17966         ") "
17967         "SELECT p.pgno FROM p, recovery.map m WHERE m.pgno=p.pgno "
17968         "    AND m.parent IS NULL"
17969     );
17970   }
17971   if( p->errCode==SQLITE_OK ){
17972     sqlite3_bind_int64(pLaf->pFindRoot, 1, iPg);
17973     if( sqlite3_step(pLaf->pFindRoot)==SQLITE_ROW ){
17974       *piRoot = sqlite3_column_int64(pLaf->pFindRoot, 0);
17975     }else{
17976       *piRoot = iPg;
17977     }
17978     recoverReset(p, pLaf->pFindRoot);
17979   }
17980   return p->errCode;
17981 }
17982 
17983 /*
17984 ** Recover data from page iPage of the input database and write it to
17985 ** the lost-and-found table in the output database.
17986 */
recoverLostAndFoundOnePage(sqlite3_recover * p,i64 iPage)17987 static void recoverLostAndFoundOnePage(sqlite3_recover *p, i64 iPage){
17988   RecoverStateLAF *pLaf = &p->laf;
17989   sqlite3_value **apVal = pLaf->apVal;
17990   sqlite3_stmt *pPageData = pLaf->pPageData;
17991   sqlite3_stmt *pInsert = pLaf->pInsert;
17992 
17993   int nVal = -1;
17994   int iPrevCell = 0;
17995   i64 iRoot = 0;
17996   int bHaveRowid = 0;
17997   i64 iRowid = 0;
17998   int ii = 0;
17999 
18000   if( recoverLostAndFoundFindRoot(p, iPage, &iRoot) ) return;
18001   sqlite3_bind_int64(pPageData, 1, iPage);
18002   while( p->errCode==SQLITE_OK && SQLITE_ROW==sqlite3_step(pPageData) ){
18003     int iCell = sqlite3_column_int64(pPageData, 0);
18004     int iField = sqlite3_column_int64(pPageData, 1);
18005 
18006     if( iPrevCell!=iCell && nVal>=0 ){
18007       /* Insert the new row */
18008       sqlite3_bind_int64(pInsert, 1, iRoot);      /* rootpgno */
18009       sqlite3_bind_int64(pInsert, 2, iPage);      /* pgno */
18010       sqlite3_bind_int(pInsert, 3, nVal);         /* nfield */
18011       if( bHaveRowid ){
18012         sqlite3_bind_int64(pInsert, 4, iRowid);   /* id */
18013       }
18014       for(ii=0; ii<nVal; ii++){
18015         recoverBindValue(p, pInsert, 5+ii, apVal[ii]);
18016       }
18017       if( sqlite3_step(pInsert)==SQLITE_ROW ){
18018         recoverSqlCallback(p, (const char*)sqlite3_column_text(pInsert, 0));
18019       }
18020       recoverReset(p, pInsert);
18021 
18022       /* Discard the accumulated row data */
18023       for(ii=0; ii<nVal; ii++){
18024         sqlite3_value_free(apVal[ii]);
18025         apVal[ii] = 0;
18026       }
18027       sqlite3_clear_bindings(pInsert);
18028       bHaveRowid = 0;
18029       nVal = -1;
18030     }
18031 
18032     if( iCell<0 ) break;
18033 
18034     if( iField<0 ){
18035       assert( nVal==-1 );
18036       iRowid = sqlite3_column_int64(pPageData, 2);
18037       bHaveRowid = 1;
18038       nVal = 0;
18039     }else if( iField<pLaf->nMaxField ){
18040       sqlite3_value *pVal = sqlite3_column_value(pPageData, 2);
18041       apVal[iField] = sqlite3_value_dup(pVal);
18042       assert( iField==nVal || (nVal==-1 && iField==0) );
18043       nVal = iField+1;
18044       if( apVal[iField]==0 ){
18045         recoverError(p, SQLITE_NOMEM, 0);
18046       }
18047     }
18048 
18049     iPrevCell = iCell;
18050   }
18051   recoverReset(p, pPageData);
18052 
18053   for(ii=0; ii<nVal; ii++){
18054     sqlite3_value_free(apVal[ii]);
18055     apVal[ii] = 0;
18056   }
18057 }
18058 
18059 /*
18060 ** Perform one step (sqlite3_recover_step()) of work for the connection
18061 ** passed as the only argument, which is guaranteed to be in
18062 ** RECOVER_STATE_LOSTANDFOUND3 state - during which the lost-and-found
18063 ** table of the output database is populated with recovered data that can
18064 ** not be assigned to any recovered schema object.
18065 */
recoverLostAndFound3Step(sqlite3_recover * p)18066 static int recoverLostAndFound3Step(sqlite3_recover *p){
18067   RecoverStateLAF *pLaf = &p->laf;
18068   if( p->errCode==SQLITE_OK ){
18069     if( pLaf->pInsert==0 ){
18070       return SQLITE_DONE;
18071     }else{
18072       if( p->errCode==SQLITE_OK ){
18073         int res = sqlite3_step(pLaf->pAllPage);
18074         if( res==SQLITE_ROW ){
18075           i64 iPage = sqlite3_column_int64(pLaf->pAllPage, 0);
18076           if( recoverBitmapQuery(pLaf->pUsed, iPage)==0 ){
18077             recoverLostAndFoundOnePage(p, iPage);
18078           }
18079         }else{
18080           recoverReset(p, pLaf->pAllPage);
18081           return SQLITE_DONE;
18082         }
18083       }
18084     }
18085   }
18086   return SQLITE_OK;
18087 }
18088 
18089 /*
18090 ** Initialize resources required in RECOVER_STATE_LOSTANDFOUND3
18091 ** state - during which the lost-and-found table of the output database
18092 ** is populated with recovered data that can not be assigned to any
18093 ** recovered schema object.
18094 */
recoverLostAndFound3Init(sqlite3_recover * p)18095 static void recoverLostAndFound3Init(sqlite3_recover *p){
18096   RecoverStateLAF *pLaf = &p->laf;
18097 
18098   if( pLaf->nMaxField>0 ){
18099     char *zTab = 0;               /* Name of lost_and_found table */
18100 
18101     zTab = recoverLostAndFoundCreate(p, pLaf->nMaxField);
18102     pLaf->pInsert = recoverLostAndFoundInsert(p, zTab, pLaf->nMaxField);
18103     sqlite3_free(zTab);
18104 
18105     pLaf->pAllPage = recoverPreparePrintf(p, p->dbOut,
18106         "WITH RECURSIVE seq(ii) AS ("
18107         "  SELECT 1 UNION ALL SELECT ii+1 FROM seq WHERE ii<%lld"
18108         ")"
18109         "SELECT ii FROM seq" , p->laf.nPg
18110     );
18111     pLaf->pPageData = recoverPrepare(p, p->dbOut,
18112         "SELECT cell, field, value "
18113         "FROM sqlite_dbdata('getpage()') d WHERE d.pgno=? "
18114         "UNION ALL "
18115         "SELECT -1, -1, -1"
18116     );
18117 
18118     pLaf->apVal = (sqlite3_value**)recoverMalloc(p,
18119         pLaf->nMaxField*sizeof(sqlite3_value*)
18120     );
18121   }
18122 }
18123 
18124 /*
18125 ** Initialize resources required in RECOVER_STATE_WRITING state - during which
18126 ** tables recovered from the schema of the input database are populated with
18127 ** recovered data.
18128 */
recoverWriteDataInit(sqlite3_recover * p)18129 static int recoverWriteDataInit(sqlite3_recover *p){
18130   RecoverStateW1 *p1 = &p->w1;
18131   RecoverTable *pTbl = 0;
18132   int nByte = 0;
18133 
18134   /* Figure out the maximum number of columns for any table in the schema */
18135   assert( p1->nMax==0 );
18136   for(pTbl=p->pTblList; pTbl; pTbl=pTbl->pNext){
18137     if( pTbl->nCol>p1->nMax ) p1->nMax = pTbl->nCol;
18138   }
18139 
18140   /* Allocate an array of (sqlite3_value*) in which to accumulate the values
18141   ** that will be written to the output database in a single row. */
18142   nByte = sizeof(sqlite3_value*) * (p1->nMax+1);
18143   p1->apVal = (sqlite3_value**)recoverMalloc(p, nByte);
18144   if( p1->apVal==0 ) return p->errCode;
18145 
18146   /* Prepare the SELECT to loop through schema tables (pTbls) and the SELECT
18147   ** to loop through cells that appear to belong to a single table (pSel). */
18148   p1->pTbls = recoverPrepare(p, p->dbOut,
18149       "SELECT rootpage FROM recovery.schema "
18150       "  WHERE type='table' AND (sql NOT LIKE 'create virtual%')"
18151       "  ORDER BY (tbl_name='sqlite_sequence') ASC"
18152   );
18153   p1->pSel = recoverPrepare(p, p->dbOut,
18154       "WITH RECURSIVE pages(page) AS ("
18155       "  SELECT ?1"
18156       "    UNION"
18157       "  SELECT child FROM sqlite_dbptr('getpage()'), pages "
18158       "    WHERE pgno=page"
18159       ") "
18160       "SELECT page, cell, field, value "
18161       "FROM sqlite_dbdata('getpage()') d, pages p WHERE p.page=d.pgno "
18162       "UNION ALL "
18163       "SELECT 0, 0, 0, 0"
18164   );
18165 
18166   return p->errCode;
18167 }
18168 
18169 /*
18170 ** Clean up resources allocated by recoverWriteDataInit() (stuff in
18171 ** sqlite3_recover.w1).
18172 */
recoverWriteDataCleanup(sqlite3_recover * p)18173 static void recoverWriteDataCleanup(sqlite3_recover *p){
18174   RecoverStateW1 *p1 = &p->w1;
18175   int ii;
18176   for(ii=0; ii<p1->nVal; ii++){
18177     sqlite3_value_free(p1->apVal[ii]);
18178   }
18179   sqlite3_free(p1->apVal);
18180   recoverFinalize(p, p1->pInsert);
18181   recoverFinalize(p, p1->pTbls);
18182   recoverFinalize(p, p1->pSel);
18183   memset(p1, 0, sizeof(*p1));
18184 }
18185 
18186 /*
18187 ** Perform one step (sqlite3_recover_step()) of work for the connection
18188 ** passed as the only argument, which is guaranteed to be in
18189 ** RECOVER_STATE_WRITING state - during which tables recovered from the
18190 ** schema of the input database are populated with recovered data.
18191 */
recoverWriteDataStep(sqlite3_recover * p)18192 static int recoverWriteDataStep(sqlite3_recover *p){
18193   RecoverStateW1 *p1 = &p->w1;
18194   sqlite3_stmt *pSel = p1->pSel;
18195   sqlite3_value **apVal = p1->apVal;
18196 
18197   if( p->errCode==SQLITE_OK && p1->pTab==0 ){
18198     if( sqlite3_step(p1->pTbls)==SQLITE_ROW ){
18199       i64 iRoot = sqlite3_column_int64(p1->pTbls, 0);
18200       p1->pTab = recoverFindTable(p, iRoot);
18201 
18202       recoverFinalize(p, p1->pInsert);
18203       p1->pInsert = 0;
18204 
18205       /* If this table is unknown, return early. The caller will invoke this
18206       ** function again and it will move on to the next table.  */
18207       if( p1->pTab==0 ) return p->errCode;
18208 
18209       /* If this is the sqlite_sequence table, delete any rows added by
18210       ** earlier INSERT statements on tables with AUTOINCREMENT primary
18211       ** keys before recovering its contents. The p1->pTbls SELECT statement
18212       ** is rigged to deliver "sqlite_sequence" last of all, so we don't
18213       ** worry about it being modified after it is recovered. */
18214       if( sqlite3_stricmp("sqlite_sequence", p1->pTab->zTab)==0 ){
18215         recoverExec(p, p->dbOut, "DELETE FROM sqlite_sequence");
18216         recoverSqlCallback(p, "DELETE FROM sqlite_sequence");
18217       }
18218 
18219       /* Bind the root page of this table within the original database to
18220       ** SELECT statement p1->pSel. The SELECT statement will then iterate
18221       ** through cells that look like they belong to table pTab.  */
18222       sqlite3_bind_int64(pSel, 1, iRoot);
18223 
18224       p1->nVal = 0;
18225       p1->bHaveRowid = 0;
18226       p1->iPrevPage = -1;
18227       p1->iPrevCell = -1;
18228     }else{
18229       return SQLITE_DONE;
18230     }
18231   }
18232   assert( p->errCode!=SQLITE_OK || p1->pTab );
18233 
18234   if( p->errCode==SQLITE_OK && sqlite3_step(pSel)==SQLITE_ROW ){
18235     RecoverTable *pTab = p1->pTab;
18236 
18237     i64 iPage = sqlite3_column_int64(pSel, 0);
18238     int iCell = sqlite3_column_int(pSel, 1);
18239     int iField = sqlite3_column_int(pSel, 2);
18240     sqlite3_value *pVal = sqlite3_column_value(pSel, 3);
18241     int bNewCell = (p1->iPrevPage!=iPage || p1->iPrevCell!=iCell);
18242 
18243     assert( bNewCell==0 || (iField==-1 || iField==0) );
18244     assert( bNewCell || iField==p1->nVal || p1->nVal==pTab->nCol );
18245 
18246     if( bNewCell ){
18247       int ii = 0;
18248       if( p1->nVal>=0 ){
18249         if( p1->pInsert==0 || p1->nVal!=p1->nInsert ){
18250           recoverFinalize(p, p1->pInsert);
18251           p1->pInsert = recoverInsertStmt(p, pTab, p1->nVal);
18252           p1->nInsert = p1->nVal;
18253         }
18254         if( p1->nVal>0 ){
18255           sqlite3_stmt *pInsert = p1->pInsert;
18256           for(ii=0; ii<pTab->nCol; ii++){
18257             RecoverColumn *pCol = &pTab->aCol[ii];
18258             int iBind = pCol->iBind;
18259             if( iBind>0 ){
18260               if( pCol->bIPK ){
18261                 sqlite3_bind_int64(pInsert, iBind, p1->iRowid);
18262               }else if( pCol->iField<p1->nVal ){
18263                 recoverBindValue(p, pInsert, iBind, apVal[pCol->iField]);
18264               }
18265             }
18266           }
18267           if( p->bRecoverRowid && pTab->iRowidBind>0 && p1->bHaveRowid ){
18268             sqlite3_bind_int64(pInsert, pTab->iRowidBind, p1->iRowid);
18269           }
18270           if( SQLITE_ROW==sqlite3_step(pInsert) ){
18271             const char *z = (const char*)sqlite3_column_text(pInsert, 0);
18272             recoverSqlCallback(p, z);
18273           }
18274           recoverReset(p, pInsert);
18275           assert( p->errCode || pInsert );
18276           if( pInsert ) sqlite3_clear_bindings(pInsert);
18277         }
18278       }
18279 
18280       for(ii=0; ii<p1->nVal; ii++){
18281         sqlite3_value_free(apVal[ii]);
18282         apVal[ii] = 0;
18283       }
18284       p1->nVal = -1;
18285       p1->bHaveRowid = 0;
18286     }
18287 
18288     if( iPage!=0 ){
18289       if( iField<0 ){
18290         p1->iRowid = sqlite3_column_int64(pSel, 3);
18291         assert( p1->nVal==-1 );
18292         p1->nVal = 0;
18293         p1->bHaveRowid = 1;
18294       }else if( iField<pTab->nCol ){
18295         assert( apVal[iField]==0 );
18296         apVal[iField] = sqlite3_value_dup( pVal );
18297         if( apVal[iField]==0 ){
18298           recoverError(p, SQLITE_NOMEM, 0);
18299         }
18300         p1->nVal = iField+1;
18301       }
18302       p1->iPrevCell = iCell;
18303       p1->iPrevPage = iPage;
18304     }
18305   }else{
18306     recoverReset(p, pSel);
18307     p1->pTab = 0;
18308   }
18309 
18310   return p->errCode;
18311 }
18312 
18313 /*
18314 ** Initialize resources required by sqlite3_recover_step() in
18315 ** RECOVER_STATE_LOSTANDFOUND1 state - during which the set of pages not
18316 ** already allocated to a recovered schema element is determined.
18317 */
recoverLostAndFound1Init(sqlite3_recover * p)18318 static void recoverLostAndFound1Init(sqlite3_recover *p){
18319   RecoverStateLAF *pLaf = &p->laf;
18320   sqlite3_stmt *pStmt = 0;
18321 
18322   assert( p->laf.pUsed==0 );
18323   pLaf->nPg = recoverPageCount(p);
18324   pLaf->pUsed = recoverBitmapAlloc(p, pLaf->nPg);
18325 
18326   /* Prepare a statement to iterate through all pages that are part of any tree
18327   ** in the recoverable part of the input database schema to the bitmap. And,
18328   ** if !p->bFreelistCorrupt, add all pages that appear to be part of the
18329   ** freelist.  */
18330   pStmt = recoverPrepare(
18331       p, p->dbOut,
18332       "WITH trunk(pgno) AS ("
18333       "  SELECT read_i32(getpage(1), 8) AS x WHERE x>0"
18334       "    UNION"
18335       "  SELECT read_i32(getpage(trunk.pgno), 0) AS x FROM trunk WHERE x>0"
18336       "),"
18337       "trunkdata(pgno, data) AS ("
18338       "  SELECT pgno, getpage(pgno) FROM trunk"
18339       "),"
18340       "freelist(data, n, freepgno) AS ("
18341       "  SELECT data, min(16384, read_i32(data, 1)-1), pgno FROM trunkdata"
18342       "    UNION ALL"
18343       "  SELECT data, n-1, read_i32(data, 2+n) FROM freelist WHERE n>=0"
18344       "),"
18345       ""
18346       "roots(r) AS ("
18347       "  SELECT 1 UNION ALL"
18348       "  SELECT rootpage FROM recovery.schema WHERE rootpage>0"
18349       "),"
18350       "used(page) AS ("
18351       "  SELECT r FROM roots"
18352       "    UNION"
18353       "  SELECT child FROM sqlite_dbptr('getpage()'), used "
18354       "    WHERE pgno=page"
18355       ") "
18356       "SELECT page FROM used"
18357       " UNION ALL "
18358       "SELECT freepgno FROM freelist WHERE NOT ?"
18359   );
18360   if( pStmt ) sqlite3_bind_int(pStmt, 1, p->bFreelistCorrupt);
18361   pLaf->pUsedPages = pStmt;
18362 }
18363 
18364 /*
18365 ** Perform one step (sqlite3_recover_step()) of work for the connection
18366 ** passed as the only argument, which is guaranteed to be in
18367 ** RECOVER_STATE_LOSTANDFOUND1 state - during which the set of pages not
18368 ** already allocated to a recovered schema element is determined.
18369 */
recoverLostAndFound1Step(sqlite3_recover * p)18370 static int recoverLostAndFound1Step(sqlite3_recover *p){
18371   RecoverStateLAF *pLaf = &p->laf;
18372   int rc = p->errCode;
18373   if( rc==SQLITE_OK ){
18374     rc = sqlite3_step(pLaf->pUsedPages);
18375     if( rc==SQLITE_ROW ){
18376       i64 iPg = sqlite3_column_int64(pLaf->pUsedPages, 0);
18377       recoverBitmapSet(pLaf->pUsed, iPg);
18378       rc = SQLITE_OK;
18379     }else{
18380       recoverFinalize(p, pLaf->pUsedPages);
18381       pLaf->pUsedPages = 0;
18382     }
18383   }
18384   return rc;
18385 }
18386 
18387 /*
18388 ** Initialize resources required by RECOVER_STATE_LOSTANDFOUND2
18389 ** state - during which the pages identified in RECOVER_STATE_LOSTANDFOUND1
18390 ** are sorted into sets that likely belonged to the same database tree.
18391 */
recoverLostAndFound2Init(sqlite3_recover * p)18392 static void recoverLostAndFound2Init(sqlite3_recover *p){
18393   RecoverStateLAF *pLaf = &p->laf;
18394 
18395   assert( p->laf.pAllAndParent==0 );
18396   assert( p->laf.pMapInsert==0 );
18397   assert( p->laf.pMaxField==0 );
18398   assert( p->laf.nMaxField==0 );
18399 
18400   pLaf->pMapInsert = recoverPrepare(p, p->dbOut,
18401       "INSERT OR IGNORE INTO recovery.map(pgno, parent) VALUES(?, ?)"
18402   );
18403   pLaf->pAllAndParent = recoverPreparePrintf(p, p->dbOut,
18404       "WITH RECURSIVE seq(ii) AS ("
18405       "  SELECT 1 UNION ALL SELECT ii+1 FROM seq WHERE ii<%lld"
18406       ")"
18407       "SELECT pgno, child FROM sqlite_dbptr('getpage()') "
18408       " UNION ALL "
18409       "SELECT NULL, ii FROM seq", p->laf.nPg
18410   );
18411   pLaf->pMaxField = recoverPreparePrintf(p, p->dbOut,
18412       "SELECT max(field)+1 FROM sqlite_dbdata('getpage') WHERE pgno = ?"
18413   );
18414 }
18415 
18416 /*
18417 ** Perform one step (sqlite3_recover_step()) of work for the connection
18418 ** passed as the only argument, which is guaranteed to be in
18419 ** RECOVER_STATE_LOSTANDFOUND2 state - during which the pages identified
18420 ** in RECOVER_STATE_LOSTANDFOUND1 are sorted into sets that likely belonged
18421 ** to the same database tree.
18422 */
recoverLostAndFound2Step(sqlite3_recover * p)18423 static int recoverLostAndFound2Step(sqlite3_recover *p){
18424   RecoverStateLAF *pLaf = &p->laf;
18425   if( p->errCode==SQLITE_OK ){
18426     int res = sqlite3_step(pLaf->pAllAndParent);
18427     if( res==SQLITE_ROW ){
18428       i64 iChild = sqlite3_column_int(pLaf->pAllAndParent, 1);
18429       if( recoverBitmapQuery(pLaf->pUsed, iChild)==0 ){
18430         sqlite3_bind_int64(pLaf->pMapInsert, 1, iChild);
18431         sqlite3_bind_value(pLaf->pMapInsert, 2,
18432             sqlite3_column_value(pLaf->pAllAndParent, 0)
18433         );
18434         sqlite3_step(pLaf->pMapInsert);
18435         recoverReset(p, pLaf->pMapInsert);
18436         sqlite3_bind_int64(pLaf->pMaxField, 1, iChild);
18437         if( SQLITE_ROW==sqlite3_step(pLaf->pMaxField) ){
18438           int nMax = sqlite3_column_int(pLaf->pMaxField, 0);
18439           if( nMax>pLaf->nMaxField ) pLaf->nMaxField = nMax;
18440         }
18441         recoverReset(p, pLaf->pMaxField);
18442       }
18443     }else{
18444       recoverFinalize(p, pLaf->pAllAndParent);
18445       pLaf->pAllAndParent =0;
18446       return SQLITE_DONE;
18447     }
18448   }
18449   return p->errCode;
18450 }
18451 
18452 /*
18453 ** Free all resources allocated as part of sqlite3_recover_step() calls
18454 ** in one of the RECOVER_STATE_LOSTANDFOUND[123] states.
18455 */
recoverLostAndFoundCleanup(sqlite3_recover * p)18456 static void recoverLostAndFoundCleanup(sqlite3_recover *p){
18457   recoverBitmapFree(p->laf.pUsed);
18458   p->laf.pUsed = 0;
18459   sqlite3_finalize(p->laf.pUsedPages);
18460   sqlite3_finalize(p->laf.pAllAndParent);
18461   sqlite3_finalize(p->laf.pMapInsert);
18462   sqlite3_finalize(p->laf.pMaxField);
18463   sqlite3_finalize(p->laf.pFindRoot);
18464   sqlite3_finalize(p->laf.pInsert);
18465   sqlite3_finalize(p->laf.pAllPage);
18466   sqlite3_finalize(p->laf.pPageData);
18467   p->laf.pUsedPages = 0;
18468   p->laf.pAllAndParent = 0;
18469   p->laf.pMapInsert = 0;
18470   p->laf.pMaxField = 0;
18471   p->laf.pFindRoot = 0;
18472   p->laf.pInsert = 0;
18473   p->laf.pAllPage = 0;
18474   p->laf.pPageData = 0;
18475   sqlite3_free(p->laf.apVal);
18476   p->laf.apVal = 0;
18477 }
18478 
18479 /*
18480 ** Free all resources allocated as part of sqlite3_recover_step() calls.
18481 */
recoverFinalCleanup(sqlite3_recover * p)18482 static void recoverFinalCleanup(sqlite3_recover *p){
18483   RecoverTable *pTab = 0;
18484   RecoverTable *pNext = 0;
18485 
18486   recoverWriteDataCleanup(p);
18487   recoverLostAndFoundCleanup(p);
18488 
18489   for(pTab=p->pTblList; pTab; pTab=pNext){
18490     pNext = pTab->pNext;
18491     sqlite3_free(pTab);
18492   }
18493   p->pTblList = 0;
18494   sqlite3_finalize(p->pGetPage);
18495   p->pGetPage = 0;
18496   sqlite3_file_control(p->dbIn, p->zDb, SQLITE_FCNTL_RESET_CACHE, 0);
18497 
18498   {
18499 #ifndef NDEBUG
18500     int res =
18501 #endif
18502        sqlite3_close(p->dbOut);
18503     assert( res==SQLITE_OK );
18504   }
18505   p->dbOut = 0;
18506 }
18507 
18508 /*
18509 ** Decode and return an unsigned 16-bit big-endian integer value from
18510 ** buffer a[].
18511 */
recoverGetU16(const u8 * a)18512 static u32 recoverGetU16(const u8 *a){
18513   return (((u32)a[0])<<8) + ((u32)a[1]);
18514 }
18515 
18516 /*
18517 ** Decode and return an unsigned 32-bit big-endian integer value from
18518 ** buffer a[].
18519 */
recoverGetU32(const u8 * a)18520 static u32 recoverGetU32(const u8 *a){
18521   return (((u32)a[0])<<24) + (((u32)a[1])<<16) + (((u32)a[2])<<8) + ((u32)a[3]);
18522 }
18523 
18524 /*
18525 ** Decode an SQLite varint from buffer a[]. Write the decoded value to (*pVal)
18526 ** and return the number of bytes consumed.
18527 */
recoverGetVarint(const u8 * a,i64 * pVal)18528 static int recoverGetVarint(const u8 *a, i64 *pVal){
18529   sqlite3_uint64 u = 0;
18530   int i;
18531   for(i=0; i<8; i++){
18532     u = (u<<7) + (a[i]&0x7f);
18533     if( (a[i]&0x80)==0 ){ *pVal = (sqlite3_int64)u; return i+1; }
18534   }
18535   u = (u<<8) + (a[i]&0xff);
18536   *pVal = (sqlite3_int64)u;
18537   return 9;
18538 }
18539 
18540 /*
18541 ** The second argument points to a buffer n bytes in size. If this buffer
18542 ** or a prefix thereof appears to contain a well-formed SQLite b-tree page,
18543 ** return the page-size in bytes. Otherwise, if the buffer does not
18544 ** appear to contain a well-formed b-tree page, return 0.
18545 */
recoverIsValidPage(u8 * aTmp,const u8 * a,int n)18546 static int recoverIsValidPage(u8 *aTmp, const u8 *a, int n){
18547   u8 *aUsed = aTmp;
18548   int nFrag = 0;
18549   int nActual = 0;
18550   int iFree = 0;
18551   int nCell = 0;                  /* Number of cells on page */
18552   int iCellOff = 0;               /* Offset of cell array in page */
18553   int iContent = 0;
18554   int eType = 0;
18555   int ii = 0;
18556 
18557   eType = (int)a[0];
18558   if( eType!=0x02 && eType!=0x05 && eType!=0x0A && eType!=0x0D ) return 0;
18559 
18560   iFree = (int)recoverGetU16(&a[1]);
18561   nCell = (int)recoverGetU16(&a[3]);
18562   iContent = (int)recoverGetU16(&a[5]);
18563   if( iContent==0 ) iContent = 65536;
18564   nFrag = (int)a[7];
18565 
18566   if( iContent>n ) return 0;
18567 
18568   memset(aUsed, 0, n);
18569   memset(aUsed, 0xFF, iContent);
18570 
18571   /* Follow the free-list. This is the same format for all b-tree pages. */
18572   if( iFree && iFree<=iContent ) return 0;
18573   while( iFree ){
18574     int iNext = 0;
18575     int nByte = 0;
18576     if( iFree>(n-4) ) return 0;
18577     iNext = recoverGetU16(&a[iFree]);
18578     nByte = recoverGetU16(&a[iFree+2]);
18579     if( iFree+nByte>n || nByte<4 ) return 0;
18580     if( iNext && iNext<iFree+nByte ) return 0;
18581     memset(&aUsed[iFree], 0xFF, nByte);
18582     iFree = iNext;
18583   }
18584 
18585   /* Run through the cells */
18586   if( eType==0x02 || eType==0x05 ){
18587     iCellOff = 12;
18588   }else{
18589     iCellOff = 8;
18590   }
18591   if( (iCellOff + 2*nCell)>iContent ) return 0;
18592   for(ii=0; ii<nCell; ii++){
18593     int iByte;
18594     i64 nPayload = 0;
18595     int nByte = 0;
18596     int iOff = recoverGetU16(&a[iCellOff + 2*ii]);
18597     if( iOff<iContent || iOff>n ){
18598       return 0;
18599     }
18600     if( eType==0x05 || eType==0x02 ) nByte += 4;
18601     nByte += recoverGetVarint(&a[iOff+nByte], &nPayload);
18602     if( eType==0x0D ){
18603       i64 dummy = 0;
18604       nByte += recoverGetVarint(&a[iOff+nByte], &dummy);
18605     }
18606     if( eType!=0x05 ){
18607       int X = (eType==0x0D) ? n-35 : (((n-12)*64/255)-23);
18608       int M = ((n-12)*32/255)-23;
18609       int K = M+((nPayload-M)%(n-4));
18610 
18611       if( nPayload<X ){
18612         nByte += nPayload;
18613       }else if( K<=X ){
18614         nByte += K+4;
18615       }else{
18616         nByte += M+4;
18617       }
18618     }
18619 
18620     if( iOff+nByte>n ){
18621       return 0;
18622     }
18623     for(iByte=iOff; iByte<(iOff+nByte); iByte++){
18624       if( aUsed[iByte]!=0 ){
18625         return 0;
18626       }
18627       aUsed[iByte] = 0xFF;
18628     }
18629   }
18630 
18631   nActual = 0;
18632   for(ii=0; ii<n; ii++){
18633     if( aUsed[ii]==0 ) nActual++;
18634   }
18635   return (nActual==nFrag);
18636 }
18637 
18638 
18639 static int recoverVfsClose(sqlite3_file*);
18640 static int recoverVfsRead(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst);
18641 static int recoverVfsWrite(sqlite3_file*, const void*, int, sqlite3_int64);
18642 static int recoverVfsTruncate(sqlite3_file*, sqlite3_int64 size);
18643 static int recoverVfsSync(sqlite3_file*, int flags);
18644 static int recoverVfsFileSize(sqlite3_file*, sqlite3_int64 *pSize);
18645 static int recoverVfsLock(sqlite3_file*, int);
18646 static int recoverVfsUnlock(sqlite3_file*, int);
18647 static int recoverVfsCheckReservedLock(sqlite3_file*, int *pResOut);
18648 static int recoverVfsFileControl(sqlite3_file*, int op, void *pArg);
18649 static int recoverVfsSectorSize(sqlite3_file*);
18650 static int recoverVfsDeviceCharacteristics(sqlite3_file*);
18651 static int recoverVfsShmMap(sqlite3_file*, int, int, int, void volatile**);
18652 static int recoverVfsShmLock(sqlite3_file*, int offset, int n, int flags);
18653 static void recoverVfsShmBarrier(sqlite3_file*);
18654 static int recoverVfsShmUnmap(sqlite3_file*, int deleteFlag);
18655 static int recoverVfsFetch(sqlite3_file*, sqlite3_int64, int, void**);
18656 static int recoverVfsUnfetch(sqlite3_file *pFd, sqlite3_int64 iOff, void *p);
18657 
18658 static sqlite3_io_methods recover_methods = {
18659   2, /* iVersion */
18660   recoverVfsClose,
18661   recoverVfsRead,
18662   recoverVfsWrite,
18663   recoverVfsTruncate,
18664   recoverVfsSync,
18665   recoverVfsFileSize,
18666   recoverVfsLock,
18667   recoverVfsUnlock,
18668   recoverVfsCheckReservedLock,
18669   recoverVfsFileControl,
18670   recoverVfsSectorSize,
18671   recoverVfsDeviceCharacteristics,
18672   recoverVfsShmMap,
18673   recoverVfsShmLock,
18674   recoverVfsShmBarrier,
18675   recoverVfsShmUnmap,
18676   recoverVfsFetch,
18677   recoverVfsUnfetch
18678 };
18679 
recoverVfsClose(sqlite3_file * pFd)18680 static int recoverVfsClose(sqlite3_file *pFd){
18681   assert( pFd->pMethods!=&recover_methods );
18682   return pFd->pMethods->xClose(pFd);
18683 }
18684 
18685 /*
18686 ** Write value v to buffer a[] as a 16-bit big-endian unsigned integer.
18687 */
recoverPutU16(u8 * a,u32 v)18688 static void recoverPutU16(u8 *a, u32 v){
18689   a[0] = (v>>8) & 0x00FF;
18690   a[1] = (v>>0) & 0x00FF;
18691 }
18692 
18693 /*
18694 ** Write value v to buffer a[] as a 32-bit big-endian unsigned integer.
18695 */
recoverPutU32(u8 * a,u32 v)18696 static void recoverPutU32(u8 *a, u32 v){
18697   a[0] = (v>>24) & 0x00FF;
18698   a[1] = (v>>16) & 0x00FF;
18699   a[2] = (v>>8) & 0x00FF;
18700   a[3] = (v>>0) & 0x00FF;
18701 }
18702 
18703 /*
18704 ** Detect the page-size of the database opened by file-handle pFd by
18705 ** searching the first part of the file for a well-formed SQLite b-tree
18706 ** page. If parameter nReserve is non-zero, then as well as searching for
18707 ** a b-tree page with zero reserved bytes, this function searches for one
18708 ** with nReserve reserved bytes at the end of it.
18709 **
18710 ** If successful, set variable p->detected_pgsz to the detected page-size
18711 ** in bytes and return SQLITE_OK. Or, if no error occurs but no valid page
18712 ** can be found, return SQLITE_OK but leave p->detected_pgsz set to 0. Or,
18713 ** if an error occurs (e.g. an IO or OOM error), then an SQLite error code
18714 ** is returned. The final value of p->detected_pgsz is undefined in this
18715 ** case.
18716 */
recoverVfsDetectPagesize(sqlite3_recover * p,sqlite3_file * pFd,u32 nReserve,i64 nSz)18717 static int recoverVfsDetectPagesize(
18718   sqlite3_recover *p,             /* Recover handle */
18719   sqlite3_file *pFd,              /* File-handle open on input database */
18720   u32 nReserve,                   /* Possible nReserve value */
18721   i64 nSz                         /* Size of database file in bytes */
18722 ){
18723   int rc = SQLITE_OK;
18724   const int nMin = 512;
18725   const int nMax = 65536;
18726   const int nMaxBlk = 4;
18727   u32 pgsz = 0;
18728   int iBlk = 0;
18729   u8 *aPg = 0;
18730   u8 *aTmp = 0;
18731   int nBlk = 0;
18732 
18733   aPg = (u8*)sqlite3_malloc(2*nMax);
18734   if( aPg==0 ) return SQLITE_NOMEM;
18735   aTmp = &aPg[nMax];
18736 
18737   nBlk = (nSz+nMax-1)/nMax;
18738   if( nBlk>nMaxBlk ) nBlk = nMaxBlk;
18739 
18740   do {
18741     for(iBlk=0; rc==SQLITE_OK && iBlk<nBlk; iBlk++){
18742       int nByte = (nSz>=((iBlk+1)*nMax)) ? nMax : (nSz % nMax);
18743       memset(aPg, 0, nMax);
18744       rc = pFd->pMethods->xRead(pFd, aPg, nByte, iBlk*nMax);
18745       if( rc==SQLITE_OK ){
18746         int pgsz2;
18747         for(pgsz2=(pgsz ? pgsz*2 : nMin); pgsz2<=nMax; pgsz2=pgsz2*2){
18748           int iOff;
18749           for(iOff=0; iOff<nMax; iOff+=pgsz2){
18750             if( recoverIsValidPage(aTmp, &aPg[iOff], pgsz2-nReserve) ){
18751               pgsz = pgsz2;
18752               break;
18753             }
18754           }
18755         }
18756       }
18757     }
18758     if( pgsz>(u32)p->detected_pgsz ){
18759       p->detected_pgsz = pgsz;
18760       p->nReserve = nReserve;
18761     }
18762     if( nReserve==0 ) break;
18763     nReserve = 0;
18764   }while( 1 );
18765 
18766   p->detected_pgsz = pgsz;
18767   sqlite3_free(aPg);
18768   return rc;
18769 }
18770 
18771 /*
18772 ** The xRead() method of the wrapper VFS. This is used to intercept calls
18773 ** to read page 1 of the input database.
18774 */
recoverVfsRead(sqlite3_file * pFd,void * aBuf,int nByte,i64 iOff)18775 static int recoverVfsRead(sqlite3_file *pFd, void *aBuf, int nByte, i64 iOff){
18776   int rc = SQLITE_OK;
18777   if( pFd->pMethods==&recover_methods ){
18778     pFd->pMethods = recover_g.pMethods;
18779     rc = pFd->pMethods->xRead(pFd, aBuf, nByte, iOff);
18780     if( nByte==16 ){
18781       sqlite3_randomness(16, aBuf);
18782     }else
18783     if( rc==SQLITE_OK && iOff==0 && nByte>=108 ){
18784       /* Ensure that the database has a valid header file. The only fields
18785       ** that really matter to recovery are:
18786       **
18787       **   + Database page size (16-bits at offset 16)
18788       **   + Size of db in pages (32-bits at offset 28)
18789       **   + Database encoding (32-bits at offset 56)
18790       **
18791       ** Also preserved are:
18792       **
18793       **   + first freelist page (32-bits at offset 32)
18794       **   + size of freelist (32-bits at offset 36)
18795       **   + the wal-mode flags (16-bits at offset 18)
18796       **
18797       ** We also try to preserve the auto-vacuum, incr-value, user-version
18798       ** and application-id fields - all 32 bit quantities at offsets
18799       ** 52, 60, 64 and 68. All other fields are set to known good values.
18800       **
18801       ** Byte offset 105 should also contain the page-size as a 16-bit
18802       ** integer.
18803       */
18804       const int aPreserve[] = {32, 36, 52, 60, 64, 68};
18805       u8 aHdr[108] = {
18806         0x53, 0x51, 0x4c, 0x69, 0x74, 0x65, 0x20, 0x66,
18807         0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x33, 0x00,
18808         0xFF, 0xFF, 0x01, 0x01, 0x00, 0x40, 0x20, 0x20,
18809         0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
18810         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
18811         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
18812         0x00, 0x00, 0x10, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
18813         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
18814         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
18815         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
18816         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
18817         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
18818         0x00, 0x2e, 0x5b, 0x30,
18819 
18820         0x0D, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00
18821       };
18822       u8 *a = (u8*)aBuf;
18823 
18824       u32 pgsz = recoverGetU16(&a[16]);
18825       u32 nReserve = a[20];
18826       u32 enc = recoverGetU32(&a[56]);
18827       u32 dbsz = 0;
18828       i64 dbFileSize = 0;
18829       int ii;
18830       sqlite3_recover *p = recover_g.p;
18831 
18832       if( pgsz==0x01 ) pgsz = 65536;
18833       rc = pFd->pMethods->xFileSize(pFd, &dbFileSize);
18834 
18835       if( rc==SQLITE_OK && p->detected_pgsz==0 ){
18836         rc = recoverVfsDetectPagesize(p, pFd, nReserve, dbFileSize);
18837       }
18838       if( p->detected_pgsz ){
18839         pgsz = p->detected_pgsz;
18840         nReserve = p->nReserve;
18841       }
18842 
18843       if( pgsz ){
18844         dbsz = dbFileSize / pgsz;
18845       }
18846       if( enc!=SQLITE_UTF8 && enc!=SQLITE_UTF16BE && enc!=SQLITE_UTF16LE ){
18847         enc = SQLITE_UTF8;
18848       }
18849 
18850       sqlite3_free(p->pPage1Cache);
18851       p->pPage1Cache = 0;
18852       p->pPage1Disk = 0;
18853 
18854       p->pgsz = nByte;
18855       p->pPage1Cache = (u8*)recoverMalloc(p, nByte*2);
18856       if( p->pPage1Cache ){
18857         p->pPage1Disk = &p->pPage1Cache[nByte];
18858         memcpy(p->pPage1Disk, aBuf, nByte);
18859         aHdr[18] = a[18];
18860         aHdr[19] = a[19];
18861         recoverPutU32(&aHdr[28], dbsz);
18862         recoverPutU32(&aHdr[56], enc);
18863         recoverPutU16(&aHdr[105], pgsz-nReserve);
18864         if( pgsz==65536 ) pgsz = 1;
18865         recoverPutU16(&aHdr[16], pgsz);
18866         aHdr[20] = nReserve;
18867         for(ii=0; ii<(int)(sizeof(aPreserve)/sizeof(aPreserve[0])); ii++){
18868           memcpy(&aHdr[aPreserve[ii]], &a[aPreserve[ii]], 4);
18869         }
18870         memcpy(aBuf, aHdr, sizeof(aHdr));
18871         memset(&((u8*)aBuf)[sizeof(aHdr)], 0, nByte-sizeof(aHdr));
18872 
18873         memcpy(p->pPage1Cache, aBuf, nByte);
18874       }else{
18875         rc = p->errCode;
18876       }
18877 
18878     }
18879     pFd->pMethods = &recover_methods;
18880   }else{
18881     rc = pFd->pMethods->xRead(pFd, aBuf, nByte, iOff);
18882   }
18883   return rc;
18884 }
18885 
18886 /*
18887 ** Used to make sqlite3_io_methods wrapper methods less verbose.
18888 */
18889 #define RECOVER_VFS_WRAPPER(code)                         \
18890   int rc = SQLITE_OK;                                     \
18891   if( pFd->pMethods==&recover_methods ){                  \
18892     pFd->pMethods = recover_g.pMethods;                   \
18893     rc = code;                                            \
18894     pFd->pMethods = &recover_methods;                     \
18895   }else{                                                  \
18896     rc = code;                                            \
18897   }                                                       \
18898   return rc;
18899 
18900 /*
18901 ** Methods of the wrapper VFS. All methods except for xRead() and xClose()
18902 ** simply uninstall the sqlite3_io_methods wrapper, invoke the equivalent
18903 ** method on the lower level VFS, then reinstall the wrapper before returning.
18904 ** Those that return an integer value use the RECOVER_VFS_WRAPPER macro.
18905 */
recoverVfsWrite(sqlite3_file * pFd,const void * aBuf,int nByte,i64 iOff)18906 static int recoverVfsWrite(
18907   sqlite3_file *pFd, const void *aBuf, int nByte, i64 iOff
18908 ){
18909   RECOVER_VFS_WRAPPER (
18910       pFd->pMethods->xWrite(pFd, aBuf, nByte, iOff)
18911   );
18912 }
recoverVfsTruncate(sqlite3_file * pFd,sqlite3_int64 size)18913 static int recoverVfsTruncate(sqlite3_file *pFd, sqlite3_int64 size){
18914   RECOVER_VFS_WRAPPER (
18915       pFd->pMethods->xTruncate(pFd, size)
18916   );
18917 }
recoverVfsSync(sqlite3_file * pFd,int flags)18918 static int recoverVfsSync(sqlite3_file *pFd, int flags){
18919   RECOVER_VFS_WRAPPER (
18920       pFd->pMethods->xSync(pFd, flags)
18921   );
18922 }
recoverVfsFileSize(sqlite3_file * pFd,sqlite3_int64 * pSize)18923 static int recoverVfsFileSize(sqlite3_file *pFd, sqlite3_int64 *pSize){
18924   RECOVER_VFS_WRAPPER (
18925       pFd->pMethods->xFileSize(pFd, pSize)
18926   );
18927 }
recoverVfsLock(sqlite3_file * pFd,int eLock)18928 static int recoverVfsLock(sqlite3_file *pFd, int eLock){
18929   RECOVER_VFS_WRAPPER (
18930       pFd->pMethods->xLock(pFd, eLock)
18931   );
18932 }
recoverVfsUnlock(sqlite3_file * pFd,int eLock)18933 static int recoverVfsUnlock(sqlite3_file *pFd, int eLock){
18934   RECOVER_VFS_WRAPPER (
18935       pFd->pMethods->xUnlock(pFd, eLock)
18936   );
18937 }
recoverVfsCheckReservedLock(sqlite3_file * pFd,int * pResOut)18938 static int recoverVfsCheckReservedLock(sqlite3_file *pFd, int *pResOut){
18939   RECOVER_VFS_WRAPPER (
18940       pFd->pMethods->xCheckReservedLock(pFd, pResOut)
18941   );
18942 }
recoverVfsFileControl(sqlite3_file * pFd,int op,void * pArg)18943 static int recoverVfsFileControl(sqlite3_file *pFd, int op, void *pArg){
18944   RECOVER_VFS_WRAPPER (
18945     (pFd->pMethods ?  pFd->pMethods->xFileControl(pFd, op, pArg) : SQLITE_NOTFOUND)
18946   );
18947 }
recoverVfsSectorSize(sqlite3_file * pFd)18948 static int recoverVfsSectorSize(sqlite3_file *pFd){
18949   RECOVER_VFS_WRAPPER (
18950       pFd->pMethods->xSectorSize(pFd)
18951   );
18952 }
recoverVfsDeviceCharacteristics(sqlite3_file * pFd)18953 static int recoverVfsDeviceCharacteristics(sqlite3_file *pFd){
18954   RECOVER_VFS_WRAPPER (
18955       pFd->pMethods->xDeviceCharacteristics(pFd)
18956   );
18957 }
recoverVfsShmMap(sqlite3_file * pFd,int iPg,int pgsz,int bExtend,void volatile ** pp)18958 static int recoverVfsShmMap(
18959   sqlite3_file *pFd, int iPg, int pgsz, int bExtend, void volatile **pp
18960 ){
18961   RECOVER_VFS_WRAPPER (
18962       pFd->pMethods->xShmMap(pFd, iPg, pgsz, bExtend, pp)
18963   );
18964 }
recoverVfsShmLock(sqlite3_file * pFd,int offset,int n,int flags)18965 static int recoverVfsShmLock(sqlite3_file *pFd, int offset, int n, int flags){
18966   RECOVER_VFS_WRAPPER (
18967       pFd->pMethods->xShmLock(pFd, offset, n, flags)
18968   );
18969 }
recoverVfsShmBarrier(sqlite3_file * pFd)18970 static void recoverVfsShmBarrier(sqlite3_file *pFd){
18971   if( pFd->pMethods==&recover_methods ){
18972     pFd->pMethods = recover_g.pMethods;
18973     pFd->pMethods->xShmBarrier(pFd);
18974     pFd->pMethods = &recover_methods;
18975   }else{
18976     pFd->pMethods->xShmBarrier(pFd);
18977   }
18978 }
recoverVfsShmUnmap(sqlite3_file * pFd,int deleteFlag)18979 static int recoverVfsShmUnmap(sqlite3_file *pFd, int deleteFlag){
18980   RECOVER_VFS_WRAPPER (
18981       pFd->pMethods->xShmUnmap(pFd, deleteFlag)
18982   );
18983 }
18984 
recoverVfsFetch(sqlite3_file * pFd,sqlite3_int64 iOff,int iAmt,void ** pp)18985 static int recoverVfsFetch(
18986   sqlite3_file *pFd,
18987   sqlite3_int64 iOff,
18988   int iAmt,
18989   void **pp
18990 ){
18991   (void)pFd;
18992   (void)iOff;
18993   (void)iAmt;
18994   *pp = 0;
18995   return SQLITE_OK;
18996 }
recoverVfsUnfetch(sqlite3_file * pFd,sqlite3_int64 iOff,void * p)18997 static int recoverVfsUnfetch(sqlite3_file *pFd, sqlite3_int64 iOff, void *p){
18998   (void)pFd;
18999   (void)iOff;
19000   (void)p;
19001   return SQLITE_OK;
19002 }
19003 
19004 /*
19005 ** Install the VFS wrapper around the file-descriptor open on the input
19006 ** database for recover handle p. Mutex RECOVER_MUTEX_ID must be held
19007 ** when this function is called.
19008 */
recoverInstallWrapper(sqlite3_recover * p)19009 static void recoverInstallWrapper(sqlite3_recover *p){
19010   sqlite3_file *pFd = 0;
19011   assert( recover_g.pMethods==0 );
19012   recoverAssertMutexHeld();
19013   sqlite3_file_control(p->dbIn, p->zDb, SQLITE_FCNTL_FILE_POINTER, (void*)&pFd);
19014   assert( pFd==0 || pFd->pMethods!=&recover_methods );
19015   if( pFd && pFd->pMethods ){
19016     int iVersion = 1 + (pFd->pMethods->iVersion>1 && pFd->pMethods->xShmMap!=0);
19017     recover_g.pMethods = pFd->pMethods;
19018     recover_g.p = p;
19019     recover_methods.iVersion = iVersion;
19020     pFd->pMethods = &recover_methods;
19021   }
19022 }
19023 
19024 /*
19025 ** Uninstall the VFS wrapper that was installed around the file-descriptor open
19026 ** on the input database for recover handle p. Mutex RECOVER_MUTEX_ID must be
19027 ** held when this function is called.
19028 */
recoverUninstallWrapper(sqlite3_recover * p)19029 static void recoverUninstallWrapper(sqlite3_recover *p){
19030   sqlite3_file *pFd = 0;
19031   recoverAssertMutexHeld();
19032   sqlite3_file_control(p->dbIn, p->zDb,SQLITE_FCNTL_FILE_POINTER,(void*)&pFd);
19033   if( pFd && pFd->pMethods ){
19034     pFd->pMethods = recover_g.pMethods;
19035     recover_g.pMethods = 0;
19036     recover_g.p = 0;
19037   }
19038 }
19039 
19040 /*
19041 ** This function does the work of a single sqlite3_recover_step() call. It
19042 ** is guaranteed that the handle is not in an error state when this
19043 ** function is called.
19044 */
recoverStep(sqlite3_recover * p)19045 static void recoverStep(sqlite3_recover *p){
19046   assert( p && p->errCode==SQLITE_OK );
19047   switch( p->eState ){
19048     case RECOVER_STATE_INIT:
19049       /* This is the very first call to sqlite3_recover_step() on this object.
19050       */
19051       recoverSqlCallback(p, "BEGIN");
19052       recoverSqlCallback(p, "PRAGMA writable_schema = on");
19053 
19054       recoverEnterMutex();
19055       recoverInstallWrapper(p);
19056 
19057       /* Open the output database. And register required virtual tables and
19058       ** user functions with the new handle. */
19059       recoverOpenOutput(p);
19060 
19061       /* Open transactions on both the input and output databases. */
19062       sqlite3_file_control(p->dbIn, p->zDb, SQLITE_FCNTL_RESET_CACHE, 0);
19063       recoverExec(p, p->dbIn, "PRAGMA writable_schema = on");
19064       recoverExec(p, p->dbIn, "BEGIN");
19065       if( p->errCode==SQLITE_OK ) p->bCloseTransaction = 1;
19066       recoverExec(p, p->dbIn, "SELECT 1 FROM sqlite_schema");
19067       recoverTransferSettings(p);
19068       recoverOpenRecovery(p);
19069       recoverCacheSchema(p);
19070 
19071       recoverUninstallWrapper(p);
19072       recoverLeaveMutex();
19073 
19074       recoverExec(p, p->dbOut, "BEGIN");
19075 
19076       recoverWriteSchema1(p);
19077       p->eState = RECOVER_STATE_WRITING;
19078       break;
19079 
19080     case RECOVER_STATE_WRITING: {
19081       if( p->w1.pTbls==0 ){
19082         recoverWriteDataInit(p);
19083       }
19084       if( SQLITE_DONE==recoverWriteDataStep(p) ){
19085         recoverWriteDataCleanup(p);
19086         if( p->zLostAndFound ){
19087           p->eState = RECOVER_STATE_LOSTANDFOUND1;
19088         }else{
19089           p->eState = RECOVER_STATE_SCHEMA2;
19090         }
19091       }
19092       break;
19093     }
19094 
19095     case RECOVER_STATE_LOSTANDFOUND1: {
19096       if( p->laf.pUsed==0 ){
19097         recoverLostAndFound1Init(p);
19098       }
19099       if( SQLITE_DONE==recoverLostAndFound1Step(p) ){
19100         p->eState = RECOVER_STATE_LOSTANDFOUND2;
19101       }
19102       break;
19103     }
19104     case RECOVER_STATE_LOSTANDFOUND2: {
19105       if( p->laf.pAllAndParent==0 ){
19106         recoverLostAndFound2Init(p);
19107       }
19108       if( SQLITE_DONE==recoverLostAndFound2Step(p) ){
19109         p->eState = RECOVER_STATE_LOSTANDFOUND3;
19110       }
19111       break;
19112     }
19113 
19114     case RECOVER_STATE_LOSTANDFOUND3: {
19115       if( p->laf.pInsert==0 ){
19116         recoverLostAndFound3Init(p);
19117       }
19118       if( SQLITE_DONE==recoverLostAndFound3Step(p) ){
19119         p->eState = RECOVER_STATE_SCHEMA2;
19120       }
19121       break;
19122     }
19123 
19124     case RECOVER_STATE_SCHEMA2: {
19125       int rc = SQLITE_OK;
19126 
19127       recoverWriteSchema2(p);
19128       p->eState = RECOVER_STATE_DONE;
19129 
19130       /* If no error has occurred, commit the write transaction on the output
19131       ** database. Regardless of whether or not an error has occurred, make
19132       ** an attempt to end the read transaction on the input database.  */
19133       recoverExec(p, p->dbOut, "COMMIT");
19134       rc = sqlite3_exec(p->dbIn, "END", 0, 0, 0);
19135       if( p->errCode==SQLITE_OK ) p->errCode = rc;
19136 
19137       recoverSqlCallback(p, "PRAGMA writable_schema = off");
19138       recoverSqlCallback(p, "COMMIT");
19139       p->eState = RECOVER_STATE_DONE;
19140       recoverFinalCleanup(p);
19141       break;
19142     };
19143 
19144     case RECOVER_STATE_DONE: {
19145       /* no-op */
19146       break;
19147     };
19148   }
19149 }
19150 
19151 
19152 /*
19153 ** This is a worker function that does the heavy lifting for both init
19154 ** functions:
19155 **
19156 **     sqlite3_recover_init()
19157 **     sqlite3_recover_init_sql()
19158 **
19159 ** All this function does is allocate space for the recover handle and
19160 ** take copies of the input parameters. All the real work is done within
19161 ** sqlite3_recover_run().
19162 */
recoverInit(sqlite3 * db,const char * zDb,const char * zUri,int (* xSql)(void *,const char *),void * pSqlCtx)19163 sqlite3_recover *recoverInit(
19164   sqlite3* db,
19165   const char *zDb,
19166   const char *zUri,               /* Output URI for _recover_init() */
19167   int (*xSql)(void*, const char*),/* SQL callback for _recover_init_sql() */
19168   void *pSqlCtx                   /* Context arg for _recover_init_sql() */
19169 ){
19170   sqlite3_recover *pRet = 0;
19171   int nDb = 0;
19172   int nUri = 0;
19173   int nByte = 0;
19174 
19175   if( zDb==0 ){ zDb = "main"; }
19176 
19177   nDb = recoverStrlen(zDb);
19178   nUri = recoverStrlen(zUri);
19179 
19180   nByte = sizeof(sqlite3_recover) + nDb+1 + nUri+1;
19181   pRet = (sqlite3_recover*)sqlite3_malloc(nByte);
19182   if( pRet ){
19183     memset(pRet, 0, nByte);
19184     pRet->dbIn = db;
19185     pRet->zDb = (char*)&pRet[1];
19186     pRet->zUri = &pRet->zDb[nDb+1];
19187     memcpy(pRet->zDb, zDb, nDb);
19188     if( nUri>0 && zUri ) memcpy(pRet->zUri, zUri, nUri);
19189     pRet->xSql = xSql;
19190     pRet->pSqlCtx = pSqlCtx;
19191     pRet->bRecoverRowid = RECOVER_ROWID_DEFAULT;
19192   }
19193 
19194   return pRet;
19195 }
19196 
19197 /*
19198 ** Initialize a recovery handle that creates a new database containing
19199 ** the recovered data.
19200 */
sqlite3_recover_init(sqlite3 * db,const char * zDb,const char * zUri)19201 sqlite3_recover *sqlite3_recover_init(
19202   sqlite3* db,
19203   const char *zDb,
19204   const char *zUri
19205 ){
19206   return recoverInit(db, zDb, zUri, 0, 0);
19207 }
19208 
19209 /*
19210 ** Initialize a recovery handle that returns recovered data in the
19211 ** form of SQL statements via a callback.
19212 */
sqlite3_recover_init_sql(sqlite3 * db,const char * zDb,int (* xSql)(void *,const char *),void * pSqlCtx)19213 sqlite3_recover *sqlite3_recover_init_sql(
19214   sqlite3* db,
19215   const char *zDb,
19216   int (*xSql)(void*, const char*),
19217   void *pSqlCtx
19218 ){
19219   return recoverInit(db, zDb, 0, xSql, pSqlCtx);
19220 }
19221 
19222 /*
19223 ** Return the handle error message, if any.
19224 */
sqlite3_recover_errmsg(sqlite3_recover * p)19225 const char *sqlite3_recover_errmsg(sqlite3_recover *p){
19226   return (p && p->errCode!=SQLITE_NOMEM) ? p->zErrMsg : "out of memory";
19227 }
19228 
19229 /*
19230 ** Return the handle error code.
19231 */
sqlite3_recover_errcode(sqlite3_recover * p)19232 int sqlite3_recover_errcode(sqlite3_recover *p){
19233   return p ? p->errCode : SQLITE_NOMEM;
19234 }
19235 
19236 /*
19237 ** Configure the handle.
19238 */
sqlite3_recover_config(sqlite3_recover * p,int op,void * pArg)19239 int sqlite3_recover_config(sqlite3_recover *p, int op, void *pArg){
19240   int rc = SQLITE_OK;
19241   if( p==0 ){
19242     rc = SQLITE_NOMEM;
19243   }else if( p->eState!=RECOVER_STATE_INIT ){
19244     rc = SQLITE_MISUSE;
19245   }else{
19246     switch( op ){
19247       case 789:
19248         /* This undocumented magic configuration option is used to set the
19249         ** name of the auxiliary database that is ATTACH-ed to the database
19250         ** connection and used to hold state information during the
19251         ** recovery process.  This option is for debugging use only and
19252         ** is subject to change or removal at any time. */
19253         sqlite3_free(p->zStateDb);
19254         p->zStateDb = recoverMPrintf(p, "%s", (char*)pArg);
19255         break;
19256 
19257       case SQLITE_RECOVER_LOST_AND_FOUND: {
19258         const char *zArg = (const char*)pArg;
19259         sqlite3_free(p->zLostAndFound);
19260         if( zArg ){
19261           p->zLostAndFound = recoverMPrintf(p, "%s", zArg);
19262         }else{
19263           p->zLostAndFound = 0;
19264         }
19265         break;
19266       }
19267 
19268       case SQLITE_RECOVER_FREELIST_CORRUPT:
19269         p->bFreelistCorrupt = *(int*)pArg;
19270         break;
19271 
19272       case SQLITE_RECOVER_ROWIDS:
19273         p->bRecoverRowid = *(int*)pArg;
19274         break;
19275 
19276       case SQLITE_RECOVER_SLOWINDEXES:
19277         p->bSlowIndexes = *(int*)pArg;
19278         break;
19279 
19280       default:
19281         rc = SQLITE_NOTFOUND;
19282         break;
19283     }
19284   }
19285 
19286   return rc;
19287 }
19288 
19289 /*
19290 ** Do a unit of work towards the recovery job. Return SQLITE_OK if
19291 ** no error has occurred but database recovery is not finished, SQLITE_DONE
19292 ** if database recovery has been successfully completed, or an SQLite
19293 ** error code if an error has occurred.
19294 */
sqlite3_recover_step(sqlite3_recover * p)19295 int sqlite3_recover_step(sqlite3_recover *p){
19296   if( p==0 ) return SQLITE_NOMEM;
19297   if( p->errCode==SQLITE_OK ) recoverStep(p);
19298   if( p->eState==RECOVER_STATE_DONE && p->errCode==SQLITE_OK ){
19299     return SQLITE_DONE;
19300   }
19301   return p->errCode;
19302 }
19303 
19304 /*
19305 ** Do the configured recovery operation. Return SQLITE_OK if successful, or
19306 ** else an SQLite error code.
19307 */
sqlite3_recover_run(sqlite3_recover * p)19308 int sqlite3_recover_run(sqlite3_recover *p){
19309   while( SQLITE_OK==sqlite3_recover_step(p) );
19310   return sqlite3_recover_errcode(p);
19311 }
19312 
19313 
19314 /*
19315 ** Free all resources associated with the recover handle passed as the only
19316 ** argument. The results of using a handle with any sqlite3_recover_**
19317 ** API function after it has been passed to this function are undefined.
19318 **
19319 ** A copy of the value returned by the first call made to sqlite3_recover_run()
19320 ** on this handle is returned, or SQLITE_OK if sqlite3_recover_run() has
19321 ** not been called on this handle.
19322 */
sqlite3_recover_finish(sqlite3_recover * p)19323 int sqlite3_recover_finish(sqlite3_recover *p){
19324   int rc;
19325   if( p==0 ){
19326     rc = SQLITE_NOMEM;
19327   }else{
19328     recoverFinalCleanup(p);
19329     if( p->bCloseTransaction && sqlite3_get_autocommit(p->dbIn)==0 ){
19330       rc = sqlite3_exec(p->dbIn, "END", 0, 0, 0);
19331       if( p->errCode==SQLITE_OK ) p->errCode = rc;
19332     }
19333     rc = p->errCode;
19334     sqlite3_free(p->zErrMsg);
19335     sqlite3_free(p->zStateDb);
19336     sqlite3_free(p->zLostAndFound);
19337     sqlite3_free(p->pPage1Cache);
19338     sqlite3_free(p);
19339   }
19340   return rc;
19341 }
19342 
19343 #endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
19344 
19345 /************************* End ../ext/recover/sqlite3recover.c ********************/
19346 # endif /* SQLITE_HAVE_SQLITE3R */
19347 #endif
19348 #ifdef SQLITE_SHELL_EXTSRC
19349 # include SHELL_STRINGIFY(SQLITE_SHELL_EXTSRC)
19350 #endif
19351 
19352 #if defined(SQLITE_ENABLE_SESSION)
19353 /*
19354 ** State information for a single open session
19355 */
19356 typedef struct OpenSession OpenSession;
19357 struct OpenSession {
19358   char *zName;             /* Symbolic name for this session */
19359   int nFilter;             /* Number of xFilter rejection GLOB patterns */
19360   char **azFilter;         /* Array of xFilter rejection GLOB patterns */
19361   sqlite3_session *p;      /* The open session */
19362 };
19363 #endif
19364 
19365 typedef struct ExpertInfo ExpertInfo;
19366 struct ExpertInfo {
19367   sqlite3expert *pExpert;
19368   int bVerbose;
19369 };
19370 
19371 /* A single line in the EQP output */
19372 typedef struct EQPGraphRow EQPGraphRow;
19373 struct EQPGraphRow {
19374   int iEqpId;           /* ID for this row */
19375   int iParentId;        /* ID of the parent row */
19376   EQPGraphRow *pNext;   /* Next row in sequence */
19377   char zText[1];        /* Text to display for this row */
19378 };
19379 
19380 /* All EQP output is collected into an instance of the following */
19381 typedef struct EQPGraph EQPGraph;
19382 struct EQPGraph {
19383   EQPGraphRow *pRow;    /* Linked list of all rows of the EQP output */
19384   EQPGraphRow *pLast;   /* Last element of the pRow list */
19385   char zPrefix[100];    /* Graph prefix */
19386 };
19387 
19388 /* Parameters affecting columnar mode result display (defaulting together) */
19389 typedef struct ColModeOpts {
19390   int iWrap;            /* In columnar modes, wrap lines reaching this limit */
19391   u8 bQuote;            /* Quote results for .mode box and table */
19392   u8 bWordWrap;         /* In columnar modes, wrap at word boundaries  */
19393 } ColModeOpts;
19394 #define ColModeOpts_default { 60, 0, 0 }
19395 #define ColModeOpts_default_qbox { 60, 1, 0 }
19396 
19397 /*
19398 ** State information about the database connection is contained in an
19399 ** instance of the following structure.
19400 */
19401 typedef struct ShellState ShellState;
19402 struct ShellState {
19403   sqlite3 *db;           /* The database */
19404   u8 autoExplain;        /* Automatically turn on .explain mode */
19405   u8 autoEQP;            /* Run EXPLAIN QUERY PLAN prior to each SQL stmt */
19406   u8 autoEQPtest;        /* autoEQP is in test mode */
19407   u8 autoEQPtrace;       /* autoEQP is in trace mode */
19408   u8 scanstatsOn;        /* True to display scan stats before each finalize */
19409   u8 openMode;           /* SHELL_OPEN_NORMAL, _APPENDVFS, or _ZIPFILE */
19410   u8 doXdgOpen;          /* Invoke start/open/xdg-open in output_reset() */
19411   u8 nEqpLevel;          /* Depth of the EQP output graph */
19412   u8 eTraceType;         /* SHELL_TRACE_* value for type of trace */
19413   u8 bSafeMode;          /* True to prohibit unsafe operations */
19414   u8 bSafeModePersist;   /* The long-term value of bSafeMode */
19415   u8 eRestoreState;      /* See comments above doAutoDetectRestore() */
19416   ColModeOpts cmOpts;    /* Option values affecting columnar mode output */
19417   unsigned statsOn;      /* True to display memory stats before each finalize */
19418   unsigned mEqpLines;    /* Mask of vertical lines in the EQP output graph */
19419   int inputNesting;      /* Track nesting level of .read and other redirects */
19420   int outCount;          /* Revert to stdout when reaching zero */
19421   int cnt;               /* Number of records displayed so far */
19422   int lineno;            /* Line number of last line read from in */
19423   int openFlags;         /* Additional flags to open.  (SQLITE_OPEN_NOFOLLOW) */
19424   FILE *in;              /* Read commands from this stream */
19425   FILE *out;             /* Write results here */
19426   FILE *traceOut;        /* Output for sqlite3_trace() */
19427   int nErr;              /* Number of errors seen */
19428   int mode;              /* An output mode setting */
19429   int modePrior;         /* Saved mode */
19430   int cMode;             /* temporary output mode for the current query */
19431   int normalMode;        /* Output mode before ".explain on" */
19432   int writableSchema;    /* True if PRAGMA writable_schema=ON */
19433   int showHeader;        /* True to show column names in List or Column mode */
19434   int nCheck;            /* Number of ".check" commands run */
19435   unsigned nProgress;    /* Number of progress callbacks encountered */
19436   unsigned mxProgress;   /* Maximum progress callbacks before failing */
19437   unsigned flgProgress;  /* Flags for the progress callback */
19438   unsigned shellFlgs;    /* Various flags */
19439   unsigned priorShFlgs;  /* Saved copy of flags */
19440   sqlite3_int64 szMax;   /* --maxsize argument to .open */
19441   char *zDestTable;      /* Name of destination table when MODE_Insert */
19442   char *zTempFile;       /* Temporary file that might need deleting */
19443   char zTestcase[30];    /* Name of current test case */
19444   char colSeparator[20]; /* Column separator character for several modes */
19445   char rowSeparator[20]; /* Row separator character for MODE_Ascii */
19446   char colSepPrior[20];  /* Saved column separator */
19447   char rowSepPrior[20];  /* Saved row separator */
19448   int *colWidth;         /* Requested width of each column in columnar modes */
19449   int *actualWidth;      /* Actual width of each column */
19450   int nWidth;            /* Number of slots in colWidth[] and actualWidth[] */
19451   char nullValue[20];    /* The text to print when a NULL comes back from
19452                          ** the database */
19453   char outfile[FILENAME_MAX]; /* Filename for *out */
19454   sqlite3_stmt *pStmt;   /* Current statement if any. */
19455   FILE *pLog;            /* Write log output here */
19456   struct AuxDb {         /* Storage space for auxiliary database connections */
19457     sqlite3 *db;               /* Connection pointer */
19458     const char *zDbFilename;   /* Filename used to open the connection */
19459     char *zFreeOnClose;        /* Free this memory allocation on close */
19460 #if defined(SQLITE_ENABLE_SESSION)
19461     int nSession;              /* Number of active sessions */
19462     OpenSession aSession[4];   /* Array of sessions.  [0] is in focus. */
19463 #endif
19464   } aAuxDb[5],           /* Array of all database connections */
19465     *pAuxDb;             /* Currently active database connection */
19466   int *aiIndent;         /* Array of indents used in MODE_Explain */
19467   int nIndent;           /* Size of array aiIndent[] */
19468   int iIndent;           /* Index of current op in aiIndent[] */
19469   char *zNonce;          /* Nonce for temporary safe-mode escapes */
19470   EQPGraph sGraph;       /* Information for the graphical EXPLAIN QUERY PLAN */
19471   ExpertInfo expert;     /* Valid if previous command was ".expert OPT..." */
19472 #ifdef SQLITE_SHELL_FIDDLE
19473   struct {
19474     const char * zInput; /* Input string from wasm/JS proxy */
19475     const char * zPos;   /* Cursor pos into zInput */
19476     const char * zDefaultDbName; /* Default name for db file */
19477   } wasm;
19478 #endif
19479 };
19480 
19481 #ifdef SQLITE_SHELL_FIDDLE
19482 static ShellState shellState;
19483 #endif
19484 
19485 
19486 /* Allowed values for ShellState.autoEQP
19487 */
19488 #define AUTOEQP_off      0           /* Automatic EXPLAIN QUERY PLAN is off */
19489 #define AUTOEQP_on       1           /* Automatic EQP is on */
19490 #define AUTOEQP_trigger  2           /* On and also show plans for triggers */
19491 #define AUTOEQP_full     3           /* Show full EXPLAIN */
19492 
19493 /* Allowed values for ShellState.openMode
19494 */
19495 #define SHELL_OPEN_UNSPEC      0      /* No open-mode specified */
19496 #define SHELL_OPEN_NORMAL      1      /* Normal database file */
19497 #define SHELL_OPEN_APPENDVFS   2      /* Use appendvfs */
19498 #define SHELL_OPEN_ZIPFILE     3      /* Use the zipfile virtual table */
19499 #define SHELL_OPEN_READONLY    4      /* Open a normal database read-only */
19500 #define SHELL_OPEN_DESERIALIZE 5      /* Open using sqlite3_deserialize() */
19501 #define SHELL_OPEN_HEXDB       6      /* Use "dbtotxt" output as data source */
19502 
19503 /* Allowed values for ShellState.eTraceType
19504 */
19505 #define SHELL_TRACE_PLAIN      0      /* Show input SQL text */
19506 #define SHELL_TRACE_EXPANDED   1      /* Show expanded SQL text */
19507 #define SHELL_TRACE_NORMALIZED 2      /* Show normalized SQL text */
19508 
19509 /* Bits in the ShellState.flgProgress variable */
19510 #define SHELL_PROGRESS_QUIET 0x01  /* Omit announcing every progress callback */
19511 #define SHELL_PROGRESS_RESET 0x02  /* Reset the count when the progress
19512                                    ** callback limit is reached, and for each
19513                                    ** top-level SQL statement */
19514 #define SHELL_PROGRESS_ONCE  0x04  /* Cancel the --limit after firing once */
19515 
19516 /*
19517 ** These are the allowed shellFlgs values
19518 */
19519 #define SHFLG_Pagecache      0x00000001 /* The --pagecache option is used */
19520 #define SHFLG_Lookaside      0x00000002 /* Lookaside memory is used */
19521 #define SHFLG_Backslash      0x00000004 /* The --backslash option is used */
19522 #define SHFLG_PreserveRowid  0x00000008 /* .dump preserves rowid values */
19523 #define SHFLG_Newlines       0x00000010 /* .dump --newline flag */
19524 #define SHFLG_CountChanges   0x00000020 /* .changes setting */
19525 #define SHFLG_Echo           0x00000040 /* .echo on/off, or --echo setting */
19526 #define SHFLG_HeaderSet      0x00000080 /* showHeader has been specified */
19527 #define SHFLG_DumpDataOnly   0x00000100 /* .dump show data only */
19528 #define SHFLG_DumpNoSys      0x00000200 /* .dump omits system tables */
19529 #define SHFLG_TestingMode    0x00000400 /* allow unsafe testing features */
19530 
19531 /*
19532 ** Macros for testing and setting shellFlgs
19533 */
19534 #define ShellHasFlag(P,X)    (((P)->shellFlgs & (X))!=0)
19535 #define ShellSetFlag(P,X)    ((P)->shellFlgs|=(X))
19536 #define ShellClearFlag(P,X)  ((P)->shellFlgs&=(~(X)))
19537 
19538 /*
19539 ** These are the allowed modes.
19540 */
19541 #define MODE_Line     0  /* One column per line.  Blank line between records */
19542 #define MODE_Column   1  /* One record per line in neat columns */
19543 #define MODE_List     2  /* One record per line with a separator */
19544 #define MODE_Semi     3  /* Same as MODE_List but append ";" to each line */
19545 #define MODE_Html     4  /* Generate an XHTML table */
19546 #define MODE_Insert   5  /* Generate SQL "insert" statements */
19547 #define MODE_Quote    6  /* Quote values as for SQL */
19548 #define MODE_Tcl      7  /* Generate ANSI-C or TCL quoted elements */
19549 #define MODE_Csv      8  /* Quote strings, numbers are plain */
19550 #define MODE_Explain  9  /* Like MODE_Column, but do not truncate data */
19551 #define MODE_Ascii   10  /* Use ASCII unit and record separators (0x1F/0x1E) */
19552 #define MODE_Pretty  11  /* Pretty-print schemas */
19553 #define MODE_EQP     12  /* Converts EXPLAIN QUERY PLAN output into a graph */
19554 #define MODE_Json    13  /* Output JSON */
19555 #define MODE_Markdown 14 /* Markdown formatting */
19556 #define MODE_Table   15  /* MySQL-style table formatting */
19557 #define MODE_Box     16  /* Unicode box-drawing characters */
19558 #define MODE_Count   17  /* Output only a count of the rows of output */
19559 #define MODE_Off     18  /* No query output shown */
19560 #define MODE_ScanExp 19  /* Like MODE_Explain, but for ".scanstats vm" */
19561 
19562 static const char *modeDescr[] = {
19563   "line",
19564   "column",
19565   "list",
19566   "semi",
19567   "html",
19568   "insert",
19569   "quote",
19570   "tcl",
19571   "csv",
19572   "explain",
19573   "ascii",
19574   "prettyprint",
19575   "eqp",
19576   "json",
19577   "markdown",
19578   "table",
19579   "box",
19580   "count",
19581   "off"
19582 };
19583 
19584 /*
19585 ** These are the column/row/line separators used by the various
19586 ** import/export modes.
19587 */
19588 #define SEP_Column    "|"
19589 #define SEP_Row       "\n"
19590 #define SEP_Tab       "\t"
19591 #define SEP_Space     " "
19592 #define SEP_Comma     ","
19593 #define SEP_CrLf      "\r\n"
19594 #define SEP_Unit      "\x1F"
19595 #define SEP_Record    "\x1E"
19596 
19597 /*
19598 ** Limit input nesting via .read or any other input redirect.
19599 ** It's not too expensive, so a generous allowance can be made.
19600 */
19601 #define MAX_INPUT_NESTING 25
19602 
19603 /*
19604 ** A callback for the sqlite3_log() interface.
19605 */
shellLog(void * pArg,int iErrCode,const char * zMsg)19606 static void shellLog(void *pArg, int iErrCode, const char *zMsg){
19607   ShellState *p = (ShellState*)pArg;
19608   if( p->pLog==0 ) return;
19609   sputf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
19610   fflush(p->pLog);
19611 }
19612 
19613 /*
19614 ** SQL function:  shell_putsnl(X)
19615 **
19616 ** Write the text X to the screen (or whatever output is being directed)
19617 ** adding a newline at the end, and then return X.
19618 */
shellPutsFunc(sqlite3_context * pCtx,int nVal,sqlite3_value ** apVal)19619 static void shellPutsFunc(
19620   sqlite3_context *pCtx,
19621   int nVal,
19622   sqlite3_value **apVal
19623 ){
19624   /* Unused: (ShellState*)sqlite3_user_data(pCtx); */
19625   (void)nVal;
19626   oputf("%s\n", sqlite3_value_text(apVal[0]));
19627   sqlite3_result_value(pCtx, apVal[0]);
19628 }
19629 
19630 /*
19631 ** If in safe mode, print an error message described by the arguments
19632 ** and exit immediately.
19633 */
failIfSafeMode(ShellState * p,const char * zErrMsg,...)19634 static void failIfSafeMode(
19635   ShellState *p,
19636   const char *zErrMsg,
19637   ...
19638 ){
19639   if( p->bSafeMode ){
19640     va_list ap;
19641     char *zMsg;
19642     va_start(ap, zErrMsg);
19643     zMsg = sqlite3_vmprintf(zErrMsg, ap);
19644     va_end(ap);
19645     eputf("line %d: %s\n", p->lineno, zMsg);
19646     exit(1);
19647   }
19648 }
19649 
19650 /*
19651 ** SQL function:   edit(VALUE)
19652 **                 edit(VALUE,EDITOR)
19653 **
19654 ** These steps:
19655 **
19656 **     (1) Write VALUE into a temporary file.
19657 **     (2) Run program EDITOR on that temporary file.
19658 **     (3) Read the temporary file back and return its content as the result.
19659 **     (4) Delete the temporary file
19660 **
19661 ** If the EDITOR argument is omitted, use the value in the VISUAL
19662 ** environment variable.  If still there is no EDITOR, through an error.
19663 **
19664 ** Also throw an error if the EDITOR program returns a non-zero exit code.
19665 */
19666 #ifndef SQLITE_NOHAVE_SYSTEM
editFunc(sqlite3_context * context,int argc,sqlite3_value ** argv)19667 static void editFunc(
19668   sqlite3_context *context,
19669   int argc,
19670   sqlite3_value **argv
19671 ){
19672   const char *zEditor;
19673   char *zTempFile = 0;
19674   sqlite3 *db;
19675   char *zCmd = 0;
19676   int bBin;
19677   int rc;
19678   int hasCRNL = 0;
19679   FILE *f = 0;
19680   sqlite3_int64 sz;
19681   sqlite3_int64 x;
19682   unsigned char *p = 0;
19683 
19684   if( argc==2 ){
19685     zEditor = (const char*)sqlite3_value_text(argv[1]);
19686   }else{
19687     zEditor = getenv("VISUAL");
19688   }
19689   if( zEditor==0 ){
19690     sqlite3_result_error(context, "no editor for edit()", -1);
19691     return;
19692   }
19693   if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
19694     sqlite3_result_error(context, "NULL input to edit()", -1);
19695     return;
19696   }
19697   db = sqlite3_context_db_handle(context);
19698   zTempFile = 0;
19699   sqlite3_file_control(db, 0, SQLITE_FCNTL_TEMPFILENAME, &zTempFile);
19700   if( zTempFile==0 ){
19701     sqlite3_uint64 r = 0;
19702     sqlite3_randomness(sizeof(r), &r);
19703     zTempFile = sqlite3_mprintf("temp%llx", r);
19704     if( zTempFile==0 ){
19705       sqlite3_result_error_nomem(context);
19706       return;
19707     }
19708   }
19709   bBin = sqlite3_value_type(argv[0])==SQLITE_BLOB;
19710   /* When writing the file to be edited, do \n to \r\n conversions on systems
19711   ** that want \r\n line endings */
19712   f = fopen(zTempFile, bBin ? "wb" : "w");
19713   if( f==0 ){
19714     sqlite3_result_error(context, "edit() cannot open temp file", -1);
19715     goto edit_func_end;
19716   }
19717   sz = sqlite3_value_bytes(argv[0]);
19718   if( bBin ){
19719     x = fwrite(sqlite3_value_blob(argv[0]), 1, (size_t)sz, f);
19720   }else{
19721     const char *z = (const char*)sqlite3_value_text(argv[0]);
19722     /* Remember whether or not the value originally contained \r\n */
19723     if( z && strstr(z,"\r\n")!=0 ) hasCRNL = 1;
19724     x = fwrite(sqlite3_value_text(argv[0]), 1, (size_t)sz, f);
19725   }
19726   fclose(f);
19727   f = 0;
19728   if( x!=sz ){
19729     sqlite3_result_error(context, "edit() could not write the whole file", -1);
19730     goto edit_func_end;
19731   }
19732   zCmd = sqlite3_mprintf("%s \"%s\"", zEditor, zTempFile);
19733   if( zCmd==0 ){
19734     sqlite3_result_error_nomem(context);
19735     goto edit_func_end;
19736   }
19737   rc = system(zCmd);
19738   sqlite3_free(zCmd);
19739   if( rc ){
19740     sqlite3_result_error(context, "EDITOR returned non-zero", -1);
19741     goto edit_func_end;
19742   }
19743   f = fopen(zTempFile, "rb");
19744   if( f==0 ){
19745     sqlite3_result_error(context,
19746       "edit() cannot reopen temp file after edit", -1);
19747     goto edit_func_end;
19748   }
19749   fseek(f, 0, SEEK_END);
19750   sz = ftell(f);
19751   rewind(f);
19752   p = sqlite3_malloc64( sz+1 );
19753   if( p==0 ){
19754     sqlite3_result_error_nomem(context);
19755     goto edit_func_end;
19756   }
19757   x = fread(p, 1, (size_t)sz, f);
19758   fclose(f);
19759   f = 0;
19760   if( x!=sz ){
19761     sqlite3_result_error(context, "could not read back the whole file", -1);
19762     goto edit_func_end;
19763   }
19764   if( bBin ){
19765     sqlite3_result_blob64(context, p, sz, sqlite3_free);
19766   }else{
19767     sqlite3_int64 i, j;
19768     if( hasCRNL ){
19769       /* If the original contains \r\n then do no conversions back to \n */
19770     }else{
19771       /* If the file did not originally contain \r\n then convert any new
19772       ** \r\n back into \n */
19773       p[sz] = 0;
19774       for(i=j=0; i<sz; i++){
19775         if( p[i]=='\r' && p[i+1]=='\n' ) i++;
19776         p[j++] = p[i];
19777       }
19778       sz = j;
19779       p[sz] = 0;
19780     }
19781     sqlite3_result_text64(context, (const char*)p, sz,
19782                           sqlite3_free, SQLITE_UTF8);
19783   }
19784   p = 0;
19785 
19786 edit_func_end:
19787   if( f ) fclose(f);
19788   unlink(zTempFile);
19789   sqlite3_free(zTempFile);
19790   sqlite3_free(p);
19791 }
19792 #endif /* SQLITE_NOHAVE_SYSTEM */
19793 
19794 /*
19795 ** Save or restore the current output mode
19796 */
outputModePush(ShellState * p)19797 static void outputModePush(ShellState *p){
19798   p->modePrior = p->mode;
19799   p->priorShFlgs = p->shellFlgs;
19800   memcpy(p->colSepPrior, p->colSeparator, sizeof(p->colSeparator));
19801   memcpy(p->rowSepPrior, p->rowSeparator, sizeof(p->rowSeparator));
19802 }
outputModePop(ShellState * p)19803 static void outputModePop(ShellState *p){
19804   p->mode = p->modePrior;
19805   p->shellFlgs = p->priorShFlgs;
19806   memcpy(p->colSeparator, p->colSepPrior, sizeof(p->colSeparator));
19807   memcpy(p->rowSeparator, p->rowSepPrior, sizeof(p->rowSeparator));
19808 }
19809 
19810 /*
19811 ** Output the given string as a hex-encoded blob (eg. X'1234' )
19812 */
output_hex_blob(const void * pBlob,int nBlob)19813 static void output_hex_blob(const void *pBlob, int nBlob){
19814   int i;
19815   unsigned char *aBlob = (unsigned char*)pBlob;
19816 
19817   char *zStr = sqlite3_malloc(nBlob*2 + 1);
19818   shell_check_oom(zStr);
19819 
19820   for(i=0; i<nBlob; i++){
19821     static const char aHex[] = {
19822         '0', '1', '2', '3', '4', '5', '6', '7',
19823         '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
19824     };
19825     zStr[i*2] = aHex[ (aBlob[i] >> 4) ];
19826     zStr[i*2+1] = aHex[ (aBlob[i] & 0x0F) ];
19827   }
19828   zStr[i*2] = '\0';
19829 
19830   oputf("X'%s'", zStr);
19831   sqlite3_free(zStr);
19832 }
19833 
19834 /*
19835 ** Find a string that is not found anywhere in z[].  Return a pointer
19836 ** to that string.
19837 **
19838 ** Try to use zA and zB first.  If both of those are already found in z[]
19839 ** then make up some string and store it in the buffer zBuf.
19840 */
unused_string(const char * z,const char * zA,const char * zB,char * zBuf)19841 static const char *unused_string(
19842   const char *z,                    /* Result must not appear anywhere in z */
19843   const char *zA, const char *zB,   /* Try these first */
19844   char *zBuf                        /* Space to store a generated string */
19845 ){
19846   unsigned i = 0;
19847   if( strstr(z, zA)==0 ) return zA;
19848   if( strstr(z, zB)==0 ) return zB;
19849   do{
19850     sqlite3_snprintf(20,zBuf,"(%s%u)", zA, i++);
19851   }while( strstr(z,zBuf)!=0 );
19852   return zBuf;
19853 }
19854 
19855 /*
19856 ** Output the given string as a quoted string using SQL quoting conventions.
19857 **
19858 ** See also: output_quoted_escaped_string()
19859 */
output_quoted_string(const char * z)19860 static void output_quoted_string(const char *z){
19861   int i;
19862   char c;
19863 #ifndef SQLITE_SHELL_FIDDLE
19864   FILE *pfO = setOutputStream(invalidFileStream);
19865   setBinaryMode(pfO, 1);
19866 #endif
19867   if( z==0 ) return;
19868   for(i=0; (c = z[i])!=0 && c!='\''; i++){}
19869   if( c==0 ){
19870     oputf("'%s'",z);
19871   }else{
19872     oputz("'");
19873     while( *z ){
19874       for(i=0; (c = z[i])!=0 && c!='\''; i++){}
19875       if( c=='\'' ) i++;
19876       if( i ){
19877         oputf("%.*s", i, z);
19878         z += i;
19879       }
19880       if( c=='\'' ){
19881         oputz("'");
19882         continue;
19883       }
19884       if( c==0 ){
19885         break;
19886       }
19887       z++;
19888     }
19889     oputz("'");
19890   }
19891 #ifndef SQLITE_SHELL_FIDDLE
19892   setTextMode(pfO, 1);
19893 #else
19894   setTextMode(stdout, 1);
19895 #endif
19896 }
19897 
19898 /*
19899 ** Output the given string as a quoted string using SQL quoting conventions.
19900 ** Additionallly , escape the "\n" and "\r" characters so that they do not
19901 ** get corrupted by end-of-line translation facilities in some operating
19902 ** systems.
19903 **
19904 ** This is like output_quoted_string() but with the addition of the \r\n
19905 ** escape mechanism.
19906 */
output_quoted_escaped_string(const char * z)19907 static void output_quoted_escaped_string(const char *z){
19908   int i;
19909   char c;
19910 #ifndef SQLITE_SHELL_FIDDLE
19911   FILE *pfO = setOutputStream(invalidFileStream);
19912   setBinaryMode(pfO, 1);
19913 #endif
19914   for(i=0; (c = z[i])!=0 && c!='\'' && c!='\n' && c!='\r'; i++){}
19915   if( c==0 ){
19916     oputf("'%s'",z);
19917   }else{
19918     const char *zNL = 0;
19919     const char *zCR = 0;
19920     int nNL = 0;
19921     int nCR = 0;
19922     char zBuf1[20], zBuf2[20];
19923     for(i=0; z[i]; i++){
19924       if( z[i]=='\n' ) nNL++;
19925       if( z[i]=='\r' ) nCR++;
19926     }
19927     if( nNL ){
19928       oputz("replace(");
19929       zNL = unused_string(z, "\\n", "\\012", zBuf1);
19930     }
19931     if( nCR ){
19932       oputz("replace(");
19933       zCR = unused_string(z, "\\r", "\\015", zBuf2);
19934     }
19935     oputz("'");
19936     while( *z ){
19937       for(i=0; (c = z[i])!=0 && c!='\n' && c!='\r' && c!='\''; i++){}
19938       if( c=='\'' ) i++;
19939       if( i ){
19940         oputf("%.*s", i, z);
19941         z += i;
19942       }
19943       if( c=='\'' ){
19944         oputz("'");
19945         continue;
19946       }
19947       if( c==0 ){
19948         break;
19949       }
19950       z++;
19951       if( c=='\n' ){
19952         oputz(zNL);
19953         continue;
19954       }
19955       oputz(zCR);
19956     }
19957     oputz("'");
19958     if( nCR ){
19959       oputf(",'%s',char(13))", zCR);
19960     }
19961     if( nNL ){
19962       oputf(",'%s',char(10))", zNL);
19963     }
19964   }
19965 #ifndef SQLITE_SHELL_FIDDLE
19966   setTextMode(pfO, 1);
19967 #else
19968   setTextMode(stdout, 1);
19969 #endif
19970 }
19971 
19972 /*
19973 ** Find earliest of chars within s specified in zAny.
19974 ** With ns == ~0, is like strpbrk(s,zAny) and s must be 0-terminated.
19975 */
anyOfInStr(const char * s,const char * zAny,size_t ns)19976 static const char *anyOfInStr(const char *s, const char *zAny, size_t ns){
19977   const char *pcFirst = 0;
19978   if( ns == ~(size_t)0 ) ns = strlen(s);
19979   while(*zAny){
19980     const char *pc = (const char*)memchr(s, *zAny&0xff, ns);
19981     if( pc ){
19982       pcFirst = pc;
19983       ns = pcFirst - s;
19984     }
19985     ++zAny;
19986   }
19987   return pcFirst;
19988 }
19989 /*
19990 ** Output the given string as a quoted according to C or TCL quoting rules.
19991 */
output_c_string(const char * z)19992 static void output_c_string(const char *z){
19993   char c;
19994   static const char *zq = "\"";
19995   static long ctrlMask = ~0L;
19996   static const char *zDQBSRO = "\"\\\x7f"; /* double-quote, backslash, rubout */
19997   char ace[3] = "\\?";
19998   char cbsSay;
19999   oputz(zq);
20000   while( *z!=0 ){
20001     const char *pcDQBSRO = anyOfInStr(z, zDQBSRO, ~(size_t)0);
20002     const char *pcPast = zSkipValidUtf8(z, INT_MAX, ctrlMask);
20003     const char *pcEnd = (pcDQBSRO && pcDQBSRO < pcPast)? pcDQBSRO : pcPast;
20004     if( pcEnd > z ) oputb(z, (int)(pcEnd-z));
20005     if( (c = *pcEnd)==0 ) break;
20006     ++pcEnd;
20007     switch( c ){
20008     case '\\': case '"':
20009       cbsSay = (char)c;
20010       break;
20011     case '\t': cbsSay = 't'; break;
20012     case '\n': cbsSay = 'n'; break;
20013     case '\r': cbsSay = 'r'; break;
20014     case '\f': cbsSay = 'f'; break;
20015     default: cbsSay = 0; break;
20016     }
20017     if( cbsSay ){
20018       ace[1] = cbsSay;
20019       oputz(ace);
20020     }else if( !isprint(c&0xff) ){
20021       oputf("\\%03o", c&0xff);
20022     }else{
20023       ace[1] = (char)c;
20024       oputz(ace+1);
20025     }
20026     z = pcEnd;
20027   }
20028   oputz(zq);
20029 }
20030 
20031 /*
20032 ** Output the given string as a quoted according to JSON quoting rules.
20033 */
output_json_string(const char * z,i64 n)20034 static void output_json_string(const char *z, i64 n){
20035   char c;
20036   static const char *zq = "\"";
20037   static long ctrlMask = ~0L;
20038   static const char *zDQBS = "\"\\";
20039   const char *pcLimit;
20040   char ace[3] = "\\?";
20041   char cbsSay;
20042 
20043   if( z==0 ) z = "";
20044   pcLimit = z + ((n<0)? strlen(z) : (size_t)n);
20045   oputz(zq);
20046   while( z < pcLimit ){
20047     const char *pcDQBS = anyOfInStr(z, zDQBS, pcLimit-z);
20048     const char *pcPast = zSkipValidUtf8(z, (int)(pcLimit-z), ctrlMask);
20049     const char *pcEnd = (pcDQBS && pcDQBS < pcPast)? pcDQBS : pcPast;
20050     if( pcEnd > z ){
20051       oputb(z, (int)(pcEnd-z));
20052       z = pcEnd;
20053     }
20054     if( z >= pcLimit ) break;
20055     c = *(z++);
20056     switch( c ){
20057     case '"': case '\\':
20058       cbsSay = (char)c;
20059       break;
20060     case '\b': cbsSay = 'b'; break;
20061     case '\f': cbsSay = 'f'; break;
20062     case '\n': cbsSay = 'n'; break;
20063     case '\r': cbsSay = 'r'; break;
20064     case '\t': cbsSay = 't'; break;
20065     default: cbsSay = 0; break;
20066     }
20067     if( cbsSay ){
20068       ace[1] = cbsSay;
20069       oputz(ace);
20070     }else if( c<=0x1f ){
20071       oputf("u%04x", c);
20072     }else{
20073       ace[1] = (char)c;
20074       oputz(ace+1);
20075     }
20076   }
20077   oputz(zq);
20078 }
20079 
20080 /*
20081 ** Output the given string with characters that are special to
20082 ** HTML escaped.
20083 */
output_html_string(const char * z)20084 static void output_html_string(const char *z){
20085   int i;
20086   if( z==0 ) z = "";
20087   while( *z ){
20088     for(i=0;   z[i]
20089             && z[i]!='<'
20090             && z[i]!='&'
20091             && z[i]!='>'
20092             && z[i]!='\"'
20093             && z[i]!='\'';
20094         i++){}
20095     if( i>0 ){
20096       oputf("%.*s",i,z);
20097     }
20098     if( z[i]=='<' ){
20099       oputz("&lt;");
20100     }else if( z[i]=='&' ){
20101       oputz("&amp;");
20102     }else if( z[i]=='>' ){
20103       oputz("&gt;");
20104     }else if( z[i]=='\"' ){
20105       oputz("&quot;");
20106     }else if( z[i]=='\'' ){
20107       oputz("&#39;");
20108     }else{
20109       break;
20110     }
20111     z += i + 1;
20112   }
20113 }
20114 
20115 /*
20116 ** If a field contains any character identified by a 1 in the following
20117 ** array, then the string must be quoted for CSV.
20118 */
20119 static const char needCsvQuote[] = {
20120   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
20121   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
20122   1, 0, 1, 0, 0, 0, 0, 1,   0, 0, 0, 0, 0, 0, 0, 0,
20123   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
20124   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
20125   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
20126   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
20127   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 1,
20128   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
20129   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
20130   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
20131   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
20132   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
20133   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
20134   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
20135   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
20136 };
20137 
20138 /*
20139 ** Output a single term of CSV.  Actually, p->colSeparator is used for
20140 ** the separator, which may or may not be a comma.  p->nullValue is
20141 ** the null value.  Strings are quoted if necessary.  The separator
20142 ** is only issued if bSep is true.
20143 */
output_csv(ShellState * p,const char * z,int bSep)20144 static void output_csv(ShellState *p, const char *z, int bSep){
20145   if( z==0 ){
20146     oputf("%s",p->nullValue);
20147   }else{
20148     unsigned i;
20149     for(i=0; z[i]; i++){
20150       if( needCsvQuote[((unsigned char*)z)[i]] ){
20151         i = 0;
20152         break;
20153       }
20154     }
20155     if( i==0 || strstr(z, p->colSeparator)!=0 ){
20156       char *zQuoted = sqlite3_mprintf("\"%w\"", z);
20157       shell_check_oom(zQuoted);
20158       oputz(zQuoted);
20159       sqlite3_free(zQuoted);
20160     }else{
20161       oputz(z);
20162     }
20163   }
20164   if( bSep ){
20165     oputz(p->colSeparator);
20166   }
20167 }
20168 
20169 /*
20170 ** This routine runs when the user presses Ctrl-C
20171 */
interrupt_handler(int NotUsed)20172 static void interrupt_handler(int NotUsed){
20173   UNUSED_PARAMETER(NotUsed);
20174   if( ++seenInterrupt>1 ) exit(1);
20175   if( globalDb ) sqlite3_interrupt(globalDb);
20176 }
20177 
20178 #if (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE)
20179 /*
20180 ** This routine runs for console events (e.g. Ctrl-C) on Win32
20181 */
ConsoleCtrlHandler(DWORD dwCtrlType)20182 static BOOL WINAPI ConsoleCtrlHandler(
20183   DWORD dwCtrlType /* One of the CTRL_*_EVENT constants */
20184 ){
20185   if( dwCtrlType==CTRL_C_EVENT ){
20186     interrupt_handler(0);
20187     return TRUE;
20188   }
20189   return FALSE;
20190 }
20191 #endif
20192 
20193 #ifndef SQLITE_OMIT_AUTHORIZATION
20194 /*
20195 ** This authorizer runs in safe mode.
20196 */
safeModeAuth(void * pClientData,int op,const char * zA1,const char * zA2,const char * zA3,const char * zA4)20197 static int safeModeAuth(
20198   void *pClientData,
20199   int op,
20200   const char *zA1,
20201   const char *zA2,
20202   const char *zA3,
20203   const char *zA4
20204 ){
20205   ShellState *p = (ShellState*)pClientData;
20206   static const char *azProhibitedFunctions[] = {
20207     "edit",
20208     "fts3_tokenizer",
20209     "load_extension",
20210     "readfile",
20211     "writefile",
20212     "zipfile",
20213     "zipfile_cds",
20214   };
20215   UNUSED_PARAMETER(zA1);
20216   UNUSED_PARAMETER(zA3);
20217   UNUSED_PARAMETER(zA4);
20218   switch( op ){
20219     case SQLITE_ATTACH: {
20220 #ifndef SQLITE_SHELL_FIDDLE
20221       /* In WASM builds the filesystem is a virtual sandbox, so
20222       ** there's no harm in using ATTACH. */
20223       failIfSafeMode(p, "cannot run ATTACH in safe mode");
20224 #endif
20225       break;
20226     }
20227     case SQLITE_FUNCTION: {
20228       int i;
20229       for(i=0; i<ArraySize(azProhibitedFunctions); i++){
20230         if( sqlite3_stricmp(zA2, azProhibitedFunctions[i])==0 ){
20231           failIfSafeMode(p, "cannot use the %s() function in safe mode",
20232                          azProhibitedFunctions[i]);
20233         }
20234       }
20235       break;
20236     }
20237   }
20238   return SQLITE_OK;
20239 }
20240 
20241 /*
20242 ** When the ".auth ON" is set, the following authorizer callback is
20243 ** invoked.  It always returns SQLITE_OK.
20244 */
shellAuth(void * pClientData,int op,const char * zA1,const char * zA2,const char * zA3,const char * zA4)20245 static int shellAuth(
20246   void *pClientData,
20247   int op,
20248   const char *zA1,
20249   const char *zA2,
20250   const char *zA3,
20251   const char *zA4
20252 ){
20253   ShellState *p = (ShellState*)pClientData;
20254   static const char *azAction[] = { 0,
20255      "CREATE_INDEX",         "CREATE_TABLE",         "CREATE_TEMP_INDEX",
20256      "CREATE_TEMP_TABLE",    "CREATE_TEMP_TRIGGER",  "CREATE_TEMP_VIEW",
20257      "CREATE_TRIGGER",       "CREATE_VIEW",          "DELETE",
20258      "DROP_INDEX",           "DROP_TABLE",           "DROP_TEMP_INDEX",
20259      "DROP_TEMP_TABLE",      "DROP_TEMP_TRIGGER",    "DROP_TEMP_VIEW",
20260      "DROP_TRIGGER",         "DROP_VIEW",            "INSERT",
20261      "PRAGMA",               "READ",                 "SELECT",
20262      "TRANSACTION",          "UPDATE",               "ATTACH",
20263      "DETACH",               "ALTER_TABLE",          "REINDEX",
20264      "ANALYZE",              "CREATE_VTABLE",        "DROP_VTABLE",
20265      "FUNCTION",             "SAVEPOINT",            "RECURSIVE"
20266   };
20267   int i;
20268   const char *az[4];
20269   az[0] = zA1;
20270   az[1] = zA2;
20271   az[2] = zA3;
20272   az[3] = zA4;
20273   oputf("authorizer: %s", azAction[op]);
20274   for(i=0; i<4; i++){
20275     oputz(" ");
20276     if( az[i] ){
20277       output_c_string(az[i]);
20278     }else{
20279       oputz("NULL");
20280     }
20281   }
20282   oputz("\n");
20283   if( p->bSafeMode ) (void)safeModeAuth(pClientData, op, zA1, zA2, zA3, zA4);
20284   return SQLITE_OK;
20285 }
20286 #endif
20287 
20288 /*
20289 ** Print a schema statement.  Part of MODE_Semi and MODE_Pretty output.
20290 **
20291 ** This routine converts some CREATE TABLE statements for shadow tables
20292 ** in FTS3/4/5 into CREATE TABLE IF NOT EXISTS statements.
20293 **
20294 ** If the schema statement in z[] contains a start-of-comment and if
20295 ** sqlite3_complete() returns false, try to terminate the comment before
20296 ** printing the result.  https://sqlite.org/forum/forumpost/d7be961c5c
20297 */
printSchemaLine(const char * z,const char * zTail)20298 static void printSchemaLine(const char *z, const char *zTail){
20299   char *zToFree = 0;
20300   if( z==0 ) return;
20301   if( zTail==0 ) return;
20302   if( zTail[0]==';' && (strstr(z, "/*")!=0 || strstr(z,"--")!=0) ){
20303     const char *zOrig = z;
20304     static const char *azTerm[] = { "", "*/", "\n" };
20305     int i;
20306     for(i=0; i<ArraySize(azTerm); i++){
20307       char *zNew = sqlite3_mprintf("%s%s;", zOrig, azTerm[i]);
20308       shell_check_oom(zNew);
20309       if( sqlite3_complete(zNew) ){
20310         size_t n = strlen(zNew);
20311         zNew[n-1] = 0;
20312         zToFree = zNew;
20313         z = zNew;
20314         break;
20315       }
20316       sqlite3_free(zNew);
20317     }
20318   }
20319   if( sqlite3_strglob("CREATE TABLE ['\"]*", z)==0 ){
20320     oputf("CREATE TABLE IF NOT EXISTS %s%s", z+13, zTail);
20321   }else{
20322     oputf("%s%s", z, zTail);
20323   }
20324   sqlite3_free(zToFree);
20325 }
printSchemaLineN(char * z,int n,const char * zTail)20326 static void printSchemaLineN(char *z, int n, const char *zTail){
20327   char c = z[n];
20328   z[n] = 0;
20329   printSchemaLine(z, zTail);
20330   z[n] = c;
20331 }
20332 
20333 /*
20334 ** Return true if string z[] has nothing but whitespace and comments to the
20335 ** end of the first line.
20336 */
wsToEol(const char * z)20337 static int wsToEol(const char *z){
20338   int i;
20339   for(i=0; z[i]; i++){
20340     if( z[i]=='\n' ) return 1;
20341     if( IsSpace(z[i]) ) continue;
20342     if( z[i]=='-' && z[i+1]=='-' ) return 1;
20343     return 0;
20344   }
20345   return 1;
20346 }
20347 
20348 /*
20349 ** Add a new entry to the EXPLAIN QUERY PLAN data
20350 */
eqp_append(ShellState * p,int iEqpId,int p2,const char * zText)20351 static void eqp_append(ShellState *p, int iEqpId, int p2, const char *zText){
20352   EQPGraphRow *pNew;
20353   i64 nText;
20354   if( zText==0 ) return;
20355   nText = strlen(zText);
20356   if( p->autoEQPtest ){
20357     oputf("%d,%d,%s\n", iEqpId, p2, zText);
20358   }
20359   pNew = sqlite3_malloc64( sizeof(*pNew) + nText );
20360   shell_check_oom(pNew);
20361   pNew->iEqpId = iEqpId;
20362   pNew->iParentId = p2;
20363   memcpy(pNew->zText, zText, nText+1);
20364   pNew->pNext = 0;
20365   if( p->sGraph.pLast ){
20366     p->sGraph.pLast->pNext = pNew;
20367   }else{
20368     p->sGraph.pRow = pNew;
20369   }
20370   p->sGraph.pLast = pNew;
20371 }
20372 
20373 /*
20374 ** Free and reset the EXPLAIN QUERY PLAN data that has been collected
20375 ** in p->sGraph.
20376 */
eqp_reset(ShellState * p)20377 static void eqp_reset(ShellState *p){
20378   EQPGraphRow *pRow, *pNext;
20379   for(pRow = p->sGraph.pRow; pRow; pRow = pNext){
20380     pNext = pRow->pNext;
20381     sqlite3_free(pRow);
20382   }
20383   memset(&p->sGraph, 0, sizeof(p->sGraph));
20384 }
20385 
20386 /* Return the next EXPLAIN QUERY PLAN line with iEqpId that occurs after
20387 ** pOld, or return the first such line if pOld is NULL
20388 */
eqp_next_row(ShellState * p,int iEqpId,EQPGraphRow * pOld)20389 static EQPGraphRow *eqp_next_row(ShellState *p, int iEqpId, EQPGraphRow *pOld){
20390   EQPGraphRow *pRow = pOld ? pOld->pNext : p->sGraph.pRow;
20391   while( pRow && pRow->iParentId!=iEqpId ) pRow = pRow->pNext;
20392   return pRow;
20393 }
20394 
20395 /* Render a single level of the graph that has iEqpId as its parent.  Called
20396 ** recursively to render sublevels.
20397 */
eqp_render_level(ShellState * p,int iEqpId)20398 static void eqp_render_level(ShellState *p, int iEqpId){
20399   EQPGraphRow *pRow, *pNext;
20400   i64 n = strlen(p->sGraph.zPrefix);
20401   char *z;
20402   for(pRow = eqp_next_row(p, iEqpId, 0); pRow; pRow = pNext){
20403     pNext = eqp_next_row(p, iEqpId, pRow);
20404     z = pRow->zText;
20405     oputf("%s%s%s\n", p->sGraph.zPrefix, pNext ? "|--" : "`--", z);
20406     if( n<(i64)sizeof(p->sGraph.zPrefix)-7 ){
20407       memcpy(&p->sGraph.zPrefix[n], pNext ? "|  " : "   ", 4);
20408       eqp_render_level(p, pRow->iEqpId);
20409       p->sGraph.zPrefix[n] = 0;
20410     }
20411   }
20412 }
20413 
20414 /*
20415 ** Display and reset the EXPLAIN QUERY PLAN data
20416 */
eqp_render(ShellState * p,i64 nCycle)20417 static void eqp_render(ShellState *p, i64 nCycle){
20418   EQPGraphRow *pRow = p->sGraph.pRow;
20419   if( pRow ){
20420     if( pRow->zText[0]=='-' ){
20421       if( pRow->pNext==0 ){
20422         eqp_reset(p);
20423         return;
20424       }
20425       oputf("%s\n", pRow->zText+3);
20426       p->sGraph.pRow = pRow->pNext;
20427       sqlite3_free(pRow);
20428     }else if( nCycle>0 ){
20429       oputf("QUERY PLAN (cycles=%lld [100%%])\n", nCycle);
20430     }else{
20431       oputz("QUERY PLAN\n");
20432     }
20433     p->sGraph.zPrefix[0] = 0;
20434     eqp_render_level(p, 0);
20435     eqp_reset(p);
20436   }
20437 }
20438 
20439 #ifndef SQLITE_OMIT_PROGRESS_CALLBACK
20440 /*
20441 ** Progress handler callback.
20442 */
progress_handler(void * pClientData)20443 static int progress_handler(void *pClientData) {
20444   ShellState *p = (ShellState*)pClientData;
20445   p->nProgress++;
20446   if( p->nProgress>=p->mxProgress && p->mxProgress>0 ){
20447     oputf("Progress limit reached (%u)\n", p->nProgress);
20448     if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0;
20449     if( p->flgProgress & SHELL_PROGRESS_ONCE ) p->mxProgress = 0;
20450     return 1;
20451   }
20452   if( (p->flgProgress & SHELL_PROGRESS_QUIET)==0 ){
20453     oputf("Progress %u\n", p->nProgress);
20454   }
20455   return 0;
20456 }
20457 #endif /* SQLITE_OMIT_PROGRESS_CALLBACK */
20458 
20459 /*
20460 ** Print N dashes
20461 */
print_dashes(int N)20462 static void print_dashes(int N){
20463   const char zDash[] = "--------------------------------------------------";
20464   const int nDash = sizeof(zDash) - 1;
20465   while( N>nDash ){
20466     oputz(zDash);
20467     N -= nDash;
20468   }
20469   oputf("%.*s", N, zDash);
20470 }
20471 
20472 /*
20473 ** Print a markdown or table-style row separator using ascii-art
20474 */
print_row_separator(ShellState * p,int nArg,const char * zSep)20475 static void print_row_separator(
20476   ShellState *p,
20477   int nArg,
20478   const char *zSep
20479 ){
20480   int i;
20481   if( nArg>0 ){
20482     oputz(zSep);
20483     print_dashes(p->actualWidth[0]+2);
20484     for(i=1; i<nArg; i++){
20485       oputz(zSep);
20486       print_dashes(p->actualWidth[i]+2);
20487     }
20488     oputz(zSep);
20489   }
20490   oputz("\n");
20491 }
20492 
20493 /*
20494 ** This is the callback routine that the shell
20495 ** invokes for each row of a query result.
20496 */
shell_callback(void * pArg,int nArg,char ** azArg,char ** azCol,int * aiType)20497 static int shell_callback(
20498   void *pArg,
20499   int nArg,        /* Number of result columns */
20500   char **azArg,    /* Text of each result column */
20501   char **azCol,    /* Column names */
20502   int *aiType      /* Column types.  Might be NULL */
20503 ){
20504   int i;
20505   ShellState *p = (ShellState*)pArg;
20506 
20507   if( azArg==0 ) return 0;
20508   switch( p->cMode ){
20509     case MODE_Count:
20510     case MODE_Off: {
20511       break;
20512     }
20513     case MODE_Line: {
20514       int w = 5;
20515       if( azArg==0 ) break;
20516       for(i=0; i<nArg; i++){
20517         int len = strlen30(azCol[i] ? azCol[i] : "");
20518         if( len>w ) w = len;
20519       }
20520       if( p->cnt++>0 ) oputz(p->rowSeparator);
20521       for(i=0; i<nArg; i++){
20522         oputf("%*s = %s%s", w, azCol[i],
20523               azArg[i] ? azArg[i] : p->nullValue, p->rowSeparator);
20524       }
20525       break;
20526     }
20527     case MODE_ScanExp:
20528     case MODE_Explain: {
20529       static const int aExplainWidth[] = {4,       13, 4, 4, 4, 13, 2, 13};
20530       static const int aExplainMap[] =   {0,       1,  2, 3, 4, 5,  6, 7 };
20531       static const int aScanExpWidth[] = {4, 6, 6, 13, 4, 4, 4, 13, 2, 13};
20532       static const int aScanExpMap[] =   {0, 9, 8, 1,  2, 3, 4, 5,  6, 7 };
20533 
20534       const int *aWidth = aExplainWidth;
20535       const int *aMap = aExplainMap;
20536       int nWidth = ArraySize(aExplainWidth);
20537       int iIndent = 1;
20538 
20539       if( p->cMode==MODE_ScanExp ){
20540         aWidth = aScanExpWidth;
20541         aMap = aScanExpMap;
20542         nWidth = ArraySize(aScanExpWidth);
20543         iIndent = 3;
20544       }
20545       if( nArg>nWidth ) nArg = nWidth;
20546 
20547       /* If this is the first row seen, print out the headers */
20548       if( p->cnt++==0 ){
20549         for(i=0; i<nArg; i++){
20550           utf8_width_print(aWidth[i], azCol[ aMap[i] ]);
20551           oputz(i==nArg-1 ? "\n" : "  ");
20552         }
20553         for(i=0; i<nArg; i++){
20554           print_dashes(aWidth[i]);
20555           oputz(i==nArg-1 ? "\n" : "  ");
20556         }
20557       }
20558 
20559       /* If there is no data, exit early. */
20560       if( azArg==0 ) break;
20561 
20562       for(i=0; i<nArg; i++){
20563         const char *zSep = "  ";
20564         int w = aWidth[i];
20565         const char *zVal = azArg[ aMap[i] ];
20566         if( i==nArg-1 ) w = 0;
20567         if( zVal && strlenChar(zVal)>w ){
20568           w = strlenChar(zVal);
20569           zSep = " ";
20570         }
20571         if( i==iIndent && p->aiIndent && p->pStmt ){
20572           if( p->iIndent<p->nIndent ){
20573             oputf("%*.s", p->aiIndent[p->iIndent], "");
20574           }
20575           p->iIndent++;
20576         }
20577         utf8_width_print(w, zVal ? zVal : p->nullValue);
20578         oputz(i==nArg-1 ? "\n" : zSep);
20579       }
20580       break;
20581     }
20582     case MODE_Semi: {   /* .schema and .fullschema output */
20583       printSchemaLine(azArg[0], ";\n");
20584       break;
20585     }
20586     case MODE_Pretty: {  /* .schema and .fullschema with --indent */
20587       char *z;
20588       int j;
20589       int nParen = 0;
20590       char cEnd = 0;
20591       char c;
20592       int nLine = 0;
20593       assert( nArg==1 );
20594       if( azArg[0]==0 ) break;
20595       if( sqlite3_strlike("CREATE VIEW%", azArg[0], 0)==0
20596        || sqlite3_strlike("CREATE TRIG%", azArg[0], 0)==0
20597       ){
20598         oputf("%s;\n", azArg[0]);
20599         break;
20600       }
20601       z = sqlite3_mprintf("%s", azArg[0]);
20602       shell_check_oom(z);
20603       j = 0;
20604       for(i=0; IsSpace(z[i]); i++){}
20605       for(; (c = z[i])!=0; i++){
20606         if( IsSpace(c) ){
20607           if( z[j-1]=='\r' ) z[j-1] = '\n';
20608           if( IsSpace(z[j-1]) || z[j-1]=='(' ) continue;
20609         }else if( (c=='(' || c==')') && j>0 && IsSpace(z[j-1]) ){
20610           j--;
20611         }
20612         z[j++] = c;
20613       }
20614       while( j>0 && IsSpace(z[j-1]) ){ j--; }
20615       z[j] = 0;
20616       if( strlen30(z)>=79 ){
20617         for(i=j=0; (c = z[i])!=0; i++){ /* Copy from z[i] back to z[j] */
20618           if( c==cEnd ){
20619             cEnd = 0;
20620           }else if( c=='"' || c=='\'' || c=='`' ){
20621             cEnd = c;
20622           }else if( c=='[' ){
20623             cEnd = ']';
20624           }else if( c=='-' && z[i+1]=='-' ){
20625             cEnd = '\n';
20626           }else if( c=='(' ){
20627             nParen++;
20628           }else if( c==')' ){
20629             nParen--;
20630             if( nLine>0 && nParen==0 && j>0 ){
20631               printSchemaLineN(z, j, "\n");
20632               j = 0;
20633             }
20634           }
20635           z[j++] = c;
20636           if( nParen==1 && cEnd==0
20637            && (c=='(' || c=='\n' || (c==',' && !wsToEol(z+i+1)))
20638           ){
20639             if( c=='\n' ) j--;
20640             printSchemaLineN(z, j, "\n  ");
20641             j = 0;
20642             nLine++;
20643             while( IsSpace(z[i+1]) ){ i++; }
20644           }
20645         }
20646         z[j] = 0;
20647       }
20648       printSchemaLine(z, ";\n");
20649       sqlite3_free(z);
20650       break;
20651     }
20652     case MODE_List: {
20653       if( p->cnt++==0 && p->showHeader ){
20654         for(i=0; i<nArg; i++){
20655           oputf("%s%s",azCol[i], i==nArg-1 ? p->rowSeparator : p->colSeparator);
20656         }
20657       }
20658       if( azArg==0 ) break;
20659       for(i=0; i<nArg; i++){
20660         char *z = azArg[i];
20661         if( z==0 ) z = p->nullValue;
20662         oputz(z);
20663         oputz((i<nArg-1)? p->colSeparator : p->rowSeparator);
20664       }
20665       break;
20666     }
20667     case MODE_Html: {
20668       if( p->cnt++==0 && p->showHeader ){
20669         oputz("<TR>");
20670         for(i=0; i<nArg; i++){
20671           oputz("<TH>");
20672           output_html_string(azCol[i]);
20673           oputz("</TH>\n");
20674         }
20675         oputz("</TR>\n");
20676       }
20677       if( azArg==0 ) break;
20678       oputz("<TR>");
20679       for(i=0; i<nArg; i++){
20680         oputz("<TD>");
20681         output_html_string(azArg[i] ? azArg[i] : p->nullValue);
20682         oputz("</TD>\n");
20683       }
20684       oputz("</TR>\n");
20685       break;
20686     }
20687     case MODE_Tcl: {
20688       if( p->cnt++==0 && p->showHeader ){
20689         for(i=0; i<nArg; i++){
20690           output_c_string(azCol[i] ? azCol[i] : "");
20691           if(i<nArg-1) oputz(p->colSeparator);
20692         }
20693         oputz(p->rowSeparator);
20694       }
20695       if( azArg==0 ) break;
20696       for(i=0; i<nArg; i++){
20697         output_c_string(azArg[i] ? azArg[i] : p->nullValue);
20698         if(i<nArg-1) oputz(p->colSeparator);
20699       }
20700       oputz(p->rowSeparator);
20701       break;
20702     }
20703     case MODE_Csv: {
20704       setBinaryMode(p->out, 1);
20705       if( p->cnt++==0 && p->showHeader ){
20706         for(i=0; i<nArg; i++){
20707           output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
20708         }
20709         oputz(p->rowSeparator);
20710       }
20711       if( nArg>0 ){
20712         for(i=0; i<nArg; i++){
20713           output_csv(p, azArg[i], i<nArg-1);
20714         }
20715         oputz(p->rowSeparator);
20716       }
20717       setTextMode(p->out, 1);
20718       break;
20719     }
20720     case MODE_Insert: {
20721       if( azArg==0 ) break;
20722       oputf("INSERT INTO %s",p->zDestTable);
20723       if( p->showHeader ){
20724         oputz("(");
20725         for(i=0; i<nArg; i++){
20726           if( i>0 ) oputz(",");
20727           if( quoteChar(azCol[i]) ){
20728             char *z = sqlite3_mprintf("\"%w\"", azCol[i]);
20729             shell_check_oom(z);
20730             oputz(z);
20731             sqlite3_free(z);
20732           }else{
20733             oputf("%s", azCol[i]);
20734           }
20735         }
20736         oputz(")");
20737       }
20738       p->cnt++;
20739       for(i=0; i<nArg; i++){
20740         oputz(i>0 ? "," : " VALUES(");
20741         if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
20742           oputz("NULL");
20743         }else if( aiType && aiType[i]==SQLITE_TEXT ){
20744           if( ShellHasFlag(p, SHFLG_Newlines) ){
20745             output_quoted_string(azArg[i]);
20746           }else{
20747             output_quoted_escaped_string(azArg[i]);
20748           }
20749         }else if( aiType && aiType[i]==SQLITE_INTEGER ){
20750           oputz(azArg[i]);
20751         }else if( aiType && aiType[i]==SQLITE_FLOAT ){
20752           char z[50];
20753           double r = sqlite3_column_double(p->pStmt, i);
20754           sqlite3_uint64 ur;
20755           memcpy(&ur,&r,sizeof(r));
20756           if( ur==0x7ff0000000000000LL ){
20757             oputz("9.0e+999");
20758           }else if( ur==0xfff0000000000000LL ){
20759             oputz("-9.0e+999");
20760           }else{
20761             sqlite3_int64 ir = (sqlite3_int64)r;
20762             if( r==(double)ir ){
20763               sqlite3_snprintf(50,z,"%lld.0", ir);
20764             }else{
20765               sqlite3_snprintf(50,z,"%!.20g", r);
20766             }
20767             oputz(z);
20768           }
20769         }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
20770           const void *pBlob = sqlite3_column_blob(p->pStmt, i);
20771           int nBlob = sqlite3_column_bytes(p->pStmt, i);
20772           output_hex_blob(pBlob, nBlob);
20773         }else if( isNumber(azArg[i], 0) ){
20774           oputz(azArg[i]);
20775         }else if( ShellHasFlag(p, SHFLG_Newlines) ){
20776           output_quoted_string(azArg[i]);
20777         }else{
20778           output_quoted_escaped_string(azArg[i]);
20779         }
20780       }
20781       oputz(");\n");
20782       break;
20783     }
20784     case MODE_Json: {
20785       if( azArg==0 ) break;
20786       if( p->cnt==0 ){
20787         fputs("[{", p->out);
20788       }else{
20789         fputs(",\n{", p->out);
20790       }
20791       p->cnt++;
20792       for(i=0; i<nArg; i++){
20793         output_json_string(azCol[i], -1);
20794         oputz(":");
20795         if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
20796           oputz("null");
20797         }else if( aiType && aiType[i]==SQLITE_FLOAT ){
20798           char z[50];
20799           double r = sqlite3_column_double(p->pStmt, i);
20800           sqlite3_uint64 ur;
20801           memcpy(&ur,&r,sizeof(r));
20802           if( ur==0x7ff0000000000000LL ){
20803             oputz("9.0e+999");
20804           }else if( ur==0xfff0000000000000LL ){
20805             oputz("-9.0e+999");
20806           }else{
20807             sqlite3_snprintf(50,z,"%!.20g", r);
20808             oputz(z);
20809           }
20810         }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
20811           const void *pBlob = sqlite3_column_blob(p->pStmt, i);
20812           int nBlob = sqlite3_column_bytes(p->pStmt, i);
20813           output_json_string(pBlob, nBlob);
20814         }else if( aiType && aiType[i]==SQLITE_TEXT ){
20815           output_json_string(azArg[i], -1);
20816         }else{
20817           oputz(azArg[i]);
20818         }
20819         if( i<nArg-1 ){
20820           oputz(",");
20821         }
20822       }
20823       oputz("}");
20824       break;
20825     }
20826     case MODE_Quote: {
20827       if( azArg==0 ) break;
20828       if( p->cnt==0 && p->showHeader ){
20829         for(i=0; i<nArg; i++){
20830           if( i>0 ) fputs(p->colSeparator, p->out);
20831           output_quoted_string(azCol[i]);
20832         }
20833         fputs(p->rowSeparator, p->out);
20834       }
20835       p->cnt++;
20836       for(i=0; i<nArg; i++){
20837         if( i>0 ) fputs(p->colSeparator, p->out);
20838         if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
20839           oputz("NULL");
20840         }else if( aiType && aiType[i]==SQLITE_TEXT ){
20841           output_quoted_string(azArg[i]);
20842         }else if( aiType && aiType[i]==SQLITE_INTEGER ){
20843           oputz(azArg[i]);
20844         }else if( aiType && aiType[i]==SQLITE_FLOAT ){
20845           char z[50];
20846           double r = sqlite3_column_double(p->pStmt, i);
20847           sqlite3_snprintf(50,z,"%!.20g", r);
20848           oputz(z);
20849         }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
20850           const void *pBlob = sqlite3_column_blob(p->pStmt, i);
20851           int nBlob = sqlite3_column_bytes(p->pStmt, i);
20852           output_hex_blob(pBlob, nBlob);
20853         }else if( isNumber(azArg[i], 0) ){
20854           oputz(azArg[i]);
20855         }else{
20856           output_quoted_string(azArg[i]);
20857         }
20858       }
20859       fputs(p->rowSeparator, p->out);
20860       break;
20861     }
20862     case MODE_Ascii: {
20863       if( p->cnt++==0 && p->showHeader ){
20864         for(i=0; i<nArg; i++){
20865           if( i>0 ) oputz(p->colSeparator);
20866           oputz(azCol[i] ? azCol[i] : "");
20867         }
20868         oputz(p->rowSeparator);
20869       }
20870       if( azArg==0 ) break;
20871       for(i=0; i<nArg; i++){
20872         if( i>0 ) oputz(p->colSeparator);
20873         oputz(azArg[i] ? azArg[i] : p->nullValue);
20874       }
20875       oputz(p->rowSeparator);
20876       break;
20877     }
20878     case MODE_EQP: {
20879       eqp_append(p, atoi(azArg[0]), atoi(azArg[1]), azArg[3]);
20880       break;
20881     }
20882   }
20883   return 0;
20884 }
20885 
20886 /*
20887 ** This is the callback routine that the SQLite library
20888 ** invokes for each row of a query result.
20889 */
callback(void * pArg,int nArg,char ** azArg,char ** azCol)20890 static int callback(void *pArg, int nArg, char **azArg, char **azCol){
20891   /* since we don't have type info, call the shell_callback with a NULL value */
20892   return shell_callback(pArg, nArg, azArg, azCol, NULL);
20893 }
20894 
20895 /*
20896 ** This is the callback routine from sqlite3_exec() that appends all
20897 ** output onto the end of a ShellText object.
20898 */
captureOutputCallback(void * pArg,int nArg,char ** azArg,char ** az)20899 static int captureOutputCallback(void *pArg, int nArg, char **azArg, char **az){
20900   ShellText *p = (ShellText*)pArg;
20901   int i;
20902   UNUSED_PARAMETER(az);
20903   if( azArg==0 ) return 0;
20904   if( p->n ) appendText(p, "|", 0);
20905   for(i=0; i<nArg; i++){
20906     if( i ) appendText(p, ",", 0);
20907     if( azArg[i] ) appendText(p, azArg[i], 0);
20908   }
20909   return 0;
20910 }
20911 
20912 /*
20913 ** Generate an appropriate SELFTEST table in the main database.
20914 */
createSelftestTable(ShellState * p)20915 static void createSelftestTable(ShellState *p){
20916   char *zErrMsg = 0;
20917   sqlite3_exec(p->db,
20918     "SAVEPOINT selftest_init;\n"
20919     "CREATE TABLE IF NOT EXISTS selftest(\n"
20920     "  tno INTEGER PRIMARY KEY,\n"   /* Test number */
20921     "  op TEXT,\n"                   /* Operator:  memo run */
20922     "  cmd TEXT,\n"                  /* Command text */
20923     "  ans TEXT\n"                   /* Desired answer */
20924     ");"
20925     "CREATE TEMP TABLE [_shell$self](op,cmd,ans);\n"
20926     "INSERT INTO [_shell$self](rowid,op,cmd)\n"
20927     "  VALUES(coalesce((SELECT (max(tno)+100)/10 FROM selftest),10),\n"
20928     "         'memo','Tests generated by --init');\n"
20929     "INSERT INTO [_shell$self]\n"
20930     "  SELECT 'run',\n"
20931     "    'SELECT hex(sha3_query(''SELECT type,name,tbl_name,sql "
20932                                  "FROM sqlite_schema ORDER BY 2'',224))',\n"
20933     "    hex(sha3_query('SELECT type,name,tbl_name,sql "
20934                           "FROM sqlite_schema ORDER BY 2',224));\n"
20935     "INSERT INTO [_shell$self]\n"
20936     "  SELECT 'run',"
20937     "    'SELECT hex(sha3_query(''SELECT * FROM \"' ||"
20938     "        printf('%w',name) || '\" NOT INDEXED'',224))',\n"
20939     "    hex(sha3_query(printf('SELECT * FROM \"%w\" NOT INDEXED',name),224))\n"
20940     "  FROM (\n"
20941     "    SELECT name FROM sqlite_schema\n"
20942     "     WHERE type='table'\n"
20943     "       AND name<>'selftest'\n"
20944     "       AND coalesce(rootpage,0)>0\n"
20945     "  )\n"
20946     " ORDER BY name;\n"
20947     "INSERT INTO [_shell$self]\n"
20948     "  VALUES('run','PRAGMA integrity_check','ok');\n"
20949     "INSERT INTO selftest(tno,op,cmd,ans)"
20950     "  SELECT rowid*10,op,cmd,ans FROM [_shell$self];\n"
20951     "DROP TABLE [_shell$self];"
20952     ,0,0,&zErrMsg);
20953   if( zErrMsg ){
20954     eputf("SELFTEST initialization failure: %s\n", zErrMsg);
20955     sqlite3_free(zErrMsg);
20956   }
20957   sqlite3_exec(p->db, "RELEASE selftest_init",0,0,0);
20958 }
20959 
20960 
20961 /*
20962 ** Set the destination table field of the ShellState structure to
20963 ** the name of the table given.  Escape any quote characters in the
20964 ** table name.
20965 */
set_table_name(ShellState * p,const char * zName)20966 static void set_table_name(ShellState *p, const char *zName){
20967   int i, n;
20968   char cQuote;
20969   char *z;
20970 
20971   if( p->zDestTable ){
20972     free(p->zDestTable);
20973     p->zDestTable = 0;
20974   }
20975   if( zName==0 ) return;
20976   cQuote = quoteChar(zName);
20977   n = strlen30(zName);
20978   if( cQuote ) n += n+2;
20979   z = p->zDestTable = malloc( n+1 );
20980   shell_check_oom(z);
20981   n = 0;
20982   if( cQuote ) z[n++] = cQuote;
20983   for(i=0; zName[i]; i++){
20984     z[n++] = zName[i];
20985     if( zName[i]==cQuote ) z[n++] = cQuote;
20986   }
20987   if( cQuote ) z[n++] = cQuote;
20988   z[n] = 0;
20989 }
20990 
20991 /*
20992 ** Maybe construct two lines of text that point out the position of a
20993 ** syntax error.  Return a pointer to the text, in memory obtained from
20994 ** sqlite3_malloc().  Or, if the most recent error does not involve a
20995 ** specific token that we can point to, return an empty string.
20996 **
20997 ** In all cases, the memory returned is obtained from sqlite3_malloc64()
20998 ** and should be released by the caller invoking sqlite3_free().
20999 */
shell_error_context(const char * zSql,sqlite3 * db)21000 static char *shell_error_context(const char *zSql, sqlite3 *db){
21001   int iOffset;
21002   size_t len;
21003   char *zCode;
21004   char *zMsg;
21005   int i;
21006   if( db==0
21007    || zSql==0
21008    || (iOffset = sqlite3_error_offset(db))<0
21009    || iOffset>=(int)strlen(zSql)
21010   ){
21011     return sqlite3_mprintf("");
21012   }
21013   while( iOffset>50 ){
21014     iOffset--;
21015     zSql++;
21016     while( (zSql[0]&0xc0)==0x80 ){ zSql++; iOffset--; }
21017   }
21018   len = strlen(zSql);
21019   if( len>78 ){
21020     len = 78;
21021     while( len>0 && (zSql[len]&0xc0)==0x80 ) len--;
21022   }
21023   zCode = sqlite3_mprintf("%.*s", len, zSql);
21024   shell_check_oom(zCode);
21025   for(i=0; zCode[i]; i++){ if( IsSpace(zSql[i]) ) zCode[i] = ' '; }
21026   if( iOffset<25 ){
21027     zMsg = sqlite3_mprintf("\n  %z\n  %*s^--- error here", zCode,iOffset,"");
21028   }else{
21029     zMsg = sqlite3_mprintf("\n  %z\n  %*serror here ---^", zCode,iOffset-14,"");
21030   }
21031   return zMsg;
21032 }
21033 
21034 
21035 /*
21036 ** Execute a query statement that will generate SQL output.  Print
21037 ** the result columns, comma-separated, on a line and then add a
21038 ** semicolon terminator to the end of that line.
21039 **
21040 ** If the number of columns is 1 and that column contains text "--"
21041 ** then write the semicolon on a separate line.  That way, if a
21042 ** "--" comment occurs at the end of the statement, the comment
21043 ** won't consume the semicolon terminator.
21044 */
run_table_dump_query(ShellState * p,const char * zSelect)21045 static int run_table_dump_query(
21046   ShellState *p,           /* Query context */
21047   const char *zSelect      /* SELECT statement to extract content */
21048 ){
21049   sqlite3_stmt *pSelect;
21050   int rc;
21051   int nResult;
21052   int i;
21053   const char *z;
21054   rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0);
21055   if( rc!=SQLITE_OK || !pSelect ){
21056     char *zContext = shell_error_context(zSelect, p->db);
21057     oputf("/**** ERROR: (%d) %s *****/\n%s",
21058           rc, sqlite3_errmsg(p->db), zContext);
21059     sqlite3_free(zContext);
21060     if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
21061     return rc;
21062   }
21063   rc = sqlite3_step(pSelect);
21064   nResult = sqlite3_column_count(pSelect);
21065   while( rc==SQLITE_ROW ){
21066     z = (const char*)sqlite3_column_text(pSelect, 0);
21067     oputf("%s", z);
21068     for(i=1; i<nResult; i++){
21069       oputf(",%s", sqlite3_column_text(pSelect, i));
21070     }
21071     if( z==0 ) z = "";
21072     while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
21073     if( z[0] ){
21074       oputz("\n;\n");
21075     }else{
21076       oputz(";\n");
21077     }
21078     rc = sqlite3_step(pSelect);
21079   }
21080   rc = sqlite3_finalize(pSelect);
21081   if( rc!=SQLITE_OK ){
21082     oputf("/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
21083     if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
21084   }
21085   return rc;
21086 }
21087 
21088 /*
21089 ** Allocate space and save off string indicating current error.
21090 */
save_err_msg(sqlite3 * db,const char * zPhase,int rc,const char * zSql)21091 static char *save_err_msg(
21092   sqlite3 *db,           /* Database to query */
21093   const char *zPhase,    /* When the error occurs */
21094   int rc,                /* Error code returned from API */
21095   const char *zSql       /* SQL string, or NULL */
21096 ){
21097   char *zErr;
21098   char *zContext;
21099   sqlite3_str *pStr = sqlite3_str_new(0);
21100   sqlite3_str_appendf(pStr, "%s, %s", zPhase, sqlite3_errmsg(db));
21101   if( rc>1 ){
21102     sqlite3_str_appendf(pStr, " (%d)", rc);
21103   }
21104   zContext = shell_error_context(zSql, db);
21105   if( zContext ){
21106     sqlite3_str_appendall(pStr, zContext);
21107     sqlite3_free(zContext);
21108   }
21109   zErr = sqlite3_str_finish(pStr);
21110   shell_check_oom(zErr);
21111   return zErr;
21112 }
21113 
21114 #ifdef __linux__
21115 /*
21116 ** Attempt to display I/O stats on Linux using /proc/PID/io
21117 */
displayLinuxIoStats(void)21118 static void displayLinuxIoStats(void){
21119   FILE *in;
21120   char z[200];
21121   sqlite3_snprintf(sizeof(z), z, "/proc/%d/io", getpid());
21122   in = fopen(z, "rb");
21123   if( in==0 ) return;
21124   while( fgets(z, sizeof(z), in)!=0 ){
21125     static const struct {
21126       const char *zPattern;
21127       const char *zDesc;
21128     } aTrans[] = {
21129       { "rchar: ",                  "Bytes received by read():" },
21130       { "wchar: ",                  "Bytes sent to write():"    },
21131       { "syscr: ",                  "Read() system calls:"      },
21132       { "syscw: ",                  "Write() system calls:"     },
21133       { "read_bytes: ",             "Bytes read from storage:"  },
21134       { "write_bytes: ",            "Bytes written to storage:" },
21135       { "cancelled_write_bytes: ",  "Cancelled write bytes:"    },
21136     };
21137     int i;
21138     for(i=0; i<ArraySize(aTrans); i++){
21139       int n = strlen30(aTrans[i].zPattern);
21140       if( cli_strncmp(aTrans[i].zPattern, z, n)==0 ){
21141         oputf("%-36s %s", aTrans[i].zDesc, &z[n]);
21142         break;
21143       }
21144     }
21145   }
21146   fclose(in);
21147 }
21148 #endif
21149 
21150 /*
21151 ** Display a single line of status using 64-bit values.
21152 */
displayStatLine(char * zLabel,char * zFormat,int iStatusCtrl,int bReset)21153 static void displayStatLine(
21154   char *zLabel,             /* Label for this one line */
21155   char *zFormat,            /* Format for the result */
21156   int iStatusCtrl,          /* Which status to display */
21157   int bReset                /* True to reset the stats */
21158 ){
21159   sqlite3_int64 iCur = -1;
21160   sqlite3_int64 iHiwtr = -1;
21161   int i, nPercent;
21162   char zLine[200];
21163   sqlite3_status64(iStatusCtrl, &iCur, &iHiwtr, bReset);
21164   for(i=0, nPercent=0; zFormat[i]; i++){
21165     if( zFormat[i]=='%' ) nPercent++;
21166   }
21167   if( nPercent>1 ){
21168     sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iCur, iHiwtr);
21169   }else{
21170     sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iHiwtr);
21171   }
21172   oputf("%-36s %s\n", zLabel, zLine);
21173 }
21174 
21175 /*
21176 ** Display memory stats.
21177 */
display_stats(sqlite3 * db,ShellState * pArg,int bReset)21178 static int display_stats(
21179   sqlite3 *db,                /* Database to query */
21180   ShellState *pArg,           /* Pointer to ShellState */
21181   int bReset                  /* True to reset the stats */
21182 ){
21183   int iCur;
21184   int iHiwtr;
21185   if( pArg==0 || pArg->out==0 ) return 0;
21186 
21187   if( pArg->pStmt && pArg->statsOn==2 ){
21188     int nCol, i, x;
21189     sqlite3_stmt *pStmt = pArg->pStmt;
21190     char z[100];
21191     nCol = sqlite3_column_count(pStmt);
21192     oputf("%-36s %d\n", "Number of output columns:", nCol);
21193     for(i=0; i<nCol; i++){
21194       sqlite3_snprintf(sizeof(z),z,"Column %d %nname:", i, &x);
21195       oputf("%-36s %s\n", z, sqlite3_column_name(pStmt,i));
21196 #ifndef SQLITE_OMIT_DECLTYPE
21197       sqlite3_snprintf(30, z+x, "declared type:");
21198       oputf("%-36s %s\n", z, sqlite3_column_decltype(pStmt, i));
21199 #endif
21200 #ifdef SQLITE_ENABLE_COLUMN_METADATA
21201       sqlite3_snprintf(30, z+x, "database name:");
21202       oputf("%-36s %s\n", z, sqlite3_column_database_name(pStmt,i));
21203       sqlite3_snprintf(30, z+x, "table name:");
21204       oputf("%-36s %s\n", z, sqlite3_column_table_name(pStmt,i));
21205       sqlite3_snprintf(30, z+x, "origin name:");
21206       oputf("%-36s %s\n", z, sqlite3_column_origin_name(pStmt,i));
21207 #endif
21208     }
21209   }
21210 
21211   if( pArg->statsOn==3 ){
21212     if( pArg->pStmt ){
21213       iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP,bReset);
21214       oputf("VM-steps: %d\n", iCur);
21215     }
21216     return 0;
21217   }
21218 
21219   displayStatLine("Memory Used:",
21220      "%lld (max %lld) bytes", SQLITE_STATUS_MEMORY_USED, bReset);
21221   displayStatLine("Number of Outstanding Allocations:",
21222      "%lld (max %lld)", SQLITE_STATUS_MALLOC_COUNT, bReset);
21223   if( pArg->shellFlgs & SHFLG_Pagecache ){
21224     displayStatLine("Number of Pcache Pages Used:",
21225        "%lld (max %lld) pages", SQLITE_STATUS_PAGECACHE_USED, bReset);
21226   }
21227   displayStatLine("Number of Pcache Overflow Bytes:",
21228      "%lld (max %lld) bytes", SQLITE_STATUS_PAGECACHE_OVERFLOW, bReset);
21229   displayStatLine("Largest Allocation:",
21230      "%lld bytes", SQLITE_STATUS_MALLOC_SIZE, bReset);
21231   displayStatLine("Largest Pcache Allocation:",
21232      "%lld bytes", SQLITE_STATUS_PAGECACHE_SIZE, bReset);
21233 #ifdef YYTRACKMAXSTACKDEPTH
21234   displayStatLine("Deepest Parser Stack:",
21235      "%lld (max %lld)", SQLITE_STATUS_PARSER_STACK, bReset);
21236 #endif
21237 
21238   if( db ){
21239     if( pArg->shellFlgs & SHFLG_Lookaside ){
21240       iHiwtr = iCur = -1;
21241       sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED,
21242                         &iCur, &iHiwtr, bReset);
21243       oputf("Lookaside Slots Used:                %d (max %d)\n", iCur, iHiwtr);
21244       sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT,
21245                         &iCur, &iHiwtr, bReset);
21246       oputf("Successful lookaside attempts:       %d\n", iHiwtr);
21247       sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE,
21248                         &iCur, &iHiwtr, bReset);
21249       oputf("Lookaside failures due to size:      %d\n", iHiwtr);
21250       sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL,
21251                         &iCur, &iHiwtr, bReset);
21252       oputf("Lookaside failures due to OOM:       %d\n", iHiwtr);
21253     }
21254     iHiwtr = iCur = -1;
21255     sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
21256     oputf("Pager Heap Usage:                    %d bytes\n", iCur);
21257     iHiwtr = iCur = -1;
21258     sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
21259     oputf("Page cache hits:                     %d\n", iCur);
21260     iHiwtr = iCur = -1;
21261     sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
21262     oputf("Page cache misses:                   %d\n", iCur);
21263     iHiwtr = iCur = -1;
21264     sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
21265     oputf("Page cache writes:                   %d\n", iCur);
21266     iHiwtr = iCur = -1;
21267     sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_SPILL, &iCur, &iHiwtr, 1);
21268     oputf("Page cache spills:                   %d\n", iCur);
21269     iHiwtr = iCur = -1;
21270     sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
21271     oputf("Schema Heap Usage:                   %d bytes\n", iCur);
21272     iHiwtr = iCur = -1;
21273     sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
21274     oputf("Statement Heap/Lookaside Usage:      %d bytes\n", iCur);
21275   }
21276 
21277   if( pArg->pStmt ){
21278     int iHit, iMiss;
21279     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP,
21280                                bReset);
21281     oputf("Fullscan Steps:                      %d\n", iCur);
21282     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
21283     oputf("Sort Operations:                     %d\n", iCur);
21284     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX,bReset);
21285     oputf("Autoindex Inserts:                   %d\n", iCur);
21286     iHit = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FILTER_HIT,
21287                                bReset);
21288     iMiss = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FILTER_MISS,
21289                                 bReset);
21290     if( iHit || iMiss ){
21291       oputf("Bloom filter bypass taken:           %d/%d\n", iHit, iHit+iMiss);
21292     }
21293     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
21294     oputf("Virtual Machine Steps:               %d\n", iCur);
21295     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_REPREPARE,bReset);
21296     oputf("Reprepare operations:                %d\n", iCur);
21297     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_RUN, bReset);
21298     oputf("Number of times run:                 %d\n", iCur);
21299     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_MEMUSED, bReset);
21300     oputf("Memory used by prepared stmt:        %d\n", iCur);
21301   }
21302 
21303 #ifdef __linux__
21304   displayLinuxIoStats();
21305 #endif
21306 
21307   /* Do not remove this machine readable comment: extra-stats-output-here */
21308 
21309   return 0;
21310 }
21311 
21312 
21313 #ifdef SQLITE_ENABLE_STMT_SCANSTATUS
scanStatsHeight(sqlite3_stmt * p,int iEntry)21314 static int scanStatsHeight(sqlite3_stmt *p, int iEntry){
21315   int iPid = 0;
21316   int ret = 1;
21317   sqlite3_stmt_scanstatus_v2(p, iEntry,
21318       SQLITE_SCANSTAT_SELECTID, SQLITE_SCANSTAT_COMPLEX, (void*)&iPid
21319   );
21320   while( iPid!=0 ){
21321     int ii;
21322     for(ii=0; 1; ii++){
21323       int iId;
21324       int res;
21325       res = sqlite3_stmt_scanstatus_v2(p, ii,
21326           SQLITE_SCANSTAT_SELECTID, SQLITE_SCANSTAT_COMPLEX, (void*)&iId
21327       );
21328       if( res ) break;
21329       if( iId==iPid ){
21330         sqlite3_stmt_scanstatus_v2(p, ii,
21331             SQLITE_SCANSTAT_PARENTID, SQLITE_SCANSTAT_COMPLEX, (void*)&iPid
21332         );
21333       }
21334     }
21335     ret++;
21336   }
21337   return ret;
21338 }
21339 #endif
21340 
21341 #ifdef SQLITE_ENABLE_STMT_SCANSTATUS
display_explain_scanstats(sqlite3 * db,ShellState * pArg)21342 static void display_explain_scanstats(
21343   sqlite3 *db,                    /* Database to query */
21344   ShellState *pArg                /* Pointer to ShellState */
21345 ){
21346   static const int f = SQLITE_SCANSTAT_COMPLEX;
21347   sqlite3_stmt *p = pArg->pStmt;
21348   int ii = 0;
21349   i64 nTotal = 0;
21350   int nWidth = 0;
21351   eqp_reset(pArg);
21352 
21353   for(ii=0; 1; ii++){
21354     const char *z = 0;
21355     int n = 0;
21356     if( sqlite3_stmt_scanstatus_v2(p,ii,SQLITE_SCANSTAT_EXPLAIN,f,(void*)&z) ){
21357       break;
21358     }
21359     n = (int)strlen(z) + scanStatsHeight(p, ii)*3;
21360     if( n>nWidth ) nWidth = n;
21361   }
21362   nWidth += 4;
21363 
21364   sqlite3_stmt_scanstatus_v2(p, -1, SQLITE_SCANSTAT_NCYCLE, f, (void*)&nTotal);
21365   for(ii=0; 1; ii++){
21366     i64 nLoop = 0;
21367     i64 nRow = 0;
21368     i64 nCycle = 0;
21369     int iId = 0;
21370     int iPid = 0;
21371     const char *zo = 0;
21372     const char *zName = 0;
21373     char *zText = 0;
21374     double rEst = 0.0;
21375 
21376     if( sqlite3_stmt_scanstatus_v2(p,ii,SQLITE_SCANSTAT_EXPLAIN,f,(void*)&zo) ){
21377       break;
21378     }
21379     sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_EST,f,(void*)&rEst);
21380     sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_NLOOP,f,(void*)&nLoop);
21381     sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_NVISIT,f,(void*)&nRow);
21382     sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_NCYCLE,f,(void*)&nCycle);
21383     sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_SELECTID,f,(void*)&iId);
21384     sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_PARENTID,f,(void*)&iPid);
21385     sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_NAME,f,(void*)&zName);
21386 
21387     zText = sqlite3_mprintf("%s", zo);
21388     if( nCycle>=0 || nLoop>=0 || nRow>=0 ){
21389       char *z = 0;
21390       if( nCycle>=0 && nTotal>0 ){
21391         z = sqlite3_mprintf("%zcycles=%lld [%d%%]", z,
21392             nCycle, ((nCycle*100)+nTotal/2) / nTotal
21393         );
21394       }
21395       if( nLoop>=0 ){
21396         z = sqlite3_mprintf("%z%sloops=%lld", z, z ? " " : "", nLoop);
21397       }
21398       if( nRow>=0 ){
21399         z = sqlite3_mprintf("%z%srows=%lld", z, z ? " " : "", nRow);
21400       }
21401 
21402       if( zName && pArg->scanstatsOn>1 ){
21403         double rpl = (double)nRow / (double)nLoop;
21404         z = sqlite3_mprintf("%z rpl=%.1f est=%.1f", z, rpl, rEst);
21405       }
21406 
21407       zText = sqlite3_mprintf(
21408           "% *z (%z)", -1*(nWidth-scanStatsHeight(p, ii)*3), zText, z
21409       );
21410     }
21411 
21412     eqp_append(pArg, iId, iPid, zText);
21413     sqlite3_free(zText);
21414   }
21415 
21416   eqp_render(pArg, nTotal);
21417 }
21418 #endif
21419 
21420 
21421 /*
21422 ** Parameter azArray points to a zero-terminated array of strings. zStr
21423 ** points to a single nul-terminated string. Return non-zero if zStr
21424 ** is equal, according to strcmp(), to any of the strings in the array.
21425 ** Otherwise, return zero.
21426 */
str_in_array(const char * zStr,const char ** azArray)21427 static int str_in_array(const char *zStr, const char **azArray){
21428   int i;
21429   for(i=0; azArray[i]; i++){
21430     if( 0==cli_strcmp(zStr, azArray[i]) ) return 1;
21431   }
21432   return 0;
21433 }
21434 
21435 /*
21436 ** If compiled statement pSql appears to be an EXPLAIN statement, allocate
21437 ** and populate the ShellState.aiIndent[] array with the number of
21438 ** spaces each opcode should be indented before it is output.
21439 **
21440 ** The indenting rules are:
21441 **
21442 **     * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
21443 **       all opcodes that occur between the p2 jump destination and the opcode
21444 **       itself by 2 spaces.
21445 **
21446 **     * Do the previous for "Return" instructions for when P2 is positive.
21447 **       See tag-20220407a in wherecode.c and vdbe.c.
21448 **
21449 **     * For each "Goto", if the jump destination is earlier in the program
21450 **       and ends on one of:
21451 **          Yield  SeekGt  SeekLt  RowSetRead  Rewind
21452 **       or if the P1 parameter is one instead of zero,
21453 **       then indent all opcodes between the earlier instruction
21454 **       and "Goto" by 2 spaces.
21455 */
explain_data_prepare(ShellState * p,sqlite3_stmt * pSql)21456 static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){
21457   int *abYield = 0;               /* True if op is an OP_Yield */
21458   int nAlloc = 0;                 /* Allocated size of p->aiIndent[], abYield */
21459   int iOp;                        /* Index of operation in p->aiIndent[] */
21460 
21461   const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext",
21462                            "Return", 0 };
21463   const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead",
21464                             "Rewind", 0 };
21465   const char *azGoto[] = { "Goto", 0 };
21466 
21467   /* The caller guarantees that the leftmost 4 columns of the statement
21468   ** passed to this function are equivalent to the leftmost 4 columns
21469   ** of EXPLAIN statement output. In practice the statement may be
21470   ** an EXPLAIN, or it may be a query on the bytecode() virtual table.  */
21471   assert( sqlite3_column_count(pSql)>=4 );
21472   assert( 0==sqlite3_stricmp( sqlite3_column_name(pSql, 0), "addr" ) );
21473   assert( 0==sqlite3_stricmp( sqlite3_column_name(pSql, 1), "opcode" ) );
21474   assert( 0==sqlite3_stricmp( sqlite3_column_name(pSql, 2), "p1" ) );
21475   assert( 0==sqlite3_stricmp( sqlite3_column_name(pSql, 3), "p2" ) );
21476 
21477   for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
21478     int i;
21479     int iAddr = sqlite3_column_int(pSql, 0);
21480     const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
21481     int p1 = sqlite3_column_int(pSql, 2);
21482     int p2 = sqlite3_column_int(pSql, 3);
21483 
21484     /* Assuming that p2 is an instruction address, set variable p2op to the
21485     ** index of that instruction in the aiIndent[] array. p2 and p2op may be
21486     ** different if the current instruction is part of a sub-program generated
21487     ** by an SQL trigger or foreign key.  */
21488     int p2op = (p2 + (iOp-iAddr));
21489 
21490     /* Grow the p->aiIndent array as required */
21491     if( iOp>=nAlloc ){
21492       nAlloc += 100;
21493       p->aiIndent = (int*)sqlite3_realloc64(p->aiIndent, nAlloc*sizeof(int));
21494       shell_check_oom(p->aiIndent);
21495       abYield = (int*)sqlite3_realloc64(abYield, nAlloc*sizeof(int));
21496       shell_check_oom(abYield);
21497     }
21498 
21499     abYield[iOp] = str_in_array(zOp, azYield);
21500     p->aiIndent[iOp] = 0;
21501     p->nIndent = iOp+1;
21502     if( str_in_array(zOp, azNext) && p2op>0 ){
21503       for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
21504     }
21505     if( str_in_array(zOp, azGoto) && p2op<iOp && (abYield[p2op] || p1) ){
21506       for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
21507     }
21508   }
21509 
21510   p->iIndent = 0;
21511   sqlite3_free(abYield);
21512   sqlite3_reset(pSql);
21513 }
21514 
21515 /*
21516 ** Free the array allocated by explain_data_prepare().
21517 */
explain_data_delete(ShellState * p)21518 static void explain_data_delete(ShellState *p){
21519   sqlite3_free(p->aiIndent);
21520   p->aiIndent = 0;
21521   p->nIndent = 0;
21522   p->iIndent = 0;
21523 }
21524 
21525 static void exec_prepared_stmt(ShellState*, sqlite3_stmt*);
21526 
21527 /*
21528 ** Display scan stats.
21529 */
display_scanstats(sqlite3 * db,ShellState * pArg)21530 static void display_scanstats(
21531   sqlite3 *db,                    /* Database to query */
21532   ShellState *pArg                /* Pointer to ShellState */
21533 ){
21534 #ifndef SQLITE_ENABLE_STMT_SCANSTATUS
21535   UNUSED_PARAMETER(db);
21536   UNUSED_PARAMETER(pArg);
21537 #else
21538   if( pArg->scanstatsOn==3 ){
21539     const char *zSql =
21540       "  SELECT addr, opcode, p1, p2, p3, p4, p5, comment, nexec,"
21541       "   round(ncycle*100.0 / (sum(ncycle) OVER ()), 2)||'%' AS cycles"
21542       "   FROM bytecode(?)";
21543 
21544     int rc = SQLITE_OK;
21545     sqlite3_stmt *pStmt = 0;
21546     rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
21547     if( rc==SQLITE_OK ){
21548       sqlite3_stmt *pSave = pArg->pStmt;
21549       pArg->pStmt = pStmt;
21550       sqlite3_bind_pointer(pStmt, 1, pSave, "stmt-pointer", 0);
21551 
21552       pArg->cnt = 0;
21553       pArg->cMode = MODE_ScanExp;
21554       explain_data_prepare(pArg, pStmt);
21555       exec_prepared_stmt(pArg, pStmt);
21556       explain_data_delete(pArg);
21557 
21558       sqlite3_finalize(pStmt);
21559       pArg->pStmt = pSave;
21560     }
21561   }else{
21562     display_explain_scanstats(db, pArg);
21563   }
21564 #endif
21565 }
21566 
21567 /*
21568 ** Disable and restore .wheretrace and .treetrace/.selecttrace settings.
21569 */
21570 static unsigned int savedSelectTrace;
21571 static unsigned int savedWhereTrace;
disable_debug_trace_modes(void)21572 static void disable_debug_trace_modes(void){
21573   unsigned int zero = 0;
21574   sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 0, &savedSelectTrace);
21575   sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &zero);
21576   sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 2, &savedWhereTrace);
21577   sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &zero);
21578 }
restore_debug_trace_modes(void)21579 static void restore_debug_trace_modes(void){
21580   sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &savedSelectTrace);
21581   sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &savedWhereTrace);
21582 }
21583 
21584 /* Create the TEMP table used to store parameter bindings */
bind_table_init(ShellState * p)21585 static void bind_table_init(ShellState *p){
21586   int wrSchema = 0;
21587   int defensiveMode = 0;
21588   sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, -1, &defensiveMode);
21589   sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, 0, 0);
21590   sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, -1, &wrSchema);
21591   sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, 1, 0);
21592   sqlite3_exec(p->db,
21593     "CREATE TABLE IF NOT EXISTS temp.sqlite_parameters(\n"
21594     "  key TEXT PRIMARY KEY,\n"
21595     "  value\n"
21596     ") WITHOUT ROWID;",
21597     0, 0, 0);
21598   sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, wrSchema, 0);
21599   sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, defensiveMode, 0);
21600 }
21601 
21602 /*
21603 ** Bind parameters on a prepared statement.
21604 **
21605 ** Parameter bindings are taken from a TEMP table of the form:
21606 **
21607 **    CREATE TEMP TABLE sqlite_parameters(key TEXT PRIMARY KEY, value)
21608 **    WITHOUT ROWID;
21609 **
21610 ** No bindings occur if this table does not exist.  The name of the table
21611 ** begins with "sqlite_" so that it will not collide with ordinary application
21612 ** tables.  The table must be in the TEMP schema.
21613 */
bind_prepared_stmt(ShellState * pArg,sqlite3_stmt * pStmt)21614 static void bind_prepared_stmt(ShellState *pArg, sqlite3_stmt *pStmt){
21615   int nVar;
21616   int i;
21617   int rc;
21618   sqlite3_stmt *pQ = 0;
21619 
21620   nVar = sqlite3_bind_parameter_count(pStmt);
21621   if( nVar==0 ) return;  /* Nothing to do */
21622   if( sqlite3_table_column_metadata(pArg->db, "TEMP", "sqlite_parameters",
21623                                     "key", 0, 0, 0, 0, 0)!=SQLITE_OK ){
21624     rc = SQLITE_NOTFOUND;
21625     pQ = 0;
21626   }else{
21627     rc = sqlite3_prepare_v2(pArg->db,
21628             "SELECT value FROM temp.sqlite_parameters"
21629             " WHERE key=?1", -1, &pQ, 0);
21630   }
21631   for(i=1; i<=nVar; i++){
21632     char zNum[30];
21633     const char *zVar = sqlite3_bind_parameter_name(pStmt, i);
21634     if( zVar==0 ){
21635       sqlite3_snprintf(sizeof(zNum),zNum,"?%d",i);
21636       zVar = zNum;
21637     }
21638     sqlite3_bind_text(pQ, 1, zVar, -1, SQLITE_STATIC);
21639     if( rc==SQLITE_OK && pQ && sqlite3_step(pQ)==SQLITE_ROW ){
21640       sqlite3_bind_value(pStmt, i, sqlite3_column_value(pQ, 0));
21641 #ifdef NAN
21642     }else if( sqlite3_strlike("_NAN", zVar, 0)==0 ){
21643       sqlite3_bind_double(pStmt, i, NAN);
21644 #endif
21645 #ifdef INFINITY
21646     }else if( sqlite3_strlike("_INF", zVar, 0)==0 ){
21647       sqlite3_bind_double(pStmt, i, INFINITY);
21648 #endif
21649     }else{
21650       sqlite3_bind_null(pStmt, i);
21651     }
21652     sqlite3_reset(pQ);
21653   }
21654   sqlite3_finalize(pQ);
21655 }
21656 
21657 /*
21658 ** UTF8 box-drawing characters.  Imagine box lines like this:
21659 **
21660 **           1
21661 **           |
21662 **       4 --+-- 2
21663 **           |
21664 **           3
21665 **
21666 ** Each box characters has between 2 and 4 of the lines leading from
21667 ** the center.  The characters are here identified by the numbers of
21668 ** their corresponding lines.
21669 */
21670 #define BOX_24   "\342\224\200"  /* U+2500 --- */
21671 #define BOX_13   "\342\224\202"  /* U+2502  |  */
21672 #define BOX_23   "\342\224\214"  /* U+250c  ,- */
21673 #define BOX_34   "\342\224\220"  /* U+2510 -,  */
21674 #define BOX_12   "\342\224\224"  /* U+2514  '- */
21675 #define BOX_14   "\342\224\230"  /* U+2518 -'  */
21676 #define BOX_123  "\342\224\234"  /* U+251c  |- */
21677 #define BOX_134  "\342\224\244"  /* U+2524 -|  */
21678 #define BOX_234  "\342\224\254"  /* U+252c -,- */
21679 #define BOX_124  "\342\224\264"  /* U+2534 -'- */
21680 #define BOX_1234 "\342\224\274"  /* U+253c -|- */
21681 
21682 /* Draw horizontal line N characters long using unicode box
21683 ** characters
21684 */
print_box_line(int N)21685 static void print_box_line(int N){
21686   const char zDash[] =
21687       BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24
21688       BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24;
21689   const int nDash = sizeof(zDash) - 1;
21690   N *= 3;
21691   while( N>nDash ){
21692     oputz(zDash);
21693     N -= nDash;
21694   }
21695   oputf("%.*s", N, zDash);
21696 }
21697 
21698 /*
21699 ** Draw a horizontal separator for a MODE_Box table.
21700 */
print_box_row_separator(ShellState * p,int nArg,const char * zSep1,const char * zSep2,const char * zSep3)21701 static void print_box_row_separator(
21702   ShellState *p,
21703   int nArg,
21704   const char *zSep1,
21705   const char *zSep2,
21706   const char *zSep3
21707 ){
21708   int i;
21709   if( nArg>0 ){
21710     oputz(zSep1);
21711     print_box_line(p->actualWidth[0]+2);
21712     for(i=1; i<nArg; i++){
21713       oputz(zSep2);
21714       print_box_line(p->actualWidth[i]+2);
21715     }
21716     oputz(zSep3);
21717   }
21718   oputz("\n");
21719 }
21720 
21721 /*
21722 ** z[] is a line of text that is to be displayed the .mode box or table or
21723 ** similar tabular formats.  z[] might contain control characters such
21724 ** as \n, \t, \f, or \r.
21725 **
21726 ** Compute characters to display on the first line of z[].  Stop at the
21727 ** first \r, \n, or \f.  Expand \t into spaces.  Return a copy (obtained
21728 ** from malloc()) of that first line, which caller should free sometime.
21729 ** Write anything to display on the next line into *pzTail.  If this is
21730 ** the last line, write a NULL into *pzTail. (*pzTail is not allocated.)
21731 */
translateForDisplayAndDup(const unsigned char * z,const unsigned char ** pzTail,int mxWidth,u8 bWordWrap)21732 static char *translateForDisplayAndDup(
21733   const unsigned char *z,            /* Input text to be transformed */
21734   const unsigned char **pzTail,      /* OUT: Tail of the input for next line */
21735   int mxWidth,                       /* Max width.  0 means no limit */
21736   u8 bWordWrap                       /* If true, avoid breaking mid-word */
21737 ){
21738   int i;                 /* Input bytes consumed */
21739   int j;                 /* Output bytes generated */
21740   int k;                 /* Input bytes to be displayed */
21741   int n;                 /* Output column number */
21742   unsigned char *zOut;   /* Output text */
21743 
21744   if( z==0 ){
21745     *pzTail = 0;
21746     return 0;
21747   }
21748   if( mxWidth<0 ) mxWidth = -mxWidth;
21749   if( mxWidth==0 ) mxWidth = 1000000;
21750   i = j = n = 0;
21751   while( n<mxWidth ){
21752     if( z[i]>=' ' ){
21753       n++;
21754       do{ i++; j++; }while( (z[i]&0xc0)==0x80 );
21755       continue;
21756     }
21757     if( z[i]=='\t' ){
21758       do{
21759         n++;
21760         j++;
21761       }while( (n&7)!=0 && n<mxWidth );
21762       i++;
21763       continue;
21764     }
21765     break;
21766   }
21767   if( n>=mxWidth && bWordWrap  ){
21768     /* Perhaps try to back up to a better place to break the line */
21769     for(k=i; k>i/2; k--){
21770       if( isspace(z[k-1]) ) break;
21771     }
21772     if( k<=i/2 ){
21773       for(k=i; k>i/2; k--){
21774         if( isalnum(z[k-1])!=isalnum(z[k]) && (z[k]&0xc0)!=0x80 ) break;
21775       }
21776     }
21777     if( k<=i/2 ){
21778       k = i;
21779     }else{
21780       i = k;
21781       while( z[i]==' ' ) i++;
21782     }
21783   }else{
21784     k = i;
21785   }
21786   if( n>=mxWidth && z[i]>=' ' ){
21787    *pzTail = &z[i];
21788   }else if( z[i]=='\r' && z[i+1]=='\n' ){
21789     *pzTail = z[i+2] ? &z[i+2] : 0;
21790   }else if( z[i]==0 || z[i+1]==0 ){
21791     *pzTail = 0;
21792   }else{
21793     *pzTail = &z[i+1];
21794   }
21795   zOut = malloc( j+1 );
21796   shell_check_oom(zOut);
21797   i = j = n = 0;
21798   while( i<k ){
21799     if( z[i]>=' ' ){
21800       n++;
21801       do{ zOut[j++] = z[i++]; }while( (z[i]&0xc0)==0x80 );
21802       continue;
21803     }
21804     if( z[i]=='\t' ){
21805       do{
21806         n++;
21807         zOut[j++] = ' ';
21808       }while( (n&7)!=0 && n<mxWidth );
21809       i++;
21810       continue;
21811     }
21812     break;
21813   }
21814   zOut[j] = 0;
21815   return (char*)zOut;
21816 }
21817 
21818 /* Extract the value of the i-th current column for pStmt as an SQL literal
21819 ** value.  Memory is obtained from sqlite3_malloc64() and must be freed by
21820 ** the caller.
21821 */
quoted_column(sqlite3_stmt * pStmt,int i)21822 static char *quoted_column(sqlite3_stmt *pStmt, int i){
21823   switch( sqlite3_column_type(pStmt, i) ){
21824     case SQLITE_NULL: {
21825       return sqlite3_mprintf("NULL");
21826     }
21827     case SQLITE_INTEGER:
21828     case SQLITE_FLOAT: {
21829       return sqlite3_mprintf("%s",sqlite3_column_text(pStmt,i));
21830     }
21831     case SQLITE_TEXT: {
21832       return sqlite3_mprintf("%Q",sqlite3_column_text(pStmt,i));
21833     }
21834     case SQLITE_BLOB: {
21835       int j;
21836       sqlite3_str *pStr = sqlite3_str_new(0);
21837       const unsigned char *a = sqlite3_column_blob(pStmt,i);
21838       int n = sqlite3_column_bytes(pStmt,i);
21839       sqlite3_str_append(pStr, "x'", 2);
21840       for(j=0; j<n; j++){
21841         sqlite3_str_appendf(pStr, "%02x", a[j]);
21842       }
21843       sqlite3_str_append(pStr, "'", 1);
21844       return sqlite3_str_finish(pStr);
21845     }
21846   }
21847   return 0; /* Not reached */
21848 }
21849 
21850 /*
21851 ** Run a prepared statement and output the result in one of the
21852 ** table-oriented formats: MODE_Column, MODE_Markdown, MODE_Table,
21853 ** or MODE_Box.
21854 **
21855 ** This is different from ordinary exec_prepared_stmt() in that
21856 ** it has to run the entire query and gather the results into memory
21857 ** first, in order to determine column widths, before providing
21858 ** any output.
21859 */
exec_prepared_stmt_columnar(ShellState * p,sqlite3_stmt * pStmt)21860 static void exec_prepared_stmt_columnar(
21861   ShellState *p,                        /* Pointer to ShellState */
21862   sqlite3_stmt *pStmt                   /* Statement to run */
21863 ){
21864   sqlite3_int64 nRow = 0;
21865   int nColumn = 0;
21866   char **azData = 0;
21867   sqlite3_int64 nAlloc = 0;
21868   char *abRowDiv = 0;
21869   const unsigned char *uz;
21870   const char *z;
21871   char **azQuoted = 0;
21872   int rc;
21873   sqlite3_int64 i, nData;
21874   int j, nTotal, w, n;
21875   const char *colSep = 0;
21876   const char *rowSep = 0;
21877   const unsigned char **azNextLine = 0;
21878   int bNextLine = 0;
21879   int bMultiLineRowExists = 0;
21880   int bw = p->cmOpts.bWordWrap;
21881   const char *zEmpty = "";
21882   const char *zShowNull = p->nullValue;
21883 
21884   rc = sqlite3_step(pStmt);
21885   if( rc!=SQLITE_ROW ) return;
21886   nColumn = sqlite3_column_count(pStmt);
21887   if( nColumn==0 ) goto columnar_end;
21888   nAlloc = nColumn*4;
21889   if( nAlloc<=0 ) nAlloc = 1;
21890   azData = sqlite3_malloc64( nAlloc*sizeof(char*) );
21891   shell_check_oom(azData);
21892   azNextLine = sqlite3_malloc64( nColumn*sizeof(char*) );
21893   shell_check_oom(azNextLine);
21894   memset((void*)azNextLine, 0, nColumn*sizeof(char*) );
21895   if( p->cmOpts.bQuote ){
21896     azQuoted = sqlite3_malloc64( nColumn*sizeof(char*) );
21897     shell_check_oom(azQuoted);
21898     memset(azQuoted, 0, nColumn*sizeof(char*) );
21899   }
21900   abRowDiv = sqlite3_malloc64( nAlloc/nColumn );
21901   shell_check_oom(abRowDiv);
21902   if( nColumn>p->nWidth ){
21903     p->colWidth = realloc(p->colWidth, (nColumn+1)*2*sizeof(int));
21904     shell_check_oom(p->colWidth);
21905     for(i=p->nWidth; i<nColumn; i++) p->colWidth[i] = 0;
21906     p->nWidth = nColumn;
21907     p->actualWidth = &p->colWidth[nColumn];
21908   }
21909   memset(p->actualWidth, 0, nColumn*sizeof(int));
21910   for(i=0; i<nColumn; i++){
21911     w = p->colWidth[i];
21912     if( w<0 ) w = -w;
21913     p->actualWidth[i] = w;
21914   }
21915   for(i=0; i<nColumn; i++){
21916     const unsigned char *zNotUsed;
21917     int wx = p->colWidth[i];
21918     if( wx==0 ){
21919       wx = p->cmOpts.iWrap;
21920     }
21921     if( wx<0 ) wx = -wx;
21922     uz = (const unsigned char*)sqlite3_column_name(pStmt,i);
21923     if( uz==0 ) uz = (u8*)"";
21924     azData[i] = translateForDisplayAndDup(uz, &zNotUsed, wx, bw);
21925   }
21926   do{
21927     int useNextLine = bNextLine;
21928     bNextLine = 0;
21929     if( (nRow+2)*nColumn >= nAlloc ){
21930       nAlloc *= 2;
21931       azData = sqlite3_realloc64(azData, nAlloc*sizeof(char*));
21932       shell_check_oom(azData);
21933       abRowDiv = sqlite3_realloc64(abRowDiv, nAlloc/nColumn);
21934       shell_check_oom(abRowDiv);
21935     }
21936     abRowDiv[nRow] = 1;
21937     nRow++;
21938     for(i=0; i<nColumn; i++){
21939       int wx = p->colWidth[i];
21940       if( wx==0 ){
21941         wx = p->cmOpts.iWrap;
21942       }
21943       if( wx<0 ) wx = -wx;
21944       if( useNextLine ){
21945         uz = azNextLine[i];
21946         if( uz==0 ) uz = (u8*)zEmpty;
21947       }else if( p->cmOpts.bQuote ){
21948         sqlite3_free(azQuoted[i]);
21949         azQuoted[i] = quoted_column(pStmt,i);
21950         uz = (const unsigned char*)azQuoted[i];
21951       }else{
21952         uz = (const unsigned char*)sqlite3_column_text(pStmt,i);
21953         if( uz==0 ) uz = (u8*)zShowNull;
21954       }
21955       azData[nRow*nColumn + i]
21956         = translateForDisplayAndDup(uz, &azNextLine[i], wx, bw);
21957       if( azNextLine[i] ){
21958         bNextLine = 1;
21959         abRowDiv[nRow-1] = 0;
21960         bMultiLineRowExists = 1;
21961       }
21962     }
21963   }while( bNextLine || sqlite3_step(pStmt)==SQLITE_ROW );
21964   nTotal = nColumn*(nRow+1);
21965   for(i=0; i<nTotal; i++){
21966     z = azData[i];
21967     if( z==0 ) z = (char*)zEmpty;
21968     n = strlenChar(z);
21969     j = i%nColumn;
21970     if( n>p->actualWidth[j] ) p->actualWidth[j] = n;
21971   }
21972   if( seenInterrupt ) goto columnar_end;
21973   switch( p->cMode ){
21974     case MODE_Column: {
21975       colSep = "  ";
21976       rowSep = "\n";
21977       if( p->showHeader ){
21978         for(i=0; i<nColumn; i++){
21979           w = p->actualWidth[i];
21980           if( p->colWidth[i]<0 ) w = -w;
21981           utf8_width_print(w, azData[i]);
21982           fputs(i==nColumn-1?"\n":"  ", p->out);
21983         }
21984         for(i=0; i<nColumn; i++){
21985           print_dashes(p->actualWidth[i]);
21986           fputs(i==nColumn-1?"\n":"  ", p->out);
21987         }
21988       }
21989       break;
21990     }
21991     case MODE_Table: {
21992       colSep = " | ";
21993       rowSep = " |\n";
21994       print_row_separator(p, nColumn, "+");
21995       fputs("| ", p->out);
21996       for(i=0; i<nColumn; i++){
21997         w = p->actualWidth[i];
21998         n = strlenChar(azData[i]);
21999         oputf("%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, "");
22000         oputz(i==nColumn-1?" |\n":" | ");
22001       }
22002       print_row_separator(p, nColumn, "+");
22003       break;
22004     }
22005     case MODE_Markdown: {
22006       colSep = " | ";
22007       rowSep = " |\n";
22008       fputs("| ", p->out);
22009       for(i=0; i<nColumn; i++){
22010         w = p->actualWidth[i];
22011         n = strlenChar(azData[i]);
22012         oputf("%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, "");
22013         oputz(i==nColumn-1?" |\n":" | ");
22014       }
22015       print_row_separator(p, nColumn, "|");
22016       break;
22017     }
22018     case MODE_Box: {
22019       colSep = " " BOX_13 " ";
22020       rowSep = " " BOX_13 "\n";
22021       print_box_row_separator(p, nColumn, BOX_23, BOX_234, BOX_34);
22022       oputz(BOX_13 " ");
22023       for(i=0; i<nColumn; i++){
22024         w = p->actualWidth[i];
22025         n = strlenChar(azData[i]);
22026         oputf("%*s%s%*s%s",
22027               (w-n)/2, "", azData[i], (w-n+1)/2, "",
22028               i==nColumn-1?" "BOX_13"\n":" "BOX_13" ");
22029       }
22030       print_box_row_separator(p, nColumn, BOX_123, BOX_1234, BOX_134);
22031       break;
22032     }
22033   }
22034   for(i=nColumn, j=0; i<nTotal; i++, j++){
22035     if( j==0 && p->cMode!=MODE_Column ){
22036       oputz(p->cMode==MODE_Box?BOX_13" ":"| ");
22037     }
22038     z = azData[i];
22039     if( z==0 ) z = p->nullValue;
22040     w = p->actualWidth[j];
22041     if( p->colWidth[j]<0 ) w = -w;
22042     utf8_width_print(w, z);
22043     if( j==nColumn-1 ){
22044       oputz(rowSep);
22045       if( bMultiLineRowExists && abRowDiv[i/nColumn-1] && i+1<nTotal ){
22046         if( p->cMode==MODE_Table ){
22047           print_row_separator(p, nColumn, "+");
22048         }else if( p->cMode==MODE_Box ){
22049           print_box_row_separator(p, nColumn, BOX_123, BOX_1234, BOX_134);
22050         }else if( p->cMode==MODE_Column ){
22051           oputz("\n");
22052         }
22053       }
22054       j = -1;
22055       if( seenInterrupt ) goto columnar_end;
22056     }else{
22057       oputz(colSep);
22058     }
22059   }
22060   if( p->cMode==MODE_Table ){
22061     print_row_separator(p, nColumn, "+");
22062   }else if( p->cMode==MODE_Box ){
22063     print_box_row_separator(p, nColumn, BOX_12, BOX_124, BOX_14);
22064   }
22065 columnar_end:
22066   if( seenInterrupt ){
22067     oputz("Interrupt\n");
22068   }
22069   nData = (nRow+1)*nColumn;
22070   for(i=0; i<nData; i++){
22071     z = azData[i];
22072     if( z!=zEmpty && z!=zShowNull ) free(azData[i]);
22073   }
22074   sqlite3_free(azData);
22075   sqlite3_free((void*)azNextLine);
22076   sqlite3_free(abRowDiv);
22077   if( azQuoted ){
22078     for(i=0; i<nColumn; i++) sqlite3_free(azQuoted[i]);
22079     sqlite3_free(azQuoted);
22080   }
22081 }
22082 
22083 /*
22084 ** Run a prepared statement
22085 */
exec_prepared_stmt(ShellState * pArg,sqlite3_stmt * pStmt)22086 static void exec_prepared_stmt(
22087   ShellState *pArg,                                /* Pointer to ShellState */
22088   sqlite3_stmt *pStmt                              /* Statement to run */
22089 ){
22090   int rc;
22091   sqlite3_uint64 nRow = 0;
22092 
22093   if( pArg->cMode==MODE_Column
22094    || pArg->cMode==MODE_Table
22095    || pArg->cMode==MODE_Box
22096    || pArg->cMode==MODE_Markdown
22097   ){
22098     exec_prepared_stmt_columnar(pArg, pStmt);
22099     return;
22100   }
22101 
22102   /* perform the first step.  this will tell us if we
22103   ** have a result set or not and how wide it is.
22104   */
22105   rc = sqlite3_step(pStmt);
22106   /* if we have a result set... */
22107   if( SQLITE_ROW == rc ){
22108     /* allocate space for col name ptr, value ptr, and type */
22109     int nCol = sqlite3_column_count(pStmt);
22110     void *pData = sqlite3_malloc64(3*nCol*sizeof(const char*) + 1);
22111     if( !pData ){
22112       shell_out_of_memory();
22113     }else{
22114       char **azCols = (char **)pData;      /* Names of result columns */
22115       char **azVals = &azCols[nCol];       /* Results */
22116       int *aiTypes = (int *)&azVals[nCol]; /* Result types */
22117       int i, x;
22118       assert(sizeof(int) <= sizeof(char *));
22119       /* save off ptrs to column names */
22120       for(i=0; i<nCol; i++){
22121         azCols[i] = (char *)sqlite3_column_name(pStmt, i);
22122       }
22123       do{
22124         nRow++;
22125         /* extract the data and data types */
22126         for(i=0; i<nCol; i++){
22127           aiTypes[i] = x = sqlite3_column_type(pStmt, i);
22128           if( x==SQLITE_BLOB
22129            && pArg
22130            && (pArg->cMode==MODE_Insert || pArg->cMode==MODE_Quote)
22131           ){
22132             azVals[i] = "";
22133           }else{
22134             azVals[i] = (char*)sqlite3_column_text(pStmt, i);
22135           }
22136           if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
22137             rc = SQLITE_NOMEM;
22138             break; /* from for */
22139           }
22140         } /* end for */
22141 
22142         /* if data and types extracted successfully... */
22143         if( SQLITE_ROW == rc ){
22144           /* call the supplied callback with the result row data */
22145           if( shell_callback(pArg, nCol, azVals, azCols, aiTypes) ){
22146             rc = SQLITE_ABORT;
22147           }else{
22148             rc = sqlite3_step(pStmt);
22149           }
22150         }
22151       } while( SQLITE_ROW == rc );
22152       sqlite3_free(pData);
22153       if( pArg->cMode==MODE_Json ){
22154         fputs("]\n", pArg->out);
22155       }else if( pArg->cMode==MODE_Count ){
22156         char zBuf[200];
22157         sqlite3_snprintf(sizeof(zBuf), zBuf, "%llu row%s\n",
22158                          nRow, nRow!=1 ? "s" : "");
22159         printf("%s", zBuf);
22160       }
22161     }
22162   }
22163 }
22164 
22165 #ifndef SQLITE_OMIT_VIRTUALTABLE
22166 /*
22167 ** This function is called to process SQL if the previous shell command
22168 ** was ".expert". It passes the SQL in the second argument directly to
22169 ** the sqlite3expert object.
22170 **
22171 ** If successful, SQLITE_OK is returned. Otherwise, an SQLite error
22172 ** code. In this case, (*pzErr) may be set to point to a buffer containing
22173 ** an English language error message. It is the responsibility of the
22174 ** caller to eventually free this buffer using sqlite3_free().
22175 */
expertHandleSQL(ShellState * pState,const char * zSql,char ** pzErr)22176 static int expertHandleSQL(
22177   ShellState *pState,
22178   const char *zSql,
22179   char **pzErr
22180 ){
22181   assert( pState->expert.pExpert );
22182   assert( pzErr==0 || *pzErr==0 );
22183   return sqlite3_expert_sql(pState->expert.pExpert, zSql, pzErr);
22184 }
22185 
22186 /*
22187 ** This function is called either to silently clean up the object
22188 ** created by the ".expert" command (if bCancel==1), or to generate a
22189 ** report from it and then clean it up (if bCancel==0).
22190 **
22191 ** If successful, SQLITE_OK is returned. Otherwise, an SQLite error
22192 ** code. In this case, (*pzErr) may be set to point to a buffer containing
22193 ** an English language error message. It is the responsibility of the
22194 ** caller to eventually free this buffer using sqlite3_free().
22195 */
expertFinish(ShellState * pState,int bCancel,char ** pzErr)22196 static int expertFinish(
22197   ShellState *pState,
22198   int bCancel,
22199   char **pzErr
22200 ){
22201   int rc = SQLITE_OK;
22202   sqlite3expert *p = pState->expert.pExpert;
22203   assert( p );
22204   assert( bCancel || pzErr==0 || *pzErr==0 );
22205   if( bCancel==0 ){
22206     int bVerbose = pState->expert.bVerbose;
22207 
22208     rc = sqlite3_expert_analyze(p, pzErr);
22209     if( rc==SQLITE_OK ){
22210       int nQuery = sqlite3_expert_count(p);
22211       int i;
22212 
22213       if( bVerbose ){
22214         const char *zCand = sqlite3_expert_report(p,0,EXPERT_REPORT_CANDIDATES);
22215         oputz("-- Candidates -----------------------------\n");
22216         oputf("%s\n", zCand);
22217       }
22218       for(i=0; i<nQuery; i++){
22219         const char *zSql = sqlite3_expert_report(p, i, EXPERT_REPORT_SQL);
22220         const char *zIdx = sqlite3_expert_report(p, i, EXPERT_REPORT_INDEXES);
22221         const char *zEQP = sqlite3_expert_report(p, i, EXPERT_REPORT_PLAN);
22222         if( zIdx==0 ) zIdx = "(no new indexes)\n";
22223         if( bVerbose ){
22224           oputf("-- Query %d --------------------------------\n",i+1);
22225           oputf("%s\n\n", zSql);
22226         }
22227         oputf("%s\n", zIdx);
22228         oputf("%s\n", zEQP);
22229       }
22230     }
22231   }
22232   sqlite3_expert_destroy(p);
22233   pState->expert.pExpert = 0;
22234   return rc;
22235 }
22236 
22237 /*
22238 ** Implementation of ".expert" dot command.
22239 */
expertDotCommand(ShellState * pState,char ** azArg,int nArg)22240 static int expertDotCommand(
22241   ShellState *pState,             /* Current shell tool state */
22242   char **azArg,                   /* Array of arguments passed to dot command */
22243   int nArg                        /* Number of entries in azArg[] */
22244 ){
22245   int rc = SQLITE_OK;
22246   char *zErr = 0;
22247   int i;
22248   int iSample = 0;
22249 
22250   assert( pState->expert.pExpert==0 );
22251   memset(&pState->expert, 0, sizeof(ExpertInfo));
22252 
22253   for(i=1; rc==SQLITE_OK && i<nArg; i++){
22254     char *z = azArg[i];
22255     int n;
22256     if( z[0]=='-' && z[1]=='-' ) z++;
22257     n = strlen30(z);
22258     if( n>=2 && 0==cli_strncmp(z, "-verbose", n) ){
22259       pState->expert.bVerbose = 1;
22260     }
22261     else if( n>=2 && 0==cli_strncmp(z, "-sample", n) ){
22262       if( i==(nArg-1) ){
22263         eputf("option requires an argument: %s\n", z);
22264         rc = SQLITE_ERROR;
22265       }else{
22266         iSample = (int)integerValue(azArg[++i]);
22267         if( iSample<0 || iSample>100 ){
22268           eputf("value out of range: %s\n", azArg[i]);
22269           rc = SQLITE_ERROR;
22270         }
22271       }
22272     }
22273     else{
22274       eputf("unknown option: %s\n", z);
22275       rc = SQLITE_ERROR;
22276     }
22277   }
22278 
22279   if( rc==SQLITE_OK ){
22280     pState->expert.pExpert = sqlite3_expert_new(pState->db, &zErr);
22281     if( pState->expert.pExpert==0 ){
22282       eputf("sqlite3_expert_new: %s\n", zErr ? zErr : "out of memory");
22283       rc = SQLITE_ERROR;
22284     }else{
22285       sqlite3_expert_config(
22286           pState->expert.pExpert, EXPERT_CONFIG_SAMPLE, iSample
22287       );
22288     }
22289   }
22290   sqlite3_free(zErr);
22291 
22292   return rc;
22293 }
22294 #endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
22295 
22296 /*
22297 ** Execute a statement or set of statements.  Print
22298 ** any result rows/columns depending on the current mode
22299 ** set via the supplied callback.
22300 **
22301 ** This is very similar to SQLite's built-in sqlite3_exec()
22302 ** function except it takes a slightly different callback
22303 ** and callback data argument.
22304 */
shell_exec(ShellState * pArg,const char * zSql,char ** pzErrMsg)22305 static int shell_exec(
22306   ShellState *pArg,                         /* Pointer to ShellState */
22307   const char *zSql,                         /* SQL to be evaluated */
22308   char **pzErrMsg                           /* Error msg written here */
22309 ){
22310   sqlite3_stmt *pStmt = NULL;     /* Statement to execute. */
22311   int rc = SQLITE_OK;             /* Return Code */
22312   int rc2;
22313   const char *zLeftover;          /* Tail of unprocessed SQL */
22314   sqlite3 *db = pArg->db;
22315 
22316   if( pzErrMsg ){
22317     *pzErrMsg = NULL;
22318   }
22319 
22320 #ifndef SQLITE_OMIT_VIRTUALTABLE
22321   if( pArg->expert.pExpert ){
22322     rc = expertHandleSQL(pArg, zSql, pzErrMsg);
22323     return expertFinish(pArg, (rc!=SQLITE_OK), pzErrMsg);
22324   }
22325 #endif
22326 
22327   while( zSql[0] && (SQLITE_OK == rc) ){
22328     static const char *zStmtSql;
22329     rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
22330     if( SQLITE_OK != rc ){
22331       if( pzErrMsg ){
22332         *pzErrMsg = save_err_msg(db, "in prepare", rc, zSql);
22333       }
22334     }else{
22335       if( !pStmt ){
22336         /* this happens for a comment or white-space */
22337         zSql = zLeftover;
22338         while( IsSpace(zSql[0]) ) zSql++;
22339         continue;
22340       }
22341       zStmtSql = sqlite3_sql(pStmt);
22342       if( zStmtSql==0 ) zStmtSql = "";
22343       while( IsSpace(zStmtSql[0]) ) zStmtSql++;
22344 
22345       /* save off the prepared statement handle and reset row count */
22346       if( pArg ){
22347         pArg->pStmt = pStmt;
22348         pArg->cnt = 0;
22349       }
22350 
22351       /* Show the EXPLAIN QUERY PLAN if .eqp is on */
22352       if( pArg && pArg->autoEQP && sqlite3_stmt_isexplain(pStmt)==0 ){
22353         sqlite3_stmt *pExplain;
22354         int triggerEQP = 0;
22355         disable_debug_trace_modes();
22356         sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, -1, &triggerEQP);
22357         if( pArg->autoEQP>=AUTOEQP_trigger ){
22358           sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 1, 0);
22359         }
22360         pExplain = pStmt;
22361         sqlite3_reset(pExplain);
22362         rc = sqlite3_stmt_explain(pExplain, 2);
22363         if( rc==SQLITE_OK ){
22364           while( sqlite3_step(pExplain)==SQLITE_ROW ){
22365             const char *zEQPLine = (const char*)sqlite3_column_text(pExplain,3);
22366             int iEqpId = sqlite3_column_int(pExplain, 0);
22367             int iParentId = sqlite3_column_int(pExplain, 1);
22368             if( zEQPLine==0 ) zEQPLine = "";
22369             if( zEQPLine[0]=='-' ) eqp_render(pArg, 0);
22370             eqp_append(pArg, iEqpId, iParentId, zEQPLine);
22371           }
22372           eqp_render(pArg, 0);
22373         }
22374         if( pArg->autoEQP>=AUTOEQP_full ){
22375           /* Also do an EXPLAIN for ".eqp full" mode */
22376           sqlite3_reset(pExplain);
22377           rc = sqlite3_stmt_explain(pExplain, 1);
22378           if( rc==SQLITE_OK ){
22379             pArg->cMode = MODE_Explain;
22380             assert( sqlite3_stmt_isexplain(pExplain)==1 );
22381             explain_data_prepare(pArg, pExplain);
22382             exec_prepared_stmt(pArg, pExplain);
22383             explain_data_delete(pArg);
22384           }
22385         }
22386         if( pArg->autoEQP>=AUTOEQP_trigger && triggerEQP==0 ){
22387           sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 0, 0);
22388         }
22389         sqlite3_reset(pStmt);
22390         sqlite3_stmt_explain(pStmt, 0);
22391         restore_debug_trace_modes();
22392       }
22393 
22394       if( pArg ){
22395         int bIsExplain = (sqlite3_stmt_isexplain(pStmt)==1);
22396         pArg->cMode = pArg->mode;
22397         if( pArg->autoExplain ){
22398           if( bIsExplain ){
22399             pArg->cMode = MODE_Explain;
22400           }
22401           if( sqlite3_stmt_isexplain(pStmt)==2 ){
22402             pArg->cMode = MODE_EQP;
22403           }
22404         }
22405 
22406         /* If the shell is currently in ".explain" mode, gather the extra
22407         ** data required to add indents to the output.*/
22408         if( pArg->cMode==MODE_Explain && bIsExplain ){
22409           explain_data_prepare(pArg, pStmt);
22410         }
22411       }
22412 
22413       bind_prepared_stmt(pArg, pStmt);
22414       exec_prepared_stmt(pArg, pStmt);
22415       explain_data_delete(pArg);
22416       eqp_render(pArg, 0);
22417 
22418       /* print usage stats if stats on */
22419       if( pArg && pArg->statsOn ){
22420         display_stats(db, pArg, 0);
22421       }
22422 
22423       /* print loop-counters if required */
22424       if( pArg && pArg->scanstatsOn ){
22425         display_scanstats(db, pArg);
22426       }
22427 
22428       /* Finalize the statement just executed. If this fails, save a
22429       ** copy of the error message. Otherwise, set zSql to point to the
22430       ** next statement to execute. */
22431       rc2 = sqlite3_finalize(pStmt);
22432       if( rc!=SQLITE_NOMEM ) rc = rc2;
22433       if( rc==SQLITE_OK ){
22434         zSql = zLeftover;
22435         while( IsSpace(zSql[0]) ) zSql++;
22436       }else if( pzErrMsg ){
22437         *pzErrMsg = save_err_msg(db, "stepping", rc, 0);
22438       }
22439 
22440       /* clear saved stmt handle */
22441       if( pArg ){
22442         pArg->pStmt = NULL;
22443       }
22444     }
22445   } /* end while */
22446 
22447   return rc;
22448 }
22449 
22450 /*
22451 ** Release memory previously allocated by tableColumnList().
22452 */
freeColumnList(char ** azCol)22453 static void freeColumnList(char **azCol){
22454   int i;
22455   for(i=1; azCol[i]; i++){
22456     sqlite3_free(azCol[i]);
22457   }
22458   /* azCol[0] is a static string */
22459   sqlite3_free(azCol);
22460 }
22461 
22462 /*
22463 ** Return a list of pointers to strings which are the names of all
22464 ** columns in table zTab.   The memory to hold the names is dynamically
22465 ** allocated and must be released by the caller using a subsequent call
22466 ** to freeColumnList().
22467 **
22468 ** The azCol[0] entry is usually NULL.  However, if zTab contains a rowid
22469 ** value that needs to be preserved, then azCol[0] is filled in with the
22470 ** name of the rowid column.
22471 **
22472 ** The first regular column in the table is azCol[1].  The list is terminated
22473 ** by an entry with azCol[i]==0.
22474 */
tableColumnList(ShellState * p,const char * zTab)22475 static char **tableColumnList(ShellState *p, const char *zTab){
22476   char **azCol = 0;
22477   sqlite3_stmt *pStmt;
22478   char *zSql;
22479   int nCol = 0;
22480   int nAlloc = 0;
22481   int nPK = 0;       /* Number of PRIMARY KEY columns seen */
22482   int isIPK = 0;     /* True if one PRIMARY KEY column of type INTEGER */
22483   int preserveRowid = ShellHasFlag(p, SHFLG_PreserveRowid);
22484   int rc;
22485 
22486   zSql = sqlite3_mprintf("PRAGMA table_info=%Q", zTab);
22487   shell_check_oom(zSql);
22488   rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
22489   sqlite3_free(zSql);
22490   if( rc ) return 0;
22491   while( sqlite3_step(pStmt)==SQLITE_ROW ){
22492     if( nCol>=nAlloc-2 ){
22493       nAlloc = nAlloc*2 + nCol + 10;
22494       azCol = sqlite3_realloc(azCol, nAlloc*sizeof(azCol[0]));
22495       shell_check_oom(azCol);
22496     }
22497     azCol[++nCol] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 1));
22498     shell_check_oom(azCol[nCol]);
22499     if( sqlite3_column_int(pStmt, 5) ){
22500       nPK++;
22501       if( nPK==1
22502        && sqlite3_stricmp((const char*)sqlite3_column_text(pStmt,2),
22503                           "INTEGER")==0
22504       ){
22505         isIPK = 1;
22506       }else{
22507         isIPK = 0;
22508       }
22509     }
22510   }
22511   sqlite3_finalize(pStmt);
22512   if( azCol==0 ) return 0;
22513   azCol[0] = 0;
22514   azCol[nCol+1] = 0;
22515 
22516   /* The decision of whether or not a rowid really needs to be preserved
22517   ** is tricky.  We never need to preserve a rowid for a WITHOUT ROWID table
22518   ** or a table with an INTEGER PRIMARY KEY.  We are unable to preserve
22519   ** rowids on tables where the rowid is inaccessible because there are other
22520   ** columns in the table named "rowid", "_rowid_", and "oid".
22521   */
22522   if( preserveRowid && isIPK ){
22523     /* If a single PRIMARY KEY column with type INTEGER was seen, then it
22524     ** might be an alias for the ROWID.  But it might also be a WITHOUT ROWID
22525     ** table or a INTEGER PRIMARY KEY DESC column, neither of which are
22526     ** ROWID aliases.  To distinguish these cases, check to see if
22527     ** there is a "pk" entry in "PRAGMA index_list".  There will be
22528     ** no "pk" index if the PRIMARY KEY really is an alias for the ROWID.
22529     */
22530     zSql = sqlite3_mprintf("SELECT 1 FROM pragma_index_list(%Q)"
22531                            " WHERE origin='pk'", zTab);
22532     shell_check_oom(zSql);
22533     rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
22534     sqlite3_free(zSql);
22535     if( rc ){
22536       freeColumnList(azCol);
22537       return 0;
22538     }
22539     rc = sqlite3_step(pStmt);
22540     sqlite3_finalize(pStmt);
22541     preserveRowid = rc==SQLITE_ROW;
22542   }
22543   if( preserveRowid ){
22544     /* Only preserve the rowid if we can find a name to use for the
22545     ** rowid */
22546     static char *azRowid[] = { "rowid", "_rowid_", "oid" };
22547     int i, j;
22548     for(j=0; j<3; j++){
22549       for(i=1; i<=nCol; i++){
22550         if( sqlite3_stricmp(azRowid[j],azCol[i])==0 ) break;
22551       }
22552       if( i>nCol ){
22553         /* At this point, we know that azRowid[j] is not the name of any
22554         ** ordinary column in the table.  Verify that azRowid[j] is a valid
22555         ** name for the rowid before adding it to azCol[0].  WITHOUT ROWID
22556         ** tables will fail this last check */
22557         rc = sqlite3_table_column_metadata(p->db,0,zTab,azRowid[j],0,0,0,0,0);
22558         if( rc==SQLITE_OK ) azCol[0] = azRowid[j];
22559         break;
22560       }
22561     }
22562   }
22563   return azCol;
22564 }
22565 
22566 /*
22567 ** Toggle the reverse_unordered_selects setting.
22568 */
toggleSelectOrder(sqlite3 * db)22569 static void toggleSelectOrder(sqlite3 *db){
22570   sqlite3_stmt *pStmt = 0;
22571   int iSetting = 0;
22572   char zStmt[100];
22573   sqlite3_prepare_v2(db, "PRAGMA reverse_unordered_selects", -1, &pStmt, 0);
22574   if( sqlite3_step(pStmt)==SQLITE_ROW ){
22575     iSetting = sqlite3_column_int(pStmt, 0);
22576   }
22577   sqlite3_finalize(pStmt);
22578   sqlite3_snprintf(sizeof(zStmt), zStmt,
22579        "PRAGMA reverse_unordered_selects(%d)", !iSetting);
22580   sqlite3_exec(db, zStmt, 0, 0, 0);
22581 }
22582 
22583 /*
22584 ** This is a different callback routine used for dumping the database.
22585 ** Each row received by this callback consists of a table name,
22586 ** the table type ("index" or "table") and SQL to create the table.
22587 ** This routine should print text sufficient to recreate the table.
22588 */
dump_callback(void * pArg,int nArg,char ** azArg,char ** azNotUsed)22589 static int dump_callback(void *pArg, int nArg, char **azArg, char **azNotUsed){
22590   int rc;
22591   const char *zTable;
22592   const char *zType;
22593   const char *zSql;
22594   ShellState *p = (ShellState *)pArg;
22595   int dataOnly;
22596   int noSys;
22597 
22598   UNUSED_PARAMETER(azNotUsed);
22599   if( nArg!=3 || azArg==0 ) return 0;
22600   zTable = azArg[0];
22601   zType = azArg[1];
22602   zSql = azArg[2];
22603   if( zTable==0 ) return 0;
22604   if( zType==0 ) return 0;
22605   dataOnly = (p->shellFlgs & SHFLG_DumpDataOnly)!=0;
22606   noSys    = (p->shellFlgs & SHFLG_DumpNoSys)!=0;
22607 
22608   if( cli_strcmp(zTable, "sqlite_sequence")==0 && !noSys ){
22609     if( !dataOnly ) oputz("DELETE FROM sqlite_sequence;\n");
22610   }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 && !noSys ){
22611     if( !dataOnly ) oputz("ANALYZE sqlite_schema;\n");
22612   }else if( cli_strncmp(zTable, "sqlite_", 7)==0 ){
22613     return 0;
22614   }else if( dataOnly ){
22615     /* no-op */
22616   }else if( cli_strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
22617     char *zIns;
22618     if( !p->writableSchema ){
22619       oputz("PRAGMA writable_schema=ON;\n");
22620       p->writableSchema = 1;
22621     }
22622     zIns = sqlite3_mprintf(
22623        "INSERT INTO sqlite_schema(type,name,tbl_name,rootpage,sql)"
22624        "VALUES('table','%q','%q',0,'%q');",
22625        zTable, zTable, zSql);
22626     shell_check_oom(zIns);
22627     oputf("%s\n", zIns);
22628     sqlite3_free(zIns);
22629     return 0;
22630   }else{
22631     printSchemaLine(zSql, ";\n");
22632   }
22633 
22634   if( cli_strcmp(zType, "table")==0 ){
22635     ShellText sSelect;
22636     ShellText sTable;
22637     char **azCol;
22638     int i;
22639     char *savedDestTable;
22640     int savedMode;
22641 
22642     azCol = tableColumnList(p, zTable);
22643     if( azCol==0 ){
22644       p->nErr++;
22645       return 0;
22646     }
22647 
22648     /* Always quote the table name, even if it appears to be pure ascii,
22649     ** in case it is a keyword. Ex:  INSERT INTO "table" ... */
22650     initText(&sTable);
22651     appendText(&sTable, zTable, quoteChar(zTable));
22652     /* If preserving the rowid, add a column list after the table name.
22653     ** In other words:  "INSERT INTO tab(rowid,a,b,c,...) VALUES(...)"
22654     ** instead of the usual "INSERT INTO tab VALUES(...)".
22655     */
22656     if( azCol[0] ){
22657       appendText(&sTable, "(", 0);
22658       appendText(&sTable, azCol[0], 0);
22659       for(i=1; azCol[i]; i++){
22660         appendText(&sTable, ",", 0);
22661         appendText(&sTable, azCol[i], quoteChar(azCol[i]));
22662       }
22663       appendText(&sTable, ")", 0);
22664     }
22665 
22666     /* Build an appropriate SELECT statement */
22667     initText(&sSelect);
22668     appendText(&sSelect, "SELECT ", 0);
22669     if( azCol[0] ){
22670       appendText(&sSelect, azCol[0], 0);
22671       appendText(&sSelect, ",", 0);
22672     }
22673     for(i=1; azCol[i]; i++){
22674       appendText(&sSelect, azCol[i], quoteChar(azCol[i]));
22675       if( azCol[i+1] ){
22676         appendText(&sSelect, ",", 0);
22677       }
22678     }
22679     freeColumnList(azCol);
22680     appendText(&sSelect, " FROM ", 0);
22681     appendText(&sSelect, zTable, quoteChar(zTable));
22682 
22683     savedDestTable = p->zDestTable;
22684     savedMode = p->mode;
22685     p->zDestTable = sTable.z;
22686     p->mode = p->cMode = MODE_Insert;
22687     rc = shell_exec(p, sSelect.z, 0);
22688     if( (rc&0xff)==SQLITE_CORRUPT ){
22689       oputz("/****** CORRUPTION ERROR *******/\n");
22690       toggleSelectOrder(p->db);
22691       shell_exec(p, sSelect.z, 0);
22692       toggleSelectOrder(p->db);
22693     }
22694     p->zDestTable = savedDestTable;
22695     p->mode = savedMode;
22696     freeText(&sTable);
22697     freeText(&sSelect);
22698     if( rc ) p->nErr++;
22699   }
22700   return 0;
22701 }
22702 
22703 /*
22704 ** Run zQuery.  Use dump_callback() as the callback routine so that
22705 ** the contents of the query are output as SQL statements.
22706 **
22707 ** If we get a SQLITE_CORRUPT error, rerun the query after appending
22708 ** "ORDER BY rowid DESC" to the end.
22709 */
run_schema_dump_query(ShellState * p,const char * zQuery)22710 static int run_schema_dump_query(
22711   ShellState *p,
22712   const char *zQuery
22713 ){
22714   int rc;
22715   char *zErr = 0;
22716   rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
22717   if( rc==SQLITE_CORRUPT ){
22718     char *zQ2;
22719     int len = strlen30(zQuery);
22720     oputz("/****** CORRUPTION ERROR *******/\n");
22721     if( zErr ){
22722       oputf("/****** %s ******/\n", zErr);
22723       sqlite3_free(zErr);
22724       zErr = 0;
22725     }
22726     zQ2 = malloc( len+100 );
22727     if( zQ2==0 ) return rc;
22728     sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
22729     rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
22730     if( rc ){
22731       oputf("/****** ERROR: %s ******/\n", zErr);
22732     }else{
22733       rc = SQLITE_CORRUPT;
22734     }
22735     sqlite3_free(zErr);
22736     free(zQ2);
22737   }
22738   return rc;
22739 }
22740 
22741 /*
22742 ** Text of help messages.
22743 **
22744 ** The help text for each individual command begins with a line that starts
22745 ** with ".".  Subsequent lines are supplemental information.
22746 **
22747 ** There must be two or more spaces between the end of the command and the
22748 ** start of the description of what that command does.
22749 */
22750 static const char *(azHelp[]) = {
22751 #if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE) \
22752   && !defined(SQLITE_SHELL_FIDDLE)
22753   ".archive ...             Manage SQL archives",
22754   "   Each command must have exactly one of the following options:",
22755   "     -c, --create               Create a new archive",
22756   "     -u, --update               Add or update files with changed mtime",
22757   "     -i, --insert               Like -u but always add even if unchanged",
22758   "     -r, --remove               Remove files from archive",
22759   "     -t, --list                 List contents of archive",
22760   "     -x, --extract              Extract files from archive",
22761   "   Optional arguments:",
22762   "     -v, --verbose              Print each filename as it is processed",
22763   "     -f FILE, --file FILE       Use archive FILE (default is current db)",
22764   "     -a FILE, --append FILE     Open FILE using the apndvfs VFS",
22765   "     -C DIR, --directory DIR    Read/extract files from directory DIR",
22766   "     -g, --glob                 Use glob matching for names in archive",
22767   "     -n, --dryrun               Show the SQL that would have occurred",
22768   "   Examples:",
22769   "     .ar -cf ARCHIVE foo bar  # Create ARCHIVE from files foo and bar",
22770   "     .ar -tf ARCHIVE          # List members of ARCHIVE",
22771   "     .ar -xvf ARCHIVE         # Verbosely extract files from ARCHIVE",
22772   "   See also:",
22773   "      http://sqlite.org/cli.html#sqlite_archive_support",
22774 #endif
22775 #ifndef SQLITE_OMIT_AUTHORIZATION
22776   ".auth ON|OFF             Show authorizer callbacks",
22777 #endif
22778 #ifndef SQLITE_SHELL_FIDDLE
22779   ".backup ?DB? FILE        Backup DB (default \"main\") to FILE",
22780   "   Options:",
22781   "       --append            Use the appendvfs",
22782   "       --async             Write to FILE without journal and fsync()",
22783 #endif
22784   ".bail on|off             Stop after hitting an error.  Default OFF",
22785 #ifndef SQLITE_SHELL_FIDDLE
22786   ".cd DIRECTORY            Change the working directory to DIRECTORY",
22787 #endif
22788   ".changes on|off          Show number of rows changed by SQL",
22789 #ifndef SQLITE_SHELL_FIDDLE
22790   ".check GLOB              Fail if output since .testcase does not match",
22791   ".clone NEWDB             Clone data into NEWDB from the existing database",
22792 #endif
22793   ".connection [close] [#]  Open or close an auxiliary database connection",
22794 #if defined(_WIN32) || defined(WIN32)
22795   ".crnl on|off             Translate \\n to \\r\\n.  Default ON",
22796 #endif
22797   ".databases               List names and files of attached databases",
22798   ".dbconfig ?op? ?val?     List or change sqlite3_db_config() options",
22799 #if SQLITE_SHELL_HAVE_RECOVER
22800   ".dbinfo ?DB?             Show status information about the database",
22801 #endif
22802   ".dump ?OBJECTS?          Render database content as SQL",
22803   "   Options:",
22804   "     --data-only            Output only INSERT statements",
22805   "     --newlines             Allow unescaped newline characters in output",
22806   "     --nosys                Omit system tables (ex: \"sqlite_stat1\")",
22807   "     --preserve-rowids      Include ROWID values in the output",
22808   "   OBJECTS is a LIKE pattern for tables, indexes, triggers or views to dump",
22809   "   Additional LIKE patterns can be given in subsequent arguments",
22810   ".echo on|off             Turn command echo on or off",
22811   ".eqp on|off|full|...     Enable or disable automatic EXPLAIN QUERY PLAN",
22812   "   Other Modes:",
22813 #ifdef SQLITE_DEBUG
22814   "      test                  Show raw EXPLAIN QUERY PLAN output",
22815   "      trace                 Like \"full\" but enable \"PRAGMA vdbe_trace\"",
22816 #endif
22817   "      trigger               Like \"full\" but also show trigger bytecode",
22818 #ifndef SQLITE_SHELL_FIDDLE
22819   ".excel                   Display the output of next command in spreadsheet",
22820   "   --bom                   Put a UTF8 byte-order mark on intermediate file",
22821 #endif
22822 #ifndef SQLITE_SHELL_FIDDLE
22823   ".exit ?CODE?             Exit this program with return-code CODE",
22824 #endif
22825   ".expert                  EXPERIMENTAL. Suggest indexes for queries",
22826   ".explain ?on|off|auto?   Change the EXPLAIN formatting mode.  Default: auto",
22827   ".filectrl CMD ...        Run various sqlite3_file_control() operations",
22828   "   --schema SCHEMA         Use SCHEMA instead of \"main\"",
22829   "   --help                  Show CMD details",
22830   ".fullschema ?--indent?   Show schema and the content of sqlite_stat tables",
22831   ".headers on|off          Turn display of headers on or off",
22832   ".help ?-all? ?PATTERN?   Show help text for PATTERN",
22833 #ifndef SQLITE_SHELL_FIDDLE
22834   ".import FILE TABLE       Import data from FILE into TABLE",
22835   "   Options:",
22836   "     --ascii               Use \\037 and \\036 as column and row separators",
22837   "     --csv                 Use , and \\n as column and row separators",
22838   "     --skip N              Skip the first N rows of input",
22839   "     --schema S            Target table to be S.TABLE",
22840   "     -v                    \"Verbose\" - increase auxiliary output",
22841   "   Notes:",
22842   "     *  If TABLE does not exist, it is created.  The first row of input",
22843   "        determines the column names.",
22844   "     *  If neither --csv or --ascii are used, the input mode is derived",
22845   "        from the \".mode\" output mode",
22846   "     *  If FILE begins with \"|\" then it is a command that generates the",
22847   "        input text.",
22848 #endif
22849 #ifndef SQLITE_OMIT_TEST_CONTROL
22850   ",imposter INDEX TABLE    Create imposter table TABLE on index INDEX",
22851 #endif
22852   ".indexes ?TABLE?         Show names of indexes",
22853   "                           If TABLE is specified, only show indexes for",
22854   "                           tables matching TABLE using the LIKE operator.",
22855   ".intck ?STEPS_PER_UNLOCK?  Run an incremental integrity check on the db",
22856 #ifdef SQLITE_ENABLE_IOTRACE
22857   ",iotrace FILE            Enable I/O diagnostic logging to FILE",
22858 #endif
22859   ".limit ?LIMIT? ?VAL?     Display or change the value of an SQLITE_LIMIT",
22860   ".lint OPTIONS            Report potential schema issues.",
22861   "     Options:",
22862   "        fkey-indexes     Find missing foreign key indexes",
22863 #if !defined(SQLITE_OMIT_LOAD_EXTENSION) && !defined(SQLITE_SHELL_FIDDLE)
22864   ".load FILE ?ENTRY?       Load an extension library",
22865 #endif
22866 #if !defined(SQLITE_SHELL_FIDDLE)
22867   ".log FILE|on|off         Turn logging on or off.  FILE can be stderr/stdout",
22868 #else
22869   ".log on|off              Turn logging on or off.",
22870 #endif
22871   ".mode MODE ?OPTIONS?     Set output mode",
22872   "   MODE is one of:",
22873   "     ascii       Columns/rows delimited by 0x1F and 0x1E",
22874   "     box         Tables using unicode box-drawing characters",
22875   "     csv         Comma-separated values",
22876   "     column      Output in columns.  (See .width)",
22877   "     html        HTML <table> code",
22878   "     insert      SQL insert statements for TABLE",
22879   "     json        Results in a JSON array",
22880   "     line        One value per line",
22881   "     list        Values delimited by \"|\"",
22882   "     markdown    Markdown table format",
22883   "     qbox        Shorthand for \"box --wrap 60 --quote\"",
22884   "     quote       Escape answers as for SQL",
22885   "     table       ASCII-art table",
22886   "     tabs        Tab-separated values",
22887   "     tcl         TCL list elements",
22888   "   OPTIONS: (for columnar modes or insert mode):",
22889   "     --wrap N       Wrap output lines to no longer than N characters",
22890   "     --wordwrap B   Wrap or not at word boundaries per B (on/off)",
22891   "     --ww           Shorthand for \"--wordwrap 1\"",
22892   "     --quote        Quote output text as SQL literals",
22893   "     --noquote      Do not quote output text",
22894   "     TABLE          The name of SQL table used for \"insert\" mode",
22895 #ifndef SQLITE_SHELL_FIDDLE
22896   ".nonce STRING            Suspend safe mode for one command if nonce matches",
22897 #endif
22898   ".nullvalue STRING        Use STRING in place of NULL values",
22899 #ifndef SQLITE_SHELL_FIDDLE
22900   ".once ?OPTIONS? ?FILE?   Output for the next SQL command only to FILE",
22901   "     If FILE begins with '|' then open as a pipe",
22902   "       --bom  Put a UTF8 byte-order mark at the beginning",
22903   "       -e     Send output to the system text editor",
22904   "       -x     Send output as CSV to a spreadsheet (same as \".excel\")",
22905   /* Note that .open is (partially) available in WASM builds but is
22906   ** currently only intended to be used by the fiddle tool, not
22907   ** end users, so is "undocumented." */
22908   ".open ?OPTIONS? ?FILE?   Close existing database and reopen FILE",
22909   "     Options:",
22910   "        --append        Use appendvfs to append database to the end of FILE",
22911 #endif
22912 #ifndef SQLITE_OMIT_DESERIALIZE
22913   "        --deserialize   Load into memory using sqlite3_deserialize()",
22914   "        --hexdb         Load the output of \"dbtotxt\" as an in-memory db",
22915   "        --maxsize N     Maximum size for --hexdb or --deserialized database",
22916 #endif
22917   "        --new           Initialize FILE to an empty database",
22918   "        --nofollow      Do not follow symbolic links",
22919   "        --readonly      Open FILE readonly",
22920   "        --zip           FILE is a ZIP archive",
22921 #ifndef SQLITE_SHELL_FIDDLE
22922   ".output ?FILE?           Send output to FILE or stdout if FILE is omitted",
22923   "   If FILE begins with '|' then open it as a pipe.",
22924   "   Options:",
22925   "     --bom                 Prefix output with a UTF8 byte-order mark",
22926   "     -e                    Send output to the system text editor",
22927   "     -x                    Send output as CSV to a spreadsheet",
22928 #endif
22929   ".parameter CMD ...       Manage SQL parameter bindings",
22930   "   clear                   Erase all bindings",
22931   "   init                    Initialize the TEMP table that holds bindings",
22932   "   list                    List the current parameter bindings",
22933   "   set PARAMETER VALUE     Given SQL parameter PARAMETER a value of VALUE",
22934   "                           PARAMETER should start with one of: $ : @ ?",
22935   "   unset PARAMETER         Remove PARAMETER from the binding table",
22936   ".print STRING...         Print literal STRING",
22937 #ifndef SQLITE_OMIT_PROGRESS_CALLBACK
22938   ".progress N              Invoke progress handler after every N opcodes",
22939   "   --limit N                 Interrupt after N progress callbacks",
22940   "   --once                    Do no more than one progress interrupt",
22941   "   --quiet|-q                No output except at interrupts",
22942   "   --reset                   Reset the count for each input and interrupt",
22943 #endif
22944   ".prompt MAIN CONTINUE    Replace the standard prompts",
22945 #ifndef SQLITE_SHELL_FIDDLE
22946   ".quit                    Stop interpreting input stream, exit if primary.",
22947   ".read FILE               Read input from FILE or command output",
22948   "    If FILE begins with \"|\", it is a command that generates the input.",
22949 #endif
22950 #if SQLITE_SHELL_HAVE_RECOVER
22951   ".recover                 Recover as much data as possible from corrupt db.",
22952   "   --ignore-freelist        Ignore pages that appear to be on db freelist",
22953   "   --lost-and-found TABLE   Alternative name for the lost-and-found table",
22954   "   --no-rowids              Do not attempt to recover rowid values",
22955   "                            that are not also INTEGER PRIMARY KEYs",
22956 #endif
22957 #ifndef SQLITE_SHELL_FIDDLE
22958   ".restore ?DB? FILE       Restore content of DB (default \"main\") from FILE",
22959   ".save ?OPTIONS? FILE     Write database to FILE (an alias for .backup ...)",
22960 #endif
22961   ".scanstats on|off|est    Turn sqlite3_stmt_scanstatus() metrics on or off",
22962   ".schema ?PATTERN?        Show the CREATE statements matching PATTERN",
22963   "   Options:",
22964   "      --indent             Try to pretty-print the schema",
22965   "      --nosys              Omit objects whose names start with \"sqlite_\"",
22966   ",selftest ?OPTIONS?      Run tests defined in the SELFTEST table",
22967   "    Options:",
22968   "       --init               Create a new SELFTEST table",
22969   "       -v                   Verbose output",
22970   ".separator COL ?ROW?     Change the column and row separators",
22971 #if defined(SQLITE_ENABLE_SESSION)
22972   ".session ?NAME? CMD ...  Create or control sessions",
22973   "   Subcommands:",
22974   "     attach TABLE             Attach TABLE",
22975   "     changeset FILE           Write a changeset into FILE",
22976   "     close                    Close one session",
22977   "     enable ?BOOLEAN?         Set or query the enable bit",
22978   "     filter GLOB...           Reject tables matching GLOBs",
22979   "     indirect ?BOOLEAN?       Mark or query the indirect status",
22980   "     isempty                  Query whether the session is empty",
22981   "     list                     List currently open session names",
22982   "     open DB NAME             Open a new session on DB",
22983   "     patchset FILE            Write a patchset into FILE",
22984   "   If ?NAME? is omitted, the first defined session is used.",
22985 #endif
22986   ".sha3sum ...             Compute a SHA3 hash of database content",
22987   "    Options:",
22988   "      --schema              Also hash the sqlite_schema table",
22989   "      --sha3-224            Use the sha3-224 algorithm",
22990   "      --sha3-256            Use the sha3-256 algorithm (default)",
22991   "      --sha3-384            Use the sha3-384 algorithm",
22992   "      --sha3-512            Use the sha3-512 algorithm",
22993   "    Any other argument is a LIKE pattern for tables to hash",
22994 #if !defined(SQLITE_NOHAVE_SYSTEM) && !defined(SQLITE_SHELL_FIDDLE)
22995   ".shell CMD ARGS...       Run CMD ARGS... in a system shell",
22996 #endif
22997   ".show                    Show the current values for various settings",
22998   ".stats ?ARG?             Show stats or turn stats on or off",
22999   "   off                      Turn off automatic stat display",
23000   "   on                       Turn on automatic stat display",
23001   "   stmt                     Show statement stats",
23002   "   vmstep                   Show the virtual machine step count only",
23003 #if !defined(SQLITE_NOHAVE_SYSTEM) && !defined(SQLITE_SHELL_FIDDLE)
23004   ".system CMD ARGS...      Run CMD ARGS... in a system shell",
23005 #endif
23006   ".tables ?TABLE?          List names of tables matching LIKE pattern TABLE",
23007 #ifndef SQLITE_SHELL_FIDDLE
23008   ",testcase NAME           Begin redirecting output to 'testcase-out.txt'",
23009 #endif
23010   ",testctrl CMD ...        Run various sqlite3_test_control() operations",
23011   "                           Run \".testctrl\" with no arguments for details",
23012   ".timeout MS              Try opening locked tables for MS milliseconds",
23013   ".timer on|off            Turn SQL timer on or off",
23014 #ifndef SQLITE_OMIT_TRACE
23015   ".trace ?OPTIONS?         Output each SQL statement as it is run",
23016   "    FILE                    Send output to FILE",
23017   "    stdout                  Send output to stdout",
23018   "    stderr                  Send output to stderr",
23019   "    off                     Disable tracing",
23020   "    --expanded              Expand query parameters",
23021 #ifdef SQLITE_ENABLE_NORMALIZE
23022   "    --normalized            Normal the SQL statements",
23023 #endif
23024   "    --plain                 Show SQL as it is input",
23025   "    --stmt                  Trace statement execution (SQLITE_TRACE_STMT)",
23026   "    --profile               Profile statements (SQLITE_TRACE_PROFILE)",
23027   "    --row                   Trace each row (SQLITE_TRACE_ROW)",
23028   "    --close                 Trace connection close (SQLITE_TRACE_CLOSE)",
23029 #endif /* SQLITE_OMIT_TRACE */
23030 #ifdef SQLITE_DEBUG
23031   ".unmodule NAME ...       Unregister virtual table modules",
23032   "    --allexcept             Unregister everything except those named",
23033 #endif
23034   ".version                 Show source, library and compiler versions",
23035   ".vfsinfo ?AUX?           Information about the top-level VFS",
23036   ".vfslist                 List all available VFSes",
23037   ".vfsname ?AUX?           Print the name of the VFS stack",
23038   ".width NUM1 NUM2 ...     Set minimum column widths for columnar output",
23039   "     Negative values right-justify",
23040 };
23041 
23042 /*
23043 ** Output help text.
23044 **
23045 ** zPattern describes the set of commands for which help text is provided.
23046 ** If zPattern is NULL, then show all commands, but only give a one-line
23047 ** description of each.
23048 **
23049 ** Return the number of matches.
23050 */
showHelp(FILE * out,const char * zPattern)23051 static int showHelp(FILE *out, const char *zPattern){
23052   int i = 0;
23053   int j = 0;
23054   int n = 0;
23055   char *zPat;
23056   if( zPattern==0
23057    || zPattern[0]=='0'
23058    || cli_strcmp(zPattern,"-a")==0
23059    || cli_strcmp(zPattern,"-all")==0
23060    || cli_strcmp(zPattern,"--all")==0
23061   ){
23062     enum HelpWanted { HW_NoCull = 0, HW_SummaryOnly = 1, HW_Undoc = 2 };
23063     enum HelpHave { HH_Undoc = 2, HH_Summary = 1, HH_More = 0 };
23064     /* Show all or most commands
23065     ** *zPattern==0   => summary of documented commands only
23066     ** *zPattern=='0' => whole help for undocumented commands
23067     ** Otherwise      => whole help for documented commands
23068     */
23069     enum HelpWanted hw = HW_SummaryOnly;
23070     enum HelpHave hh = HH_More;
23071     if( zPattern!=0 ){
23072       hw = (*zPattern=='0')? HW_NoCull|HW_Undoc : HW_NoCull;
23073     }
23074     for(i=0; i<ArraySize(azHelp); i++){
23075       switch( azHelp[i][0] ){
23076       case ',':
23077         hh = HH_Summary|HH_Undoc;
23078         break;
23079       case '.':
23080         hh = HH_Summary;
23081         break;
23082       default:
23083         hh &= ~HH_Summary;
23084         break;
23085       }
23086       if( ((hw^hh)&HH_Undoc)==0 ){
23087         if( (hh&HH_Summary)!=0 ){
23088           sputf(out, ".%s\n", azHelp[i]+1);
23089           ++n;
23090         }else if( (hw&HW_SummaryOnly)==0 ){
23091           sputf(out, "%s\n", azHelp[i]);
23092         }
23093       }
23094     }
23095   }else{
23096     /* Seek documented commands for which zPattern is an exact prefix */
23097     zPat = sqlite3_mprintf(".%s*", zPattern);
23098     shell_check_oom(zPat);
23099     for(i=0; i<ArraySize(azHelp); i++){
23100       if( sqlite3_strglob(zPat, azHelp[i])==0 ){
23101         sputf(out, "%s\n", azHelp[i]);
23102         j = i+1;
23103         n++;
23104       }
23105     }
23106     sqlite3_free(zPat);
23107     if( n ){
23108       if( n==1 ){
23109         /* when zPattern is a prefix of exactly one command, then include
23110         ** the details of that command, which should begin at offset j */
23111         while( j<ArraySize(azHelp)-1 && azHelp[j][0]==' ' ){
23112           sputf(out, "%s\n", azHelp[j]);
23113           j++;
23114         }
23115       }
23116       return n;
23117     }
23118     /* Look for documented commands that contain zPattern anywhere.
23119     ** Show complete text of all documented commands that match. */
23120     zPat = sqlite3_mprintf("%%%s%%", zPattern);
23121     shell_check_oom(zPat);
23122     for(i=0; i<ArraySize(azHelp); i++){
23123       if( azHelp[i][0]==',' ){
23124         while( i<ArraySize(azHelp)-1 && azHelp[i+1][0]==' ' ) ++i;
23125         continue;
23126       }
23127       if( azHelp[i][0]=='.' ) j = i;
23128       if( sqlite3_strlike(zPat, azHelp[i], 0)==0 ){
23129         sputf(out, "%s\n", azHelp[j]);
23130         while( j<ArraySize(azHelp)-1 && azHelp[j+1][0]==' ' ){
23131           j++;
23132           sputf(out, "%s\n", azHelp[j]);
23133         }
23134         i = j;
23135         n++;
23136       }
23137     }
23138     sqlite3_free(zPat);
23139   }
23140   return n;
23141 }
23142 
23143 /* Forward reference */
23144 static int process_input(ShellState *p);
23145 
23146 /*
23147 ** Read the content of file zName into memory obtained from sqlite3_malloc64()
23148 ** and return a pointer to the buffer. The caller is responsible for freeing
23149 ** the memory.
23150 **
23151 ** If parameter pnByte is not NULL, (*pnByte) is set to the number of bytes
23152 ** read.
23153 **
23154 ** For convenience, a nul-terminator byte is always appended to the data read
23155 ** from the file before the buffer is returned. This byte is not included in
23156 ** the final value of (*pnByte), if applicable.
23157 **
23158 ** NULL is returned if any error is encountered. The final value of *pnByte
23159 ** is undefined in this case.
23160 */
readFile(const char * zName,int * pnByte)23161 static char *readFile(const char *zName, int *pnByte){
23162   FILE *in = fopen(zName, "rb");
23163   long nIn;
23164   size_t nRead;
23165   char *pBuf;
23166   int rc;
23167   if( in==0 ) return 0;
23168   rc = fseek(in, 0, SEEK_END);
23169   if( rc!=0 ){
23170     eputf("Error: '%s' not seekable\n", zName);
23171     fclose(in);
23172     return 0;
23173   }
23174   nIn = ftell(in);
23175   rewind(in);
23176   pBuf = sqlite3_malloc64( nIn+1 );
23177   if( pBuf==0 ){
23178     eputz("Error: out of memory\n");
23179     fclose(in);
23180     return 0;
23181   }
23182   nRead = fread(pBuf, nIn, 1, in);
23183   fclose(in);
23184   if( nRead!=1 ){
23185     sqlite3_free(pBuf);
23186     eputf("Error: cannot read '%s'\n", zName);
23187     return 0;
23188   }
23189   pBuf[nIn] = 0;
23190   if( pnByte ) *pnByte = nIn;
23191   return pBuf;
23192 }
23193 
23194 #if defined(SQLITE_ENABLE_SESSION)
23195 /*
23196 ** Close a single OpenSession object and release all of its associated
23197 ** resources.
23198 */
session_close(OpenSession * pSession)23199 static void session_close(OpenSession *pSession){
23200   int i;
23201   sqlite3session_delete(pSession->p);
23202   sqlite3_free(pSession->zName);
23203   for(i=0; i<pSession->nFilter; i++){
23204     sqlite3_free(pSession->azFilter[i]);
23205   }
23206   sqlite3_free(pSession->azFilter);
23207   memset(pSession, 0, sizeof(OpenSession));
23208 }
23209 #endif
23210 
23211 /*
23212 ** Close all OpenSession objects and release all associated resources.
23213 */
23214 #if defined(SQLITE_ENABLE_SESSION)
session_close_all(ShellState * p,int i)23215 static void session_close_all(ShellState *p, int i){
23216   int j;
23217   struct AuxDb *pAuxDb = i<0 ? p->pAuxDb : &p->aAuxDb[i];
23218   for(j=0; j<pAuxDb->nSession; j++){
23219     session_close(&pAuxDb->aSession[j]);
23220   }
23221   pAuxDb->nSession = 0;
23222 }
23223 #else
23224 # define session_close_all(X,Y)
23225 #endif
23226 
23227 /*
23228 ** Implementation of the xFilter function for an open session.  Omit
23229 ** any tables named by ".session filter" but let all other table through.
23230 */
23231 #if defined(SQLITE_ENABLE_SESSION)
session_filter(void * pCtx,const char * zTab)23232 static int session_filter(void *pCtx, const char *zTab){
23233   OpenSession *pSession = (OpenSession*)pCtx;
23234   int i;
23235   for(i=0; i<pSession->nFilter; i++){
23236     if( sqlite3_strglob(pSession->azFilter[i], zTab)==0 ) return 0;
23237   }
23238   return 1;
23239 }
23240 #endif
23241 
23242 /*
23243 ** Try to deduce the type of file for zName based on its content.  Return
23244 ** one of the SHELL_OPEN_* constants.
23245 **
23246 ** If the file does not exist or is empty but its name looks like a ZIP
23247 ** archive and the dfltZip flag is true, then assume it is a ZIP archive.
23248 ** Otherwise, assume an ordinary database regardless of the filename if
23249 ** the type cannot be determined from content.
23250 */
deduceDatabaseType(const char * zName,int dfltZip)23251 int deduceDatabaseType(const char *zName, int dfltZip){
23252   FILE *f = fopen(zName, "rb");
23253   size_t n;
23254   int rc = SHELL_OPEN_UNSPEC;
23255   char zBuf[100];
23256   if( f==0 ){
23257     if( dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){
23258        return SHELL_OPEN_ZIPFILE;
23259     }else{
23260        return SHELL_OPEN_NORMAL;
23261     }
23262   }
23263   n = fread(zBuf, 16, 1, f);
23264   if( n==1 && memcmp(zBuf, "SQLite format 3", 16)==0 ){
23265     fclose(f);
23266     return SHELL_OPEN_NORMAL;
23267   }
23268   fseek(f, -25, SEEK_END);
23269   n = fread(zBuf, 25, 1, f);
23270   if( n==1 && memcmp(zBuf, "Start-Of-SQLite3-", 17)==0 ){
23271     rc = SHELL_OPEN_APPENDVFS;
23272   }else{
23273     fseek(f, -22, SEEK_END);
23274     n = fread(zBuf, 22, 1, f);
23275     if( n==1 && zBuf[0]==0x50 && zBuf[1]==0x4b && zBuf[2]==0x05
23276        && zBuf[3]==0x06 ){
23277       rc = SHELL_OPEN_ZIPFILE;
23278     }else if( n==0 && dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){
23279       rc = SHELL_OPEN_ZIPFILE;
23280     }
23281   }
23282   fclose(f);
23283   return rc;
23284 }
23285 
23286 #ifndef SQLITE_OMIT_DESERIALIZE
23287 /*
23288 ** Reconstruct an in-memory database using the output from the "dbtotxt"
23289 ** program.  Read content from the file in p->aAuxDb[].zDbFilename.
23290 ** If p->aAuxDb[].zDbFilename is 0, then read from standard input.
23291 */
readHexDb(ShellState * p,int * pnData)23292 static unsigned char *readHexDb(ShellState *p, int *pnData){
23293   unsigned char *a = 0;
23294   int nLine;
23295   int n = 0;
23296   int pgsz = 0;
23297   int iOffset = 0;
23298   int j, k;
23299   int rc;
23300   FILE *in;
23301   const char *zDbFilename = p->pAuxDb->zDbFilename;
23302   unsigned int x[16];
23303   char zLine[1000];
23304   if( zDbFilename ){
23305     in = fopen(zDbFilename, "r");
23306     if( in==0 ){
23307       eputf("cannot open \"%s\" for reading\n", zDbFilename);
23308       return 0;
23309     }
23310     nLine = 0;
23311   }else{
23312     in = p->in;
23313     nLine = p->lineno;
23314     if( in==0 ) in = stdin;
23315   }
23316   *pnData = 0;
23317   nLine++;
23318   if( fgets(zLine, sizeof(zLine), in)==0 ) goto readHexDb_error;
23319   rc = sscanf(zLine, "| size %d pagesize %d", &n, &pgsz);
23320   if( rc!=2 ) goto readHexDb_error;
23321   if( n<0 ) goto readHexDb_error;
23322   if( pgsz<512 || pgsz>65536 || (pgsz&(pgsz-1))!=0 ) goto readHexDb_error;
23323   n = (n+pgsz-1)&~(pgsz-1);  /* Round n up to the next multiple of pgsz */
23324   a = sqlite3_malloc( n ? n : 1 );
23325   shell_check_oom(a);
23326   memset(a, 0, n);
23327   if( pgsz<512 || pgsz>65536 || (pgsz & (pgsz-1))!=0 ){
23328     eputz("invalid pagesize\n");
23329     goto readHexDb_error;
23330   }
23331   for(nLine++; fgets(zLine, sizeof(zLine), in)!=0; nLine++){
23332     rc = sscanf(zLine, "| page %d offset %d", &j, &k);
23333     if( rc==2 ){
23334       iOffset = k;
23335       continue;
23336     }
23337     if( cli_strncmp(zLine, "| end ", 6)==0 ){
23338       break;
23339     }
23340     rc = sscanf(zLine,"| %d: %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x",
23341                 &j, &x[0], &x[1], &x[2], &x[3], &x[4], &x[5], &x[6], &x[7],
23342                 &x[8], &x[9], &x[10], &x[11], &x[12], &x[13], &x[14], &x[15]);
23343     if( rc==17 ){
23344       k = iOffset+j;
23345       if( k+16<=n && k>=0 ){
23346         int ii;
23347         for(ii=0; ii<16; ii++) a[k+ii] = x[ii]&0xff;
23348       }
23349     }
23350   }
23351   *pnData = n;
23352   if( in!=p->in ){
23353     fclose(in);
23354   }else{
23355     p->lineno = nLine;
23356   }
23357   return a;
23358 
23359 readHexDb_error:
23360   if( in!=p->in ){
23361     fclose(in);
23362   }else{
23363     while( fgets(zLine, sizeof(zLine), p->in)!=0 ){
23364       nLine++;
23365       if(cli_strncmp(zLine, "| end ", 6)==0 ) break;
23366     }
23367     p->lineno = nLine;
23368   }
23369   sqlite3_free(a);
23370   eputf("Error on line %d of --hexdb input\n", nLine);
23371   return 0;
23372 }
23373 #endif /* SQLITE_OMIT_DESERIALIZE */
23374 
23375 /*
23376 ** Scalar function "usleep(X)" invokes sqlite3_sleep(X) and returns X.
23377 */
shellUSleepFunc(sqlite3_context * context,int argcUnused,sqlite3_value ** argv)23378 static void shellUSleepFunc(
23379   sqlite3_context *context,
23380   int argcUnused,
23381   sqlite3_value **argv
23382 ){
23383   int sleep = sqlite3_value_int(argv[0]);
23384   (void)argcUnused;
23385   sqlite3_sleep(sleep/1000);
23386   sqlite3_result_int(context, sleep);
23387 }
23388 
23389 /* Flags for open_db().
23390 **
23391 ** The default behavior of open_db() is to exit(1) if the database fails to
23392 ** open.  The OPEN_DB_KEEPALIVE flag changes that so that it prints an error
23393 ** but still returns without calling exit.
23394 **
23395 ** The OPEN_DB_ZIPFILE flag causes open_db() to prefer to open files as a
23396 ** ZIP archive if the file does not exist or is empty and its name matches
23397 ** the *.zip pattern.
23398 */
23399 #define OPEN_DB_KEEPALIVE   0x001   /* Return after error if true */
23400 #define OPEN_DB_ZIPFILE     0x002   /* Open as ZIP if name matches *.zip */
23401 
23402 /*
23403 ** Make sure the database is open.  If it is not, then open it.  If
23404 ** the database fails to open, print an error message and exit.
23405 */
open_db(ShellState * p,int openFlags)23406 static void open_db(ShellState *p, int openFlags){
23407   if( p->db==0 ){
23408     const char *zDbFilename = p->pAuxDb->zDbFilename;
23409     if( p->openMode==SHELL_OPEN_UNSPEC ){
23410       if( zDbFilename==0 || zDbFilename[0]==0 ){
23411         p->openMode = SHELL_OPEN_NORMAL;
23412       }else{
23413         p->openMode = (u8)deduceDatabaseType(zDbFilename,
23414                              (openFlags & OPEN_DB_ZIPFILE)!=0);
23415       }
23416     }
23417     switch( p->openMode ){
23418       case SHELL_OPEN_APPENDVFS: {
23419         sqlite3_open_v2(zDbFilename, &p->db,
23420            SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, "apndvfs");
23421         break;
23422       }
23423       case SHELL_OPEN_HEXDB:
23424       case SHELL_OPEN_DESERIALIZE: {
23425         sqlite3_open(0, &p->db);
23426         break;
23427       }
23428       case SHELL_OPEN_ZIPFILE: {
23429         sqlite3_open(":memory:", &p->db);
23430         break;
23431       }
23432       case SHELL_OPEN_READONLY: {
23433         sqlite3_open_v2(zDbFilename, &p->db,
23434             SQLITE_OPEN_READONLY|p->openFlags, 0);
23435         break;
23436       }
23437       case SHELL_OPEN_UNSPEC:
23438       case SHELL_OPEN_NORMAL: {
23439         sqlite3_open_v2(zDbFilename, &p->db,
23440            SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, 0);
23441         break;
23442       }
23443     }
23444     if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){
23445       eputf("Error: unable to open database \"%s\": %s\n",
23446             zDbFilename, sqlite3_errmsg(p->db));
23447       if( (openFlags & OPEN_DB_KEEPALIVE)==0 ){
23448         exit(1);
23449       }
23450       sqlite3_close(p->db);
23451       sqlite3_open(":memory:", &p->db);
23452       if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){
23453         eputz("Also: unable to open substitute in-memory database.\n");
23454         exit(1);
23455       }else{
23456         eputf("Notice: using substitute in-memory database instead of \"%s\"\n",
23457               zDbFilename);
23458       }
23459     }
23460     globalDb = p->db;
23461     sqlite3_db_config(p->db, SQLITE_DBCONFIG_STMT_SCANSTATUS, (int)0, (int*)0);
23462 
23463     /* Reflect the use or absence of --unsafe-testing invocation. */
23464     {
23465       int testmode_on = ShellHasFlag(p,SHFLG_TestingMode);
23466       sqlite3_db_config(p->db, SQLITE_DBCONFIG_TRUSTED_SCHEMA, testmode_on,0);
23467       sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, !testmode_on,0);
23468     }
23469 
23470 #ifndef SQLITE_OMIT_LOAD_EXTENSION
23471     sqlite3_enable_load_extension(p->db, 1);
23472 #endif
23473     sqlite3_shathree_init(p->db, 0, 0);
23474     sqlite3_uint_init(p->db, 0, 0);
23475     sqlite3_decimal_init(p->db, 0, 0);
23476     sqlite3_base64_init(p->db, 0, 0);
23477     sqlite3_base85_init(p->db, 0, 0);
23478     sqlite3_regexp_init(p->db, 0, 0);
23479     sqlite3_ieee_init(p->db, 0, 0);
23480     sqlite3_series_init(p->db, 0, 0);
23481 #ifndef SQLITE_SHELL_FIDDLE
23482     sqlite3_fileio_init(p->db, 0, 0);
23483     sqlite3_completion_init(p->db, 0, 0);
23484 #endif
23485 #ifdef SQLITE_HAVE_ZLIB
23486     if( !p->bSafeModePersist ){
23487       sqlite3_zipfile_init(p->db, 0, 0);
23488       sqlite3_sqlar_init(p->db, 0, 0);
23489     }
23490 #endif
23491 #ifdef SQLITE_SHELL_EXTFUNCS
23492     /* Create a preprocessing mechanism for extensions to make
23493      * their own provisions for being built into the shell.
23494      * This is a short-span macro. See further below for usage.
23495      */
23496 #define SHELL_SUB_MACRO(base, variant) base ## _ ## variant
23497 #define SHELL_SUBMACRO(base, variant) SHELL_SUB_MACRO(base, variant)
23498     /* Let custom-included extensions get their ..._init() called.
23499      * The WHATEVER_INIT( db, pzErrorMsg, pApi ) macro should cause
23500      * the extension's sqlite3_*_init( db, pzErrorMsg, pApi )
23501      * initialization routine to be called.
23502      */
23503     {
23504       int irc = SHELL_SUBMACRO(SQLITE_SHELL_EXTFUNCS, INIT)(p->db);
23505     /* Let custom-included extensions expose their functionality.
23506      * The WHATEVER_EXPOSE( db, pzErrorMsg ) macro should cause
23507      * the SQL functions, virtual tables, collating sequences or
23508      * VFS's implemented by the extension to be registered.
23509      */
23510       if( irc==SQLITE_OK
23511           || irc==SQLITE_OK_LOAD_PERMANENTLY ){
23512         SHELL_SUBMACRO(SQLITE_SHELL_EXTFUNCS, EXPOSE)(p->db, 0);
23513       }
23514 #undef SHELL_SUB_MACRO
23515 #undef SHELL_SUBMACRO
23516     }
23517 #endif
23518 
23519     sqlite3_create_function(p->db, "strtod", 1, SQLITE_UTF8, 0,
23520                             shellStrtod, 0, 0);
23521     sqlite3_create_function(p->db, "dtostr", 1, SQLITE_UTF8, 0,
23522                             shellDtostr, 0, 0);
23523     sqlite3_create_function(p->db, "dtostr", 2, SQLITE_UTF8, 0,
23524                             shellDtostr, 0, 0);
23525     sqlite3_create_function(p->db, "shell_add_schema", 3, SQLITE_UTF8, 0,
23526                             shellAddSchemaName, 0, 0);
23527     sqlite3_create_function(p->db, "shell_module_schema", 1, SQLITE_UTF8, 0,
23528                             shellModuleSchema, 0, 0);
23529     sqlite3_create_function(p->db, "shell_putsnl", 1, SQLITE_UTF8, p,
23530                             shellPutsFunc, 0, 0);
23531     sqlite3_create_function(p->db, "usleep",1,SQLITE_UTF8,0,
23532                             shellUSleepFunc, 0, 0);
23533 #ifndef SQLITE_NOHAVE_SYSTEM
23534     sqlite3_create_function(p->db, "edit", 1, SQLITE_UTF8, 0,
23535                             editFunc, 0, 0);
23536     sqlite3_create_function(p->db, "edit", 2, SQLITE_UTF8, 0,
23537                             editFunc, 0, 0);
23538 #endif
23539 
23540     if( p->openMode==SHELL_OPEN_ZIPFILE ){
23541       char *zSql = sqlite3_mprintf(
23542          "CREATE VIRTUAL TABLE zip USING zipfile(%Q);", zDbFilename);
23543       shell_check_oom(zSql);
23544       sqlite3_exec(p->db, zSql, 0, 0, 0);
23545       sqlite3_free(zSql);
23546     }
23547 #ifndef SQLITE_OMIT_DESERIALIZE
23548     else
23549     if( p->openMode==SHELL_OPEN_DESERIALIZE || p->openMode==SHELL_OPEN_HEXDB ){
23550       int rc;
23551       int nData = 0;
23552       unsigned char *aData;
23553       if( p->openMode==SHELL_OPEN_DESERIALIZE ){
23554         aData = (unsigned char*)readFile(zDbFilename, &nData);
23555       }else{
23556         aData = readHexDb(p, &nData);
23557       }
23558       if( aData==0 ){
23559         return;
23560       }
23561       rc = sqlite3_deserialize(p->db, "main", aData, nData, nData,
23562                    SQLITE_DESERIALIZE_RESIZEABLE |
23563                    SQLITE_DESERIALIZE_FREEONCLOSE);
23564       if( rc ){
23565         eputf("Error: sqlite3_deserialize() returns %d\n", rc);
23566       }
23567       if( p->szMax>0 ){
23568         sqlite3_file_control(p->db, "main", SQLITE_FCNTL_SIZE_LIMIT, &p->szMax);
23569       }
23570     }
23571 #endif
23572   }
23573   if( p->db!=0 ){
23574     if( p->bSafeModePersist ){
23575       sqlite3_set_authorizer(p->db, safeModeAuth, p);
23576     }
23577     sqlite3_db_config(
23578         p->db, SQLITE_DBCONFIG_STMT_SCANSTATUS, p->scanstatsOn, (int*)0
23579     );
23580   }
23581 }
23582 
23583 /*
23584 ** Attempt to close the database connection.  Report errors.
23585 */
close_db(sqlite3 * db)23586 void close_db(sqlite3 *db){
23587   int rc = sqlite3_close(db);
23588   if( rc ){
23589     eputf("Error: sqlite3_close() returns %d: %s\n", rc, sqlite3_errmsg(db));
23590   }
23591 }
23592 
23593 #if HAVE_READLINE || HAVE_EDITLINE
23594 /*
23595 ** Readline completion callbacks
23596 */
readline_completion_generator(const char * text,int state)23597 static char *readline_completion_generator(const char *text, int state){
23598   static sqlite3_stmt *pStmt = 0;
23599   char *zRet;
23600   if( state==0 ){
23601     char *zSql;
23602     sqlite3_finalize(pStmt);
23603     zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
23604                            "  FROM completion(%Q) ORDER BY 1", text);
23605     shell_check_oom(zSql);
23606     sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
23607     sqlite3_free(zSql);
23608   }
23609   if( sqlite3_step(pStmt)==SQLITE_ROW ){
23610     const char *z = (const char*)sqlite3_column_text(pStmt,0);
23611     zRet = z ? strdup(z) : 0;
23612   }else{
23613     sqlite3_finalize(pStmt);
23614     pStmt = 0;
23615     zRet = 0;
23616   }
23617   return zRet;
23618 }
readline_completion(const char * zText,int iStart,int iEnd)23619 static char **readline_completion(const char *zText, int iStart, int iEnd){
23620   (void)iStart;
23621   (void)iEnd;
23622   rl_attempted_completion_over = 1;
23623   return rl_completion_matches(zText, readline_completion_generator);
23624 }
23625 
23626 #elif HAVE_LINENOISE
23627 /*
23628 ** Linenoise completion callback
23629 */
linenoise_completion(const char * zLine,linenoiseCompletions * lc)23630 static void linenoise_completion(const char *zLine, linenoiseCompletions *lc){
23631   i64 nLine = strlen(zLine);
23632   i64 i, iStart;
23633   sqlite3_stmt *pStmt = 0;
23634   char *zSql;
23635   char zBuf[1000];
23636 
23637   if( nLine>(i64)sizeof(zBuf)-30 ) return;
23638   if( zLine[0]=='.' || zLine[0]=='#') return;
23639   for(i=nLine-1; i>=0 && (isalnum(zLine[i]) || zLine[i]=='_'); i--){}
23640   if( i==nLine-1 ) return;
23641   iStart = i+1;
23642   memcpy(zBuf, zLine, iStart);
23643   zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
23644                          "  FROM completion(%Q,%Q) ORDER BY 1",
23645                          &zLine[iStart], zLine);
23646   shell_check_oom(zSql);
23647   sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
23648   sqlite3_free(zSql);
23649   sqlite3_exec(globalDb, "PRAGMA page_count", 0, 0, 0); /* Load the schema */
23650   while( sqlite3_step(pStmt)==SQLITE_ROW ){
23651     const char *zCompletion = (const char*)sqlite3_column_text(pStmt, 0);
23652     int nCompletion = sqlite3_column_bytes(pStmt, 0);
23653     if( iStart+nCompletion < (i64)sizeof(zBuf)-1 && zCompletion ){
23654       memcpy(zBuf+iStart, zCompletion, nCompletion+1);
23655       linenoiseAddCompletion(lc, zBuf);
23656     }
23657   }
23658   sqlite3_finalize(pStmt);
23659 }
23660 #endif
23661 
23662 /*
23663 ** Do C-language style dequoting.
23664 **
23665 **    \a    -> alarm
23666 **    \b    -> backspace
23667 **    \t    -> tab
23668 **    \n    -> newline
23669 **    \v    -> vertical tab
23670 **    \f    -> form feed
23671 **    \r    -> carriage return
23672 **    \s    -> space
23673 **    \"    -> "
23674 **    \'    -> '
23675 **    \\    -> backslash
23676 **    \NNN  -> ascii character NNN in octal
23677 **    \xHH  -> ascii character HH in hexadecimal
23678 */
resolve_backslashes(char * z)23679 static void resolve_backslashes(char *z){
23680   int i, j;
23681   char c;
23682   while( *z && *z!='\\' ) z++;
23683   for(i=j=0; (c = z[i])!=0; i++, j++){
23684     if( c=='\\' && z[i+1]!=0 ){
23685       c = z[++i];
23686       if( c=='a' ){
23687         c = '\a';
23688       }else if( c=='b' ){
23689         c = '\b';
23690       }else if( c=='t' ){
23691         c = '\t';
23692       }else if( c=='n' ){
23693         c = '\n';
23694       }else if( c=='v' ){
23695         c = '\v';
23696       }else if( c=='f' ){
23697         c = '\f';
23698       }else if( c=='r' ){
23699         c = '\r';
23700       }else if( c=='"' ){
23701         c = '"';
23702       }else if( c=='\'' ){
23703         c = '\'';
23704       }else if( c=='\\' ){
23705         c = '\\';
23706       }else if( c=='x' ){
23707         int nhd = 0, hdv;
23708         u8 hv = 0;
23709         while( nhd<2 && (c=z[i+1+nhd])!=0 && (hdv=hexDigitValue(c))>=0 ){
23710           hv = (u8)((hv<<4)|hdv);
23711           ++nhd;
23712         }
23713         i += nhd;
23714         c = (u8)hv;
23715       }else if( c>='0' && c<='7' ){
23716         c -= '0';
23717         if( z[i+1]>='0' && z[i+1]<='7' ){
23718           i++;
23719           c = (c<<3) + z[i] - '0';
23720           if( z[i+1]>='0' && z[i+1]<='7' ){
23721             i++;
23722             c = (c<<3) + z[i] - '0';
23723           }
23724         }
23725       }
23726     }
23727     z[j] = c;
23728   }
23729   if( j<i ) z[j] = 0;
23730 }
23731 
23732 /*
23733 ** Interpret zArg as either an integer or a boolean value.  Return 1 or 0
23734 ** for TRUE and FALSE.  Return the integer value if appropriate.
23735 */
booleanValue(const char * zArg)23736 static int booleanValue(const char *zArg){
23737   int i;
23738   if( zArg[0]=='0' && zArg[1]=='x' ){
23739     for(i=2; hexDigitValue(zArg[i])>=0; i++){}
23740   }else{
23741     for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
23742   }
23743   if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
23744   if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
23745     return 1;
23746   }
23747   if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
23748     return 0;
23749   }
23750   eputf("ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n", zArg);
23751   return 0;
23752 }
23753 
23754 /*
23755 ** Set or clear a shell flag according to a boolean value.
23756 */
setOrClearFlag(ShellState * p,unsigned mFlag,const char * zArg)23757 static void setOrClearFlag(ShellState *p, unsigned mFlag, const char *zArg){
23758   if( booleanValue(zArg) ){
23759     ShellSetFlag(p, mFlag);
23760   }else{
23761     ShellClearFlag(p, mFlag);
23762   }
23763 }
23764 
23765 /*
23766 ** Close an output file, assuming it is not stderr or stdout
23767 */
output_file_close(FILE * f)23768 static void output_file_close(FILE *f){
23769   if( f && f!=stdout && f!=stderr ) fclose(f);
23770 }
23771 
23772 /*
23773 ** Try to open an output file.   The names "stdout" and "stderr" are
23774 ** recognized and do the right thing.  NULL is returned if the output
23775 ** filename is "off".
23776 */
output_file_open(const char * zFile,int bTextMode)23777 static FILE *output_file_open(const char *zFile, int bTextMode){
23778   FILE *f;
23779   if( cli_strcmp(zFile,"stdout")==0 ){
23780     f = stdout;
23781   }else if( cli_strcmp(zFile, "stderr")==0 ){
23782     f = stderr;
23783   }else if( cli_strcmp(zFile, "off")==0 ){
23784     f = 0;
23785   }else{
23786     f = fopen(zFile, bTextMode ? "w" : "wb");
23787     if( f==0 ){
23788       eputf("Error: cannot open \"%s\"\n", zFile);
23789     }
23790   }
23791   return f;
23792 }
23793 
23794 #ifndef SQLITE_OMIT_TRACE
23795 /*
23796 ** A routine for handling output from sqlite3_trace().
23797 */
sql_trace_callback(unsigned mType,void * pArg,void * pP,void * pX)23798 static int sql_trace_callback(
23799   unsigned mType,         /* The trace type */
23800   void *pArg,             /* The ShellState pointer */
23801   void *pP,               /* Usually a pointer to sqlite_stmt */
23802   void *pX                /* Auxiliary output */
23803 ){
23804   ShellState *p = (ShellState*)pArg;
23805   sqlite3_stmt *pStmt;
23806   const char *zSql;
23807   i64 nSql;
23808   if( p->traceOut==0 ) return 0;
23809   if( mType==SQLITE_TRACE_CLOSE ){
23810     sputz(p->traceOut, "-- closing database connection\n");
23811     return 0;
23812   }
23813   if( mType!=SQLITE_TRACE_ROW && pX!=0 && ((const char*)pX)[0]=='-' ){
23814     zSql = (const char*)pX;
23815   }else{
23816     pStmt = (sqlite3_stmt*)pP;
23817     switch( p->eTraceType ){
23818       case SHELL_TRACE_EXPANDED: {
23819         zSql = sqlite3_expanded_sql(pStmt);
23820         break;
23821       }
23822 #ifdef SQLITE_ENABLE_NORMALIZE
23823       case SHELL_TRACE_NORMALIZED: {
23824         zSql = sqlite3_normalized_sql(pStmt);
23825         break;
23826       }
23827 #endif
23828       default: {
23829         zSql = sqlite3_sql(pStmt);
23830         break;
23831       }
23832     }
23833   }
23834   if( zSql==0 ) return 0;
23835   nSql = strlen(zSql);
23836   if( nSql>1000000000 ) nSql = 1000000000;
23837   while( nSql>0 && zSql[nSql-1]==';' ){ nSql--; }
23838   switch( mType ){
23839     case SQLITE_TRACE_ROW:
23840     case SQLITE_TRACE_STMT: {
23841       sputf(p->traceOut, "%.*s;\n", (int)nSql, zSql);
23842       break;
23843     }
23844     case SQLITE_TRACE_PROFILE: {
23845       sqlite3_int64 nNanosec = pX ? *(sqlite3_int64*)pX : 0;
23846       sputf(p->traceOut, "%.*s; -- %lld ns\n", (int)nSql, zSql, nNanosec);
23847       break;
23848     }
23849   }
23850   return 0;
23851 }
23852 #endif
23853 
23854 /*
23855 ** A no-op routine that runs with the ".breakpoint" doc-command.  This is
23856 ** a useful spot to set a debugger breakpoint.
23857 **
23858 ** This routine does not do anything practical.  The code are there simply
23859 ** to prevent the compiler from optimizing this routine out.
23860 */
test_breakpoint(void)23861 static void test_breakpoint(void){
23862   static unsigned int nCall = 0;
23863   if( (nCall++)==0xffffffff ) printf("Many .breakpoints have run\n");
23864 }
23865 
23866 /*
23867 ** An object used to read a CSV and other files for import.
23868 */
23869 typedef struct ImportCtx ImportCtx;
23870 struct ImportCtx {
23871   const char *zFile;  /* Name of the input file */
23872   FILE *in;           /* Read the CSV text from this input stream */
23873   int (SQLITE_CDECL *xCloser)(FILE*);      /* Func to close in */
23874   char *z;            /* Accumulated text for a field */
23875   int n;              /* Number of bytes in z */
23876   int nAlloc;         /* Space allocated for z[] */
23877   int nLine;          /* Current line number */
23878   int nRow;           /* Number of rows imported */
23879   int nErr;           /* Number of errors encountered */
23880   int bNotFirst;      /* True if one or more bytes already read */
23881   int cTerm;          /* Character that terminated the most recent field */
23882   int cColSep;        /* The column separator character.  (Usually ",") */
23883   int cRowSep;        /* The row separator character.  (Usually "\n") */
23884 };
23885 
23886 /* Clean up resourced used by an ImportCtx */
import_cleanup(ImportCtx * p)23887 static void import_cleanup(ImportCtx *p){
23888   if( p->in!=0 && p->xCloser!=0 ){
23889     p->xCloser(p->in);
23890     p->in = 0;
23891   }
23892   sqlite3_free(p->z);
23893   p->z = 0;
23894 }
23895 
23896 /* Append a single byte to z[] */
import_append_char(ImportCtx * p,int c)23897 static void import_append_char(ImportCtx *p, int c){
23898   if( p->n+1>=p->nAlloc ){
23899     p->nAlloc += p->nAlloc + 100;
23900     p->z = sqlite3_realloc64(p->z, p->nAlloc);
23901     shell_check_oom(p->z);
23902   }
23903   p->z[p->n++] = (char)c;
23904 }
23905 
23906 /* Read a single field of CSV text.  Compatible with rfc4180 and extended
23907 ** with the option of having a separator other than ",".
23908 **
23909 **   +  Input comes from p->in.
23910 **   +  Store results in p->z of length p->n.  Space to hold p->z comes
23911 **      from sqlite3_malloc64().
23912 **   +  Use p->cSep as the column separator.  The default is ",".
23913 **   +  Use p->rSep as the row separator.  The default is "\n".
23914 **   +  Keep track of the line number in p->nLine.
23915 **   +  Store the character that terminates the field in p->cTerm.  Store
23916 **      EOF on end-of-file.
23917 **   +  Report syntax errors on stderr
23918 */
csv_read_one_field(ImportCtx * p)23919 static char *SQLITE_CDECL csv_read_one_field(ImportCtx *p){
23920   int c;
23921   int cSep = (u8)p->cColSep;
23922   int rSep = (u8)p->cRowSep;
23923   p->n = 0;
23924   c = fgetc(p->in);
23925   if( c==EOF || seenInterrupt ){
23926     p->cTerm = EOF;
23927     return 0;
23928   }
23929   if( c=='"' ){
23930     int pc, ppc;
23931     int startLine = p->nLine;
23932     int cQuote = c;
23933     pc = ppc = 0;
23934     while( 1 ){
23935       c = fgetc(p->in);
23936       if( c==rSep ) p->nLine++;
23937       if( c==cQuote ){
23938         if( pc==cQuote ){
23939           pc = 0;
23940           continue;
23941         }
23942       }
23943       if( (c==cSep && pc==cQuote)
23944        || (c==rSep && pc==cQuote)
23945        || (c==rSep && pc=='\r' && ppc==cQuote)
23946        || (c==EOF && pc==cQuote)
23947       ){
23948         do{ p->n--; }while( p->z[p->n]!=cQuote );
23949         p->cTerm = c;
23950         break;
23951       }
23952       if( pc==cQuote && c!='\r' ){
23953         eputf("%s:%d: unescaped %c character\n", p->zFile, p->nLine, cQuote);
23954       }
23955       if( c==EOF ){
23956         eputf("%s:%d: unterminated %c-quoted field\n",
23957               p->zFile, startLine, cQuote);
23958         p->cTerm = c;
23959         break;
23960       }
23961       import_append_char(p, c);
23962       ppc = pc;
23963       pc = c;
23964     }
23965   }else{
23966     /* If this is the first field being parsed and it begins with the
23967     ** UTF-8 BOM  (0xEF BB BF) then skip the BOM */
23968     if( (c&0xff)==0xef && p->bNotFirst==0 ){
23969       import_append_char(p, c);
23970       c = fgetc(p->in);
23971       if( (c&0xff)==0xbb ){
23972         import_append_char(p, c);
23973         c = fgetc(p->in);
23974         if( (c&0xff)==0xbf ){
23975           p->bNotFirst = 1;
23976           p->n = 0;
23977           return csv_read_one_field(p);
23978         }
23979       }
23980     }
23981     while( c!=EOF && c!=cSep && c!=rSep ){
23982       import_append_char(p, c);
23983       c = fgetc(p->in);
23984     }
23985     if( c==rSep ){
23986       p->nLine++;
23987       if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
23988     }
23989     p->cTerm = c;
23990   }
23991   if( p->z ) p->z[p->n] = 0;
23992   p->bNotFirst = 1;
23993   return p->z;
23994 }
23995 
23996 /* Read a single field of ASCII delimited text.
23997 **
23998 **   +  Input comes from p->in.
23999 **   +  Store results in p->z of length p->n.  Space to hold p->z comes
24000 **      from sqlite3_malloc64().
24001 **   +  Use p->cSep as the column separator.  The default is "\x1F".
24002 **   +  Use p->rSep as the row separator.  The default is "\x1E".
24003 **   +  Keep track of the row number in p->nLine.
24004 **   +  Store the character that terminates the field in p->cTerm.  Store
24005 **      EOF on end-of-file.
24006 **   +  Report syntax errors on stderr
24007 */
ascii_read_one_field(ImportCtx * p)24008 static char *SQLITE_CDECL ascii_read_one_field(ImportCtx *p){
24009   int c;
24010   int cSep = (u8)p->cColSep;
24011   int rSep = (u8)p->cRowSep;
24012   p->n = 0;
24013   c = fgetc(p->in);
24014   if( c==EOF || seenInterrupt ){
24015     p->cTerm = EOF;
24016     return 0;
24017   }
24018   while( c!=EOF && c!=cSep && c!=rSep ){
24019     import_append_char(p, c);
24020     c = fgetc(p->in);
24021   }
24022   if( c==rSep ){
24023     p->nLine++;
24024   }
24025   p->cTerm = c;
24026   if( p->z ) p->z[p->n] = 0;
24027   return p->z;
24028 }
24029 
24030 /*
24031 ** Try to transfer data for table zTable.  If an error is seen while
24032 ** moving forward, try to go backwards.  The backwards movement won't
24033 ** work for WITHOUT ROWID tables.
24034 */
tryToCloneData(ShellState * p,sqlite3 * newDb,const char * zTable)24035 static void tryToCloneData(
24036   ShellState *p,
24037   sqlite3 *newDb,
24038   const char *zTable
24039 ){
24040   sqlite3_stmt *pQuery = 0;
24041   sqlite3_stmt *pInsert = 0;
24042   char *zQuery = 0;
24043   char *zInsert = 0;
24044   int rc;
24045   int i, j, n;
24046   int nTable = strlen30(zTable);
24047   int k = 0;
24048   int cnt = 0;
24049   const int spinRate = 10000;
24050 
24051   zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
24052   shell_check_oom(zQuery);
24053   rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
24054   if( rc ){
24055     eputf("Error %d: %s on [%s]\n",
24056           sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db), zQuery);
24057     goto end_data_xfer;
24058   }
24059   n = sqlite3_column_count(pQuery);
24060   zInsert = sqlite3_malloc64(200 + nTable + n*3);
24061   shell_check_oom(zInsert);
24062   sqlite3_snprintf(200+nTable,zInsert,
24063                    "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
24064   i = strlen30(zInsert);
24065   for(j=1; j<n; j++){
24066     memcpy(zInsert+i, ",?", 2);
24067     i += 2;
24068   }
24069   memcpy(zInsert+i, ");", 3);
24070   rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
24071   if( rc ){
24072     eputf("Error %d: %s on [%s]\n",
24073           sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb), zInsert);
24074     goto end_data_xfer;
24075   }
24076   for(k=0; k<2; k++){
24077     while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
24078       for(i=0; i<n; i++){
24079         switch( sqlite3_column_type(pQuery, i) ){
24080           case SQLITE_NULL: {
24081             sqlite3_bind_null(pInsert, i+1);
24082             break;
24083           }
24084           case SQLITE_INTEGER: {
24085             sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
24086             break;
24087           }
24088           case SQLITE_FLOAT: {
24089             sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
24090             break;
24091           }
24092           case SQLITE_TEXT: {
24093             sqlite3_bind_text(pInsert, i+1,
24094                              (const char*)sqlite3_column_text(pQuery,i),
24095                              -1, SQLITE_STATIC);
24096             break;
24097           }
24098           case SQLITE_BLOB: {
24099             sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
24100                                             sqlite3_column_bytes(pQuery,i),
24101                                             SQLITE_STATIC);
24102             break;
24103           }
24104         }
24105       } /* End for */
24106       rc = sqlite3_step(pInsert);
24107       if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
24108         eputf("Error %d: %s\n",
24109               sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb));
24110       }
24111       sqlite3_reset(pInsert);
24112       cnt++;
24113       if( (cnt%spinRate)==0 ){
24114         printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
24115         fflush(stdout);
24116       }
24117     } /* End while */
24118     if( rc==SQLITE_DONE ) break;
24119     sqlite3_finalize(pQuery);
24120     sqlite3_free(zQuery);
24121     zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
24122                              zTable);
24123     shell_check_oom(zQuery);
24124     rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
24125     if( rc ){
24126       eputf("Warning: cannot step \"%s\" backwards", zTable);
24127       break;
24128     }
24129   } /* End for(k=0...) */
24130 
24131 end_data_xfer:
24132   sqlite3_finalize(pQuery);
24133   sqlite3_finalize(pInsert);
24134   sqlite3_free(zQuery);
24135   sqlite3_free(zInsert);
24136 }
24137 
24138 
24139 /*
24140 ** Try to transfer all rows of the schema that match zWhere.  For
24141 ** each row, invoke xForEach() on the object defined by that row.
24142 ** If an error is encountered while moving forward through the
24143 ** sqlite_schema table, try again moving backwards.
24144 */
tryToCloneSchema(ShellState * p,sqlite3 * newDb,const char * zWhere,void (* xForEach)(ShellState *,sqlite3 *,const char *))24145 static void tryToCloneSchema(
24146   ShellState *p,
24147   sqlite3 *newDb,
24148   const char *zWhere,
24149   void (*xForEach)(ShellState*,sqlite3*,const char*)
24150 ){
24151   sqlite3_stmt *pQuery = 0;
24152   char *zQuery = 0;
24153   int rc;
24154   const unsigned char *zName;
24155   const unsigned char *zSql;
24156   char *zErrMsg = 0;
24157 
24158   zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_schema"
24159                            " WHERE %s ORDER BY rowid ASC", zWhere);
24160   shell_check_oom(zQuery);
24161   rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
24162   if( rc ){
24163     eputf("Error: (%d) %s on [%s]\n", sqlite3_extended_errcode(p->db),
24164           sqlite3_errmsg(p->db), zQuery);
24165     goto end_schema_xfer;
24166   }
24167   while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
24168     zName = sqlite3_column_text(pQuery, 0);
24169     zSql = sqlite3_column_text(pQuery, 1);
24170     if( zName==0 || zSql==0 ) continue;
24171     if( sqlite3_stricmp((char*)zName, "sqlite_sequence")!=0 ){
24172       sputf(stdout, "%s... ", zName); fflush(stdout);
24173       sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
24174       if( zErrMsg ){
24175         eputf("Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
24176         sqlite3_free(zErrMsg);
24177         zErrMsg = 0;
24178       }
24179     }
24180     if( xForEach ){
24181       xForEach(p, newDb, (const char*)zName);
24182     }
24183     sputz(stdout, "done\n");
24184   }
24185   if( rc!=SQLITE_DONE ){
24186     sqlite3_finalize(pQuery);
24187     sqlite3_free(zQuery);
24188     zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_schema"
24189                              " WHERE %s ORDER BY rowid DESC", zWhere);
24190     shell_check_oom(zQuery);
24191     rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
24192     if( rc ){
24193       eputf("Error: (%d) %s on [%s]\n",
24194             sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db), zQuery);
24195       goto end_schema_xfer;
24196     }
24197     while( sqlite3_step(pQuery)==SQLITE_ROW ){
24198       zName = sqlite3_column_text(pQuery, 0);
24199       zSql = sqlite3_column_text(pQuery, 1);
24200       if( zName==0 || zSql==0 ) continue;
24201       if( sqlite3_stricmp((char*)zName, "sqlite_sequence")==0 ) continue;
24202       sputf(stdout, "%s... ", zName); fflush(stdout);
24203       sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
24204       if( zErrMsg ){
24205         eputf("Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
24206         sqlite3_free(zErrMsg);
24207         zErrMsg = 0;
24208       }
24209       if( xForEach ){
24210         xForEach(p, newDb, (const char*)zName);
24211       }
24212       sputz(stdout, "done\n");
24213     }
24214   }
24215 end_schema_xfer:
24216   sqlite3_finalize(pQuery);
24217   sqlite3_free(zQuery);
24218 }
24219 
24220 /*
24221 ** Open a new database file named "zNewDb".  Try to recover as much information
24222 ** as possible out of the main database (which might be corrupt) and write it
24223 ** into zNewDb.
24224 */
tryToClone(ShellState * p,const char * zNewDb)24225 static void tryToClone(ShellState *p, const char *zNewDb){
24226   int rc;
24227   sqlite3 *newDb = 0;
24228   if( access(zNewDb,0)==0 ){
24229     eputf("File \"%s\" already exists.\n", zNewDb);
24230     return;
24231   }
24232   rc = sqlite3_open(zNewDb, &newDb);
24233   if( rc ){
24234     eputf("Cannot create output database: %s\n", sqlite3_errmsg(newDb));
24235   }else{
24236     sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0);
24237     sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
24238     tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
24239     tryToCloneSchema(p, newDb, "type!='table'", 0);
24240     sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
24241     sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
24242   }
24243   close_db(newDb);
24244 }
24245 
24246 #ifndef SQLITE_SHELL_FIDDLE
24247 /*
24248 ** Change the output stream (file or pipe or console) to something else.
24249 */
output_redir(ShellState * p,FILE * pfNew)24250 static void output_redir(ShellState *p, FILE *pfNew){
24251   if( p->out != stdout ) eputz("Output already redirected.\n");
24252   else{
24253     p->out = pfNew;
24254     setOutputStream(pfNew);
24255   }
24256 }
24257 
24258 /*
24259 ** Change the output file back to stdout.
24260 **
24261 ** If the p->doXdgOpen flag is set, that means the output was being
24262 ** redirected to a temporary file named by p->zTempFile.  In that case,
24263 ** launch start/open/xdg-open on that temporary file.
24264 */
output_reset(ShellState * p)24265 static void output_reset(ShellState *p){
24266   if( p->outfile[0]=='|' ){
24267 #ifndef SQLITE_OMIT_POPEN
24268     pclose(p->out);
24269 #endif
24270   }else{
24271     output_file_close(p->out);
24272 #ifndef SQLITE_NOHAVE_SYSTEM
24273     if( p->doXdgOpen ){
24274       const char *zXdgOpenCmd =
24275 #if defined(_WIN32)
24276       "start";
24277 #elif defined(__APPLE__)
24278       "open";
24279 #else
24280       "xdg-open";
24281 #endif
24282       char *zCmd;
24283       zCmd = sqlite3_mprintf("%s %s", zXdgOpenCmd, p->zTempFile);
24284       if( system(zCmd) ){
24285         eputf("Failed: [%s]\n", zCmd);
24286       }else{
24287         /* Give the start/open/xdg-open command some time to get
24288         ** going before we continue, and potential delete the
24289         ** p->zTempFile data file out from under it */
24290         sqlite3_sleep(2000);
24291       }
24292       sqlite3_free(zCmd);
24293       outputModePop(p);
24294       p->doXdgOpen = 0;
24295     }
24296 #endif /* !defined(SQLITE_NOHAVE_SYSTEM) */
24297   }
24298   p->outfile[0] = 0;
24299   p->out = stdout;
24300   setOutputStream(stdout);
24301 }
24302 #else
24303 # define output_redir(SS,pfO)
24304 # define output_reset(SS)
24305 #endif
24306 
24307 /*
24308 ** Run an SQL command and return the single integer result.
24309 */
db_int(sqlite3 * db,const char * zSql)24310 static int db_int(sqlite3 *db, const char *zSql){
24311   sqlite3_stmt *pStmt;
24312   int res = 0;
24313   sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
24314   if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){
24315     res = sqlite3_column_int(pStmt,0);
24316   }
24317   sqlite3_finalize(pStmt);
24318   return res;
24319 }
24320 
24321 #if SQLITE_SHELL_HAVE_RECOVER
24322 /*
24323 ** Convert a 2-byte or 4-byte big-endian integer into a native integer
24324 */
get2byteInt(unsigned char * a)24325 static unsigned int get2byteInt(unsigned char *a){
24326   return (a[0]<<8) + a[1];
24327 }
get4byteInt(unsigned char * a)24328 static unsigned int get4byteInt(unsigned char *a){
24329   return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3];
24330 }
24331 
24332 /*
24333 ** Implementation of the ".dbinfo" command.
24334 **
24335 ** Return 1 on error, 2 to exit, and 0 otherwise.
24336 */
shell_dbinfo_command(ShellState * p,int nArg,char ** azArg)24337 static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){
24338   static const struct { const char *zName; int ofst; } aField[] = {
24339      { "file change counter:",  24  },
24340      { "database page count:",  28  },
24341      { "freelist page count:",  36  },
24342      { "schema cookie:",        40  },
24343      { "schema format:",        44  },
24344      { "default cache size:",   48  },
24345      { "autovacuum top root:",  52  },
24346      { "incremental vacuum:",   64  },
24347      { "text encoding:",        56  },
24348      { "user version:",         60  },
24349      { "application id:",       68  },
24350      { "software version:",     96  },
24351   };
24352   static const struct { const char *zName; const char *zSql; } aQuery[] = {
24353      { "number of tables:",
24354        "SELECT count(*) FROM %s WHERE type='table'" },
24355      { "number of indexes:",
24356        "SELECT count(*) FROM %s WHERE type='index'" },
24357      { "number of triggers:",
24358        "SELECT count(*) FROM %s WHERE type='trigger'" },
24359      { "number of views:",
24360        "SELECT count(*) FROM %s WHERE type='view'" },
24361      { "schema size:",
24362        "SELECT total(length(sql)) FROM %s" },
24363   };
24364   int i, rc;
24365   unsigned iDataVersion;
24366   char *zSchemaTab;
24367   char *zDb = nArg>=2 ? azArg[1] : "main";
24368   sqlite3_stmt *pStmt = 0;
24369   unsigned char aHdr[100];
24370   open_db(p, 0);
24371   if( p->db==0 ) return 1;
24372   rc = sqlite3_prepare_v2(p->db,
24373              "SELECT data FROM sqlite_dbpage(?1) WHERE pgno=1",
24374              -1, &pStmt, 0);
24375   if( rc ){
24376     eputf("error: %s\n", sqlite3_errmsg(p->db));
24377     sqlite3_finalize(pStmt);
24378     return 1;
24379   }
24380   sqlite3_bind_text(pStmt, 1, zDb, -1, SQLITE_STATIC);
24381   if( sqlite3_step(pStmt)==SQLITE_ROW
24382    && sqlite3_column_bytes(pStmt,0)>100
24383   ){
24384     const u8 *pb = sqlite3_column_blob(pStmt,0);
24385     shell_check_oom(pb);
24386     memcpy(aHdr, pb, 100);
24387     sqlite3_finalize(pStmt);
24388   }else{
24389     eputz("unable to read database header\n");
24390     sqlite3_finalize(pStmt);
24391     return 1;
24392   }
24393   i = get2byteInt(aHdr+16);
24394   if( i==1 ) i = 65536;
24395   oputf("%-20s %d\n", "database page size:", i);
24396   oputf("%-20s %d\n", "write format:", aHdr[18]);
24397   oputf("%-20s %d\n", "read format:", aHdr[19]);
24398   oputf("%-20s %d\n", "reserved bytes:", aHdr[20]);
24399   for(i=0; i<ArraySize(aField); i++){
24400     int ofst = aField[i].ofst;
24401     unsigned int val = get4byteInt(aHdr + ofst);
24402     oputf("%-20s %u", aField[i].zName, val);
24403     switch( ofst ){
24404       case 56: {
24405         if( val==1 ) oputz(" (utf8)");
24406         if( val==2 ) oputz(" (utf16le)");
24407         if( val==3 ) oputz(" (utf16be)");
24408       }
24409     }
24410     oputz("\n");
24411   }
24412   if( zDb==0 ){
24413     zSchemaTab = sqlite3_mprintf("main.sqlite_schema");
24414   }else if( cli_strcmp(zDb,"temp")==0 ){
24415     zSchemaTab = sqlite3_mprintf("%s", "sqlite_temp_schema");
24416   }else{
24417     zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_schema", zDb);
24418   }
24419   for(i=0; i<ArraySize(aQuery); i++){
24420     char *zSql = sqlite3_mprintf(aQuery[i].zSql, zSchemaTab);
24421     int val = db_int(p->db, zSql);
24422     sqlite3_free(zSql);
24423     oputf("%-20s %d\n", aQuery[i].zName, val);
24424   }
24425   sqlite3_free(zSchemaTab);
24426   sqlite3_file_control(p->db, zDb, SQLITE_FCNTL_DATA_VERSION, &iDataVersion);
24427   oputf("%-20s %u\n", "data version", iDataVersion);
24428   return 0;
24429 }
24430 #endif /* SQLITE_SHELL_HAVE_RECOVER */
24431 
24432 /*
24433 ** Print the current sqlite3_errmsg() value to stderr and return 1.
24434 */
shellDatabaseError(sqlite3 * db)24435 static int shellDatabaseError(sqlite3 *db){
24436   const char *zErr = sqlite3_errmsg(db);
24437   eputf("Error: %s\n", zErr);
24438   return 1;
24439 }
24440 
24441 /*
24442 ** Compare the pattern in zGlob[] against the text in z[].  Return TRUE
24443 ** if they match and FALSE (0) if they do not match.
24444 **
24445 ** Globbing rules:
24446 **
24447 **      '*'       Matches any sequence of zero or more characters.
24448 **
24449 **      '?'       Matches exactly one character.
24450 **
24451 **     [...]      Matches one character from the enclosed list of
24452 **                characters.
24453 **
24454 **     [^...]     Matches one character not in the enclosed list.
24455 **
24456 **      '#'       Matches any sequence of one or more digits with an
24457 **                optional + or - sign in front
24458 **
24459 **      ' '       Any span of whitespace matches any other span of
24460 **                whitespace.
24461 **
24462 ** Extra whitespace at the end of z[] is ignored.
24463 */
testcase_glob(const char * zGlob,const char * z)24464 static int testcase_glob(const char *zGlob, const char *z){
24465   int c, c2;
24466   int invert;
24467   int seen;
24468 
24469   while( (c = (*(zGlob++)))!=0 ){
24470     if( IsSpace(c) ){
24471       if( !IsSpace(*z) ) return 0;
24472       while( IsSpace(*zGlob) ) zGlob++;
24473       while( IsSpace(*z) ) z++;
24474     }else if( c=='*' ){
24475       while( (c=(*(zGlob++))) == '*' || c=='?' ){
24476         if( c=='?' && (*(z++))==0 ) return 0;
24477       }
24478       if( c==0 ){
24479         return 1;
24480       }else if( c=='[' ){
24481         while( *z && testcase_glob(zGlob-1,z)==0 ){
24482           z++;
24483         }
24484         return (*z)!=0;
24485       }
24486       while( (c2 = (*(z++)))!=0 ){
24487         while( c2!=c ){
24488           c2 = *(z++);
24489           if( c2==0 ) return 0;
24490         }
24491         if( testcase_glob(zGlob,z) ) return 1;
24492       }
24493       return 0;
24494     }else if( c=='?' ){
24495       if( (*(z++))==0 ) return 0;
24496     }else if( c=='[' ){
24497       int prior_c = 0;
24498       seen = 0;
24499       invert = 0;
24500       c = *(z++);
24501       if( c==0 ) return 0;
24502       c2 = *(zGlob++);
24503       if( c2=='^' ){
24504         invert = 1;
24505         c2 = *(zGlob++);
24506       }
24507       if( c2==']' ){
24508         if( c==']' ) seen = 1;
24509         c2 = *(zGlob++);
24510       }
24511       while( c2 && c2!=']' ){
24512         if( c2=='-' && zGlob[0]!=']' && zGlob[0]!=0 && prior_c>0 ){
24513           c2 = *(zGlob++);
24514           if( c>=prior_c && c<=c2 ) seen = 1;
24515           prior_c = 0;
24516         }else{
24517           if( c==c2 ){
24518             seen = 1;
24519           }
24520           prior_c = c2;
24521         }
24522         c2 = *(zGlob++);
24523       }
24524       if( c2==0 || (seen ^ invert)==0 ) return 0;
24525     }else if( c=='#' ){
24526       if( (z[0]=='-' || z[0]=='+') && IsDigit(z[1]) ) z++;
24527       if( !IsDigit(z[0]) ) return 0;
24528       z++;
24529       while( IsDigit(z[0]) ){ z++; }
24530     }else{
24531       if( c!=(*(z++)) ) return 0;
24532     }
24533   }
24534   while( IsSpace(*z) ){ z++; }
24535   return *z==0;
24536 }
24537 
24538 
24539 /*
24540 ** Compare the string as a command-line option with either one or two
24541 ** initial "-" characters.
24542 */
optionMatch(const char * zStr,const char * zOpt)24543 static int optionMatch(const char *zStr, const char *zOpt){
24544   if( zStr[0]!='-' ) return 0;
24545   zStr++;
24546   if( zStr[0]=='-' ) zStr++;
24547   return cli_strcmp(zStr, zOpt)==0;
24548 }
24549 
24550 /*
24551 ** Delete a file.
24552 */
shellDeleteFile(const char * zFilename)24553 int shellDeleteFile(const char *zFilename){
24554   int rc;
24555 #ifdef _WIN32
24556   wchar_t *z = sqlite3_win32_utf8_to_unicode(zFilename);
24557   rc = _wunlink(z);
24558   sqlite3_free(z);
24559 #else
24560   rc = unlink(zFilename);
24561 #endif
24562   return rc;
24563 }
24564 
24565 /*
24566 ** Try to delete the temporary file (if there is one) and free the
24567 ** memory used to hold the name of the temp file.
24568 */
clearTempFile(ShellState * p)24569 static void clearTempFile(ShellState *p){
24570   if( p->zTempFile==0 ) return;
24571   if( p->doXdgOpen ) return;
24572   if( shellDeleteFile(p->zTempFile) ) return;
24573   sqlite3_free(p->zTempFile);
24574   p->zTempFile = 0;
24575 }
24576 
24577 /*
24578 ** Create a new temp file name with the given suffix.
24579 */
newTempFile(ShellState * p,const char * zSuffix)24580 static void newTempFile(ShellState *p, const char *zSuffix){
24581   clearTempFile(p);
24582   sqlite3_free(p->zTempFile);
24583   p->zTempFile = 0;
24584   if( p->db ){
24585     sqlite3_file_control(p->db, 0, SQLITE_FCNTL_TEMPFILENAME, &p->zTempFile);
24586   }
24587   if( p->zTempFile==0 ){
24588     /* If p->db is an in-memory database then the TEMPFILENAME file-control
24589     ** will not work and we will need to fallback to guessing */
24590     char *zTemp;
24591     sqlite3_uint64 r;
24592     sqlite3_randomness(sizeof(r), &r);
24593     zTemp = getenv("TEMP");
24594     if( zTemp==0 ) zTemp = getenv("TMP");
24595     if( zTemp==0 ){
24596 #ifdef _WIN32
24597       zTemp = "\\tmp";
24598 #else
24599       zTemp = "/tmp";
24600 #endif
24601     }
24602     p->zTempFile = sqlite3_mprintf("%s/temp%llx.%s", zTemp, r, zSuffix);
24603   }else{
24604     p->zTempFile = sqlite3_mprintf("%z.%s", p->zTempFile, zSuffix);
24605   }
24606   shell_check_oom(p->zTempFile);
24607 }
24608 
24609 
24610 /*
24611 ** The implementation of SQL scalar function fkey_collate_clause(), used
24612 ** by the ".lint fkey-indexes" command. This scalar function is always
24613 ** called with four arguments - the parent table name, the parent column name,
24614 ** the child table name and the child column name.
24615 **
24616 **   fkey_collate_clause('parent-tab', 'parent-col', 'child-tab', 'child-col')
24617 **
24618 ** If either of the named tables or columns do not exist, this function
24619 ** returns an empty string. An empty string is also returned if both tables
24620 ** and columns exist but have the same default collation sequence. Or,
24621 ** if both exist but the default collation sequences are different, this
24622 ** function returns the string " COLLATE <parent-collation>", where
24623 ** <parent-collation> is the default collation sequence of the parent column.
24624 */
shellFkeyCollateClause(sqlite3_context * pCtx,int nVal,sqlite3_value ** apVal)24625 static void shellFkeyCollateClause(
24626   sqlite3_context *pCtx,
24627   int nVal,
24628   sqlite3_value **apVal
24629 ){
24630   sqlite3 *db = sqlite3_context_db_handle(pCtx);
24631   const char *zParent;
24632   const char *zParentCol;
24633   const char *zParentSeq;
24634   const char *zChild;
24635   const char *zChildCol;
24636   const char *zChildSeq = 0;  /* Initialize to avoid false-positive warning */
24637   int rc;
24638 
24639   assert( nVal==4 );
24640   zParent = (const char*)sqlite3_value_text(apVal[0]);
24641   zParentCol = (const char*)sqlite3_value_text(apVal[1]);
24642   zChild = (const char*)sqlite3_value_text(apVal[2]);
24643   zChildCol = (const char*)sqlite3_value_text(apVal[3]);
24644 
24645   sqlite3_result_text(pCtx, "", -1, SQLITE_STATIC);
24646   rc = sqlite3_table_column_metadata(
24647       db, "main", zParent, zParentCol, 0, &zParentSeq, 0, 0, 0
24648   );
24649   if( rc==SQLITE_OK ){
24650     rc = sqlite3_table_column_metadata(
24651         db, "main", zChild, zChildCol, 0, &zChildSeq, 0, 0, 0
24652     );
24653   }
24654 
24655   if( rc==SQLITE_OK && sqlite3_stricmp(zParentSeq, zChildSeq) ){
24656     char *z = sqlite3_mprintf(" COLLATE %s", zParentSeq);
24657     sqlite3_result_text(pCtx, z, -1, SQLITE_TRANSIENT);
24658     sqlite3_free(z);
24659   }
24660 }
24661 
24662 
24663 /*
24664 ** The implementation of dot-command ".lint fkey-indexes".
24665 */
lintFkeyIndexes(ShellState * pState,char ** azArg,int nArg)24666 static int lintFkeyIndexes(
24667   ShellState *pState,             /* Current shell tool state */
24668   char **azArg,                   /* Array of arguments passed to dot command */
24669   int nArg                        /* Number of entries in azArg[] */
24670 ){
24671   sqlite3 *db = pState->db;       /* Database handle to query "main" db of */
24672   int bVerbose = 0;               /* If -verbose is present */
24673   int bGroupByParent = 0;         /* If -groupbyparent is present */
24674   int i;                          /* To iterate through azArg[] */
24675   const char *zIndent = "";       /* How much to indent CREATE INDEX by */
24676   int rc;                         /* Return code */
24677   sqlite3_stmt *pSql = 0;         /* Compiled version of SQL statement below */
24678 
24679   /*
24680   ** This SELECT statement returns one row for each foreign key constraint
24681   ** in the schema of the main database. The column values are:
24682   **
24683   ** 0. The text of an SQL statement similar to:
24684   **
24685   **      "EXPLAIN QUERY PLAN SELECT 1 FROM child_table WHERE child_key=?"
24686   **
24687   **    This SELECT is similar to the one that the foreign keys implementation
24688   **    needs to run internally on child tables. If there is an index that can
24689   **    be used to optimize this query, then it can also be used by the FK
24690   **    implementation to optimize DELETE or UPDATE statements on the parent
24691   **    table.
24692   **
24693   ** 1. A GLOB pattern suitable for sqlite3_strglob(). If the plan output by
24694   **    the EXPLAIN QUERY PLAN command matches this pattern, then the schema
24695   **    contains an index that can be used to optimize the query.
24696   **
24697   ** 2. Human readable text that describes the child table and columns. e.g.
24698   **
24699   **       "child_table(child_key1, child_key2)"
24700   **
24701   ** 3. Human readable text that describes the parent table and columns. e.g.
24702   **
24703   **       "parent_table(parent_key1, parent_key2)"
24704   **
24705   ** 4. A full CREATE INDEX statement for an index that could be used to
24706   **    optimize DELETE or UPDATE statements on the parent table. e.g.
24707   **
24708   **       "CREATE INDEX child_table_child_key ON child_table(child_key)"
24709   **
24710   ** 5. The name of the parent table.
24711   **
24712   ** These six values are used by the C logic below to generate the report.
24713   */
24714   const char *zSql =
24715   "SELECT "
24716     "     'EXPLAIN QUERY PLAN SELECT 1 FROM ' || quote(s.name) || ' WHERE '"
24717     "  || group_concat(quote(s.name) || '.' || quote(f.[from]) || '=?' "
24718     "  || fkey_collate_clause("
24719     "       f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]),' AND ')"
24720     ", "
24721     "     'SEARCH ' || s.name || ' USING COVERING INDEX*('"
24722     "  || group_concat('*=?', ' AND ') || ')'"
24723     ", "
24724     "     s.name  || '(' || group_concat(f.[from],  ', ') || ')'"
24725     ", "
24726     "     f.[table] || '(' || group_concat(COALESCE(f.[to], p.[name])) || ')'"
24727     ", "
24728     "     'CREATE INDEX ' || quote(s.name ||'_'|| group_concat(f.[from], '_'))"
24729     "  || ' ON ' || quote(s.name) || '('"
24730     "  || group_concat(quote(f.[from]) ||"
24731     "        fkey_collate_clause("
24732     "          f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]), ', ')"
24733     "  || ');'"
24734     ", "
24735     "     f.[table] "
24736     "FROM sqlite_schema AS s, pragma_foreign_key_list(s.name) AS f "
24737     "LEFT JOIN pragma_table_info AS p ON (pk-1=seq AND p.arg=f.[table]) "
24738     "GROUP BY s.name, f.id "
24739     "ORDER BY (CASE WHEN ? THEN f.[table] ELSE s.name END)"
24740   ;
24741   const char *zGlobIPK = "SEARCH * USING INTEGER PRIMARY KEY (rowid=?)";
24742 
24743   for(i=2; i<nArg; i++){
24744     int n = strlen30(azArg[i]);
24745     if( n>1 && sqlite3_strnicmp("-verbose", azArg[i], n)==0 ){
24746       bVerbose = 1;
24747     }
24748     else if( n>1 && sqlite3_strnicmp("-groupbyparent", azArg[i], n)==0 ){
24749       bGroupByParent = 1;
24750       zIndent = "    ";
24751     }
24752     else{
24753       eputf("Usage: %s %s ?-verbose? ?-groupbyparent?\n", azArg[0], azArg[1]);
24754       return SQLITE_ERROR;
24755     }
24756   }
24757 
24758   /* Register the fkey_collate_clause() SQL function */
24759   rc = sqlite3_create_function(db, "fkey_collate_clause", 4, SQLITE_UTF8,
24760       0, shellFkeyCollateClause, 0, 0
24761   );
24762 
24763 
24764   if( rc==SQLITE_OK ){
24765     rc = sqlite3_prepare_v2(db, zSql, -1, &pSql, 0);
24766   }
24767   if( rc==SQLITE_OK ){
24768     sqlite3_bind_int(pSql, 1, bGroupByParent);
24769   }
24770 
24771   if( rc==SQLITE_OK ){
24772     int rc2;
24773     char *zPrev = 0;
24774     while( SQLITE_ROW==sqlite3_step(pSql) ){
24775       int res = -1;
24776       sqlite3_stmt *pExplain = 0;
24777       const char *zEQP = (const char*)sqlite3_column_text(pSql, 0);
24778       const char *zGlob = (const char*)sqlite3_column_text(pSql, 1);
24779       const char *zFrom = (const char*)sqlite3_column_text(pSql, 2);
24780       const char *zTarget = (const char*)sqlite3_column_text(pSql, 3);
24781       const char *zCI = (const char*)sqlite3_column_text(pSql, 4);
24782       const char *zParent = (const char*)sqlite3_column_text(pSql, 5);
24783 
24784       if( zEQP==0 ) continue;
24785       if( zGlob==0 ) continue;
24786       rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
24787       if( rc!=SQLITE_OK ) break;
24788       if( SQLITE_ROW==sqlite3_step(pExplain) ){
24789         const char *zPlan = (const char*)sqlite3_column_text(pExplain, 3);
24790         res = zPlan!=0 && (  0==sqlite3_strglob(zGlob, zPlan)
24791                           || 0==sqlite3_strglob(zGlobIPK, zPlan));
24792       }
24793       rc = sqlite3_finalize(pExplain);
24794       if( rc!=SQLITE_OK ) break;
24795 
24796       if( res<0 ){
24797         eputz("Error: internal error");
24798         break;
24799       }else{
24800         if( bGroupByParent
24801         && (bVerbose || res==0)
24802         && (zPrev==0 || sqlite3_stricmp(zParent, zPrev))
24803         ){
24804           oputf("-- Parent table %s\n", zParent);
24805           sqlite3_free(zPrev);
24806           zPrev = sqlite3_mprintf("%s", zParent);
24807         }
24808 
24809         if( res==0 ){
24810           oputf("%s%s --> %s\n", zIndent, zCI, zTarget);
24811         }else if( bVerbose ){
24812           oputf("%s/* no extra indexes required for %s -> %s */\n",
24813                 zIndent, zFrom, zTarget
24814           );
24815         }
24816       }
24817     }
24818     sqlite3_free(zPrev);
24819 
24820     if( rc!=SQLITE_OK ){
24821       eputf("%s\n", sqlite3_errmsg(db));
24822     }
24823 
24824     rc2 = sqlite3_finalize(pSql);
24825     if( rc==SQLITE_OK && rc2!=SQLITE_OK ){
24826       rc = rc2;
24827       eputf("%s\n", sqlite3_errmsg(db));
24828     }
24829   }else{
24830     eputf("%s\n", sqlite3_errmsg(db));
24831   }
24832 
24833   return rc;
24834 }
24835 
24836 /*
24837 ** Implementation of ".lint" dot command.
24838 */
lintDotCommand(ShellState * pState,char ** azArg,int nArg)24839 static int lintDotCommand(
24840   ShellState *pState,             /* Current shell tool state */
24841   char **azArg,                   /* Array of arguments passed to dot command */
24842   int nArg                        /* Number of entries in azArg[] */
24843 ){
24844   int n;
24845   n = (nArg>=2 ? strlen30(azArg[1]) : 0);
24846   if( n<1 || sqlite3_strnicmp(azArg[1], "fkey-indexes", n) ) goto usage;
24847   return lintFkeyIndexes(pState, azArg, nArg);
24848 
24849  usage:
24850   eputf("Usage %s sub-command ?switches...?\n", azArg[0]);
24851   eputz("Where sub-commands are:\n");
24852   eputz("    fkey-indexes\n");
24853   return SQLITE_ERROR;
24854 }
24855 
shellPrepare(sqlite3 * db,int * pRc,const char * zSql,sqlite3_stmt ** ppStmt)24856 static void shellPrepare(
24857   sqlite3 *db,
24858   int *pRc,
24859   const char *zSql,
24860   sqlite3_stmt **ppStmt
24861 ){
24862   *ppStmt = 0;
24863   if( *pRc==SQLITE_OK ){
24864     int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0);
24865     if( rc!=SQLITE_OK ){
24866       eputf("sql error: %s (%d)\n", sqlite3_errmsg(db), sqlite3_errcode(db));
24867       *pRc = rc;
24868     }
24869   }
24870 }
24871 
24872 /*
24873 ** Create a prepared statement using printf-style arguments for the SQL.
24874 */
shellPreparePrintf(sqlite3 * db,int * pRc,sqlite3_stmt ** ppStmt,const char * zFmt,...)24875 static void shellPreparePrintf(
24876   sqlite3 *db,
24877   int *pRc,
24878   sqlite3_stmt **ppStmt,
24879   const char *zFmt,
24880   ...
24881 ){
24882   *ppStmt = 0;
24883   if( *pRc==SQLITE_OK ){
24884     va_list ap;
24885     char *z;
24886     va_start(ap, zFmt);
24887     z = sqlite3_vmprintf(zFmt, ap);
24888     va_end(ap);
24889     if( z==0 ){
24890       *pRc = SQLITE_NOMEM;
24891     }else{
24892       shellPrepare(db, pRc, z, ppStmt);
24893       sqlite3_free(z);
24894     }
24895   }
24896 }
24897 
24898 /*
24899 ** Finalize the prepared statement created using shellPreparePrintf().
24900 */
shellFinalize(int * pRc,sqlite3_stmt * pStmt)24901 static void shellFinalize(
24902   int *pRc,
24903   sqlite3_stmt *pStmt
24904 ){
24905   if( pStmt ){
24906     sqlite3 *db = sqlite3_db_handle(pStmt);
24907     int rc = sqlite3_finalize(pStmt);
24908     if( *pRc==SQLITE_OK ){
24909       if( rc!=SQLITE_OK ){
24910         eputf("SQL error: %s\n", sqlite3_errmsg(db));
24911       }
24912       *pRc = rc;
24913     }
24914   }
24915 }
24916 
24917 #if !defined SQLITE_OMIT_VIRTUALTABLE
24918 /* Reset the prepared statement created using shellPreparePrintf().
24919 **
24920 ** This routine is could be marked "static".  But it is not always used,
24921 ** depending on compile-time options.  By omitting the "static", we avoid
24922 ** nuisance compiler warnings about "defined but not used".
24923 */
shellReset(int * pRc,sqlite3_stmt * pStmt)24924 void shellReset(
24925   int *pRc,
24926   sqlite3_stmt *pStmt
24927 ){
24928   int rc = sqlite3_reset(pStmt);
24929   if( *pRc==SQLITE_OK ){
24930     if( rc!=SQLITE_OK ){
24931       sqlite3 *db = sqlite3_db_handle(pStmt);
24932       eputf("SQL error: %s\n", sqlite3_errmsg(db));
24933     }
24934     *pRc = rc;
24935   }
24936 }
24937 #endif /* !defined SQLITE_OMIT_VIRTUALTABLE */
24938 
24939 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
24940 /******************************************************************************
24941 ** The ".archive" or ".ar" command.
24942 */
24943 /*
24944 ** Structure representing a single ".ar" command.
24945 */
24946 typedef struct ArCommand ArCommand;
24947 struct ArCommand {
24948   u8 eCmd;                        /* An AR_CMD_* value */
24949   u8 bVerbose;                    /* True if --verbose */
24950   u8 bZip;                        /* True if the archive is a ZIP */
24951   u8 bDryRun;                     /* True if --dry-run */
24952   u8 bAppend;                     /* True if --append */
24953   u8 bGlob;                       /* True if --glob */
24954   u8 fromCmdLine;                 /* Run from -A instead of .archive */
24955   int nArg;                       /* Number of command arguments */
24956   char *zSrcTable;                /* "sqlar", "zipfile($file)" or "zip" */
24957   const char *zFile;              /* --file argument, or NULL */
24958   const char *zDir;               /* --directory argument, or NULL */
24959   char **azArg;                   /* Array of command arguments */
24960   ShellState *p;                  /* Shell state */
24961   sqlite3 *db;                    /* Database containing the archive */
24962 };
24963 
24964 /*
24965 ** Print a usage message for the .ar command to stderr and return SQLITE_ERROR.
24966 */
arUsage(FILE * f)24967 static int arUsage(FILE *f){
24968   showHelp(f,"archive");
24969   return SQLITE_ERROR;
24970 }
24971 
24972 /*
24973 ** Print an error message for the .ar command to stderr and return
24974 ** SQLITE_ERROR.
24975 */
arErrorMsg(ArCommand * pAr,const char * zFmt,...)24976 static int arErrorMsg(ArCommand *pAr, const char *zFmt, ...){
24977   va_list ap;
24978   char *z;
24979   va_start(ap, zFmt);
24980   z = sqlite3_vmprintf(zFmt, ap);
24981   va_end(ap);
24982   eputf("Error: %s\n", z);
24983   if( pAr->fromCmdLine ){
24984     eputz("Use \"-A\" for more help\n");
24985   }else{
24986     eputz("Use \".archive --help\" for more help\n");
24987   }
24988   sqlite3_free(z);
24989   return SQLITE_ERROR;
24990 }
24991 
24992 /*
24993 ** Values for ArCommand.eCmd.
24994 */
24995 #define AR_CMD_CREATE       1
24996 #define AR_CMD_UPDATE       2
24997 #define AR_CMD_INSERT       3
24998 #define AR_CMD_EXTRACT      4
24999 #define AR_CMD_LIST         5
25000 #define AR_CMD_HELP         6
25001 #define AR_CMD_REMOVE       7
25002 
25003 /*
25004 ** Other (non-command) switches.
25005 */
25006 #define AR_SWITCH_VERBOSE     8
25007 #define AR_SWITCH_FILE        9
25008 #define AR_SWITCH_DIRECTORY  10
25009 #define AR_SWITCH_APPEND     11
25010 #define AR_SWITCH_DRYRUN     12
25011 #define AR_SWITCH_GLOB       13
25012 
arProcessSwitch(ArCommand * pAr,int eSwitch,const char * zArg)25013 static int arProcessSwitch(ArCommand *pAr, int eSwitch, const char *zArg){
25014   switch( eSwitch ){
25015     case AR_CMD_CREATE:
25016     case AR_CMD_EXTRACT:
25017     case AR_CMD_LIST:
25018     case AR_CMD_REMOVE:
25019     case AR_CMD_UPDATE:
25020     case AR_CMD_INSERT:
25021     case AR_CMD_HELP:
25022       if( pAr->eCmd ){
25023         return arErrorMsg(pAr, "multiple command options");
25024       }
25025       pAr->eCmd = eSwitch;
25026       break;
25027 
25028     case AR_SWITCH_DRYRUN:
25029       pAr->bDryRun = 1;
25030       break;
25031     case AR_SWITCH_GLOB:
25032       pAr->bGlob = 1;
25033       break;
25034     case AR_SWITCH_VERBOSE:
25035       pAr->bVerbose = 1;
25036       break;
25037     case AR_SWITCH_APPEND:
25038       pAr->bAppend = 1;
25039       deliberate_fall_through;
25040     case AR_SWITCH_FILE:
25041       pAr->zFile = zArg;
25042       break;
25043     case AR_SWITCH_DIRECTORY:
25044       pAr->zDir = zArg;
25045       break;
25046   }
25047 
25048   return SQLITE_OK;
25049 }
25050 
25051 /*
25052 ** Parse the command line for an ".ar" command. The results are written into
25053 ** structure (*pAr). SQLITE_OK is returned if the command line is parsed
25054 ** successfully, otherwise an error message is written to stderr and
25055 ** SQLITE_ERROR returned.
25056 */
arParseCommand(char ** azArg,int nArg,ArCommand * pAr)25057 static int arParseCommand(
25058   char **azArg,                   /* Array of arguments passed to dot command */
25059   int nArg,                       /* Number of entries in azArg[] */
25060   ArCommand *pAr                  /* Populate this object */
25061 ){
25062   struct ArSwitch {
25063     const char *zLong;
25064     char cShort;
25065     u8 eSwitch;
25066     u8 bArg;
25067   } aSwitch[] = {
25068     { "create",    'c', AR_CMD_CREATE,       0 },
25069     { "extract",   'x', AR_CMD_EXTRACT,      0 },
25070     { "insert",    'i', AR_CMD_INSERT,       0 },
25071     { "list",      't', AR_CMD_LIST,         0 },
25072     { "remove",    'r', AR_CMD_REMOVE,       0 },
25073     { "update",    'u', AR_CMD_UPDATE,       0 },
25074     { "help",      'h', AR_CMD_HELP,         0 },
25075     { "verbose",   'v', AR_SWITCH_VERBOSE,   0 },
25076     { "file",      'f', AR_SWITCH_FILE,      1 },
25077     { "append",    'a', AR_SWITCH_APPEND,    1 },
25078     { "directory", 'C', AR_SWITCH_DIRECTORY, 1 },
25079     { "dryrun",    'n', AR_SWITCH_DRYRUN,    0 },
25080     { "glob",      'g', AR_SWITCH_GLOB,      0 },
25081   };
25082   int nSwitch = sizeof(aSwitch) / sizeof(struct ArSwitch);
25083   struct ArSwitch *pEnd = &aSwitch[nSwitch];
25084 
25085   if( nArg<=1 ){
25086     eputz("Wrong number of arguments.  Usage:\n");
25087     return arUsage(stderr);
25088   }else{
25089     char *z = azArg[1];
25090     if( z[0]!='-' ){
25091       /* Traditional style [tar] invocation */
25092       int i;
25093       int iArg = 2;
25094       for(i=0; z[i]; i++){
25095         const char *zArg = 0;
25096         struct ArSwitch *pOpt;
25097         for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
25098           if( z[i]==pOpt->cShort ) break;
25099         }
25100         if( pOpt==pEnd ){
25101           return arErrorMsg(pAr, "unrecognized option: %c", z[i]);
25102         }
25103         if( pOpt->bArg ){
25104           if( iArg>=nArg ){
25105             return arErrorMsg(pAr, "option requires an argument: %c",z[i]);
25106           }
25107           zArg = azArg[iArg++];
25108         }
25109         if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR;
25110       }
25111       pAr->nArg = nArg-iArg;
25112       if( pAr->nArg>0 ){
25113         pAr->azArg = &azArg[iArg];
25114       }
25115     }else{
25116       /* Non-traditional invocation */
25117       int iArg;
25118       for(iArg=1; iArg<nArg; iArg++){
25119         int n;
25120         z = azArg[iArg];
25121         if( z[0]!='-' ){
25122           /* All remaining command line words are command arguments. */
25123           pAr->azArg = &azArg[iArg];
25124           pAr->nArg = nArg-iArg;
25125           break;
25126         }
25127         n = strlen30(z);
25128 
25129         if( z[1]!='-' ){
25130           int i;
25131           /* One or more short options */
25132           for(i=1; i<n; i++){
25133             const char *zArg = 0;
25134             struct ArSwitch *pOpt;
25135             for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
25136               if( z[i]==pOpt->cShort ) break;
25137             }
25138             if( pOpt==pEnd ){
25139               return arErrorMsg(pAr, "unrecognized option: %c", z[i]);
25140             }
25141             if( pOpt->bArg ){
25142               if( i<(n-1) ){
25143                 zArg = &z[i+1];
25144                 i = n;
25145               }else{
25146                 if( iArg>=(nArg-1) ){
25147                   return arErrorMsg(pAr, "option requires an argument: %c",
25148                                     z[i]);
25149                 }
25150                 zArg = azArg[++iArg];
25151               }
25152             }
25153             if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR;
25154           }
25155         }else if( z[2]=='\0' ){
25156           /* A -- option, indicating that all remaining command line words
25157           ** are command arguments.  */
25158           pAr->azArg = &azArg[iArg+1];
25159           pAr->nArg = nArg-iArg-1;
25160           break;
25161         }else{
25162           /* A long option */
25163           const char *zArg = 0;             /* Argument for option, if any */
25164           struct ArSwitch *pMatch = 0;      /* Matching option */
25165           struct ArSwitch *pOpt;            /* Iterator */
25166           for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
25167             const char *zLong = pOpt->zLong;
25168             if( (n-2)<=strlen30(zLong) && 0==memcmp(&z[2], zLong, n-2) ){
25169               if( pMatch ){
25170                 return arErrorMsg(pAr, "ambiguous option: %s",z);
25171               }else{
25172                 pMatch = pOpt;
25173               }
25174             }
25175           }
25176 
25177           if( pMatch==0 ){
25178             return arErrorMsg(pAr, "unrecognized option: %s", z);
25179           }
25180           if( pMatch->bArg ){
25181             if( iArg>=(nArg-1) ){
25182               return arErrorMsg(pAr, "option requires an argument: %s", z);
25183             }
25184             zArg = azArg[++iArg];
25185           }
25186           if( arProcessSwitch(pAr, pMatch->eSwitch, zArg) ) return SQLITE_ERROR;
25187         }
25188       }
25189     }
25190   }
25191   if( pAr->eCmd==0 ){
25192     eputz("Required argument missing.  Usage:\n");
25193     return arUsage(stderr);
25194   }
25195   return SQLITE_OK;
25196 }
25197 
25198 /*
25199 ** This function assumes that all arguments within the ArCommand.azArg[]
25200 ** array refer to archive members, as for the --extract, --list or --remove
25201 ** commands. It checks that each of them are "present". If any specified
25202 ** file is not present in the archive, an error is printed to stderr and an
25203 ** error code returned. Otherwise, if all specified arguments are present
25204 ** in the archive, SQLITE_OK is returned. Here, "present" means either an
25205 ** exact equality when pAr->bGlob is false or a "name GLOB pattern" match
25206 ** when pAr->bGlob is true.
25207 **
25208 ** This function strips any trailing '/' characters from each argument.
25209 ** This is consistent with the way the [tar] command seems to work on
25210 ** Linux.
25211 */
arCheckEntries(ArCommand * pAr)25212 static int arCheckEntries(ArCommand *pAr){
25213   int rc = SQLITE_OK;
25214   if( pAr->nArg ){
25215     int i, j;
25216     sqlite3_stmt *pTest = 0;
25217     const char *zSel = (pAr->bGlob)
25218       ? "SELECT name FROM %s WHERE glob($name,name)"
25219       : "SELECT name FROM %s WHERE name=$name";
25220 
25221     shellPreparePrintf(pAr->db, &rc, &pTest, zSel, pAr->zSrcTable);
25222     j = sqlite3_bind_parameter_index(pTest, "$name");
25223     for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){
25224       char *z = pAr->azArg[i];
25225       int n = strlen30(z);
25226       int bOk = 0;
25227       while( n>0 && z[n-1]=='/' ) n--;
25228       z[n] = '\0';
25229       sqlite3_bind_text(pTest, j, z, -1, SQLITE_STATIC);
25230       if( SQLITE_ROW==sqlite3_step(pTest) ){
25231         bOk = 1;
25232       }
25233       shellReset(&rc, pTest);
25234       if( rc==SQLITE_OK && bOk==0 ){
25235         eputf("not found in archive: %s\n", z);
25236         rc = SQLITE_ERROR;
25237       }
25238     }
25239     shellFinalize(&rc, pTest);
25240   }
25241   return rc;
25242 }
25243 
25244 /*
25245 ** Format a WHERE clause that can be used against the "sqlar" table to
25246 ** identify all archive members that match the command arguments held
25247 ** in (*pAr). Leave this WHERE clause in (*pzWhere) before returning.
25248 ** The caller is responsible for eventually calling sqlite3_free() on
25249 ** any non-NULL (*pzWhere) value. Here, "match" means strict equality
25250 ** when pAr->bGlob is false and GLOB match when pAr->bGlob is true.
25251 */
arWhereClause(int * pRc,ArCommand * pAr,char ** pzWhere)25252 static void arWhereClause(
25253   int *pRc,
25254   ArCommand *pAr,
25255   char **pzWhere                  /* OUT: New WHERE clause */
25256 ){
25257   char *zWhere = 0;
25258   const char *zSameOp = (pAr->bGlob)? "GLOB" : "=";
25259   if( *pRc==SQLITE_OK ){
25260     if( pAr->nArg==0 ){
25261       zWhere = sqlite3_mprintf("1");
25262     }else{
25263       int i;
25264       const char *zSep = "";
25265       for(i=0; i<pAr->nArg; i++){
25266         const char *z = pAr->azArg[i];
25267         zWhere = sqlite3_mprintf(
25268           "%z%s name %s '%q' OR substr(name,1,%d) %s '%q/'",
25269           zWhere, zSep, zSameOp, z, strlen30(z)+1, zSameOp, z
25270         );
25271         if( zWhere==0 ){
25272           *pRc = SQLITE_NOMEM;
25273           break;
25274         }
25275         zSep = " OR ";
25276       }
25277     }
25278   }
25279   *pzWhere = zWhere;
25280 }
25281 
25282 /*
25283 ** Implementation of .ar "lisT" command.
25284 */
arListCommand(ArCommand * pAr)25285 static int arListCommand(ArCommand *pAr){
25286   const char *zSql = "SELECT %s FROM %s WHERE %s";
25287   const char *azCols[] = {
25288     "name",
25289     "lsmode(mode), sz, datetime(mtime, 'unixepoch'), name"
25290   };
25291 
25292   char *zWhere = 0;
25293   sqlite3_stmt *pSql = 0;
25294   int rc;
25295 
25296   rc = arCheckEntries(pAr);
25297   arWhereClause(&rc, pAr, &zWhere);
25298 
25299   shellPreparePrintf(pAr->db, &rc, &pSql, zSql, azCols[pAr->bVerbose],
25300                      pAr->zSrcTable, zWhere);
25301   if( pAr->bDryRun ){
25302     oputf("%s\n", sqlite3_sql(pSql));
25303   }else{
25304     while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
25305       if( pAr->bVerbose ){
25306         oputf("%s % 10d  %s  %s\n",
25307               sqlite3_column_text(pSql, 0), sqlite3_column_int(pSql, 1),
25308               sqlite3_column_text(pSql, 2),sqlite3_column_text(pSql, 3));
25309       }else{
25310         oputf("%s\n", sqlite3_column_text(pSql, 0));
25311       }
25312     }
25313   }
25314   shellFinalize(&rc, pSql);
25315   sqlite3_free(zWhere);
25316   return rc;
25317 }
25318 
25319 /*
25320 ** Implementation of .ar "Remove" command.
25321 */
arRemoveCommand(ArCommand * pAr)25322 static int arRemoveCommand(ArCommand *pAr){
25323   int rc = 0;
25324   char *zSql = 0;
25325   char *zWhere = 0;
25326 
25327   if( pAr->nArg ){
25328     /* Verify that args actually exist within the archive before proceeding.
25329     ** And formulate a WHERE clause to match them.  */
25330     rc = arCheckEntries(pAr);
25331     arWhereClause(&rc, pAr, &zWhere);
25332   }
25333   if( rc==SQLITE_OK ){
25334     zSql = sqlite3_mprintf("DELETE FROM %s WHERE %s;",
25335                            pAr->zSrcTable, zWhere);
25336     if( pAr->bDryRun ){
25337       oputf("%s\n", zSql);
25338     }else{
25339       char *zErr = 0;
25340       rc = sqlite3_exec(pAr->db, "SAVEPOINT ar;", 0, 0, 0);
25341       if( rc==SQLITE_OK ){
25342         rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr);
25343         if( rc!=SQLITE_OK ){
25344           sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0);
25345         }else{
25346           rc = sqlite3_exec(pAr->db, "RELEASE ar;", 0, 0, 0);
25347         }
25348       }
25349       if( zErr ){
25350         sputf(stdout, "ERROR: %s\n", zErr); /* stdout? */
25351         sqlite3_free(zErr);
25352       }
25353     }
25354   }
25355   sqlite3_free(zWhere);
25356   sqlite3_free(zSql);
25357   return rc;
25358 }
25359 
25360 /*
25361 ** Implementation of .ar "eXtract" command.
25362 */
arExtractCommand(ArCommand * pAr)25363 static int arExtractCommand(ArCommand *pAr){
25364   const char *zSql1 =
25365     "SELECT "
25366     " ($dir || name),"
25367     " writefile(($dir || name), %s, mode, mtime) "
25368     "FROM %s WHERE (%s) AND (data IS NULL OR $dirOnly = 0)"
25369     " AND name NOT GLOB '*..[/\\]*'";
25370 
25371   const char *azExtraArg[] = {
25372     "sqlar_uncompress(data, sz)",
25373     "data"
25374   };
25375 
25376   sqlite3_stmt *pSql = 0;
25377   int rc = SQLITE_OK;
25378   char *zDir = 0;
25379   char *zWhere = 0;
25380   int i, j;
25381 
25382   /* If arguments are specified, check that they actually exist within
25383   ** the archive before proceeding. And formulate a WHERE clause to
25384   ** match them.  */
25385   rc = arCheckEntries(pAr);
25386   arWhereClause(&rc, pAr, &zWhere);
25387 
25388   if( rc==SQLITE_OK ){
25389     if( pAr->zDir ){
25390       zDir = sqlite3_mprintf("%s/", pAr->zDir);
25391     }else{
25392       zDir = sqlite3_mprintf("");
25393     }
25394     if( zDir==0 ) rc = SQLITE_NOMEM;
25395   }
25396 
25397   shellPreparePrintf(pAr->db, &rc, &pSql, zSql1,
25398       azExtraArg[pAr->bZip], pAr->zSrcTable, zWhere
25399   );
25400 
25401   if( rc==SQLITE_OK ){
25402     j = sqlite3_bind_parameter_index(pSql, "$dir");
25403     sqlite3_bind_text(pSql, j, zDir, -1, SQLITE_STATIC);
25404 
25405     /* Run the SELECT statement twice. The first time, writefile() is called
25406     ** for all archive members that should be extracted. The second time,
25407     ** only for the directories. This is because the timestamps for
25408     ** extracted directories must be reset after they are populated (as
25409     ** populating them changes the timestamp).  */
25410     for(i=0; i<2; i++){
25411       j = sqlite3_bind_parameter_index(pSql, "$dirOnly");
25412       sqlite3_bind_int(pSql, j, i);
25413       if( pAr->bDryRun ){
25414         oputf("%s\n", sqlite3_sql(pSql));
25415       }else{
25416         while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
25417           if( i==0 && pAr->bVerbose ){
25418             oputf("%s\n", sqlite3_column_text(pSql, 0));
25419           }
25420         }
25421       }
25422       shellReset(&rc, pSql);
25423     }
25424     shellFinalize(&rc, pSql);
25425   }
25426 
25427   sqlite3_free(zDir);
25428   sqlite3_free(zWhere);
25429   return rc;
25430 }
25431 
25432 /*
25433 ** Run the SQL statement in zSql.  Or if doing a --dryrun, merely print it out.
25434 */
arExecSql(ArCommand * pAr,const char * zSql)25435 static int arExecSql(ArCommand *pAr, const char *zSql){
25436   int rc;
25437   if( pAr->bDryRun ){
25438     oputf("%s\n", zSql);
25439     rc = SQLITE_OK;
25440   }else{
25441     char *zErr = 0;
25442     rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr);
25443     if( zErr ){
25444       sputf(stdout, "ERROR: %s\n", zErr);
25445       sqlite3_free(zErr);
25446     }
25447   }
25448   return rc;
25449 }
25450 
25451 
25452 /*
25453 ** Implementation of .ar "create", "insert", and "update" commands.
25454 **
25455 **     create    ->     Create a new SQL archive
25456 **     insert    ->     Insert or reinsert all files listed
25457 **     update    ->     Insert files that have changed or that were not
25458 **                      previously in the archive
25459 **
25460 ** Create the "sqlar" table in the database if it does not already exist.
25461 ** Then add each file in the azFile[] array to the archive. Directories
25462 ** are added recursively. If argument bVerbose is non-zero, a message is
25463 ** printed on stdout for each file archived.
25464 **
25465 ** The create command is the same as update, except that it drops
25466 ** any existing "sqlar" table before beginning.  The "insert" command
25467 ** always overwrites every file named on the command-line, where as
25468 ** "update" only overwrites if the size or mtime or mode has changed.
25469 */
arCreateOrUpdateCommand(ArCommand * pAr,int bUpdate,int bOnlyIfChanged)25470 static int arCreateOrUpdateCommand(
25471   ArCommand *pAr,                 /* Command arguments and options */
25472   int bUpdate,                    /* true for a --create. */
25473   int bOnlyIfChanged              /* Only update if file has changed */
25474 ){
25475   const char *zCreate =
25476       "CREATE TABLE IF NOT EXISTS sqlar(\n"
25477       "  name TEXT PRIMARY KEY,  -- name of the file\n"
25478       "  mode INT,               -- access permissions\n"
25479       "  mtime INT,              -- last modification time\n"
25480       "  sz INT,                 -- original file size\n"
25481       "  data BLOB               -- compressed content\n"
25482       ")";
25483   const char *zDrop = "DROP TABLE IF EXISTS sqlar";
25484   const char *zInsertFmt[2] = {
25485      "REPLACE INTO %s(name,mode,mtime,sz,data)\n"
25486      "  SELECT\n"
25487      "    %s,\n"
25488      "    mode,\n"
25489      "    mtime,\n"
25490      "    CASE substr(lsmode(mode),1,1)\n"
25491      "      WHEN '-' THEN length(data)\n"
25492      "      WHEN 'd' THEN 0\n"
25493      "      ELSE -1 END,\n"
25494      "    sqlar_compress(data)\n"
25495      "  FROM fsdir(%Q,%Q) AS disk\n"
25496      "  WHERE lsmode(mode) NOT LIKE '?%%'%s;"
25497      ,
25498      "REPLACE INTO %s(name,mode,mtime,data)\n"
25499      "  SELECT\n"
25500      "    %s,\n"
25501      "    mode,\n"
25502      "    mtime,\n"
25503      "    data\n"
25504      "  FROM fsdir(%Q,%Q) AS disk\n"
25505      "  WHERE lsmode(mode) NOT LIKE '?%%'%s;"
25506   };
25507   int i;                          /* For iterating through azFile[] */
25508   int rc;                         /* Return code */
25509   const char *zTab = 0;           /* SQL table into which to insert */
25510   char *zSql;
25511   char zTemp[50];
25512   char *zExists = 0;
25513 
25514   arExecSql(pAr, "PRAGMA page_size=512");
25515   rc = arExecSql(pAr, "SAVEPOINT ar;");
25516   if( rc!=SQLITE_OK ) return rc;
25517   zTemp[0] = 0;
25518   if( pAr->bZip ){
25519     /* Initialize the zipfile virtual table, if necessary */
25520     if( pAr->zFile ){
25521       sqlite3_uint64 r;
25522       sqlite3_randomness(sizeof(r),&r);
25523       sqlite3_snprintf(sizeof(zTemp),zTemp,"zip%016llx",r);
25524       zTab = zTemp;
25525       zSql = sqlite3_mprintf(
25526          "CREATE VIRTUAL TABLE temp.%s USING zipfile(%Q)",
25527          zTab, pAr->zFile
25528       );
25529       rc = arExecSql(pAr, zSql);
25530       sqlite3_free(zSql);
25531     }else{
25532       zTab = "zip";
25533     }
25534   }else{
25535     /* Initialize the table for an SQLAR */
25536     zTab = "sqlar";
25537     if( bUpdate==0 ){
25538       rc = arExecSql(pAr, zDrop);
25539       if( rc!=SQLITE_OK ) goto end_ar_transaction;
25540     }
25541     rc = arExecSql(pAr, zCreate);
25542   }
25543   if( bOnlyIfChanged ){
25544     zExists = sqlite3_mprintf(
25545       " AND NOT EXISTS("
25546           "SELECT 1 FROM %s AS mem"
25547           " WHERE mem.name=disk.name"
25548           " AND mem.mtime=disk.mtime"
25549           " AND mem.mode=disk.mode)", zTab);
25550   }else{
25551     zExists = sqlite3_mprintf("");
25552   }
25553   if( zExists==0 ) rc = SQLITE_NOMEM;
25554   for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){
25555     char *zSql2 = sqlite3_mprintf(zInsertFmt[pAr->bZip], zTab,
25556         pAr->bVerbose ? "shell_putsnl(name)" : "name",
25557         pAr->azArg[i], pAr->zDir, zExists);
25558     rc = arExecSql(pAr, zSql2);
25559     sqlite3_free(zSql2);
25560   }
25561 end_ar_transaction:
25562   if( rc!=SQLITE_OK ){
25563     sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0);
25564   }else{
25565     rc = arExecSql(pAr, "RELEASE ar;");
25566     if( pAr->bZip && pAr->zFile ){
25567       zSql = sqlite3_mprintf("DROP TABLE %s", zTemp);
25568       arExecSql(pAr, zSql);
25569       sqlite3_free(zSql);
25570     }
25571   }
25572   sqlite3_free(zExists);
25573   return rc;
25574 }
25575 
25576 /*
25577 ** Implementation of ".ar" dot command.
25578 */
arDotCommand(ShellState * pState,int fromCmdLine,char ** azArg,int nArg)25579 static int arDotCommand(
25580   ShellState *pState,          /* Current shell tool state */
25581   int fromCmdLine,             /* True if -A command-line option, not .ar cmd */
25582   char **azArg,                /* Array of arguments passed to dot command */
25583   int nArg                     /* Number of entries in azArg[] */
25584 ){
25585   ArCommand cmd;
25586   int rc;
25587   memset(&cmd, 0, sizeof(cmd));
25588   cmd.fromCmdLine = fromCmdLine;
25589   rc = arParseCommand(azArg, nArg, &cmd);
25590   if( rc==SQLITE_OK ){
25591     int eDbType = SHELL_OPEN_UNSPEC;
25592     cmd.p = pState;
25593     cmd.db = pState->db;
25594     if( cmd.zFile ){
25595       eDbType = deduceDatabaseType(cmd.zFile, 1);
25596     }else{
25597       eDbType = pState->openMode;
25598     }
25599     if( eDbType==SHELL_OPEN_ZIPFILE ){
25600       if( cmd.eCmd==AR_CMD_EXTRACT || cmd.eCmd==AR_CMD_LIST ){
25601         if( cmd.zFile==0 ){
25602           cmd.zSrcTable = sqlite3_mprintf("zip");
25603         }else{
25604           cmd.zSrcTable = sqlite3_mprintf("zipfile(%Q)", cmd.zFile);
25605         }
25606       }
25607       cmd.bZip = 1;
25608     }else if( cmd.zFile ){
25609       int flags;
25610       if( cmd.bAppend ) eDbType = SHELL_OPEN_APPENDVFS;
25611       if( cmd.eCmd==AR_CMD_CREATE || cmd.eCmd==AR_CMD_INSERT
25612            || cmd.eCmd==AR_CMD_REMOVE || cmd.eCmd==AR_CMD_UPDATE ){
25613         flags = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE;
25614       }else{
25615         flags = SQLITE_OPEN_READONLY;
25616       }
25617       cmd.db = 0;
25618       if( cmd.bDryRun ){
25619         oputf("-- open database '%s'%s\n", cmd.zFile,
25620               eDbType==SHELL_OPEN_APPENDVFS ? " using 'apndvfs'" : "");
25621       }
25622       rc = sqlite3_open_v2(cmd.zFile, &cmd.db, flags,
25623              eDbType==SHELL_OPEN_APPENDVFS ? "apndvfs" : 0);
25624       if( rc!=SQLITE_OK ){
25625         eputf("cannot open file: %s (%s)\n", cmd.zFile, sqlite3_errmsg(cmd.db));
25626         goto end_ar_command;
25627       }
25628       sqlite3_fileio_init(cmd.db, 0, 0);
25629       sqlite3_sqlar_init(cmd.db, 0, 0);
25630       sqlite3_create_function(cmd.db, "shell_putsnl", 1, SQLITE_UTF8, cmd.p,
25631                               shellPutsFunc, 0, 0);
25632 
25633     }
25634     if( cmd.zSrcTable==0 && cmd.bZip==0 && cmd.eCmd!=AR_CMD_HELP ){
25635       if( cmd.eCmd!=AR_CMD_CREATE
25636        && sqlite3_table_column_metadata(cmd.db,0,"sqlar","name",0,0,0,0,0)
25637       ){
25638         eputz("database does not contain an 'sqlar' table\n");
25639         rc = SQLITE_ERROR;
25640         goto end_ar_command;
25641       }
25642       cmd.zSrcTable = sqlite3_mprintf("sqlar");
25643     }
25644 
25645     switch( cmd.eCmd ){
25646       case AR_CMD_CREATE:
25647         rc = arCreateOrUpdateCommand(&cmd, 0, 0);
25648         break;
25649 
25650       case AR_CMD_EXTRACT:
25651         rc = arExtractCommand(&cmd);
25652         break;
25653 
25654       case AR_CMD_LIST:
25655         rc = arListCommand(&cmd);
25656         break;
25657 
25658       case AR_CMD_HELP:
25659         arUsage(pState->out);
25660         break;
25661 
25662       case AR_CMD_INSERT:
25663         rc = arCreateOrUpdateCommand(&cmd, 1, 0);
25664         break;
25665 
25666       case AR_CMD_REMOVE:
25667         rc = arRemoveCommand(&cmd);
25668         break;
25669 
25670       default:
25671         assert( cmd.eCmd==AR_CMD_UPDATE );
25672         rc = arCreateOrUpdateCommand(&cmd, 1, 1);
25673         break;
25674     }
25675   }
25676 end_ar_command:
25677   if( cmd.db!=pState->db ){
25678     close_db(cmd.db);
25679   }
25680   sqlite3_free(cmd.zSrcTable);
25681 
25682   return rc;
25683 }
25684 /* End of the ".archive" or ".ar" command logic
25685 *******************************************************************************/
25686 #endif /* !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) */
25687 
25688 #if SQLITE_SHELL_HAVE_RECOVER
25689 
25690 /*
25691 ** This function is used as a callback by the recover extension. Simply
25692 ** print the supplied SQL statement to stdout.
25693 */
recoverSqlCb(void * pCtx,const char * zSql)25694 static int recoverSqlCb(void *pCtx, const char *zSql){
25695   ShellState *pState = (ShellState*)pCtx;
25696   sputf(pState->out, "%s;\n", zSql);
25697   return SQLITE_OK;
25698 }
25699 
25700 /*
25701 ** This function is called to recover data from the database. A script
25702 ** to construct a new database containing all recovered data is output
25703 ** on stream pState->out.
25704 */
recoverDatabaseCmd(ShellState * pState,int nArg,char ** azArg)25705 static int recoverDatabaseCmd(ShellState *pState, int nArg, char **azArg){
25706   int rc = SQLITE_OK;
25707   const char *zRecoveryDb = "";   /* Name of "recovery" database.  Debug only */
25708   const char *zLAF = "lost_and_found";
25709   int bFreelist = 1;              /* 0 if --ignore-freelist is specified */
25710   int bRowids = 1;                /* 0 if --no-rowids */
25711   sqlite3_recover *p = 0;
25712   int i = 0;
25713 
25714   for(i=1; i<nArg; i++){
25715     char *z = azArg[i];
25716     int n;
25717     if( z[0]=='-' && z[1]=='-' ) z++;
25718     n = strlen30(z);
25719     if( n<=17 && memcmp("-ignore-freelist", z, n)==0 ){
25720       bFreelist = 0;
25721     }else
25722     if( n<=12 && memcmp("-recovery-db", z, n)==0 && i<(nArg-1) ){
25723       /* This option determines the name of the ATTACH-ed database used
25724       ** internally by the recovery extension.  The default is "" which
25725       ** means to use a temporary database that is automatically deleted
25726       ** when closed.  This option is undocumented and might disappear at
25727       ** any moment. */
25728       i++;
25729       zRecoveryDb = azArg[i];
25730     }else
25731     if( n<=15 && memcmp("-lost-and-found", z, n)==0 && i<(nArg-1) ){
25732       i++;
25733       zLAF = azArg[i];
25734     }else
25735     if( n<=10 && memcmp("-no-rowids", z, n)==0 ){
25736       bRowids = 0;
25737     }
25738     else{
25739       eputf("unexpected option: %s\n", azArg[i]);
25740       showHelp(pState->out, azArg[0]);
25741       return 1;
25742     }
25743   }
25744 
25745   p = sqlite3_recover_init_sql(
25746       pState->db, "main", recoverSqlCb, (void*)pState
25747   );
25748 
25749   sqlite3_recover_config(p, 789, (void*)zRecoveryDb);  /* Debug use only */
25750   sqlite3_recover_config(p, SQLITE_RECOVER_LOST_AND_FOUND, (void*)zLAF);
25751   sqlite3_recover_config(p, SQLITE_RECOVER_ROWIDS, (void*)&bRowids);
25752   sqlite3_recover_config(p, SQLITE_RECOVER_FREELIST_CORRUPT,(void*)&bFreelist);
25753 
25754   sqlite3_recover_run(p);
25755   if( sqlite3_recover_errcode(p)!=SQLITE_OK ){
25756     const char *zErr = sqlite3_recover_errmsg(p);
25757     int errCode = sqlite3_recover_errcode(p);
25758     eputf("sql error: %s (%d)\n", zErr, errCode);
25759   }
25760   rc = sqlite3_recover_finish(p);
25761   return rc;
25762 }
25763 #endif /* SQLITE_SHELL_HAVE_RECOVER */
25764 
25765 /*
25766 ** Implementation of ".intck STEPS_PER_UNLOCK" command.
25767 */
intckDatabaseCmd(ShellState * pState,i64 nStepPerUnlock)25768 static int intckDatabaseCmd(ShellState *pState, i64 nStepPerUnlock){
25769   sqlite3_intck *p = 0;
25770   int rc = SQLITE_OK;
25771 
25772   rc = sqlite3_intck_open(pState->db, "main", &p);
25773   if( rc==SQLITE_OK ){
25774     i64 nStep = 0;
25775     i64 nError = 0;
25776     const char *zErr = 0;
25777     while( SQLITE_OK==sqlite3_intck_step(p) ){
25778       const char *zMsg = sqlite3_intck_message(p);
25779       if( zMsg ){
25780         oputf("%s\n", zMsg);
25781         nError++;
25782       }
25783       nStep++;
25784       if( nStepPerUnlock && (nStep % nStepPerUnlock)==0 ){
25785         sqlite3_intck_unlock(p);
25786       }
25787     }
25788     rc = sqlite3_intck_error(p, &zErr);
25789     if( zErr ){
25790       eputf("%s\n", zErr);
25791     }
25792     sqlite3_intck_close(p);
25793 
25794     oputf("%lld steps, %lld errors\n", nStep, nError);
25795   }
25796 
25797   return rc;
25798 }
25799 
25800 /*
25801  * zAutoColumn(zCol, &db, ?) => Maybe init db, add column zCol to it.
25802  * zAutoColumn(0, &db, ?) => (db!=0) Form columns spec for CREATE TABLE,
25803  *   close db and set it to 0, and return the columns spec, to later
25804  *   be sqlite3_free()'ed by the caller.
25805  * The return is 0 when either:
25806  *   (a) The db was not initialized and zCol==0 (There are no columns.)
25807  *   (b) zCol!=0  (Column was added, db initialized as needed.)
25808  * The 3rd argument, pRenamed, references an out parameter. If the
25809  * pointer is non-zero, its referent will be set to a summary of renames
25810  * done if renaming was necessary, or set to 0 if none was done. The out
25811  * string (if any) must be sqlite3_free()'ed by the caller.
25812  */
25813 #ifdef SHELL_DEBUG
25814 #define rc_err_oom_die(rc) \
25815   if( rc==SQLITE_NOMEM ) shell_check_oom(0); \
25816   else if(!(rc==SQLITE_OK||rc==SQLITE_DONE)) \
25817     eputf("E:%d\n",rc), assert(0)
25818 #else
rc_err_oom_die(int rc)25819 static void rc_err_oom_die(int rc){
25820   if( rc==SQLITE_NOMEM ) shell_check_oom(0);
25821   assert(rc==SQLITE_OK||rc==SQLITE_DONE);
25822 }
25823 #endif
25824 
25825 #ifdef SHELL_COLFIX_DB /* If this is set, the DB can be in a file. */
25826 static char zCOL_DB[] = SHELL_STRINGIFY(SHELL_COLFIX_DB);
25827 #else  /* Otherwise, memory is faster/better for the transient DB. */
25828 static const char *zCOL_DB = ":memory:";
25829 #endif
25830 
25831 /* Define character (as C string) to separate generated column ordinal
25832  * from protected part of incoming column names. This defaults to "_"
25833  * so that incoming column identifiers that did not need not be quoted
25834  * remain usable without being quoted. It must be one character.
25835  */
25836 #ifndef SHELL_AUTOCOLUMN_SEP
25837 # define AUTOCOLUMN_SEP "_"
25838 #else
25839 # define AUTOCOLUMN_SEP SHELL_STRINGIFY(SHELL_AUTOCOLUMN_SEP)
25840 #endif
25841 
zAutoColumn(const char * zColNew,sqlite3 ** pDb,char ** pzRenamed)25842 static char *zAutoColumn(const char *zColNew, sqlite3 **pDb, char **pzRenamed){
25843   /* Queries and D{D,M}L used here */
25844   static const char * const zTabMake = "\
25845 CREATE TABLE ColNames(\
25846  cpos INTEGER PRIMARY KEY,\
25847  name TEXT, nlen INT, chop INT, reps INT, suff TEXT);\
25848 CREATE VIEW RepeatedNames AS \
25849 SELECT DISTINCT t.name FROM ColNames t \
25850 WHERE t.name COLLATE NOCASE IN (\
25851  SELECT o.name FROM ColNames o WHERE o.cpos<>t.cpos\
25852 );\
25853 ";
25854   static const char * const zTabFill = "\
25855 INSERT INTO ColNames(name,nlen,chop,reps,suff)\
25856  VALUES(iif(length(?1)>0,?1,'?'),max(length(?1),1),0,0,'')\
25857 ";
25858   static const char * const zHasDupes = "\
25859 SELECT count(DISTINCT (substring(name,1,nlen-chop)||suff) COLLATE NOCASE)\
25860  <count(name) FROM ColNames\
25861 ";
25862 #ifdef SHELL_COLUMN_RENAME_CLEAN
25863   static const char * const zDedoctor = "\
25864 UPDATE ColNames SET chop=iif(\
25865   (substring(name,nlen,1) BETWEEN '0' AND '9')\
25866   AND (rtrim(name,'0123456790') glob '*"AUTOCOLUMN_SEP"'),\
25867  nlen-length(rtrim(name, '"AUTOCOLUMN_SEP"0123456789')),\
25868  0\
25869 )\
25870 ";
25871 #endif
25872   static const char * const zSetReps = "\
25873 UPDATE ColNames AS t SET reps=\
25874 (SELECT count(*) FROM ColNames d \
25875  WHERE substring(t.name,1,t.nlen-t.chop)=substring(d.name,1,d.nlen-d.chop)\
25876  COLLATE NOCASE\
25877 )\
25878 ";
25879 #ifdef SQLITE_ENABLE_MATH_FUNCTIONS
25880   static const char * const zColDigits = "\
25881 SELECT CAST(ceil(log(count(*)+0.5)) AS INT) FROM ColNames \
25882 ";
25883 #else
25884   /* Counting on SQLITE_MAX_COLUMN < 100,000 here. (32767 is the hard limit.) */
25885   static const char * const zColDigits = "\
25886 SELECT CASE WHEN (nc < 10) THEN 1 WHEN (nc < 100) THEN 2 \
25887  WHEN (nc < 1000) THEN 3 WHEN (nc < 10000) THEN 4 \
25888  ELSE 5 FROM (SELECT count(*) AS nc FROM ColNames) \
25889 ";
25890 #endif
25891   static const char * const zRenameRank =
25892 #ifdef SHELL_COLUMN_RENAME_CLEAN
25893     "UPDATE ColNames AS t SET suff="
25894     "iif(reps>1, printf('%c%0*d', '"AUTOCOLUMN_SEP"', $1, cpos), '')"
25895 #else /* ...RENAME_MINIMAL_ONE_PASS */
25896 "WITH Lzn(nlz) AS (" /* Find minimum extraneous leading 0's for uniqueness */
25897 "  SELECT 0 AS nlz"
25898 "  UNION"
25899 "  SELECT nlz+1 AS nlz FROM Lzn"
25900 "  WHERE EXISTS("
25901 "   SELECT 1"
25902 "   FROM ColNames t, ColNames o"
25903 "   WHERE"
25904 "    iif(t.name IN (SELECT * FROM RepeatedNames),"
25905 "     printf('%s"AUTOCOLUMN_SEP"%s',"
25906 "      t.name, substring(printf('%.*c%0.*d',nlz+1,'0',$1,t.cpos),2)),"
25907 "     t.name"
25908 "    )"
25909 "    ="
25910 "    iif(o.name IN (SELECT * FROM RepeatedNames),"
25911 "     printf('%s"AUTOCOLUMN_SEP"%s',"
25912 "      o.name, substring(printf('%.*c%0.*d',nlz+1,'0',$1,o.cpos),2)),"
25913 "     o.name"
25914 "    )"
25915 "    COLLATE NOCASE"
25916 "    AND o.cpos<>t.cpos"
25917 "   GROUP BY t.cpos"
25918 "  )"
25919 ") UPDATE Colnames AS t SET"
25920 " chop = 0," /* No chopping, never touch incoming names. */
25921 " suff = iif(name IN (SELECT * FROM RepeatedNames),"
25922 "  printf('"AUTOCOLUMN_SEP"%s', substring("
25923 "   printf('%.*c%0.*d',(SELECT max(nlz) FROM Lzn)+1,'0',1,t.cpos),2)),"
25924 "  ''"
25925 " )"
25926 #endif
25927     ;
25928   static const char * const zCollectVar = "\
25929 SELECT\
25930  '('||x'0a'\
25931  || group_concat(\
25932   cname||' TEXT',\
25933   ','||iif((cpos-1)%4>0, ' ', x'0a'||' '))\
25934  ||')' AS ColsSpec \
25935 FROM (\
25936  SELECT cpos, printf('\"%w\"',printf('%!.*s%s', nlen-chop,name,suff)) AS cname \
25937  FROM ColNames ORDER BY cpos\
25938 )";
25939   static const char * const zRenamesDone =
25940     "SELECT group_concat("
25941     " printf('\"%w\" to \"%w\"',name,printf('%!.*s%s', nlen-chop, name, suff)),"
25942     " ','||x'0a')"
25943     "FROM ColNames WHERE suff<>'' OR chop!=0"
25944     ;
25945   int rc;
25946   sqlite3_stmt *pStmt = 0;
25947   assert(pDb!=0);
25948   if( zColNew ){
25949     /* Add initial or additional column. Init db if necessary. */
25950     if( *pDb==0 ){
25951       if( SQLITE_OK!=sqlite3_open(zCOL_DB, pDb) ) return 0;
25952 #ifdef SHELL_COLFIX_DB
25953       if(*zCOL_DB!=':')
25954         sqlite3_exec(*pDb,"drop table if exists ColNames;"
25955                      "drop view if exists RepeatedNames;",0,0,0);
25956 #endif
25957 #undef SHELL_COLFIX_DB
25958       rc = sqlite3_exec(*pDb, zTabMake, 0, 0, 0);
25959       rc_err_oom_die(rc);
25960     }
25961     assert(*pDb!=0);
25962     rc = sqlite3_prepare_v2(*pDb, zTabFill, -1, &pStmt, 0);
25963     rc_err_oom_die(rc);
25964     rc = sqlite3_bind_text(pStmt, 1, zColNew, -1, 0);
25965     rc_err_oom_die(rc);
25966     rc = sqlite3_step(pStmt);
25967     rc_err_oom_die(rc);
25968     sqlite3_finalize(pStmt);
25969     return 0;
25970   }else if( *pDb==0 ){
25971     return 0;
25972   }else{
25973     /* Formulate the columns spec, close the DB, zero *pDb. */
25974     char *zColsSpec = 0;
25975     int hasDupes = db_int(*pDb, zHasDupes);
25976     int nDigits = (hasDupes)? db_int(*pDb, zColDigits) : 0;
25977     if( hasDupes ){
25978 #ifdef SHELL_COLUMN_RENAME_CLEAN
25979       rc = sqlite3_exec(*pDb, zDedoctor, 0, 0, 0);
25980       rc_err_oom_die(rc);
25981 #endif
25982       rc = sqlite3_exec(*pDb, zSetReps, 0, 0, 0);
25983       rc_err_oom_die(rc);
25984       rc = sqlite3_prepare_v2(*pDb, zRenameRank, -1, &pStmt, 0);
25985       rc_err_oom_die(rc);
25986       sqlite3_bind_int(pStmt, 1, nDigits);
25987       rc = sqlite3_step(pStmt);
25988       sqlite3_finalize(pStmt);
25989       if( rc!=SQLITE_DONE ) rc_err_oom_die(SQLITE_NOMEM);
25990     }
25991     assert(db_int(*pDb, zHasDupes)==0); /* Consider: remove this */
25992     rc = sqlite3_prepare_v2(*pDb, zCollectVar, -1, &pStmt, 0);
25993     rc_err_oom_die(rc);
25994     rc = sqlite3_step(pStmt);
25995     if( rc==SQLITE_ROW ){
25996       zColsSpec = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
25997     }else{
25998       zColsSpec = 0;
25999     }
26000     if( pzRenamed!=0 ){
26001       if( !hasDupes ) *pzRenamed = 0;
26002       else{
26003         sqlite3_finalize(pStmt);
26004         if( SQLITE_OK==sqlite3_prepare_v2(*pDb, zRenamesDone, -1, &pStmt, 0)
26005             && SQLITE_ROW==sqlite3_step(pStmt) ){
26006           *pzRenamed = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
26007         }else
26008           *pzRenamed = 0;
26009       }
26010     }
26011     sqlite3_finalize(pStmt);
26012     sqlite3_close(*pDb);
26013     *pDb = 0;
26014     return zColsSpec;
26015   }
26016 }
26017 
26018 /*
26019 ** Check if the sqlite_schema table contains one or more virtual tables. If
26020 ** parameter zLike is not NULL, then it is an SQL expression that the
26021 ** sqlite_schema row must also match. If one or more such rows are found,
26022 ** print the following warning to the output:
26023 **
26024 ** WARNING: Script requires that SQLITE_DBCONFIG_DEFENSIVE be disabled
26025 */
outputDumpWarning(ShellState * p,const char * zLike)26026 static int outputDumpWarning(ShellState *p, const char *zLike){
26027   int rc = SQLITE_OK;
26028   sqlite3_stmt *pStmt = 0;
26029   shellPreparePrintf(p->db, &rc, &pStmt,
26030     "SELECT 1 FROM sqlite_schema o WHERE "
26031     "sql LIKE 'CREATE VIRTUAL TABLE%%' AND %s", zLike ? zLike : "true"
26032   );
26033   if( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
26034     oputz("/* WARNING: "
26035           "Script requires that SQLITE_DBCONFIG_DEFENSIVE be disabled */\n"
26036     );
26037   }
26038   shellFinalize(&rc, pStmt);
26039   return rc;
26040 }
26041 
26042 /*
26043 ** Fault-Simulator state and logic.
26044 */
26045 static struct {
26046   int iId;           /* ID that triggers a simulated fault.  -1 means "any" */
26047   int iErr;          /* The error code to return on a fault */
26048   int iCnt;          /* Trigger the fault only if iCnt is already zero */
26049   int iInterval;     /* Reset iCnt to this value after each fault */
26050   int eVerbose;      /* When to print output */
26051   int nHit;          /* Number of hits seen so far */
26052   int nRepeat;       /* Turn off after this many hits.  0 for never */
26053   int nSkip;         /* Skip this many before first fault */
26054 } faultsim_state = {-1, 0, 0, 0, 0, 0, 0, 0};
26055 
26056 /*
26057 ** This is the fault-sim callback
26058 */
faultsim_callback(int iArg)26059 static int faultsim_callback(int iArg){
26060   if( faultsim_state.iId>0 && faultsim_state.iId!=iArg ){
26061     return SQLITE_OK;
26062   }
26063   if( faultsim_state.iCnt ){
26064     if( faultsim_state.iCnt>0 ) faultsim_state.iCnt--;
26065     if( faultsim_state.eVerbose>=2 ){
26066       oputf("FAULT-SIM id=%d no-fault (cnt=%d)\n", iArg, faultsim_state.iCnt);
26067     }
26068     return SQLITE_OK;
26069   }
26070   if( faultsim_state.eVerbose>=1 ){
26071     oputf("FAULT-SIM id=%d returns %d\n", iArg, faultsim_state.iErr);
26072   }
26073   faultsim_state.iCnt = faultsim_state.iInterval;
26074   faultsim_state.nHit++;
26075   if( faultsim_state.nRepeat>0 && faultsim_state.nRepeat<=faultsim_state.nHit ){
26076     faultsim_state.iCnt = -1;
26077   }
26078   return faultsim_state.iErr;
26079 }
26080 
26081 /*
26082 ** If an input line begins with "." then invoke this routine to
26083 ** process that line.
26084 **
26085 ** Return 1 on error, 2 to exit, and 0 otherwise.
26086 */
do_meta_command(char * zLine,ShellState * p)26087 static int do_meta_command(char *zLine, ShellState *p){
26088   int h = 1;
26089   int nArg = 0;
26090   int n, c;
26091   int rc = 0;
26092   char *azArg[52];
26093 
26094 #ifndef SQLITE_OMIT_VIRTUALTABLE
26095   if( p->expert.pExpert ){
26096     expertFinish(p, 1, 0);
26097   }
26098 #endif
26099 
26100   /* Parse the input line into tokens.
26101   */
26102   while( zLine[h] && nArg<ArraySize(azArg)-1 ){
26103     while( IsSpace(zLine[h]) ){ h++; }
26104     if( zLine[h]==0 ) break;
26105     if( zLine[h]=='\'' || zLine[h]=='"' ){
26106       int delim = zLine[h++];
26107       azArg[nArg++] = &zLine[h];
26108       while( zLine[h] && zLine[h]!=delim ){
26109         if( zLine[h]=='\\' && delim=='"' && zLine[h+1]!=0 ) h++;
26110         h++;
26111       }
26112       if( zLine[h]==delim ){
26113         zLine[h++] = 0;
26114       }
26115       if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
26116     }else{
26117       azArg[nArg++] = &zLine[h];
26118       while( zLine[h] && !IsSpace(zLine[h]) ){ h++; }
26119       if( zLine[h] ) zLine[h++] = 0;
26120     }
26121   }
26122   azArg[nArg] = 0;
26123 
26124   /* Process the input line.
26125   */
26126   if( nArg==0 ) return 0; /* no tokens, no error */
26127   n = strlen30(azArg[0]);
26128   c = azArg[0][0];
26129   clearTempFile(p);
26130 
26131 #ifndef SQLITE_OMIT_AUTHORIZATION
26132   if( c=='a' && cli_strncmp(azArg[0], "auth", n)==0 ){
26133     if( nArg!=2 ){
26134       eputz("Usage: .auth ON|OFF\n");
26135       rc = 1;
26136       goto meta_command_exit;
26137     }
26138     open_db(p, 0);
26139     if( booleanValue(azArg[1]) ){
26140       sqlite3_set_authorizer(p->db, shellAuth, p);
26141     }else if( p->bSafeModePersist ){
26142       sqlite3_set_authorizer(p->db, safeModeAuth, p);
26143     }else{
26144       sqlite3_set_authorizer(p->db, 0, 0);
26145     }
26146   }else
26147 #endif
26148 
26149 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) \
26150   && !defined(SQLITE_SHELL_FIDDLE)
26151   if( c=='a' && cli_strncmp(azArg[0], "archive", n)==0 ){
26152     open_db(p, 0);
26153     failIfSafeMode(p, "cannot run .archive in safe mode");
26154     rc = arDotCommand(p, 0, azArg, nArg);
26155   }else
26156 #endif
26157 
26158 #ifndef SQLITE_SHELL_FIDDLE
26159   if( (c=='b' && n>=3 && cli_strncmp(azArg[0], "backup", n)==0)
26160    || (c=='s' && n>=3 && cli_strncmp(azArg[0], "save", n)==0)
26161   ){
26162     const char *zDestFile = 0;
26163     const char *zDb = 0;
26164     sqlite3 *pDest;
26165     sqlite3_backup *pBackup;
26166     int j;
26167     int bAsync = 0;
26168     const char *zVfs = 0;
26169     failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]);
26170     for(j=1; j<nArg; j++){
26171       const char *z = azArg[j];
26172       if( z[0]=='-' ){
26173         if( z[1]=='-' ) z++;
26174         if( cli_strcmp(z, "-append")==0 ){
26175           zVfs = "apndvfs";
26176         }else
26177         if( cli_strcmp(z, "-async")==0 ){
26178           bAsync = 1;
26179         }else
26180         {
26181           eputf("unknown option: %s\n", azArg[j]);
26182           return 1;
26183         }
26184       }else if( zDestFile==0 ){
26185         zDestFile = azArg[j];
26186       }else if( zDb==0 ){
26187         zDb = zDestFile;
26188         zDestFile = azArg[j];
26189       }else{
26190         eputz("Usage: .backup ?DB? ?OPTIONS? FILENAME\n");
26191         return 1;
26192       }
26193     }
26194     if( zDestFile==0 ){
26195       eputz("missing FILENAME argument on .backup\n");
26196       return 1;
26197     }
26198     if( zDb==0 ) zDb = "main";
26199     rc = sqlite3_open_v2(zDestFile, &pDest,
26200                   SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE, zVfs);
26201     if( rc!=SQLITE_OK ){
26202       eputf("Error: cannot open \"%s\"\n", zDestFile);
26203       close_db(pDest);
26204       return 1;
26205     }
26206     if( bAsync ){
26207       sqlite3_exec(pDest, "PRAGMA synchronous=OFF; PRAGMA journal_mode=OFF;",
26208                    0, 0, 0);
26209     }
26210     open_db(p, 0);
26211     pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
26212     if( pBackup==0 ){
26213       eputf("Error: %s\n", sqlite3_errmsg(pDest));
26214       close_db(pDest);
26215       return 1;
26216     }
26217     while(  (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
26218     sqlite3_backup_finish(pBackup);
26219     if( rc==SQLITE_DONE ){
26220       rc = 0;
26221     }else{
26222       eputf("Error: %s\n", sqlite3_errmsg(pDest));
26223       rc = 1;
26224     }
26225     close_db(pDest);
26226   }else
26227 #endif /* !defined(SQLITE_SHELL_FIDDLE) */
26228 
26229   if( c=='b' && n>=3 && cli_strncmp(azArg[0], "bail", n)==0 ){
26230     if( nArg==2 ){
26231       bail_on_error = booleanValue(azArg[1]);
26232     }else{
26233       eputz("Usage: .bail on|off\n");
26234       rc = 1;
26235     }
26236   }else
26237 
26238   /* Undocumented.  Legacy only.  See "crnl" below */
26239   if( c=='b' && n>=3 && cli_strncmp(azArg[0], "binary", n)==0 ){
26240     if( nArg==2 ){
26241       if( booleanValue(azArg[1]) ){
26242         setBinaryMode(p->out, 1);
26243       }else{
26244         setTextMode(p->out, 1);
26245       }
26246     }else{
26247       eputz("The \".binary\" command is deprecated. Use \".crnl\" instead.\n"
26248             "Usage: .binary on|off\n");
26249       rc = 1;
26250     }
26251   }else
26252 
26253   /* The undocumented ".breakpoint" command causes a call to the no-op
26254   ** routine named test_breakpoint().
26255   */
26256   if( c=='b' && n>=3 && cli_strncmp(azArg[0], "breakpoint", n)==0 ){
26257     test_breakpoint();
26258   }else
26259 
26260 #ifndef SQLITE_SHELL_FIDDLE
26261   if( c=='c' && cli_strcmp(azArg[0],"cd")==0 ){
26262     failIfSafeMode(p, "cannot run .cd in safe mode");
26263     if( nArg==2 ){
26264 #if defined(_WIN32) || defined(WIN32)
26265       wchar_t *z = sqlite3_win32_utf8_to_unicode(azArg[1]);
26266       rc = !SetCurrentDirectoryW(z);
26267       sqlite3_free(z);
26268 #else
26269       rc = chdir(azArg[1]);
26270 #endif
26271       if( rc ){
26272         eputf("Cannot change to directory \"%s\"\n", azArg[1]);
26273         rc = 1;
26274       }
26275     }else{
26276       eputz("Usage: .cd DIRECTORY\n");
26277       rc = 1;
26278     }
26279   }else
26280 #endif /* !defined(SQLITE_SHELL_FIDDLE) */
26281 
26282   if( c=='c' && n>=3 && cli_strncmp(azArg[0], "changes", n)==0 ){
26283     if( nArg==2 ){
26284       setOrClearFlag(p, SHFLG_CountChanges, azArg[1]);
26285     }else{
26286       eputz("Usage: .changes on|off\n");
26287       rc = 1;
26288     }
26289   }else
26290 
26291 #ifndef SQLITE_SHELL_FIDDLE
26292   /* Cancel output redirection, if it is currently set (by .testcase)
26293   ** Then read the content of the testcase-out.txt file and compare against
26294   ** azArg[1].  If there are differences, report an error and exit.
26295   */
26296   if( c=='c' && n>=3 && cli_strncmp(azArg[0], "check", n)==0 ){
26297     char *zRes = 0;
26298     output_reset(p);
26299     if( nArg!=2 ){
26300       eputz("Usage: .check GLOB-PATTERN\n");
26301       rc = 2;
26302     }else if( (zRes = readFile("testcase-out.txt", 0))==0 ){
26303       rc = 2;
26304     }else if( testcase_glob(azArg[1],zRes)==0 ){
26305       eputf("testcase-%s FAILED\n Expected: [%s]\n      Got: [%s]\n",
26306             p->zTestcase, azArg[1], zRes);
26307       rc = 1;
26308     }else{
26309       oputf("testcase-%s ok\n", p->zTestcase);
26310       p->nCheck++;
26311     }
26312     sqlite3_free(zRes);
26313   }else
26314 #endif /* !defined(SQLITE_SHELL_FIDDLE) */
26315 
26316 #ifndef SQLITE_SHELL_FIDDLE
26317   if( c=='c' && cli_strncmp(azArg[0], "clone", n)==0 ){
26318     failIfSafeMode(p, "cannot run .clone in safe mode");
26319     if( nArg==2 ){
26320       tryToClone(p, azArg[1]);
26321     }else{
26322       eputz("Usage: .clone FILENAME\n");
26323       rc = 1;
26324     }
26325   }else
26326 #endif /* !defined(SQLITE_SHELL_FIDDLE) */
26327 
26328   if( c=='c' && cli_strncmp(azArg[0], "connection", n)==0 ){
26329     if( nArg==1 ){
26330       /* List available connections */
26331       int i;
26332       for(i=0; i<ArraySize(p->aAuxDb); i++){
26333         const char *zFile = p->aAuxDb[i].zDbFilename;
26334         if( p->aAuxDb[i].db==0 && p->pAuxDb!=&p->aAuxDb[i] ){
26335           zFile = "(not open)";
26336         }else if( zFile==0 ){
26337           zFile = "(memory)";
26338         }else if( zFile[0]==0 ){
26339           zFile = "(temporary-file)";
26340         }
26341         if( p->pAuxDb == &p->aAuxDb[i] ){
26342           sputf(stdout, "ACTIVE %d: %s\n", i, zFile);
26343         }else if( p->aAuxDb[i].db!=0 ){
26344           sputf(stdout, "       %d: %s\n", i, zFile);
26345         }
26346       }
26347     }else if( nArg==2 && IsDigit(azArg[1][0]) && azArg[1][1]==0 ){
26348       int i = azArg[1][0] - '0';
26349       if( p->pAuxDb != &p->aAuxDb[i] && i>=0 && i<ArraySize(p->aAuxDb) ){
26350         p->pAuxDb->db = p->db;
26351         p->pAuxDb = &p->aAuxDb[i];
26352         globalDb = p->db = p->pAuxDb->db;
26353         p->pAuxDb->db = 0;
26354       }
26355     }else if( nArg==3 && cli_strcmp(azArg[1], "close")==0
26356            && IsDigit(azArg[2][0]) && azArg[2][1]==0 ){
26357       int i = azArg[2][0] - '0';
26358       if( i<0 || i>=ArraySize(p->aAuxDb) ){
26359         /* No-op */
26360       }else if( p->pAuxDb == &p->aAuxDb[i] ){
26361         eputz("cannot close the active database connection\n");
26362         rc = 1;
26363       }else if( p->aAuxDb[i].db ){
26364         session_close_all(p, i);
26365         close_db(p->aAuxDb[i].db);
26366         p->aAuxDb[i].db = 0;
26367       }
26368     }else{
26369       eputz("Usage: .connection [close] [CONNECTION-NUMBER]\n");
26370       rc = 1;
26371     }
26372   }else
26373 
26374   if( c=='c' && n==4 && cli_strncmp(azArg[0], "crnl", n)==0 ){
26375     if( nArg==2 ){
26376       if( booleanValue(azArg[1]) ){
26377         setTextMode(p->out, 1);
26378       }else{
26379         setBinaryMode(p->out, 1);
26380       }
26381     }else{
26382 #if !defined(_WIN32) && !defined(WIN32)
26383       eputz("The \".crnl\" is a no-op on non-Windows machines.\n");
26384 #endif
26385       eputz("Usage: .crnl on|off\n");
26386       rc = 1;
26387     }
26388   }else
26389 
26390   if( c=='d' && n>1 && cli_strncmp(azArg[0], "databases", n)==0 ){
26391     char **azName = 0;
26392     int nName = 0;
26393     sqlite3_stmt *pStmt;
26394     int i;
26395     open_db(p, 0);
26396     rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
26397     if( rc ){
26398       eputf("Error: %s\n", sqlite3_errmsg(p->db));
26399       rc = 1;
26400     }else{
26401       while( sqlite3_step(pStmt)==SQLITE_ROW ){
26402         const char *zSchema = (const char *)sqlite3_column_text(pStmt,1);
26403         const char *zFile = (const char*)sqlite3_column_text(pStmt,2);
26404         if( zSchema==0 || zFile==0 ) continue;
26405         azName = sqlite3_realloc(azName, (nName+1)*2*sizeof(char*));
26406         shell_check_oom(azName);
26407         azName[nName*2] = strdup(zSchema);
26408         azName[nName*2+1] = strdup(zFile);
26409         nName++;
26410       }
26411     }
26412     sqlite3_finalize(pStmt);
26413     for(i=0; i<nName; i++){
26414       int eTxn = sqlite3_txn_state(p->db, azName[i*2]);
26415       int bRdonly = sqlite3_db_readonly(p->db, azName[i*2]);
26416       const char *z = azName[i*2+1];
26417       oputf("%s: %s %s%s\n",
26418             azName[i*2], z && z[0] ? z : "\"\"", bRdonly ? "r/o" : "r/w",
26419             eTxn==SQLITE_TXN_NONE ? "" :
26420             eTxn==SQLITE_TXN_READ ? " read-txn" : " write-txn");
26421       free(azName[i*2]);
26422       free(azName[i*2+1]);
26423     }
26424     sqlite3_free(azName);
26425   }else
26426 
26427   if( c=='d' && n>=3 && cli_strncmp(azArg[0], "dbconfig", n)==0 ){
26428     static const struct DbConfigChoices {
26429       const char *zName;
26430       int op;
26431     } aDbConfig[] = {
26432         { "defensive",          SQLITE_DBCONFIG_DEFENSIVE             },
26433         { "dqs_ddl",            SQLITE_DBCONFIG_DQS_DDL               },
26434         { "dqs_dml",            SQLITE_DBCONFIG_DQS_DML               },
26435         { "enable_fkey",        SQLITE_DBCONFIG_ENABLE_FKEY           },
26436         { "enable_qpsg",        SQLITE_DBCONFIG_ENABLE_QPSG           },
26437         { "enable_trigger",     SQLITE_DBCONFIG_ENABLE_TRIGGER        },
26438         { "enable_view",        SQLITE_DBCONFIG_ENABLE_VIEW           },
26439         { "fts3_tokenizer",     SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER },
26440         { "legacy_alter_table", SQLITE_DBCONFIG_LEGACY_ALTER_TABLE    },
26441         { "legacy_file_format", SQLITE_DBCONFIG_LEGACY_FILE_FORMAT    },
26442         { "load_extension",     SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION },
26443         { "no_ckpt_on_close",   SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE      },
26444         { "reset_database",     SQLITE_DBCONFIG_RESET_DATABASE        },
26445         { "reverse_scanorder",  SQLITE_DBCONFIG_REVERSE_SCANORDER     },
26446         { "stmt_scanstatus",    SQLITE_DBCONFIG_STMT_SCANSTATUS       },
26447         { "trigger_eqp",        SQLITE_DBCONFIG_TRIGGER_EQP           },
26448         { "trusted_schema",     SQLITE_DBCONFIG_TRUSTED_SCHEMA        },
26449         { "writable_schema",    SQLITE_DBCONFIG_WRITABLE_SCHEMA       },
26450     };
26451     int ii, v;
26452     open_db(p, 0);
26453     for(ii=0; ii<ArraySize(aDbConfig); ii++){
26454       if( nArg>1 && cli_strcmp(azArg[1], aDbConfig[ii].zName)!=0 ) continue;
26455       if( nArg>=3 ){
26456         sqlite3_db_config(p->db, aDbConfig[ii].op, booleanValue(azArg[2]), 0);
26457       }
26458       sqlite3_db_config(p->db, aDbConfig[ii].op, -1, &v);
26459       oputf("%19s %s\n", aDbConfig[ii].zName, v ? "on" : "off");
26460       if( nArg>1 ) break;
26461     }
26462     if( nArg>1 && ii==ArraySize(aDbConfig) ){
26463       eputf("Error: unknown dbconfig \"%s\"\n", azArg[1]);
26464       eputz("Enter \".dbconfig\" with no arguments for a list\n");
26465     }
26466   }else
26467 
26468 #if SQLITE_SHELL_HAVE_RECOVER
26469   if( c=='d' && n>=3 && cli_strncmp(azArg[0], "dbinfo", n)==0 ){
26470     rc = shell_dbinfo_command(p, nArg, azArg);
26471   }else
26472 
26473   if( c=='r' && cli_strncmp(azArg[0], "recover", n)==0 ){
26474     open_db(p, 0);
26475     rc = recoverDatabaseCmd(p, nArg, azArg);
26476   }else
26477 #endif /* SQLITE_SHELL_HAVE_RECOVER */
26478 
26479   if( c=='d' && cli_strncmp(azArg[0], "dump", n)==0 ){
26480     char *zLike = 0;
26481     char *zSql;
26482     int i;
26483     int savedShowHeader = p->showHeader;
26484     int savedShellFlags = p->shellFlgs;
26485     ShellClearFlag(p,
26486        SHFLG_PreserveRowid|SHFLG_Newlines|SHFLG_Echo
26487        |SHFLG_DumpDataOnly|SHFLG_DumpNoSys);
26488     for(i=1; i<nArg; i++){
26489       if( azArg[i][0]=='-' ){
26490         const char *z = azArg[i]+1;
26491         if( z[0]=='-' ) z++;
26492         if( cli_strcmp(z,"preserve-rowids")==0 ){
26493 #ifdef SQLITE_OMIT_VIRTUALTABLE
26494           eputz("The --preserve-rowids option is not compatible"
26495                 " with SQLITE_OMIT_VIRTUALTABLE\n");
26496           rc = 1;
26497           sqlite3_free(zLike);
26498           goto meta_command_exit;
26499 #else
26500           ShellSetFlag(p, SHFLG_PreserveRowid);
26501 #endif
26502         }else
26503         if( cli_strcmp(z,"newlines")==0 ){
26504           ShellSetFlag(p, SHFLG_Newlines);
26505         }else
26506         if( cli_strcmp(z,"data-only")==0 ){
26507           ShellSetFlag(p, SHFLG_DumpDataOnly);
26508         }else
26509         if( cli_strcmp(z,"nosys")==0 ){
26510           ShellSetFlag(p, SHFLG_DumpNoSys);
26511         }else
26512         {
26513           eputf("Unknown option \"%s\" on \".dump\"\n", azArg[i]);
26514           rc = 1;
26515           sqlite3_free(zLike);
26516           goto meta_command_exit;
26517         }
26518       }else{
26519         /* azArg[i] contains a LIKE pattern. This ".dump" request should
26520         ** only dump data for tables for which either the table name matches
26521         ** the LIKE pattern, or the table appears to be a shadow table of
26522         ** a virtual table for which the name matches the LIKE pattern.
26523         */
26524         char *zExpr = sqlite3_mprintf(
26525             "name LIKE %Q ESCAPE '\\' OR EXISTS ("
26526             "  SELECT 1 FROM sqlite_schema WHERE "
26527             "    name LIKE %Q ESCAPE '\\' AND"
26528             "    sql LIKE 'CREATE VIRTUAL TABLE%%' AND"
26529             "    substr(o.name, 1, length(name)+1) == (name||'_')"
26530             ")", azArg[i], azArg[i]
26531         );
26532 
26533         if( zLike ){
26534           zLike = sqlite3_mprintf("%z OR %z", zLike, zExpr);
26535         }else{
26536           zLike = zExpr;
26537         }
26538       }
26539     }
26540 
26541     open_db(p, 0);
26542 
26543     outputDumpWarning(p, zLike);
26544     if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
26545       /* When playing back a "dump", the content might appear in an order
26546       ** which causes immediate foreign key constraints to be violated.
26547       ** So disable foreign-key constraint enforcement to prevent problems. */
26548       oputz("PRAGMA foreign_keys=OFF;\n");
26549       oputz("BEGIN TRANSACTION;\n");
26550     }
26551     p->writableSchema = 0;
26552     p->showHeader = 0;
26553     /* Set writable_schema=ON since doing so forces SQLite to initialize
26554     ** as much of the schema as it can even if the sqlite_schema table is
26555     ** corrupt. */
26556     sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
26557     p->nErr = 0;
26558     if( zLike==0 ) zLike = sqlite3_mprintf("true");
26559     zSql = sqlite3_mprintf(
26560       "SELECT name, type, sql FROM sqlite_schema AS o "
26561       "WHERE (%s) AND type=='table'"
26562       "  AND sql NOT NULL"
26563       " ORDER BY tbl_name='sqlite_sequence', rowid",
26564       zLike
26565     );
26566     run_schema_dump_query(p,zSql);
26567     sqlite3_free(zSql);
26568     if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
26569       zSql = sqlite3_mprintf(
26570         "SELECT sql FROM sqlite_schema AS o "
26571         "WHERE (%s) AND sql NOT NULL"
26572         "  AND type IN ('index','trigger','view') "
26573         "ORDER BY type COLLATE NOCASE DESC",
26574         zLike
26575       );
26576       run_table_dump_query(p, zSql);
26577       sqlite3_free(zSql);
26578     }
26579     sqlite3_free(zLike);
26580     if( p->writableSchema ){
26581       oputz("PRAGMA writable_schema=OFF;\n");
26582       p->writableSchema = 0;
26583     }
26584     sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
26585     sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
26586     if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
26587       oputz(p->nErr?"ROLLBACK; -- due to errors\n":"COMMIT;\n");
26588     }
26589     p->showHeader = savedShowHeader;
26590     p->shellFlgs = savedShellFlags;
26591   }else
26592 
26593   if( c=='e' && cli_strncmp(azArg[0], "echo", n)==0 ){
26594     if( nArg==2 ){
26595       setOrClearFlag(p, SHFLG_Echo, azArg[1]);
26596     }else{
26597       eputz("Usage: .echo on|off\n");
26598       rc = 1;
26599     }
26600   }else
26601 
26602   if( c=='e' && cli_strncmp(azArg[0], "eqp", n)==0 ){
26603     if( nArg==2 ){
26604       p->autoEQPtest = 0;
26605       if( p->autoEQPtrace ){
26606         if( p->db ) sqlite3_exec(p->db, "PRAGMA vdbe_trace=OFF;", 0, 0, 0);
26607         p->autoEQPtrace = 0;
26608       }
26609       if( cli_strcmp(azArg[1],"full")==0 ){
26610         p->autoEQP = AUTOEQP_full;
26611       }else if( cli_strcmp(azArg[1],"trigger")==0 ){
26612         p->autoEQP = AUTOEQP_trigger;
26613 #ifdef SQLITE_DEBUG
26614       }else if( cli_strcmp(azArg[1],"test")==0 ){
26615         p->autoEQP = AUTOEQP_on;
26616         p->autoEQPtest = 1;
26617       }else if( cli_strcmp(azArg[1],"trace")==0 ){
26618         p->autoEQP = AUTOEQP_full;
26619         p->autoEQPtrace = 1;
26620         open_db(p, 0);
26621         sqlite3_exec(p->db, "SELECT name FROM sqlite_schema LIMIT 1", 0, 0, 0);
26622         sqlite3_exec(p->db, "PRAGMA vdbe_trace=ON;", 0, 0, 0);
26623 #endif
26624       }else{
26625         p->autoEQP = (u8)booleanValue(azArg[1]);
26626       }
26627     }else{
26628       eputz("Usage: .eqp off|on|trace|trigger|full\n");
26629       rc = 1;
26630     }
26631   }else
26632 
26633 #ifndef SQLITE_SHELL_FIDDLE
26634   if( c=='e' && cli_strncmp(azArg[0], "exit", n)==0 ){
26635     if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
26636     rc = 2;
26637   }else
26638 #endif
26639 
26640   /* The ".explain" command is automatic now.  It is largely pointless.  It
26641   ** retained purely for backwards compatibility */
26642   if( c=='e' && cli_strncmp(azArg[0], "explain", n)==0 ){
26643     int val = 1;
26644     if( nArg>=2 ){
26645       if( cli_strcmp(azArg[1],"auto")==0 ){
26646         val = 99;
26647       }else{
26648         val =  booleanValue(azArg[1]);
26649       }
26650     }
26651     if( val==1 && p->mode!=MODE_Explain ){
26652       p->normalMode = p->mode;
26653       p->mode = MODE_Explain;
26654       p->autoExplain = 0;
26655     }else if( val==0 ){
26656       if( p->mode==MODE_Explain ) p->mode = p->normalMode;
26657       p->autoExplain = 0;
26658     }else if( val==99 ){
26659       if( p->mode==MODE_Explain ) p->mode = p->normalMode;
26660       p->autoExplain = 1;
26661     }
26662   }else
26663 
26664 #ifndef SQLITE_OMIT_VIRTUALTABLE
26665   if( c=='e' && cli_strncmp(azArg[0], "expert", n)==0 ){
26666     if( p->bSafeMode ){
26667       eputf("Cannot run experimental commands such as \"%s\" in safe mode\n",
26668             azArg[0]);
26669       rc = 1;
26670     }else{
26671       open_db(p, 0);
26672       expertDotCommand(p, azArg, nArg);
26673     }
26674   }else
26675 #endif
26676 
26677   if( c=='f' && cli_strncmp(azArg[0], "filectrl", n)==0 ){
26678     static const struct {
26679        const char *zCtrlName;   /* Name of a test-control option */
26680        int ctrlCode;            /* Integer code for that option */
26681        const char *zUsage;      /* Usage notes */
26682     } aCtrl[] = {
26683       { "chunk_size",     SQLITE_FCNTL_CHUNK_SIZE,      "SIZE"           },
26684       { "data_version",   SQLITE_FCNTL_DATA_VERSION,    ""               },
26685       { "has_moved",      SQLITE_FCNTL_HAS_MOVED,       ""               },
26686       { "lock_timeout",   SQLITE_FCNTL_LOCK_TIMEOUT,    "MILLISEC"       },
26687       { "persist_wal",    SQLITE_FCNTL_PERSIST_WAL,     "[BOOLEAN]"      },
26688    /* { "pragma",         SQLITE_FCNTL_PRAGMA,          "NAME ARG"       },*/
26689       { "psow",       SQLITE_FCNTL_POWERSAFE_OVERWRITE, "[BOOLEAN]"      },
26690       { "reserve_bytes",  SQLITE_FCNTL_RESERVE_BYTES,   "[N]"            },
26691       { "size_limit",     SQLITE_FCNTL_SIZE_LIMIT,      "[LIMIT]"        },
26692       { "tempfilename",   SQLITE_FCNTL_TEMPFILENAME,    ""               },
26693    /* { "win32_av_retry", SQLITE_FCNTL_WIN32_AV_RETRY,  "COUNT DELAY"    },*/
26694     };
26695     int filectrl = -1;
26696     int iCtrl = -1;
26697     sqlite3_int64 iRes = 0;  /* Integer result to display if rc2==1 */
26698     int isOk = 0;            /* 0: usage  1: %lld  2: no-result */
26699     int n2, i;
26700     const char *zCmd = 0;
26701     const char *zSchema = 0;
26702 
26703     open_db(p, 0);
26704     zCmd = nArg>=2 ? azArg[1] : "help";
26705 
26706     if( zCmd[0]=='-'
26707      && (cli_strcmp(zCmd,"--schema")==0 || cli_strcmp(zCmd,"-schema")==0)
26708      && nArg>=4
26709     ){
26710       zSchema = azArg[2];
26711       for(i=3; i<nArg; i++) azArg[i-2] = azArg[i];
26712       nArg -= 2;
26713       zCmd = azArg[1];
26714     }
26715 
26716     /* The argument can optionally begin with "-" or "--" */
26717     if( zCmd[0]=='-' && zCmd[1] ){
26718       zCmd++;
26719       if( zCmd[0]=='-' && zCmd[1] ) zCmd++;
26720     }
26721 
26722     /* --help lists all file-controls */
26723     if( cli_strcmp(zCmd,"help")==0 ){
26724       oputz("Available file-controls:\n");
26725       for(i=0; i<ArraySize(aCtrl); i++){
26726         oputf("  .filectrl %s %s\n", aCtrl[i].zCtrlName, aCtrl[i].zUsage);
26727       }
26728       rc = 1;
26729       goto meta_command_exit;
26730     }
26731 
26732     /* convert filectrl text option to value. allow any unique prefix
26733     ** of the option name, or a numerical value. */
26734     n2 = strlen30(zCmd);
26735     for(i=0; i<ArraySize(aCtrl); i++){
26736       if( cli_strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){
26737         if( filectrl<0 ){
26738           filectrl = aCtrl[i].ctrlCode;
26739           iCtrl = i;
26740         }else{
26741           eputf("Error: ambiguous file-control: \"%s\"\n"
26742                 "Use \".filectrl --help\" for help\n", zCmd);
26743           rc = 1;
26744           goto meta_command_exit;
26745         }
26746       }
26747     }
26748     if( filectrl<0 ){
26749       eputf("Error: unknown file-control: %s\n"
26750             "Use \".filectrl --help\" for help\n", zCmd);
26751     }else{
26752       switch(filectrl){
26753         case SQLITE_FCNTL_SIZE_LIMIT: {
26754           if( nArg!=2 && nArg!=3 ) break;
26755           iRes = nArg==3 ? integerValue(azArg[2]) : -1;
26756           sqlite3_file_control(p->db, zSchema, SQLITE_FCNTL_SIZE_LIMIT, &iRes);
26757           isOk = 1;
26758           break;
26759         }
26760         case SQLITE_FCNTL_LOCK_TIMEOUT:
26761         case SQLITE_FCNTL_CHUNK_SIZE: {
26762           int x;
26763           if( nArg!=3 ) break;
26764           x = (int)integerValue(azArg[2]);
26765           sqlite3_file_control(p->db, zSchema, filectrl, &x);
26766           isOk = 2;
26767           break;
26768         }
26769         case SQLITE_FCNTL_PERSIST_WAL:
26770         case SQLITE_FCNTL_POWERSAFE_OVERWRITE: {
26771           int x;
26772           if( nArg!=2 && nArg!=3 ) break;
26773           x = nArg==3 ? booleanValue(azArg[2]) : -1;
26774           sqlite3_file_control(p->db, zSchema, filectrl, &x);
26775           iRes = x;
26776           isOk = 1;
26777           break;
26778         }
26779         case SQLITE_FCNTL_DATA_VERSION:
26780         case SQLITE_FCNTL_HAS_MOVED: {
26781           int x;
26782           if( nArg!=2 ) break;
26783           sqlite3_file_control(p->db, zSchema, filectrl, &x);
26784           iRes = x;
26785           isOk = 1;
26786           break;
26787         }
26788         case SQLITE_FCNTL_TEMPFILENAME: {
26789           char *z = 0;
26790           if( nArg!=2 ) break;
26791           sqlite3_file_control(p->db, zSchema, filectrl, &z);
26792           if( z ){
26793             oputf("%s\n", z);
26794             sqlite3_free(z);
26795           }
26796           isOk = 2;
26797           break;
26798         }
26799         case SQLITE_FCNTL_RESERVE_BYTES: {
26800           int x;
26801           if( nArg>=3 ){
26802             x = atoi(azArg[2]);
26803             sqlite3_file_control(p->db, zSchema, filectrl, &x);
26804           }
26805           x = -1;
26806           sqlite3_file_control(p->db, zSchema, filectrl, &x);
26807           oputf("%d\n", x);
26808           isOk = 2;
26809           break;
26810         }
26811       }
26812     }
26813     if( isOk==0 && iCtrl>=0 ){
26814       oputf("Usage: .filectrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage);
26815       rc = 1;
26816     }else if( isOk==1 ){
26817       char zBuf[100];
26818       sqlite3_snprintf(sizeof(zBuf), zBuf, "%lld", iRes);
26819       oputf("%s\n", zBuf);
26820     }
26821   }else
26822 
26823   if( c=='f' && cli_strncmp(azArg[0], "fullschema", n)==0 ){
26824     ShellState data;
26825     int doStats = 0;
26826     memcpy(&data, p, sizeof(data));
26827     data.showHeader = 0;
26828     data.cMode = data.mode = MODE_Semi;
26829     if( nArg==2 && optionMatch(azArg[1], "indent") ){
26830       data.cMode = data.mode = MODE_Pretty;
26831       nArg = 1;
26832     }
26833     if( nArg!=1 ){
26834       eputz("Usage: .fullschema ?--indent?\n");
26835       rc = 1;
26836       goto meta_command_exit;
26837     }
26838     open_db(p, 0);
26839     rc = sqlite3_exec(p->db,
26840        "SELECT sql FROM"
26841        "  (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
26842        "     FROM sqlite_schema UNION ALL"
26843        "   SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_schema) "
26844        "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
26845        "ORDER BY x",
26846        callback, &data, 0
26847     );
26848     if( rc==SQLITE_OK ){
26849       sqlite3_stmt *pStmt;
26850       rc = sqlite3_prepare_v2(p->db,
26851                "SELECT rowid FROM sqlite_schema"
26852                " WHERE name GLOB 'sqlite_stat[134]'",
26853                -1, &pStmt, 0);
26854       if( rc==SQLITE_OK ){
26855         doStats = sqlite3_step(pStmt)==SQLITE_ROW;
26856         sqlite3_finalize(pStmt);
26857       }
26858     }
26859     if( doStats==0 ){
26860       oputz("/* No STAT tables available */\n");
26861     }else{
26862       oputz("ANALYZE sqlite_schema;\n");
26863       data.cMode = data.mode = MODE_Insert;
26864       data.zDestTable = "sqlite_stat1";
26865       shell_exec(&data, "SELECT * FROM sqlite_stat1", 0);
26866       data.zDestTable = "sqlite_stat4";
26867       shell_exec(&data, "SELECT * FROM sqlite_stat4", 0);
26868       oputz("ANALYZE sqlite_schema;\n");
26869     }
26870   }else
26871 
26872   if( c=='h' && cli_strncmp(azArg[0], "headers", n)==0 ){
26873     if( nArg==2 ){
26874       p->showHeader = booleanValue(azArg[1]);
26875       p->shellFlgs |= SHFLG_HeaderSet;
26876     }else{
26877       eputz("Usage: .headers on|off\n");
26878       rc = 1;
26879     }
26880   }else
26881 
26882   if( c=='h' && cli_strncmp(azArg[0], "help", n)==0 ){
26883     if( nArg>=2 ){
26884       n = showHelp(p->out, azArg[1]);
26885       if( n==0 ){
26886         oputf("Nothing matches '%s'\n", azArg[1]);
26887       }
26888     }else{
26889       showHelp(p->out, 0);
26890     }
26891   }else
26892 
26893 #ifndef SQLITE_SHELL_FIDDLE
26894   if( c=='i' && cli_strncmp(azArg[0], "import", n)==0 ){
26895     char *zTable = 0;           /* Insert data into this table */
26896     char *zSchema = 0;          /* Schema of zTable */
26897     char *zFile = 0;            /* Name of file to extra content from */
26898     sqlite3_stmt *pStmt = NULL; /* A statement */
26899     int nCol;                   /* Number of columns in the table */
26900     i64 nByte;                  /* Number of bytes in an SQL string */
26901     int i, j;                   /* Loop counters */
26902     int needCommit;             /* True to COMMIT or ROLLBACK at end */
26903     int nSep;                   /* Number of bytes in p->colSeparator[] */
26904     char *zSql = 0;             /* An SQL statement */
26905     ImportCtx sCtx;             /* Reader context */
26906     char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */
26907     int eVerbose = 0;           /* Larger for more console output */
26908     int nSkip = 0;              /* Initial lines to skip */
26909     int useOutputMode = 1;      /* Use output mode to determine separators */
26910     char *zCreate = 0;          /* CREATE TABLE statement text */
26911 
26912     failIfSafeMode(p, "cannot run .import in safe mode");
26913     memset(&sCtx, 0, sizeof(sCtx));
26914     if( p->mode==MODE_Ascii ){
26915       xRead = ascii_read_one_field;
26916     }else{
26917       xRead = csv_read_one_field;
26918     }
26919     rc = 1;
26920     for(i=1; i<nArg; i++){
26921       char *z = azArg[i];
26922       if( z[0]=='-' && z[1]=='-' ) z++;
26923       if( z[0]!='-' ){
26924         if( zFile==0 ){
26925           zFile = z;
26926         }else if( zTable==0 ){
26927           zTable = z;
26928         }else{
26929           oputf("ERROR: extra argument: \"%s\".  Usage:\n", z);
26930           showHelp(p->out, "import");
26931           goto meta_command_exit;
26932         }
26933       }else if( cli_strcmp(z,"-v")==0 ){
26934         eVerbose++;
26935       }else if( cli_strcmp(z,"-schema")==0 && i<nArg-1 ){
26936         zSchema = azArg[++i];
26937       }else if( cli_strcmp(z,"-skip")==0 && i<nArg-1 ){
26938         nSkip = integerValue(azArg[++i]);
26939       }else if( cli_strcmp(z,"-ascii")==0 ){
26940         sCtx.cColSep = SEP_Unit[0];
26941         sCtx.cRowSep = SEP_Record[0];
26942         xRead = ascii_read_one_field;
26943         useOutputMode = 0;
26944       }else if( cli_strcmp(z,"-csv")==0 ){
26945         sCtx.cColSep = ',';
26946         sCtx.cRowSep = '\n';
26947         xRead = csv_read_one_field;
26948         useOutputMode = 0;
26949       }else{
26950         oputf("ERROR: unknown option: \"%s\".  Usage:\n", z);
26951         showHelp(p->out, "import");
26952         goto meta_command_exit;
26953       }
26954     }
26955     if( zTable==0 ){
26956       oputf("ERROR: missing %s argument. Usage:\n",
26957             zFile==0 ? "FILE" : "TABLE");
26958       showHelp(p->out, "import");
26959       goto meta_command_exit;
26960     }
26961     seenInterrupt = 0;
26962     open_db(p, 0);
26963     if( useOutputMode ){
26964       /* If neither the --csv or --ascii options are specified, then set
26965       ** the column and row separator characters from the output mode. */
26966       nSep = strlen30(p->colSeparator);
26967       if( nSep==0 ){
26968         eputz("Error: non-null column separator required for import\n");
26969         goto meta_command_exit;
26970       }
26971       if( nSep>1 ){
26972         eputz("Error: multi-character column separators not allowed"
26973               " for import\n");
26974         goto meta_command_exit;
26975       }
26976       nSep = strlen30(p->rowSeparator);
26977       if( nSep==0 ){
26978         eputz("Error: non-null row separator required for import\n");
26979         goto meta_command_exit;
26980       }
26981       if( nSep==2 && p->mode==MODE_Csv
26982        && cli_strcmp(p->rowSeparator,SEP_CrLf)==0
26983       ){
26984         /* When importing CSV (only), if the row separator is set to the
26985         ** default output row separator, change it to the default input
26986         ** row separator.  This avoids having to maintain different input
26987         ** and output row separators. */
26988         sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
26989         nSep = strlen30(p->rowSeparator);
26990       }
26991       if( nSep>1 ){
26992         eputz("Error: multi-character row separators not allowed"
26993               " for import\n");
26994         goto meta_command_exit;
26995       }
26996       sCtx.cColSep = (u8)p->colSeparator[0];
26997       sCtx.cRowSep = (u8)p->rowSeparator[0];
26998     }
26999     sCtx.zFile = zFile;
27000     sCtx.nLine = 1;
27001     if( sCtx.zFile[0]=='|' ){
27002 #ifdef SQLITE_OMIT_POPEN
27003       eputz("Error: pipes are not supported in this OS\n");
27004       goto meta_command_exit;
27005 #else
27006       sCtx.in = popen(sCtx.zFile+1, "r");
27007       sCtx.zFile = "<pipe>";
27008       sCtx.xCloser = pclose;
27009 #endif
27010     }else{
27011       sCtx.in = fopen(sCtx.zFile, "rb");
27012       sCtx.xCloser = fclose;
27013     }
27014     if( sCtx.in==0 ){
27015       eputf("Error: cannot open \"%s\"\n", zFile);
27016       goto meta_command_exit;
27017     }
27018     if( eVerbose>=2 || (eVerbose>=1 && useOutputMode) ){
27019       char zSep[2];
27020       zSep[1] = 0;
27021       zSep[0] = sCtx.cColSep;
27022       oputz("Column separator ");
27023       output_c_string(zSep);
27024       oputz(", row separator ");
27025       zSep[0] = sCtx.cRowSep;
27026       output_c_string(zSep);
27027       oputz("\n");
27028     }
27029     sCtx.z = sqlite3_malloc64(120);
27030     if( sCtx.z==0 ){
27031       import_cleanup(&sCtx);
27032       shell_out_of_memory();
27033     }
27034     /* Below, resources must be freed before exit. */
27035     while( (nSkip--)>0 ){
27036       while( xRead(&sCtx) && sCtx.cTerm==sCtx.cColSep ){}
27037     }
27038     import_append_char(&sCtx, 0);    /* To ensure sCtx.z is allocated */
27039     if( sqlite3_table_column_metadata(p->db, zSchema, zTable,0,0,0,0,0,0) ){
27040       /* Table does not exist.  Create it. */
27041       sqlite3 *dbCols = 0;
27042       char *zRenames = 0;
27043       char *zColDefs;
27044       zCreate = sqlite3_mprintf("CREATE TABLE \"%w\".\"%w\"",
27045                     zSchema ? zSchema : "main", zTable);
27046       while( xRead(&sCtx) ){
27047         zAutoColumn(sCtx.z, &dbCols, 0);
27048         if( sCtx.cTerm!=sCtx.cColSep ) break;
27049       }
27050       zColDefs = zAutoColumn(0, &dbCols, &zRenames);
27051       if( zRenames!=0 ){
27052         sputf((stdin_is_interactive && p->in==stdin)? p->out : stderr,
27053               "Columns renamed during .import %s due to duplicates:\n"
27054               "%s\n", sCtx.zFile, zRenames);
27055         sqlite3_free(zRenames);
27056       }
27057       assert(dbCols==0);
27058       if( zColDefs==0 ){
27059         eputf("%s: empty file\n", sCtx.zFile);
27060         import_cleanup(&sCtx);
27061         rc = 1;
27062         goto meta_command_exit;
27063       }
27064       zCreate = sqlite3_mprintf("%z%z\n", zCreate, zColDefs);
27065       if( zCreate==0 ){
27066         import_cleanup(&sCtx);
27067         shell_out_of_memory();
27068       }
27069       if( eVerbose>=1 ){
27070         oputf("%s\n", zCreate);
27071       }
27072       rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
27073       sqlite3_free(zCreate);
27074       zCreate = 0;
27075       if( rc ){
27076         eputf("%s failed:\n%s\n", zCreate, sqlite3_errmsg(p->db));
27077         import_cleanup(&sCtx);
27078         rc = 1;
27079         goto meta_command_exit;
27080       }
27081     }
27082     zSql = sqlite3_mprintf("SELECT count(*) FROM pragma_table_info(%Q,%Q);",
27083                            zTable, zSchema);
27084     if( zSql==0 ){
27085       import_cleanup(&sCtx);
27086       shell_out_of_memory();
27087     }
27088     nByte = strlen(zSql);
27089     rc =  sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
27090     sqlite3_free(zSql);
27091     zSql = 0;
27092     if( rc ){
27093       if (pStmt) sqlite3_finalize(pStmt);
27094       eputf("Error: %s\n", sqlite3_errmsg(p->db));
27095       import_cleanup(&sCtx);
27096       rc = 1;
27097       goto meta_command_exit;
27098     }
27099     if( sqlite3_step(pStmt)==SQLITE_ROW ){
27100       nCol = sqlite3_column_int(pStmt, 0);
27101     }else{
27102       nCol = 0;
27103     }
27104     sqlite3_finalize(pStmt);
27105     pStmt = 0;
27106     if( nCol==0 ) return 0; /* no columns, no error */
27107     zSql = sqlite3_malloc64( nByte*2 + 20 + nCol*2 );
27108     if( zSql==0 ){
27109       import_cleanup(&sCtx);
27110       shell_out_of_memory();
27111     }
27112     if( zSchema ){
27113       sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\".\"%w\" VALUES(?",
27114                        zSchema, zTable);
27115     }else{
27116       sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
27117     }
27118     j = strlen30(zSql);
27119     for(i=1; i<nCol; i++){
27120       zSql[j++] = ',';
27121       zSql[j++] = '?';
27122     }
27123     zSql[j++] = ')';
27124     zSql[j] = 0;
27125     if( eVerbose>=2 ){
27126       oputf("Insert using: %s\n", zSql);
27127     }
27128     rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
27129     sqlite3_free(zSql);
27130     zSql = 0;
27131     if( rc ){
27132       eputf("Error: %s\n", sqlite3_errmsg(p->db));
27133       if (pStmt) sqlite3_finalize(pStmt);
27134       import_cleanup(&sCtx);
27135       rc = 1;
27136       goto meta_command_exit;
27137     }
27138     needCommit = sqlite3_get_autocommit(p->db);
27139     if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
27140     do{
27141       int startLine = sCtx.nLine;
27142       for(i=0; i<nCol; i++){
27143         char *z = xRead(&sCtx);
27144         /*
27145         ** Did we reach end-of-file before finding any columns?
27146         ** If so, stop instead of NULL filling the remaining columns.
27147         */
27148         if( z==0 && i==0 ) break;
27149         /*
27150         ** Did we reach end-of-file OR end-of-line before finding any
27151         ** columns in ASCII mode?  If so, stop instead of NULL filling
27152         ** the remaining columns.
27153         */
27154         if( p->mode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break;
27155         /*
27156         ** For CSV mode, per RFC 4180, accept EOF in lieu of final
27157         ** record terminator but only for last field of multi-field row.
27158         ** (If there are too few fields, it's not valid CSV anyway.)
27159         */
27160         if( z==0 && (xRead==csv_read_one_field) && i==nCol-1 && i>0 ){
27161           z = "";
27162         }
27163         sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
27164         if( i<nCol-1 && sCtx.cTerm!=sCtx.cColSep ){
27165           eputf("%s:%d: expected %d columns but found %d"
27166                 " - filling the rest with NULL\n",
27167                 sCtx.zFile, startLine, nCol, i+1);
27168           i += 2;
27169           while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; }
27170         }
27171       }
27172       if( sCtx.cTerm==sCtx.cColSep ){
27173         do{
27174           xRead(&sCtx);
27175           i++;
27176         }while( sCtx.cTerm==sCtx.cColSep );
27177         eputf("%s:%d: expected %d columns but found %d - extras ignored\n",
27178               sCtx.zFile, startLine, nCol, i);
27179       }
27180       if( i>=nCol ){
27181         sqlite3_step(pStmt);
27182         rc = sqlite3_reset(pStmt);
27183         if( rc!=SQLITE_OK ){
27184           eputf("%s:%d: INSERT failed: %s\n",
27185                 sCtx.zFile, startLine, sqlite3_errmsg(p->db));
27186           sCtx.nErr++;
27187         }else{
27188           sCtx.nRow++;
27189         }
27190       }
27191     }while( sCtx.cTerm!=EOF );
27192 
27193     import_cleanup(&sCtx);
27194     sqlite3_finalize(pStmt);
27195     if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0);
27196     if( eVerbose>0 ){
27197       oputf("Added %d rows with %d errors using %d lines of input\n",
27198             sCtx.nRow, sCtx.nErr, sCtx.nLine-1);
27199     }
27200   }else
27201 #endif /* !defined(SQLITE_SHELL_FIDDLE) */
27202 
27203 #ifndef SQLITE_UNTESTABLE
27204   if( c=='i' && cli_strncmp(azArg[0], "imposter", n)==0 ){
27205     char *zSql;
27206     char *zCollist = 0;
27207     sqlite3_stmt *pStmt;
27208     int tnum = 0;
27209     int isWO = 0;  /* True if making an imposter of a WITHOUT ROWID table */
27210     int lenPK = 0; /* Length of the PRIMARY KEY string for isWO tables */
27211     int i;
27212     if( !ShellHasFlag(p,SHFLG_TestingMode) ){
27213       eputf(".%s unavailable without --unsafe-testing\n",
27214             "imposter");
27215       rc = 1;
27216       goto meta_command_exit;
27217     }
27218     if( !(nArg==3 || (nArg==2 && sqlite3_stricmp(azArg[1],"off")==0)) ){
27219       eputz("Usage: .imposter INDEX IMPOSTER\n"
27220             "       .imposter off\n");
27221       /* Also allowed, but not documented:
27222       **
27223       **    .imposter TABLE IMPOSTER
27224       **
27225       ** where TABLE is a WITHOUT ROWID table.  In that case, the
27226       ** imposter is another WITHOUT ROWID table with the columns in
27227       ** storage order. */
27228       rc = 1;
27229       goto meta_command_exit;
27230     }
27231     open_db(p, 0);
27232     if( nArg==2 ){
27233       sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 1);
27234       goto meta_command_exit;
27235     }
27236     zSql = sqlite3_mprintf(
27237       "SELECT rootpage, 0 FROM sqlite_schema"
27238       " WHERE name='%q' AND type='index'"
27239       "UNION ALL "
27240       "SELECT rootpage, 1 FROM sqlite_schema"
27241       " WHERE name='%q' AND type='table'"
27242       "   AND sql LIKE '%%without%%rowid%%'",
27243       azArg[1], azArg[1]
27244     );
27245     sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
27246     sqlite3_free(zSql);
27247     if( sqlite3_step(pStmt)==SQLITE_ROW ){
27248       tnum = sqlite3_column_int(pStmt, 0);
27249       isWO = sqlite3_column_int(pStmt, 1);
27250     }
27251     sqlite3_finalize(pStmt);
27252     zSql = sqlite3_mprintf("PRAGMA index_xinfo='%q'", azArg[1]);
27253     rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
27254     sqlite3_free(zSql);
27255     i = 0;
27256     while( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
27257       char zLabel[20];
27258       const char *zCol = (const char*)sqlite3_column_text(pStmt,2);
27259       i++;
27260       if( zCol==0 ){
27261         if( sqlite3_column_int(pStmt,1)==-1 ){
27262           zCol = "_ROWID_";
27263         }else{
27264           sqlite3_snprintf(sizeof(zLabel),zLabel,"expr%d",i);
27265           zCol = zLabel;
27266         }
27267       }
27268       if( isWO && lenPK==0 && sqlite3_column_int(pStmt,5)==0 && zCollist ){
27269         lenPK = (int)strlen(zCollist);
27270       }
27271       if( zCollist==0 ){
27272         zCollist = sqlite3_mprintf("\"%w\"", zCol);
27273       }else{
27274         zCollist = sqlite3_mprintf("%z,\"%w\"", zCollist, zCol);
27275       }
27276     }
27277     sqlite3_finalize(pStmt);
27278     if( i==0 || tnum==0 ){
27279       eputf("no such index: \"%s\"\n", azArg[1]);
27280       rc = 1;
27281       sqlite3_free(zCollist);
27282       goto meta_command_exit;
27283     }
27284     if( lenPK==0 ) lenPK = 100000;
27285     zSql = sqlite3_mprintf(
27286           "CREATE TABLE \"%w\"(%s,PRIMARY KEY(%.*s))WITHOUT ROWID",
27287           azArg[2], zCollist, lenPK, zCollist);
27288     sqlite3_free(zCollist);
27289     rc = sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 1, tnum);
27290     if( rc==SQLITE_OK ){
27291       rc = sqlite3_exec(p->db, zSql, 0, 0, 0);
27292       sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 0);
27293       if( rc ){
27294         eputf("Error in [%s]: %s\n", zSql, sqlite3_errmsg(p->db));
27295       }else{
27296         sputf(stdout, "%s;\n", zSql);
27297         sputf(stdout, "WARNING: writing to an imposter table will corrupt"
27298               " the \"%s\" %s!\n", azArg[1], isWO ? "table" : "index");
27299       }
27300     }else{
27301       eputf("SQLITE_TESTCTRL_IMPOSTER returns %d\n", rc);
27302       rc = 1;
27303     }
27304     sqlite3_free(zSql);
27305   }else
27306 #endif /* !defined(SQLITE_OMIT_TEST_CONTROL) */
27307 
27308   if( c=='i' && cli_strncmp(azArg[0], "intck", n)==0 ){
27309     i64 iArg = 0;
27310     if( nArg==2 ){
27311       iArg = integerValue(azArg[1]);
27312       if( iArg==0 ) iArg = -1;
27313     }
27314     if( (nArg!=1 && nArg!=2) || iArg<0 ){
27315       eputf("%s","Usage: .intck STEPS_PER_UNLOCK\n");
27316       rc = 1;
27317       goto meta_command_exit;
27318     }
27319     open_db(p, 0);
27320     rc = intckDatabaseCmd(p, iArg);
27321   }else
27322 
27323 #ifdef SQLITE_ENABLE_IOTRACE
27324   if( c=='i' && cli_strncmp(azArg[0], "iotrace", n)==0 ){
27325     SQLITE_API extern void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...);
27326     if( iotrace && iotrace!=stdout ) fclose(iotrace);
27327     iotrace = 0;
27328     if( nArg<2 ){
27329       sqlite3IoTrace = 0;
27330     }else if( cli_strcmp(azArg[1], "-")==0 ){
27331       sqlite3IoTrace = iotracePrintf;
27332       iotrace = stdout;
27333     }else{
27334       iotrace = fopen(azArg[1], "w");
27335       if( iotrace==0 ){
27336         eputf("Error: cannot open \"%s\"\n", azArg[1]);
27337         sqlite3IoTrace = 0;
27338         rc = 1;
27339       }else{
27340         sqlite3IoTrace = iotracePrintf;
27341       }
27342     }
27343   }else
27344 #endif
27345 
27346   if( c=='l' && n>=5 && cli_strncmp(azArg[0], "limits", n)==0 ){
27347     static const struct {
27348        const char *zLimitName;   /* Name of a limit */
27349        int limitCode;            /* Integer code for that limit */
27350     } aLimit[] = {
27351       { "length",                SQLITE_LIMIT_LENGTH                    },
27352       { "sql_length",            SQLITE_LIMIT_SQL_LENGTH                },
27353       { "column",                SQLITE_LIMIT_COLUMN                    },
27354       { "expr_depth",            SQLITE_LIMIT_EXPR_DEPTH                },
27355       { "compound_select",       SQLITE_LIMIT_COMPOUND_SELECT           },
27356       { "vdbe_op",               SQLITE_LIMIT_VDBE_OP                   },
27357       { "function_arg",          SQLITE_LIMIT_FUNCTION_ARG              },
27358       { "attached",              SQLITE_LIMIT_ATTACHED                  },
27359       { "like_pattern_length",   SQLITE_LIMIT_LIKE_PATTERN_LENGTH       },
27360       { "variable_number",       SQLITE_LIMIT_VARIABLE_NUMBER           },
27361       { "trigger_depth",         SQLITE_LIMIT_TRIGGER_DEPTH             },
27362       { "worker_threads",        SQLITE_LIMIT_WORKER_THREADS            },
27363     };
27364     int i, n2;
27365     open_db(p, 0);
27366     if( nArg==1 ){
27367       for(i=0; i<ArraySize(aLimit); i++){
27368         sputf(stdout, "%20s %d\n", aLimit[i].zLimitName,
27369               sqlite3_limit(p->db, aLimit[i].limitCode, -1));
27370       }
27371     }else if( nArg>3 ){
27372       eputz("Usage: .limit NAME ?NEW-VALUE?\n");
27373       rc = 1;
27374       goto meta_command_exit;
27375     }else{
27376       int iLimit = -1;
27377       n2 = strlen30(azArg[1]);
27378       for(i=0; i<ArraySize(aLimit); i++){
27379         if( sqlite3_strnicmp(aLimit[i].zLimitName, azArg[1], n2)==0 ){
27380           if( iLimit<0 ){
27381             iLimit = i;
27382           }else{
27383             eputf("ambiguous limit: \"%s\"\n", azArg[1]);
27384             rc = 1;
27385             goto meta_command_exit;
27386           }
27387         }
27388       }
27389       if( iLimit<0 ){
27390         eputf("unknown limit: \"%s\"\n"
27391               "enter \".limits\" with no arguments for a list.\n",
27392               azArg[1]);
27393         rc = 1;
27394         goto meta_command_exit;
27395       }
27396       if( nArg==3 ){
27397         sqlite3_limit(p->db, aLimit[iLimit].limitCode,
27398                       (int)integerValue(azArg[2]));
27399       }
27400       sputf(stdout, "%20s %d\n", aLimit[iLimit].zLimitName,
27401             sqlite3_limit(p->db, aLimit[iLimit].limitCode, -1));
27402     }
27403   }else
27404 
27405   if( c=='l' && n>2 && cli_strncmp(azArg[0], "lint", n)==0 ){
27406     open_db(p, 0);
27407     lintDotCommand(p, azArg, nArg);
27408   }else
27409 
27410 #if !defined(SQLITE_OMIT_LOAD_EXTENSION) && !defined(SQLITE_SHELL_FIDDLE)
27411   if( c=='l' && cli_strncmp(azArg[0], "load", n)==0 ){
27412     const char *zFile, *zProc;
27413     char *zErrMsg = 0;
27414     failIfSafeMode(p, "cannot run .load in safe mode");
27415     if( nArg<2 || azArg[1][0]==0 ){
27416       /* Must have a non-empty FILE. (Will not load self.) */
27417       eputz("Usage: .load FILE ?ENTRYPOINT?\n");
27418       rc = 1;
27419       goto meta_command_exit;
27420     }
27421     zFile = azArg[1];
27422     zProc = nArg>=3 ? azArg[2] : 0;
27423     open_db(p, 0);
27424     rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
27425     if( rc!=SQLITE_OK ){
27426       eputf("Error: %s\n", zErrMsg);
27427       sqlite3_free(zErrMsg);
27428       rc = 1;
27429     }
27430   }else
27431 #endif
27432 
27433   if( c=='l' && cli_strncmp(azArg[0], "log", n)==0 ){
27434     if( nArg!=2 ){
27435       eputz("Usage: .log FILENAME\n");
27436       rc = 1;
27437     }else{
27438       const char *zFile = azArg[1];
27439       if( p->bSafeMode
27440        && cli_strcmp(zFile,"on")!=0
27441        && cli_strcmp(zFile,"off")!=0
27442       ){
27443         sputz(stdout, "cannot set .log to anything other"
27444               " than \"on\" or \"off\"\n");
27445         zFile = "off";
27446       }
27447       output_file_close(p->pLog);
27448       if( cli_strcmp(zFile,"on")==0 ) zFile = "stdout";
27449       p->pLog = output_file_open(zFile, 0);
27450     }
27451   }else
27452 
27453   if( c=='m' && cli_strncmp(azArg[0], "mode", n)==0 ){
27454     const char *zMode = 0;
27455     const char *zTabname = 0;
27456     int i, n2;
27457     ColModeOpts cmOpts = ColModeOpts_default;
27458     for(i=1; i<nArg; i++){
27459       const char *z = azArg[i];
27460       if( optionMatch(z,"wrap") && i+1<nArg ){
27461         cmOpts.iWrap = integerValue(azArg[++i]);
27462       }else if( optionMatch(z,"ww") ){
27463         cmOpts.bWordWrap = 1;
27464       }else if( optionMatch(z,"wordwrap") && i+1<nArg ){
27465         cmOpts.bWordWrap = (u8)booleanValue(azArg[++i]);
27466       }else if( optionMatch(z,"quote") ){
27467         cmOpts.bQuote = 1;
27468       }else if( optionMatch(z,"noquote") ){
27469         cmOpts.bQuote = 0;
27470       }else if( zMode==0 ){
27471         zMode = z;
27472         /* Apply defaults for qbox pseudo-mode.  If that
27473          * overwrites already-set values, user was informed of this.
27474          */
27475         if( cli_strcmp(z, "qbox")==0 ){
27476           ColModeOpts cmo = ColModeOpts_default_qbox;
27477           zMode = "box";
27478           cmOpts = cmo;
27479         }
27480       }else if( zTabname==0 ){
27481         zTabname = z;
27482       }else if( z[0]=='-' ){
27483         eputf("unknown option: %s\n", z);
27484         eputz("options:\n"
27485               "  --noquote\n"
27486               "  --quote\n"
27487               "  --wordwrap on/off\n"
27488               "  --wrap N\n"
27489               "  --ww\n");
27490         rc = 1;
27491         goto meta_command_exit;
27492       }else{
27493         eputf("extra argument: \"%s\"\n", z);
27494         rc = 1;
27495         goto meta_command_exit;
27496       }
27497     }
27498     if( zMode==0 ){
27499       if( p->mode==MODE_Column
27500        || (p->mode>=MODE_Markdown && p->mode<=MODE_Box)
27501       ){
27502         oputf("current output mode: %s --wrap %d --wordwrap %s --%squote\n",
27503               modeDescr[p->mode], p->cmOpts.iWrap,
27504               p->cmOpts.bWordWrap ? "on" : "off",
27505               p->cmOpts.bQuote ? "" : "no");
27506       }else{
27507         oputf("current output mode: %s\n", modeDescr[p->mode]);
27508       }
27509       zMode = modeDescr[p->mode];
27510     }
27511     n2 = strlen30(zMode);
27512     if( cli_strncmp(zMode,"lines",n2)==0 ){
27513       p->mode = MODE_Line;
27514       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
27515     }else if( cli_strncmp(zMode,"columns",n2)==0 ){
27516       p->mode = MODE_Column;
27517       if( (p->shellFlgs & SHFLG_HeaderSet)==0 ){
27518         p->showHeader = 1;
27519       }
27520       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
27521       p->cmOpts = cmOpts;
27522     }else if( cli_strncmp(zMode,"list",n2)==0 ){
27523       p->mode = MODE_List;
27524       sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Column);
27525       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
27526     }else if( cli_strncmp(zMode,"html",n2)==0 ){
27527       p->mode = MODE_Html;
27528     }else if( cli_strncmp(zMode,"tcl",n2)==0 ){
27529       p->mode = MODE_Tcl;
27530       sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Space);
27531       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
27532     }else if( cli_strncmp(zMode,"csv",n2)==0 ){
27533       p->mode = MODE_Csv;
27534       sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
27535       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
27536     }else if( cli_strncmp(zMode,"tabs",n2)==0 ){
27537       p->mode = MODE_List;
27538       sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Tab);
27539     }else if( cli_strncmp(zMode,"insert",n2)==0 ){
27540       p->mode = MODE_Insert;
27541       set_table_name(p, zTabname ? zTabname : "table");
27542     }else if( cli_strncmp(zMode,"quote",n2)==0 ){
27543       p->mode = MODE_Quote;
27544       sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
27545       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
27546     }else if( cli_strncmp(zMode,"ascii",n2)==0 ){
27547       p->mode = MODE_Ascii;
27548       sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit);
27549       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record);
27550     }else if( cli_strncmp(zMode,"markdown",n2)==0 ){
27551       p->mode = MODE_Markdown;
27552       p->cmOpts = cmOpts;
27553     }else if( cli_strncmp(zMode,"table",n2)==0 ){
27554       p->mode = MODE_Table;
27555       p->cmOpts = cmOpts;
27556     }else if( cli_strncmp(zMode,"box",n2)==0 ){
27557       p->mode = MODE_Box;
27558       p->cmOpts = cmOpts;
27559     }else if( cli_strncmp(zMode,"count",n2)==0 ){
27560       p->mode = MODE_Count;
27561     }else if( cli_strncmp(zMode,"off",n2)==0 ){
27562       p->mode = MODE_Off;
27563     }else if( cli_strncmp(zMode,"json",n2)==0 ){
27564       p->mode = MODE_Json;
27565     }else{
27566       eputz("Error: mode should be one of: "
27567             "ascii box column csv html insert json line list markdown "
27568             "qbox quote table tabs tcl\n");
27569       rc = 1;
27570     }
27571     p->cMode = p->mode;
27572   }else
27573 
27574 #ifndef SQLITE_SHELL_FIDDLE
27575   if( c=='n' && cli_strcmp(azArg[0], "nonce")==0 ){
27576     if( nArg!=2 ){
27577       eputz("Usage: .nonce NONCE\n");
27578       rc = 1;
27579     }else if( p->zNonce==0 || cli_strcmp(azArg[1],p->zNonce)!=0 ){
27580       eputf("line %d: incorrect nonce: \"%s\"\n",
27581             p->lineno, azArg[1]);
27582       exit(1);
27583     }else{
27584       p->bSafeMode = 0;
27585       return 0;  /* Return immediately to bypass the safe mode reset
27586                  ** at the end of this procedure */
27587     }
27588   }else
27589 #endif /* !defined(SQLITE_SHELL_FIDDLE) */
27590 
27591   if( c=='n' && cli_strncmp(azArg[0], "nullvalue", n)==0 ){
27592     if( nArg==2 ){
27593       sqlite3_snprintf(sizeof(p->nullValue), p->nullValue,
27594                        "%.*s", (int)ArraySize(p->nullValue)-1, azArg[1]);
27595     }else{
27596       eputz("Usage: .nullvalue STRING\n");
27597       rc = 1;
27598     }
27599   }else
27600 
27601   if( c=='o' && cli_strncmp(azArg[0], "open", n)==0 && n>=2 ){
27602     const char *zFN = 0;     /* Pointer to constant filename */
27603     char *zNewFilename = 0;  /* Name of the database file to open */
27604     int iName = 1;           /* Index in azArg[] of the filename */
27605     int newFlag = 0;         /* True to delete file before opening */
27606     int openMode = SHELL_OPEN_UNSPEC;
27607 
27608     /* Check for command-line arguments */
27609     for(iName=1; iName<nArg; iName++){
27610       const char *z = azArg[iName];
27611 #ifndef SQLITE_SHELL_FIDDLE
27612       if( optionMatch(z,"new") ){
27613         newFlag = 1;
27614 #ifdef SQLITE_HAVE_ZLIB
27615       }else if( optionMatch(z, "zip") ){
27616         openMode = SHELL_OPEN_ZIPFILE;
27617 #endif
27618       }else if( optionMatch(z, "append") ){
27619         openMode = SHELL_OPEN_APPENDVFS;
27620       }else if( optionMatch(z, "readonly") ){
27621         openMode = SHELL_OPEN_READONLY;
27622       }else if( optionMatch(z, "nofollow") ){
27623         p->openFlags |= SQLITE_OPEN_NOFOLLOW;
27624 #ifndef SQLITE_OMIT_DESERIALIZE
27625       }else if( optionMatch(z, "deserialize") ){
27626         openMode = SHELL_OPEN_DESERIALIZE;
27627       }else if( optionMatch(z, "hexdb") ){
27628         openMode = SHELL_OPEN_HEXDB;
27629       }else if( optionMatch(z, "maxsize") && iName+1<nArg ){
27630         p->szMax = integerValue(azArg[++iName]);
27631 #endif /* SQLITE_OMIT_DESERIALIZE */
27632       }else
27633 #endif /* !SQLITE_SHELL_FIDDLE */
27634       if( z[0]=='-' ){
27635         eputf("unknown option: %s\n", z);
27636         rc = 1;
27637         goto meta_command_exit;
27638       }else if( zFN ){
27639         eputf("extra argument: \"%s\"\n", z);
27640         rc = 1;
27641         goto meta_command_exit;
27642       }else{
27643         zFN = z;
27644       }
27645     }
27646 
27647     /* Close the existing database */
27648     session_close_all(p, -1);
27649     close_db(p->db);
27650     p->db = 0;
27651     p->pAuxDb->zDbFilename = 0;
27652     sqlite3_free(p->pAuxDb->zFreeOnClose);
27653     p->pAuxDb->zFreeOnClose = 0;
27654     p->openMode = openMode;
27655     p->openFlags = 0;
27656     p->szMax = 0;
27657 
27658     /* If a filename is specified, try to open it first */
27659     if( zFN || p->openMode==SHELL_OPEN_HEXDB ){
27660       if( newFlag && zFN && !p->bSafeMode ) shellDeleteFile(zFN);
27661 #ifndef SQLITE_SHELL_FIDDLE
27662       if( p->bSafeMode
27663        && p->openMode!=SHELL_OPEN_HEXDB
27664        && zFN
27665        && cli_strcmp(zFN,":memory:")!=0
27666       ){
27667         failIfSafeMode(p, "cannot open disk-based database files in safe mode");
27668       }
27669 #else
27670       /* WASM mode has its own sandboxed pseudo-filesystem. */
27671 #endif
27672       if( zFN ){
27673         zNewFilename = sqlite3_mprintf("%s", zFN);
27674         shell_check_oom(zNewFilename);
27675       }else{
27676         zNewFilename = 0;
27677       }
27678       p->pAuxDb->zDbFilename = zNewFilename;
27679       open_db(p, OPEN_DB_KEEPALIVE);
27680       if( p->db==0 ){
27681         eputf("Error: cannot open '%s'\n", zNewFilename);
27682         sqlite3_free(zNewFilename);
27683       }else{
27684         p->pAuxDb->zFreeOnClose = zNewFilename;
27685       }
27686     }
27687     if( p->db==0 ){
27688       /* As a fall-back open a TEMP database */
27689       p->pAuxDb->zDbFilename = 0;
27690       open_db(p, 0);
27691     }
27692   }else
27693 
27694 #ifndef SQLITE_SHELL_FIDDLE
27695   if( (c=='o'
27696         && (cli_strncmp(azArg[0], "output", n)==0
27697             || cli_strncmp(azArg[0], "once", n)==0))
27698    || (c=='e' && n==5 && cli_strcmp(azArg[0],"excel")==0)
27699   ){
27700     char *zFile = 0;
27701     int bTxtMode = 0;
27702     int i;
27703     int eMode = 0;
27704     int bOnce = 0;            /* 0: .output, 1: .once, 2: .excel */
27705     static const char *zBomUtf8 = "\xef\xbb\xbf";
27706     const char *zBom = 0;
27707 
27708     failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]);
27709     if( c=='e' ){
27710       eMode = 'x';
27711       bOnce = 2;
27712     }else if( cli_strncmp(azArg[0],"once",n)==0 ){
27713       bOnce = 1;
27714     }
27715     for(i=1; i<nArg; i++){
27716       char *z = azArg[i];
27717       if( z[0]=='-' ){
27718         if( z[1]=='-' ) z++;
27719         if( cli_strcmp(z,"-bom")==0 ){
27720           zBom = zBomUtf8;
27721         }else if( c!='e' && cli_strcmp(z,"-x")==0 ){
27722           eMode = 'x';  /* spreadsheet */
27723         }else if( c!='e' && cli_strcmp(z,"-e")==0 ){
27724           eMode = 'e';  /* text editor */
27725         }else{
27726           oputf("ERROR: unknown option: \"%s\".  Usage:\n", azArg[i]);
27727           showHelp(p->out, azArg[0]);
27728           rc = 1;
27729           goto meta_command_exit;
27730         }
27731       }else if( zFile==0 && eMode!='e' && eMode!='x' ){
27732         zFile = sqlite3_mprintf("%s", z);
27733         if( zFile && zFile[0]=='|' ){
27734           while( i+1<nArg ) zFile = sqlite3_mprintf("%z %s", zFile, azArg[++i]);
27735           break;
27736         }
27737       }else{
27738         oputf("ERROR: extra parameter: \"%s\".  Usage:\n", azArg[i]);
27739         showHelp(p->out, azArg[0]);
27740         rc = 1;
27741         sqlite3_free(zFile);
27742         goto meta_command_exit;
27743       }
27744     }
27745     if( zFile==0 ){
27746       zFile = sqlite3_mprintf("stdout");
27747     }
27748     if( bOnce ){
27749       p->outCount = 2;
27750     }else{
27751       p->outCount = 0;
27752     }
27753     output_reset(p);
27754 #ifndef SQLITE_NOHAVE_SYSTEM
27755     if( eMode=='e' || eMode=='x' ){
27756       p->doXdgOpen = 1;
27757       outputModePush(p);
27758       if( eMode=='x' ){
27759         /* spreadsheet mode.  Output as CSV. */
27760         newTempFile(p, "csv");
27761         ShellClearFlag(p, SHFLG_Echo);
27762         p->mode = MODE_Csv;
27763         sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
27764         sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
27765       }else{
27766         /* text editor mode */
27767         newTempFile(p, "txt");
27768         bTxtMode = 1;
27769       }
27770       sqlite3_free(zFile);
27771       zFile = sqlite3_mprintf("%s", p->zTempFile);
27772     }
27773 #endif /* SQLITE_NOHAVE_SYSTEM */
27774     shell_check_oom(zFile);
27775     if( zFile[0]=='|' ){
27776 #ifdef SQLITE_OMIT_POPEN
27777       eputz("Error: pipes are not supported in this OS\n");
27778       rc = 1;
27779       output_redir(p, stdout);
27780 #else
27781       FILE *pfPipe = popen(zFile + 1, "w");
27782       if( pfPipe==0 ){
27783         eputf("Error: cannot open pipe \"%s\"\n", zFile + 1);
27784         rc = 1;
27785       }else{
27786         output_redir(p, pfPipe);
27787         if( zBom ) oputz(zBom);
27788         sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
27789       }
27790 #endif
27791     }else{
27792       FILE *pfFile = output_file_open(zFile, bTxtMode);
27793       if( pfFile==0 ){
27794         if( cli_strcmp(zFile,"off")!=0 ){
27795           eputf("Error: cannot write to \"%s\"\n", zFile);
27796         }
27797         rc = 1;
27798       } else {
27799         output_redir(p, pfFile);
27800         if( zBom ) oputz(zBom);
27801         sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
27802       }
27803     }
27804     sqlite3_free(zFile);
27805   }else
27806 #endif /* !defined(SQLITE_SHELL_FIDDLE) */
27807 
27808   if( c=='p' && n>=3 && cli_strncmp(azArg[0], "parameter", n)==0 ){
27809     open_db(p,0);
27810     if( nArg<=1 ) goto parameter_syntax_error;
27811 
27812     /* .parameter clear
27813     ** Clear all bind parameters by dropping the TEMP table that holds them.
27814     */
27815     if( nArg==2 && cli_strcmp(azArg[1],"clear")==0 ){
27816       sqlite3_exec(p->db, "DROP TABLE IF EXISTS temp.sqlite_parameters;",
27817                    0, 0, 0);
27818     }else
27819 
27820     /* .parameter list
27821     ** List all bind parameters.
27822     */
27823     if( nArg==2 && cli_strcmp(azArg[1],"list")==0 ){
27824       sqlite3_stmt *pStmt = 0;
27825       int rx;
27826       int len = 0;
27827       rx = sqlite3_prepare_v2(p->db,
27828              "SELECT max(length(key)) "
27829              "FROM temp.sqlite_parameters;", -1, &pStmt, 0);
27830       if( rx==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
27831         len = sqlite3_column_int(pStmt, 0);
27832         if( len>40 ) len = 40;
27833       }
27834       sqlite3_finalize(pStmt);
27835       pStmt = 0;
27836       if( len ){
27837         rx = sqlite3_prepare_v2(p->db,
27838              "SELECT key, quote(value) "
27839              "FROM temp.sqlite_parameters;", -1, &pStmt, 0);
27840         while( rx==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
27841           oputf("%-*s %s\n", len, sqlite3_column_text(pStmt,0),
27842                 sqlite3_column_text(pStmt,1));
27843         }
27844         sqlite3_finalize(pStmt);
27845       }
27846     }else
27847 
27848     /* .parameter init
27849     ** Make sure the TEMP table used to hold bind parameters exists.
27850     ** Create it if necessary.
27851     */
27852     if( nArg==2 && cli_strcmp(azArg[1],"init")==0 ){
27853       bind_table_init(p);
27854     }else
27855 
27856     /* .parameter set NAME VALUE
27857     ** Set or reset a bind parameter.  NAME should be the full parameter
27858     ** name exactly as it appears in the query.  (ex: $abc, @def).  The
27859     ** VALUE can be in either SQL literal notation, or if not it will be
27860     ** understood to be a text string.
27861     */
27862     if( nArg==4 && cli_strcmp(azArg[1],"set")==0 ){
27863       int rx;
27864       char *zSql;
27865       sqlite3_stmt *pStmt;
27866       const char *zKey = azArg[2];
27867       const char *zValue = azArg[3];
27868       bind_table_init(p);
27869       zSql = sqlite3_mprintf(
27870                   "REPLACE INTO temp.sqlite_parameters(key,value)"
27871                   "VALUES(%Q,%s);", zKey, zValue);
27872       shell_check_oom(zSql);
27873       pStmt = 0;
27874       rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
27875       sqlite3_free(zSql);
27876       if( rx!=SQLITE_OK ){
27877         sqlite3_finalize(pStmt);
27878         pStmt = 0;
27879         zSql = sqlite3_mprintf(
27880                    "REPLACE INTO temp.sqlite_parameters(key,value)"
27881                    "VALUES(%Q,%Q);", zKey, zValue);
27882         shell_check_oom(zSql);
27883         rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
27884         sqlite3_free(zSql);
27885         if( rx!=SQLITE_OK ){
27886           oputf("Error: %s\n", sqlite3_errmsg(p->db));
27887           sqlite3_finalize(pStmt);
27888           pStmt = 0;
27889           rc = 1;
27890         }
27891       }
27892       sqlite3_step(pStmt);
27893       sqlite3_finalize(pStmt);
27894     }else
27895 
27896     /* .parameter unset NAME
27897     ** Remove the NAME binding from the parameter binding table, if it
27898     ** exists.
27899     */
27900     if( nArg==3 && cli_strcmp(azArg[1],"unset")==0 ){
27901       char *zSql = sqlite3_mprintf(
27902           "DELETE FROM temp.sqlite_parameters WHERE key=%Q", azArg[2]);
27903       shell_check_oom(zSql);
27904       sqlite3_exec(p->db, zSql, 0, 0, 0);
27905       sqlite3_free(zSql);
27906     }else
27907     /* If no command name matches, show a syntax error */
27908     parameter_syntax_error:
27909     showHelp(p->out, "parameter");
27910   }else
27911 
27912   if( c=='p' && n>=3 && cli_strncmp(azArg[0], "print", n)==0 ){
27913     int i;
27914     for(i=1; i<nArg; i++){
27915       if( i>1 ) oputz(" ");
27916       oputz(azArg[i]);
27917     }
27918     oputz("\n");
27919   }else
27920 
27921 #ifndef SQLITE_OMIT_PROGRESS_CALLBACK
27922   if( c=='p' && n>=3 && cli_strncmp(azArg[0], "progress", n)==0 ){
27923     int i;
27924     int nn = 0;
27925     p->flgProgress = 0;
27926     p->mxProgress = 0;
27927     p->nProgress = 0;
27928     for(i=1; i<nArg; i++){
27929       const char *z = azArg[i];
27930       if( z[0]=='-' ){
27931         z++;
27932         if( z[0]=='-' ) z++;
27933         if( cli_strcmp(z,"quiet")==0 || cli_strcmp(z,"q")==0 ){
27934           p->flgProgress |= SHELL_PROGRESS_QUIET;
27935           continue;
27936         }
27937         if( cli_strcmp(z,"reset")==0 ){
27938           p->flgProgress |= SHELL_PROGRESS_RESET;
27939           continue;
27940         }
27941         if( cli_strcmp(z,"once")==0 ){
27942           p->flgProgress |= SHELL_PROGRESS_ONCE;
27943           continue;
27944         }
27945         if( cli_strcmp(z,"limit")==0 ){
27946           if( i+1>=nArg ){
27947             eputz("Error: missing argument on --limit\n");
27948             rc = 1;
27949             goto meta_command_exit;
27950           }else{
27951             p->mxProgress = (int)integerValue(azArg[++i]);
27952           }
27953           continue;
27954         }
27955         eputf("Error: unknown option: \"%s\"\n", azArg[i]);
27956         rc = 1;
27957         goto meta_command_exit;
27958       }else{
27959         nn = (int)integerValue(z);
27960       }
27961     }
27962     open_db(p, 0);
27963     sqlite3_progress_handler(p->db, nn, progress_handler, p);
27964   }else
27965 #endif /* SQLITE_OMIT_PROGRESS_CALLBACK */
27966 
27967   if( c=='p' && cli_strncmp(azArg[0], "prompt", n)==0 ){
27968     if( nArg >= 2) {
27969       shell_strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
27970     }
27971     if( nArg >= 3) {
27972       shell_strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
27973     }
27974   }else
27975 
27976 #ifndef SQLITE_SHELL_FIDDLE
27977   if( c=='q' && cli_strncmp(azArg[0], "quit", n)==0 ){
27978     rc = 2;
27979   }else
27980 #endif
27981 
27982 #ifndef SQLITE_SHELL_FIDDLE
27983   if( c=='r' && n>=3 && cli_strncmp(azArg[0], "read", n)==0 ){
27984     FILE *inSaved = p->in;
27985     int savedLineno = p->lineno;
27986     failIfSafeMode(p, "cannot run .read in safe mode");
27987     if( nArg!=2 ){
27988       eputz("Usage: .read FILE\n");
27989       rc = 1;
27990       goto meta_command_exit;
27991     }
27992     if( azArg[1][0]=='|' ){
27993 #ifdef SQLITE_OMIT_POPEN
27994       eputz("Error: pipes are not supported in this OS\n");
27995       rc = 1;
27996       p->out = stdout;
27997 #else
27998       p->in = popen(azArg[1]+1, "r");
27999       if( p->in==0 ){
28000         eputf("Error: cannot open \"%s\"\n", azArg[1]);
28001         rc = 1;
28002       }else{
28003         rc = process_input(p);
28004         pclose(p->in);
28005       }
28006 #endif
28007     }else if( (p->in = openChrSource(azArg[1]))==0 ){
28008       eputf("Error: cannot open \"%s\"\n", azArg[1]);
28009       rc = 1;
28010     }else{
28011       rc = process_input(p);
28012       fclose(p->in);
28013     }
28014     p->in = inSaved;
28015     p->lineno = savedLineno;
28016   }else
28017 #endif /* !defined(SQLITE_SHELL_FIDDLE) */
28018 
28019 #ifndef SQLITE_SHELL_FIDDLE
28020   if( c=='r' && n>=3 && cli_strncmp(azArg[0], "restore", n)==0 ){
28021     const char *zSrcFile;
28022     const char *zDb;
28023     sqlite3 *pSrc;
28024     sqlite3_backup *pBackup;
28025     int nTimeout = 0;
28026 
28027     failIfSafeMode(p, "cannot run .restore in safe mode");
28028     if( nArg==2 ){
28029       zSrcFile = azArg[1];
28030       zDb = "main";
28031     }else if( nArg==3 ){
28032       zSrcFile = azArg[2];
28033       zDb = azArg[1];
28034     }else{
28035       eputz("Usage: .restore ?DB? FILE\n");
28036       rc = 1;
28037       goto meta_command_exit;
28038     }
28039     rc = sqlite3_open(zSrcFile, &pSrc);
28040     if( rc!=SQLITE_OK ){
28041       eputf("Error: cannot open \"%s\"\n", zSrcFile);
28042       close_db(pSrc);
28043       return 1;
28044     }
28045     open_db(p, 0);
28046     pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
28047     if( pBackup==0 ){
28048       eputf("Error: %s\n", sqlite3_errmsg(p->db));
28049       close_db(pSrc);
28050       return 1;
28051     }
28052     while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
28053           || rc==SQLITE_BUSY  ){
28054       if( rc==SQLITE_BUSY ){
28055         if( nTimeout++ >= 3 ) break;
28056         sqlite3_sleep(100);
28057       }
28058     }
28059     sqlite3_backup_finish(pBackup);
28060     if( rc==SQLITE_DONE ){
28061       rc = 0;
28062     }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
28063       eputz("Error: source database is busy\n");
28064       rc = 1;
28065     }else{
28066       eputf("Error: %s\n", sqlite3_errmsg(p->db));
28067       rc = 1;
28068     }
28069     close_db(pSrc);
28070   }else
28071 #endif /* !defined(SQLITE_SHELL_FIDDLE) */
28072 
28073   if( c=='s' && cli_strncmp(azArg[0], "scanstats", n)==0 ){
28074     if( nArg==2 ){
28075       if( cli_strcmp(azArg[1], "vm")==0 ){
28076         p->scanstatsOn = 3;
28077       }else
28078       if( cli_strcmp(azArg[1], "est")==0 ){
28079         p->scanstatsOn = 2;
28080       }else{
28081         p->scanstatsOn = (u8)booleanValue(azArg[1]);
28082       }
28083       open_db(p, 0);
28084       sqlite3_db_config(
28085           p->db, SQLITE_DBCONFIG_STMT_SCANSTATUS, p->scanstatsOn, (int*)0
28086       );
28087 #if !defined(SQLITE_ENABLE_STMT_SCANSTATUS)
28088       eputz("Warning: .scanstats not available in this build.\n");
28089 #elif !defined(SQLITE_ENABLE_BYTECODE_VTAB)
28090       if( p->scanstatsOn==3 ){
28091         eputz("Warning: \".scanstats vm\" not available in this build.\n");
28092       }
28093 #endif
28094     }else{
28095       eputz("Usage: .scanstats on|off|est\n");
28096       rc = 1;
28097     }
28098   }else
28099 
28100   if( c=='s' && cli_strncmp(azArg[0], "schema", n)==0 ){
28101     ShellText sSelect;
28102     ShellState data;
28103     char *zErrMsg = 0;
28104     const char *zDiv = "(";
28105     const char *zName = 0;
28106     int iSchema = 0;
28107     int bDebug = 0;
28108     int bNoSystemTabs = 0;
28109     int ii;
28110 
28111     open_db(p, 0);
28112     memcpy(&data, p, sizeof(data));
28113     data.showHeader = 0;
28114     data.cMode = data.mode = MODE_Semi;
28115     initText(&sSelect);
28116     for(ii=1; ii<nArg; ii++){
28117       if( optionMatch(azArg[ii],"indent") ){
28118         data.cMode = data.mode = MODE_Pretty;
28119       }else if( optionMatch(azArg[ii],"debug") ){
28120         bDebug = 1;
28121       }else if( optionMatch(azArg[ii],"nosys") ){
28122         bNoSystemTabs = 1;
28123       }else if( azArg[ii][0]=='-' ){
28124         eputf("Unknown option: \"%s\"\n", azArg[ii]);
28125         rc = 1;
28126         goto meta_command_exit;
28127       }else if( zName==0 ){
28128         zName = azArg[ii];
28129       }else{
28130         eputz("Usage: .schema ?--indent? ?--nosys? ?LIKE-PATTERN?\n");
28131         rc = 1;
28132         goto meta_command_exit;
28133       }
28134     }
28135     if( zName!=0 ){
28136       int isSchema = sqlite3_strlike(zName, "sqlite_master", '\\')==0
28137                   || sqlite3_strlike(zName, "sqlite_schema", '\\')==0
28138                   || sqlite3_strlike(zName,"sqlite_temp_master", '\\')==0
28139                   || sqlite3_strlike(zName,"sqlite_temp_schema", '\\')==0;
28140       if( isSchema ){
28141         char *new_argv[2], *new_colv[2];
28142         new_argv[0] = sqlite3_mprintf(
28143                       "CREATE TABLE %s (\n"
28144                       "  type text,\n"
28145                       "  name text,\n"
28146                       "  tbl_name text,\n"
28147                       "  rootpage integer,\n"
28148                       "  sql text\n"
28149                       ")", zName);
28150         shell_check_oom(new_argv[0]);
28151         new_argv[1] = 0;
28152         new_colv[0] = "sql";
28153         new_colv[1] = 0;
28154         callback(&data, 1, new_argv, new_colv);
28155         sqlite3_free(new_argv[0]);
28156       }
28157     }
28158     if( zDiv ){
28159       sqlite3_stmt *pStmt = 0;
28160       rc = sqlite3_prepare_v2(p->db, "SELECT name FROM pragma_database_list",
28161                               -1, &pStmt, 0);
28162       if( rc ){
28163         eputf("Error: %s\n", sqlite3_errmsg(p->db));
28164         sqlite3_finalize(pStmt);
28165         rc = 1;
28166         goto meta_command_exit;
28167       }
28168       appendText(&sSelect, "SELECT sql FROM", 0);
28169       iSchema = 0;
28170       while( sqlite3_step(pStmt)==SQLITE_ROW ){
28171         const char *zDb = (const char*)sqlite3_column_text(pStmt, 0);
28172         char zScNum[30];
28173         sqlite3_snprintf(sizeof(zScNum), zScNum, "%d", ++iSchema);
28174         appendText(&sSelect, zDiv, 0);
28175         zDiv = " UNION ALL ";
28176         appendText(&sSelect, "SELECT shell_add_schema(sql,", 0);
28177         if( sqlite3_stricmp(zDb, "main")!=0 ){
28178           appendText(&sSelect, zDb, '\'');
28179         }else{
28180           appendText(&sSelect, "NULL", 0);
28181         }
28182         appendText(&sSelect, ",name) AS sql, type, tbl_name, name, rowid,", 0);
28183         appendText(&sSelect, zScNum, 0);
28184         appendText(&sSelect, " AS snum, ", 0);
28185         appendText(&sSelect, zDb, '\'');
28186         appendText(&sSelect, " AS sname FROM ", 0);
28187         appendText(&sSelect, zDb, quoteChar(zDb));
28188         appendText(&sSelect, ".sqlite_schema", 0);
28189       }
28190       sqlite3_finalize(pStmt);
28191 #ifndef SQLITE_OMIT_INTROSPECTION_PRAGMAS
28192       if( zName ){
28193         appendText(&sSelect,
28194            " UNION ALL SELECT shell_module_schema(name),"
28195            " 'table', name, name, name, 9e+99, 'main' FROM pragma_module_list",
28196         0);
28197       }
28198 #endif
28199       appendText(&sSelect, ") WHERE ", 0);
28200       if( zName ){
28201         char *zQarg = sqlite3_mprintf("%Q", zName);
28202         int bGlob;
28203         shell_check_oom(zQarg);
28204         bGlob = strchr(zName, '*') != 0 || strchr(zName, '?') != 0 ||
28205                 strchr(zName, '[') != 0;
28206         if( strchr(zName, '.') ){
28207           appendText(&sSelect, "lower(printf('%s.%s',sname,tbl_name))", 0);
28208         }else{
28209           appendText(&sSelect, "lower(tbl_name)", 0);
28210         }
28211         appendText(&sSelect, bGlob ? " GLOB " : " LIKE ", 0);
28212         appendText(&sSelect, zQarg, 0);
28213         if( !bGlob ){
28214           appendText(&sSelect, " ESCAPE '\\' ", 0);
28215         }
28216         appendText(&sSelect, " AND ", 0);
28217         sqlite3_free(zQarg);
28218       }
28219       if( bNoSystemTabs ){
28220         appendText(&sSelect, "name NOT LIKE 'sqlite_%%' AND ", 0);
28221       }
28222       appendText(&sSelect, "sql IS NOT NULL"
28223                            " ORDER BY snum, rowid", 0);
28224       if( bDebug ){
28225         oputf("SQL: %s;\n", sSelect.z);
28226       }else{
28227         rc = sqlite3_exec(p->db, sSelect.z, callback, &data, &zErrMsg);
28228       }
28229       freeText(&sSelect);
28230     }
28231     if( zErrMsg ){
28232       eputf("Error: %s\n", zErrMsg);
28233       sqlite3_free(zErrMsg);
28234       rc = 1;
28235     }else if( rc != SQLITE_OK ){
28236       eputz("Error: querying schema information\n");
28237       rc = 1;
28238     }else{
28239       rc = 0;
28240     }
28241   }else
28242 
28243   if( (c=='s' && n==11 && cli_strncmp(azArg[0], "selecttrace", n)==0)
28244    || (c=='t' && n==9  && cli_strncmp(azArg[0], "treetrace", n)==0)
28245   ){
28246     unsigned int x = nArg>=2? (unsigned int)integerValue(azArg[1]) : 0xffffffff;
28247     sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &x);
28248   }else
28249 
28250 #if defined(SQLITE_ENABLE_SESSION)
28251   if( c=='s' && cli_strncmp(azArg[0],"session",n)==0 && n>=3 ){
28252     struct AuxDb *pAuxDb = p->pAuxDb;
28253     OpenSession *pSession = &pAuxDb->aSession[0];
28254     char **azCmd = &azArg[1];
28255     int iSes = 0;
28256     int nCmd = nArg - 1;
28257     int i;
28258     if( nArg<=1 ) goto session_syntax_error;
28259     open_db(p, 0);
28260     if( nArg>=3 ){
28261       for(iSes=0; iSes<pAuxDb->nSession; iSes++){
28262         if( cli_strcmp(pAuxDb->aSession[iSes].zName, azArg[1])==0 ) break;
28263       }
28264       if( iSes<pAuxDb->nSession ){
28265         pSession = &pAuxDb->aSession[iSes];
28266         azCmd++;
28267         nCmd--;
28268       }else{
28269         pSession = &pAuxDb->aSession[0];
28270         iSes = 0;
28271       }
28272     }
28273 
28274     /* .session attach TABLE
28275     ** Invoke the sqlite3session_attach() interface to attach a particular
28276     ** table so that it is never filtered.
28277     */
28278     if( cli_strcmp(azCmd[0],"attach")==0 ){
28279       if( nCmd!=2 ) goto session_syntax_error;
28280       if( pSession->p==0 ){
28281         session_not_open:
28282         eputz("ERROR: No sessions are open\n");
28283       }else{
28284         rc = sqlite3session_attach(pSession->p, azCmd[1]);
28285         if( rc ){
28286           eputf("ERROR: sqlite3session_attach() returns %d\n",rc);
28287           rc = 0;
28288         }
28289       }
28290     }else
28291 
28292     /* .session changeset FILE
28293     ** .session patchset FILE
28294     ** Write a changeset or patchset into a file.  The file is overwritten.
28295     */
28296     if( cli_strcmp(azCmd[0],"changeset")==0
28297      || cli_strcmp(azCmd[0],"patchset")==0
28298     ){
28299       FILE *out = 0;
28300       failIfSafeMode(p, "cannot run \".session %s\" in safe mode", azCmd[0]);
28301       if( nCmd!=2 ) goto session_syntax_error;
28302       if( pSession->p==0 ) goto session_not_open;
28303       out = fopen(azCmd[1], "wb");
28304       if( out==0 ){
28305         eputf("ERROR: cannot open \"%s\" for writing\n",
28306               azCmd[1]);
28307       }else{
28308         int szChng;
28309         void *pChng;
28310         if( azCmd[0][0]=='c' ){
28311           rc = sqlite3session_changeset(pSession->p, &szChng, &pChng);
28312         }else{
28313           rc = sqlite3session_patchset(pSession->p, &szChng, &pChng);
28314         }
28315         if( rc ){
28316           sputf(stdout, "Error: error code %d\n", rc);
28317           rc = 0;
28318         }
28319         if( pChng
28320           && fwrite(pChng, szChng, 1, out)!=1 ){
28321           eputf("ERROR: Failed to write entire %d-byte output\n", szChng);
28322         }
28323         sqlite3_free(pChng);
28324         fclose(out);
28325       }
28326     }else
28327 
28328     /* .session close
28329     ** Close the identified session
28330     */
28331     if( cli_strcmp(azCmd[0], "close")==0 ){
28332       if( nCmd!=1 ) goto session_syntax_error;
28333       if( pAuxDb->nSession ){
28334         session_close(pSession);
28335         pAuxDb->aSession[iSes] = pAuxDb->aSession[--pAuxDb->nSession];
28336       }
28337     }else
28338 
28339     /* .session enable ?BOOLEAN?
28340     ** Query or set the enable flag
28341     */
28342     if( cli_strcmp(azCmd[0], "enable")==0 ){
28343       int ii;
28344       if( nCmd>2 ) goto session_syntax_error;
28345       ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
28346       if( pAuxDb->nSession ){
28347         ii = sqlite3session_enable(pSession->p, ii);
28348         oputf("session %s enable flag = %d\n", pSession->zName, ii);
28349       }
28350     }else
28351 
28352     /* .session filter GLOB ....
28353     ** Set a list of GLOB patterns of table names to be excluded.
28354     */
28355     if( cli_strcmp(azCmd[0], "filter")==0 ){
28356       int ii, nByte;
28357       if( nCmd<2 ) goto session_syntax_error;
28358       if( pAuxDb->nSession ){
28359         for(ii=0; ii<pSession->nFilter; ii++){
28360           sqlite3_free(pSession->azFilter[ii]);
28361         }
28362         sqlite3_free(pSession->azFilter);
28363         nByte = sizeof(pSession->azFilter[0])*(nCmd-1);
28364         pSession->azFilter = sqlite3_malloc( nByte );
28365         shell_check_oom( pSession->azFilter );
28366         for(ii=1; ii<nCmd; ii++){
28367           char *x = pSession->azFilter[ii-1] = sqlite3_mprintf("%s", azCmd[ii]);
28368           shell_check_oom(x);
28369         }
28370         pSession->nFilter = ii-1;
28371       }
28372     }else
28373 
28374     /* .session indirect ?BOOLEAN?
28375     ** Query or set the indirect flag
28376     */
28377     if( cli_strcmp(azCmd[0], "indirect")==0 ){
28378       int ii;
28379       if( nCmd>2 ) goto session_syntax_error;
28380       ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
28381       if( pAuxDb->nSession ){
28382         ii = sqlite3session_indirect(pSession->p, ii);
28383         oputf("session %s indirect flag = %d\n", pSession->zName, ii);
28384       }
28385     }else
28386 
28387     /* .session isempty
28388     ** Determine if the session is empty
28389     */
28390     if( cli_strcmp(azCmd[0], "isempty")==0 ){
28391       int ii;
28392       if( nCmd!=1 ) goto session_syntax_error;
28393       if( pAuxDb->nSession ){
28394         ii = sqlite3session_isempty(pSession->p);
28395         oputf("session %s isempty flag = %d\n", pSession->zName, ii);
28396       }
28397     }else
28398 
28399     /* .session list
28400     ** List all currently open sessions
28401     */
28402     if( cli_strcmp(azCmd[0],"list")==0 ){
28403       for(i=0; i<pAuxDb->nSession; i++){
28404         oputf("%d %s\n", i, pAuxDb->aSession[i].zName);
28405       }
28406     }else
28407 
28408     /* .session open DB NAME
28409     ** Open a new session called NAME on the attached database DB.
28410     ** DB is normally "main".
28411     */
28412     if( cli_strcmp(azCmd[0],"open")==0 ){
28413       char *zName;
28414       if( nCmd!=3 ) goto session_syntax_error;
28415       zName = azCmd[2];
28416       if( zName[0]==0 ) goto session_syntax_error;
28417       for(i=0; i<pAuxDb->nSession; i++){
28418         if( cli_strcmp(pAuxDb->aSession[i].zName,zName)==0 ){
28419           eputf("Session \"%s\" already exists\n", zName);
28420           goto meta_command_exit;
28421         }
28422       }
28423       if( pAuxDb->nSession>=ArraySize(pAuxDb->aSession) ){
28424         eputf("Maximum of %d sessions\n", ArraySize(pAuxDb->aSession));
28425         goto meta_command_exit;
28426       }
28427       pSession = &pAuxDb->aSession[pAuxDb->nSession];
28428       rc = sqlite3session_create(p->db, azCmd[1], &pSession->p);
28429       if( rc ){
28430         eputf("Cannot open session: error code=%d\n", rc);
28431         rc = 0;
28432         goto meta_command_exit;
28433       }
28434       pSession->nFilter = 0;
28435       sqlite3session_table_filter(pSession->p, session_filter, pSession);
28436       pAuxDb->nSession++;
28437       pSession->zName = sqlite3_mprintf("%s", zName);
28438       shell_check_oom(pSession->zName);
28439     }else
28440     /* If no command name matches, show a syntax error */
28441     session_syntax_error:
28442     showHelp(p->out, "session");
28443   }else
28444 #endif
28445 
28446 #ifdef SQLITE_DEBUG
28447   /* Undocumented commands for internal testing.  Subject to change
28448   ** without notice. */
28449   if( c=='s' && n>=10 && cli_strncmp(azArg[0], "selftest-", 9)==0 ){
28450     if( cli_strncmp(azArg[0]+9, "boolean", n-9)==0 ){
28451       int i, v;
28452       for(i=1; i<nArg; i++){
28453         v = booleanValue(azArg[i]);
28454         oputf("%s: %d 0x%x\n", azArg[i], v, v);
28455       }
28456     }
28457     if( cli_strncmp(azArg[0]+9, "integer", n-9)==0 ){
28458       int i; sqlite3_int64 v;
28459       for(i=1; i<nArg; i++){
28460         char zBuf[200];
28461         v = integerValue(azArg[i]);
28462         sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v);
28463         oputz(zBuf);
28464       }
28465     }
28466   }else
28467 #endif
28468 
28469   if( c=='s' && n>=4 && cli_strncmp(azArg[0],"selftest",n)==0 ){
28470     int bIsInit = 0;         /* True to initialize the SELFTEST table */
28471     int bVerbose = 0;        /* Verbose output */
28472     int bSelftestExists;     /* True if SELFTEST already exists */
28473     int i, k;                /* Loop counters */
28474     int nTest = 0;           /* Number of tests runs */
28475     int nErr = 0;            /* Number of errors seen */
28476     ShellText str;           /* Answer for a query */
28477     sqlite3_stmt *pStmt = 0; /* Query against the SELFTEST table */
28478 
28479     open_db(p,0);
28480     for(i=1; i<nArg; i++){
28481       const char *z = azArg[i];
28482       if( z[0]=='-' && z[1]=='-' ) z++;
28483       if( cli_strcmp(z,"-init")==0 ){
28484         bIsInit = 1;
28485       }else
28486       if( cli_strcmp(z,"-v")==0 ){
28487         bVerbose++;
28488       }else
28489       {
28490         eputf("Unknown option \"%s\" on \"%s\"\n", azArg[i], azArg[0]);
28491         eputz("Should be one of: --init -v\n");
28492         rc = 1;
28493         goto meta_command_exit;
28494       }
28495     }
28496     if( sqlite3_table_column_metadata(p->db,"main","selftest",0,0,0,0,0,0)
28497            != SQLITE_OK ){
28498       bSelftestExists = 0;
28499     }else{
28500       bSelftestExists = 1;
28501     }
28502     if( bIsInit ){
28503       createSelftestTable(p);
28504       bSelftestExists = 1;
28505     }
28506     initText(&str);
28507     appendText(&str, "x", 0);
28508     for(k=bSelftestExists; k>=0; k--){
28509       if( k==1 ){
28510         rc = sqlite3_prepare_v2(p->db,
28511             "SELECT tno,op,cmd,ans FROM selftest ORDER BY tno",
28512             -1, &pStmt, 0);
28513       }else{
28514         rc = sqlite3_prepare_v2(p->db,
28515           "VALUES(0,'memo','Missing SELFTEST table - default checks only',''),"
28516           "      (1,'run','PRAGMA integrity_check','ok')",
28517           -1, &pStmt, 0);
28518       }
28519       if( rc ){
28520         eputz("Error querying the selftest table\n");
28521         rc = 1;
28522         sqlite3_finalize(pStmt);
28523         goto meta_command_exit;
28524       }
28525       for(i=1; sqlite3_step(pStmt)==SQLITE_ROW; i++){
28526         int tno = sqlite3_column_int(pStmt, 0);
28527         const char *zOp = (const char*)sqlite3_column_text(pStmt, 1);
28528         const char *zSql = (const char*)sqlite3_column_text(pStmt, 2);
28529         const char *zAns = (const char*)sqlite3_column_text(pStmt, 3);
28530 
28531         if( zOp==0 ) continue;
28532         if( zSql==0 ) continue;
28533         if( zAns==0 ) continue;
28534         k = 0;
28535         if( bVerbose>0 ){
28536           sputf(stdout, "%d: %s %s\n", tno, zOp, zSql);
28537         }
28538         if( cli_strcmp(zOp,"memo")==0 ){
28539           oputf("%s\n", zSql);
28540         }else
28541         if( cli_strcmp(zOp,"run")==0 ){
28542           char *zErrMsg = 0;
28543           str.n = 0;
28544           str.z[0] = 0;
28545           rc = sqlite3_exec(p->db, zSql, captureOutputCallback, &str, &zErrMsg);
28546           nTest++;
28547           if( bVerbose ){
28548             oputf("Result: %s\n", str.z);
28549           }
28550           if( rc || zErrMsg ){
28551             nErr++;
28552             rc = 1;
28553             oputf("%d: error-code-%d: %s\n", tno, rc, zErrMsg);
28554             sqlite3_free(zErrMsg);
28555           }else if( cli_strcmp(zAns,str.z)!=0 ){
28556             nErr++;
28557             rc = 1;
28558             oputf("%d: Expected: [%s]\n", tno, zAns);
28559             oputf("%d:      Got: [%s]\n", tno, str.z);
28560           }
28561         }
28562         else{
28563           eputf("Unknown operation \"%s\" on selftest line %d\n", zOp, tno);
28564           rc = 1;
28565           break;
28566         }
28567       } /* End loop over rows of content from SELFTEST */
28568       sqlite3_finalize(pStmt);
28569     } /* End loop over k */
28570     freeText(&str);
28571     oputf("%d errors out of %d tests\n", nErr, nTest);
28572   }else
28573 
28574   if( c=='s' && cli_strncmp(azArg[0], "separator", n)==0 ){
28575     if( nArg<2 || nArg>3 ){
28576       eputz("Usage: .separator COL ?ROW?\n");
28577       rc = 1;
28578     }
28579     if( nArg>=2 ){
28580       sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator,
28581                        "%.*s", (int)ArraySize(p->colSeparator)-1, azArg[1]);
28582     }
28583     if( nArg>=3 ){
28584       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator,
28585                        "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]);
28586     }
28587   }else
28588 
28589   if( c=='s' && n>=4 && cli_strncmp(azArg[0],"sha3sum",n)==0 ){
28590     const char *zLike = 0;   /* Which table to checksum. 0 means everything */
28591     int i;                   /* Loop counter */
28592     int bSchema = 0;         /* Also hash the schema */
28593     int bSeparate = 0;       /* Hash each table separately */
28594     int iSize = 224;         /* Hash algorithm to use */
28595     int bDebug = 0;          /* Only show the query that would have run */
28596     sqlite3_stmt *pStmt;     /* For querying tables names */
28597     char *zSql;              /* SQL to be run */
28598     char *zSep;              /* Separator */
28599     ShellText sSql;          /* Complete SQL for the query to run the hash */
28600     ShellText sQuery;        /* Set of queries used to read all content */
28601     open_db(p, 0);
28602     for(i=1; i<nArg; i++){
28603       const char *z = azArg[i];
28604       if( z[0]=='-' ){
28605         z++;
28606         if( z[0]=='-' ) z++;
28607         if( cli_strcmp(z,"schema")==0 ){
28608           bSchema = 1;
28609         }else
28610         if( cli_strcmp(z,"sha3-224")==0 || cli_strcmp(z,"sha3-256")==0
28611          || cli_strcmp(z,"sha3-384")==0 || cli_strcmp(z,"sha3-512")==0
28612         ){
28613           iSize = atoi(&z[5]);
28614         }else
28615         if( cli_strcmp(z,"debug")==0 ){
28616           bDebug = 1;
28617         }else
28618         {
28619           eputf("Unknown option \"%s\" on \"%s\"\n", azArg[i], azArg[0]);
28620           showHelp(p->out, azArg[0]);
28621           rc = 1;
28622           goto meta_command_exit;
28623         }
28624       }else if( zLike ){
28625         eputz("Usage: .sha3sum ?OPTIONS? ?LIKE-PATTERN?\n");
28626         rc = 1;
28627         goto meta_command_exit;
28628       }else{
28629         zLike = z;
28630         bSeparate = 1;
28631         if( sqlite3_strlike("sqlite\\_%", zLike, '\\')==0 ) bSchema = 1;
28632       }
28633     }
28634     if( bSchema ){
28635       zSql = "SELECT lower(name) as tname FROM sqlite_schema"
28636              " WHERE type='table' AND coalesce(rootpage,0)>1"
28637              " UNION ALL SELECT 'sqlite_schema'"
28638              " ORDER BY 1 collate nocase";
28639     }else{
28640       zSql = "SELECT lower(name) as tname FROM sqlite_schema"
28641              " WHERE type='table' AND coalesce(rootpage,0)>1"
28642              " AND name NOT LIKE 'sqlite_%'"
28643              " ORDER BY 1 collate nocase";
28644     }
28645     sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
28646     initText(&sQuery);
28647     initText(&sSql);
28648     appendText(&sSql, "WITH [sha3sum$query](a,b) AS(",0);
28649     zSep = "VALUES(";
28650     while( SQLITE_ROW==sqlite3_step(pStmt) ){
28651       const char *zTab = (const char*)sqlite3_column_text(pStmt,0);
28652       if( zTab==0 ) continue;
28653       if( zLike && sqlite3_strlike(zLike, zTab, 0)!=0 ) continue;
28654       if( cli_strncmp(zTab, "sqlite_",7)!=0 ){
28655         appendText(&sQuery,"SELECT * FROM ", 0);
28656         appendText(&sQuery,zTab,'"');
28657         appendText(&sQuery," NOT INDEXED;", 0);
28658       }else if( cli_strcmp(zTab, "sqlite_schema")==0 ){
28659         appendText(&sQuery,"SELECT type,name,tbl_name,sql FROM sqlite_schema"
28660                            " ORDER BY name;", 0);
28661       }else if( cli_strcmp(zTab, "sqlite_sequence")==0 ){
28662         appendText(&sQuery,"SELECT name,seq FROM sqlite_sequence"
28663                            " ORDER BY name;", 0);
28664       }else if( cli_strcmp(zTab, "sqlite_stat1")==0 ){
28665         appendText(&sQuery,"SELECT tbl,idx,stat FROM sqlite_stat1"
28666                            " ORDER BY tbl,idx;", 0);
28667       }else if( cli_strcmp(zTab, "sqlite_stat4")==0 ){
28668         appendText(&sQuery, "SELECT * FROM ", 0);
28669         appendText(&sQuery, zTab, 0);
28670         appendText(&sQuery, " ORDER BY tbl, idx, rowid;\n", 0);
28671       }
28672       appendText(&sSql, zSep, 0);
28673       appendText(&sSql, sQuery.z, '\'');
28674       sQuery.n = 0;
28675       appendText(&sSql, ",", 0);
28676       appendText(&sSql, zTab, '\'');
28677       zSep = "),(";
28678     }
28679     sqlite3_finalize(pStmt);
28680     if( bSeparate ){
28681       zSql = sqlite3_mprintf(
28682           "%s))"
28683           " SELECT lower(hex(sha3_query(a,%d))) AS hash, b AS label"
28684           "   FROM [sha3sum$query]",
28685           sSql.z, iSize);
28686     }else{
28687       zSql = sqlite3_mprintf(
28688           "%s))"
28689           " SELECT lower(hex(sha3_query(group_concat(a,''),%d))) AS hash"
28690           "   FROM [sha3sum$query]",
28691           sSql.z, iSize);
28692     }
28693     shell_check_oom(zSql);
28694     freeText(&sQuery);
28695     freeText(&sSql);
28696     if( bDebug ){
28697       oputf("%s\n", zSql);
28698     }else{
28699       shell_exec(p, zSql, 0);
28700     }
28701 #if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) && !defined(SQLITE_OMIT_VIRTUALTABLE)
28702     {
28703       int lrc;
28704       char *zRevText = /* Query for reversible to-blob-to-text check */
28705         "SELECT lower(name) as tname FROM sqlite_schema\n"
28706         "WHERE type='table' AND coalesce(rootpage,0)>1\n"
28707         "AND name NOT LIKE 'sqlite_%%'%s\n"
28708         "ORDER BY 1 collate nocase";
28709       zRevText = sqlite3_mprintf(zRevText, zLike? " AND name LIKE $tspec" : "");
28710       zRevText = sqlite3_mprintf(
28711           /* lower-case query is first run, producing upper-case query. */
28712           "with tabcols as materialized(\n"
28713           "select tname, cname\n"
28714           "from ("
28715           " select printf('\"%%w\"',ss.tname) as tname,"
28716           " printf('\"%%w\"',ti.name) as cname\n"
28717           " from (%z) ss\n inner join pragma_table_info(tname) ti))\n"
28718           "select 'SELECT total(bad_text_count) AS bad_text_count\n"
28719           "FROM ('||group_concat(query, ' UNION ALL ')||')' as btc_query\n"
28720           " from (select 'SELECT COUNT(*) AS bad_text_count\n"
28721           "FROM '||tname||' WHERE '\n"
28722           "||group_concat('CAST(CAST('||cname||' AS BLOB) AS TEXT)<>'||cname\n"
28723           "|| ' AND typeof('||cname||')=''text'' ',\n"
28724           "' OR ') as query, tname from tabcols group by tname)"
28725           , zRevText);
28726       shell_check_oom(zRevText);
28727       if( bDebug ) oputf("%s\n", zRevText);
28728       lrc = sqlite3_prepare_v2(p->db, zRevText, -1, &pStmt, 0);
28729       if( lrc!=SQLITE_OK ){
28730         /* assert(lrc==SQLITE_NOMEM); // might also be SQLITE_ERROR if the
28731         ** user does cruel and unnatural things like ".limit expr_depth 0". */
28732         rc = 1;
28733       }else{
28734         if( zLike ) sqlite3_bind_text(pStmt,1,zLike,-1,SQLITE_STATIC);
28735         lrc = SQLITE_ROW==sqlite3_step(pStmt);
28736         if( lrc ){
28737           const char *zGenQuery = (char*)sqlite3_column_text(pStmt,0);
28738           sqlite3_stmt *pCheckStmt;
28739           lrc = sqlite3_prepare_v2(p->db, zGenQuery, -1, &pCheckStmt, 0);
28740           if( bDebug ) oputf("%s\n", zGenQuery);
28741           if( lrc!=SQLITE_OK ){
28742             rc = 1;
28743           }else{
28744             if( SQLITE_ROW==sqlite3_step(pCheckStmt) ){
28745               double countIrreversible = sqlite3_column_double(pCheckStmt, 0);
28746               if( countIrreversible>0 ){
28747                 int sz = (int)(countIrreversible + 0.5);
28748                 eputf("Digest includes %d invalidly encoded text field%s.\n",
28749                       sz, (sz>1)? "s": "");
28750               }
28751             }
28752             sqlite3_finalize(pCheckStmt);
28753           }
28754           sqlite3_finalize(pStmt);
28755         }
28756       }
28757       if( rc ) eputz(".sha3sum failed.\n");
28758       sqlite3_free(zRevText);
28759     }
28760 #endif /* !defined(*_OMIT_SCHEMA_PRAGMAS) && !defined(*_OMIT_VIRTUALTABLE) */
28761     sqlite3_free(zSql);
28762   }else
28763 
28764 #if !defined(SQLITE_NOHAVE_SYSTEM) && !defined(SQLITE_SHELL_FIDDLE)
28765   if( c=='s'
28766    && (cli_strncmp(azArg[0], "shell", n)==0
28767        || cli_strncmp(azArg[0],"system",n)==0)
28768   ){
28769     char *zCmd;
28770     int i, x;
28771     failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]);
28772     if( nArg<2 ){
28773       eputz("Usage: .system COMMAND\n");
28774       rc = 1;
28775       goto meta_command_exit;
28776     }
28777     zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]);
28778     for(i=2; i<nArg && zCmd!=0; i++){
28779       zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"",
28780                              zCmd, azArg[i]);
28781     }
28782     consoleRestore();
28783     x = zCmd!=0 ? system(zCmd) : 1;
28784     consoleRenewSetup();
28785     sqlite3_free(zCmd);
28786     if( x ) eputf("System command returns %d\n", x);
28787   }else
28788 #endif /* !defined(SQLITE_NOHAVE_SYSTEM) && !defined(SQLITE_SHELL_FIDDLE) */
28789 
28790   if( c=='s' && cli_strncmp(azArg[0], "show", n)==0 ){
28791     static const char *azBool[] = { "off", "on", "trigger", "full"};
28792     const char *zOut;
28793     int i;
28794     if( nArg!=1 ){
28795       eputz("Usage: .show\n");
28796       rc = 1;
28797       goto meta_command_exit;
28798     }
28799     oputf("%12.12s: %s\n","echo",
28800           azBool[ShellHasFlag(p, SHFLG_Echo)]);
28801     oputf("%12.12s: %s\n","eqp", azBool[p->autoEQP&3]);
28802     oputf("%12.12s: %s\n","explain",
28803           p->mode==MODE_Explain ? "on" : p->autoExplain ? "auto" : "off");
28804     oputf("%12.12s: %s\n","headers", azBool[p->showHeader!=0]);
28805     if( p->mode==MODE_Column
28806      || (p->mode>=MODE_Markdown && p->mode<=MODE_Box)
28807     ){
28808       oputf("%12.12s: %s --wrap %d --wordwrap %s --%squote\n", "mode",
28809             modeDescr[p->mode], p->cmOpts.iWrap,
28810             p->cmOpts.bWordWrap ? "on" : "off",
28811             p->cmOpts.bQuote ? "" : "no");
28812     }else{
28813       oputf("%12.12s: %s\n","mode", modeDescr[p->mode]);
28814     }
28815     oputf("%12.12s: ", "nullvalue");
28816     output_c_string(p->nullValue);
28817     oputz("\n");
28818     oputf("%12.12s: %s\n","output",
28819           strlen30(p->outfile) ? p->outfile : "stdout");
28820     oputf("%12.12s: ", "colseparator");
28821      output_c_string(p->colSeparator);
28822      oputz("\n");
28823     oputf("%12.12s: ", "rowseparator");
28824      output_c_string(p->rowSeparator);
28825      oputz("\n");
28826     switch( p->statsOn ){
28827       case 0:  zOut = "off";     break;
28828       default: zOut = "on";      break;
28829       case 2:  zOut = "stmt";    break;
28830       case 3:  zOut = "vmstep";  break;
28831     }
28832     oputf("%12.12s: %s\n","stats", zOut);
28833     oputf("%12.12s: ", "width");
28834     for (i=0;i<p->nWidth;i++) {
28835       oputf("%d ", p->colWidth[i]);
28836     }
28837     oputz("\n");
28838     oputf("%12.12s: %s\n", "filename",
28839           p->pAuxDb->zDbFilename ? p->pAuxDb->zDbFilename : "");
28840   }else
28841 
28842   if( c=='s' && cli_strncmp(azArg[0], "stats", n)==0 ){
28843     if( nArg==2 ){
28844       if( cli_strcmp(azArg[1],"stmt")==0 ){
28845         p->statsOn = 2;
28846       }else if( cli_strcmp(azArg[1],"vmstep")==0 ){
28847         p->statsOn = 3;
28848       }else{
28849         p->statsOn = (u8)booleanValue(azArg[1]);
28850       }
28851     }else if( nArg==1 ){
28852       display_stats(p->db, p, 0);
28853     }else{
28854       eputz("Usage: .stats ?on|off|stmt|vmstep?\n");
28855       rc = 1;
28856     }
28857   }else
28858 
28859   if( (c=='t' && n>1 && cli_strncmp(azArg[0], "tables", n)==0)
28860    || (c=='i' && (cli_strncmp(azArg[0], "indices", n)==0
28861                  || cli_strncmp(azArg[0], "indexes", n)==0) )
28862   ){
28863     sqlite3_stmt *pStmt;
28864     char **azResult;
28865     int nRow, nAlloc;
28866     int ii;
28867     ShellText s;
28868     initText(&s);
28869     open_db(p, 0);
28870     rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
28871     if( rc ){
28872       sqlite3_finalize(pStmt);
28873       return shellDatabaseError(p->db);
28874     }
28875 
28876     if( nArg>2 && c=='i' ){
28877       /* It is an historical accident that the .indexes command shows an error
28878       ** when called with the wrong number of arguments whereas the .tables
28879       ** command does not. */
28880       eputz("Usage: .indexes ?LIKE-PATTERN?\n");
28881       rc = 1;
28882       sqlite3_finalize(pStmt);
28883       goto meta_command_exit;
28884     }
28885     for(ii=0; sqlite3_step(pStmt)==SQLITE_ROW; ii++){
28886       const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
28887       if( zDbName==0 ) continue;
28888       if( s.z && s.z[0] ) appendText(&s, " UNION ALL ", 0);
28889       if( sqlite3_stricmp(zDbName, "main")==0 ){
28890         appendText(&s, "SELECT name FROM ", 0);
28891       }else{
28892         appendText(&s, "SELECT ", 0);
28893         appendText(&s, zDbName, '\'');
28894         appendText(&s, "||'.'||name FROM ", 0);
28895       }
28896       appendText(&s, zDbName, '"');
28897       appendText(&s, ".sqlite_schema ", 0);
28898       if( c=='t' ){
28899         appendText(&s," WHERE type IN ('table','view')"
28900                       "   AND name NOT LIKE 'sqlite_%'"
28901                       "   AND name LIKE ?1", 0);
28902       }else{
28903         appendText(&s," WHERE type='index'"
28904                       "   AND tbl_name LIKE ?1", 0);
28905       }
28906     }
28907     rc = sqlite3_finalize(pStmt);
28908     if( rc==SQLITE_OK ){
28909       appendText(&s, " ORDER BY 1", 0);
28910       rc = sqlite3_prepare_v2(p->db, s.z, -1, &pStmt, 0);
28911     }
28912     freeText(&s);
28913     if( rc ) return shellDatabaseError(p->db);
28914 
28915     /* Run the SQL statement prepared by the above block. Store the results
28916     ** as an array of nul-terminated strings in azResult[].  */
28917     nRow = nAlloc = 0;
28918     azResult = 0;
28919     if( nArg>1 ){
28920       sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
28921     }else{
28922       sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
28923     }
28924     while( sqlite3_step(pStmt)==SQLITE_ROW ){
28925       if( nRow>=nAlloc ){
28926         char **azNew;
28927         int n2 = nAlloc*2 + 10;
28928         azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2);
28929         shell_check_oom(azNew);
28930         nAlloc = n2;
28931         azResult = azNew;
28932       }
28933       azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
28934       shell_check_oom(azResult[nRow]);
28935       nRow++;
28936     }
28937     if( sqlite3_finalize(pStmt)!=SQLITE_OK ){
28938       rc = shellDatabaseError(p->db);
28939     }
28940 
28941     /* Pretty-print the contents of array azResult[] to the output */
28942     if( rc==0 && nRow>0 ){
28943       int len, maxlen = 0;
28944       int i, j;
28945       int nPrintCol, nPrintRow;
28946       for(i=0; i<nRow; i++){
28947         len = strlen30(azResult[i]);
28948         if( len>maxlen ) maxlen = len;
28949       }
28950       nPrintCol = 80/(maxlen+2);
28951       if( nPrintCol<1 ) nPrintCol = 1;
28952       nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
28953       for(i=0; i<nPrintRow; i++){
28954         for(j=i; j<nRow; j+=nPrintRow){
28955           char *zSp = j<nPrintRow ? "" : "  ";
28956           oputf("%s%-*s", zSp, maxlen, azResult[j] ? azResult[j]:"");
28957         }
28958         oputz("\n");
28959       }
28960     }
28961 
28962     for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
28963     sqlite3_free(azResult);
28964   }else
28965 
28966 #ifndef SQLITE_SHELL_FIDDLE
28967   /* Begin redirecting output to the file "testcase-out.txt" */
28968   if( c=='t' && cli_strcmp(azArg[0],"testcase")==0 ){
28969     output_reset(p);
28970     p->out = output_file_open("testcase-out.txt", 0);
28971     if( p->out==0 ){
28972       eputz("Error: cannot open 'testcase-out.txt'\n");
28973     }
28974     if( nArg>=2 ){
28975       sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "%s", azArg[1]);
28976     }else{
28977       sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "?");
28978     }
28979   }else
28980 #endif /* !defined(SQLITE_SHELL_FIDDLE) */
28981 
28982 #ifndef SQLITE_UNTESTABLE
28983   if( c=='t' && n>=8 && cli_strncmp(azArg[0], "testctrl", n)==0 ){
28984     static const struct {
28985        const char *zCtrlName;   /* Name of a test-control option */
28986        int ctrlCode;            /* Integer code for that option */
28987        int unSafe;              /* Not valid unless --unsafe-testing */
28988        const char *zUsage;      /* Usage notes */
28989     } aCtrl[] = {
28990     {"always",             SQLITE_TESTCTRL_ALWAYS, 1,     "BOOLEAN"         },
28991     {"assert",             SQLITE_TESTCTRL_ASSERT, 1,     "BOOLEAN"         },
28992   /*{"benign_malloc_hooks",SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS,1, ""        },*/
28993   /*{"bitvec_test",        SQLITE_TESTCTRL_BITVEC_TEST, 1,  ""              },*/
28994     {"byteorder",          SQLITE_TESTCTRL_BYTEORDER, 0,  ""                },
28995     {"extra_schema_checks",SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS,0,"BOOLEAN"  },
28996     {"fault_install",      SQLITE_TESTCTRL_FAULT_INSTALL, 1,"args..."       },
28997     {"fk_no_action",       SQLITE_TESTCTRL_FK_NO_ACTION, 0, "BOOLEAN"       },
28998     {"imposter",         SQLITE_TESTCTRL_IMPOSTER,1,"SCHEMA ON/OFF ROOTPAGE"},
28999     {"internal_functions", SQLITE_TESTCTRL_INTERNAL_FUNCTIONS,0,""          },
29000     {"json_selfcheck",     SQLITE_TESTCTRL_JSON_SELFCHECK ,0,"BOOLEAN"      },
29001     {"localtime_fault",    SQLITE_TESTCTRL_LOCALTIME_FAULT,0,"BOOLEAN"      },
29002     {"never_corrupt",      SQLITE_TESTCTRL_NEVER_CORRUPT,1, "BOOLEAN"       },
29003     {"optimizations",      SQLITE_TESTCTRL_OPTIMIZATIONS,0,"DISABLE-MASK"   },
29004 #ifdef YYCOVERAGE
29005     {"parser_coverage",    SQLITE_TESTCTRL_PARSER_COVERAGE,0,""             },
29006 #endif
29007     {"pending_byte",       SQLITE_TESTCTRL_PENDING_BYTE,0, "OFFSET  "       },
29008     {"prng_restore",       SQLITE_TESTCTRL_PRNG_RESTORE,0, ""               },
29009     {"prng_save",          SQLITE_TESTCTRL_PRNG_SAVE,   0, ""               },
29010     {"prng_seed",          SQLITE_TESTCTRL_PRNG_SEED,   0, "SEED ?db?"      },
29011     {"seek_count",         SQLITE_TESTCTRL_SEEK_COUNT,  0, ""               },
29012     {"sorter_mmap",        SQLITE_TESTCTRL_SORTER_MMAP, 0, "NMAX"           },
29013     {"tune",               SQLITE_TESTCTRL_TUNE,        1, "ID VALUE"       },
29014     {"uselongdouble",  SQLITE_TESTCTRL_USELONGDOUBLE,0,"?BOOLEAN|\"default\"?"},
29015     };
29016     int testctrl = -1;
29017     int iCtrl = -1;
29018     int rc2 = 0;    /* 0: usage.  1: %d  2: %x  3: no-output */
29019     int isOk = 0;
29020     int i, n2;
29021     const char *zCmd = 0;
29022 
29023     open_db(p, 0);
29024     zCmd = nArg>=2 ? azArg[1] : "help";
29025 
29026     /* The argument can optionally begin with "-" or "--" */
29027     if( zCmd[0]=='-' && zCmd[1] ){
29028       zCmd++;
29029       if( zCmd[0]=='-' && zCmd[1] ) zCmd++;
29030     }
29031 
29032     /* --help lists all test-controls */
29033     if( cli_strcmp(zCmd,"help")==0 ){
29034       oputz("Available test-controls:\n");
29035       for(i=0; i<ArraySize(aCtrl); i++){
29036         if( aCtrl[i].unSafe && !ShellHasFlag(p,SHFLG_TestingMode) ) continue;
29037         oputf("  .testctrl %s %s\n",
29038               aCtrl[i].zCtrlName, aCtrl[i].zUsage);
29039       }
29040       rc = 1;
29041       goto meta_command_exit;
29042     }
29043 
29044     /* convert testctrl text option to value. allow any unique prefix
29045     ** of the option name, or a numerical value. */
29046     n2 = strlen30(zCmd);
29047     for(i=0; i<ArraySize(aCtrl); i++){
29048       if( aCtrl[i].unSafe && !ShellHasFlag(p,SHFLG_TestingMode) ) continue;
29049       if( cli_strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){
29050         if( testctrl<0 ){
29051           testctrl = aCtrl[i].ctrlCode;
29052           iCtrl = i;
29053         }else{
29054           eputf("Error: ambiguous test-control: \"%s\"\n"
29055                 "Use \".testctrl --help\" for help\n", zCmd);
29056           rc = 1;
29057           goto meta_command_exit;
29058         }
29059       }
29060     }
29061     if( testctrl<0 ){
29062       eputf("Error: unknown test-control: %s\n"
29063             "Use \".testctrl --help\" for help\n", zCmd);
29064     }else{
29065       switch(testctrl){
29066 
29067         /* sqlite3_test_control(int, db, int) */
29068         case SQLITE_TESTCTRL_OPTIMIZATIONS:
29069         case SQLITE_TESTCTRL_FK_NO_ACTION:
29070           if( nArg==3 ){
29071             unsigned int opt = (unsigned int)strtol(azArg[2], 0, 0);
29072             rc2 = sqlite3_test_control(testctrl, p->db, opt);
29073             isOk = 3;
29074           }
29075           break;
29076 
29077         /* sqlite3_test_control(int) */
29078         case SQLITE_TESTCTRL_PRNG_SAVE:
29079         case SQLITE_TESTCTRL_PRNG_RESTORE:
29080         case SQLITE_TESTCTRL_BYTEORDER:
29081           if( nArg==2 ){
29082             rc2 = sqlite3_test_control(testctrl);
29083             isOk = testctrl==SQLITE_TESTCTRL_BYTEORDER ? 1 : 3;
29084           }
29085           break;
29086 
29087         /* sqlite3_test_control(int, uint) */
29088         case SQLITE_TESTCTRL_PENDING_BYTE:
29089           if( nArg==3 ){
29090             unsigned int opt = (unsigned int)integerValue(azArg[2]);
29091             rc2 = sqlite3_test_control(testctrl, opt);
29092             isOk = 3;
29093           }
29094           break;
29095 
29096         /* sqlite3_test_control(int, int, sqlite3*) */
29097         case SQLITE_TESTCTRL_PRNG_SEED:
29098           if( nArg==3 || nArg==4 ){
29099             int ii = (int)integerValue(azArg[2]);
29100             sqlite3 *db;
29101             if( ii==0 && cli_strcmp(azArg[2],"random")==0 ){
29102               sqlite3_randomness(sizeof(ii),&ii);
29103               sputf(stdout, "-- random seed: %d\n", ii);
29104             }
29105             if( nArg==3 ){
29106               db = 0;
29107             }else{
29108               db = p->db;
29109               /* Make sure the schema has been loaded */
29110               sqlite3_table_column_metadata(db, 0, "x", 0, 0, 0, 0, 0, 0);
29111             }
29112             rc2 = sqlite3_test_control(testctrl, ii, db);
29113             isOk = 3;
29114           }
29115           break;
29116 
29117         /* sqlite3_test_control(int, int) */
29118         case SQLITE_TESTCTRL_ASSERT:
29119         case SQLITE_TESTCTRL_ALWAYS:
29120           if( nArg==3 ){
29121             int opt = booleanValue(azArg[2]);
29122             rc2 = sqlite3_test_control(testctrl, opt);
29123             isOk = 1;
29124           }
29125           break;
29126 
29127         /* sqlite3_test_control(int, int) */
29128         case SQLITE_TESTCTRL_LOCALTIME_FAULT:
29129         case SQLITE_TESTCTRL_NEVER_CORRUPT:
29130           if( nArg==3 ){
29131             int opt = booleanValue(azArg[2]);
29132             rc2 = sqlite3_test_control(testctrl, opt);
29133             isOk = 3;
29134           }
29135           break;
29136 
29137         /* sqlite3_test_control(int, int) */
29138         case SQLITE_TESTCTRL_USELONGDOUBLE: {
29139           int opt = -1;
29140           if( nArg==3 ){
29141             if( cli_strcmp(azArg[2],"default")==0 ){
29142               opt = 2;
29143             }else{
29144               opt = booleanValue(azArg[2]);
29145             }
29146           }
29147           rc2 = sqlite3_test_control(testctrl, opt);
29148           isOk = 1;
29149           break;
29150         }
29151 
29152         /* sqlite3_test_control(sqlite3*) */
29153         case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS:
29154           rc2 = sqlite3_test_control(testctrl, p->db);
29155           isOk = 3;
29156           break;
29157 
29158         case SQLITE_TESTCTRL_IMPOSTER:
29159           if( nArg==5 ){
29160             rc2 = sqlite3_test_control(testctrl, p->db,
29161                           azArg[2],
29162                           integerValue(azArg[3]),
29163                           integerValue(azArg[4]));
29164             isOk = 3;
29165           }
29166           break;
29167 
29168         case SQLITE_TESTCTRL_SEEK_COUNT: {
29169           u64 x = 0;
29170           rc2 = sqlite3_test_control(testctrl, p->db, &x);
29171           oputf("%llu\n", x);
29172           isOk = 3;
29173           break;
29174         }
29175 
29176 #ifdef YYCOVERAGE
29177         case SQLITE_TESTCTRL_PARSER_COVERAGE: {
29178           if( nArg==2 ){
29179             sqlite3_test_control(testctrl, p->out);
29180             isOk = 3;
29181           }
29182           break;
29183         }
29184 #endif
29185 #ifdef SQLITE_DEBUG
29186         case SQLITE_TESTCTRL_TUNE: {
29187           if( nArg==4 ){
29188             int id = (int)integerValue(azArg[2]);
29189             int val = (int)integerValue(azArg[3]);
29190             sqlite3_test_control(testctrl, id, &val);
29191             isOk = 3;
29192           }else if( nArg==3 ){
29193             int id = (int)integerValue(azArg[2]);
29194             sqlite3_test_control(testctrl, -id, &rc2);
29195             isOk = 1;
29196           }else if( nArg==2 ){
29197             int id = 1;
29198             while(1){
29199               int val = 0;
29200               rc2 = sqlite3_test_control(testctrl, -id, &val);
29201               if( rc2!=SQLITE_OK ) break;
29202               if( id>1 ) oputz("  ");
29203               oputf("%d: %d", id, val);
29204               id++;
29205             }
29206             if( id>1 ) oputz("\n");
29207             isOk = 3;
29208           }
29209           break;
29210         }
29211 #endif
29212         case SQLITE_TESTCTRL_SORTER_MMAP:
29213           if( nArg==3 ){
29214             int opt = (unsigned int)integerValue(azArg[2]);
29215             rc2 = sqlite3_test_control(testctrl, p->db, opt);
29216             isOk = 3;
29217           }
29218           break;
29219         case SQLITE_TESTCTRL_JSON_SELFCHECK:
29220           if( nArg==2 ){
29221             rc2 = -1;
29222             isOk = 1;
29223           }else{
29224             rc2 = booleanValue(azArg[2]);
29225             isOk = 3;
29226           }
29227           sqlite3_test_control(testctrl, &rc2);
29228           break;
29229         case SQLITE_TESTCTRL_FAULT_INSTALL: {
29230           int kk;
29231           int bShowHelp = nArg<=2;
29232           isOk = 3;
29233           for(kk=2; kk<nArg; kk++){
29234             const char *z = azArg[kk];
29235             if( z[0]=='-' && z[1]=='-' ) z++;
29236             if( cli_strcmp(z,"off")==0 ){
29237               sqlite3_test_control(testctrl, 0);
29238             }else if( cli_strcmp(z,"on")==0 ){
29239               faultsim_state.iCnt = faultsim_state.nSkip;
29240               if( faultsim_state.iErr==0 ) faultsim_state.iErr = 1;
29241               faultsim_state.nHit = 0;
29242               sqlite3_test_control(testctrl, faultsim_callback);
29243             }else if( cli_strcmp(z,"reset")==0 ){
29244               faultsim_state.iCnt = faultsim_state.nSkip;
29245               faultsim_state.nHit = 0;
29246               sqlite3_test_control(testctrl, faultsim_callback);
29247             }else if( cli_strcmp(z,"status")==0 ){
29248               oputf("faultsim.iId:       %d\n", faultsim_state.iId);
29249               oputf("faultsim.iErr:      %d\n", faultsim_state.iErr);
29250               oputf("faultsim.iCnt:      %d\n", faultsim_state.iCnt);
29251               oputf("faultsim.nHit:      %d\n", faultsim_state.nHit);
29252               oputf("faultsim.iInterval: %d\n", faultsim_state.iInterval);
29253               oputf("faultsim.eVerbose:  %d\n", faultsim_state.eVerbose);
29254               oputf("faultsim.nRepeat:   %d\n", faultsim_state.nRepeat);
29255               oputf("faultsim.nSkip:     %d\n", faultsim_state.nSkip);
29256             }else if( cli_strcmp(z,"-v")==0 ){
29257               if( faultsim_state.eVerbose<2 ) faultsim_state.eVerbose++;
29258             }else if( cli_strcmp(z,"-q")==0 ){
29259               if( faultsim_state.eVerbose>0 ) faultsim_state.eVerbose--;
29260             }else if( cli_strcmp(z,"-id")==0 && kk+1<nArg ){
29261               faultsim_state.iId = atoi(azArg[++kk]);
29262             }else if( cli_strcmp(z,"-errcode")==0 && kk+1<nArg ){
29263               faultsim_state.iErr = atoi(azArg[++kk]);
29264             }else if( cli_strcmp(z,"-interval")==0 && kk+1<nArg ){
29265               faultsim_state.iInterval = atoi(azArg[++kk]);
29266             }else if( cli_strcmp(z,"-repeat")==0 && kk+1<nArg ){
29267               faultsim_state.nRepeat = atoi(azArg[++kk]);
29268            }else if( cli_strcmp(z,"-skip")==0 && kk+1<nArg ){
29269               faultsim_state.nSkip = atoi(azArg[++kk]);
29270             }else if( cli_strcmp(z,"-?")==0 || sqlite3_strglob("*help*",z)==0){
29271               bShowHelp = 1;
29272             }else{
29273               eputf("Unrecognized fault_install argument: \"%s\"\n",
29274                   azArg[kk]);
29275               rc = 1;
29276               bShowHelp = 1;
29277               break;
29278             }
29279           }
29280           if( bShowHelp ){
29281             oputz(
29282                "Usage: .testctrl fault_install ARGS\n"
29283                "Possible arguments:\n"
29284                "   off               Disable faultsim\n"
29285                "   on                Activate faultsim\n"
29286                "   reset             Reset the trigger counter\n"
29287                "   status            Show current status\n"
29288                "   -v                Increase verbosity\n"
29289                "   -q                Decrease verbosity\n"
29290                "   --errcode N       When triggered, return N as error code\n"
29291                "   --id ID           Trigger only for the ID specified\n"
29292                "   --interval N      Trigger only after every N-th call\n"
29293                "   --repeat N        Turn off after N hits.  0 means never\n"
29294                "   --skip N          Skip the first N encounters\n"
29295             );
29296           }
29297           break;
29298         }
29299       }
29300     }
29301     if( isOk==0 && iCtrl>=0 ){
29302       oputf("Usage: .testctrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage);
29303       rc = 1;
29304     }else if( isOk==1 ){
29305       oputf("%d\n", rc2);
29306     }else if( isOk==2 ){
29307       oputf("0x%08x\n", rc2);
29308     }
29309   }else
29310 #endif /* !defined(SQLITE_UNTESTABLE) */
29311 
29312   if( c=='t' && n>4 && cli_strncmp(azArg[0], "timeout", n)==0 ){
29313     open_db(p, 0);
29314     sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0);
29315   }else
29316 
29317   if( c=='t' && n>=5 && cli_strncmp(azArg[0], "timer", n)==0 ){
29318     if( nArg==2 ){
29319       enableTimer = booleanValue(azArg[1]);
29320       if( enableTimer && !HAS_TIMER ){
29321         eputz("Error: timer not available on this system.\n");
29322         enableTimer = 0;
29323       }
29324     }else{
29325       eputz("Usage: .timer on|off\n");
29326       rc = 1;
29327     }
29328   }else
29329 
29330 #ifndef SQLITE_OMIT_TRACE
29331   if( c=='t' && cli_strncmp(azArg[0], "trace", n)==0 ){
29332     int mType = 0;
29333     int jj;
29334     open_db(p, 0);
29335     for(jj=1; jj<nArg; jj++){
29336       const char *z = azArg[jj];
29337       if( z[0]=='-' ){
29338         if( optionMatch(z, "expanded") ){
29339           p->eTraceType = SHELL_TRACE_EXPANDED;
29340         }
29341 #ifdef SQLITE_ENABLE_NORMALIZE
29342         else if( optionMatch(z, "normalized") ){
29343           p->eTraceType = SHELL_TRACE_NORMALIZED;
29344         }
29345 #endif
29346         else if( optionMatch(z, "plain") ){
29347           p->eTraceType = SHELL_TRACE_PLAIN;
29348         }
29349         else if( optionMatch(z, "profile") ){
29350           mType |= SQLITE_TRACE_PROFILE;
29351         }
29352         else if( optionMatch(z, "row") ){
29353           mType |= SQLITE_TRACE_ROW;
29354         }
29355         else if( optionMatch(z, "stmt") ){
29356           mType |= SQLITE_TRACE_STMT;
29357         }
29358         else if( optionMatch(z, "close") ){
29359           mType |= SQLITE_TRACE_CLOSE;
29360         }
29361         else {
29362           eputf("Unknown option \"%s\" on \".trace\"\n", z);
29363           rc = 1;
29364           goto meta_command_exit;
29365         }
29366       }else{
29367         output_file_close(p->traceOut);
29368         p->traceOut = output_file_open(z, 0);
29369       }
29370     }
29371     if( p->traceOut==0 ){
29372       sqlite3_trace_v2(p->db, 0, 0, 0);
29373     }else{
29374       if( mType==0 ) mType = SQLITE_TRACE_STMT;
29375       sqlite3_trace_v2(p->db, mType, sql_trace_callback, p);
29376     }
29377   }else
29378 #endif /* !defined(SQLITE_OMIT_TRACE) */
29379 
29380 #if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_VIRTUALTABLE)
29381   if( c=='u' && cli_strncmp(azArg[0], "unmodule", n)==0 ){
29382     int ii;
29383     int lenOpt;
29384     char *zOpt;
29385     if( nArg<2 ){
29386       eputz("Usage: .unmodule [--allexcept] NAME ...\n");
29387       rc = 1;
29388       goto meta_command_exit;
29389     }
29390     open_db(p, 0);
29391     zOpt = azArg[1];
29392     if( zOpt[0]=='-' && zOpt[1]=='-' && zOpt[2]!=0 ) zOpt++;
29393     lenOpt = (int)strlen(zOpt);
29394     if( lenOpt>=3 && cli_strncmp(zOpt, "-allexcept",lenOpt)==0 ){
29395       assert( azArg[nArg]==0 );
29396       sqlite3_drop_modules(p->db, nArg>2 ? (const char**)(azArg+2) : 0);
29397     }else{
29398       for(ii=1; ii<nArg; ii++){
29399         sqlite3_create_module(p->db, azArg[ii], 0, 0);
29400       }
29401     }
29402   }else
29403 #endif
29404 
29405 #if SQLITE_USER_AUTHENTICATION
29406   if( c=='u' && cli_strncmp(azArg[0], "user", n)==0 ){
29407     if( nArg<2 ){
29408       eputz("Usage: .user SUBCOMMAND ...\n");
29409       rc = 1;
29410       goto meta_command_exit;
29411     }
29412     open_db(p, 0);
29413     if( cli_strcmp(azArg[1],"login")==0 ){
29414       if( nArg!=4 ){
29415         eputz("Usage: .user login USER PASSWORD\n");
29416         rc = 1;
29417         goto meta_command_exit;
29418       }
29419       rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3],
29420                                      strlen30(azArg[3]));
29421       if( rc ){
29422         eputf("Authentication failed for user %s\n", azArg[2]);
29423         rc = 1;
29424       }
29425     }else if( cli_strcmp(azArg[1],"add")==0 ){
29426       if( nArg!=5 ){
29427         eputz("Usage: .user add USER PASSWORD ISADMIN\n");
29428         rc = 1;
29429         goto meta_command_exit;
29430       }
29431       rc = sqlite3_user_add(p->db, azArg[2], azArg[3], strlen30(azArg[3]),
29432                             booleanValue(azArg[4]));
29433       if( rc ){
29434         eputf("User-Add failed: %d\n", rc);
29435         rc = 1;
29436       }
29437     }else if( cli_strcmp(azArg[1],"edit")==0 ){
29438       if( nArg!=5 ){
29439         eputz("Usage: .user edit USER PASSWORD ISADMIN\n");
29440         rc = 1;
29441         goto meta_command_exit;
29442       }
29443       rc = sqlite3_user_change(p->db, azArg[2], azArg[3], strlen30(azArg[3]),
29444                               booleanValue(azArg[4]));
29445       if( rc ){
29446         eputf("User-Edit failed: %d\n", rc);
29447         rc = 1;
29448       }
29449     }else if( cli_strcmp(azArg[1],"delete")==0 ){
29450       if( nArg!=3 ){
29451         eputz("Usage: .user delete USER\n");
29452         rc = 1;
29453         goto meta_command_exit;
29454       }
29455       rc = sqlite3_user_delete(p->db, azArg[2]);
29456       if( rc ){
29457         eputf("User-Delete failed: %d\n", rc);
29458         rc = 1;
29459       }
29460     }else{
29461       eputz("Usage: .user login|add|edit|delete ...\n");
29462       rc = 1;
29463       goto meta_command_exit;
29464     }
29465   }else
29466 #endif /* SQLITE_USER_AUTHENTICATION */
29467 
29468   if( c=='v' && cli_strncmp(azArg[0], "version", n)==0 ){
29469     char *zPtrSz = sizeof(void*)==8 ? "64-bit" : "32-bit";
29470     oputf("SQLite %s %s\n" /*extra-version-info*/,
29471           sqlite3_libversion(), sqlite3_sourceid());
29472 #if SQLITE_HAVE_ZLIB
29473     oputf("zlib version %s\n", zlibVersion());
29474 #endif
29475 #define CTIMEOPT_VAL_(opt) #opt
29476 #define CTIMEOPT_VAL(opt) CTIMEOPT_VAL_(opt)
29477 #if defined(__clang__) && defined(__clang_major__)
29478     oputf("clang-" CTIMEOPT_VAL(__clang_major__) "."
29479           CTIMEOPT_VAL(__clang_minor__) "."
29480           CTIMEOPT_VAL(__clang_patchlevel__) " (%s)\n", zPtrSz);
29481 #elif defined(_MSC_VER)
29482     oputf("msvc-" CTIMEOPT_VAL(_MSC_VER) " (%s)\n", zPtrSz);
29483 #elif defined(__GNUC__) && defined(__VERSION__)
29484     oputf("gcc-" __VERSION__ " (%s)\n", zPtrSz);
29485 #endif
29486   }else
29487 
29488   if( c=='v' && cli_strncmp(azArg[0], "vfsinfo", n)==0 ){
29489     const char *zDbName = nArg==2 ? azArg[1] : "main";
29490     sqlite3_vfs *pVfs = 0;
29491     if( p->db ){
29492       sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFS_POINTER, &pVfs);
29493       if( pVfs ){
29494         oputf("vfs.zName      = \"%s\"\n", pVfs->zName);
29495         oputf("vfs.iVersion   = %d\n", pVfs->iVersion);
29496         oputf("vfs.szOsFile   = %d\n", pVfs->szOsFile);
29497         oputf("vfs.mxPathname = %d\n", pVfs->mxPathname);
29498       }
29499     }
29500   }else
29501 
29502   if( c=='v' && cli_strncmp(azArg[0], "vfslist", n)==0 ){
29503     sqlite3_vfs *pVfs;
29504     sqlite3_vfs *pCurrent = 0;
29505     if( p->db ){
29506       sqlite3_file_control(p->db, "main", SQLITE_FCNTL_VFS_POINTER, &pCurrent);
29507     }
29508     for(pVfs=sqlite3_vfs_find(0); pVfs; pVfs=pVfs->pNext){
29509       oputf("vfs.zName      = \"%s\"%s\n", pVfs->zName,
29510             pVfs==pCurrent ? "  <--- CURRENT" : "");
29511       oputf("vfs.iVersion   = %d\n", pVfs->iVersion);
29512       oputf("vfs.szOsFile   = %d\n", pVfs->szOsFile);
29513       oputf("vfs.mxPathname = %d\n", pVfs->mxPathname);
29514       if( pVfs->pNext ){
29515         oputz("-----------------------------------\n");
29516       }
29517     }
29518   }else
29519 
29520   if( c=='v' && cli_strncmp(azArg[0], "vfsname", n)==0 ){
29521     const char *zDbName = nArg==2 ? azArg[1] : "main";
29522     char *zVfsName = 0;
29523     if( p->db ){
29524       sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
29525       if( zVfsName ){
29526         oputf("%s\n", zVfsName);
29527         sqlite3_free(zVfsName);
29528       }
29529     }
29530   }else
29531 
29532   if( c=='w' && cli_strncmp(azArg[0], "wheretrace", n)==0 ){
29533     unsigned int x = nArg>=2? (unsigned int)integerValue(azArg[1]) : 0xffffffff;
29534     sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &x);
29535   }else
29536 
29537   if( c=='w' && cli_strncmp(azArg[0], "width", n)==0 ){
29538     int j;
29539     assert( nArg<=ArraySize(azArg) );
29540     p->nWidth = nArg-1;
29541     p->colWidth = realloc(p->colWidth, (p->nWidth+1)*sizeof(int)*2);
29542     if( p->colWidth==0 && p->nWidth>0 ) shell_out_of_memory();
29543     if( p->nWidth ) p->actualWidth = &p->colWidth[p->nWidth];
29544     for(j=1; j<nArg; j++){
29545       p->colWidth[j-1] = (int)integerValue(azArg[j]);
29546     }
29547   }else
29548 
29549   {
29550     eputf("Error: unknown command or invalid arguments: "
29551           " \"%s\". Enter \".help\" for help\n", azArg[0]);
29552     rc = 1;
29553   }
29554 
29555 meta_command_exit:
29556   if( p->outCount ){
29557     p->outCount--;
29558     if( p->outCount==0 ) output_reset(p);
29559   }
29560   p->bSafeMode = p->bSafeModePersist;
29561   return rc;
29562 }
29563 
29564 /* Line scan result and intermediate states (supporting scan resumption)
29565 */
29566 #ifndef CHAR_BIT
29567 # define CHAR_BIT 8
29568 #endif
29569 typedef enum {
29570   QSS_HasDark = 1<<CHAR_BIT, QSS_EndingSemi = 2<<CHAR_BIT,
29571   QSS_CharMask = (1<<CHAR_BIT)-1, QSS_ScanMask = 3<<CHAR_BIT,
29572   QSS_Start = 0
29573 } QuickScanState;
29574 #define QSS_SETV(qss, newst) ((newst) | ((qss) & QSS_ScanMask))
29575 #define QSS_INPLAIN(qss) (((qss)&QSS_CharMask)==QSS_Start)
29576 #define QSS_PLAINWHITE(qss) (((qss)&~QSS_EndingSemi)==QSS_Start)
29577 #define QSS_PLAINDARK(qss) (((qss)&~QSS_EndingSemi)==QSS_HasDark)
29578 #define QSS_SEMITERM(qss) (((qss)&~QSS_HasDark)==QSS_EndingSemi)
29579 
29580 /*
29581 ** Scan line for classification to guide shell's handling.
29582 ** The scan is resumable for subsequent lines when prior
29583 ** return values are passed as the 2nd argument.
29584 */
quickscan(char * zLine,QuickScanState qss,SCAN_TRACKER_REFTYPE pst)29585 static QuickScanState quickscan(char *zLine, QuickScanState qss,
29586                                 SCAN_TRACKER_REFTYPE pst){
29587   char cin;
29588   char cWait = (char)qss; /* intentional narrowing loss */
29589   if( cWait==0 ){
29590   PlainScan:
29591     assert( cWait==0 );
29592     while( (cin = *zLine++)!=0 ){
29593       if( IsSpace(cin) )
29594         continue;
29595       switch (cin){
29596       case '-':
29597         if( *zLine!='-' )
29598           break;
29599         while((cin = *++zLine)!=0 )
29600           if( cin=='\n')
29601             goto PlainScan;
29602         return qss;
29603       case ';':
29604         qss |= QSS_EndingSemi;
29605         continue;
29606       case '/':
29607         if( *zLine=='*' ){
29608           ++zLine;
29609           cWait = '*';
29610           CONTINUE_PROMPT_AWAITS(pst, "/*");
29611           qss = QSS_SETV(qss, cWait);
29612           goto TermScan;
29613         }
29614         break;
29615       case '[':
29616         cin = ']';
29617         deliberate_fall_through;
29618       case '`': case '\'': case '"':
29619         cWait = cin;
29620         qss = QSS_HasDark | cWait;
29621         CONTINUE_PROMPT_AWAITC(pst, cin);
29622         goto TermScan;
29623       case '(':
29624         CONTINUE_PAREN_INCR(pst, 1);
29625         break;
29626       case ')':
29627         CONTINUE_PAREN_INCR(pst, -1);
29628         break;
29629       default:
29630         break;
29631       }
29632       qss = (qss & ~QSS_EndingSemi) | QSS_HasDark;
29633     }
29634   }else{
29635   TermScan:
29636     while( (cin = *zLine++)!=0 ){
29637       if( cin==cWait ){
29638         switch( cWait ){
29639         case '*':
29640           if( *zLine != '/' )
29641             continue;
29642           ++zLine;
29643           cWait = 0;
29644           CONTINUE_PROMPT_AWAITC(pst, 0);
29645           qss = QSS_SETV(qss, 0);
29646           goto PlainScan;
29647         case '`': case '\'': case '"':
29648           if(*zLine==cWait){
29649             /* Swallow doubled end-delimiter.*/
29650             ++zLine;
29651             continue;
29652           }
29653           deliberate_fall_through;
29654         case ']':
29655           cWait = 0;
29656           CONTINUE_PROMPT_AWAITC(pst, 0);
29657           qss = QSS_SETV(qss, 0);
29658           goto PlainScan;
29659         default: assert(0);
29660         }
29661       }
29662     }
29663   }
29664   return qss;
29665 }
29666 
29667 /*
29668 ** Return TRUE if the line typed in is an SQL command terminator other
29669 ** than a semi-colon.  The SQL Server style "go" command is understood
29670 ** as is the Oracle "/".
29671 */
line_is_command_terminator(char * zLine)29672 static int line_is_command_terminator(char *zLine){
29673   while( IsSpace(zLine[0]) ){ zLine++; };
29674   if( zLine[0]=='/' )
29675     zLine += 1; /* Oracle */
29676   else if ( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o' )
29677     zLine += 2; /* SQL Server */
29678   else
29679     return 0;
29680   return quickscan(zLine, QSS_Start, 0)==QSS_Start;
29681 }
29682 
29683 /*
29684 ** The CLI needs a working sqlite3_complete() to work properly.  So error
29685 ** out of the build if compiling with SQLITE_OMIT_COMPLETE.
29686 */
29687 #ifdef SQLITE_OMIT_COMPLETE
29688 # error the CLI application is imcompatable with SQLITE_OMIT_COMPLETE.
29689 #endif
29690 
29691 /*
29692 ** Return true if zSql is a complete SQL statement.  Return false if it
29693 ** ends in the middle of a string literal or C-style comment.
29694 */
line_is_complete(char * zSql,int nSql)29695 static int line_is_complete(char *zSql, int nSql){
29696   int rc;
29697   if( zSql==0 ) return 1;
29698   zSql[nSql] = ';';
29699   zSql[nSql+1] = 0;
29700   rc = sqlite3_complete(zSql);
29701   zSql[nSql] = 0;
29702   return rc;
29703 }
29704 
29705 /*
29706 ** This function is called after processing each line of SQL in the
29707 ** runOneSqlLine() function. Its purpose is to detect scenarios where
29708 ** defensive mode should be automatically turned off. Specifically, when
29709 **
29710 **   1. The first line of input is "PRAGMA foreign_keys=OFF;",
29711 **   2. The second line of input is "BEGIN TRANSACTION;",
29712 **   3. The database is empty, and
29713 **   4. The shell is not running in --safe mode.
29714 **
29715 ** The implementation uses the ShellState.eRestoreState to maintain state:
29716 **
29717 **    0: Have not seen any SQL.
29718 **    1: Have seen "PRAGMA foreign_keys=OFF;".
29719 **    2-6: Currently running .dump transaction. If the "2" bit is set,
29720 **         disable DEFENSIVE when done. If "4" is set, disable DQS_DDL.
29721 **    7: Nothing left to do. This function becomes a no-op.
29722 */
doAutoDetectRestore(ShellState * p,const char * zSql)29723 static int doAutoDetectRestore(ShellState *p, const char *zSql){
29724   int rc = SQLITE_OK;
29725 
29726   if( p->eRestoreState<7 ){
29727     switch( p->eRestoreState ){
29728       case 0: {
29729         const char *zExpect = "PRAGMA foreign_keys=OFF;";
29730         assert( strlen(zExpect)==24 );
29731         if( p->bSafeMode==0 && memcmp(zSql, zExpect, 25)==0 ){
29732           p->eRestoreState = 1;
29733         }else{
29734           p->eRestoreState = 7;
29735         }
29736         break;
29737       };
29738 
29739       case 1: {
29740         int bIsDump = 0;
29741         const char *zExpect = "BEGIN TRANSACTION;";
29742         assert( strlen(zExpect)==18 );
29743         if( memcmp(zSql, zExpect, 19)==0 ){
29744           /* Now check if the database is empty. */
29745           const char *zQuery = "SELECT 1 FROM sqlite_schema LIMIT 1";
29746           sqlite3_stmt *pStmt = 0;
29747 
29748           bIsDump = 1;
29749           shellPrepare(p->db, &rc, zQuery, &pStmt);
29750           if( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
29751             bIsDump = 0;
29752           }
29753           shellFinalize(&rc, pStmt);
29754         }
29755         if( bIsDump && rc==SQLITE_OK ){
29756           int bDefense = 0;
29757           int bDqsDdl = 0;
29758           sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, -1, &bDefense);
29759           sqlite3_db_config(p->db, SQLITE_DBCONFIG_DQS_DDL, -1, &bDqsDdl);
29760           sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, 0, 0);
29761           sqlite3_db_config(p->db, SQLITE_DBCONFIG_DQS_DDL, 1, 0);
29762           p->eRestoreState = (bDefense ? 2 : 0) + (bDqsDdl ? 4 : 0);
29763         }else{
29764           p->eRestoreState = 7;
29765         }
29766         break;
29767       }
29768 
29769       default: {
29770         if( sqlite3_get_autocommit(p->db) ){
29771           if( (p->eRestoreState & 2) ){
29772             sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, 1, 0);
29773           }
29774           if( (p->eRestoreState & 4) ){
29775             sqlite3_db_config(p->db, SQLITE_DBCONFIG_DQS_DDL, 0, 0);
29776           }
29777           p->eRestoreState = 7;
29778         }
29779         break;
29780       }
29781     }
29782   }
29783 
29784   return rc;
29785 }
29786 
29787 /*
29788 ** Run a single line of SQL.  Return the number of errors.
29789 */
runOneSqlLine(ShellState * p,char * zSql,FILE * in,int startline)29790 static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){
29791   int rc;
29792   char *zErrMsg = 0;
29793 
29794   open_db(p, 0);
29795   if( ShellHasFlag(p,SHFLG_Backslash) ) resolve_backslashes(zSql);
29796   if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0;
29797   BEGIN_TIMER;
29798   rc = shell_exec(p, zSql, &zErrMsg);
29799   END_TIMER;
29800   if( rc || zErrMsg ){
29801     char zPrefix[100];
29802     const char *zErrorTail;
29803     const char *zErrorType;
29804     if( zErrMsg==0 ){
29805       zErrorType = "Error";
29806       zErrorTail = sqlite3_errmsg(p->db);
29807     }else if( cli_strncmp(zErrMsg, "in prepare, ",12)==0 ){
29808       zErrorType = "Parse error";
29809       zErrorTail = &zErrMsg[12];
29810     }else if( cli_strncmp(zErrMsg, "stepping, ", 10)==0 ){
29811       zErrorType = "Runtime error";
29812       zErrorTail = &zErrMsg[10];
29813     }else{
29814       zErrorType = "Error";
29815       zErrorTail = zErrMsg;
29816     }
29817     if( in!=0 || !stdin_is_interactive ){
29818       sqlite3_snprintf(sizeof(zPrefix), zPrefix,
29819                        "%s near line %d:", zErrorType, startline);
29820     }else{
29821       sqlite3_snprintf(sizeof(zPrefix), zPrefix, "%s:", zErrorType);
29822     }
29823     eputf("%s %s\n", zPrefix, zErrorTail);
29824     sqlite3_free(zErrMsg);
29825     zErrMsg = 0;
29826     return 1;
29827   }else if( ShellHasFlag(p, SHFLG_CountChanges) ){
29828     char zLineBuf[2000];
29829     sqlite3_snprintf(sizeof(zLineBuf), zLineBuf,
29830             "changes: %lld   total_changes: %lld",
29831             sqlite3_changes64(p->db), sqlite3_total_changes64(p->db));
29832     oputf("%s\n", zLineBuf);
29833   }
29834 
29835   if( doAutoDetectRestore(p, zSql) ) return 1;
29836   return 0;
29837 }
29838 
echo_group_input(ShellState * p,const char * zDo)29839 static void echo_group_input(ShellState *p, const char *zDo){
29840   if( ShellHasFlag(p, SHFLG_Echo) ) oputf("%s\n", zDo);
29841 }
29842 
29843 #ifdef SQLITE_SHELL_FIDDLE
29844 /*
29845 ** Alternate one_input_line() impl for wasm mode. This is not in the primary
29846 ** impl because we need the global shellState and cannot access it from that
29847 ** function without moving lots of code around (creating a larger/messier diff).
29848 */
one_input_line(FILE * in,char * zPrior,int isContinuation)29849 static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
29850   /* Parse the next line from shellState.wasm.zInput. */
29851   const char *zBegin = shellState.wasm.zPos;
29852   const char *z = zBegin;
29853   char *zLine = 0;
29854   i64 nZ = 0;
29855 
29856   UNUSED_PARAMETER(in);
29857   UNUSED_PARAMETER(isContinuation);
29858   if(!z || !*z){
29859     return 0;
29860   }
29861   while(*z && isspace(*z)) ++z;
29862   zBegin = z;
29863   for(; *z && '\n'!=*z; ++nZ, ++z){}
29864   if(nZ>0 && '\r'==zBegin[nZ-1]){
29865     --nZ;
29866   }
29867   shellState.wasm.zPos = z;
29868   zLine = realloc(zPrior, nZ+1);
29869   shell_check_oom(zLine);
29870   memcpy(zLine, zBegin, nZ);
29871   zLine[nZ] = 0;
29872   return zLine;
29873 }
29874 #endif /* SQLITE_SHELL_FIDDLE */
29875 
29876 /*
29877 ** Read input from *in and process it.  If *in==0 then input
29878 ** is interactive - the user is typing it it.  Otherwise, input
29879 ** is coming from a file or device.  A prompt is issued and history
29880 ** is saved only if input is interactive.  An interrupt signal will
29881 ** cause this routine to exit immediately, unless input is interactive.
29882 **
29883 ** Return the number of errors.
29884 */
process_input(ShellState * p)29885 static int process_input(ShellState *p){
29886   char *zLine = 0;          /* A single input line */
29887   char *zSql = 0;           /* Accumulated SQL text */
29888   i64 nLine;                /* Length of current line */
29889   i64 nSql = 0;             /* Bytes of zSql[] used */
29890   i64 nAlloc = 0;           /* Allocated zSql[] space */
29891   int rc;                   /* Error code */
29892   int errCnt = 0;           /* Number of errors seen */
29893   i64 startline = 0;        /* Line number for start of current input */
29894   QuickScanState qss = QSS_Start; /* Accumulated line status (so far) */
29895 
29896   if( p->inputNesting==MAX_INPUT_NESTING ){
29897     /* This will be more informative in a later version. */
29898     eputf("Input nesting limit (%d) reached at line %d."
29899           " Check recursion.\n", MAX_INPUT_NESTING, p->lineno);
29900     return 1;
29901   }
29902   ++p->inputNesting;
29903   p->lineno = 0;
29904   CONTINUE_PROMPT_RESET;
29905   while( errCnt==0 || !bail_on_error || (p->in==0 && stdin_is_interactive) ){
29906     fflush(p->out);
29907     zLine = one_input_line(p->in, zLine, nSql>0);
29908     if( zLine==0 ){
29909       /* End of input */
29910       if( p->in==0 && stdin_is_interactive ) oputz("\n");
29911       break;
29912     }
29913     if( seenInterrupt ){
29914       if( p->in!=0 ) break;
29915       seenInterrupt = 0;
29916     }
29917     p->lineno++;
29918     if( QSS_INPLAIN(qss)
29919         && line_is_command_terminator(zLine)
29920         && line_is_complete(zSql, nSql) ){
29921       memcpy(zLine,";",2);
29922     }
29923     qss = quickscan(zLine, qss, CONTINUE_PROMPT_PSTATE);
29924     if( QSS_PLAINWHITE(qss) && nSql==0 ){
29925       /* Just swallow single-line whitespace */
29926       echo_group_input(p, zLine);
29927       qss = QSS_Start;
29928       continue;
29929     }
29930     if( zLine && (zLine[0]=='.' || zLine[0]=='#') && nSql==0 ){
29931       CONTINUE_PROMPT_RESET;
29932       echo_group_input(p, zLine);
29933       if( zLine[0]=='.' ){
29934         rc = do_meta_command(zLine, p);
29935         if( rc==2 ){ /* exit requested */
29936           break;
29937         }else if( rc ){
29938           errCnt++;
29939         }
29940       }
29941       qss = QSS_Start;
29942       continue;
29943     }
29944     /* No single-line dispositions remain; accumulate line(s). */
29945     nLine = strlen(zLine);
29946     if( nSql+nLine+2>=nAlloc ){
29947       /* Grow buffer by half-again increments when big. */
29948       nAlloc = nSql+(nSql>>1)+nLine+100;
29949       zSql = realloc(zSql, nAlloc);
29950       shell_check_oom(zSql);
29951     }
29952     if( nSql==0 ){
29953       i64 i;
29954       for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
29955       assert( nAlloc>0 && zSql!=0 );
29956       memcpy(zSql, zLine+i, nLine+1-i);
29957       startline = p->lineno;
29958       nSql = nLine-i;
29959     }else{
29960       zSql[nSql++] = '\n';
29961       memcpy(zSql+nSql, zLine, nLine+1);
29962       nSql += nLine;
29963     }
29964     if( nSql && QSS_SEMITERM(qss) && sqlite3_complete(zSql) ){
29965       echo_group_input(p, zSql);
29966       errCnt += runOneSqlLine(p, zSql, p->in, startline);
29967       CONTINUE_PROMPT_RESET;
29968       nSql = 0;
29969       if( p->outCount ){
29970         output_reset(p);
29971         p->outCount = 0;
29972       }else{
29973         clearTempFile(p);
29974       }
29975       p->bSafeMode = p->bSafeModePersist;
29976       qss = QSS_Start;
29977     }else if( nSql && QSS_PLAINWHITE(qss) ){
29978       echo_group_input(p, zSql);
29979       nSql = 0;
29980       qss = QSS_Start;
29981     }
29982   }
29983   if( nSql ){
29984     /* This may be incomplete. Let the SQL parser deal with that. */
29985     echo_group_input(p, zSql);
29986     errCnt += runOneSqlLine(p, zSql, p->in, startline);
29987     CONTINUE_PROMPT_RESET;
29988   }
29989   free(zSql);
29990   free(zLine);
29991   --p->inputNesting;
29992   return errCnt>0;
29993 }
29994 
29995 /*
29996 ** Return a pathname which is the user's home directory.  A
29997 ** 0 return indicates an error of some kind.
29998 */
find_home_dir(int clearFlag)29999 static char *find_home_dir(int clearFlag){
30000   static char *home_dir = NULL;
30001   if( clearFlag ){
30002     free(home_dir);
30003     home_dir = 0;
30004     return 0;
30005   }
30006   if( home_dir ) return home_dir;
30007 
30008 #if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) \
30009      && !defined(__RTP__) && !defined(_WRS_KERNEL) && !defined(SQLITE_WASI)
30010   {
30011     struct passwd *pwent;
30012     uid_t uid = getuid();
30013     if( (pwent=getpwuid(uid)) != NULL) {
30014       home_dir = pwent->pw_dir;
30015     }
30016   }
30017 #endif
30018 
30019 #if defined(_WIN32_WCE)
30020   /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
30021    */
30022   home_dir = "/";
30023 #else
30024 
30025 #if defined(_WIN32) || defined(WIN32)
30026   if (!home_dir) {
30027     home_dir = getenv("USERPROFILE");
30028   }
30029 #endif
30030 
30031   if (!home_dir) {
30032     home_dir = getenv("HOME");
30033   }
30034 
30035 #if defined(_WIN32) || defined(WIN32)
30036   if (!home_dir) {
30037     char *zDrive, *zPath;
30038     int n;
30039     zDrive = getenv("HOMEDRIVE");
30040     zPath = getenv("HOMEPATH");
30041     if( zDrive && zPath ){
30042       n = strlen30(zDrive) + strlen30(zPath) + 1;
30043       home_dir = malloc( n );
30044       if( home_dir==0 ) return 0;
30045       sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
30046       return home_dir;
30047     }
30048     home_dir = "c:\\";
30049   }
30050 #endif
30051 
30052 #endif /* !_WIN32_WCE */
30053 
30054   if( home_dir ){
30055     i64 n = strlen(home_dir) + 1;
30056     char *z = malloc( n );
30057     if( z ) memcpy(z, home_dir, n);
30058     home_dir = z;
30059   }
30060 
30061   return home_dir;
30062 }
30063 
30064 /*
30065 ** On non-Windows platforms, look for $XDG_CONFIG_HOME.
30066 ** If ${XDG_CONFIG_HOME}/sqlite3/sqliterc is found, return
30067 ** the path to it, else return 0. The result is cached for
30068 ** subsequent calls.
30069 */
find_xdg_config(void)30070 static const char *find_xdg_config(void){
30071 #if defined(_WIN32) || defined(WIN32) || defined(_WIN32_WCE) \
30072      || defined(__RTP__) || defined(_WRS_KERNEL)
30073   return 0;
30074 #else
30075   static int alreadyTried = 0;
30076   static char *zConfig = 0;
30077   const char *zXdgHome;
30078 
30079   if( alreadyTried!=0 ){
30080     return zConfig;
30081   }
30082   alreadyTried = 1;
30083   zXdgHome = getenv("XDG_CONFIG_HOME");
30084   if( zXdgHome==0 ){
30085     return 0;
30086   }
30087   zConfig = sqlite3_mprintf("%s/sqlite3/sqliterc", zXdgHome);
30088   shell_check_oom(zConfig);
30089   if( access(zConfig,0)!=0 ){
30090     sqlite3_free(zConfig);
30091     zConfig = 0;
30092   }
30093   return zConfig;
30094 #endif
30095 }
30096 
30097 /*
30098 ** Read input from the file given by sqliterc_override.  Or if that
30099 ** parameter is NULL, take input from the first of find_xdg_config()
30100 ** or ~/.sqliterc which is found.
30101 **
30102 ** Returns the number of errors.
30103 */
process_sqliterc(ShellState * p,const char * sqliterc_override)30104 static void process_sqliterc(
30105   ShellState *p,                  /* Configuration data */
30106   const char *sqliterc_override   /* Name of config file. NULL to use default */
30107 ){
30108   char *home_dir = NULL;
30109   const char *sqliterc = sqliterc_override;
30110   char *zBuf = 0;
30111   FILE *inSaved = p->in;
30112   int savedLineno = p->lineno;
30113 
30114   if( sqliterc == NULL ){
30115     sqliterc = find_xdg_config();
30116   }
30117   if( sqliterc == NULL ){
30118     home_dir = find_home_dir(0);
30119     if( home_dir==0 ){
30120       eputz("-- warning: cannot find home directory;"
30121             " cannot read ~/.sqliterc\n");
30122       return;
30123     }
30124     zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
30125     shell_check_oom(zBuf);
30126     sqliterc = zBuf;
30127   }
30128   p->in = fopen(sqliterc,"rb");
30129   if( p->in ){
30130     if( stdin_is_interactive ){
30131       eputf("-- Loading resources from %s\n", sqliterc);
30132     }
30133     if( process_input(p) && bail_on_error ) exit(1);
30134     fclose(p->in);
30135   }else if( sqliterc_override!=0 ){
30136     eputf("cannot open: \"%s\"\n", sqliterc);
30137     if( bail_on_error ) exit(1);
30138   }
30139   p->in = inSaved;
30140   p->lineno = savedLineno;
30141   sqlite3_free(zBuf);
30142 }
30143 
30144 /*
30145 ** Show available command line options
30146 */
30147 static const char zOptions[] =
30148   "   --                   treat no subsequent arguments as options\n"
30149 #if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE)
30150   "   -A ARGS...           run \".archive ARGS\" and exit\n"
30151 #endif
30152   "   -append              append the database to the end of the file\n"
30153   "   -ascii               set output mode to 'ascii'\n"
30154   "   -bail                stop after hitting an error\n"
30155   "   -batch               force batch I/O\n"
30156   "   -box                 set output mode to 'box'\n"
30157   "   -column              set output mode to 'column'\n"
30158   "   -cmd COMMAND         run \"COMMAND\" before reading stdin\n"
30159   "   -csv                 set output mode to 'csv'\n"
30160 #if !defined(SQLITE_OMIT_DESERIALIZE)
30161   "   -deserialize         open the database using sqlite3_deserialize()\n"
30162 #endif
30163   "   -echo                print inputs before execution\n"
30164   "   -init FILENAME       read/process named file\n"
30165   "   -[no]header          turn headers on or off\n"
30166 #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
30167   "   -heap SIZE           Size of heap for memsys3 or memsys5\n"
30168 #endif
30169   "   -help                show this message\n"
30170   "   -html                set output mode to HTML\n"
30171   "   -interactive         force interactive I/O\n"
30172   "   -json                set output mode to 'json'\n"
30173   "   -line                set output mode to 'line'\n"
30174   "   -list                set output mode to 'list'\n"
30175   "   -lookaside SIZE N    use N entries of SZ bytes for lookaside memory\n"
30176   "   -markdown            set output mode to 'markdown'\n"
30177 #if !defined(SQLITE_OMIT_DESERIALIZE)
30178   "   -maxsize N           maximum size for a --deserialize database\n"
30179 #endif
30180   "   -memtrace            trace all memory allocations and deallocations\n"
30181   "   -mmap N              default mmap size set to N\n"
30182 #ifdef SQLITE_ENABLE_MULTIPLEX
30183   "   -multiplex           enable the multiplexor VFS\n"
30184 #endif
30185   "   -newline SEP         set output row separator. Default: '\\n'\n"
30186   "   -nofollow            refuse to open symbolic links to database files\n"
30187   "   -nonce STRING        set the safe-mode escape nonce\n"
30188   "   -no-rowid-in-view    Disable rowid-in-view using sqlite3_config()\n"
30189   "   -nullvalue TEXT      set text string for NULL values. Default ''\n"
30190   "   -pagecache SIZE N    use N slots of SZ bytes each for page cache memory\n"
30191   "   -pcachetrace         trace all page cache operations\n"
30192   "   -quote               set output mode to 'quote'\n"
30193   "   -readonly            open the database read-only\n"
30194   "   -safe                enable safe-mode\n"
30195   "   -separator SEP       set output column separator. Default: '|'\n"
30196 #ifdef SQLITE_ENABLE_SORTER_REFERENCES
30197   "   -sorterref SIZE      sorter references threshold size\n"
30198 #endif
30199   "   -stats               print memory stats before each finalize\n"
30200   "   -table               set output mode to 'table'\n"
30201   "   -tabs                set output mode to 'tabs'\n"
30202   "   -unsafe-testing      allow unsafe commands and modes for testing\n"
30203   "   -version             show SQLite version\n"
30204   "   -vfs NAME            use NAME as the default VFS\n"
30205 #ifdef SQLITE_ENABLE_VFSTRACE
30206   "   -vfstrace            enable tracing of all VFS calls\n"
30207 #endif
30208 #ifdef SQLITE_HAVE_ZLIB
30209   "   -zip                 open the file as a ZIP Archive\n"
30210 #endif
30211 ;
usage(int showDetail)30212 static void usage(int showDetail){
30213   eputf("Usage: %s [OPTIONS] [FILENAME [SQL]]\n"
30214        "FILENAME is the name of an SQLite database. A new database is created\n"
30215        "if the file does not previously exist. Defaults to :memory:.\n", Argv0);
30216   if( showDetail ){
30217     eputf("OPTIONS include:\n%s", zOptions);
30218   }else{
30219     eputz("Use the -help option for additional information\n");
30220   }
30221   exit(0);
30222 }
30223 
30224 /*
30225 ** Internal check:  Verify that the SQLite is uninitialized.  Print a
30226 ** error message if it is initialized.
30227 */
verify_uninitialized(void)30228 static void verify_uninitialized(void){
30229   if( sqlite3_config(-1)==SQLITE_MISUSE ){
30230     sputz(stdout, "WARNING: attempt to configure SQLite after"
30231           " initialization.\n");
30232   }
30233 }
30234 
30235 /*
30236 ** Initialize the state information in data
30237 */
main_init(ShellState * data)30238 static void main_init(ShellState *data) {
30239   memset(data, 0, sizeof(*data));
30240   data->normalMode = data->cMode = data->mode = MODE_List;
30241   data->autoExplain = 1;
30242   data->pAuxDb = &data->aAuxDb[0];
30243   memcpy(data->colSeparator,SEP_Column, 2);
30244   memcpy(data->rowSeparator,SEP_Row, 2);
30245   data->showHeader = 0;
30246   data->shellFlgs = SHFLG_Lookaside;
30247   sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
30248 #if !defined(SQLITE_SHELL_FIDDLE)
30249   verify_uninitialized();
30250 #endif
30251   sqlite3_config(SQLITE_CONFIG_URI, 1);
30252   sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
30253   sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
30254   sqlite3_snprintf(sizeof(continuePrompt), continuePrompt,"   ...> ");
30255 }
30256 
30257 /*
30258 ** Output text to the console in a font that attracts extra attention.
30259 */
30260 #if defined(_WIN32) || defined(WIN32)
printBold(const char * zText)30261 static void printBold(const char *zText){
30262 #if !SQLITE_OS_WINRT
30263   HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
30264   CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
30265   GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
30266   SetConsoleTextAttribute(out,
30267          FOREGROUND_RED|FOREGROUND_INTENSITY
30268   );
30269 #endif
30270   sputz(stdout, zText);
30271 #if !SQLITE_OS_WINRT
30272   SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
30273 #endif
30274 }
30275 #else
printBold(const char * zText)30276 static void printBold(const char *zText){
30277   sputf(stdout, "\033[1m%s\033[0m", zText);
30278 }
30279 #endif
30280 
30281 /*
30282 ** Get the argument to an --option.  Throw an error and die if no argument
30283 ** is available.
30284 */
cmdline_option_value(int argc,char ** argv,int i)30285 static char *cmdline_option_value(int argc, char **argv, int i){
30286   if( i==argc ){
30287     eputf("%s: Error: missing argument to %s\n", argv[0], argv[argc-1]);
30288     exit(1);
30289   }
30290   return argv[i];
30291 }
30292 
sayAbnormalExit(void)30293 static void sayAbnormalExit(void){
30294   if( seenInterrupt ) eputz("Program interrupted.\n");
30295 }
30296 
30297 #ifndef SQLITE_SHELL_IS_UTF8
30298 #  if (defined(_WIN32) || defined(WIN32)) \
30299    && (defined(_MSC_VER) || (defined(UNICODE) && defined(__GNUC__)))
30300 #    define SQLITE_SHELL_IS_UTF8          (0)
30301 #  else
30302 #    define SQLITE_SHELL_IS_UTF8          (1)
30303 #  endif
30304 #endif
30305 
30306 #ifdef SQLITE_SHELL_FIDDLE
30307 #  define main fiddle_main
30308 #endif
30309 
30310 #if SQLITE_SHELL_IS_UTF8
main(int argc,char ** argv)30311 int SQLITE_CDECL main(int argc, char **argv){
30312 #else
30313 int SQLITE_CDECL wmain(int argc, wchar_t **wargv){
30314   char **argv;
30315 #endif
30316 #ifdef SQLITE_DEBUG
30317   sqlite3_int64 mem_main_enter = 0;
30318 #endif
30319   char *zErrMsg = 0;
30320 #ifdef SQLITE_SHELL_FIDDLE
30321 #  define data shellState
30322 #else
30323   ShellState data;
30324   StreamsAreConsole consStreams = SAC_NoConsole;
30325 #endif
30326   const char *zInitFile = 0;
30327   int i;
30328   int rc = 0;
30329   int warnInmemoryDb = 0;
30330   int readStdin = 1;
30331   int nCmd = 0;
30332   int nOptsEnd = argc;
30333   char **azCmd = 0;
30334   const char *zVfs = 0;           /* Value of -vfs command-line option */
30335 #if !SQLITE_SHELL_IS_UTF8
30336   char **argvToFree = 0;
30337   int argcToFree = 0;
30338 #endif
30339   setvbuf(stderr, 0, _IONBF, 0); /* Make sure stderr is unbuffered */
30340 
30341 #ifdef SQLITE_SHELL_FIDDLE
30342   stdin_is_interactive = 0;
30343   stdout_is_console = 1;
30344   data.wasm.zDefaultDbName = "/fiddle.sqlite3";
30345 #else
30346   consStreams = consoleClassifySetup(stdin, stdout, stderr);
30347   stdin_is_interactive = (consStreams & SAC_InConsole)!=0;
30348   stdout_is_console = (consStreams & SAC_OutConsole)!=0;
30349   atexit(consoleRestore);
30350 #endif
30351   atexit(sayAbnormalExit);
30352 #ifdef SQLITE_DEBUG
30353   mem_main_enter = sqlite3_memory_used();
30354 #endif
30355 #if !defined(_WIN32_WCE)
30356   if( getenv("SQLITE_DEBUG_BREAK") ){
30357     if( isatty(0) && isatty(2) ){
30358       eputf("attach debugger to process %d and press any key to continue.\n",
30359             GETPID());
30360       fgetc(stdin);
30361     }else{
30362 #if defined(_WIN32) || defined(WIN32)
30363 #if SQLITE_OS_WINRT
30364       __debugbreak();
30365 #else
30366       DebugBreak();
30367 #endif
30368 #elif defined(SIGTRAP)
30369       raise(SIGTRAP);
30370 #endif
30371     }
30372   }
30373 #endif
30374   /* Register a valid signal handler early, before much else is done. */
30375 #ifdef SIGINT
30376   signal(SIGINT, interrupt_handler);
30377 #elif (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE)
30378   if( !SetConsoleCtrlHandler(ConsoleCtrlHandler, TRUE) ){
30379     eputz("No ^C handler.\n");
30380   }
30381 #endif
30382 
30383 #if USE_SYSTEM_SQLITE+0!=1
30384   if( cli_strncmp(sqlite3_sourceid(),SQLITE_SOURCE_ID,60)!=0 ){
30385     eputf("SQLite header and source version mismatch\n%s\n%s\n",
30386           sqlite3_sourceid(), SQLITE_SOURCE_ID);
30387     exit(1);
30388   }
30389 #endif
30390   main_init(&data);
30391 
30392   /* On Windows, we must translate command-line arguments into UTF-8.
30393   ** The SQLite memory allocator subsystem has to be enabled in order to
30394   ** do this.  But we want to run an sqlite3_shutdown() afterwards so that
30395   ** subsequent sqlite3_config() calls will work.  So copy all results into
30396   ** memory that does not come from the SQLite memory allocator.
30397   */
30398 #if !SQLITE_SHELL_IS_UTF8
30399   sqlite3_initialize();
30400   argvToFree = malloc(sizeof(argv[0])*argc*2);
30401   shell_check_oom(argvToFree);
30402   argcToFree = argc;
30403   argv = argvToFree + argc;
30404   for(i=0; i<argc; i++){
30405     char *z = sqlite3_win32_unicode_to_utf8(wargv[i]);
30406     i64 n;
30407     shell_check_oom(z);
30408     n = strlen(z);
30409     argv[i] = malloc( n+1 );
30410     shell_check_oom(argv[i]);
30411     memcpy(argv[i], z, n+1);
30412     argvToFree[i] = argv[i];
30413     sqlite3_free(z);
30414   }
30415   sqlite3_shutdown();
30416 #endif
30417 
30418   assert( argc>=1 && argv && argv[0] );
30419   Argv0 = argv[0];
30420 
30421 #ifdef SQLITE_SHELL_DBNAME_PROC
30422   {
30423     /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name
30424     ** of a C-function that will provide the name of the database file.  Use
30425     ** this compile-time option to embed this shell program in larger
30426     ** applications. */
30427     extern void SQLITE_SHELL_DBNAME_PROC(const char**);
30428     SQLITE_SHELL_DBNAME_PROC(&data.pAuxDb->zDbFilename);
30429     warnInmemoryDb = 0;
30430   }
30431 #endif
30432 
30433   /* Do an initial pass through the command-line argument to locate
30434   ** the name of the database file, the name of the initialization file,
30435   ** the size of the alternative malloc heap, options affecting commands
30436   ** or SQL run from the command line, and the first command to execute.
30437   */
30438 #ifndef SQLITE_SHELL_FIDDLE
30439   verify_uninitialized();
30440 #endif
30441   for(i=1; i<argc; i++){
30442     char *z;
30443     z = argv[i];
30444     if( z[0]!='-' || i>nOptsEnd ){
30445       if( data.aAuxDb->zDbFilename==0 ){
30446         data.aAuxDb->zDbFilename = z;
30447       }else{
30448         /* Excess arguments are interpreted as SQL (or dot-commands) and
30449         ** mean that nothing is read from stdin */
30450         readStdin = 0;
30451         nCmd++;
30452         azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd);
30453         shell_check_oom(azCmd);
30454         azCmd[nCmd-1] = z;
30455       }
30456       continue;
30457     }
30458     if( z[1]=='-' ) z++;
30459     if( cli_strcmp(z, "-")==0 ){
30460       nOptsEnd = i;
30461       continue;
30462     }else if( cli_strcmp(z,"-separator")==0
30463      || cli_strcmp(z,"-nullvalue")==0
30464      || cli_strcmp(z,"-newline")==0
30465      || cli_strcmp(z,"-cmd")==0
30466     ){
30467       (void)cmdline_option_value(argc, argv, ++i);
30468     }else if( cli_strcmp(z,"-init")==0 ){
30469       zInitFile = cmdline_option_value(argc, argv, ++i);
30470     }else if( cli_strcmp(z,"-interactive")==0 ){
30471     }else if( cli_strcmp(z,"-batch")==0 ){
30472       /* Need to check for batch mode here to so we can avoid printing
30473       ** informational messages (like from process_sqliterc) before
30474       ** we do the actual processing of arguments later in a second pass.
30475       */
30476       stdin_is_interactive = 0;
30477     }else if( cli_strcmp(z,"-utf8")==0 ){
30478     }else if( cli_strcmp(z,"-no-utf8")==0 ){
30479     }else if( cli_strcmp(z,"-no-rowid-in-view")==0 ){
30480       int val = 0;
30481       sqlite3_config(SQLITE_CONFIG_ROWID_IN_VIEW, &val);
30482       assert( val==0 );
30483     }else if( cli_strcmp(z,"-heap")==0 ){
30484 #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
30485       const char *zSize;
30486       sqlite3_int64 szHeap;
30487 
30488       zSize = cmdline_option_value(argc, argv, ++i);
30489       szHeap = integerValue(zSize);
30490       if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
30491       verify_uninitialized();
30492       sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
30493 #else
30494       (void)cmdline_option_value(argc, argv, ++i);
30495 #endif
30496     }else if( cli_strcmp(z,"-pagecache")==0 ){
30497       sqlite3_int64 n, sz;
30498       sz = integerValue(cmdline_option_value(argc,argv,++i));
30499       if( sz>70000 ) sz = 70000;
30500       if( sz<0 ) sz = 0;
30501       n = integerValue(cmdline_option_value(argc,argv,++i));
30502       if( sz>0 && n>0 && 0xffffffffffffLL/sz<n ){
30503         n = 0xffffffffffffLL/sz;
30504       }
30505       verify_uninitialized();
30506       sqlite3_config(SQLITE_CONFIG_PAGECACHE,
30507                     (n>0 && sz>0) ? malloc(n*sz) : 0, sz, n);
30508       data.shellFlgs |= SHFLG_Pagecache;
30509     }else if( cli_strcmp(z,"-lookaside")==0 ){
30510       int n, sz;
30511       sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
30512       if( sz<0 ) sz = 0;
30513       n = (int)integerValue(cmdline_option_value(argc,argv,++i));
30514       if( n<0 ) n = 0;
30515       verify_uninitialized();
30516       sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n);
30517       if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside;
30518     }else if( cli_strcmp(z,"-threadsafe")==0 ){
30519       int n;
30520       n = (int)integerValue(cmdline_option_value(argc,argv,++i));
30521       verify_uninitialized();
30522       switch( n ){
30523          case 0:  sqlite3_config(SQLITE_CONFIG_SINGLETHREAD);  break;
30524          case 2:  sqlite3_config(SQLITE_CONFIG_MULTITHREAD);   break;
30525          default: sqlite3_config(SQLITE_CONFIG_SERIALIZED);    break;
30526       }
30527 #ifdef SQLITE_ENABLE_VFSTRACE
30528     }else if( cli_strcmp(z,"-vfstrace")==0 ){
30529       extern int vfstrace_register(
30530          const char *zTraceName,
30531          const char *zOldVfsName,
30532          int (*xOut)(const char*,void*),
30533          void *pOutArg,
30534          int makeDefault
30535       );
30536       vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
30537 #endif
30538 #ifdef SQLITE_ENABLE_MULTIPLEX
30539     }else if( cli_strcmp(z,"-multiplex")==0 ){
30540       extern int sqlite3_multiplex_initialize(const char*,int);
30541       sqlite3_multiplex_initialize(0, 1);
30542 #endif
30543     }else if( cli_strcmp(z,"-mmap")==0 ){
30544       sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
30545       verify_uninitialized();
30546       sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
30547 #if defined(SQLITE_ENABLE_SORTER_REFERENCES)
30548     }else if( cli_strcmp(z,"-sorterref")==0 ){
30549       sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
30550       verify_uninitialized();
30551       sqlite3_config(SQLITE_CONFIG_SORTERREF_SIZE, (int)sz);
30552 #endif
30553     }else if( cli_strcmp(z,"-vfs")==0 ){
30554       zVfs = cmdline_option_value(argc, argv, ++i);
30555 #ifdef SQLITE_HAVE_ZLIB
30556     }else if( cli_strcmp(z,"-zip")==0 ){
30557       data.openMode = SHELL_OPEN_ZIPFILE;
30558 #endif
30559     }else if( cli_strcmp(z,"-append")==0 ){
30560       data.openMode = SHELL_OPEN_APPENDVFS;
30561 #ifndef SQLITE_OMIT_DESERIALIZE
30562     }else if( cli_strcmp(z,"-deserialize")==0 ){
30563       data.openMode = SHELL_OPEN_DESERIALIZE;
30564     }else if( cli_strcmp(z,"-maxsize")==0 && i+1<argc ){
30565       data.szMax = integerValue(argv[++i]);
30566 #endif
30567     }else if( cli_strcmp(z,"-readonly")==0 ){
30568       data.openMode = SHELL_OPEN_READONLY;
30569     }else if( cli_strcmp(z,"-nofollow")==0 ){
30570       data.openFlags = SQLITE_OPEN_NOFOLLOW;
30571 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
30572     }else if( cli_strncmp(z, "-A",2)==0 ){
30573       /* All remaining command-line arguments are passed to the ".archive"
30574       ** command, so ignore them */
30575       break;
30576 #endif
30577     }else if( cli_strcmp(z, "-memtrace")==0 ){
30578       sqlite3MemTraceActivate(stderr);
30579     }else if( cli_strcmp(z, "-pcachetrace")==0 ){
30580       sqlite3PcacheTraceActivate(stderr);
30581     }else if( cli_strcmp(z,"-bail")==0 ){
30582       bail_on_error = 1;
30583     }else if( cli_strcmp(z,"-nonce")==0 ){
30584       free(data.zNonce);
30585       data.zNonce = strdup(cmdline_option_value(argc, argv, ++i));
30586     }else if( cli_strcmp(z,"-unsafe-testing")==0 ){
30587       ShellSetFlag(&data,SHFLG_TestingMode);
30588     }else if( cli_strcmp(z,"-safe")==0 ){
30589       /* no-op - catch this on the second pass */
30590     }
30591   }
30592 #ifndef SQLITE_SHELL_FIDDLE
30593   verify_uninitialized();
30594 #endif
30595 
30596 
30597 #ifdef SQLITE_SHELL_INIT_PROC
30598   {
30599     /* If the SQLITE_SHELL_INIT_PROC macro is defined, then it is the name
30600     ** of a C-function that will perform initialization actions on SQLite that
30601     ** occur just before or after sqlite3_initialize(). Use this compile-time
30602     ** option to embed this shell program in larger applications. */
30603     extern void SQLITE_SHELL_INIT_PROC(void);
30604     SQLITE_SHELL_INIT_PROC();
30605   }
30606 #else
30607   /* All the sqlite3_config() calls have now been made. So it is safe
30608   ** to call sqlite3_initialize() and process any command line -vfs option. */
30609   sqlite3_initialize();
30610 #endif
30611 
30612   if( zVfs ){
30613     sqlite3_vfs *pVfs = sqlite3_vfs_find(zVfs);
30614     if( pVfs ){
30615       sqlite3_vfs_register(pVfs, 1);
30616     }else{
30617       eputf("no such VFS: \"%s\"\n", zVfs);
30618       exit(1);
30619     }
30620   }
30621 
30622   if( data.pAuxDb->zDbFilename==0 ){
30623 #ifndef SQLITE_OMIT_MEMORYDB
30624     data.pAuxDb->zDbFilename = ":memory:";
30625     warnInmemoryDb = argc==1;
30626 #else
30627     eputf("%s: Error: no database filename specified\n", Argv0);
30628     return 1;
30629 #endif
30630   }
30631   data.out = stdout;
30632 #ifndef SQLITE_SHELL_FIDDLE
30633   sqlite3_appendvfs_init(0,0,0);
30634 #endif
30635 
30636   /* Go ahead and open the database file if it already exists.  If the
30637   ** file does not exist, delay opening it.  This prevents empty database
30638   ** files from being created if a user mistypes the database name argument
30639   ** to the sqlite command-line tool.
30640   */
30641   if( access(data.pAuxDb->zDbFilename, 0)==0 ){
30642     open_db(&data, 0);
30643   }
30644 
30645   /* Process the initialization file if there is one.  If no -init option
30646   ** is given on the command line, look for a file named ~/.sqliterc and
30647   ** try to process it.
30648   */
30649   process_sqliterc(&data,zInitFile);
30650 
30651   /* Make a second pass through the command-line argument and set
30652   ** options.  This second pass is delayed until after the initialization
30653   ** file is processed so that the command-line arguments will override
30654   ** settings in the initialization file.
30655   */
30656   for(i=1; i<argc; i++){
30657     char *z = argv[i];
30658     if( z[0]!='-' || i>=nOptsEnd ) continue;
30659     if( z[1]=='-' ){ z++; }
30660     if( cli_strcmp(z,"-init")==0 ){
30661       i++;
30662     }else if( cli_strcmp(z,"-html")==0 ){
30663       data.mode = MODE_Html;
30664     }else if( cli_strcmp(z,"-list")==0 ){
30665       data.mode = MODE_List;
30666     }else if( cli_strcmp(z,"-quote")==0 ){
30667       data.mode = MODE_Quote;
30668       sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Comma);
30669       sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Row);
30670     }else if( cli_strcmp(z,"-line")==0 ){
30671       data.mode = MODE_Line;
30672     }else if( cli_strcmp(z,"-column")==0 ){
30673       data.mode = MODE_Column;
30674     }else if( cli_strcmp(z,"-json")==0 ){
30675       data.mode = MODE_Json;
30676     }else if( cli_strcmp(z,"-markdown")==0 ){
30677       data.mode = MODE_Markdown;
30678     }else if( cli_strcmp(z,"-table")==0 ){
30679       data.mode = MODE_Table;
30680     }else if( cli_strcmp(z,"-box")==0 ){
30681       data.mode = MODE_Box;
30682     }else if( cli_strcmp(z,"-csv")==0 ){
30683       data.mode = MODE_Csv;
30684       memcpy(data.colSeparator,",",2);
30685 #ifdef SQLITE_HAVE_ZLIB
30686     }else if( cli_strcmp(z,"-zip")==0 ){
30687       data.openMode = SHELL_OPEN_ZIPFILE;
30688 #endif
30689     }else if( cli_strcmp(z,"-append")==0 ){
30690       data.openMode = SHELL_OPEN_APPENDVFS;
30691 #ifndef SQLITE_OMIT_DESERIALIZE
30692     }else if( cli_strcmp(z,"-deserialize")==0 ){
30693       data.openMode = SHELL_OPEN_DESERIALIZE;
30694     }else if( cli_strcmp(z,"-maxsize")==0 && i+1<argc ){
30695       data.szMax = integerValue(argv[++i]);
30696 #endif
30697     }else if( cli_strcmp(z,"-readonly")==0 ){
30698       data.openMode = SHELL_OPEN_READONLY;
30699     }else if( cli_strcmp(z,"-nofollow")==0 ){
30700       data.openFlags |= SQLITE_OPEN_NOFOLLOW;
30701     }else if( cli_strcmp(z,"-ascii")==0 ){
30702       data.mode = MODE_Ascii;
30703       sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,SEP_Unit);
30704       sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,SEP_Record);
30705     }else if( cli_strcmp(z,"-tabs")==0 ){
30706       data.mode = MODE_List;
30707       sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,SEP_Tab);
30708       sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,SEP_Row);
30709     }else if( cli_strcmp(z,"-separator")==0 ){
30710       sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
30711                        "%s",cmdline_option_value(argc,argv,++i));
30712     }else if( cli_strcmp(z,"-newline")==0 ){
30713       sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
30714                        "%s",cmdline_option_value(argc,argv,++i));
30715     }else if( cli_strcmp(z,"-nullvalue")==0 ){
30716       sqlite3_snprintf(sizeof(data.nullValue), data.nullValue,
30717                        "%s",cmdline_option_value(argc,argv,++i));
30718     }else if( cli_strcmp(z,"-header")==0 ){
30719       data.showHeader = 1;
30720       ShellSetFlag(&data, SHFLG_HeaderSet);
30721      }else if( cli_strcmp(z,"-noheader")==0 ){
30722       data.showHeader = 0;
30723       ShellSetFlag(&data, SHFLG_HeaderSet);
30724     }else if( cli_strcmp(z,"-echo")==0 ){
30725       ShellSetFlag(&data, SHFLG_Echo);
30726     }else if( cli_strcmp(z,"-eqp")==0 ){
30727       data.autoEQP = AUTOEQP_on;
30728     }else if( cli_strcmp(z,"-eqpfull")==0 ){
30729       data.autoEQP = AUTOEQP_full;
30730     }else if( cli_strcmp(z,"-stats")==0 ){
30731       data.statsOn = 1;
30732     }else if( cli_strcmp(z,"-scanstats")==0 ){
30733       data.scanstatsOn = 1;
30734     }else if( cli_strcmp(z,"-backslash")==0 ){
30735       /* Undocumented command-line option: -backslash
30736       ** Causes C-style backslash escapes to be evaluated in SQL statements
30737       ** prior to sending the SQL into SQLite.  Useful for injecting
30738       ** crazy bytes in the middle of SQL statements for testing and debugging.
30739       */
30740       ShellSetFlag(&data, SHFLG_Backslash);
30741     }else if( cli_strcmp(z,"-bail")==0 ){
30742       /* No-op.  The bail_on_error flag should already be set. */
30743     }else if( cli_strcmp(z,"-version")==0 ){
30744       sputf(stdout, "%s %s (%d-bit)\n",
30745             sqlite3_libversion(), sqlite3_sourceid(), 8*(int)sizeof(char*));
30746       return 0;
30747     }else if( cli_strcmp(z,"-interactive")==0 ){
30748       /* Need to check for interactive override here to so that it can
30749       ** affect console setup (for Windows only) and testing thereof.
30750       */
30751       stdin_is_interactive = 1;
30752     }else if( cli_strcmp(z,"-batch")==0 ){
30753       /* already handled */
30754     }else if( cli_strcmp(z,"-utf8")==0 ){
30755       /* already handled */
30756     }else if( cli_strcmp(z,"-no-utf8")==0 ){
30757       /* already handled */
30758     }else if( cli_strcmp(z,"-no-rowid-in-view")==0 ){
30759       /* already handled */
30760     }else if( cli_strcmp(z,"-heap")==0 ){
30761       i++;
30762     }else if( cli_strcmp(z,"-pagecache")==0 ){
30763       i+=2;
30764     }else if( cli_strcmp(z,"-lookaside")==0 ){
30765       i+=2;
30766     }else if( cli_strcmp(z,"-threadsafe")==0 ){
30767       i+=2;
30768     }else if( cli_strcmp(z,"-nonce")==0 ){
30769       i += 2;
30770     }else if( cli_strcmp(z,"-mmap")==0 ){
30771       i++;
30772     }else if( cli_strcmp(z,"-memtrace")==0 ){
30773       i++;
30774     }else if( cli_strcmp(z,"-pcachetrace")==0 ){
30775       i++;
30776 #ifdef SQLITE_ENABLE_SORTER_REFERENCES
30777     }else if( cli_strcmp(z,"-sorterref")==0 ){
30778       i++;
30779 #endif
30780     }else if( cli_strcmp(z,"-vfs")==0 ){
30781       i++;
30782 #ifdef SQLITE_ENABLE_VFSTRACE
30783     }else if( cli_strcmp(z,"-vfstrace")==0 ){
30784       i++;
30785 #endif
30786 #ifdef SQLITE_ENABLE_MULTIPLEX
30787     }else if( cli_strcmp(z,"-multiplex")==0 ){
30788       i++;
30789 #endif
30790     }else if( cli_strcmp(z,"-help")==0 ){
30791       usage(1);
30792     }else if( cli_strcmp(z,"-cmd")==0 ){
30793       /* Run commands that follow -cmd first and separately from commands
30794       ** that simply appear on the command-line.  This seems goofy.  It would
30795       ** be better if all commands ran in the order that they appear.  But
30796       ** we retain the goofy behavior for historical compatibility. */
30797       if( i==argc-1 ) break;
30798       z = cmdline_option_value(argc,argv,++i);
30799       if( z[0]=='.' ){
30800         rc = do_meta_command(z, &data);
30801         if( rc && bail_on_error ) return rc==2 ? 0 : rc;
30802       }else{
30803         open_db(&data, 0);
30804         rc = shell_exec(&data, z, &zErrMsg);
30805         if( zErrMsg!=0 ){
30806           eputf("Error: %s\n", zErrMsg);
30807           if( bail_on_error ) return rc!=0 ? rc : 1;
30808         }else if( rc!=0 ){
30809           eputf("Error: unable to process SQL \"%s\"\n", z);
30810           if( bail_on_error ) return rc;
30811         }
30812       }
30813 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
30814     }else if( cli_strncmp(z, "-A", 2)==0 ){
30815       if( nCmd>0 ){
30816         eputf("Error: cannot mix regular SQL or dot-commands"
30817               " with \"%s\"\n", z);
30818         return 1;
30819       }
30820       open_db(&data, OPEN_DB_ZIPFILE);
30821       if( z[2] ){
30822         argv[i] = &z[2];
30823         arDotCommand(&data, 1, argv+(i-1), argc-(i-1));
30824       }else{
30825         arDotCommand(&data, 1, argv+i, argc-i);
30826       }
30827       readStdin = 0;
30828       break;
30829 #endif
30830     }else if( cli_strcmp(z,"-safe")==0 ){
30831       data.bSafeMode = data.bSafeModePersist = 1;
30832     }else if( cli_strcmp(z,"-unsafe-testing")==0 ){
30833       /* Acted upon in first pass. */
30834     }else{
30835       eputf("%s: Error: unknown option: %s\n", Argv0, z);
30836       eputz("Use -help for a list of options.\n");
30837       return 1;
30838     }
30839     data.cMode = data.mode;
30840   }
30841 
30842   if( !readStdin ){
30843     /* Run all arguments that do not begin with '-' as if they were separate
30844     ** command-line inputs, except for the argToSkip argument which contains
30845     ** the database filename.
30846     */
30847     for(i=0; i<nCmd; i++){
30848       if( azCmd[i][0]=='.' ){
30849         rc = do_meta_command(azCmd[i], &data);
30850         if( rc ){
30851           free(azCmd);
30852           return rc==2 ? 0 : rc;
30853         }
30854       }else{
30855         open_db(&data, 0);
30856         echo_group_input(&data, azCmd[i]);
30857         rc = shell_exec(&data, azCmd[i], &zErrMsg);
30858         if( zErrMsg || rc ){
30859           if( zErrMsg!=0 ){
30860             eputf("Error: %s\n", zErrMsg);
30861           }else{
30862             eputf("Error: unable to process SQL: %s\n", azCmd[i]);
30863           }
30864           sqlite3_free(zErrMsg);
30865           free(azCmd);
30866           return rc!=0 ? rc : 1;
30867         }
30868       }
30869     }
30870   }else{
30871     /* Run commands received from standard input
30872     */
30873     if( stdin_is_interactive ){
30874       char *zHome;
30875       char *zHistory;
30876       int nHistory;
30877 #if CIO_WIN_WC_XLATE
30878 # define SHELL_CIO_CHAR_SET (stdout_is_console? " (UTF-16 console I/O)" : "")
30879 #else
30880 # define SHELL_CIO_CHAR_SET ""
30881 #endif
30882       sputf(stdout, "SQLite version %s %.19s%s\n" /*extra-version-info*/
30883             "Enter \".help\" for usage hints.\n",
30884             sqlite3_libversion(), sqlite3_sourceid(), SHELL_CIO_CHAR_SET);
30885       if( warnInmemoryDb ){
30886         sputz(stdout, "Connected to a ");
30887         printBold("transient in-memory database");
30888         sputz(stdout, ".\nUse \".open FILENAME\" to reopen on a"
30889               " persistent database.\n");
30890       }
30891       zHistory = getenv("SQLITE_HISTORY");
30892       if( zHistory ){
30893         zHistory = strdup(zHistory);
30894       }else if( (zHome = find_home_dir(0))!=0 ){
30895         nHistory = strlen30(zHome) + 20;
30896         if( (zHistory = malloc(nHistory))!=0 ){
30897           sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
30898         }
30899       }
30900       if( zHistory ){ shell_read_history(zHistory); }
30901 #if HAVE_READLINE || HAVE_EDITLINE
30902       rl_attempted_completion_function = readline_completion;
30903 #elif HAVE_LINENOISE
30904       linenoiseSetCompletionCallback(linenoise_completion);
30905 #endif
30906       data.in = 0;
30907       rc = process_input(&data);
30908       if( zHistory ){
30909         shell_stifle_history(2000);
30910         shell_write_history(zHistory);
30911         free(zHistory);
30912       }
30913     }else{
30914       data.in = stdin;
30915       rc = process_input(&data);
30916     }
30917   }
30918 #ifndef SQLITE_SHELL_FIDDLE
30919   /* In WASM mode we have to leave the db state in place so that
30920   ** client code can "push" SQL into it after this call returns. */
30921 #ifndef SQLITE_OMIT_VIRTUALTABLE
30922   if( data.expert.pExpert ){
30923     expertFinish(&data, 1, 0);
30924   }
30925 #endif
30926   free(azCmd);
30927   set_table_name(&data, 0);
30928   if( data.db ){
30929     session_close_all(&data, -1);
30930     close_db(data.db);
30931   }
30932   for(i=0; i<ArraySize(data.aAuxDb); i++){
30933     sqlite3_free(data.aAuxDb[i].zFreeOnClose);
30934     if( data.aAuxDb[i].db ){
30935       session_close_all(&data, i);
30936       close_db(data.aAuxDb[i].db);
30937     }
30938   }
30939   find_home_dir(1);
30940   output_reset(&data);
30941   data.doXdgOpen = 0;
30942   clearTempFile(&data);
30943 #if !SQLITE_SHELL_IS_UTF8
30944   for(i=0; i<argcToFree; i++) free(argvToFree[i]);
30945   free(argvToFree);
30946 #endif
30947   free(data.colWidth);
30948   free(data.zNonce);
30949   /* Clear the global data structure so that valgrind will detect memory
30950   ** leaks */
30951   memset(&data, 0, sizeof(data));
30952 #ifdef SQLITE_DEBUG
30953   if( sqlite3_memory_used()>mem_main_enter ){
30954     eputf("Memory leaked: %u bytes\n",
30955           (unsigned int)(sqlite3_memory_used()-mem_main_enter));
30956   }
30957 #endif
30958 #endif /* !SQLITE_SHELL_FIDDLE */
30959   return rc;
30960 }
30961 
30962 
30963 #ifdef SQLITE_SHELL_FIDDLE
30964 /* Only for emcc experimentation purposes. */
30965 int fiddle_experiment(int a,int b){
30966   return a + b;
30967 }
30968 
30969 /*
30970 ** Returns a pointer to the current DB handle.
30971 */
30972 sqlite3 * fiddle_db_handle(){
30973   return globalDb;
30974 }
30975 
30976 /*
30977 ** Returns a pointer to the given DB name's VFS. If zDbName is 0 then
30978 ** "main" is assumed. Returns 0 if no db with the given name is
30979 ** open.
30980 */
30981 sqlite3_vfs * fiddle_db_vfs(const char *zDbName){
30982   sqlite3_vfs * pVfs = 0;
30983   if(globalDb){
30984     sqlite3_file_control(globalDb, zDbName ? zDbName : "main",
30985                          SQLITE_FCNTL_VFS_POINTER, &pVfs);
30986   }
30987   return pVfs;
30988 }
30989 
30990 /* Only for emcc experimentation purposes. */
30991 sqlite3 * fiddle_db_arg(sqlite3 *arg){
30992     oputf("fiddle_db_arg(%p)\n", (const void*)arg);
30993     return arg;
30994 }
30995 
30996 /*
30997 ** Intended to be called via a SharedWorker() while a separate
30998 ** SharedWorker() (which manages the wasm module) is performing work
30999 ** which should be interrupted. Unfortunately, SharedWorker is not
31000 ** portable enough to make real use of.
31001 */
31002 void fiddle_interrupt(void){
31003   if( globalDb ) sqlite3_interrupt(globalDb);
31004 }
31005 
31006 /*
31007 ** Returns the filename of the given db name, assuming "main" if
31008 ** zDbName is NULL. Returns NULL if globalDb is not opened.
31009 */
31010 const char * fiddle_db_filename(const char * zDbName){
31011     return globalDb
31012       ? sqlite3_db_filename(globalDb, zDbName ? zDbName : "main")
31013       : NULL;
31014 }
31015 
31016 /*
31017 ** Completely wipes out the contents of the currently-opened database
31018 ** but leaves its storage intact for reuse. If any transactions are
31019 ** active, they are forcibly rolled back.
31020 */
31021 void fiddle_reset_db(void){
31022   if( globalDb ){
31023     int rc;
31024     while( sqlite3_txn_state(globalDb,0)>0 ){
31025       /*
31026       ** Resolve problem reported in
31027       ** https://sqlite.org/forum/forumpost/0b41a25d65
31028       */
31029       oputz("Rolling back in-progress transaction.\n");
31030       sqlite3_exec(globalDb,"ROLLBACK", 0, 0, 0);
31031     }
31032     rc = sqlite3_db_config(globalDb, SQLITE_DBCONFIG_RESET_DATABASE, 1, 0);
31033     if( 0==rc ) sqlite3_exec(globalDb, "VACUUM", 0, 0, 0);
31034     sqlite3_db_config(globalDb, SQLITE_DBCONFIG_RESET_DATABASE, 0, 0);
31035   }
31036 }
31037 
31038 /*
31039 ** Uses the current database's VFS xRead to stream the db file's
31040 ** contents out to the given callback. The callback gets a single
31041 ** chunk of size n (its 2nd argument) on each call and must return 0
31042 ** on success, non-0 on error. This function returns 0 on success,
31043 ** SQLITE_NOTFOUND if no db is open, or propagates any other non-0
31044 ** code from the callback. Note that this is not thread-friendly: it
31045 ** expects that it will be the only thread reading the db file and
31046 ** takes no measures to ensure that is the case.
31047 */
31048 int fiddle_export_db( int (*xCallback)(unsigned const char *zOut, int n) ){
31049   sqlite3_int64 nSize = 0;
31050   sqlite3_int64 nPos = 0;
31051   sqlite3_file * pFile = 0;
31052   unsigned char buf[1024 * 8];
31053   int nBuf = (int)sizeof(buf);
31054   int rc = shellState.db
31055     ? sqlite3_file_control(shellState.db, "main",
31056                            SQLITE_FCNTL_FILE_POINTER, &pFile)
31057     : SQLITE_NOTFOUND;
31058   if( rc ) return rc;
31059   rc = pFile->pMethods->xFileSize(pFile, &nSize);
31060   if( rc ) return rc;
31061   if(nSize % nBuf){
31062     /* DB size is not an even multiple of the buffer size. Reduce
31063     ** buffer size so that we do not unduly inflate the db size when
31064     ** exporting. */
31065     if(0 == nSize % 4096) nBuf = 4096;
31066     else if(0 == nSize % 2048) nBuf = 2048;
31067     else if(0 == nSize % 1024) nBuf = 1024;
31068     else nBuf = 512;
31069   }
31070   for( ; 0==rc && nPos<nSize; nPos += nBuf ){
31071     rc = pFile->pMethods->xRead(pFile, buf, nBuf, nPos);
31072     if(SQLITE_IOERR_SHORT_READ == rc){
31073       rc = (nPos + nBuf) < nSize ? rc : 0/*assume EOF*/;
31074     }
31075     if( 0==rc ) rc = xCallback(buf, nBuf);
31076   }
31077   return rc;
31078 }
31079 
31080 /*
31081 ** Trivial exportable function for emscripten. It processes zSql as if
31082 ** it were input to the sqlite3 shell and redirects all output to the
31083 ** wasm binding. fiddle_main() must have been called before this
31084 ** is called, or results are undefined.
31085 */
31086 void fiddle_exec(const char * zSql){
31087   if(zSql && *zSql){
31088     if('.'==*zSql) puts(zSql);
31089     shellState.wasm.zInput = zSql;
31090     shellState.wasm.zPos = zSql;
31091     process_input(&shellState);
31092     shellState.wasm.zInput = shellState.wasm.zPos = 0;
31093   }
31094 }
31095 #endif /* SQLITE_SHELL_FIDDLE */
31096