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
584 #ifndef SQLITE_CIO_NO_TRANSLATE
585 # if (defined(_WIN32) || defined(WIN32)) && !SQLITE_OS_WINRT
586 # ifndef SHELL_NO_SYSINC
587 # include <io.h>
588 # include <fcntl.h>
589 # undef WIN32_LEAN_AND_MEAN
590 # define WIN32_LEAN_AND_MEAN
591 # include <windows.h>
592 # endif
593 # define CIO_WIN_WC_XLATE 1 /* Use WCHAR Windows APIs for console I/O */
594 # else
595 # ifndef SHELL_NO_SYSINC
596 # include <unistd.h>
597 # endif
598 # define CIO_WIN_WC_XLATE 0 /* Use plain C library stream I/O at console */
599 # endif
600 #else
601 # define CIO_WIN_WC_XLATE 0 /* Not exposing translation routines at all */
602 #endif
603
604 #if CIO_WIN_WC_XLATE
605 /* Character used to represent a known-incomplete UTF-8 char group (�) */
606 static WCHAR cBadGroup = 0xfffd;
607 #endif
608
609 #if CIO_WIN_WC_XLATE
handleOfFile(FILE * pf)610 static HANDLE handleOfFile(FILE *pf){
611 int fileDesc = _fileno(pf);
612 union { intptr_t osfh; HANDLE fh; } fid = {
613 (fileDesc>=0)? _get_osfhandle(fileDesc) : (intptr_t)INVALID_HANDLE_VALUE
614 };
615 return fid.fh;
616 }
617 #endif
618
619 #ifndef SQLITE_CIO_NO_TRANSLATE
620 typedef struct PerStreamTags {
621 # if CIO_WIN_WC_XLATE
622 HANDLE hx;
623 DWORD consMode;
624 char acIncomplete[4];
625 # else
626 short reachesConsole;
627 # endif
628 FILE *pf;
629 } PerStreamTags;
630
631 /* Define NULL-like value for things which can validly be 0. */
632 # define SHELL_INVALID_FILE_PTR ((FILE *)~0)
633 # if CIO_WIN_WC_XLATE
634 # define SHELL_INVALID_CONS_MODE 0xFFFF0000
635 # endif
636
637 # if CIO_WIN_WC_XLATE
638 # define PST_INITIALIZER { INVALID_HANDLE_VALUE, SHELL_INVALID_CONS_MODE, \
639 {0,0,0,0}, SHELL_INVALID_FILE_PTR }
640 # else
641 # define PST_INITIALIZER { 0, SHELL_INVALID_FILE_PTR }
642 # endif
643
644 /* Quickly say whether a known output is going to the console. */
645 # if CIO_WIN_WC_XLATE
pstReachesConsole(PerStreamTags * ppst)646 static short pstReachesConsole(PerStreamTags *ppst){
647 return (ppst->hx != INVALID_HANDLE_VALUE);
648 }
649 # else
650 # define pstReachesConsole(ppst) 0
651 # endif
652
653 # if CIO_WIN_WC_XLATE
restoreConsoleArb(PerStreamTags * ppst)654 static void restoreConsoleArb(PerStreamTags *ppst){
655 if( pstReachesConsole(ppst) ) SetConsoleMode(ppst->hx, ppst->consMode);
656 }
657 # else
658 # define restoreConsoleArb(ppst)
659 # endif
660
661 /* Say whether FILE* appears to be a console, collect associated info. */
streamOfConsole(FILE * pf,PerStreamTags * ppst)662 static short streamOfConsole(FILE *pf, /* out */ PerStreamTags *ppst){
663 # if CIO_WIN_WC_XLATE
664 short rv = 0;
665 DWORD dwCM = SHELL_INVALID_CONS_MODE;
666 HANDLE fh = handleOfFile(pf);
667 ppst->pf = pf;
668 if( INVALID_HANDLE_VALUE != fh ){
669 rv = (GetFileType(fh) == FILE_TYPE_CHAR && GetConsoleMode(fh,&dwCM));
670 }
671 ppst->hx = (rv)? fh : INVALID_HANDLE_VALUE;
672 ppst->consMode = dwCM;
673 return rv;
674 # else
675 ppst->pf = pf;
676 ppst->reachesConsole = ( (short)isatty(fileno(pf)) );
677 return ppst->reachesConsole;
678 # endif
679 }
680
681 # if CIO_WIN_WC_XLATE
682 /* Define console modes for use with the Windows Console API. */
683 # define SHELL_CONI_MODE \
684 (ENABLE_ECHO_INPUT | ENABLE_INSERT_MODE | ENABLE_LINE_INPUT | 0x80 \
685 | ENABLE_QUICK_EDIT_MODE | ENABLE_EXTENDED_FLAGS | ENABLE_PROCESSED_INPUT)
686 # define SHELL_CONO_MODE (ENABLE_PROCESSED_OUTPUT | ENABLE_WRAP_AT_EOL_OUTPUT \
687 | ENABLE_VIRTUAL_TERMINAL_PROCESSING)
688 # endif
689
690 typedef struct ConsoleInfo {
691 PerStreamTags pstSetup[3];
692 PerStreamTags pstDesignated[3];
693 StreamsAreConsole sacSetup;
694 } ConsoleInfo;
695
isValidStreamInfo(PerStreamTags * ppst)696 static short isValidStreamInfo(PerStreamTags *ppst){
697 return (ppst->pf != SHELL_INVALID_FILE_PTR);
698 }
699
700 static ConsoleInfo consoleInfo = {
701 { /* pstSetup */ PST_INITIALIZER, PST_INITIALIZER, PST_INITIALIZER },
702 { /* pstDesignated[] */ PST_INITIALIZER, PST_INITIALIZER, PST_INITIALIZER },
703 SAC_NoConsole /* sacSetup */
704 };
705
706 SQLITE_INTERNAL_LINKAGE FILE* invalidFileStream = (FILE *)~0;
707
708 # if CIO_WIN_WC_XLATE
maybeSetupAsConsole(PerStreamTags * ppst,short odir)709 static void maybeSetupAsConsole(PerStreamTags *ppst, short odir){
710 if( pstReachesConsole(ppst) ){
711 DWORD cm = odir? SHELL_CONO_MODE : SHELL_CONI_MODE;
712 SetConsoleMode(ppst->hx, cm);
713 }
714 }
715 # else
716 # define maybeSetupAsConsole(ppst,odir)
717 # endif
718
consoleRenewSetup(void)719 SQLITE_INTERNAL_LINKAGE void consoleRenewSetup(void){
720 # if CIO_WIN_WC_XLATE
721 int ix = 0;
722 while( ix < 6 ){
723 PerStreamTags *ppst = (ix<3)?
724 &consoleInfo.pstSetup[ix] : &consoleInfo.pstDesignated[ix-3];
725 maybeSetupAsConsole(ppst, (ix % 3)>0);
726 ++ix;
727 }
728 # endif
729 }
730
731 SQLITE_INTERNAL_LINKAGE StreamsAreConsole
consoleClassifySetup(FILE * pfIn,FILE * pfOut,FILE * pfErr)732 consoleClassifySetup( FILE *pfIn, FILE *pfOut, FILE *pfErr ){
733 StreamsAreConsole rv = SAC_NoConsole;
734 FILE* apf[3] = { pfIn, pfOut, pfErr };
735 int ix;
736 for( ix = 2; ix >= 0; --ix ){
737 PerStreamTags *ppst = &consoleInfo.pstSetup[ix];
738 if( streamOfConsole(apf[ix], ppst) ){
739 rv |= (SAC_InConsole<<ix);
740 }
741 consoleInfo.pstDesignated[ix] = *ppst;
742 if( ix > 0 ) fflush(apf[ix]);
743 }
744 consoleInfo.sacSetup = rv;
745 consoleRenewSetup();
746 return rv;
747 }
748
consoleRestore(void)749 SQLITE_INTERNAL_LINKAGE void SQLITE_CDECL consoleRestore( void ){
750 # if CIO_WIN_WC_XLATE
751 static ConsoleInfo *pci = &consoleInfo;
752 if( pci->sacSetup ){
753 int ix;
754 for( ix=0; ix<3; ++ix ){
755 if( pci->sacSetup & (SAC_InConsole<<ix) ){
756 PerStreamTags *ppst = &pci->pstSetup[ix];
757 SetConsoleMode(ppst->hx, ppst->consMode);
758 }
759 }
760 }
761 # endif
762 }
763 #endif /* !defined(SQLITE_CIO_NO_TRANSLATE) */
764
765 #ifdef SQLITE_CIO_INPUT_REDIR
766 /* Say whether given FILE* is among those known, via either
767 ** consoleClassifySetup() or set{Output,Error}Stream, as
768 ** readable, and return an associated PerStreamTags pointer
769 ** if so. Otherwise, return 0.
770 */
isKnownReadable(FILE * pf)771 static PerStreamTags * isKnownReadable(FILE *pf){
772 static PerStreamTags *apst[] = {
773 &consoleInfo.pstDesignated[0], &consoleInfo.pstSetup[0], 0
774 };
775 int ix = 0;
776 do {
777 if( apst[ix]->pf == pf ) break;
778 } while( apst[++ix] != 0 );
779 return apst[ix];
780 }
781 #endif
782
783 #ifndef SQLITE_CIO_NO_TRANSLATE
784 /* Say whether given FILE* is among those known, via either
785 ** consoleClassifySetup() or set{Output,Error}Stream, as
786 ** writable, and return an associated PerStreamTags pointer
787 ** if so. Otherwise, return 0.
788 */
isKnownWritable(FILE * pf)789 static PerStreamTags * isKnownWritable(FILE *pf){
790 static PerStreamTags *apst[] = {
791 &consoleInfo.pstDesignated[1], &consoleInfo.pstDesignated[2],
792 &consoleInfo.pstSetup[1], &consoleInfo.pstSetup[2], 0
793 };
794 int ix = 0;
795 do {
796 if( apst[ix]->pf == pf ) break;
797 } while( apst[++ix] != 0 );
798 return apst[ix];
799 }
800
designateEmitStream(FILE * pf,unsigned chix)801 static FILE *designateEmitStream(FILE *pf, unsigned chix){
802 FILE *rv = consoleInfo.pstDesignated[chix].pf;
803 if( pf == invalidFileStream ) return rv;
804 else{
805 /* Setting a possibly new output stream. */
806 PerStreamTags *ppst = isKnownWritable(pf);
807 if( ppst != 0 ){
808 PerStreamTags pst = *ppst;
809 consoleInfo.pstDesignated[chix] = pst;
810 }else streamOfConsole(pf, &consoleInfo.pstDesignated[chix]);
811 }
812 return rv;
813 }
814
setOutputStream(FILE * pf)815 SQLITE_INTERNAL_LINKAGE FILE *setOutputStream(FILE *pf){
816 return designateEmitStream(pf, 1);
817 }
818 # ifdef CONSIO_SET_ERROR_STREAM
setErrorStream(FILE * pf)819 SQLITE_INTERNAL_LINKAGE FILE *setErrorStream(FILE *pf){
820 return designateEmitStream(pf, 2);
821 }
822 # endif
823 #endif /* !defined(SQLITE_CIO_NO_TRANSLATE) */
824
825 #ifndef SQLITE_CIO_NO_SETMODE
826 # if CIO_WIN_WC_XLATE
setModeFlushQ(FILE * pf,short bFlush,int mode)827 static void setModeFlushQ(FILE *pf, short bFlush, int mode){
828 if( bFlush ) fflush(pf);
829 _setmode(_fileno(pf), mode);
830 }
831 # else
832 # define setModeFlushQ(f, b, m) if(b) fflush(f)
833 # endif
834
setBinaryMode(FILE * pf,short bFlush)835 SQLITE_INTERNAL_LINKAGE void setBinaryMode(FILE *pf, short bFlush){
836 setModeFlushQ(pf, bFlush, _O_BINARY);
837 }
setTextMode(FILE * pf,short bFlush)838 SQLITE_INTERNAL_LINKAGE void setTextMode(FILE *pf, short bFlush){
839 setModeFlushQ(pf, bFlush, _O_TEXT);
840 }
841 # undef setModeFlushQ
842
843 #else /* defined(SQLITE_CIO_NO_SETMODE) */
844 # define setBinaryMode(f, bFlush) do{ if((bFlush)) fflush(f); }while(0)
845 # define setTextMode(f, bFlush) do{ if((bFlush)) fflush(f); }while(0)
846 #endif /* defined(SQLITE_CIO_NO_SETMODE) */
847
848 #ifndef SQLITE_CIO_NO_TRANSLATE
849 # if CIO_WIN_WC_XLATE
850 /* Write buffer cBuf as output to stream known to reach console,
851 ** limited to ncTake char's. Return ncTake on success, else 0. */
conZstrEmit(PerStreamTags * ppst,const char * z,int ncTake)852 static int conZstrEmit(PerStreamTags *ppst, const char *z, int ncTake){
853 int rv = 0;
854 if( z!=NULL ){
855 int nwc = MultiByteToWideChar(CP_UTF8,0, z,ncTake, 0,0);
856 if( nwc > 0 ){
857 WCHAR *zw = sqlite3_malloc64(nwc*sizeof(WCHAR));
858 if( zw!=NULL ){
859 nwc = MultiByteToWideChar(CP_UTF8,0, z,ncTake, zw,nwc);
860 if( nwc > 0 ){
861 /* Translation from UTF-8 to UTF-16, then WCHARs out. */
862 if( WriteConsoleW(ppst->hx, zw,nwc, 0, NULL) ){
863 rv = ncTake;
864 }
865 }
866 sqlite3_free(zw);
867 }
868 }
869 }
870 return rv;
871 }
872
873 /* For {f,o,e}PrintfUtf8() when stream is known to reach console. */
conioVmPrintf(PerStreamTags * ppst,const char * zFormat,va_list ap)874 static int conioVmPrintf(PerStreamTags *ppst, const char *zFormat, va_list ap){
875 char *z = sqlite3_vmprintf(zFormat, ap);
876 if( z ){
877 int rv = conZstrEmit(ppst, z, (int)strlen(z));
878 sqlite3_free(z);
879 return rv;
880 }else return 0;
881 }
882 # endif /* CIO_WIN_WC_XLATE */
883
884 # ifdef CONSIO_GET_EMIT_STREAM
getDesignatedEmitStream(FILE * pf,unsigned chix,PerStreamTags * ppst)885 static PerStreamTags * getDesignatedEmitStream(FILE *pf, unsigned chix,
886 PerStreamTags *ppst){
887 PerStreamTags *rv = isKnownWritable(pf);
888 short isValid = (rv!=0)? isValidStreamInfo(rv) : 0;
889 if( rv != 0 && isValid ) return rv;
890 streamOfConsole(pf, ppst);
891 return ppst;
892 }
893 # endif
894
895 /* Get stream info, either for designated output or error stream when
896 ** chix equals 1 or 2, or for an arbitrary stream when chix == 0.
897 ** In either case, ppst references a caller-owned PerStreamTags
898 ** struct which may be filled in if none of the known writable
899 ** streams is being held by consoleInfo. The ppf parameter is a
900 ** byref output when chix!=0 and a byref input when chix==0.
901 */
902 static PerStreamTags *
getEmitStreamInfo(unsigned chix,PerStreamTags * ppst,FILE ** ppf)903 getEmitStreamInfo(unsigned chix, PerStreamTags *ppst,
904 /* in/out */ FILE **ppf){
905 PerStreamTags *ppstTry;
906 FILE *pfEmit;
907 if( chix > 0 ){
908 ppstTry = &consoleInfo.pstDesignated[chix];
909 if( !isValidStreamInfo(ppstTry) ){
910 ppstTry = &consoleInfo.pstSetup[chix];
911 pfEmit = ppst->pf;
912 }else pfEmit = ppstTry->pf;
913 if( !isValidStreamInfo(ppstTry) ){
914 pfEmit = (chix > 1)? stderr : stdout;
915 ppstTry = ppst;
916 streamOfConsole(pfEmit, ppstTry);
917 }
918 *ppf = pfEmit;
919 }else{
920 ppstTry = isKnownWritable(*ppf);
921 if( ppstTry != 0 ) return ppstTry;
922 streamOfConsole(*ppf, ppst);
923 return ppst;
924 }
925 return ppstTry;
926 }
927
oPrintfUtf8(const char * zFormat,...)928 SQLITE_INTERNAL_LINKAGE int oPrintfUtf8(const char *zFormat, ...){
929 va_list ap;
930 int rv;
931 FILE *pfOut;
932 PerStreamTags pst = PST_INITIALIZER; /* for unknown streams */
933 # if CIO_WIN_WC_XLATE
934 PerStreamTags *ppst = getEmitStreamInfo(1, &pst, &pfOut);
935 # else
936 getEmitStreamInfo(1, &pst, &pfOut);
937 # endif
938 assert(zFormat!=0);
939 va_start(ap, zFormat);
940 # if CIO_WIN_WC_XLATE
941 if( pstReachesConsole(ppst) ){
942 rv = conioVmPrintf(ppst, zFormat, ap);
943 }else{
944 # endif
945 rv = vfprintf(pfOut, zFormat, ap);
946 # if CIO_WIN_WC_XLATE
947 }
948 # endif
949 va_end(ap);
950 return rv;
951 }
952
ePrintfUtf8(const char * zFormat,...)953 SQLITE_INTERNAL_LINKAGE int ePrintfUtf8(const char *zFormat, ...){
954 va_list ap;
955 int rv;
956 FILE *pfErr;
957 PerStreamTags pst = PST_INITIALIZER; /* for unknown streams */
958 # if CIO_WIN_WC_XLATE
959 PerStreamTags *ppst = getEmitStreamInfo(2, &pst, &pfErr);
960 # else
961 getEmitStreamInfo(2, &pst, &pfErr);
962 # endif
963 assert(zFormat!=0);
964 va_start(ap, zFormat);
965 # if CIO_WIN_WC_XLATE
966 if( pstReachesConsole(ppst) ){
967 rv = conioVmPrintf(ppst, zFormat, ap);
968 }else{
969 # endif
970 rv = vfprintf(pfErr, zFormat, ap);
971 # if CIO_WIN_WC_XLATE
972 }
973 # endif
974 va_end(ap);
975 return rv;
976 }
977
fPrintfUtf8(FILE * pfO,const char * zFormat,...)978 SQLITE_INTERNAL_LINKAGE int fPrintfUtf8(FILE *pfO, const char *zFormat, ...){
979 va_list ap;
980 int rv;
981 PerStreamTags pst = PST_INITIALIZER; /* for unknown streams */
982 # if CIO_WIN_WC_XLATE
983 PerStreamTags *ppst = getEmitStreamInfo(0, &pst, &pfO);
984 # else
985 getEmitStreamInfo(0, &pst, &pfO);
986 # endif
987 assert(zFormat!=0);
988 va_start(ap, zFormat);
989 # if CIO_WIN_WC_XLATE
990 if( pstReachesConsole(ppst) ){
991 maybeSetupAsConsole(ppst, 1);
992 rv = conioVmPrintf(ppst, zFormat, ap);
993 if( 0 == isKnownWritable(ppst->pf) ) restoreConsoleArb(ppst);
994 }else{
995 # endif
996 rv = vfprintf(pfO, zFormat, ap);
997 # if CIO_WIN_WC_XLATE
998 }
999 # endif
1000 va_end(ap);
1001 return rv;
1002 }
1003
fPutsUtf8(const char * z,FILE * pfO)1004 SQLITE_INTERNAL_LINKAGE int fPutsUtf8(const char *z, FILE *pfO){
1005 PerStreamTags pst = PST_INITIALIZER; /* for unknown streams */
1006 # if CIO_WIN_WC_XLATE
1007 PerStreamTags *ppst = getEmitStreamInfo(0, &pst, &pfO);
1008 # else
1009 getEmitStreamInfo(0, &pst, &pfO);
1010 # endif
1011 assert(z!=0);
1012 # if CIO_WIN_WC_XLATE
1013 if( pstReachesConsole(ppst) ){
1014 int rv;
1015 maybeSetupAsConsole(ppst, 1);
1016 rv = conZstrEmit(ppst, z, (int)strlen(z));
1017 if( 0 == isKnownWritable(ppst->pf) ) restoreConsoleArb(ppst);
1018 return rv;
1019 }else {
1020 # endif
1021 return (fputs(z, pfO)<0)? 0 : (int)strlen(z);
1022 # if CIO_WIN_WC_XLATE
1023 }
1024 # endif
1025 }
1026
ePutsUtf8(const char * z)1027 SQLITE_INTERNAL_LINKAGE int ePutsUtf8(const char *z){
1028 FILE *pfErr;
1029 PerStreamTags pst = PST_INITIALIZER; /* for unknown streams */
1030 # if CIO_WIN_WC_XLATE
1031 PerStreamTags *ppst = getEmitStreamInfo(2, &pst, &pfErr);
1032 # else
1033 getEmitStreamInfo(2, &pst, &pfErr);
1034 # endif
1035 assert(z!=0);
1036 # if CIO_WIN_WC_XLATE
1037 if( pstReachesConsole(ppst) ) return conZstrEmit(ppst, z, (int)strlen(z));
1038 else {
1039 # endif
1040 return (fputs(z, pfErr)<0)? 0 : (int)strlen(z);
1041 # if CIO_WIN_WC_XLATE
1042 }
1043 # endif
1044 }
1045
oPutsUtf8(const char * z)1046 SQLITE_INTERNAL_LINKAGE int oPutsUtf8(const char *z){
1047 FILE *pfOut;
1048 PerStreamTags pst = PST_INITIALIZER; /* for unknown streams */
1049 # if CIO_WIN_WC_XLATE
1050 PerStreamTags *ppst = getEmitStreamInfo(1, &pst, &pfOut);
1051 # else
1052 getEmitStreamInfo(1, &pst, &pfOut);
1053 # endif
1054 assert(z!=0);
1055 # if CIO_WIN_WC_XLATE
1056 if( pstReachesConsole(ppst) ) return conZstrEmit(ppst, z, (int)strlen(z));
1057 else {
1058 # endif
1059 return (fputs(z, pfOut)<0)? 0 : (int)strlen(z);
1060 # if CIO_WIN_WC_XLATE
1061 }
1062 # endif
1063 }
1064
1065 #endif /* !defined(SQLITE_CIO_NO_TRANSLATE) */
1066
1067 #if !(defined(SQLITE_CIO_NO_UTF8SCAN) && defined(SQLITE_CIO_NO_TRANSLATE))
1068 /* Skip over as much z[] input char sequence as is valid UTF-8,
1069 ** limited per nAccept char's or whole characters and containing
1070 ** no char cn such that ((1<<cn) & ccm)!=0. On return, the
1071 ** sequence z:return (inclusive:exclusive) is validated UTF-8.
1072 ** Limit: nAccept>=0 => char count, nAccept<0 => character
1073 */
1074 SQLITE_INTERNAL_LINKAGE const char*
zSkipValidUtf8(const char * z,int nAccept,long ccm)1075 zSkipValidUtf8(const char *z, int nAccept, long ccm){
1076 int ng = (nAccept<0)? -nAccept : 0;
1077 const char *pcLimit = (nAccept>=0)? z+nAccept : 0;
1078 assert(z!=0);
1079 while( (pcLimit)? (z<pcLimit) : (ng-- != 0) ){
1080 char c = *z;
1081 if( (c & 0x80) == 0 ){
1082 if( ccm != 0L && c < 0x20 && ((1L<<c) & ccm) != 0 ) return z;
1083 ++z; /* ASCII */
1084 }else if( (c & 0xC0) != 0xC0 ) return z; /* not a lead byte */
1085 else{
1086 const char *zt = z+1; /* Got lead byte, look at trail bytes.*/
1087 do{
1088 if( pcLimit && zt >= pcLimit ) return z;
1089 else{
1090 char ct = *zt++;
1091 if( ct==0 || (zt-z)>4 || (ct & 0xC0)!=0x80 ){
1092 /* Trailing bytes are too few, too many, or invalid. */
1093 return z;
1094 }
1095 }
1096 } while( ((c <<= 1) & 0x40) == 0x40 ); /* Eat lead byte's count. */
1097 z = zt;
1098 }
1099 }
1100 return z;
1101 }
1102 #endif /*!(defined(SQLITE_CIO_NO_UTF8SCAN)&&defined(SQLITE_CIO_NO_TRANSLATE))*/
1103
1104 #ifndef SQLITE_CIO_NO_TRANSLATE
1105 # ifdef CONSIO_SPUTB
1106 SQLITE_INTERNAL_LINKAGE int
fPutbUtf8(FILE * pfO,const char * cBuf,int nAccept)1107 fPutbUtf8(FILE *pfO, const char *cBuf, int nAccept){
1108 assert(pfO!=0);
1109 # if CIO_WIN_WC_XLATE
1110 PerStreamTags pst = PST_INITIALIZER; /* for unknown streams */
1111 PerStreamTags *ppst = getEmitStreamInfo(0, &pst, &pfO);
1112 if( pstReachesConsole(ppst) ){
1113 int rv;
1114 maybeSetupAsConsole(ppst, 1);
1115 rv = conZstrEmit(ppst, cBuf, nAccept);
1116 if( 0 == isKnownWritable(ppst->pf) ) restoreConsoleArb(ppst);
1117 return rv;
1118 }else {
1119 # endif
1120 return (int)fwrite(cBuf, 1, nAccept, pfO);
1121 # if CIO_WIN_WC_XLATE
1122 }
1123 # endif
1124 }
1125 # endif
1126
1127 SQLITE_INTERNAL_LINKAGE int
oPutbUtf8(const char * cBuf,int nAccept)1128 oPutbUtf8(const char *cBuf, int nAccept){
1129 FILE *pfOut;
1130 PerStreamTags pst = PST_INITIALIZER; /* for unknown streams */
1131 # if CIO_WIN_WC_XLATE
1132 PerStreamTags *ppst = getEmitStreamInfo(1, &pst, &pfOut);
1133 # else
1134 getEmitStreamInfo(1, &pst, &pfOut);
1135 # endif
1136 # if CIO_WIN_WC_XLATE
1137 if( pstReachesConsole(ppst) ){
1138 return conZstrEmit(ppst, cBuf, nAccept);
1139 }else {
1140 # endif
1141 return (int)fwrite(cBuf, 1, nAccept, pfOut);
1142 # if CIO_WIN_WC_XLATE
1143 }
1144 # endif
1145 }
1146
1147 # ifdef CONSIO_EPUTB
1148 SQLITE_INTERNAL_LINKAGE int
ePutbUtf8(const char * cBuf,int nAccept)1149 ePutbUtf8(const char *cBuf, int nAccept){
1150 FILE *pfErr;
1151 PerStreamTags pst = PST_INITIALIZER; /* for unknown streams */
1152 PerStreamTags *ppst = getEmitStreamInfo(2, &pst, &pfErr);
1153 # if CIO_WIN_WC_XLATE
1154 if( pstReachesConsole(ppst) ){
1155 return conZstrEmit(ppst, cBuf, nAccept);
1156 }else {
1157 # endif
1158 return (int)fwrite(cBuf, 1, nAccept, pfErr);
1159 # if CIO_WIN_WC_XLATE
1160 }
1161 # endif
1162 }
1163 # endif /* defined(CONSIO_EPUTB) */
1164
fGetsUtf8(char * cBuf,int ncMax,FILE * pfIn)1165 SQLITE_INTERNAL_LINKAGE char* fGetsUtf8(char *cBuf, int ncMax, FILE *pfIn){
1166 if( pfIn==0 ) pfIn = stdin;
1167 # if CIO_WIN_WC_XLATE
1168 if( pfIn == consoleInfo.pstSetup[0].pf
1169 && (consoleInfo.sacSetup & SAC_InConsole)!=0 ){
1170 # if CIO_WIN_WC_XLATE==1
1171 # define SHELL_GULP 150 /* Count of WCHARS to be gulped at a time */
1172 WCHAR wcBuf[SHELL_GULP+1];
1173 int lend = 0, noc = 0;
1174 if( ncMax > 0 ) cBuf[0] = 0;
1175 while( noc < ncMax-8-1 && !lend ){
1176 /* There is room for at least 2 more characters and a 0-terminator. */
1177 int na = (ncMax > SHELL_GULP*4+1 + noc)? SHELL_GULP : (ncMax-1 - noc)/4;
1178 # undef SHELL_GULP
1179 DWORD nbr = 0;
1180 BOOL bRC = ReadConsoleW(consoleInfo.pstSetup[0].hx, wcBuf, na, &nbr, 0);
1181 if( bRC && nbr>0 && (wcBuf[nbr-1]&0xF800)==0xD800 ){
1182 /* Last WHAR read is first of a UTF-16 surrogate pair. Grab its mate. */
1183 DWORD nbrx;
1184 bRC &= ReadConsoleW(consoleInfo.pstSetup[0].hx, wcBuf+nbr, 1, &nbrx, 0);
1185 if( bRC ) nbr += nbrx;
1186 }
1187 if( !bRC || (noc==0 && nbr==0) ) return 0;
1188 if( nbr > 0 ){
1189 int nmb = WideCharToMultiByte(CP_UTF8, 0, wcBuf,nbr,0,0,0,0);
1190 if( nmb != 0 && noc+nmb <= ncMax ){
1191 int iseg = noc;
1192 nmb = WideCharToMultiByte(CP_UTF8, 0, wcBuf,nbr,cBuf+noc,nmb,0,0);
1193 noc += nmb;
1194 /* Fixup line-ends as coded by Windows for CR (or "Enter".)
1195 ** This is done without regard for any setMode{Text,Binary}()
1196 ** call that might have been done on the interactive input.
1197 */
1198 if( noc > 0 ){
1199 if( cBuf[noc-1]=='\n' ){
1200 lend = 1;
1201 if( noc > 1 && cBuf[noc-2]=='\r' ) cBuf[--noc-1] = '\n';
1202 }
1203 }
1204 /* Check for ^Z (anywhere in line) too, to act as EOF. */
1205 while( iseg < noc ){
1206 if( cBuf[iseg]=='\x1a' ){
1207 noc = iseg; /* Chop ^Z and anything following. */
1208 lend = 1; /* Counts as end of line too. */
1209 break;
1210 }
1211 ++iseg;
1212 }
1213 }else break; /* Drop apparent garbage in. (Could assert.) */
1214 }else break;
1215 }
1216 /* If got nothing, (after ^Z chop), must be at end-of-file. */
1217 if( noc > 0 ){
1218 cBuf[noc] = 0;
1219 return cBuf;
1220 }else return 0;
1221 # endif
1222 }else{
1223 # endif
1224 return fgets(cBuf, ncMax, pfIn);
1225 # if CIO_WIN_WC_XLATE
1226 }
1227 # endif
1228 }
1229 #endif /* !defined(SQLITE_CIO_NO_TRANSLATE) */
1230
1231 #undef SHELL_INVALID_FILE_PTR
1232
1233 /************************* End ../ext/consio/console_io.c ********************/
1234
1235 #ifndef SQLITE_SHELL_FIDDLE
1236
1237 /* From here onward, fgets() is redirected to the console_io library. */
1238 #undef fgets
1239 # define fgets(b,n,f) fGetsUtf8(b,n,f)
1240 /*
1241 * Define macros for emitting output text in various ways:
1242 * sputz(s, z) => emit 0-terminated string z to given stream s
1243 * sputf(s, f, ...) => emit varargs per format f to given stream s
1244 * oputz(z) => emit 0-terminated string z to default stream
1245 * oputf(f, ...) => emit varargs per format f to default stream
1246 * eputz(z) => emit 0-terminated string z to error stream
1247 * eputf(f, ...) => emit varargs per format f to error stream
1248 * oputb(b, n) => emit char buffer b[0..n-1] to default stream
1249 *
1250 * Note that the default stream is whatever has been last set via:
1251 * setOutputStream(FILE *pf)
1252 * This is normally the stream that CLI normal output goes to.
1253 * For the stand-alone CLI, it is stdout with no .output redirect.
1254 */
1255 # define sputz(s,z) fPutsUtf8(z,s)
1256 # define sputf fPrintfUtf8
1257 # define oputz(z) oPutsUtf8(z)
1258 # define oputf oPrintfUtf8
1259 # define eputz(z) ePutsUtf8(z)
1260 # define eputf ePrintfUtf8
1261 # define oputb(buf,na) oPutbUtf8(buf,na)
1262
1263 #else
1264 /* For Fiddle, all console handling and emit redirection is omitted. */
1265 # define sputz(fp,z) fputs(z,fp)
1266 # define sputf(fp,fmt, ...) fprintf(fp,fmt,__VA_ARGS__)
1267 # define oputz(z) fputs(z,stdout)
1268 # define oputf(fmt, ...) printf(fmt,__VA_ARGS__)
1269 # define eputz(z) fputs(z,stderr)
1270 # define eputf(fmt, ...) fprintf(stderr,fmt,__VA_ARGS__)
1271 # define oputb(buf,na) fwrite(buf,1,na,stdout)
1272 #endif
1273
1274 /* True if the timer is enabled */
1275 static int enableTimer = 0;
1276
1277 /* A version of strcmp() that works with NULL values */
cli_strcmp(const char * a,const char * b)1278 static int cli_strcmp(const char *a, const char *b){
1279 if( a==0 ) a = "";
1280 if( b==0 ) b = "";
1281 return strcmp(a,b);
1282 }
cli_strncmp(const char * a,const char * b,size_t n)1283 static int cli_strncmp(const char *a, const char *b, size_t n){
1284 if( a==0 ) a = "";
1285 if( b==0 ) b = "";
1286 return strncmp(a,b,n);
1287 }
1288
1289 /* Return the current wall-clock time */
timeOfDay(void)1290 static sqlite3_int64 timeOfDay(void){
1291 static sqlite3_vfs *clockVfs = 0;
1292 sqlite3_int64 t;
1293 if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0);
1294 if( clockVfs==0 ) return 0; /* Never actually happens */
1295 if( clockVfs->iVersion>=2 && clockVfs->xCurrentTimeInt64!=0 ){
1296 clockVfs->xCurrentTimeInt64(clockVfs, &t);
1297 }else{
1298 double r;
1299 clockVfs->xCurrentTime(clockVfs, &r);
1300 t = (sqlite3_int64)(r*86400000.0);
1301 }
1302 return t;
1303 }
1304
1305 #if !defined(_WIN32) && !defined(WIN32) && !defined(__minux)
1306 #include <sys/time.h>
1307 #include <sys/resource.h>
1308
1309 /* VxWorks does not support getrusage() as far as we can determine */
1310 #if defined(_WRS_KERNEL) || defined(__RTP__)
1311 struct rusage {
1312 struct timeval ru_utime; /* user CPU time used */
1313 struct timeval ru_stime; /* system CPU time used */
1314 };
1315 #define getrusage(A,B) memset(B,0,sizeof(*B))
1316 #endif
1317
1318 /* Saved resource information for the beginning of an operation */
1319 static struct rusage sBegin; /* CPU time at start */
1320 static sqlite3_int64 iBegin; /* Wall-clock time at start */
1321
1322 /*
1323 ** Begin timing an operation
1324 */
beginTimer(void)1325 static void beginTimer(void){
1326 if( enableTimer ){
1327 getrusage(RUSAGE_SELF, &sBegin);
1328 iBegin = timeOfDay();
1329 }
1330 }
1331
1332 /* Return the difference of two time_structs in seconds */
timeDiff(struct timeval * pStart,struct timeval * pEnd)1333 static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
1334 return (pEnd->tv_usec - pStart->tv_usec)*0.000001 +
1335 (double)(pEnd->tv_sec - pStart->tv_sec);
1336 }
1337
1338 /*
1339 ** Print the timing results.
1340 */
endTimer(void)1341 static void endTimer(void){
1342 if( enableTimer ){
1343 sqlite3_int64 iEnd = timeOfDay();
1344 struct rusage sEnd;
1345 getrusage(RUSAGE_SELF, &sEnd);
1346 sputf(stdout, "Run Time: real %.3f user %f sys %f\n",
1347 (iEnd - iBegin)*0.001,
1348 timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
1349 timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
1350 }
1351 }
1352
1353 #define BEGIN_TIMER beginTimer()
1354 #define END_TIMER endTimer()
1355 #define HAS_TIMER 1
1356
1357 #elif (defined(_WIN32) || defined(WIN32))
1358
1359 /* Saved resource information for the beginning of an operation */
1360 static HANDLE hProcess;
1361 static FILETIME ftKernelBegin;
1362 static FILETIME ftUserBegin;
1363 static sqlite3_int64 ftWallBegin;
1364 typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME,
1365 LPFILETIME, LPFILETIME);
1366 static GETPROCTIMES getProcessTimesAddr = NULL;
1367
1368 /*
1369 ** Check to see if we have timer support. Return 1 if necessary
1370 ** support found (or found previously).
1371 */
hasTimer(void)1372 static int hasTimer(void){
1373 if( getProcessTimesAddr ){
1374 return 1;
1375 } else {
1376 #if !SQLITE_OS_WINRT
1377 /* GetProcessTimes() isn't supported in WIN95 and some other Windows
1378 ** versions. See if the version we are running on has it, and if it
1379 ** does, save off a pointer to it and the current process handle.
1380 */
1381 hProcess = GetCurrentProcess();
1382 if( hProcess ){
1383 HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll"));
1384 if( NULL != hinstLib ){
1385 getProcessTimesAddr =
1386 (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes");
1387 if( NULL != getProcessTimesAddr ){
1388 return 1;
1389 }
1390 FreeLibrary(hinstLib);
1391 }
1392 }
1393 #endif
1394 }
1395 return 0;
1396 }
1397
1398 /*
1399 ** Begin timing an operation
1400 */
beginTimer(void)1401 static void beginTimer(void){
1402 if( enableTimer && getProcessTimesAddr ){
1403 FILETIME ftCreation, ftExit;
1404 getProcessTimesAddr(hProcess,&ftCreation,&ftExit,
1405 &ftKernelBegin,&ftUserBegin);
1406 ftWallBegin = timeOfDay();
1407 }
1408 }
1409
1410 /* Return the difference of two FILETIME structs in seconds */
timeDiff(FILETIME * pStart,FILETIME * pEnd)1411 static double timeDiff(FILETIME *pStart, FILETIME *pEnd){
1412 sqlite_int64 i64Start = *((sqlite_int64 *) pStart);
1413 sqlite_int64 i64End = *((sqlite_int64 *) pEnd);
1414 return (double) ((i64End - i64Start) / 10000000.0);
1415 }
1416
1417 /*
1418 ** Print the timing results.
1419 */
endTimer(void)1420 static void endTimer(void){
1421 if( enableTimer && getProcessTimesAddr){
1422 FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
1423 sqlite3_int64 ftWallEnd = timeOfDay();
1424 getProcessTimesAddr(hProcess,&ftCreation,&ftExit,&ftKernelEnd,&ftUserEnd);
1425 sputf(stdout, "Run Time: real %.3f user %f sys %f\n",
1426 (ftWallEnd - ftWallBegin)*0.001,
1427 timeDiff(&ftUserBegin, &ftUserEnd),
1428 timeDiff(&ftKernelBegin, &ftKernelEnd));
1429 }
1430 }
1431
1432 #define BEGIN_TIMER beginTimer()
1433 #define END_TIMER endTimer()
1434 #define HAS_TIMER hasTimer()
1435
1436 #else
1437 #define BEGIN_TIMER
1438 #define END_TIMER
1439 #define HAS_TIMER 0
1440 #endif
1441
1442 /*
1443 ** Used to prevent warnings about unused parameters
1444 */
1445 #define UNUSED_PARAMETER(x) (void)(x)
1446
1447 /*
1448 ** Number of elements in an array
1449 */
1450 #define ArraySize(X) (int)(sizeof(X)/sizeof(X[0]))
1451
1452 /*
1453 ** If the following flag is set, then command execution stops
1454 ** at an error if we are not interactive.
1455 */
1456 static int bail_on_error = 0;
1457
1458 /*
1459 ** Treat stdin as an interactive input if the following variable
1460 ** is true. Otherwise, assume stdin is connected to a file or pipe.
1461 */
1462 static int stdin_is_interactive = 1;
1463
1464 /*
1465 ** On Windows systems we need to know if standard output is a console
1466 ** in order to show that UTF-16 translation is done in the sign-on
1467 ** banner. The following variable is true if it is the console.
1468 */
1469 static int stdout_is_console = 1;
1470
1471 /*
1472 ** The following is the open SQLite database. We make a pointer
1473 ** to this database a static variable so that it can be accessed
1474 ** by the SIGINT handler to interrupt database processing.
1475 */
1476 static sqlite3 *globalDb = 0;
1477
1478 /*
1479 ** True if an interrupt (Control-C) has been received.
1480 */
1481 static volatile int seenInterrupt = 0;
1482
1483 /*
1484 ** This is the name of our program. It is set in main(), used
1485 ** in a number of other places, mostly for error messages.
1486 */
1487 static char *Argv0;
1488
1489 /*
1490 ** Prompt strings. Initialized in main. Settable with
1491 ** .prompt main continue
1492 */
1493 #define PROMPT_LEN_MAX 20
1494 /* First line prompt. default: "sqlite> " */
1495 static char mainPrompt[PROMPT_LEN_MAX];
1496 /* Continuation prompt. default: " ...> " */
1497 static char continuePrompt[PROMPT_LEN_MAX];
1498
1499 /* This is variant of the standard-library strncpy() routine with the
1500 ** one change that the destination string is always zero-terminated, even
1501 ** if there is no zero-terminator in the first n-1 characters of the source
1502 ** string.
1503 */
shell_strncpy(char * dest,const char * src,size_t n)1504 static char *shell_strncpy(char *dest, const char *src, size_t n){
1505 size_t i;
1506 for(i=0; i<n-1 && src[i]!=0; i++) dest[i] = src[i];
1507 dest[i] = 0;
1508 return dest;
1509 }
1510
1511 /*
1512 ** Optionally disable dynamic continuation prompt.
1513 ** Unless disabled, the continuation prompt shows open SQL lexemes if any,
1514 ** or open parentheses level if non-zero, or continuation prompt as set.
1515 ** This facility interacts with the scanner and process_input() where the
1516 ** below 5 macros are used.
1517 */
1518 #ifdef SQLITE_OMIT_DYNAPROMPT
1519 # define CONTINUATION_PROMPT continuePrompt
1520 # define CONTINUE_PROMPT_RESET
1521 # define CONTINUE_PROMPT_AWAITS(p,s)
1522 # define CONTINUE_PROMPT_AWAITC(p,c)
1523 # define CONTINUE_PAREN_INCR(p,n)
1524 # define CONTINUE_PROMPT_PSTATE 0
1525 typedef void *t_NoDynaPrompt;
1526 # define SCAN_TRACKER_REFTYPE t_NoDynaPrompt
1527 #else
1528 # define CONTINUATION_PROMPT dynamicContinuePrompt()
1529 # define CONTINUE_PROMPT_RESET \
1530 do {setLexemeOpen(&dynPrompt,0,0); trackParenLevel(&dynPrompt,0);} while(0)
1531 # define CONTINUE_PROMPT_AWAITS(p,s) \
1532 if(p && stdin_is_interactive) setLexemeOpen(p, s, 0)
1533 # define CONTINUE_PROMPT_AWAITC(p,c) \
1534 if(p && stdin_is_interactive) setLexemeOpen(p, 0, c)
1535 # define CONTINUE_PAREN_INCR(p,n) \
1536 if(p && stdin_is_interactive) (trackParenLevel(p,n))
1537 # define CONTINUE_PROMPT_PSTATE (&dynPrompt)
1538 typedef struct DynaPrompt *t_DynaPromptRef;
1539 # define SCAN_TRACKER_REFTYPE t_DynaPromptRef
1540
1541 static struct DynaPrompt {
1542 char dynamicPrompt[PROMPT_LEN_MAX];
1543 char acAwait[2];
1544 int inParenLevel;
1545 char *zScannerAwaits;
1546 } dynPrompt = { {0}, {0}, 0, 0 };
1547
1548 /* Record parenthesis nesting level change, or force level to 0. */
trackParenLevel(struct DynaPrompt * p,int ni)1549 static void trackParenLevel(struct DynaPrompt *p, int ni){
1550 p->inParenLevel += ni;
1551 if( ni==0 ) p->inParenLevel = 0;
1552 p->zScannerAwaits = 0;
1553 }
1554
1555 /* Record that a lexeme is opened, or closed with args==0. */
setLexemeOpen(struct DynaPrompt * p,char * s,char c)1556 static void setLexemeOpen(struct DynaPrompt *p, char *s, char c){
1557 if( s!=0 || c==0 ){
1558 p->zScannerAwaits = s;
1559 p->acAwait[0] = 0;
1560 }else{
1561 p->acAwait[0] = c;
1562 p->zScannerAwaits = p->acAwait;
1563 }
1564 }
1565
1566 /* Upon demand, derive the continuation prompt to display. */
dynamicContinuePrompt(void)1567 static char *dynamicContinuePrompt(void){
1568 if( continuePrompt[0]==0
1569 || (dynPrompt.zScannerAwaits==0 && dynPrompt.inParenLevel == 0) ){
1570 return continuePrompt;
1571 }else{
1572 if( dynPrompt.zScannerAwaits ){
1573 size_t ncp = strlen(continuePrompt);
1574 size_t ndp = strlen(dynPrompt.zScannerAwaits);
1575 if( ndp > ncp-3 ) return continuePrompt;
1576 strcpy(dynPrompt.dynamicPrompt, dynPrompt.zScannerAwaits);
1577 while( ndp<3 ) dynPrompt.dynamicPrompt[ndp++] = ' ';
1578 shell_strncpy(dynPrompt.dynamicPrompt+3, continuePrompt+3,
1579 PROMPT_LEN_MAX-4);
1580 }else{
1581 if( dynPrompt.inParenLevel>9 ){
1582 shell_strncpy(dynPrompt.dynamicPrompt, "(..", 4);
1583 }else if( dynPrompt.inParenLevel<0 ){
1584 shell_strncpy(dynPrompt.dynamicPrompt, ")x!", 4);
1585 }else{
1586 shell_strncpy(dynPrompt.dynamicPrompt, "(x.", 4);
1587 dynPrompt.dynamicPrompt[2] = (char)('0'+dynPrompt.inParenLevel);
1588 }
1589 shell_strncpy(dynPrompt.dynamicPrompt+3, continuePrompt+3,
1590 PROMPT_LEN_MAX-4);
1591 }
1592 }
1593 return dynPrompt.dynamicPrompt;
1594 }
1595 #endif /* !defined(SQLITE_OMIT_DYNAPROMPT) */
1596
1597 /* Indicate out-of-memory and exit. */
shell_out_of_memory(void)1598 static void shell_out_of_memory(void){
1599 eputz("Error: out of memory\n");
1600 exit(1);
1601 }
1602
1603 /* Check a pointer to see if it is NULL. If it is NULL, exit with an
1604 ** out-of-memory error.
1605 */
shell_check_oom(const void * p)1606 static void shell_check_oom(const void *p){
1607 if( p==0 ) shell_out_of_memory();
1608 }
1609
1610 /*
1611 ** Write I/O traces to the following stream.
1612 */
1613 #ifdef SQLITE_ENABLE_IOTRACE
1614 static FILE *iotrace = 0;
1615 #endif
1616
1617 /*
1618 ** This routine works like printf in that its first argument is a
1619 ** format string and subsequent arguments are values to be substituted
1620 ** in place of % fields. The result of formatting this string
1621 ** is written to iotrace.
1622 */
1623 #ifdef SQLITE_ENABLE_IOTRACE
iotracePrintf(const char * zFormat,...)1624 static void SQLITE_CDECL iotracePrintf(const char *zFormat, ...){
1625 va_list ap;
1626 char *z;
1627 if( iotrace==0 ) return;
1628 va_start(ap, zFormat);
1629 z = sqlite3_vmprintf(zFormat, ap);
1630 va_end(ap);
1631 sputf(iotrace, "%s", z);
1632 sqlite3_free(z);
1633 }
1634 #endif
1635
1636 /*
1637 ** Output string zUtf to Out stream as w characters. If w is negative,
1638 ** then right-justify the text. W is the width in UTF-8 characters, not
1639 ** in bytes. This is different from the %*.*s specification in printf
1640 ** since with %*.*s the width is measured in bytes, not characters.
1641 */
utf8_width_print(int w,const char * zUtf)1642 static void utf8_width_print(int w, const char *zUtf){
1643 int i;
1644 int n;
1645 int aw = w<0 ? -w : w;
1646 if( zUtf==0 ) zUtf = "";
1647 for(i=n=0; zUtf[i]; i++){
1648 if( (zUtf[i]&0xc0)!=0x80 ){
1649 n++;
1650 if( n==aw ){
1651 do{ i++; }while( (zUtf[i]&0xc0)==0x80 );
1652 break;
1653 }
1654 }
1655 }
1656 if( n>=aw ){
1657 oputf("%.*s", i, zUtf);
1658 }else if( w<0 ){
1659 oputf("%*s%s", aw-n, "", zUtf);
1660 }else{
1661 oputf("%s%*s", zUtf, aw-n, "");
1662 }
1663 }
1664
1665
1666 /*
1667 ** Determines if a string is a number of not.
1668 */
isNumber(const char * z,int * realnum)1669 static int isNumber(const char *z, int *realnum){
1670 if( *z=='-' || *z=='+' ) z++;
1671 if( !IsDigit(*z) ){
1672 return 0;
1673 }
1674 z++;
1675 if( realnum ) *realnum = 0;
1676 while( IsDigit(*z) ){ z++; }
1677 if( *z=='.' ){
1678 z++;
1679 if( !IsDigit(*z) ) return 0;
1680 while( IsDigit(*z) ){ z++; }
1681 if( realnum ) *realnum = 1;
1682 }
1683 if( *z=='e' || *z=='E' ){
1684 z++;
1685 if( *z=='+' || *z=='-' ) z++;
1686 if( !IsDigit(*z) ) return 0;
1687 while( IsDigit(*z) ){ z++; }
1688 if( realnum ) *realnum = 1;
1689 }
1690 return *z==0;
1691 }
1692
1693 /*
1694 ** Compute a string length that is limited to what can be stored in
1695 ** lower 30 bits of a 32-bit signed integer.
1696 */
strlen30(const char * z)1697 static int strlen30(const char *z){
1698 const char *z2 = z;
1699 while( *z2 ){ z2++; }
1700 return 0x3fffffff & (int)(z2 - z);
1701 }
1702
1703 /*
1704 ** Return the length of a string in characters. Multibyte UTF8 characters
1705 ** count as a single character.
1706 */
strlenChar(const char * z)1707 static int strlenChar(const char *z){
1708 int n = 0;
1709 while( *z ){
1710 if( (0xc0&*(z++))!=0x80 ) n++;
1711 }
1712 return n;
1713 }
1714
1715 /*
1716 ** Return open FILE * if zFile exists, can be opened for read
1717 ** and is an ordinary file or a character stream source.
1718 ** Otherwise return 0.
1719 */
openChrSource(const char * zFile)1720 static FILE * openChrSource(const char *zFile){
1721 #if defined(_WIN32) || defined(WIN32)
1722 struct __stat64 x = {0};
1723 # define STAT_CHR_SRC(mode) ((mode & (_S_IFCHR|_S_IFIFO|_S_IFREG))!=0)
1724 /* On Windows, open first, then check the stream nature. This order
1725 ** is necessary because _stat() and sibs, when checking a named pipe,
1726 ** effectively break the pipe as its supplier sees it. */
1727 FILE *rv = fopen(zFile, "rb");
1728 if( rv==0 ) return 0;
1729 if( _fstat64(_fileno(rv), &x) != 0
1730 || !STAT_CHR_SRC(x.st_mode)){
1731 fclose(rv);
1732 rv = 0;
1733 }
1734 return rv;
1735 #else
1736 struct stat x = {0};
1737 int rc = stat(zFile, &x);
1738 # define STAT_CHR_SRC(mode) (S_ISREG(mode)||S_ISFIFO(mode)||S_ISCHR(mode))
1739 if( rc!=0 ) return 0;
1740 if( STAT_CHR_SRC(x.st_mode) ){
1741 return fopen(zFile, "rb");
1742 }else{
1743 return 0;
1744 }
1745 #endif
1746 #undef STAT_CHR_SRC
1747 }
1748
1749 /*
1750 ** This routine reads a line of text from FILE in, stores
1751 ** the text in memory obtained from malloc() and returns a pointer
1752 ** to the text. NULL is returned at end of file, or if malloc()
1753 ** fails.
1754 **
1755 ** If zLine is not NULL then it is a malloced buffer returned from
1756 ** a previous call to this routine that may be reused.
1757 */
local_getline(char * zLine,FILE * in)1758 static char *local_getline(char *zLine, FILE *in){
1759 int nLine = zLine==0 ? 0 : 100;
1760 int n = 0;
1761
1762 while( 1 ){
1763 if( n+100>nLine ){
1764 nLine = nLine*2 + 100;
1765 zLine = realloc(zLine, nLine);
1766 shell_check_oom(zLine);
1767 }
1768 if( fgets(&zLine[n], nLine - n, in)==0 ){
1769 if( n==0 ){
1770 free(zLine);
1771 return 0;
1772 }
1773 zLine[n] = 0;
1774 break;
1775 }
1776 while( zLine[n] ) n++;
1777 if( n>0 && zLine[n-1]=='\n' ){
1778 n--;
1779 if( n>0 && zLine[n-1]=='\r' ) n--;
1780 zLine[n] = 0;
1781 break;
1782 }
1783 }
1784 return zLine;
1785 }
1786
1787 /*
1788 ** Retrieve a single line of input text.
1789 **
1790 ** If in==0 then read from standard input and prompt before each line.
1791 ** If isContinuation is true, then a continuation prompt is appropriate.
1792 ** If isContinuation is zero, then the main prompt should be used.
1793 **
1794 ** If zPrior is not NULL then it is a buffer from a prior call to this
1795 ** routine that can be reused.
1796 **
1797 ** The result is stored in space obtained from malloc() and must either
1798 ** be freed by the caller or else passed back into this routine via the
1799 ** zPrior argument for reuse.
1800 */
1801 #ifndef SQLITE_SHELL_FIDDLE
one_input_line(FILE * in,char * zPrior,int isContinuation)1802 static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
1803 char *zPrompt;
1804 char *zResult;
1805 if( in!=0 ){
1806 zResult = local_getline(zPrior, in);
1807 }else{
1808 zPrompt = isContinuation ? CONTINUATION_PROMPT : mainPrompt;
1809 #if SHELL_USE_LOCAL_GETLINE
1810 sputz(stdout, zPrompt);
1811 fflush(stdout);
1812 do{
1813 zResult = local_getline(zPrior, stdin);
1814 zPrior = 0;
1815 /* ^C trap creates a false EOF, so let "interrupt" thread catch up. */
1816 if( zResult==0 ) sqlite3_sleep(50);
1817 }while( zResult==0 && seenInterrupt>0 );
1818 #else
1819 free(zPrior);
1820 zResult = shell_readline(zPrompt);
1821 while( zResult==0 ){
1822 /* ^C trap creates a false EOF, so let "interrupt" thread catch up. */
1823 sqlite3_sleep(50);
1824 if( seenInterrupt==0 ) break;
1825 zResult = shell_readline("");
1826 }
1827 if( zResult && *zResult ) shell_add_history(zResult);
1828 #endif
1829 }
1830 return zResult;
1831 }
1832 #endif /* !SQLITE_SHELL_FIDDLE */
1833
1834 /*
1835 ** Return the value of a hexadecimal digit. Return -1 if the input
1836 ** is not a hex digit.
1837 */
hexDigitValue(char c)1838 static int hexDigitValue(char c){
1839 if( c>='0' && c<='9' ) return c - '0';
1840 if( c>='a' && c<='f' ) return c - 'a' + 10;
1841 if( c>='A' && c<='F' ) return c - 'A' + 10;
1842 return -1;
1843 }
1844
1845 /*
1846 ** Interpret zArg as an integer value, possibly with suffixes.
1847 */
integerValue(const char * zArg)1848 static sqlite3_int64 integerValue(const char *zArg){
1849 sqlite3_int64 v = 0;
1850 static const struct { char *zSuffix; int iMult; } aMult[] = {
1851 { "KiB", 1024 },
1852 { "MiB", 1024*1024 },
1853 { "GiB", 1024*1024*1024 },
1854 { "KB", 1000 },
1855 { "MB", 1000000 },
1856 { "GB", 1000000000 },
1857 { "K", 1000 },
1858 { "M", 1000000 },
1859 { "G", 1000000000 },
1860 };
1861 int i;
1862 int isNeg = 0;
1863 if( zArg[0]=='-' ){
1864 isNeg = 1;
1865 zArg++;
1866 }else if( zArg[0]=='+' ){
1867 zArg++;
1868 }
1869 if( zArg[0]=='0' && zArg[1]=='x' ){
1870 int x;
1871 zArg += 2;
1872 while( (x = hexDigitValue(zArg[0]))>=0 ){
1873 v = (v<<4) + x;
1874 zArg++;
1875 }
1876 }else{
1877 while( IsDigit(zArg[0]) ){
1878 v = v*10 + zArg[0] - '0';
1879 zArg++;
1880 }
1881 }
1882 for(i=0; i<ArraySize(aMult); i++){
1883 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
1884 v *= aMult[i].iMult;
1885 break;
1886 }
1887 }
1888 return isNeg? -v : v;
1889 }
1890
1891 /*
1892 ** A variable length string to which one can append text.
1893 */
1894 typedef struct ShellText ShellText;
1895 struct ShellText {
1896 char *z;
1897 int n;
1898 int nAlloc;
1899 };
1900
1901 /*
1902 ** Initialize and destroy a ShellText object
1903 */
initText(ShellText * p)1904 static void initText(ShellText *p){
1905 memset(p, 0, sizeof(*p));
1906 }
freeText(ShellText * p)1907 static void freeText(ShellText *p){
1908 free(p->z);
1909 initText(p);
1910 }
1911
1912 /* zIn is either a pointer to a NULL-terminated string in memory obtained
1913 ** from malloc(), or a NULL pointer. The string pointed to by zAppend is
1914 ** added to zIn, and the result returned in memory obtained from malloc().
1915 ** zIn, if it was not NULL, is freed.
1916 **
1917 ** If the third argument, quote, is not '\0', then it is used as a
1918 ** quote character for zAppend.
1919 */
appendText(ShellText * p,const char * zAppend,char quote)1920 static void appendText(ShellText *p, const char *zAppend, char quote){
1921 i64 len;
1922 i64 i;
1923 i64 nAppend = strlen30(zAppend);
1924
1925 len = nAppend+p->n+1;
1926 if( quote ){
1927 len += 2;
1928 for(i=0; i<nAppend; i++){
1929 if( zAppend[i]==quote ) len++;
1930 }
1931 }
1932
1933 if( p->z==0 || p->n+len>=p->nAlloc ){
1934 p->nAlloc = p->nAlloc*2 + len + 20;
1935 p->z = realloc(p->z, p->nAlloc);
1936 shell_check_oom(p->z);
1937 }
1938
1939 if( quote ){
1940 char *zCsr = p->z+p->n;
1941 *zCsr++ = quote;
1942 for(i=0; i<nAppend; i++){
1943 *zCsr++ = zAppend[i];
1944 if( zAppend[i]==quote ) *zCsr++ = quote;
1945 }
1946 *zCsr++ = quote;
1947 p->n = (int)(zCsr - p->z);
1948 *zCsr = '\0';
1949 }else{
1950 memcpy(p->z+p->n, zAppend, nAppend);
1951 p->n += nAppend;
1952 p->z[p->n] = '\0';
1953 }
1954 }
1955
1956 /*
1957 ** Attempt to determine if identifier zName needs to be quoted, either
1958 ** because it contains non-alphanumeric characters, or because it is an
1959 ** SQLite keyword. Be conservative in this estimate: When in doubt assume
1960 ** that quoting is required.
1961 **
1962 ** Return '"' if quoting is required. Return 0 if no quoting is required.
1963 */
quoteChar(const char * zName)1964 static char quoteChar(const char *zName){
1965 int i;
1966 if( zName==0 ) return '"';
1967 if( !isalpha((unsigned char)zName[0]) && zName[0]!='_' ) return '"';
1968 for(i=0; zName[i]; i++){
1969 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ) return '"';
1970 }
1971 return sqlite3_keyword_check(zName, i) ? '"' : 0;
1972 }
1973
1974 /*
1975 ** Construct a fake object name and column list to describe the structure
1976 ** of the view, virtual table, or table valued function zSchema.zName.
1977 */
shellFakeSchema(sqlite3 * db,const char * zSchema,const char * zName)1978 static char *shellFakeSchema(
1979 sqlite3 *db, /* The database connection containing the vtab */
1980 const char *zSchema, /* Schema of the database holding the vtab */
1981 const char *zName /* The name of the virtual table */
1982 ){
1983 sqlite3_stmt *pStmt = 0;
1984 char *zSql;
1985 ShellText s;
1986 char cQuote;
1987 char *zDiv = "(";
1988 int nRow = 0;
1989
1990 zSql = sqlite3_mprintf("PRAGMA \"%w\".table_info=%Q;",
1991 zSchema ? zSchema : "main", zName);
1992 shell_check_oom(zSql);
1993 sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
1994 sqlite3_free(zSql);
1995 initText(&s);
1996 if( zSchema ){
1997 cQuote = quoteChar(zSchema);
1998 if( cQuote && sqlite3_stricmp(zSchema,"temp")==0 ) cQuote = 0;
1999 appendText(&s, zSchema, cQuote);
2000 appendText(&s, ".", 0);
2001 }
2002 cQuote = quoteChar(zName);
2003 appendText(&s, zName, cQuote);
2004 while( sqlite3_step(pStmt)==SQLITE_ROW ){
2005 const char *zCol = (const char*)sqlite3_column_text(pStmt, 1);
2006 nRow++;
2007 appendText(&s, zDiv, 0);
2008 zDiv = ",";
2009 if( zCol==0 ) zCol = "";
2010 cQuote = quoteChar(zCol);
2011 appendText(&s, zCol, cQuote);
2012 }
2013 appendText(&s, ")", 0);
2014 sqlite3_finalize(pStmt);
2015 if( nRow==0 ){
2016 freeText(&s);
2017 s.z = 0;
2018 }
2019 return s.z;
2020 }
2021
2022 /*
2023 ** SQL function: strtod(X)
2024 **
2025 ** Use the C-library strtod() function to convert string X into a double.
2026 ** Used for comparing the accuracy of SQLite's internal text-to-float conversion
2027 ** routines against the C-library.
2028 */
shellStrtod(sqlite3_context * pCtx,int nVal,sqlite3_value ** apVal)2029 static void shellStrtod(
2030 sqlite3_context *pCtx,
2031 int nVal,
2032 sqlite3_value **apVal
2033 ){
2034 char *z = (char*)sqlite3_value_text(apVal[0]);
2035 UNUSED_PARAMETER(nVal);
2036 if( z==0 ) return;
2037 sqlite3_result_double(pCtx, strtod(z,0));
2038 }
2039
2040 /*
2041 ** SQL function: dtostr(X)
2042 **
2043 ** Use the C-library printf() function to convert real value X into a string.
2044 ** Used for comparing the accuracy of SQLite's internal float-to-text conversion
2045 ** routines against the C-library.
2046 */
shellDtostr(sqlite3_context * pCtx,int nVal,sqlite3_value ** apVal)2047 static void shellDtostr(
2048 sqlite3_context *pCtx,
2049 int nVal,
2050 sqlite3_value **apVal
2051 ){
2052 double r = sqlite3_value_double(apVal[0]);
2053 int n = nVal>=2 ? sqlite3_value_int(apVal[1]) : 26;
2054 char z[400];
2055 if( n<1 ) n = 1;
2056 if( n>350 ) n = 350;
2057 sqlite3_snprintf(sizeof(z), z, "%#+.*e", n, r);
2058 sqlite3_result_text(pCtx, z, -1, SQLITE_TRANSIENT);
2059 }
2060
2061
2062 /*
2063 ** SQL function: shell_module_schema(X)
2064 **
2065 ** Return a fake schema for the table-valued function or eponymous virtual
2066 ** table X.
2067 */
shellModuleSchema(sqlite3_context * pCtx,int nVal,sqlite3_value ** apVal)2068 static void shellModuleSchema(
2069 sqlite3_context *pCtx,
2070 int nVal,
2071 sqlite3_value **apVal
2072 ){
2073 const char *zName;
2074 char *zFake;
2075 UNUSED_PARAMETER(nVal);
2076 zName = (const char*)sqlite3_value_text(apVal[0]);
2077 zFake = zName? shellFakeSchema(sqlite3_context_db_handle(pCtx), 0, zName) : 0;
2078 if( zFake ){
2079 sqlite3_result_text(pCtx, sqlite3_mprintf("/* %s */", zFake),
2080 -1, sqlite3_free);
2081 free(zFake);
2082 }
2083 }
2084
2085 /*
2086 ** SQL function: shell_add_schema(S,X)
2087 **
2088 ** Add the schema name X to the CREATE statement in S and return the result.
2089 ** Examples:
2090 **
2091 ** CREATE TABLE t1(x) -> CREATE TABLE xyz.t1(x);
2092 **
2093 ** Also works on
2094 **
2095 ** CREATE INDEX
2096 ** CREATE UNIQUE INDEX
2097 ** CREATE VIEW
2098 ** CREATE TRIGGER
2099 ** CREATE VIRTUAL TABLE
2100 **
2101 ** This UDF is used by the .schema command to insert the schema name of
2102 ** attached databases into the middle of the sqlite_schema.sql field.
2103 */
shellAddSchemaName(sqlite3_context * pCtx,int nVal,sqlite3_value ** apVal)2104 static void shellAddSchemaName(
2105 sqlite3_context *pCtx,
2106 int nVal,
2107 sqlite3_value **apVal
2108 ){
2109 static const char *aPrefix[] = {
2110 "TABLE",
2111 "INDEX",
2112 "UNIQUE INDEX",
2113 "VIEW",
2114 "TRIGGER",
2115 "VIRTUAL TABLE"
2116 };
2117 int i = 0;
2118 const char *zIn = (const char*)sqlite3_value_text(apVal[0]);
2119 const char *zSchema = (const char*)sqlite3_value_text(apVal[1]);
2120 const char *zName = (const char*)sqlite3_value_text(apVal[2]);
2121 sqlite3 *db = sqlite3_context_db_handle(pCtx);
2122 UNUSED_PARAMETER(nVal);
2123 if( zIn!=0 && cli_strncmp(zIn, "CREATE ", 7)==0 ){
2124 for(i=0; i<ArraySize(aPrefix); i++){
2125 int n = strlen30(aPrefix[i]);
2126 if( cli_strncmp(zIn+7, aPrefix[i], n)==0 && zIn[n+7]==' ' ){
2127 char *z = 0;
2128 char *zFake = 0;
2129 if( zSchema ){
2130 char cQuote = quoteChar(zSchema);
2131 if( cQuote && sqlite3_stricmp(zSchema,"temp")!=0 ){
2132 z = sqlite3_mprintf("%.*s \"%w\".%s", n+7, zIn, zSchema, zIn+n+8);
2133 }else{
2134 z = sqlite3_mprintf("%.*s %s.%s", n+7, zIn, zSchema, zIn+n+8);
2135 }
2136 }
2137 if( zName
2138 && aPrefix[i][0]=='V'
2139 && (zFake = shellFakeSchema(db, zSchema, zName))!=0
2140 ){
2141 if( z==0 ){
2142 z = sqlite3_mprintf("%s\n/* %s */", zIn, zFake);
2143 }else{
2144 z = sqlite3_mprintf("%z\n/* %s */", z, zFake);
2145 }
2146 free(zFake);
2147 }
2148 if( z ){
2149 sqlite3_result_text(pCtx, z, -1, sqlite3_free);
2150 return;
2151 }
2152 }
2153 }
2154 }
2155 sqlite3_result_value(pCtx, apVal[0]);
2156 }
2157
2158 /*
2159 ** The source code for several run-time loadable extensions is inserted
2160 ** below by the ../tool/mkshellc.tcl script. Before processing that included
2161 ** code, we need to override some macros to make the included program code
2162 ** work here in the middle of this regular program.
2163 */
2164 #define SQLITE_EXTENSION_INIT1
2165 #define SQLITE_EXTENSION_INIT2(X) (void)(X)
2166
2167 #if defined(_WIN32) && defined(_MSC_VER)
2168 /************************* Begin test_windirent.h ******************/
2169 /*
2170 ** 2015 November 30
2171 **
2172 ** The author disclaims copyright to this source code. In place of
2173 ** a legal notice, here is a blessing:
2174 **
2175 ** May you do good and not evil.
2176 ** May you find forgiveness for yourself and forgive others.
2177 ** May you share freely, never taking more than you give.
2178 **
2179 *************************************************************************
2180 ** This file contains declarations for most of the opendir() family of
2181 ** POSIX functions on Win32 using the MSVCRT.
2182 */
2183
2184 #if defined(_WIN32) && defined(_MSC_VER) && !defined(SQLITE_WINDIRENT_H)
2185 #define SQLITE_WINDIRENT_H
2186
2187 /*
2188 ** We need several data types from the Windows SDK header.
2189 */
2190
2191 #ifndef WIN32_LEAN_AND_MEAN
2192 #define WIN32_LEAN_AND_MEAN
2193 #endif
2194
2195 #include "windows.h"
2196
2197 /*
2198 ** We need several support functions from the SQLite core.
2199 */
2200
2201 /* #include "sqlite3.h" */
2202
2203 /*
2204 ** We need several things from the ANSI and MSVCRT headers.
2205 */
2206
2207 #include <stdio.h>
2208 #include <stdlib.h>
2209 #include <errno.h>
2210 #include <io.h>
2211 #include <limits.h>
2212 #include <sys/types.h>
2213 #include <sys/stat.h>
2214
2215 /*
2216 ** We may need several defines that should have been in "sys/stat.h".
2217 */
2218
2219 #ifndef S_ISREG
2220 #define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG)
2221 #endif
2222
2223 #ifndef S_ISDIR
2224 #define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
2225 #endif
2226
2227 #ifndef S_ISLNK
2228 #define S_ISLNK(mode) (0)
2229 #endif
2230
2231 /*
2232 ** We may need to provide the "mode_t" type.
2233 */
2234
2235 #ifndef MODE_T_DEFINED
2236 #define MODE_T_DEFINED
2237 typedef unsigned short mode_t;
2238 #endif
2239
2240 /*
2241 ** We may need to provide the "ino_t" type.
2242 */
2243
2244 #ifndef INO_T_DEFINED
2245 #define INO_T_DEFINED
2246 typedef unsigned short ino_t;
2247 #endif
2248
2249 /*
2250 ** We need to define "NAME_MAX" if it was not present in "limits.h".
2251 */
2252
2253 #ifndef NAME_MAX
2254 # ifdef FILENAME_MAX
2255 # define NAME_MAX (FILENAME_MAX)
2256 # else
2257 # define NAME_MAX (260)
2258 # endif
2259 #endif
2260
2261 /*
2262 ** We need to define "NULL_INTPTR_T" and "BAD_INTPTR_T".
2263 */
2264
2265 #ifndef NULL_INTPTR_T
2266 # define NULL_INTPTR_T ((intptr_t)(0))
2267 #endif
2268
2269 #ifndef BAD_INTPTR_T
2270 # define BAD_INTPTR_T ((intptr_t)(-1))
2271 #endif
2272
2273 /*
2274 ** We need to provide the necessary structures and related types.
2275 */
2276
2277 #ifndef DIRENT_DEFINED
2278 #define DIRENT_DEFINED
2279 typedef struct DIRENT DIRENT;
2280 typedef DIRENT *LPDIRENT;
2281 struct DIRENT {
2282 ino_t d_ino; /* Sequence number, do not use. */
2283 unsigned d_attributes; /* Win32 file attributes. */
2284 char d_name[NAME_MAX + 1]; /* Name within the directory. */
2285 };
2286 #endif
2287
2288 #ifndef DIR_DEFINED
2289 #define DIR_DEFINED
2290 typedef struct DIR DIR;
2291 typedef DIR *LPDIR;
2292 struct DIR {
2293 intptr_t d_handle; /* Value returned by "_findfirst". */
2294 DIRENT d_first; /* DIRENT constructed based on "_findfirst". */
2295 DIRENT d_next; /* DIRENT constructed based on "_findnext". */
2296 };
2297 #endif
2298
2299 /*
2300 ** Provide a macro, for use by the implementation, to determine if a
2301 ** particular directory entry should be skipped over when searching for
2302 ** the next directory entry that should be returned by the readdir() or
2303 ** readdir_r() functions.
2304 */
2305
2306 #ifndef is_filtered
2307 # define is_filtered(a) ((((a).attrib)&_A_HIDDEN) || (((a).attrib)&_A_SYSTEM))
2308 #endif
2309
2310 /*
2311 ** Provide the function prototype for the POSIX compatible getenv()
2312 ** function. This function is not thread-safe.
2313 */
2314
2315 extern const char *windirent_getenv(const char *name);
2316
2317 /*
2318 ** Finally, we can provide the function prototypes for the opendir(),
2319 ** readdir(), readdir_r(), and closedir() POSIX functions.
2320 */
2321
2322 extern LPDIR opendir(const char *dirname);
2323 extern LPDIRENT readdir(LPDIR dirp);
2324 extern INT readdir_r(LPDIR dirp, LPDIRENT entry, LPDIRENT *result);
2325 extern INT closedir(LPDIR dirp);
2326
2327 #endif /* defined(WIN32) && defined(_MSC_VER) */
2328
2329 /************************* End test_windirent.h ********************/
2330 /************************* Begin test_windirent.c ******************/
2331 /*
2332 ** 2015 November 30
2333 **
2334 ** The author disclaims copyright to this source code. In place of
2335 ** a legal notice, here is a blessing:
2336 **
2337 ** May you do good and not evil.
2338 ** May you find forgiveness for yourself and forgive others.
2339 ** May you share freely, never taking more than you give.
2340 **
2341 *************************************************************************
2342 ** This file contains code to implement most of the opendir() family of
2343 ** POSIX functions on Win32 using the MSVCRT.
2344 */
2345
2346 #if defined(_WIN32) && defined(_MSC_VER)
2347 /* #include "test_windirent.h" */
2348
2349 /*
2350 ** Implementation of the POSIX getenv() function using the Win32 API.
2351 ** This function is not thread-safe.
2352 */
windirent_getenv(const char * name)2353 const char *windirent_getenv(
2354 const char *name
2355 ){
2356 static char value[32768]; /* Maximum length, per MSDN */
2357 DWORD dwSize = sizeof(value) / sizeof(char); /* Size in chars */
2358 DWORD dwRet; /* Value returned by GetEnvironmentVariableA() */
2359
2360 memset(value, 0, sizeof(value));
2361 dwRet = GetEnvironmentVariableA(name, value, dwSize);
2362 if( dwRet==0 || dwRet>dwSize ){
2363 /*
2364 ** The function call to GetEnvironmentVariableA() failed -OR-
2365 ** the buffer is not large enough. Either way, return NULL.
2366 */
2367 return 0;
2368 }else{
2369 /*
2370 ** The function call to GetEnvironmentVariableA() succeeded
2371 ** -AND- the buffer contains the entire value.
2372 */
2373 return value;
2374 }
2375 }
2376
2377 /*
2378 ** Implementation of the POSIX opendir() function using the MSVCRT.
2379 */
opendir(const char * dirname)2380 LPDIR opendir(
2381 const char *dirname
2382 ){
2383 struct _finddata_t data;
2384 LPDIR dirp = (LPDIR)sqlite3_malloc(sizeof(DIR));
2385 SIZE_T namesize = sizeof(data.name) / sizeof(data.name[0]);
2386
2387 if( dirp==NULL ) return NULL;
2388 memset(dirp, 0, sizeof(DIR));
2389
2390 /* TODO: Remove this if Unix-style root paths are not used. */
2391 if( sqlite3_stricmp(dirname, "/")==0 ){
2392 dirname = windirent_getenv("SystemDrive");
2393 }
2394
2395 memset(&data, 0, sizeof(struct _finddata_t));
2396 _snprintf(data.name, namesize, "%s\\*", dirname);
2397 dirp->d_handle = _findfirst(data.name, &data);
2398
2399 if( dirp->d_handle==BAD_INTPTR_T ){
2400 closedir(dirp);
2401 return NULL;
2402 }
2403
2404 /* TODO: Remove this block to allow hidden and/or system files. */
2405 if( is_filtered(data) ){
2406 next:
2407
2408 memset(&data, 0, sizeof(struct _finddata_t));
2409 if( _findnext(dirp->d_handle, &data)==-1 ){
2410 closedir(dirp);
2411 return NULL;
2412 }
2413
2414 /* TODO: Remove this block to allow hidden and/or system files. */
2415 if( is_filtered(data) ) goto next;
2416 }
2417
2418 dirp->d_first.d_attributes = data.attrib;
2419 strncpy(dirp->d_first.d_name, data.name, NAME_MAX);
2420 dirp->d_first.d_name[NAME_MAX] = '\0';
2421
2422 return dirp;
2423 }
2424
2425 /*
2426 ** Implementation of the POSIX readdir() function using the MSVCRT.
2427 */
readdir(LPDIR dirp)2428 LPDIRENT readdir(
2429 LPDIR dirp
2430 ){
2431 struct _finddata_t data;
2432
2433 if( dirp==NULL ) return NULL;
2434
2435 if( dirp->d_first.d_ino==0 ){
2436 dirp->d_first.d_ino++;
2437 dirp->d_next.d_ino++;
2438
2439 return &dirp->d_first;
2440 }
2441
2442 next:
2443
2444 memset(&data, 0, sizeof(struct _finddata_t));
2445 if( _findnext(dirp->d_handle, &data)==-1 ) return NULL;
2446
2447 /* TODO: Remove this block to allow hidden and/or system files. */
2448 if( is_filtered(data) ) goto next;
2449
2450 dirp->d_next.d_ino++;
2451 dirp->d_next.d_attributes = data.attrib;
2452 strncpy(dirp->d_next.d_name, data.name, NAME_MAX);
2453 dirp->d_next.d_name[NAME_MAX] = '\0';
2454
2455 return &dirp->d_next;
2456 }
2457
2458 /*
2459 ** Implementation of the POSIX readdir_r() function using the MSVCRT.
2460 */
readdir_r(LPDIR dirp,LPDIRENT entry,LPDIRENT * result)2461 INT readdir_r(
2462 LPDIR dirp,
2463 LPDIRENT entry,
2464 LPDIRENT *result
2465 ){
2466 struct _finddata_t data;
2467
2468 if( dirp==NULL ) return EBADF;
2469
2470 if( dirp->d_first.d_ino==0 ){
2471 dirp->d_first.d_ino++;
2472 dirp->d_next.d_ino++;
2473
2474 entry->d_ino = dirp->d_first.d_ino;
2475 entry->d_attributes = dirp->d_first.d_attributes;
2476 strncpy(entry->d_name, dirp->d_first.d_name, NAME_MAX);
2477 entry->d_name[NAME_MAX] = '\0';
2478
2479 *result = entry;
2480 return 0;
2481 }
2482
2483 next:
2484
2485 memset(&data, 0, sizeof(struct _finddata_t));
2486 if( _findnext(dirp->d_handle, &data)==-1 ){
2487 *result = NULL;
2488 return ENOENT;
2489 }
2490
2491 /* TODO: Remove this block to allow hidden and/or system files. */
2492 if( is_filtered(data) ) goto next;
2493
2494 entry->d_ino = (ino_t)-1; /* not available */
2495 entry->d_attributes = data.attrib;
2496 strncpy(entry->d_name, data.name, NAME_MAX);
2497 entry->d_name[NAME_MAX] = '\0';
2498
2499 *result = entry;
2500 return 0;
2501 }
2502
2503 /*
2504 ** Implementation of the POSIX closedir() function using the MSVCRT.
2505 */
closedir(LPDIR dirp)2506 INT closedir(
2507 LPDIR dirp
2508 ){
2509 INT result = 0;
2510
2511 if( dirp==NULL ) return EINVAL;
2512
2513 if( dirp->d_handle!=NULL_INTPTR_T && dirp->d_handle!=BAD_INTPTR_T ){
2514 result = _findclose(dirp->d_handle);
2515 }
2516
2517 sqlite3_free(dirp);
2518 return result;
2519 }
2520
2521 #endif /* defined(WIN32) && defined(_MSC_VER) */
2522
2523 /************************* End test_windirent.c ********************/
2524 #define dirent DIRENT
2525 #endif
2526 /************************* Begin ../ext/misc/memtrace.c ******************/
2527 /*
2528 ** 2019-01-21
2529 **
2530 ** The author disclaims copyright to this source code. In place of
2531 ** a legal notice, here is a blessing:
2532 **
2533 ** May you do good and not evil.
2534 ** May you find forgiveness for yourself and forgive others.
2535 ** May you share freely, never taking more than you give.
2536 **
2537 *************************************************************************
2538 **
2539 ** This file implements an extension that uses the SQLITE_CONFIG_MALLOC
2540 ** mechanism to add a tracing layer on top of SQLite. If this extension
2541 ** is registered prior to sqlite3_initialize(), it will cause all memory
2542 ** allocation activities to be logged on standard output, or to some other
2543 ** FILE specified by the initializer.
2544 **
2545 ** This file needs to be compiled into the application that uses it.
2546 **
2547 ** This extension is used to implement the --memtrace option of the
2548 ** command-line shell.
2549 */
2550 #include <assert.h>
2551 #include <string.h>
2552 #include <stdio.h>
2553
2554 /* The original memory allocation routines */
2555 static sqlite3_mem_methods memtraceBase;
2556 static FILE *memtraceOut;
2557
2558 /* Methods that trace memory allocations */
memtraceMalloc(int n)2559 static void *memtraceMalloc(int n){
2560 if( memtraceOut ){
2561 fprintf(memtraceOut, "MEMTRACE: allocate %d bytes\n",
2562 memtraceBase.xRoundup(n));
2563 }
2564 return memtraceBase.xMalloc(n);
2565 }
memtraceFree(void * p)2566 static void memtraceFree(void *p){
2567 if( p==0 ) return;
2568 if( memtraceOut ){
2569 fprintf(memtraceOut, "MEMTRACE: free %d bytes\n", memtraceBase.xSize(p));
2570 }
2571 memtraceBase.xFree(p);
2572 }
memtraceRealloc(void * p,int n)2573 static void *memtraceRealloc(void *p, int n){
2574 if( p==0 ) return memtraceMalloc(n);
2575 if( n==0 ){
2576 memtraceFree(p);
2577 return 0;
2578 }
2579 if( memtraceOut ){
2580 fprintf(memtraceOut, "MEMTRACE: resize %d -> %d bytes\n",
2581 memtraceBase.xSize(p), memtraceBase.xRoundup(n));
2582 }
2583 return memtraceBase.xRealloc(p, n);
2584 }
memtraceSize(void * p)2585 static int memtraceSize(void *p){
2586 return memtraceBase.xSize(p);
2587 }
memtraceRoundup(int n)2588 static int memtraceRoundup(int n){
2589 return memtraceBase.xRoundup(n);
2590 }
memtraceInit(void * p)2591 static int memtraceInit(void *p){
2592 return memtraceBase.xInit(p);
2593 }
memtraceShutdown(void * p)2594 static void memtraceShutdown(void *p){
2595 memtraceBase.xShutdown(p);
2596 }
2597
2598 /* The substitute memory allocator */
2599 static sqlite3_mem_methods ersaztMethods = {
2600 memtraceMalloc,
2601 memtraceFree,
2602 memtraceRealloc,
2603 memtraceSize,
2604 memtraceRoundup,
2605 memtraceInit,
2606 memtraceShutdown,
2607 0
2608 };
2609
2610 /* Begin tracing memory allocations to out. */
sqlite3MemTraceActivate(FILE * out)2611 static int sqlite3MemTraceActivate(FILE *out){
2612 int rc = SQLITE_OK;
2613 if( memtraceBase.xMalloc==0 ){
2614 rc = sqlite3_config(SQLITE_CONFIG_GETMALLOC, &memtraceBase);
2615 if( rc==SQLITE_OK ){
2616 rc = sqlite3_config(SQLITE_CONFIG_MALLOC, &ersaztMethods);
2617 }
2618 }
2619 memtraceOut = out;
2620 return rc;
2621 }
2622
2623 /* Deactivate memory tracing */
sqlite3MemTraceDeactivate(void)2624 static int sqlite3MemTraceDeactivate(void){
2625 int rc = SQLITE_OK;
2626 if( memtraceBase.xMalloc!=0 ){
2627 rc = sqlite3_config(SQLITE_CONFIG_MALLOC, &memtraceBase);
2628 if( rc==SQLITE_OK ){
2629 memset(&memtraceBase, 0, sizeof(memtraceBase));
2630 }
2631 }
2632 memtraceOut = 0;
2633 return rc;
2634 }
2635
2636 /************************* End ../ext/misc/memtrace.c ********************/
2637 /************************* Begin ../ext/misc/pcachetrace.c ******************/
2638 /*
2639 ** 2023-06-21
2640 **
2641 ** The author disclaims copyright to this source code. In place of
2642 ** a legal notice, here is a blessing:
2643 **
2644 ** May you do good and not evil.
2645 ** May you find forgiveness for yourself and forgive others.
2646 ** May you share freely, never taking more than you give.
2647 **
2648 *************************************************************************
2649 **
2650 ** This file implements an extension that uses the SQLITE_CONFIG_PCACHE2
2651 ** mechanism to add a tracing layer on top of pluggable page cache of
2652 ** SQLite. If this extension is registered prior to sqlite3_initialize(),
2653 ** it will cause all page cache activities to be logged on standard output,
2654 ** or to some other FILE specified by the initializer.
2655 **
2656 ** This file needs to be compiled into the application that uses it.
2657 **
2658 ** This extension is used to implement the --pcachetrace option of the
2659 ** command-line shell.
2660 */
2661 #include <assert.h>
2662 #include <string.h>
2663 #include <stdio.h>
2664
2665 /* The original page cache routines */
2666 static sqlite3_pcache_methods2 pcacheBase;
2667 static FILE *pcachetraceOut;
2668
2669 /* Methods that trace pcache activity */
pcachetraceInit(void * pArg)2670 static int pcachetraceInit(void *pArg){
2671 int nRes;
2672 if( pcachetraceOut ){
2673 fprintf(pcachetraceOut, "PCACHETRACE: xInit(%p)\n", pArg);
2674 }
2675 nRes = pcacheBase.xInit(pArg);
2676 if( pcachetraceOut ){
2677 fprintf(pcachetraceOut, "PCACHETRACE: xInit(%p) -> %d\n", pArg, nRes);
2678 }
2679 return nRes;
2680 }
pcachetraceShutdown(void * pArg)2681 static void pcachetraceShutdown(void *pArg){
2682 if( pcachetraceOut ){
2683 fprintf(pcachetraceOut, "PCACHETRACE: xShutdown(%p)\n", pArg);
2684 }
2685 pcacheBase.xShutdown(pArg);
2686 }
pcachetraceCreate(int szPage,int szExtra,int bPurge)2687 static sqlite3_pcache *pcachetraceCreate(int szPage, int szExtra, int bPurge){
2688 sqlite3_pcache *pRes;
2689 if( pcachetraceOut ){
2690 fprintf(pcachetraceOut, "PCACHETRACE: xCreate(%d,%d,%d)\n",
2691 szPage, szExtra, bPurge);
2692 }
2693 pRes = pcacheBase.xCreate(szPage, szExtra, bPurge);
2694 if( pcachetraceOut ){
2695 fprintf(pcachetraceOut, "PCACHETRACE: xCreate(%d,%d,%d) -> %p\n",
2696 szPage, szExtra, bPurge, pRes);
2697 }
2698 return pRes;
2699 }
pcachetraceCachesize(sqlite3_pcache * p,int nCachesize)2700 static void pcachetraceCachesize(sqlite3_pcache *p, int nCachesize){
2701 if( pcachetraceOut ){
2702 fprintf(pcachetraceOut, "PCACHETRACE: xCachesize(%p, %d)\n", p, nCachesize);
2703 }
2704 pcacheBase.xCachesize(p, nCachesize);
2705 }
pcachetracePagecount(sqlite3_pcache * p)2706 static int pcachetracePagecount(sqlite3_pcache *p){
2707 int nRes;
2708 if( pcachetraceOut ){
2709 fprintf(pcachetraceOut, "PCACHETRACE: xPagecount(%p)\n", p);
2710 }
2711 nRes = pcacheBase.xPagecount(p);
2712 if( pcachetraceOut ){
2713 fprintf(pcachetraceOut, "PCACHETRACE: xPagecount(%p) -> %d\n", p, nRes);
2714 }
2715 return nRes;
2716 }
pcachetraceFetch(sqlite3_pcache * p,unsigned key,int crFg)2717 static sqlite3_pcache_page *pcachetraceFetch(
2718 sqlite3_pcache *p,
2719 unsigned key,
2720 int crFg
2721 ){
2722 sqlite3_pcache_page *pRes;
2723 if( pcachetraceOut ){
2724 fprintf(pcachetraceOut, "PCACHETRACE: xFetch(%p,%u,%d)\n", p, key, crFg);
2725 }
2726 pRes = pcacheBase.xFetch(p, key, crFg);
2727 if( pcachetraceOut ){
2728 fprintf(pcachetraceOut, "PCACHETRACE: xFetch(%p,%u,%d) -> %p\n",
2729 p, key, crFg, pRes);
2730 }
2731 return pRes;
2732 }
pcachetraceUnpin(sqlite3_pcache * p,sqlite3_pcache_page * pPg,int bDiscard)2733 static void pcachetraceUnpin(
2734 sqlite3_pcache *p,
2735 sqlite3_pcache_page *pPg,
2736 int bDiscard
2737 ){
2738 if( pcachetraceOut ){
2739 fprintf(pcachetraceOut, "PCACHETRACE: xUnpin(%p, %p, %d)\n",
2740 p, pPg, bDiscard);
2741 }
2742 pcacheBase.xUnpin(p, pPg, bDiscard);
2743 }
pcachetraceRekey(sqlite3_pcache * p,sqlite3_pcache_page * pPg,unsigned oldKey,unsigned newKey)2744 static void pcachetraceRekey(
2745 sqlite3_pcache *p,
2746 sqlite3_pcache_page *pPg,
2747 unsigned oldKey,
2748 unsigned newKey
2749 ){
2750 if( pcachetraceOut ){
2751 fprintf(pcachetraceOut, "PCACHETRACE: xRekey(%p, %p, %u, %u)\n",
2752 p, pPg, oldKey, newKey);
2753 }
2754 pcacheBase.xRekey(p, pPg, oldKey, newKey);
2755 }
pcachetraceTruncate(sqlite3_pcache * p,unsigned n)2756 static void pcachetraceTruncate(sqlite3_pcache *p, unsigned n){
2757 if( pcachetraceOut ){
2758 fprintf(pcachetraceOut, "PCACHETRACE: xTruncate(%p, %u)\n", p, n);
2759 }
2760 pcacheBase.xTruncate(p, n);
2761 }
pcachetraceDestroy(sqlite3_pcache * p)2762 static void pcachetraceDestroy(sqlite3_pcache *p){
2763 if( pcachetraceOut ){
2764 fprintf(pcachetraceOut, "PCACHETRACE: xDestroy(%p)\n", p);
2765 }
2766 pcacheBase.xDestroy(p);
2767 }
pcachetraceShrink(sqlite3_pcache * p)2768 static void pcachetraceShrink(sqlite3_pcache *p){
2769 if( pcachetraceOut ){
2770 fprintf(pcachetraceOut, "PCACHETRACE: xShrink(%p)\n", p);
2771 }
2772 pcacheBase.xShrink(p);
2773 }
2774
2775 /* The substitute pcache methods */
2776 static sqlite3_pcache_methods2 ersaztPcacheMethods = {
2777 0,
2778 0,
2779 pcachetraceInit,
2780 pcachetraceShutdown,
2781 pcachetraceCreate,
2782 pcachetraceCachesize,
2783 pcachetracePagecount,
2784 pcachetraceFetch,
2785 pcachetraceUnpin,
2786 pcachetraceRekey,
2787 pcachetraceTruncate,
2788 pcachetraceDestroy,
2789 pcachetraceShrink
2790 };
2791
2792 /* Begin tracing memory allocations to out. */
sqlite3PcacheTraceActivate(FILE * out)2793 static int sqlite3PcacheTraceActivate(FILE *out){
2794 int rc = SQLITE_OK;
2795 if( pcacheBase.xFetch==0 ){
2796 rc = sqlite3_config(SQLITE_CONFIG_GETPCACHE2, &pcacheBase);
2797 if( rc==SQLITE_OK ){
2798 rc = sqlite3_config(SQLITE_CONFIG_PCACHE2, &ersaztPcacheMethods);
2799 }
2800 }
2801 pcachetraceOut = out;
2802 return rc;
2803 }
2804
2805 /* Deactivate memory tracing */
sqlite3PcacheTraceDeactivate(void)2806 static int sqlite3PcacheTraceDeactivate(void){
2807 int rc = SQLITE_OK;
2808 if( pcacheBase.xFetch!=0 ){
2809 rc = sqlite3_config(SQLITE_CONFIG_PCACHE2, &pcacheBase);
2810 if( rc==SQLITE_OK ){
2811 memset(&pcacheBase, 0, sizeof(pcacheBase));
2812 }
2813 }
2814 pcachetraceOut = 0;
2815 return rc;
2816 }
2817
2818 /************************* End ../ext/misc/pcachetrace.c ********************/
2819 /************************* Begin ../ext/misc/shathree.c ******************/
2820 /*
2821 ** 2017-03-08
2822 **
2823 ** The author disclaims copyright to this source code. In place of
2824 ** a legal notice, here is a blessing:
2825 **
2826 ** May you do good and not evil.
2827 ** May you find forgiveness for yourself and forgive others.
2828 ** May you share freely, never taking more than you give.
2829 **
2830 ******************************************************************************
2831 **
2832 ** This SQLite extension implements functions that compute SHA3 hashes
2833 ** in the way described by the (U.S.) NIST FIPS 202 SHA-3 Standard.
2834 ** Two SQL functions are implemented:
2835 **
2836 ** sha3(X,SIZE)
2837 ** sha3_query(Y,SIZE)
2838 **
2839 ** The sha3(X) function computes the SHA3 hash of the input X, or NULL if
2840 ** X is NULL.
2841 **
2842 ** The sha3_query(Y) function evaluates all queries in the SQL statements of Y
2843 ** and returns a hash of their results.
2844 **
2845 ** The SIZE argument is optional. If omitted, the SHA3-256 hash algorithm
2846 ** is used. If SIZE is included it must be one of the integers 224, 256,
2847 ** 384, or 512, to determine SHA3 hash variant that is computed.
2848 */
2849 /* #include "sqlite3ext.h" */
2850 SQLITE_EXTENSION_INIT1
2851 #include <assert.h>
2852 #include <string.h>
2853 #include <stdarg.h>
2854
2855 #ifndef SQLITE_AMALGAMATION
2856 /* typedef sqlite3_uint64 u64; */
2857 #endif /* SQLITE_AMALGAMATION */
2858
2859 /******************************************************************************
2860 ** The Hash Engine
2861 */
2862 /*
2863 ** Macros to determine whether the machine is big or little endian,
2864 ** and whether or not that determination is run-time or compile-time.
2865 **
2866 ** For best performance, an attempt is made to guess at the byte-order
2867 ** using C-preprocessor macros. If that is unsuccessful, or if
2868 ** -DSHA3_BYTEORDER=0 is set, then byte-order is determined
2869 ** at run-time.
2870 */
2871 #ifndef SHA3_BYTEORDER
2872 # if defined(i386) || defined(__i386__) || defined(_M_IX86) || \
2873 defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || \
2874 defined(_M_AMD64) || defined(_M_ARM) || defined(__x86) || \
2875 defined(__arm__)
2876 # define SHA3_BYTEORDER 1234
2877 # elif defined(sparc) || defined(__ppc__)
2878 # define SHA3_BYTEORDER 4321
2879 # else
2880 # define SHA3_BYTEORDER 0
2881 # endif
2882 #endif
2883
2884
2885 /*
2886 ** State structure for a SHA3 hash in progress
2887 */
2888 typedef struct SHA3Context SHA3Context;
2889 struct SHA3Context {
2890 union {
2891 u64 s[25]; /* Keccak state. 5x5 lines of 64 bits each */
2892 unsigned char x[1600]; /* ... or 1600 bytes */
2893 } u;
2894 unsigned nRate; /* Bytes of input accepted per Keccak iteration */
2895 unsigned nLoaded; /* Input bytes loaded into u.x[] so far this cycle */
2896 unsigned ixMask; /* Insert next input into u.x[nLoaded^ixMask]. */
2897 };
2898
2899 /*
2900 ** A single step of the Keccak mixing function for a 1600-bit state
2901 */
KeccakF1600Step(SHA3Context * p)2902 static void KeccakF1600Step(SHA3Context *p){
2903 int i;
2904 u64 b0, b1, b2, b3, b4;
2905 u64 c0, c1, c2, c3, c4;
2906 u64 d0, d1, d2, d3, d4;
2907 static const u64 RC[] = {
2908 0x0000000000000001ULL, 0x0000000000008082ULL,
2909 0x800000000000808aULL, 0x8000000080008000ULL,
2910 0x000000000000808bULL, 0x0000000080000001ULL,
2911 0x8000000080008081ULL, 0x8000000000008009ULL,
2912 0x000000000000008aULL, 0x0000000000000088ULL,
2913 0x0000000080008009ULL, 0x000000008000000aULL,
2914 0x000000008000808bULL, 0x800000000000008bULL,
2915 0x8000000000008089ULL, 0x8000000000008003ULL,
2916 0x8000000000008002ULL, 0x8000000000000080ULL,
2917 0x000000000000800aULL, 0x800000008000000aULL,
2918 0x8000000080008081ULL, 0x8000000000008080ULL,
2919 0x0000000080000001ULL, 0x8000000080008008ULL
2920 };
2921 # define a00 (p->u.s[0])
2922 # define a01 (p->u.s[1])
2923 # define a02 (p->u.s[2])
2924 # define a03 (p->u.s[3])
2925 # define a04 (p->u.s[4])
2926 # define a10 (p->u.s[5])
2927 # define a11 (p->u.s[6])
2928 # define a12 (p->u.s[7])
2929 # define a13 (p->u.s[8])
2930 # define a14 (p->u.s[9])
2931 # define a20 (p->u.s[10])
2932 # define a21 (p->u.s[11])
2933 # define a22 (p->u.s[12])
2934 # define a23 (p->u.s[13])
2935 # define a24 (p->u.s[14])
2936 # define a30 (p->u.s[15])
2937 # define a31 (p->u.s[16])
2938 # define a32 (p->u.s[17])
2939 # define a33 (p->u.s[18])
2940 # define a34 (p->u.s[19])
2941 # define a40 (p->u.s[20])
2942 # define a41 (p->u.s[21])
2943 # define a42 (p->u.s[22])
2944 # define a43 (p->u.s[23])
2945 # define a44 (p->u.s[24])
2946 # define ROL64(a,x) ((a<<x)|(a>>(64-x)))
2947
2948 for(i=0; i<24; i+=4){
2949 c0 = a00^a10^a20^a30^a40;
2950 c1 = a01^a11^a21^a31^a41;
2951 c2 = a02^a12^a22^a32^a42;
2952 c3 = a03^a13^a23^a33^a43;
2953 c4 = a04^a14^a24^a34^a44;
2954 d0 = c4^ROL64(c1, 1);
2955 d1 = c0^ROL64(c2, 1);
2956 d2 = c1^ROL64(c3, 1);
2957 d3 = c2^ROL64(c4, 1);
2958 d4 = c3^ROL64(c0, 1);
2959
2960 b0 = (a00^d0);
2961 b1 = ROL64((a11^d1), 44);
2962 b2 = ROL64((a22^d2), 43);
2963 b3 = ROL64((a33^d3), 21);
2964 b4 = ROL64((a44^d4), 14);
2965 a00 = b0 ^((~b1)& b2 );
2966 a00 ^= RC[i];
2967 a11 = b1 ^((~b2)& b3 );
2968 a22 = b2 ^((~b3)& b4 );
2969 a33 = b3 ^((~b4)& b0 );
2970 a44 = b4 ^((~b0)& b1 );
2971
2972 b2 = ROL64((a20^d0), 3);
2973 b3 = ROL64((a31^d1), 45);
2974 b4 = ROL64((a42^d2), 61);
2975 b0 = ROL64((a03^d3), 28);
2976 b1 = ROL64((a14^d4), 20);
2977 a20 = b0 ^((~b1)& b2 );
2978 a31 = b1 ^((~b2)& b3 );
2979 a42 = b2 ^((~b3)& b4 );
2980 a03 = b3 ^((~b4)& b0 );
2981 a14 = b4 ^((~b0)& b1 );
2982
2983 b4 = ROL64((a40^d0), 18);
2984 b0 = ROL64((a01^d1), 1);
2985 b1 = ROL64((a12^d2), 6);
2986 b2 = ROL64((a23^d3), 25);
2987 b3 = ROL64((a34^d4), 8);
2988 a40 = b0 ^((~b1)& b2 );
2989 a01 = b1 ^((~b2)& b3 );
2990 a12 = b2 ^((~b3)& b4 );
2991 a23 = b3 ^((~b4)& b0 );
2992 a34 = b4 ^((~b0)& b1 );
2993
2994 b1 = ROL64((a10^d0), 36);
2995 b2 = ROL64((a21^d1), 10);
2996 b3 = ROL64((a32^d2), 15);
2997 b4 = ROL64((a43^d3), 56);
2998 b0 = ROL64((a04^d4), 27);
2999 a10 = b0 ^((~b1)& b2 );
3000 a21 = b1 ^((~b2)& b3 );
3001 a32 = b2 ^((~b3)& b4 );
3002 a43 = b3 ^((~b4)& b0 );
3003 a04 = b4 ^((~b0)& b1 );
3004
3005 b3 = ROL64((a30^d0), 41);
3006 b4 = ROL64((a41^d1), 2);
3007 b0 = ROL64((a02^d2), 62);
3008 b1 = ROL64((a13^d3), 55);
3009 b2 = ROL64((a24^d4), 39);
3010 a30 = b0 ^((~b1)& b2 );
3011 a41 = b1 ^((~b2)& b3 );
3012 a02 = b2 ^((~b3)& b4 );
3013 a13 = b3 ^((~b4)& b0 );
3014 a24 = b4 ^((~b0)& b1 );
3015
3016 c0 = a00^a20^a40^a10^a30;
3017 c1 = a11^a31^a01^a21^a41;
3018 c2 = a22^a42^a12^a32^a02;
3019 c3 = a33^a03^a23^a43^a13;
3020 c4 = a44^a14^a34^a04^a24;
3021 d0 = c4^ROL64(c1, 1);
3022 d1 = c0^ROL64(c2, 1);
3023 d2 = c1^ROL64(c3, 1);
3024 d3 = c2^ROL64(c4, 1);
3025 d4 = c3^ROL64(c0, 1);
3026
3027 b0 = (a00^d0);
3028 b1 = ROL64((a31^d1), 44);
3029 b2 = ROL64((a12^d2), 43);
3030 b3 = ROL64((a43^d3), 21);
3031 b4 = ROL64((a24^d4), 14);
3032 a00 = b0 ^((~b1)& b2 );
3033 a00 ^= RC[i+1];
3034 a31 = b1 ^((~b2)& b3 );
3035 a12 = b2 ^((~b3)& b4 );
3036 a43 = b3 ^((~b4)& b0 );
3037 a24 = b4 ^((~b0)& b1 );
3038
3039 b2 = ROL64((a40^d0), 3);
3040 b3 = ROL64((a21^d1), 45);
3041 b4 = ROL64((a02^d2), 61);
3042 b0 = ROL64((a33^d3), 28);
3043 b1 = ROL64((a14^d4), 20);
3044 a40 = b0 ^((~b1)& b2 );
3045 a21 = b1 ^((~b2)& b3 );
3046 a02 = b2 ^((~b3)& b4 );
3047 a33 = b3 ^((~b4)& b0 );
3048 a14 = b4 ^((~b0)& b1 );
3049
3050 b4 = ROL64((a30^d0), 18);
3051 b0 = ROL64((a11^d1), 1);
3052 b1 = ROL64((a42^d2), 6);
3053 b2 = ROL64((a23^d3), 25);
3054 b3 = ROL64((a04^d4), 8);
3055 a30 = b0 ^((~b1)& b2 );
3056 a11 = b1 ^((~b2)& b3 );
3057 a42 = b2 ^((~b3)& b4 );
3058 a23 = b3 ^((~b4)& b0 );
3059 a04 = b4 ^((~b0)& b1 );
3060
3061 b1 = ROL64((a20^d0), 36);
3062 b2 = ROL64((a01^d1), 10);
3063 b3 = ROL64((a32^d2), 15);
3064 b4 = ROL64((a13^d3), 56);
3065 b0 = ROL64((a44^d4), 27);
3066 a20 = b0 ^((~b1)& b2 );
3067 a01 = b1 ^((~b2)& b3 );
3068 a32 = b2 ^((~b3)& b4 );
3069 a13 = b3 ^((~b4)& b0 );
3070 a44 = b4 ^((~b0)& b1 );
3071
3072 b3 = ROL64((a10^d0), 41);
3073 b4 = ROL64((a41^d1), 2);
3074 b0 = ROL64((a22^d2), 62);
3075 b1 = ROL64((a03^d3), 55);
3076 b2 = ROL64((a34^d4), 39);
3077 a10 = b0 ^((~b1)& b2 );
3078 a41 = b1 ^((~b2)& b3 );
3079 a22 = b2 ^((~b3)& b4 );
3080 a03 = b3 ^((~b4)& b0 );
3081 a34 = b4 ^((~b0)& b1 );
3082
3083 c0 = a00^a40^a30^a20^a10;
3084 c1 = a31^a21^a11^a01^a41;
3085 c2 = a12^a02^a42^a32^a22;
3086 c3 = a43^a33^a23^a13^a03;
3087 c4 = a24^a14^a04^a44^a34;
3088 d0 = c4^ROL64(c1, 1);
3089 d1 = c0^ROL64(c2, 1);
3090 d2 = c1^ROL64(c3, 1);
3091 d3 = c2^ROL64(c4, 1);
3092 d4 = c3^ROL64(c0, 1);
3093
3094 b0 = (a00^d0);
3095 b1 = ROL64((a21^d1), 44);
3096 b2 = ROL64((a42^d2), 43);
3097 b3 = ROL64((a13^d3), 21);
3098 b4 = ROL64((a34^d4), 14);
3099 a00 = b0 ^((~b1)& b2 );
3100 a00 ^= RC[i+2];
3101 a21 = b1 ^((~b2)& b3 );
3102 a42 = b2 ^((~b3)& b4 );
3103 a13 = b3 ^((~b4)& b0 );
3104 a34 = b4 ^((~b0)& b1 );
3105
3106 b2 = ROL64((a30^d0), 3);
3107 b3 = ROL64((a01^d1), 45);
3108 b4 = ROL64((a22^d2), 61);
3109 b0 = ROL64((a43^d3), 28);
3110 b1 = ROL64((a14^d4), 20);
3111 a30 = b0 ^((~b1)& b2 );
3112 a01 = b1 ^((~b2)& b3 );
3113 a22 = b2 ^((~b3)& b4 );
3114 a43 = b3 ^((~b4)& b0 );
3115 a14 = b4 ^((~b0)& b1 );
3116
3117 b4 = ROL64((a10^d0), 18);
3118 b0 = ROL64((a31^d1), 1);
3119 b1 = ROL64((a02^d2), 6);
3120 b2 = ROL64((a23^d3), 25);
3121 b3 = ROL64((a44^d4), 8);
3122 a10 = b0 ^((~b1)& b2 );
3123 a31 = b1 ^((~b2)& b3 );
3124 a02 = b2 ^((~b3)& b4 );
3125 a23 = b3 ^((~b4)& b0 );
3126 a44 = b4 ^((~b0)& b1 );
3127
3128 b1 = ROL64((a40^d0), 36);
3129 b2 = ROL64((a11^d1), 10);
3130 b3 = ROL64((a32^d2), 15);
3131 b4 = ROL64((a03^d3), 56);
3132 b0 = ROL64((a24^d4), 27);
3133 a40 = b0 ^((~b1)& b2 );
3134 a11 = b1 ^((~b2)& b3 );
3135 a32 = b2 ^((~b3)& b4 );
3136 a03 = b3 ^((~b4)& b0 );
3137 a24 = b4 ^((~b0)& b1 );
3138
3139 b3 = ROL64((a20^d0), 41);
3140 b4 = ROL64((a41^d1), 2);
3141 b0 = ROL64((a12^d2), 62);
3142 b1 = ROL64((a33^d3), 55);
3143 b2 = ROL64((a04^d4), 39);
3144 a20 = b0 ^((~b1)& b2 );
3145 a41 = b1 ^((~b2)& b3 );
3146 a12 = b2 ^((~b3)& b4 );
3147 a33 = b3 ^((~b4)& b0 );
3148 a04 = b4 ^((~b0)& b1 );
3149
3150 c0 = a00^a30^a10^a40^a20;
3151 c1 = a21^a01^a31^a11^a41;
3152 c2 = a42^a22^a02^a32^a12;
3153 c3 = a13^a43^a23^a03^a33;
3154 c4 = a34^a14^a44^a24^a04;
3155 d0 = c4^ROL64(c1, 1);
3156 d1 = c0^ROL64(c2, 1);
3157 d2 = c1^ROL64(c3, 1);
3158 d3 = c2^ROL64(c4, 1);
3159 d4 = c3^ROL64(c0, 1);
3160
3161 b0 = (a00^d0);
3162 b1 = ROL64((a01^d1), 44);
3163 b2 = ROL64((a02^d2), 43);
3164 b3 = ROL64((a03^d3), 21);
3165 b4 = ROL64((a04^d4), 14);
3166 a00 = b0 ^((~b1)& b2 );
3167 a00 ^= RC[i+3];
3168 a01 = b1 ^((~b2)& b3 );
3169 a02 = b2 ^((~b3)& b4 );
3170 a03 = b3 ^((~b4)& b0 );
3171 a04 = b4 ^((~b0)& b1 );
3172
3173 b2 = ROL64((a10^d0), 3);
3174 b3 = ROL64((a11^d1), 45);
3175 b4 = ROL64((a12^d2), 61);
3176 b0 = ROL64((a13^d3), 28);
3177 b1 = ROL64((a14^d4), 20);
3178 a10 = b0 ^((~b1)& b2 );
3179 a11 = b1 ^((~b2)& b3 );
3180 a12 = b2 ^((~b3)& b4 );
3181 a13 = b3 ^((~b4)& b0 );
3182 a14 = b4 ^((~b0)& b1 );
3183
3184 b4 = ROL64((a20^d0), 18);
3185 b0 = ROL64((a21^d1), 1);
3186 b1 = ROL64((a22^d2), 6);
3187 b2 = ROL64((a23^d3), 25);
3188 b3 = ROL64((a24^d4), 8);
3189 a20 = b0 ^((~b1)& b2 );
3190 a21 = b1 ^((~b2)& b3 );
3191 a22 = b2 ^((~b3)& b4 );
3192 a23 = b3 ^((~b4)& b0 );
3193 a24 = b4 ^((~b0)& b1 );
3194
3195 b1 = ROL64((a30^d0), 36);
3196 b2 = ROL64((a31^d1), 10);
3197 b3 = ROL64((a32^d2), 15);
3198 b4 = ROL64((a33^d3), 56);
3199 b0 = ROL64((a34^d4), 27);
3200 a30 = b0 ^((~b1)& b2 );
3201 a31 = b1 ^((~b2)& b3 );
3202 a32 = b2 ^((~b3)& b4 );
3203 a33 = b3 ^((~b4)& b0 );
3204 a34 = b4 ^((~b0)& b1 );
3205
3206 b3 = ROL64((a40^d0), 41);
3207 b4 = ROL64((a41^d1), 2);
3208 b0 = ROL64((a42^d2), 62);
3209 b1 = ROL64((a43^d3), 55);
3210 b2 = ROL64((a44^d4), 39);
3211 a40 = b0 ^((~b1)& b2 );
3212 a41 = b1 ^((~b2)& b3 );
3213 a42 = b2 ^((~b3)& b4 );
3214 a43 = b3 ^((~b4)& b0 );
3215 a44 = b4 ^((~b0)& b1 );
3216 }
3217 }
3218
3219 /*
3220 ** Initialize a new hash. iSize determines the size of the hash
3221 ** in bits and should be one of 224, 256, 384, or 512. Or iSize
3222 ** can be zero to use the default hash size of 256 bits.
3223 */
SHA3Init(SHA3Context * p,int iSize)3224 static void SHA3Init(SHA3Context *p, int iSize){
3225 memset(p, 0, sizeof(*p));
3226 if( iSize>=128 && iSize<=512 ){
3227 p->nRate = (1600 - ((iSize + 31)&~31)*2)/8;
3228 }else{
3229 p->nRate = (1600 - 2*256)/8;
3230 }
3231 #if SHA3_BYTEORDER==1234
3232 /* Known to be little-endian at compile-time. No-op */
3233 #elif SHA3_BYTEORDER==4321
3234 p->ixMask = 7; /* Big-endian */
3235 #else
3236 {
3237 static unsigned int one = 1;
3238 if( 1==*(unsigned char*)&one ){
3239 /* Little endian. No byte swapping. */
3240 p->ixMask = 0;
3241 }else{
3242 /* Big endian. Byte swap. */
3243 p->ixMask = 7;
3244 }
3245 }
3246 #endif
3247 }
3248
3249 /*
3250 ** Make consecutive calls to the SHA3Update function to add new content
3251 ** to the hash
3252 */
SHA3Update(SHA3Context * p,const unsigned char * aData,unsigned int nData)3253 static void SHA3Update(
3254 SHA3Context *p,
3255 const unsigned char *aData,
3256 unsigned int nData
3257 ){
3258 unsigned int i = 0;
3259 if( aData==0 ) return;
3260 #if SHA3_BYTEORDER==1234
3261 if( (p->nLoaded % 8)==0 && ((aData - (const unsigned char*)0)&7)==0 ){
3262 for(; i+7<nData; i+=8){
3263 p->u.s[p->nLoaded/8] ^= *(u64*)&aData[i];
3264 p->nLoaded += 8;
3265 if( p->nLoaded>=p->nRate ){
3266 KeccakF1600Step(p);
3267 p->nLoaded = 0;
3268 }
3269 }
3270 }
3271 #endif
3272 for(; i<nData; i++){
3273 #if SHA3_BYTEORDER==1234
3274 p->u.x[p->nLoaded] ^= aData[i];
3275 #elif SHA3_BYTEORDER==4321
3276 p->u.x[p->nLoaded^0x07] ^= aData[i];
3277 #else
3278 p->u.x[p->nLoaded^p->ixMask] ^= aData[i];
3279 #endif
3280 p->nLoaded++;
3281 if( p->nLoaded==p->nRate ){
3282 KeccakF1600Step(p);
3283 p->nLoaded = 0;
3284 }
3285 }
3286 }
3287
3288 /*
3289 ** After all content has been added, invoke SHA3Final() to compute
3290 ** the final hash. The function returns a pointer to the binary
3291 ** hash value.
3292 */
SHA3Final(SHA3Context * p)3293 static unsigned char *SHA3Final(SHA3Context *p){
3294 unsigned int i;
3295 if( p->nLoaded==p->nRate-1 ){
3296 const unsigned char c1 = 0x86;
3297 SHA3Update(p, &c1, 1);
3298 }else{
3299 const unsigned char c2 = 0x06;
3300 const unsigned char c3 = 0x80;
3301 SHA3Update(p, &c2, 1);
3302 p->nLoaded = p->nRate - 1;
3303 SHA3Update(p, &c3, 1);
3304 }
3305 for(i=0; i<p->nRate; i++){
3306 p->u.x[i+p->nRate] = p->u.x[i^p->ixMask];
3307 }
3308 return &p->u.x[p->nRate];
3309 }
3310 /* End of the hashing logic
3311 *****************************************************************************/
3312
3313 /*
3314 ** Implementation of the sha3(X,SIZE) function.
3315 **
3316 ** Return a BLOB which is the SIZE-bit SHA3 hash of X. The default
3317 ** size is 256. If X is a BLOB, it is hashed as is.
3318 ** For all other non-NULL types of input, X is converted into a UTF-8 string
3319 ** and the string is hashed without the trailing 0x00 terminator. The hash
3320 ** of a NULL value is NULL.
3321 */
sha3Func(sqlite3_context * context,int argc,sqlite3_value ** argv)3322 static void sha3Func(
3323 sqlite3_context *context,
3324 int argc,
3325 sqlite3_value **argv
3326 ){
3327 SHA3Context cx;
3328 int eType = sqlite3_value_type(argv[0]);
3329 int nByte = sqlite3_value_bytes(argv[0]);
3330 int iSize;
3331 if( argc==1 ){
3332 iSize = 256;
3333 }else{
3334 iSize = sqlite3_value_int(argv[1]);
3335 if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){
3336 sqlite3_result_error(context, "SHA3 size should be one of: 224 256 "
3337 "384 512", -1);
3338 return;
3339 }
3340 }
3341 if( eType==SQLITE_NULL ) return;
3342 SHA3Init(&cx, iSize);
3343 if( eType==SQLITE_BLOB ){
3344 SHA3Update(&cx, sqlite3_value_blob(argv[0]), nByte);
3345 }else{
3346 SHA3Update(&cx, sqlite3_value_text(argv[0]), nByte);
3347 }
3348 sqlite3_result_blob(context, SHA3Final(&cx), iSize/8, SQLITE_TRANSIENT);
3349 }
3350
3351 /* Compute a string using sqlite3_vsnprintf() with a maximum length
3352 ** of 50 bytes and add it to the hash.
3353 */
sha3_step_vformat(SHA3Context * p,const char * zFormat,...)3354 static void sha3_step_vformat(
3355 SHA3Context *p, /* Add content to this context */
3356 const char *zFormat,
3357 ...
3358 ){
3359 va_list ap;
3360 int n;
3361 char zBuf[50];
3362 va_start(ap, zFormat);
3363 sqlite3_vsnprintf(sizeof(zBuf),zBuf,zFormat,ap);
3364 va_end(ap);
3365 n = (int)strlen(zBuf);
3366 SHA3Update(p, (unsigned char*)zBuf, n);
3367 }
3368
3369 /*
3370 ** Implementation of the sha3_query(SQL,SIZE) function.
3371 **
3372 ** This function compiles and runs the SQL statement(s) given in the
3373 ** argument. The results are hashed using a SIZE-bit SHA3. The default
3374 ** size is 256.
3375 **
3376 ** The format of the byte stream that is hashed is summarized as follows:
3377 **
3378 ** S<n>:<sql>
3379 ** R
3380 ** N
3381 ** I<int>
3382 ** F<ieee-float>
3383 ** B<size>:<bytes>
3384 ** T<size>:<text>
3385 **
3386 ** <sql> is the original SQL text for each statement run and <n> is
3387 ** the size of that text. The SQL text is UTF-8. A single R character
3388 ** occurs before the start of each row. N means a NULL value.
3389 ** I mean an 8-byte little-endian integer <int>. F is a floating point
3390 ** number with an 8-byte little-endian IEEE floating point value <ieee-float>.
3391 ** B means blobs of <size> bytes. T means text rendered as <size>
3392 ** bytes of UTF-8. The <n> and <size> values are expressed as an ASCII
3393 ** text integers.
3394 **
3395 ** For each SQL statement in the X input, there is one S segment. Each
3396 ** S segment is followed by zero or more R segments, one for each row in the
3397 ** result set. After each R, there are one or more N, I, F, B, or T segments,
3398 ** one for each column in the result set. Segments are concatentated directly
3399 ** with no delimiters of any kind.
3400 */
sha3QueryFunc(sqlite3_context * context,int argc,sqlite3_value ** argv)3401 static void sha3QueryFunc(
3402 sqlite3_context *context,
3403 int argc,
3404 sqlite3_value **argv
3405 ){
3406 sqlite3 *db = sqlite3_context_db_handle(context);
3407 const char *zSql = (const char*)sqlite3_value_text(argv[0]);
3408 sqlite3_stmt *pStmt = 0;
3409 int nCol; /* Number of columns in the result set */
3410 int i; /* Loop counter */
3411 int rc;
3412 int n;
3413 const char *z;
3414 SHA3Context cx;
3415 int iSize;
3416
3417 if( argc==1 ){
3418 iSize = 256;
3419 }else{
3420 iSize = sqlite3_value_int(argv[1]);
3421 if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){
3422 sqlite3_result_error(context, "SHA3 size should be one of: 224 256 "
3423 "384 512", -1);
3424 return;
3425 }
3426 }
3427 if( zSql==0 ) return;
3428 SHA3Init(&cx, iSize);
3429 while( zSql[0] ){
3430 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zSql);
3431 if( rc ){
3432 char *zMsg = sqlite3_mprintf("error SQL statement [%s]: %s",
3433 zSql, sqlite3_errmsg(db));
3434 sqlite3_finalize(pStmt);
3435 sqlite3_result_error(context, zMsg, -1);
3436 sqlite3_free(zMsg);
3437 return;
3438 }
3439 if( !sqlite3_stmt_readonly(pStmt) ){
3440 char *zMsg = sqlite3_mprintf("non-query: [%s]", sqlite3_sql(pStmt));
3441 sqlite3_finalize(pStmt);
3442 sqlite3_result_error(context, zMsg, -1);
3443 sqlite3_free(zMsg);
3444 return;
3445 }
3446 nCol = sqlite3_column_count(pStmt);
3447 z = sqlite3_sql(pStmt);
3448 if( z ){
3449 n = (int)strlen(z);
3450 sha3_step_vformat(&cx,"S%d:",n);
3451 SHA3Update(&cx,(unsigned char*)z,n);
3452 }
3453
3454 /* Compute a hash over the result of the query */
3455 while( SQLITE_ROW==sqlite3_step(pStmt) ){
3456 SHA3Update(&cx,(const unsigned char*)"R",1);
3457 for(i=0; i<nCol; i++){
3458 switch( sqlite3_column_type(pStmt,i) ){
3459 case SQLITE_NULL: {
3460 SHA3Update(&cx, (const unsigned char*)"N",1);
3461 break;
3462 }
3463 case SQLITE_INTEGER: {
3464 sqlite3_uint64 u;
3465 int j;
3466 unsigned char x[9];
3467 sqlite3_int64 v = sqlite3_column_int64(pStmt,i);
3468 memcpy(&u, &v, 8);
3469 for(j=8; j>=1; j--){
3470 x[j] = u & 0xff;
3471 u >>= 8;
3472 }
3473 x[0] = 'I';
3474 SHA3Update(&cx, x, 9);
3475 break;
3476 }
3477 case SQLITE_FLOAT: {
3478 sqlite3_uint64 u;
3479 int j;
3480 unsigned char x[9];
3481 double r = sqlite3_column_double(pStmt,i);
3482 memcpy(&u, &r, 8);
3483 for(j=8; j>=1; j--){
3484 x[j] = u & 0xff;
3485 u >>= 8;
3486 }
3487 x[0] = 'F';
3488 SHA3Update(&cx,x,9);
3489 break;
3490 }
3491 case SQLITE_TEXT: {
3492 int n2 = sqlite3_column_bytes(pStmt, i);
3493 const unsigned char *z2 = sqlite3_column_text(pStmt, i);
3494 sha3_step_vformat(&cx,"T%d:",n2);
3495 SHA3Update(&cx, z2, n2);
3496 break;
3497 }
3498 case SQLITE_BLOB: {
3499 int n2 = sqlite3_column_bytes(pStmt, i);
3500 const unsigned char *z2 = sqlite3_column_blob(pStmt, i);
3501 sha3_step_vformat(&cx,"B%d:",n2);
3502 SHA3Update(&cx, z2, n2);
3503 break;
3504 }
3505 }
3506 }
3507 }
3508 sqlite3_finalize(pStmt);
3509 }
3510 sqlite3_result_blob(context, SHA3Final(&cx), iSize/8, SQLITE_TRANSIENT);
3511 }
3512
3513
3514 #ifdef _WIN32
3515
3516 #endif
sqlite3_shathree_init(sqlite3 * db,char ** pzErrMsg,const sqlite3_api_routines * pApi)3517 static int sqlite3_shathree_init(
3518 sqlite3 *db,
3519 char **pzErrMsg,
3520 const sqlite3_api_routines *pApi
3521 ){
3522 int rc = SQLITE_OK;
3523 SQLITE_EXTENSION_INIT2(pApi);
3524 (void)pzErrMsg; /* Unused parameter */
3525 rc = sqlite3_create_function(db, "sha3", 1,
3526 SQLITE_UTF8 | SQLITE_INNOCUOUS | SQLITE_DETERMINISTIC,
3527 0, sha3Func, 0, 0);
3528 if( rc==SQLITE_OK ){
3529 rc = sqlite3_create_function(db, "sha3", 2,
3530 SQLITE_UTF8 | SQLITE_INNOCUOUS | SQLITE_DETERMINISTIC,
3531 0, sha3Func, 0, 0);
3532 }
3533 if( rc==SQLITE_OK ){
3534 rc = sqlite3_create_function(db, "sha3_query", 1,
3535 SQLITE_UTF8 | SQLITE_DIRECTONLY,
3536 0, sha3QueryFunc, 0, 0);
3537 }
3538 if( rc==SQLITE_OK ){
3539 rc = sqlite3_create_function(db, "sha3_query", 2,
3540 SQLITE_UTF8 | SQLITE_DIRECTONLY,
3541 0, sha3QueryFunc, 0, 0);
3542 }
3543 return rc;
3544 }
3545
3546 /************************* End ../ext/misc/shathree.c ********************/
3547 /************************* Begin ../ext/misc/uint.c ******************/
3548 /*
3549 ** 2020-04-14
3550 **
3551 ** The author disclaims copyright to this source code. In place of
3552 ** a legal notice, here is a blessing:
3553 **
3554 ** May you do good and not evil.
3555 ** May you find forgiveness for yourself and forgive others.
3556 ** May you share freely, never taking more than you give.
3557 **
3558 ******************************************************************************
3559 **
3560 ** This SQLite extension implements the UINT collating sequence.
3561 **
3562 ** UINT works like BINARY for text, except that embedded strings
3563 ** of digits compare in numeric order.
3564 **
3565 ** * Leading zeros are handled properly, in the sense that
3566 ** they do not mess of the maginitude comparison of embedded
3567 ** strings of digits. "x00123y" is equal to "x123y".
3568 **
3569 ** * Only unsigned integers are recognized. Plus and minus
3570 ** signs are ignored. Decimal points and exponential notation
3571 ** are ignored.
3572 **
3573 ** * Embedded integers can be of arbitrary length. Comparison
3574 ** is *not* limited integers that can be expressed as a
3575 ** 64-bit machine integer.
3576 */
3577 /* #include "sqlite3ext.h" */
3578 SQLITE_EXTENSION_INIT1
3579 #include <assert.h>
3580 #include <string.h>
3581 #include <ctype.h>
3582
3583 /*
3584 ** Compare text in lexicographic order, except strings of digits
3585 ** compare in numeric order.
3586 */
uintCollFunc(void * notUsed,int nKey1,const void * pKey1,int nKey2,const void * pKey2)3587 static int uintCollFunc(
3588 void *notUsed,
3589 int nKey1, const void *pKey1,
3590 int nKey2, const void *pKey2
3591 ){
3592 const unsigned char *zA = (const unsigned char*)pKey1;
3593 const unsigned char *zB = (const unsigned char*)pKey2;
3594 int i=0, j=0, x;
3595 (void)notUsed;
3596 while( i<nKey1 && j<nKey2 ){
3597 x = zA[i] - zB[j];
3598 if( isdigit(zA[i]) ){
3599 int k;
3600 if( !isdigit(zB[j]) ) return x;
3601 while( i<nKey1 && zA[i]=='0' ){ i++; }
3602 while( j<nKey2 && zB[j]=='0' ){ j++; }
3603 k = 0;
3604 while( i+k<nKey1 && isdigit(zA[i+k])
3605 && j+k<nKey2 && isdigit(zB[j+k]) ){
3606 k++;
3607 }
3608 if( i+k<nKey1 && isdigit(zA[i+k]) ){
3609 return +1;
3610 }else if( j+k<nKey2 && isdigit(zB[j+k]) ){
3611 return -1;
3612 }else{
3613 x = memcmp(zA+i, zB+j, k);
3614 if( x ) return x;
3615 i += k;
3616 j += k;
3617 }
3618 }else if( x ){
3619 return x;
3620 }else{
3621 i++;
3622 j++;
3623 }
3624 }
3625 return (nKey1 - i) - (nKey2 - j);
3626 }
3627
3628 #ifdef _WIN32
3629
3630 #endif
sqlite3_uint_init(sqlite3 * db,char ** pzErrMsg,const sqlite3_api_routines * pApi)3631 static int sqlite3_uint_init(
3632 sqlite3 *db,
3633 char **pzErrMsg,
3634 const sqlite3_api_routines *pApi
3635 ){
3636 SQLITE_EXTENSION_INIT2(pApi);
3637 (void)pzErrMsg; /* Unused parameter */
3638 return sqlite3_create_collation(db, "uint", SQLITE_UTF8, 0, uintCollFunc);
3639 }
3640
3641 /************************* End ../ext/misc/uint.c ********************/
3642 /************************* Begin ../ext/misc/decimal.c ******************/
3643 /*
3644 ** 2020-06-22
3645 **
3646 ** The author disclaims copyright to this source code. In place of
3647 ** a legal notice, here is a blessing:
3648 **
3649 ** May you do good and not evil.
3650 ** May you find forgiveness for yourself and forgive others.
3651 ** May you share freely, never taking more than you give.
3652 **
3653 ******************************************************************************
3654 **
3655 ** Routines to implement arbitrary-precision decimal math.
3656 **
3657 ** The focus here is on simplicity and correctness, not performance.
3658 */
3659 /* #include "sqlite3ext.h" */
3660 SQLITE_EXTENSION_INIT1
3661 #include <assert.h>
3662 #include <string.h>
3663 #include <ctype.h>
3664 #include <stdlib.h>
3665
3666 /* Mark a function parameter as unused, to suppress nuisance compiler
3667 ** warnings. */
3668 #ifndef UNUSED_PARAMETER
3669 # define UNUSED_PARAMETER(X) (void)(X)
3670 #endif
3671
3672
3673 /* A decimal object */
3674 typedef struct Decimal Decimal;
3675 struct Decimal {
3676 char sign; /* 0 for positive, 1 for negative */
3677 char oom; /* True if an OOM is encountered */
3678 char isNull; /* True if holds a NULL rather than a number */
3679 char isInit; /* True upon initialization */
3680 int nDigit; /* Total number of digits */
3681 int nFrac; /* Number of digits to the right of the decimal point */
3682 signed char *a; /* Array of digits. Most significant first. */
3683 };
3684
3685 /*
3686 ** Release memory held by a Decimal, but do not free the object itself.
3687 */
decimal_clear(Decimal * p)3688 static void decimal_clear(Decimal *p){
3689 sqlite3_free(p->a);
3690 }
3691
3692 /*
3693 ** Destroy a Decimal object
3694 */
decimal_free(Decimal * p)3695 static void decimal_free(Decimal *p){
3696 if( p ){
3697 decimal_clear(p);
3698 sqlite3_free(p);
3699 }
3700 }
3701
3702 /*
3703 ** Allocate a new Decimal object initialized to the text in zIn[].
3704 ** Return NULL if any kind of error occurs.
3705 */
decimalNewFromText(const char * zIn,int n)3706 static Decimal *decimalNewFromText(const char *zIn, int n){
3707 Decimal *p = 0;
3708 int i;
3709 int iExp = 0;
3710
3711 p = sqlite3_malloc( sizeof(*p) );
3712 if( p==0 ) goto new_from_text_failed;
3713 p->sign = 0;
3714 p->oom = 0;
3715 p->isInit = 1;
3716 p->isNull = 0;
3717 p->nDigit = 0;
3718 p->nFrac = 0;
3719 p->a = sqlite3_malloc64( n+1 );
3720 if( p->a==0 ) goto new_from_text_failed;
3721 for(i=0; isspace((unsigned char)zIn[i]); i++){}
3722 if( zIn[i]=='-' ){
3723 p->sign = 1;
3724 i++;
3725 }else if( zIn[i]=='+' ){
3726 i++;
3727 }
3728 while( i<n && zIn[i]=='0' ) i++;
3729 while( i<n ){
3730 char c = zIn[i];
3731 if( c>='0' && c<='9' ){
3732 p->a[p->nDigit++] = c - '0';
3733 }else if( c=='.' ){
3734 p->nFrac = p->nDigit + 1;
3735 }else if( c=='e' || c=='E' ){
3736 int j = i+1;
3737 int neg = 0;
3738 if( j>=n ) break;
3739 if( zIn[j]=='-' ){
3740 neg = 1;
3741 j++;
3742 }else if( zIn[j]=='+' ){
3743 j++;
3744 }
3745 while( j<n && iExp<1000000 ){
3746 if( zIn[j]>='0' && zIn[j]<='9' ){
3747 iExp = iExp*10 + zIn[j] - '0';
3748 }
3749 j++;
3750 }
3751 if( neg ) iExp = -iExp;
3752 break;
3753 }
3754 i++;
3755 }
3756 if( p->nFrac ){
3757 p->nFrac = p->nDigit - (p->nFrac - 1);
3758 }
3759 if( iExp>0 ){
3760 if( p->nFrac>0 ){
3761 if( iExp<=p->nFrac ){
3762 p->nFrac -= iExp;
3763 iExp = 0;
3764 }else{
3765 iExp -= p->nFrac;
3766 p->nFrac = 0;
3767 }
3768 }
3769 if( iExp>0 ){
3770 p->a = sqlite3_realloc64(p->a, p->nDigit + iExp + 1 );
3771 if( p->a==0 ) goto new_from_text_failed;
3772 memset(p->a+p->nDigit, 0, iExp);
3773 p->nDigit += iExp;
3774 }
3775 }else if( iExp<0 ){
3776 int nExtra;
3777 iExp = -iExp;
3778 nExtra = p->nDigit - p->nFrac - 1;
3779 if( nExtra ){
3780 if( nExtra>=iExp ){
3781 p->nFrac += iExp;
3782 iExp = 0;
3783 }else{
3784 iExp -= nExtra;
3785 p->nFrac = p->nDigit - 1;
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 memmove(p->a+iExp, p->a, p->nDigit);
3792 memset(p->a, 0, iExp);
3793 p->nDigit += iExp;
3794 p->nFrac += iExp;
3795 }
3796 }
3797 return p;
3798
3799 new_from_text_failed:
3800 if( p ){
3801 if( p->a ) sqlite3_free(p->a);
3802 sqlite3_free(p);
3803 }
3804 return 0;
3805 }
3806
3807 /* Forward reference */
3808 static Decimal *decimalFromDouble(double);
3809
3810 /*
3811 ** Allocate a new Decimal object from an sqlite3_value. Return a pointer
3812 ** to the new object, or NULL if there is an error. If the pCtx argument
3813 ** is not NULL, then errors are reported on it as well.
3814 **
3815 ** If the pIn argument is SQLITE_TEXT or SQLITE_INTEGER, it is converted
3816 ** directly into a Decimal. For SQLITE_FLOAT or for SQLITE_BLOB of length
3817 ** 8 bytes, the resulting double value is expanded into its decimal equivalent.
3818 ** If pIn is NULL or if it is a BLOB that is not exactly 8 bytes in length,
3819 ** then NULL is returned.
3820 */
decimal_new(sqlite3_context * pCtx,sqlite3_value * pIn,int bTextOnly)3821 static Decimal *decimal_new(
3822 sqlite3_context *pCtx, /* Report error here, if not null */
3823 sqlite3_value *pIn, /* Construct the decimal object from this */
3824 int bTextOnly /* Always interpret pIn as text if true */
3825 ){
3826 Decimal *p = 0;
3827 int eType = sqlite3_value_type(pIn);
3828 if( bTextOnly && (eType==SQLITE_FLOAT || eType==SQLITE_BLOB) ){
3829 eType = SQLITE_TEXT;
3830 }
3831 switch( eType ){
3832 case SQLITE_TEXT:
3833 case SQLITE_INTEGER: {
3834 const char *zIn = (const char*)sqlite3_value_text(pIn);
3835 int n = sqlite3_value_bytes(pIn);
3836 p = decimalNewFromText(zIn, n);
3837 if( p==0 ) goto new_failed;
3838 break;
3839 }
3840
3841 case SQLITE_FLOAT: {
3842 p = decimalFromDouble(sqlite3_value_double(pIn));
3843 break;
3844 }
3845
3846 case SQLITE_BLOB: {
3847 const unsigned char *x;
3848 unsigned int i;
3849 sqlite3_uint64 v = 0;
3850 double r;
3851
3852 if( sqlite3_value_bytes(pIn)!=sizeof(r) ) break;
3853 x = sqlite3_value_blob(pIn);
3854 for(i=0; i<sizeof(r); i++){
3855 v = (v<<8) | x[i];
3856 }
3857 memcpy(&r, &v, sizeof(r));
3858 p = decimalFromDouble(r);
3859 break;
3860 }
3861
3862 case SQLITE_NULL: {
3863 break;
3864 }
3865 }
3866 return p;
3867
3868 new_failed:
3869 if( pCtx ) sqlite3_result_error_nomem(pCtx);
3870 sqlite3_free(p);
3871 return 0;
3872 }
3873
3874 /*
3875 ** Make the given Decimal the result.
3876 */
decimal_result(sqlite3_context * pCtx,Decimal * p)3877 static void decimal_result(sqlite3_context *pCtx, Decimal *p){
3878 char *z;
3879 int i, j;
3880 int n;
3881 if( p==0 || p->oom ){
3882 sqlite3_result_error_nomem(pCtx);
3883 return;
3884 }
3885 if( p->isNull ){
3886 sqlite3_result_null(pCtx);
3887 return;
3888 }
3889 z = sqlite3_malloc( p->nDigit+4 );
3890 if( z==0 ){
3891 sqlite3_result_error_nomem(pCtx);
3892 return;
3893 }
3894 i = 0;
3895 if( p->nDigit==0 || (p->nDigit==1 && p->a[0]==0) ){
3896 p->sign = 0;
3897 }
3898 if( p->sign ){
3899 z[0] = '-';
3900 i = 1;
3901 }
3902 n = p->nDigit - p->nFrac;
3903 if( n<=0 ){
3904 z[i++] = '0';
3905 }
3906 j = 0;
3907 while( n>1 && p->a[j]==0 ){
3908 j++;
3909 n--;
3910 }
3911 while( n>0 ){
3912 z[i++] = p->a[j] + '0';
3913 j++;
3914 n--;
3915 }
3916 if( p->nFrac ){
3917 z[i++] = '.';
3918 do{
3919 z[i++] = p->a[j] + '0';
3920 j++;
3921 }while( j<p->nDigit );
3922 }
3923 z[i] = 0;
3924 sqlite3_result_text(pCtx, z, i, sqlite3_free);
3925 }
3926
3927 /*
3928 ** Make the given Decimal the result in an format similar to '%+#e'.
3929 ** In other words, show exponential notation with leading and trailing
3930 ** zeros omitted.
3931 */
decimal_result_sci(sqlite3_context * pCtx,Decimal * p)3932 static void decimal_result_sci(sqlite3_context *pCtx, Decimal *p){
3933 char *z; /* The output buffer */
3934 int i; /* Loop counter */
3935 int nZero; /* Number of leading zeros */
3936 int nDigit; /* Number of digits not counting trailing zeros */
3937 int nFrac; /* Digits to the right of the decimal point */
3938 int exp; /* Exponent value */
3939 signed char zero; /* Zero value */
3940 signed char *a; /* Array of digits */
3941
3942 if( p==0 || p->oom ){
3943 sqlite3_result_error_nomem(pCtx);
3944 return;
3945 }
3946 if( p->isNull ){
3947 sqlite3_result_null(pCtx);
3948 return;
3949 }
3950 for(nDigit=p->nDigit; nDigit>0 && p->a[nDigit-1]==0; nDigit--){}
3951 for(nZero=0; nZero<nDigit && p->a[nZero]==0; nZero++){}
3952 nFrac = p->nFrac + (nDigit - p->nDigit);
3953 nDigit -= nZero;
3954 z = sqlite3_malloc( nDigit+20 );
3955 if( z==0 ){
3956 sqlite3_result_error_nomem(pCtx);
3957 return;
3958 }
3959 if( nDigit==0 ){
3960 zero = 0;
3961 a = &zero;
3962 nDigit = 1;
3963 nFrac = 0;
3964 }else{
3965 a = &p->a[nZero];
3966 }
3967 if( p->sign && nDigit>0 ){
3968 z[0] = '-';
3969 }else{
3970 z[0] = '+';
3971 }
3972 z[1] = a[0]+'0';
3973 z[2] = '.';
3974 if( nDigit==1 ){
3975 z[3] = '0';
3976 i = 4;
3977 }else{
3978 for(i=1; i<nDigit; i++){
3979 z[2+i] = a[i]+'0';
3980 }
3981 i = nDigit+2;
3982 }
3983 exp = nDigit - nFrac - 1;
3984 sqlite3_snprintf(nDigit+20-i, &z[i], "e%+03d", exp);
3985 sqlite3_result_text(pCtx, z, -1, sqlite3_free);
3986 }
3987
3988 /*
3989 ** Compare to Decimal objects. Return negative, 0, or positive if the
3990 ** first object is less than, equal to, or greater than the second.
3991 **
3992 ** Preconditions for this routine:
3993 **
3994 ** pA!=0
3995 ** pA->isNull==0
3996 ** pB!=0
3997 ** pB->isNull==0
3998 */
decimal_cmp(const Decimal * pA,const Decimal * pB)3999 static int decimal_cmp(const Decimal *pA, const Decimal *pB){
4000 int nASig, nBSig, rc, n;
4001 if( pA->sign!=pB->sign ){
4002 return pA->sign ? -1 : +1;
4003 }
4004 if( pA->sign ){
4005 const Decimal *pTemp = pA;
4006 pA = pB;
4007 pB = pTemp;
4008 }
4009 nASig = pA->nDigit - pA->nFrac;
4010 nBSig = pB->nDigit - pB->nFrac;
4011 if( nASig!=nBSig ){
4012 return nASig - nBSig;
4013 }
4014 n = pA->nDigit;
4015 if( n>pB->nDigit ) n = pB->nDigit;
4016 rc = memcmp(pA->a, pB->a, n);
4017 if( rc==0 ){
4018 rc = pA->nDigit - pB->nDigit;
4019 }
4020 return rc;
4021 }
4022
4023 /*
4024 ** SQL Function: decimal_cmp(X, Y)
4025 **
4026 ** Return negative, zero, or positive if X is less then, equal to, or
4027 ** greater than Y.
4028 */
decimalCmpFunc(sqlite3_context * context,int argc,sqlite3_value ** argv)4029 static void decimalCmpFunc(
4030 sqlite3_context *context,
4031 int argc,
4032 sqlite3_value **argv
4033 ){
4034 Decimal *pA = 0, *pB = 0;
4035 int rc;
4036
4037 UNUSED_PARAMETER(argc);
4038 pA = decimal_new(context, argv[0], 1);
4039 if( pA==0 || pA->isNull ) goto cmp_done;
4040 pB = decimal_new(context, argv[1], 1);
4041 if( pB==0 || pB->isNull ) goto cmp_done;
4042 rc = decimal_cmp(pA, pB);
4043 if( rc<0 ) rc = -1;
4044 else if( rc>0 ) rc = +1;
4045 sqlite3_result_int(context, rc);
4046 cmp_done:
4047 decimal_free(pA);
4048 decimal_free(pB);
4049 }
4050
4051 /*
4052 ** Expand the Decimal so that it has a least nDigit digits and nFrac
4053 ** digits to the right of the decimal point.
4054 */
decimal_expand(Decimal * p,int nDigit,int nFrac)4055 static void decimal_expand(Decimal *p, int nDigit, int nFrac){
4056 int nAddSig;
4057 int nAddFrac;
4058 if( p==0 ) return;
4059 nAddFrac = nFrac - p->nFrac;
4060 nAddSig = (nDigit - p->nDigit) - nAddFrac;
4061 if( nAddFrac==0 && nAddSig==0 ) return;
4062 p->a = sqlite3_realloc64(p->a, nDigit+1);
4063 if( p->a==0 ){
4064 p->oom = 1;
4065 return;
4066 }
4067 if( nAddSig ){
4068 memmove(p->a+nAddSig, p->a, p->nDigit);
4069 memset(p->a, 0, nAddSig);
4070 p->nDigit += nAddSig;
4071 }
4072 if( nAddFrac ){
4073 memset(p->a+p->nDigit, 0, nAddFrac);
4074 p->nDigit += nAddFrac;
4075 p->nFrac += nAddFrac;
4076 }
4077 }
4078
4079 /*
4080 ** Add the value pB into pA. A := A + B.
4081 **
4082 ** Both pA and pB might become denormalized by this routine.
4083 */
decimal_add(Decimal * pA,Decimal * pB)4084 static void decimal_add(Decimal *pA, Decimal *pB){
4085 int nSig, nFrac, nDigit;
4086 int i, rc;
4087 if( pA==0 ){
4088 return;
4089 }
4090 if( pA->oom || pB==0 || pB->oom ){
4091 pA->oom = 1;
4092 return;
4093 }
4094 if( pA->isNull || pB->isNull ){
4095 pA->isNull = 1;
4096 return;
4097 }
4098 nSig = pA->nDigit - pA->nFrac;
4099 if( nSig && pA->a[0]==0 ) nSig--;
4100 if( nSig<pB->nDigit-pB->nFrac ){
4101 nSig = pB->nDigit - pB->nFrac;
4102 }
4103 nFrac = pA->nFrac;
4104 if( nFrac<pB->nFrac ) nFrac = pB->nFrac;
4105 nDigit = nSig + nFrac + 1;
4106 decimal_expand(pA, nDigit, nFrac);
4107 decimal_expand(pB, nDigit, nFrac);
4108 if( pA->oom || pB->oom ){
4109 pA->oom = 1;
4110 }else{
4111 if( pA->sign==pB->sign ){
4112 int carry = 0;
4113 for(i=nDigit-1; i>=0; i--){
4114 int x = pA->a[i] + pB->a[i] + carry;
4115 if( x>=10 ){
4116 carry = 1;
4117 pA->a[i] = x - 10;
4118 }else{
4119 carry = 0;
4120 pA->a[i] = x;
4121 }
4122 }
4123 }else{
4124 signed char *aA, *aB;
4125 int borrow = 0;
4126 rc = memcmp(pA->a, pB->a, nDigit);
4127 if( rc<0 ){
4128 aA = pB->a;
4129 aB = pA->a;
4130 pA->sign = !pA->sign;
4131 }else{
4132 aA = pA->a;
4133 aB = pB->a;
4134 }
4135 for(i=nDigit-1; i>=0; i--){
4136 int x = aA[i] - aB[i] - borrow;
4137 if( x<0 ){
4138 pA->a[i] = x+10;
4139 borrow = 1;
4140 }else{
4141 pA->a[i] = x;
4142 borrow = 0;
4143 }
4144 }
4145 }
4146 }
4147 }
4148
4149 /*
4150 ** Multiply A by B. A := A * B
4151 **
4152 ** All significant digits after the decimal point are retained.
4153 ** Trailing zeros after the decimal point are omitted as long as
4154 ** the number of digits after the decimal point is no less than
4155 ** either the number of digits in either input.
4156 */
decimalMul(Decimal * pA,Decimal * pB)4157 static void decimalMul(Decimal *pA, Decimal *pB){
4158 signed char *acc = 0;
4159 int i, j, k;
4160 int minFrac;
4161
4162 if( pA==0 || pA->oom || pA->isNull
4163 || pB==0 || pB->oom || pB->isNull
4164 ){
4165 goto mul_end;
4166 }
4167 acc = sqlite3_malloc64( pA->nDigit + pB->nDigit + 2 );
4168 if( acc==0 ){
4169 pA->oom = 1;
4170 goto mul_end;
4171 }
4172 memset(acc, 0, pA->nDigit + pB->nDigit + 2);
4173 minFrac = pA->nFrac;
4174 if( pB->nFrac<minFrac ) minFrac = pB->nFrac;
4175 for(i=pA->nDigit-1; i>=0; i--){
4176 signed char f = pA->a[i];
4177 int carry = 0, x;
4178 for(j=pB->nDigit-1, k=i+j+3; j>=0; j--, k--){
4179 x = acc[k] + f*pB->a[j] + carry;
4180 acc[k] = x%10;
4181 carry = x/10;
4182 }
4183 x = acc[k] + carry;
4184 acc[k] = x%10;
4185 acc[k-1] += x/10;
4186 }
4187 sqlite3_free(pA->a);
4188 pA->a = acc;
4189 acc = 0;
4190 pA->nDigit += pB->nDigit + 2;
4191 pA->nFrac += pB->nFrac;
4192 pA->sign ^= pB->sign;
4193 while( pA->nFrac>minFrac && pA->a[pA->nDigit-1]==0 ){
4194 pA->nFrac--;
4195 pA->nDigit--;
4196 }
4197
4198 mul_end:
4199 sqlite3_free(acc);
4200 }
4201
4202 /*
4203 ** Create a new Decimal object that contains an integer power of 2.
4204 */
decimalPow2(int N)4205 static Decimal *decimalPow2(int N){
4206 Decimal *pA = 0; /* The result to be returned */
4207 Decimal *pX = 0; /* Multiplier */
4208 if( N<-20000 || N>20000 ) goto pow2_fault;
4209 pA = decimalNewFromText("1.0", 3);
4210 if( pA==0 || pA->oom ) goto pow2_fault;
4211 if( N==0 ) return pA;
4212 if( N>0 ){
4213 pX = decimalNewFromText("2.0", 3);
4214 }else{
4215 N = -N;
4216 pX = decimalNewFromText("0.5", 3);
4217 }
4218 if( pX==0 || pX->oom ) goto pow2_fault;
4219 while( 1 /* Exit by break */ ){
4220 if( N & 1 ){
4221 decimalMul(pA, pX);
4222 if( pA->oom ) goto pow2_fault;
4223 }
4224 N >>= 1;
4225 if( N==0 ) break;
4226 decimalMul(pX, pX);
4227 }
4228 decimal_free(pX);
4229 return pA;
4230
4231 pow2_fault:
4232 decimal_free(pA);
4233 decimal_free(pX);
4234 return 0;
4235 }
4236
4237 /*
4238 ** Use an IEEE754 binary64 ("double") to generate a new Decimal object.
4239 */
decimalFromDouble(double r)4240 static Decimal *decimalFromDouble(double r){
4241 sqlite3_int64 m, a;
4242 int e;
4243 int isNeg;
4244 Decimal *pA;
4245 Decimal *pX;
4246 char zNum[100];
4247 if( r<0.0 ){
4248 isNeg = 1;
4249 r = -r;
4250 }else{
4251 isNeg = 0;
4252 }
4253 memcpy(&a,&r,sizeof(a));
4254 if( a==0 ){
4255 e = 0;
4256 m = 0;
4257 }else{
4258 e = a>>52;
4259 m = a & ((((sqlite3_int64)1)<<52)-1);
4260 if( e==0 ){
4261 m <<= 1;
4262 }else{
4263 m |= ((sqlite3_int64)1)<<52;
4264 }
4265 while( e<1075 && m>0 && (m&1)==0 ){
4266 m >>= 1;
4267 e++;
4268 }
4269 if( isNeg ) m = -m;
4270 e = e - 1075;
4271 if( e>971 ){
4272 return 0; /* A NaN or an Infinity */
4273 }
4274 }
4275
4276 /* At this point m is the integer significand and e is the exponent */
4277 sqlite3_snprintf(sizeof(zNum), zNum, "%lld", m);
4278 pA = decimalNewFromText(zNum, (int)strlen(zNum));
4279 pX = decimalPow2(e);
4280 decimalMul(pA, pX);
4281 decimal_free(pX);
4282 return pA;
4283 }
4284
4285 /*
4286 ** SQL Function: decimal(X)
4287 ** OR: decimal_exp(X)
4288 **
4289 ** Convert input X into decimal and then back into text.
4290 **
4291 ** If X is originally a float, then a full decimal expansion of that floating
4292 ** point value is done. Or if X is an 8-byte blob, it is interpreted
4293 ** as a float and similarly expanded.
4294 **
4295 ** The decimal_exp(X) function returns the result in exponential notation.
4296 ** decimal(X) returns a complete decimal, without the e+NNN at the end.
4297 */
decimalFunc(sqlite3_context * context,int argc,sqlite3_value ** argv)4298 static void decimalFunc(
4299 sqlite3_context *context,
4300 int argc,
4301 sqlite3_value **argv
4302 ){
4303 Decimal *p = decimal_new(context, argv[0], 0);
4304 UNUSED_PARAMETER(argc);
4305 if( p ){
4306 if( sqlite3_user_data(context)!=0 ){
4307 decimal_result_sci(context, p);
4308 }else{
4309 decimal_result(context, p);
4310 }
4311 decimal_free(p);
4312 }
4313 }
4314
4315 /*
4316 ** Compare text in decimal order.
4317 */
decimalCollFunc(void * notUsed,int nKey1,const void * pKey1,int nKey2,const void * pKey2)4318 static int decimalCollFunc(
4319 void *notUsed,
4320 int nKey1, const void *pKey1,
4321 int nKey2, const void *pKey2
4322 ){
4323 const unsigned char *zA = (const unsigned char*)pKey1;
4324 const unsigned char *zB = (const unsigned char*)pKey2;
4325 Decimal *pA = decimalNewFromText((const char*)zA, nKey1);
4326 Decimal *pB = decimalNewFromText((const char*)zB, nKey2);
4327 int rc;
4328 UNUSED_PARAMETER(notUsed);
4329 if( pA==0 || pB==0 ){
4330 rc = 0;
4331 }else{
4332 rc = decimal_cmp(pA, pB);
4333 }
4334 decimal_free(pA);
4335 decimal_free(pB);
4336 return rc;
4337 }
4338
4339
4340 /*
4341 ** SQL Function: decimal_add(X, Y)
4342 ** decimal_sub(X, Y)
4343 **
4344 ** Return the sum or difference of X and Y.
4345 */
decimalAddFunc(sqlite3_context * context,int argc,sqlite3_value ** argv)4346 static void decimalAddFunc(
4347 sqlite3_context *context,
4348 int argc,
4349 sqlite3_value **argv
4350 ){
4351 Decimal *pA = decimal_new(context, argv[0], 1);
4352 Decimal *pB = decimal_new(context, argv[1], 1);
4353 UNUSED_PARAMETER(argc);
4354 decimal_add(pA, pB);
4355 decimal_result(context, pA);
4356 decimal_free(pA);
4357 decimal_free(pB);
4358 }
decimalSubFunc(sqlite3_context * context,int argc,sqlite3_value ** argv)4359 static void decimalSubFunc(
4360 sqlite3_context *context,
4361 int argc,
4362 sqlite3_value **argv
4363 ){
4364 Decimal *pA = decimal_new(context, argv[0], 1);
4365 Decimal *pB = decimal_new(context, argv[1], 1);
4366 UNUSED_PARAMETER(argc);
4367 if( pB ){
4368 pB->sign = !pB->sign;
4369 decimal_add(pA, pB);
4370 decimal_result(context, pA);
4371 }
4372 decimal_free(pA);
4373 decimal_free(pB);
4374 }
4375
4376 /* Aggregate funcion: decimal_sum(X)
4377 **
4378 ** Works like sum() except that it uses decimal arithmetic for unlimited
4379 ** precision.
4380 */
decimalSumStep(sqlite3_context * context,int argc,sqlite3_value ** argv)4381 static void decimalSumStep(
4382 sqlite3_context *context,
4383 int argc,
4384 sqlite3_value **argv
4385 ){
4386 Decimal *p;
4387 Decimal *pArg;
4388 UNUSED_PARAMETER(argc);
4389 p = sqlite3_aggregate_context(context, sizeof(*p));
4390 if( p==0 ) return;
4391 if( !p->isInit ){
4392 p->isInit = 1;
4393 p->a = sqlite3_malloc(2);
4394 if( p->a==0 ){
4395 p->oom = 1;
4396 }else{
4397 p->a[0] = 0;
4398 }
4399 p->nDigit = 1;
4400 p->nFrac = 0;
4401 }
4402 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
4403 pArg = decimal_new(context, argv[0], 1);
4404 decimal_add(p, pArg);
4405 decimal_free(pArg);
4406 }
decimalSumInverse(sqlite3_context * context,int argc,sqlite3_value ** argv)4407 static void decimalSumInverse(
4408 sqlite3_context *context,
4409 int argc,
4410 sqlite3_value **argv
4411 ){
4412 Decimal *p;
4413 Decimal *pArg;
4414 UNUSED_PARAMETER(argc);
4415 p = sqlite3_aggregate_context(context, sizeof(*p));
4416 if( p==0 ) return;
4417 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
4418 pArg = decimal_new(context, argv[0], 1);
4419 if( pArg ) pArg->sign = !pArg->sign;
4420 decimal_add(p, pArg);
4421 decimal_free(pArg);
4422 }
decimalSumValue(sqlite3_context * context)4423 static void decimalSumValue(sqlite3_context *context){
4424 Decimal *p = sqlite3_aggregate_context(context, 0);
4425 if( p==0 ) return;
4426 decimal_result(context, p);
4427 }
decimalSumFinalize(sqlite3_context * context)4428 static void decimalSumFinalize(sqlite3_context *context){
4429 Decimal *p = sqlite3_aggregate_context(context, 0);
4430 if( p==0 ) return;
4431 decimal_result(context, p);
4432 decimal_clear(p);
4433 }
4434
4435 /*
4436 ** SQL Function: decimal_mul(X, Y)
4437 **
4438 ** Return the product of X and Y.
4439 */
decimalMulFunc(sqlite3_context * context,int argc,sqlite3_value ** argv)4440 static void decimalMulFunc(
4441 sqlite3_context *context,
4442 int argc,
4443 sqlite3_value **argv
4444 ){
4445 Decimal *pA = decimal_new(context, argv[0], 1);
4446 Decimal *pB = decimal_new(context, argv[1], 1);
4447 UNUSED_PARAMETER(argc);
4448 if( pA==0 || pA->oom || pA->isNull
4449 || pB==0 || pB->oom || pB->isNull
4450 ){
4451 goto mul_end;
4452 }
4453 decimalMul(pA, pB);
4454 if( pA->oom ){
4455 goto mul_end;
4456 }
4457 decimal_result(context, pA);
4458
4459 mul_end:
4460 decimal_free(pA);
4461 decimal_free(pB);
4462 }
4463
4464 /*
4465 ** SQL Function: decimal_pow2(N)
4466 **
4467 ** Return the N-th power of 2. N must be an integer.
4468 */
decimalPow2Func(sqlite3_context * context,int argc,sqlite3_value ** argv)4469 static void decimalPow2Func(
4470 sqlite3_context *context,
4471 int argc,
4472 sqlite3_value **argv
4473 ){
4474 UNUSED_PARAMETER(argc);
4475 if( sqlite3_value_type(argv[0])==SQLITE_INTEGER ){
4476 Decimal *pA = decimalPow2(sqlite3_value_int(argv[0]));
4477 decimal_result_sci(context, pA);
4478 decimal_free(pA);
4479 }
4480 }
4481
4482 #ifdef _WIN32
4483
4484 #endif
sqlite3_decimal_init(sqlite3 * db,char ** pzErrMsg,const sqlite3_api_routines * pApi)4485 static int sqlite3_decimal_init(
4486 sqlite3 *db,
4487 char **pzErrMsg,
4488 const sqlite3_api_routines *pApi
4489 ){
4490 int rc = SQLITE_OK;
4491 static const struct {
4492 const char *zFuncName;
4493 int nArg;
4494 int iArg;
4495 void (*xFunc)(sqlite3_context*,int,sqlite3_value**);
4496 } aFunc[] = {
4497 { "decimal", 1, 0, decimalFunc },
4498 { "decimal_exp", 1, 1, decimalFunc },
4499 { "decimal_cmp", 2, 0, decimalCmpFunc },
4500 { "decimal_add", 2, 0, decimalAddFunc },
4501 { "decimal_sub", 2, 0, decimalSubFunc },
4502 { "decimal_mul", 2, 0, decimalMulFunc },
4503 { "decimal_pow2", 1, 0, decimalPow2Func },
4504 };
4505 unsigned int i;
4506 (void)pzErrMsg; /* Unused parameter */
4507
4508 SQLITE_EXTENSION_INIT2(pApi);
4509
4510 for(i=0; i<(int)(sizeof(aFunc)/sizeof(aFunc[0])) && rc==SQLITE_OK; i++){
4511 rc = sqlite3_create_function(db, aFunc[i].zFuncName, aFunc[i].nArg,
4512 SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC,
4513 aFunc[i].iArg ? db : 0, aFunc[i].xFunc, 0, 0);
4514 }
4515 if( rc==SQLITE_OK ){
4516 rc = sqlite3_create_window_function(db, "decimal_sum", 1,
4517 SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC, 0,
4518 decimalSumStep, decimalSumFinalize,
4519 decimalSumValue, decimalSumInverse, 0);
4520 }
4521 if( rc==SQLITE_OK ){
4522 rc = sqlite3_create_collation(db, "decimal", SQLITE_UTF8,
4523 0, decimalCollFunc);
4524 }
4525 return rc;
4526 }
4527
4528 /************************* End ../ext/misc/decimal.c ********************/
4529 #undef sqlite3_base_init
4530 #define sqlite3_base_init sqlite3_base64_init
4531 /************************* Begin ../ext/misc/base64.c ******************/
4532 /*
4533 ** 2022-11-18
4534 **
4535 ** The author disclaims copyright to this source code. In place of
4536 ** a legal notice, here is a blessing:
4537 **
4538 ** May you do good and not evil.
4539 ** May you find forgiveness for yourself and forgive others.
4540 ** May you share freely, never taking more than you give.
4541 **
4542 *************************************************************************
4543 **
4544 ** This is a SQLite extension for converting in either direction
4545 ** between a (binary) blob and base64 text. Base64 can transit a
4546 ** sane USASCII channel unmolested. It also plays nicely in CSV or
4547 ** written as TCL brace-enclosed literals or SQL string literals,
4548 ** and can be used unmodified in XML-like documents.
4549 **
4550 ** This is an independent implementation of conversions specified in
4551 ** RFC 4648, done on the above date by the author (Larry Brasfield)
4552 ** who thereby has the right to put this into the public domain.
4553 **
4554 ** The conversions meet RFC 4648 requirements, provided that this
4555 ** C source specifies that line-feeds are included in the encoded
4556 ** data to limit visible line lengths to 72 characters and to
4557 ** terminate any encoded blob having non-zero length.
4558 **
4559 ** Length limitations are not imposed except that the runtime
4560 ** SQLite string or blob length limits are respected. Otherwise,
4561 ** any length binary sequence can be represented and recovered.
4562 ** Generated base64 sequences, with their line-feeds included,
4563 ** can be concatenated; the result converted back to binary will
4564 ** be the concatenation of the represented binary sequences.
4565 **
4566 ** This SQLite3 extension creates a function, base64(x), which
4567 ** either: converts text x containing base64 to a returned blob;
4568 ** or converts a blob x to returned text containing base64. An
4569 ** error will be thrown for other input argument types.
4570 **
4571 ** This code relies on UTF-8 encoding only with respect to the
4572 ** meaning of the first 128 (7-bit) codes matching that of USASCII.
4573 ** It will fail miserably if somehow made to try to convert EBCDIC.
4574 ** Because it is table-driven, it could be enhanced to handle that,
4575 ** but the world and SQLite have moved on from that anachronism.
4576 **
4577 ** To build the extension:
4578 ** Set shell variable SQDIR=<your favorite SQLite checkout directory>
4579 ** *Nix: gcc -O2 -shared -I$SQDIR -fPIC -o base64.so base64.c
4580 ** OSX: gcc -O2 -dynamiclib -fPIC -I$SQDIR -o base64.dylib base64.c
4581 ** Win32: gcc -O2 -shared -I%SQDIR% -o base64.dll base64.c
4582 ** Win32: cl /Os -I%SQDIR% base64.c -link -dll -out:base64.dll
4583 */
4584
4585 #include <assert.h>
4586
4587 /* #include "sqlite3ext.h" */
4588
4589 #ifndef deliberate_fall_through
4590 /* Quiet some compilers about some of our intentional code. */
4591 # if GCC_VERSION>=7000000
4592 # define deliberate_fall_through __attribute__((fallthrough));
4593 # else
4594 # define deliberate_fall_through
4595 # endif
4596 #endif
4597
4598 SQLITE_EXTENSION_INIT1;
4599
4600 #define PC 0x80 /* pad character */
4601 #define WS 0x81 /* whitespace */
4602 #define ND 0x82 /* Not above or digit-value */
4603 #define PAD_CHAR '='
4604
4605 #ifndef U8_TYPEDEF
4606 /* typedef unsigned char u8; */
4607 #define U8_TYPEDEF
4608 #endif
4609
4610 /* Decoding table, ASCII (7-bit) value to base 64 digit value or other */
4611 static const u8 b64DigitValues[128] = {
4612 /* HT LF VT FF CR */
4613 ND,ND,ND,ND, ND,ND,ND,ND, ND,WS,WS,WS, WS,WS,ND,ND,
4614 /* US */
4615 ND,ND,ND,ND, ND,ND,ND,ND, ND,ND,ND,ND, ND,ND,ND,ND,
4616 /*sp + / */
4617 WS,ND,ND,ND, ND,ND,ND,ND, ND,ND,ND,62, ND,ND,ND,63,
4618 /* 0 1 5 9 = */
4619 52,53,54,55, 56,57,58,59, 60,61,ND,ND, ND,PC,ND,ND,
4620 /* A O */
4621 ND, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11,12,13,14,
4622 /* P Z */
4623 15,16,17,18, 19,20,21,22, 23,24,25,ND, ND,ND,ND,ND,
4624 /* a o */
4625 ND,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40,
4626 /* p z */
4627 41,42,43,44, 45,46,47,48, 49,50,51,ND, ND,ND,ND,ND
4628 };
4629
4630 static const char b64Numerals[64+1]
4631 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
4632
4633 #define BX_DV_PROTO(c) \
4634 ((((u8)(c))<0x80)? (u8)(b64DigitValues[(u8)(c)]) : 0x80)
4635 #define IS_BX_DIGIT(bdp) (((u8)(bdp))<0x80)
4636 #define IS_BX_WS(bdp) ((bdp)==WS)
4637 #define IS_BX_PAD(bdp) ((bdp)==PC)
4638 #define BX_NUMERAL(dv) (b64Numerals[(u8)(dv)])
4639 /* Width of base64 lines. Should be an integer multiple of 4. */
4640 #define B64_DARK_MAX 72
4641
4642 /* Encode a byte buffer into base64 text with linefeeds appended to limit
4643 ** encoded group lengths to B64_DARK_MAX or to terminate the last group.
4644 */
toBase64(u8 * pIn,int nbIn,char * pOut)4645 static char* toBase64( u8 *pIn, int nbIn, char *pOut ){
4646 int nCol = 0;
4647 while( nbIn >= 3 ){
4648 /* Do the bit-shuffle, exploiting unsigned input to avoid masking. */
4649 pOut[0] = BX_NUMERAL(pIn[0]>>2);
4650 pOut[1] = BX_NUMERAL(((pIn[0]<<4)|(pIn[1]>>4))&0x3f);
4651 pOut[2] = BX_NUMERAL(((pIn[1]&0xf)<<2)|(pIn[2]>>6));
4652 pOut[3] = BX_NUMERAL(pIn[2]&0x3f);
4653 pOut += 4;
4654 nbIn -= 3;
4655 pIn += 3;
4656 if( (nCol += 4)>=B64_DARK_MAX || nbIn<=0 ){
4657 *pOut++ = '\n';
4658 nCol = 0;
4659 }
4660 }
4661 if( nbIn > 0 ){
4662 signed char nco = nbIn+1;
4663 int nbe;
4664 unsigned long qv = *pIn++;
4665 for( nbe=1; nbe<3; ++nbe ){
4666 qv <<= 8;
4667 if( nbe<nbIn ) qv |= *pIn++;
4668 }
4669 for( nbe=3; nbe>=0; --nbe ){
4670 char ce = (nbe<nco)? BX_NUMERAL((u8)(qv & 0x3f)) : PAD_CHAR;
4671 qv >>= 6;
4672 pOut[nbe] = ce;
4673 }
4674 pOut += 4;
4675 *pOut++ = '\n';
4676 }
4677 *pOut = 0;
4678 return pOut;
4679 }
4680
4681 /* Skip over text which is not base64 numeral(s). */
skipNonB64(char * s,int nc)4682 static char * skipNonB64( char *s, int nc ){
4683 char c;
4684 while( nc-- > 0 && (c = *s) && !IS_BX_DIGIT(BX_DV_PROTO(c)) ) ++s;
4685 return s;
4686 }
4687
4688 /* Decode base64 text into a byte buffer. */
fromBase64(char * pIn,int ncIn,u8 * pOut)4689 static u8* fromBase64( char *pIn, int ncIn, u8 *pOut ){
4690 if( ncIn>0 && pIn[ncIn-1]=='\n' ) --ncIn;
4691 while( ncIn>0 && *pIn!=PAD_CHAR ){
4692 static signed char nboi[] = { 0, 0, 1, 2, 3 };
4693 char *pUse = skipNonB64(pIn, ncIn);
4694 unsigned long qv = 0L;
4695 int nti, nbo, nac;
4696 ncIn -= (pUse - pIn);
4697 pIn = pUse;
4698 nti = (ncIn>4)? 4 : ncIn;
4699 ncIn -= nti;
4700 nbo = nboi[nti];
4701 if( nbo==0 ) break;
4702 for( nac=0; nac<4; ++nac ){
4703 char c = (nac<nti)? *pIn++ : b64Numerals[0];
4704 u8 bdp = BX_DV_PROTO(c);
4705 switch( bdp ){
4706 case ND:
4707 /* Treat dark non-digits as pad, but they terminate decode too. */
4708 ncIn = 0;
4709 deliberate_fall_through;
4710 case WS:
4711 /* Treat whitespace as pad and terminate this group.*/
4712 nti = nac;
4713 deliberate_fall_through;
4714 case PC:
4715 bdp = 0;
4716 --nbo;
4717 deliberate_fall_through;
4718 default: /* bdp is the digit value. */
4719 qv = qv<<6 | bdp;
4720 break;
4721 }
4722 }
4723 switch( nbo ){
4724 case 3:
4725 pOut[2] = (qv) & 0xff;
4726 case 2:
4727 pOut[1] = (qv>>8) & 0xff;
4728 case 1:
4729 pOut[0] = (qv>>16) & 0xff;
4730 }
4731 pOut += nbo;
4732 }
4733 return pOut;
4734 }
4735
4736 /* This function does the work for the SQLite base64(x) UDF. */
base64(sqlite3_context * context,int na,sqlite3_value * av[])4737 static void base64(sqlite3_context *context, int na, sqlite3_value *av[]){
4738 int nb, nc, nv = sqlite3_value_bytes(av[0]);
4739 int nvMax = sqlite3_limit(sqlite3_context_db_handle(context),
4740 SQLITE_LIMIT_LENGTH, -1);
4741 char *cBuf;
4742 u8 *bBuf;
4743 assert(na==1);
4744 switch( sqlite3_value_type(av[0]) ){
4745 case SQLITE_BLOB:
4746 nb = nv;
4747 nc = 4*(nv+2/3); /* quads needed */
4748 nc += (nc+(B64_DARK_MAX-1))/B64_DARK_MAX + 1; /* LFs and a 0-terminator */
4749 if( nvMax < nc ){
4750 sqlite3_result_error(context, "blob expanded to base64 too big", -1);
4751 return;
4752 }
4753 bBuf = (u8*)sqlite3_value_blob(av[0]);
4754 if( !bBuf ){
4755 if( SQLITE_NOMEM==sqlite3_errcode(sqlite3_context_db_handle(context)) ){
4756 goto memFail;
4757 }
4758 sqlite3_result_text(context,"",-1,SQLITE_STATIC);
4759 break;
4760 }
4761 cBuf = sqlite3_malloc(nc);
4762 if( !cBuf ) goto memFail;
4763 nc = (int)(toBase64(bBuf, nb, cBuf) - cBuf);
4764 sqlite3_result_text(context, cBuf, nc, sqlite3_free);
4765 break;
4766 case SQLITE_TEXT:
4767 nc = nv;
4768 nb = 3*((nv+3)/4); /* may overestimate due to LF and padding */
4769 if( nvMax < nb ){
4770 sqlite3_result_error(context, "blob from base64 may be too big", -1);
4771 return;
4772 }else if( nb<1 ){
4773 nb = 1;
4774 }
4775 cBuf = (char *)sqlite3_value_text(av[0]);
4776 if( !cBuf ){
4777 if( SQLITE_NOMEM==sqlite3_errcode(sqlite3_context_db_handle(context)) ){
4778 goto memFail;
4779 }
4780 sqlite3_result_zeroblob(context, 0);
4781 break;
4782 }
4783 bBuf = sqlite3_malloc(nb);
4784 if( !bBuf ) goto memFail;
4785 nb = (int)(fromBase64(cBuf, nc, bBuf) - bBuf);
4786 sqlite3_result_blob(context, bBuf, nb, sqlite3_free);
4787 break;
4788 default:
4789 sqlite3_result_error(context, "base64 accepts only blob or text", -1);
4790 return;
4791 }
4792 return;
4793 memFail:
4794 sqlite3_result_error(context, "base64 OOM", -1);
4795 }
4796
4797 /*
4798 ** Establish linkage to running SQLite library.
4799 */
4800 #ifndef SQLITE_SHELL_EXTFUNCS
4801 #ifdef _WIN32
4802
4803 #endif
sqlite3_base_init(sqlite3 * db,char ** pzErr,const sqlite3_api_routines * pApi)4804 static int sqlite3_base_init
4805 #else
4806 static int sqlite3_base64_init
4807 #endif
4808 (sqlite3 *db, char **pzErr, const sqlite3_api_routines *pApi){
4809 SQLITE_EXTENSION_INIT2(pApi);
4810 (void)pzErr;
4811 return sqlite3_create_function
4812 (db, "base64", 1,
4813 SQLITE_DETERMINISTIC|SQLITE_INNOCUOUS|SQLITE_DIRECTONLY|SQLITE_UTF8,
4814 0, base64, 0, 0);
4815 }
4816
4817 /*
4818 ** Define some macros to allow this extension to be built into the shell
4819 ** conveniently, in conjunction with use of SQLITE_SHELL_EXTFUNCS. This
4820 ** allows shell.c, as distributed, to have this extension built in.
4821 */
4822 #define BASE64_INIT(db) sqlite3_base64_init(db, 0, 0)
4823 #define BASE64_EXPOSE(db, pzErr) /* Not needed, ..._init() does this. */
4824
4825 /************************* End ../ext/misc/base64.c ********************/
4826 #undef sqlite3_base_init
4827 #define sqlite3_base_init sqlite3_base85_init
4828 #define OMIT_BASE85_CHECKER
4829 /************************* Begin ../ext/misc/base85.c ******************/
4830 /*
4831 ** 2022-11-16
4832 **
4833 ** The author disclaims copyright to this source code. In place of
4834 ** a legal notice, here is a blessing:
4835 **
4836 ** May you do good and not evil.
4837 ** May you find forgiveness for yourself and forgive others.
4838 ** May you share freely, never taking more than you give.
4839 **
4840 *************************************************************************
4841 **
4842 ** This is a utility for converting binary to base85 or vice-versa.
4843 ** It can be built as a standalone program or an SQLite3 extension.
4844 **
4845 ** Much like base64 representations, base85 can be sent through a
4846 ** sane USASCII channel unmolested. It also plays nicely in CSV or
4847 ** written as TCL brace-enclosed literals or SQL string literals.
4848 ** It is not suited for unmodified use in XML-like documents.
4849 **
4850 ** The encoding used resembles Ascii85, but was devised by the author
4851 ** (Larry Brasfield) before Mozilla, Adobe, ZMODEM or other Ascii85
4852 ** variant sources existed, in the 1984 timeframe on a VAX mainframe.
4853 ** Further, this is an independent implementation of a base85 system.
4854 ** Hence, the author has rightfully put this into the public domain.
4855 **
4856 ** Base85 numerals are taken from the set of 7-bit USASCII codes,
4857 ** excluding control characters and Space ! " ' ( ) { | } ~ Del
4858 ** in code order representing digit values 0 to 84 (base 10.)
4859 **
4860 ** Groups of 4 bytes, interpreted as big-endian 32-bit values,
4861 ** are represented as 5-digit base85 numbers with MS to LS digit
4862 ** order. Groups of 1-3 bytes are represented with 2-4 digits,
4863 ** still big-endian but 8-24 bit values. (Using big-endian yields
4864 ** the simplest transition to byte groups smaller than 4 bytes.
4865 ** These byte groups can also be considered base-256 numbers.)
4866 ** Groups of 0 bytes are represented with 0 digits and vice-versa.
4867 ** No pad characters are used; Encoded base85 numeral sequence
4868 ** (aka "group") length maps 1-to-1 to the decoded binary length.
4869 **
4870 ** Any character not in the base85 numeral set delimits groups.
4871 ** When base85 is streamed or stored in containers of indefinite
4872 ** size, newline is used to separate it into sub-sequences of no
4873 ** more than 80 digits so that fgets() can be used to read it.
4874 **
4875 ** Length limitations are not imposed except that the runtime
4876 ** SQLite string or blob length limits are respected. Otherwise,
4877 ** any length binary sequence can be represented and recovered.
4878 ** Base85 sequences can be concatenated by separating them with
4879 ** a non-base85 character; the conversion to binary will then
4880 ** be the concatenation of the represented binary sequences.
4881
4882 ** The standalone program either converts base85 on stdin to create
4883 ** a binary file or converts a binary file to base85 on stdout.
4884 ** Read or make it blurt its help for invocation details.
4885 **
4886 ** The SQLite3 extension creates a function, base85(x), which will
4887 ** either convert text base85 to a blob or a blob to text base85
4888 ** and return the result (or throw an error for other types.)
4889 ** Unless built with OMIT_BASE85_CHECKER defined, it also creates a
4890 ** function, is_base85(t), which returns 1 iff the text t contains
4891 ** nothing other than base85 numerals and whitespace, or 0 otherwise.
4892 **
4893 ** To build the extension:
4894 ** Set shell variable SQDIR=<your favorite SQLite checkout directory>
4895 ** and variable OPTS to -DOMIT_BASE85_CHECKER if is_base85() unwanted.
4896 ** *Nix: gcc -O2 -shared -I$SQDIR $OPTS -fPIC -o base85.so base85.c
4897 ** OSX: gcc -O2 -dynamiclib -fPIC -I$SQDIR $OPTS -o base85.dylib base85.c
4898 ** Win32: gcc -O2 -shared -I%SQDIR% %OPTS% -o base85.dll base85.c
4899 ** Win32: cl /Os -I%SQDIR% %OPTS% base85.c -link -dll -out:base85.dll
4900 **
4901 ** To build the standalone program, define PP symbol BASE85_STANDALONE. Eg.
4902 ** *Nix or OSX: gcc -O2 -DBASE85_STANDALONE base85.c -o base85
4903 ** Win32: gcc -O2 -DBASE85_STANDALONE -o base85.exe base85.c
4904 ** Win32: cl /Os /MD -DBASE85_STANDALONE base85.c
4905 */
4906
4907 #include <stdio.h>
4908 #include <memory.h>
4909 #include <string.h>
4910 #include <assert.h>
4911 #ifndef OMIT_BASE85_CHECKER
4912 # include <ctype.h>
4913 #endif
4914
4915 #ifndef BASE85_STANDALONE
4916
4917 /* # include "sqlite3ext.h" */
4918
4919 SQLITE_EXTENSION_INIT1;
4920
4921 #else
4922
4923 # ifdef _WIN32
4924 # include <io.h>
4925 # include <fcntl.h>
4926 # else
4927 # define setmode(fd,m)
4928 # endif
4929
4930 static char *zHelp =
4931 "Usage: base85 <dirFlag> <binFile>\n"
4932 " <dirFlag> is either -r to read or -w to write <binFile>,\n"
4933 " content to be converted to/from base85 on stdout/stdin.\n"
4934 " <binFile> names a binary file to be rendered or created.\n"
4935 " Or, the name '-' refers to the stdin or stdout stream.\n"
4936 ;
4937
sayHelp()4938 static void sayHelp(){
4939 printf("%s", zHelp);
4940 }
4941 #endif
4942
4943 #ifndef U8_TYPEDEF
4944 /* typedef unsigned char u8; */
4945 #define U8_TYPEDEF
4946 #endif
4947
4948 /* Classify c according to interval within USASCII set w.r.t. base85
4949 * Values of 1 and 3 are base85 numerals. Values of 0, 2, or 4 are not.
4950 */
4951 #define B85_CLASS( c ) (((c)>='#')+((c)>'&')+((c)>='*')+((c)>'z'))
4952
4953 /* Provide digitValue to b85Numeral offset as a function of above class. */
4954 static u8 b85_cOffset[] = { 0, '#', 0, '*'-4, 0 };
4955 #define B85_DNOS( c ) b85_cOffset[B85_CLASS(c)]
4956
4957 /* Say whether c is a base85 numeral. */
4958 #define IS_B85( c ) (B85_CLASS(c) & 1)
4959
4960 #if 0 /* Not used, */
4961 static u8 base85DigitValue( char c ){
4962 u8 dv = (u8)(c - '#');
4963 if( dv>87 ) return 0xff;
4964 return (dv > 3)? dv-3 : dv;
4965 }
4966 #endif
4967
4968 /* Width of base64 lines. Should be an integer multiple of 5. */
4969 #define B85_DARK_MAX 80
4970
4971
skipNonB85(char * s,int nc)4972 static char * skipNonB85( char *s, int nc ){
4973 char c;
4974 while( nc-- > 0 && (c = *s) && !IS_B85(c) ) ++s;
4975 return s;
4976 }
4977
4978 /* Convert small integer, known to be in 0..84 inclusive, to base85 numeral.
4979 * Do not use the macro form with argument expression having a side-effect.*/
4980 #if 0
4981 static char base85Numeral( u8 b ){
4982 return (b < 4)? (char)(b + '#') : (char)(b - 4 + '*');
4983 }
4984 #else
4985 # define base85Numeral( dn )\
4986 ((char)(((dn) < 4)? (char)((dn) + '#') : (char)((dn) - 4 + '*')))
4987 #endif
4988
putcs(char * pc,char * s)4989 static char *putcs(char *pc, char *s){
4990 char c;
4991 while( (c = *s++)!=0 ) *pc++ = c;
4992 return pc;
4993 }
4994
4995 /* Encode a byte buffer into base85 text. If pSep!=0, it's a C string
4996 ** to be appended to encoded groups to limit their length to B85_DARK_MAX
4997 ** or to terminate the last group (to aid concatenation.)
4998 */
toBase85(u8 * pIn,int nbIn,char * pOut,char * pSep)4999 static char* toBase85( u8 *pIn, int nbIn, char *pOut, char *pSep ){
5000 int nCol = 0;
5001 while( nbIn >= 4 ){
5002 int nco = 5;
5003 unsigned long qbv = (((unsigned long)pIn[0])<<24) |
5004 (pIn[1]<<16) | (pIn[2]<<8) | pIn[3];
5005 while( nco > 0 ){
5006 unsigned nqv = (unsigned)(qbv/85UL);
5007 unsigned char dv = qbv - 85UL*nqv;
5008 qbv = nqv;
5009 pOut[--nco] = base85Numeral(dv);
5010 }
5011 nbIn -= 4;
5012 pIn += 4;
5013 pOut += 5;
5014 if( pSep && (nCol += 5)>=B85_DARK_MAX ){
5015 pOut = putcs(pOut, pSep);
5016 nCol = 0;
5017 }
5018 }
5019 if( nbIn > 0 ){
5020 int nco = nbIn + 1;
5021 unsigned long qv = *pIn++;
5022 int nbe = 1;
5023 while( nbe++ < nbIn ){
5024 qv = (qv<<8) | *pIn++;
5025 }
5026 nCol += nco;
5027 while( nco > 0 ){
5028 u8 dv = (u8)(qv % 85);
5029 qv /= 85;
5030 pOut[--nco] = base85Numeral(dv);
5031 }
5032 pOut += (nbIn+1);
5033 }
5034 if( pSep && nCol>0 ) pOut = putcs(pOut, pSep);
5035 *pOut = 0;
5036 return pOut;
5037 }
5038
5039 /* Decode base85 text into a byte buffer. */
fromBase85(char * pIn,int ncIn,u8 * pOut)5040 static u8* fromBase85( char *pIn, int ncIn, u8 *pOut ){
5041 if( ncIn>0 && pIn[ncIn-1]=='\n' ) --ncIn;
5042 while( ncIn>0 ){
5043 static signed char nboi[] = { 0, 0, 1, 2, 3, 4 };
5044 char *pUse = skipNonB85(pIn, ncIn);
5045 unsigned long qv = 0L;
5046 int nti, nbo;
5047 ncIn -= (pUse - pIn);
5048 pIn = pUse;
5049 nti = (ncIn>5)? 5 : ncIn;
5050 nbo = nboi[nti];
5051 if( nbo==0 ) break;
5052 while( nti>0 ){
5053 char c = *pIn++;
5054 u8 cdo = B85_DNOS(c);
5055 --ncIn;
5056 if( cdo==0 ) break;
5057 qv = 85 * qv + (c - cdo);
5058 --nti;
5059 }
5060 nbo -= nti; /* Adjust for early (non-digit) end of group. */
5061 switch( nbo ){
5062 case 4:
5063 *pOut++ = (qv >> 24)&0xff;
5064 case 3:
5065 *pOut++ = (qv >> 16)&0xff;
5066 case 2:
5067 *pOut++ = (qv >> 8)&0xff;
5068 case 1:
5069 *pOut++ = qv&0xff;
5070 case 0:
5071 break;
5072 }
5073 }
5074 return pOut;
5075 }
5076
5077 #ifndef OMIT_BASE85_CHECKER
5078 /* Say whether input char sequence is all (base85 and/or whitespace).*/
allBase85(char * p,int len)5079 static int allBase85( char *p, int len ){
5080 char c;
5081 while( len-- > 0 && (c = *p++) != 0 ){
5082 if( !IS_B85(c) && !isspace(c) ) return 0;
5083 }
5084 return 1;
5085 }
5086 #endif
5087
5088 #ifndef BASE85_STANDALONE
5089
5090 # ifndef OMIT_BASE85_CHECKER
5091 /* This function does the work for the SQLite is_base85(t) UDF. */
is_base85(sqlite3_context * context,int na,sqlite3_value * av[])5092 static void is_base85(sqlite3_context *context, int na, sqlite3_value *av[]){
5093 assert(na==1);
5094 switch( sqlite3_value_type(av[0]) ){
5095 case SQLITE_TEXT:
5096 {
5097 int rv = allBase85( (char *)sqlite3_value_text(av[0]),
5098 sqlite3_value_bytes(av[0]) );
5099 sqlite3_result_int(context, rv);
5100 }
5101 break;
5102 case SQLITE_NULL:
5103 sqlite3_result_null(context);
5104 break;
5105 default:
5106 sqlite3_result_error(context, "is_base85 accepts only text or NULL", -1);
5107 return;
5108 }
5109 }
5110 # endif
5111
5112 /* This function does the work for the SQLite base85(x) UDF. */
base85(sqlite3_context * context,int na,sqlite3_value * av[])5113 static void base85(sqlite3_context *context, int na, sqlite3_value *av[]){
5114 int nb, nc, nv = sqlite3_value_bytes(av[0]);
5115 int nvMax = sqlite3_limit(sqlite3_context_db_handle(context),
5116 SQLITE_LIMIT_LENGTH, -1);
5117 char *cBuf;
5118 u8 *bBuf;
5119 assert(na==1);
5120 switch( sqlite3_value_type(av[0]) ){
5121 case SQLITE_BLOB:
5122 nb = nv;
5123 /* ulongs tail newlines tailenc+nul*/
5124 nc = 5*(nv/4) + nv%4 + nv/64+1 + 2;
5125 if( nvMax < nc ){
5126 sqlite3_result_error(context, "blob expanded to base85 too big", -1);
5127 return;
5128 }
5129 bBuf = (u8*)sqlite3_value_blob(av[0]);
5130 if( !bBuf ){
5131 if( SQLITE_NOMEM==sqlite3_errcode(sqlite3_context_db_handle(context)) ){
5132 goto memFail;
5133 }
5134 sqlite3_result_text(context,"",-1,SQLITE_STATIC);
5135 break;
5136 }
5137 cBuf = sqlite3_malloc(nc);
5138 if( !cBuf ) goto memFail;
5139 nc = (int)(toBase85(bBuf, nb, cBuf, "\n") - cBuf);
5140 sqlite3_result_text(context, cBuf, nc, sqlite3_free);
5141 break;
5142 case SQLITE_TEXT:
5143 nc = nv;
5144 nb = 4*(nv/5) + nv%5; /* may overestimate */
5145 if( nvMax < nb ){
5146 sqlite3_result_error(context, "blob from base85 may be too big", -1);
5147 return;
5148 }else if( nb<1 ){
5149 nb = 1;
5150 }
5151 cBuf = (char *)sqlite3_value_text(av[0]);
5152 if( !cBuf ){
5153 if( SQLITE_NOMEM==sqlite3_errcode(sqlite3_context_db_handle(context)) ){
5154 goto memFail;
5155 }
5156 sqlite3_result_zeroblob(context, 0);
5157 break;
5158 }
5159 bBuf = sqlite3_malloc(nb);
5160 if( !bBuf ) goto memFail;
5161 nb = (int)(fromBase85(cBuf, nc, bBuf) - bBuf);
5162 sqlite3_result_blob(context, bBuf, nb, sqlite3_free);
5163 break;
5164 default:
5165 sqlite3_result_error(context, "base85 accepts only blob or text.", -1);
5166 return;
5167 }
5168 return;
5169 memFail:
5170 sqlite3_result_error(context, "base85 OOM", -1);
5171 }
5172
5173 /*
5174 ** Establish linkage to running SQLite library.
5175 */
5176 #ifndef SQLITE_SHELL_EXTFUNCS
5177 #ifdef _WIN32
5178
5179 #endif
sqlite3_base_init(sqlite3 * db,char ** pzErr,const sqlite3_api_routines * pApi)5180 static int sqlite3_base_init
5181 #else
5182 static int sqlite3_base85_init
5183 #endif
5184 (sqlite3 *db, char **pzErr, const sqlite3_api_routines *pApi){
5185 SQLITE_EXTENSION_INIT2(pApi);
5186 (void)pzErr;
5187 # ifndef OMIT_BASE85_CHECKER
5188 {
5189 int rc = sqlite3_create_function
5190 (db, "is_base85", 1,
5191 SQLITE_DETERMINISTIC|SQLITE_INNOCUOUS|SQLITE_UTF8,
5192 0, is_base85, 0, 0);
5193 if( rc!=SQLITE_OK ) return rc;
5194 }
5195 # endif
5196 return sqlite3_create_function
5197 (db, "base85", 1,
5198 SQLITE_DETERMINISTIC|SQLITE_INNOCUOUS|SQLITE_DIRECTONLY|SQLITE_UTF8,
5199 0, base85, 0, 0);
5200 }
5201
5202 /*
5203 ** Define some macros to allow this extension to be built into the shell
5204 ** conveniently, in conjunction with use of SQLITE_SHELL_EXTFUNCS. This
5205 ** allows shell.c, as distributed, to have this extension built in.
5206 */
5207 # define BASE85_INIT(db) sqlite3_base85_init(db, 0, 0)
5208 # define BASE85_EXPOSE(db, pzErr) /* Not needed, ..._init() does this. */
5209
5210 #else /* standalone program */
5211
main(int na,char * av[])5212 int main(int na, char *av[]){
5213 int cin;
5214 int rc = 0;
5215 u8 bBuf[4*(B85_DARK_MAX/5)];
5216 char cBuf[5*(sizeof(bBuf)/4)+2];
5217 size_t nio;
5218 # ifndef OMIT_BASE85_CHECKER
5219 int b85Clean = 1;
5220 # endif
5221 char rw;
5222 FILE *fb = 0, *foc = 0;
5223 char fmode[3] = "xb";
5224 if( na < 3 || av[1][0]!='-' || (rw = av[1][1])==0 || (rw!='r' && rw!='w') ){
5225 sayHelp();
5226 return 0;
5227 }
5228 fmode[0] = rw;
5229 if( av[2][0]=='-' && av[2][1]==0 ){
5230 switch( rw ){
5231 case 'r':
5232 fb = stdin;
5233 setmode(fileno(stdin), O_BINARY);
5234 break;
5235 case 'w':
5236 fb = stdout;
5237 setmode(fileno(stdout), O_BINARY);
5238 break;
5239 }
5240 }else{
5241 fb = fopen(av[2], fmode);
5242 foc = fb;
5243 }
5244 if( !fb ){
5245 fprintf(stderr, "Cannot open %s for %c\n", av[2], rw);
5246 rc = 1;
5247 }else{
5248 switch( rw ){
5249 case 'r':
5250 while( (nio = fread( bBuf, 1, sizeof(bBuf), fb))>0 ){
5251 toBase85( bBuf, (int)nio, cBuf, 0 );
5252 fprintf(stdout, "%s\n", cBuf);
5253 }
5254 break;
5255 case 'w':
5256 while( 0 != fgets(cBuf, sizeof(cBuf), stdin) ){
5257 int nc = strlen(cBuf);
5258 size_t nbo = fromBase85( cBuf, nc, bBuf ) - bBuf;
5259 if( 1 != fwrite(bBuf, nbo, 1, fb) ) rc = 1;
5260 # ifndef OMIT_BASE85_CHECKER
5261 b85Clean &= allBase85( cBuf, nc );
5262 # endif
5263 }
5264 break;
5265 default:
5266 sayHelp();
5267 rc = 1;
5268 }
5269 if( foc ) fclose(foc);
5270 }
5271 # ifndef OMIT_BASE85_CHECKER
5272 if( !b85Clean ){
5273 fprintf(stderr, "Base85 input had non-base85 dark or control content.\n");
5274 }
5275 # endif
5276 return rc;
5277 }
5278
5279 #endif
5280
5281 /************************* End ../ext/misc/base85.c ********************/
5282 /************************* Begin ../ext/misc/ieee754.c ******************/
5283 /*
5284 ** 2013-04-17
5285 **
5286 ** The author disclaims copyright to this source code. In place of
5287 ** a legal notice, here is a blessing:
5288 **
5289 ** May you do good and not evil.
5290 ** May you find forgiveness for yourself and forgive others.
5291 ** May you share freely, never taking more than you give.
5292 **
5293 ******************************************************************************
5294 **
5295 ** This SQLite extension implements functions for the exact display
5296 ** and input of IEEE754 Binary64 floating-point numbers.
5297 **
5298 ** ieee754(X)
5299 ** ieee754(Y,Z)
5300 **
5301 ** In the first form, the value X should be a floating-point number.
5302 ** The function will return a string of the form 'ieee754(Y,Z)' where
5303 ** Y and Z are integers such that X==Y*pow(2,Z).
5304 **
5305 ** In the second form, Y and Z are integers which are the mantissa and
5306 ** base-2 exponent of a new floating point number. The function returns
5307 ** a floating-point value equal to Y*pow(2,Z).
5308 **
5309 ** Examples:
5310 **
5311 ** ieee754(2.0) -> 'ieee754(2,0)'
5312 ** ieee754(45.25) -> 'ieee754(181,-2)'
5313 ** ieee754(2, 0) -> 2.0
5314 ** ieee754(181, -2) -> 45.25
5315 **
5316 ** Two additional functions break apart the one-argument ieee754()
5317 ** result into separate integer values:
5318 **
5319 ** ieee754_mantissa(45.25) -> 181
5320 ** ieee754_exponent(45.25) -> -2
5321 **
5322 ** These functions convert binary64 numbers into blobs and back again.
5323 **
5324 ** ieee754_from_blob(x'3ff0000000000000') -> 1.0
5325 ** ieee754_to_blob(1.0) -> x'3ff0000000000000'
5326 **
5327 ** In all single-argument functions, if the argument is an 8-byte blob
5328 ** then that blob is interpreted as a big-endian binary64 value.
5329 **
5330 **
5331 ** EXACT DECIMAL REPRESENTATION OF BINARY64 VALUES
5332 ** -----------------------------------------------
5333 **
5334 ** This extension in combination with the separate 'decimal' extension
5335 ** can be used to compute the exact decimal representation of binary64
5336 ** values. To begin, first compute a table of exponent values:
5337 **
5338 ** CREATE TABLE pow2(x INTEGER PRIMARY KEY, v TEXT);
5339 ** WITH RECURSIVE c(x,v) AS (
5340 ** VALUES(0,'1')
5341 ** UNION ALL
5342 ** SELECT x+1, decimal_mul(v,'2') FROM c WHERE x+1<=971
5343 ** ) INSERT INTO pow2(x,v) SELECT x, v FROM c;
5344 ** WITH RECURSIVE c(x,v) AS (
5345 ** VALUES(-1,'0.5')
5346 ** UNION ALL
5347 ** SELECT x-1, decimal_mul(v,'0.5') FROM c WHERE x-1>=-1075
5348 ** ) INSERT INTO pow2(x,v) SELECT x, v FROM c;
5349 **
5350 ** Then, to compute the exact decimal representation of a floating
5351 ** point value (the value 47.49 is used in the example) do:
5352 **
5353 ** WITH c(n) AS (VALUES(47.49))
5354 ** ---------------^^^^^---- Replace with whatever you want
5355 ** SELECT decimal_mul(ieee754_mantissa(c.n),pow2.v)
5356 ** FROM pow2, c WHERE pow2.x=ieee754_exponent(c.n);
5357 **
5358 ** Here is a query to show various boundry values for the binary64
5359 ** number format:
5360 **
5361 ** WITH c(name,bin) AS (VALUES
5362 ** ('minimum positive value', x'0000000000000001'),
5363 ** ('maximum subnormal value', x'000fffffffffffff'),
5364 ** ('mininum positive nornal value', x'0010000000000000'),
5365 ** ('maximum value', x'7fefffffffffffff'))
5366 ** SELECT c.name, decimal_mul(ieee754_mantissa(c.bin),pow2.v)
5367 ** FROM pow2, c WHERE pow2.x=ieee754_exponent(c.bin);
5368 **
5369 */
5370 /* #include "sqlite3ext.h" */
5371 SQLITE_EXTENSION_INIT1
5372 #include <assert.h>
5373 #include <string.h>
5374
5375 /* Mark a function parameter as unused, to suppress nuisance compiler
5376 ** warnings. */
5377 #ifndef UNUSED_PARAMETER
5378 # define UNUSED_PARAMETER(X) (void)(X)
5379 #endif
5380
5381 /*
5382 ** Implementation of the ieee754() function
5383 */
ieee754func(sqlite3_context * context,int argc,sqlite3_value ** argv)5384 static void ieee754func(
5385 sqlite3_context *context,
5386 int argc,
5387 sqlite3_value **argv
5388 ){
5389 if( argc==1 ){
5390 sqlite3_int64 m, a;
5391 double r;
5392 int e;
5393 int isNeg;
5394 char zResult[100];
5395 assert( sizeof(m)==sizeof(r) );
5396 if( sqlite3_value_type(argv[0])==SQLITE_BLOB
5397 && sqlite3_value_bytes(argv[0])==sizeof(r)
5398 ){
5399 const unsigned char *x = sqlite3_value_blob(argv[0]);
5400 unsigned int i;
5401 sqlite3_uint64 v = 0;
5402 for(i=0; i<sizeof(r); i++){
5403 v = (v<<8) | x[i];
5404 }
5405 memcpy(&r, &v, sizeof(r));
5406 }else{
5407 r = sqlite3_value_double(argv[0]);
5408 }
5409 if( r<0.0 ){
5410 isNeg = 1;
5411 r = -r;
5412 }else{
5413 isNeg = 0;
5414 }
5415 memcpy(&a,&r,sizeof(a));
5416 if( a==0 ){
5417 e = 0;
5418 m = 0;
5419 }else{
5420 e = a>>52;
5421 m = a & ((((sqlite3_int64)1)<<52)-1);
5422 if( e==0 ){
5423 m <<= 1;
5424 }else{
5425 m |= ((sqlite3_int64)1)<<52;
5426 }
5427 while( e<1075 && m>0 && (m&1)==0 ){
5428 m >>= 1;
5429 e++;
5430 }
5431 if( isNeg ) m = -m;
5432 }
5433 switch( *(int*)sqlite3_user_data(context) ){
5434 case 0:
5435 sqlite3_snprintf(sizeof(zResult), zResult, "ieee754(%lld,%d)",
5436 m, e-1075);
5437 sqlite3_result_text(context, zResult, -1, SQLITE_TRANSIENT);
5438 break;
5439 case 1:
5440 sqlite3_result_int64(context, m);
5441 break;
5442 case 2:
5443 sqlite3_result_int(context, e-1075);
5444 break;
5445 }
5446 }else{
5447 sqlite3_int64 m, e, a;
5448 double r;
5449 int isNeg = 0;
5450 m = sqlite3_value_int64(argv[0]);
5451 e = sqlite3_value_int64(argv[1]);
5452
5453 /* Limit the range of e. Ticket 22dea1cfdb9151e4 2021-03-02 */
5454 if( e>10000 ){
5455 e = 10000;
5456 }else if( e<-10000 ){
5457 e = -10000;
5458 }
5459
5460 if( m<0 ){
5461 isNeg = 1;
5462 m = -m;
5463 if( m<0 ) return;
5464 }else if( m==0 && e>-1000 && e<1000 ){
5465 sqlite3_result_double(context, 0.0);
5466 return;
5467 }
5468 while( (m>>32)&0xffe00000 ){
5469 m >>= 1;
5470 e++;
5471 }
5472 while( m!=0 && ((m>>32)&0xfff00000)==0 ){
5473 m <<= 1;
5474 e--;
5475 }
5476 e += 1075;
5477 if( e<=0 ){
5478 /* Subnormal */
5479 if( 1-e >= 64 ){
5480 m = 0;
5481 }else{
5482 m >>= 1-e;
5483 }
5484 e = 0;
5485 }else if( e>0x7ff ){
5486 e = 0x7ff;
5487 }
5488 a = m & ((((sqlite3_int64)1)<<52)-1);
5489 a |= e<<52;
5490 if( isNeg ) a |= ((sqlite3_uint64)1)<<63;
5491 memcpy(&r, &a, sizeof(r));
5492 sqlite3_result_double(context, r);
5493 }
5494 }
5495
5496 /*
5497 ** Functions to convert between blobs and floats.
5498 */
ieee754func_from_blob(sqlite3_context * context,int argc,sqlite3_value ** argv)5499 static void ieee754func_from_blob(
5500 sqlite3_context *context,
5501 int argc,
5502 sqlite3_value **argv
5503 ){
5504 UNUSED_PARAMETER(argc);
5505 if( sqlite3_value_type(argv[0])==SQLITE_BLOB
5506 && sqlite3_value_bytes(argv[0])==sizeof(double)
5507 ){
5508 double r;
5509 const unsigned char *x = sqlite3_value_blob(argv[0]);
5510 unsigned int i;
5511 sqlite3_uint64 v = 0;
5512 for(i=0; i<sizeof(r); i++){
5513 v = (v<<8) | x[i];
5514 }
5515 memcpy(&r, &v, sizeof(r));
5516 sqlite3_result_double(context, r);
5517 }
5518 }
ieee754func_to_blob(sqlite3_context * context,int argc,sqlite3_value ** argv)5519 static void ieee754func_to_blob(
5520 sqlite3_context *context,
5521 int argc,
5522 sqlite3_value **argv
5523 ){
5524 UNUSED_PARAMETER(argc);
5525 if( sqlite3_value_type(argv[0])==SQLITE_FLOAT
5526 || sqlite3_value_type(argv[0])==SQLITE_INTEGER
5527 ){
5528 double r = sqlite3_value_double(argv[0]);
5529 sqlite3_uint64 v;
5530 unsigned char a[sizeof(r)];
5531 unsigned int i;
5532 memcpy(&v, &r, sizeof(r));
5533 for(i=1; i<=sizeof(r); i++){
5534 a[sizeof(r)-i] = v&0xff;
5535 v >>= 8;
5536 }
5537 sqlite3_result_blob(context, a, sizeof(r), SQLITE_TRANSIENT);
5538 }
5539 }
5540
5541 /*
5542 ** SQL Function: ieee754_inc(r,N)
5543 **
5544 ** Move the floating point value r by N quantums and return the new
5545 ** values.
5546 **
5547 ** Behind the scenes: this routine merely casts r into a 64-bit unsigned
5548 ** integer, adds N, then casts the value back into float.
5549 **
5550 ** Example: To find the smallest positive number:
5551 **
5552 ** SELECT ieee754_inc(0.0,+1);
5553 */
ieee754inc(sqlite3_context * context,int argc,sqlite3_value ** argv)5554 static void ieee754inc(
5555 sqlite3_context *context,
5556 int argc,
5557 sqlite3_value **argv
5558 ){
5559 double r;
5560 sqlite3_int64 N;
5561 sqlite3_uint64 m1, m2;
5562 double r2;
5563 UNUSED_PARAMETER(argc);
5564 r = sqlite3_value_double(argv[0]);
5565 N = sqlite3_value_int64(argv[1]);
5566 memcpy(&m1, &r, 8);
5567 m2 = m1 + N;
5568 memcpy(&r2, &m2, 8);
5569 sqlite3_result_double(context, r2);
5570 }
5571
5572
5573 #ifdef _WIN32
5574
5575 #endif
sqlite3_ieee_init(sqlite3 * db,char ** pzErrMsg,const sqlite3_api_routines * pApi)5576 static int sqlite3_ieee_init(
5577 sqlite3 *db,
5578 char **pzErrMsg,
5579 const sqlite3_api_routines *pApi
5580 ){
5581 static const struct {
5582 char *zFName;
5583 int nArg;
5584 int iAux;
5585 void (*xFunc)(sqlite3_context*,int,sqlite3_value**);
5586 } aFunc[] = {
5587 { "ieee754", 1, 0, ieee754func },
5588 { "ieee754", 2, 0, ieee754func },
5589 { "ieee754_mantissa", 1, 1, ieee754func },
5590 { "ieee754_exponent", 1, 2, ieee754func },
5591 { "ieee754_to_blob", 1, 0, ieee754func_to_blob },
5592 { "ieee754_from_blob", 1, 0, ieee754func_from_blob },
5593 { "ieee754_inc", 2, 0, ieee754inc },
5594 };
5595 unsigned int i;
5596 int rc = SQLITE_OK;
5597 SQLITE_EXTENSION_INIT2(pApi);
5598 (void)pzErrMsg; /* Unused parameter */
5599 for(i=0; i<sizeof(aFunc)/sizeof(aFunc[0]) && rc==SQLITE_OK; i++){
5600 rc = sqlite3_create_function(db, aFunc[i].zFName, aFunc[i].nArg,
5601 SQLITE_UTF8|SQLITE_INNOCUOUS,
5602 (void*)&aFunc[i].iAux,
5603 aFunc[i].xFunc, 0, 0);
5604 }
5605 return rc;
5606 }
5607
5608 /************************* End ../ext/misc/ieee754.c ********************/
5609 /************************* Begin ../ext/misc/series.c ******************/
5610 /*
5611 ** 2015-08-18, 2023-04-28
5612 **
5613 ** The author disclaims copyright to this source code. In place of
5614 ** a legal notice, here is a blessing:
5615 **
5616 ** May you do good and not evil.
5617 ** May you find forgiveness for yourself and forgive others.
5618 ** May you share freely, never taking more than you give.
5619 **
5620 *************************************************************************
5621 **
5622 ** This file demonstrates how to create a table-valued-function using
5623 ** a virtual table. This demo implements the generate_series() function
5624 ** which gives the same results as the eponymous function in PostgreSQL,
5625 ** within the limitation that its arguments are signed 64-bit integers.
5626 **
5627 ** Considering its equivalents to generate_series(start,stop,step): A
5628 ** value V[n] sequence is produced for integer n ascending from 0 where
5629 ** ( V[n] == start + n * step && sgn(V[n] - stop) * sgn(step) >= 0 )
5630 ** for each produced value (independent of production time ordering.)
5631 **
5632 ** All parameters must be either integer or convertable to integer.
5633 ** The start parameter is required.
5634 ** The stop parameter defaults to (1<<32)-1 (aka 4294967295 or 0xffffffff)
5635 ** The step parameter defaults to 1 and 0 is treated as 1.
5636 **
5637 ** Examples:
5638 **
5639 ** SELECT * FROM generate_series(0,100,5);
5640 **
5641 ** The query above returns integers from 0 through 100 counting by steps
5642 ** of 5.
5643 **
5644 ** SELECT * FROM generate_series(0,100);
5645 **
5646 ** Integers from 0 through 100 with a step size of 1.
5647 **
5648 ** SELECT * FROM generate_series(20) LIMIT 10;
5649 **
5650 ** Integers 20 through 29.
5651 **
5652 ** SELECT * FROM generate_series(0,-100,-5);
5653 **
5654 ** Integers 0 -5 -10 ... -100.
5655 **
5656 ** SELECT * FROM generate_series(0,-1);
5657 **
5658 ** Empty sequence.
5659 **
5660 ** HOW IT WORKS
5661 **
5662 ** The generate_series "function" is really a virtual table with the
5663 ** following schema:
5664 **
5665 ** CREATE TABLE generate_series(
5666 ** value,
5667 ** start HIDDEN,
5668 ** stop HIDDEN,
5669 ** step HIDDEN
5670 ** );
5671 **
5672 ** The virtual table also has a rowid, logically equivalent to n+1 where
5673 ** "n" is the ascending integer in the aforesaid production definition.
5674 **
5675 ** Function arguments in queries against this virtual table are translated
5676 ** into equality constraints against successive hidden columns. In other
5677 ** words, the following pairs of queries are equivalent to each other:
5678 **
5679 ** SELECT * FROM generate_series(0,100,5);
5680 ** SELECT * FROM generate_series WHERE start=0 AND stop=100 AND step=5;
5681 **
5682 ** SELECT * FROM generate_series(0,100);
5683 ** SELECT * FROM generate_series WHERE start=0 AND stop=100;
5684 **
5685 ** SELECT * FROM generate_series(20) LIMIT 10;
5686 ** SELECT * FROM generate_series WHERE start=20 LIMIT 10;
5687 **
5688 ** The generate_series virtual table implementation leaves the xCreate method
5689 ** set to NULL. This means that it is not possible to do a CREATE VIRTUAL
5690 ** TABLE command with "generate_series" as the USING argument. Instead, there
5691 ** is a single generate_series virtual table that is always available without
5692 ** having to be created first.
5693 **
5694 ** The xBestIndex method looks for equality constraints against the hidden
5695 ** start, stop, and step columns, and if present, it uses those constraints
5696 ** to bound the sequence of generated values. If the equality constraints
5697 ** are missing, it uses 0 for start, 4294967295 for stop, and 1 for step.
5698 ** xBestIndex returns a small cost when both start and stop are available,
5699 ** and a very large cost if either start or stop are unavailable. This
5700 ** encourages the query planner to order joins such that the bounds of the
5701 ** series are well-defined.
5702 */
5703 /* #include "sqlite3ext.h" */
5704 SQLITE_EXTENSION_INIT1
5705 #include <assert.h>
5706 #include <string.h>
5707 #include <limits.h>
5708
5709 #ifndef SQLITE_OMIT_VIRTUALTABLE
5710 /*
5711 ** Return that member of a generate_series(...) sequence whose 0-based
5712 ** index is ix. The 0th member is given by smBase. The sequence members
5713 ** progress per ix increment by smStep.
5714 */
genSeqMember(sqlite3_int64 smBase,sqlite3_int64 smStep,sqlite3_uint64 ix)5715 static sqlite3_int64 genSeqMember(sqlite3_int64 smBase,
5716 sqlite3_int64 smStep,
5717 sqlite3_uint64 ix){
5718 if( ix>=(sqlite3_uint64)LLONG_MAX ){
5719 /* Get ix into signed i64 range. */
5720 ix -= (sqlite3_uint64)LLONG_MAX;
5721 /* With 2's complement ALU, this next can be 1 step, but is split into
5722 * 2 for UBSAN's satisfaction (and hypothetical 1's complement ALUs.) */
5723 smBase += (LLONG_MAX/2) * smStep;
5724 smBase += (LLONG_MAX - LLONG_MAX/2) * smStep;
5725 }
5726 /* Under UBSAN (or on 1's complement machines), must do this last term
5727 * in steps to avoid the dreaded (and harmless) signed multiply overlow. */
5728 if( ix>=2 ){
5729 sqlite3_int64 ix2 = (sqlite3_int64)ix/2;
5730 smBase += ix2*smStep;
5731 ix -= ix2;
5732 }
5733 return smBase + ((sqlite3_int64)ix)*smStep;
5734 }
5735
5736 /* typedef unsigned char u8; */
5737
5738 typedef struct SequenceSpec {
5739 sqlite3_int64 iBase; /* Starting value ("start") */
5740 sqlite3_int64 iTerm; /* Given terminal value ("stop") */
5741 sqlite3_int64 iStep; /* Increment ("step") */
5742 sqlite3_uint64 uSeqIndexMax; /* maximum sequence index (aka "n") */
5743 sqlite3_uint64 uSeqIndexNow; /* Current index during generation */
5744 sqlite3_int64 iValueNow; /* Current value during generation */
5745 u8 isNotEOF; /* Sequence generation not exhausted */
5746 u8 isReversing; /* Sequence is being reverse generated */
5747 } SequenceSpec;
5748
5749 /*
5750 ** Prepare a SequenceSpec for use in generating an integer series
5751 ** given initialized iBase, iTerm and iStep values. Sequence is
5752 ** initialized per given isReversing. Other members are computed.
5753 */
setupSequence(SequenceSpec * pss)5754 static void setupSequence( SequenceSpec *pss ){
5755 int bSameSigns;
5756 pss->uSeqIndexMax = 0;
5757 pss->isNotEOF = 0;
5758 bSameSigns = (pss->iBase < 0)==(pss->iTerm < 0);
5759 if( pss->iTerm < pss->iBase ){
5760 sqlite3_uint64 nuspan = 0;
5761 if( bSameSigns ){
5762 nuspan = (sqlite3_uint64)(pss->iBase - pss->iTerm);
5763 }else{
5764 /* Under UBSAN (or on 1's complement machines), must do this in steps.
5765 * In this clause, iBase>=0 and iTerm<0 . */
5766 nuspan = 1;
5767 nuspan += pss->iBase;
5768 nuspan += -(pss->iTerm+1);
5769 }
5770 if( pss->iStep<0 ){
5771 pss->isNotEOF = 1;
5772 if( nuspan==ULONG_MAX ){
5773 pss->uSeqIndexMax = ( pss->iStep>LLONG_MIN )? nuspan/-pss->iStep : 1;
5774 }else if( pss->iStep>LLONG_MIN ){
5775 pss->uSeqIndexMax = nuspan/-pss->iStep;
5776 }
5777 }
5778 }else if( pss->iTerm > pss->iBase ){
5779 sqlite3_uint64 puspan = 0;
5780 if( bSameSigns ){
5781 puspan = (sqlite3_uint64)(pss->iTerm - pss->iBase);
5782 }else{
5783 /* Under UBSAN (or on 1's complement machines), must do this in steps.
5784 * In this clause, iTerm>=0 and iBase<0 . */
5785 puspan = 1;
5786 puspan += pss->iTerm;
5787 puspan += -(pss->iBase+1);
5788 }
5789 if( pss->iStep>0 ){
5790 pss->isNotEOF = 1;
5791 pss->uSeqIndexMax = puspan/pss->iStep;
5792 }
5793 }else if( pss->iTerm == pss->iBase ){
5794 pss->isNotEOF = 1;
5795 pss->uSeqIndexMax = 0;
5796 }
5797 pss->uSeqIndexNow = (pss->isReversing)? pss->uSeqIndexMax : 0;
5798 pss->iValueNow = (pss->isReversing)
5799 ? genSeqMember(pss->iBase, pss->iStep, pss->uSeqIndexMax)
5800 : pss->iBase;
5801 }
5802
5803 /*
5804 ** Progress sequence generator to yield next value, if any.
5805 ** Leave its state to either yield next value or be at EOF.
5806 ** Return whether there is a next value, or 0 at EOF.
5807 */
progressSequence(SequenceSpec * pss)5808 static int progressSequence( SequenceSpec *pss ){
5809 if( !pss->isNotEOF ) return 0;
5810 if( pss->isReversing ){
5811 if( pss->uSeqIndexNow > 0 ){
5812 pss->uSeqIndexNow--;
5813 pss->iValueNow -= pss->iStep;
5814 }else{
5815 pss->isNotEOF = 0;
5816 }
5817 }else{
5818 if( pss->uSeqIndexNow < pss->uSeqIndexMax ){
5819 pss->uSeqIndexNow++;
5820 pss->iValueNow += pss->iStep;
5821 }else{
5822 pss->isNotEOF = 0;
5823 }
5824 }
5825 return pss->isNotEOF;
5826 }
5827
5828 /* series_cursor is a subclass of sqlite3_vtab_cursor which will
5829 ** serve as the underlying representation of a cursor that scans
5830 ** over rows of the result
5831 */
5832 typedef struct series_cursor series_cursor;
5833 struct series_cursor {
5834 sqlite3_vtab_cursor base; /* Base class - must be first */
5835 SequenceSpec ss; /* (this) Derived class data */
5836 };
5837
5838 /*
5839 ** The seriesConnect() method is invoked to create a new
5840 ** series_vtab that describes the generate_series virtual table.
5841 **
5842 ** Think of this routine as the constructor for series_vtab objects.
5843 **
5844 ** All this routine needs to do is:
5845 **
5846 ** (1) Allocate the series_vtab object and initialize all fields.
5847 **
5848 ** (2) Tell SQLite (via the sqlite3_declare_vtab() interface) what the
5849 ** result set of queries against generate_series will look like.
5850 */
seriesConnect(sqlite3 * db,void * pUnused,int argcUnused,const char * const * argvUnused,sqlite3_vtab ** ppVtab,char ** pzErrUnused)5851 static int seriesConnect(
5852 sqlite3 *db,
5853 void *pUnused,
5854 int argcUnused, const char *const*argvUnused,
5855 sqlite3_vtab **ppVtab,
5856 char **pzErrUnused
5857 ){
5858 sqlite3_vtab *pNew;
5859 int rc;
5860
5861 /* Column numbers */
5862 #define SERIES_COLUMN_VALUE 0
5863 #define SERIES_COLUMN_START 1
5864 #define SERIES_COLUMN_STOP 2
5865 #define SERIES_COLUMN_STEP 3
5866
5867 (void)pUnused;
5868 (void)argcUnused;
5869 (void)argvUnused;
5870 (void)pzErrUnused;
5871 rc = sqlite3_declare_vtab(db,
5872 "CREATE TABLE x(value,start hidden,stop hidden,step hidden)");
5873 if( rc==SQLITE_OK ){
5874 pNew = *ppVtab = sqlite3_malloc( sizeof(*pNew) );
5875 if( pNew==0 ) return SQLITE_NOMEM;
5876 memset(pNew, 0, sizeof(*pNew));
5877 sqlite3_vtab_config(db, SQLITE_VTAB_INNOCUOUS);
5878 }
5879 return rc;
5880 }
5881
5882 /*
5883 ** This method is the destructor for series_cursor objects.
5884 */
seriesDisconnect(sqlite3_vtab * pVtab)5885 static int seriesDisconnect(sqlite3_vtab *pVtab){
5886 sqlite3_free(pVtab);
5887 return SQLITE_OK;
5888 }
5889
5890 /*
5891 ** Constructor for a new series_cursor object.
5892 */
seriesOpen(sqlite3_vtab * pUnused,sqlite3_vtab_cursor ** ppCursor)5893 static int seriesOpen(sqlite3_vtab *pUnused, sqlite3_vtab_cursor **ppCursor){
5894 series_cursor *pCur;
5895 (void)pUnused;
5896 pCur = sqlite3_malloc( sizeof(*pCur) );
5897 if( pCur==0 ) return SQLITE_NOMEM;
5898 memset(pCur, 0, sizeof(*pCur));
5899 *ppCursor = &pCur->base;
5900 return SQLITE_OK;
5901 }
5902
5903 /*
5904 ** Destructor for a series_cursor.
5905 */
seriesClose(sqlite3_vtab_cursor * cur)5906 static int seriesClose(sqlite3_vtab_cursor *cur){
5907 sqlite3_free(cur);
5908 return SQLITE_OK;
5909 }
5910
5911
5912 /*
5913 ** Advance a series_cursor to its next row of output.
5914 */
seriesNext(sqlite3_vtab_cursor * cur)5915 static int seriesNext(sqlite3_vtab_cursor *cur){
5916 series_cursor *pCur = (series_cursor*)cur;
5917 progressSequence( & pCur->ss );
5918 return SQLITE_OK;
5919 }
5920
5921 /*
5922 ** Return values of columns for the row at which the series_cursor
5923 ** is currently pointing.
5924 */
seriesColumn(sqlite3_vtab_cursor * cur,sqlite3_context * ctx,int i)5925 static int seriesColumn(
5926 sqlite3_vtab_cursor *cur, /* The cursor */
5927 sqlite3_context *ctx, /* First argument to sqlite3_result_...() */
5928 int i /* Which column to return */
5929 ){
5930 series_cursor *pCur = (series_cursor*)cur;
5931 sqlite3_int64 x = 0;
5932 switch( i ){
5933 case SERIES_COLUMN_START: x = pCur->ss.iBase; break;
5934 case SERIES_COLUMN_STOP: x = pCur->ss.iTerm; break;
5935 case SERIES_COLUMN_STEP: x = pCur->ss.iStep; break;
5936 default: x = pCur->ss.iValueNow; break;
5937 }
5938 sqlite3_result_int64(ctx, x);
5939 return SQLITE_OK;
5940 }
5941
5942 #ifndef LARGEST_UINT64
5943 #define LARGEST_UINT64 (0xffffffff|(((sqlite3_uint64)0xffffffff)<<32))
5944 #endif
5945
5946 /*
5947 ** Return the rowid for the current row, logically equivalent to n+1 where
5948 ** "n" is the ascending integer in the aforesaid production definition.
5949 */
seriesRowid(sqlite3_vtab_cursor * cur,sqlite_int64 * pRowid)5950 static int seriesRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
5951 series_cursor *pCur = (series_cursor*)cur;
5952 sqlite3_uint64 n = pCur->ss.uSeqIndexNow;
5953 *pRowid = (sqlite3_int64)((n<LARGEST_UINT64)? n+1 : 0);
5954 return SQLITE_OK;
5955 }
5956
5957 /*
5958 ** Return TRUE if the cursor has been moved off of the last
5959 ** row of output.
5960 */
seriesEof(sqlite3_vtab_cursor * cur)5961 static int seriesEof(sqlite3_vtab_cursor *cur){
5962 series_cursor *pCur = (series_cursor*)cur;
5963 return !pCur->ss.isNotEOF;
5964 }
5965
5966 /* True to cause run-time checking of the start=, stop=, and/or step=
5967 ** parameters. The only reason to do this is for testing the
5968 ** constraint checking logic for virtual tables in the SQLite core.
5969 */
5970 #ifndef SQLITE_SERIES_CONSTRAINT_VERIFY
5971 # define SQLITE_SERIES_CONSTRAINT_VERIFY 0
5972 #endif
5973
5974 /*
5975 ** This method is called to "rewind" the series_cursor object back
5976 ** to the first row of output. This method is always called at least
5977 ** once prior to any call to seriesColumn() or seriesRowid() or
5978 ** seriesEof().
5979 **
5980 ** The query plan selected by seriesBestIndex is passed in the idxNum
5981 ** parameter. (idxStr is not used in this implementation.) idxNum
5982 ** is a bitmask showing which constraints are available:
5983 **
5984 ** 1: start=VALUE
5985 ** 2: stop=VALUE
5986 ** 4: step=VALUE
5987 **
5988 ** Also, if bit 8 is set, that means that the series should be output
5989 ** in descending order rather than in ascending order. If bit 16 is
5990 ** set, then output must appear in ascending order.
5991 **
5992 ** This routine should initialize the cursor and position it so that it
5993 ** is pointing at the first row, or pointing off the end of the table
5994 ** (so that seriesEof() will return true) if the table is empty.
5995 */
seriesFilter(sqlite3_vtab_cursor * pVtabCursor,int idxNum,const char * idxStrUnused,int argc,sqlite3_value ** argv)5996 static int seriesFilter(
5997 sqlite3_vtab_cursor *pVtabCursor,
5998 int idxNum, const char *idxStrUnused,
5999 int argc, sqlite3_value **argv
6000 ){
6001 series_cursor *pCur = (series_cursor *)pVtabCursor;
6002 int i = 0;
6003 (void)idxStrUnused;
6004 if( idxNum & 1 ){
6005 pCur->ss.iBase = sqlite3_value_int64(argv[i++]);
6006 }else{
6007 pCur->ss.iBase = 0;
6008 }
6009 if( idxNum & 2 ){
6010 pCur->ss.iTerm = sqlite3_value_int64(argv[i++]);
6011 }else{
6012 pCur->ss.iTerm = 0xffffffff;
6013 }
6014 if( idxNum & 4 ){
6015 pCur->ss.iStep = sqlite3_value_int64(argv[i++]);
6016 if( pCur->ss.iStep==0 ){
6017 pCur->ss.iStep = 1;
6018 }else if( pCur->ss.iStep<0 ){
6019 if( (idxNum & 16)==0 ) idxNum |= 8;
6020 }
6021 }else{
6022 pCur->ss.iStep = 1;
6023 }
6024 for(i=0; i<argc; i++){
6025 if( sqlite3_value_type(argv[i])==SQLITE_NULL ){
6026 /* If any of the constraints have a NULL value, then return no rows.
6027 ** See ticket https://www.sqlite.org/src/info/fac496b61722daf2 */
6028 pCur->ss.iBase = 1;
6029 pCur->ss.iTerm = 0;
6030 pCur->ss.iStep = 1;
6031 break;
6032 }
6033 }
6034 if( idxNum & 8 ){
6035 pCur->ss.isReversing = pCur->ss.iStep > 0;
6036 }else{
6037 pCur->ss.isReversing = pCur->ss.iStep < 0;
6038 }
6039 setupSequence( &pCur->ss );
6040 return SQLITE_OK;
6041 }
6042
6043 /*
6044 ** SQLite will invoke this method one or more times while planning a query
6045 ** that uses the generate_series virtual table. This routine needs to create
6046 ** a query plan for each invocation and compute an estimated cost for that
6047 ** plan.
6048 **
6049 ** In this implementation idxNum is used to represent the
6050 ** query plan. idxStr is unused.
6051 **
6052 ** The query plan is represented by bits in idxNum:
6053 **
6054 ** (1) start = $value -- constraint exists
6055 ** (2) stop = $value -- constraint exists
6056 ** (4) step = $value -- constraint exists
6057 ** (8) output in descending order
6058 */
seriesBestIndex(sqlite3_vtab * pVTab,sqlite3_index_info * pIdxInfo)6059 static int seriesBestIndex(
6060 sqlite3_vtab *pVTab,
6061 sqlite3_index_info *pIdxInfo
6062 ){
6063 int i, j; /* Loop over constraints */
6064 int idxNum = 0; /* The query plan bitmask */
6065 int bStartSeen = 0; /* EQ constraint seen on the START column */
6066 int unusableMask = 0; /* Mask of unusable constraints */
6067 int nArg = 0; /* Number of arguments that seriesFilter() expects */
6068 int aIdx[3]; /* Constraints on start, stop, and step */
6069 const struct sqlite3_index_constraint *pConstraint;
6070
6071 /* This implementation assumes that the start, stop, and step columns
6072 ** are the last three columns in the virtual table. */
6073 assert( SERIES_COLUMN_STOP == SERIES_COLUMN_START+1 );
6074 assert( SERIES_COLUMN_STEP == SERIES_COLUMN_START+2 );
6075
6076 aIdx[0] = aIdx[1] = aIdx[2] = -1;
6077 pConstraint = pIdxInfo->aConstraint;
6078 for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){
6079 int iCol; /* 0 for start, 1 for stop, 2 for step */
6080 int iMask; /* bitmask for those column */
6081 if( pConstraint->iColumn<SERIES_COLUMN_START ) continue;
6082 iCol = pConstraint->iColumn - SERIES_COLUMN_START;
6083 assert( iCol>=0 && iCol<=2 );
6084 iMask = 1 << iCol;
6085 if( iCol==0 ) bStartSeen = 1;
6086 if( pConstraint->usable==0 ){
6087 unusableMask |= iMask;
6088 continue;
6089 }else if( pConstraint->op==SQLITE_INDEX_CONSTRAINT_EQ ){
6090 idxNum |= iMask;
6091 aIdx[iCol] = i;
6092 }
6093 }
6094 for(i=0; i<3; i++){
6095 if( (j = aIdx[i])>=0 ){
6096 pIdxInfo->aConstraintUsage[j].argvIndex = ++nArg;
6097 pIdxInfo->aConstraintUsage[j].omit = !SQLITE_SERIES_CONSTRAINT_VERIFY;
6098 }
6099 }
6100 /* The current generate_column() implementation requires at least one
6101 ** argument (the START value). Legacy versions assumed START=0 if the
6102 ** first argument was omitted. Compile with -DZERO_ARGUMENT_GENERATE_SERIES
6103 ** to obtain the legacy behavior */
6104 #ifndef ZERO_ARGUMENT_GENERATE_SERIES
6105 if( !bStartSeen ){
6106 sqlite3_free(pVTab->zErrMsg);
6107 pVTab->zErrMsg = sqlite3_mprintf(
6108 "first argument to \"generate_series()\" missing or unusable");
6109 return SQLITE_ERROR;
6110 }
6111 #endif
6112 if( (unusableMask & ~idxNum)!=0 ){
6113 /* The start, stop, and step columns are inputs. Therefore if there
6114 ** are unusable constraints on any of start, stop, or step then
6115 ** this plan is unusable */
6116 return SQLITE_CONSTRAINT;
6117 }
6118 if( (idxNum & 3)==3 ){
6119 /* Both start= and stop= boundaries are available. This is the
6120 ** the preferred case */
6121 pIdxInfo->estimatedCost = (double)(2 - ((idxNum&4)!=0));
6122 pIdxInfo->estimatedRows = 1000;
6123 if( pIdxInfo->nOrderBy>=1 && pIdxInfo->aOrderBy[0].iColumn==0 ){
6124 if( pIdxInfo->aOrderBy[0].desc ){
6125 idxNum |= 8;
6126 }else{
6127 idxNum |= 16;
6128 }
6129 pIdxInfo->orderByConsumed = 1;
6130 }
6131 }else{
6132 /* If either boundary is missing, we have to generate a huge span
6133 ** of numbers. Make this case very expensive so that the query
6134 ** planner will work hard to avoid it. */
6135 pIdxInfo->estimatedRows = 2147483647;
6136 }
6137 pIdxInfo->idxNum = idxNum;
6138 return SQLITE_OK;
6139 }
6140
6141 /*
6142 ** This following structure defines all the methods for the
6143 ** generate_series virtual table.
6144 */
6145 static sqlite3_module seriesModule = {
6146 0, /* iVersion */
6147 0, /* xCreate */
6148 seriesConnect, /* xConnect */
6149 seriesBestIndex, /* xBestIndex */
6150 seriesDisconnect, /* xDisconnect */
6151 0, /* xDestroy */
6152 seriesOpen, /* xOpen - open a cursor */
6153 seriesClose, /* xClose - close a cursor */
6154 seriesFilter, /* xFilter - configure scan constraints */
6155 seriesNext, /* xNext - advance a cursor */
6156 seriesEof, /* xEof - check for end of scan */
6157 seriesColumn, /* xColumn - read data */
6158 seriesRowid, /* xRowid - read data */
6159 0, /* xUpdate */
6160 0, /* xBegin */
6161 0, /* xSync */
6162 0, /* xCommit */
6163 0, /* xRollback */
6164 0, /* xFindMethod */
6165 0, /* xRename */
6166 0, /* xSavepoint */
6167 0, /* xRelease */
6168 0, /* xRollbackTo */
6169 0, /* xShadowName */
6170 0 /* xIntegrity */
6171 };
6172
6173 #endif /* SQLITE_OMIT_VIRTUALTABLE */
6174
6175 #ifdef _WIN32
6176
6177 #endif
sqlite3_series_init(sqlite3 * db,char ** pzErrMsg,const sqlite3_api_routines * pApi)6178 static int sqlite3_series_init(
6179 sqlite3 *db,
6180 char **pzErrMsg,
6181 const sqlite3_api_routines *pApi
6182 ){
6183 int rc = SQLITE_OK;
6184 SQLITE_EXTENSION_INIT2(pApi);
6185 #ifndef SQLITE_OMIT_VIRTUALTABLE
6186 if( sqlite3_libversion_number()<3008012 && pzErrMsg!=0 ){
6187 *pzErrMsg = sqlite3_mprintf(
6188 "generate_series() requires SQLite 3.8.12 or later");
6189 return SQLITE_ERROR;
6190 }
6191 rc = sqlite3_create_module(db, "generate_series", &seriesModule, 0);
6192 #endif
6193 return rc;
6194 }
6195
6196 /************************* End ../ext/misc/series.c ********************/
6197 /************************* Begin ../ext/misc/regexp.c ******************/
6198 /*
6199 ** 2012-11-13
6200 **
6201 ** The author disclaims copyright to this source code. In place of
6202 ** a legal notice, here is a blessing:
6203 **
6204 ** May you do good and not evil.
6205 ** May you find forgiveness for yourself and forgive others.
6206 ** May you share freely, never taking more than you give.
6207 **
6208 ******************************************************************************
6209 **
6210 ** The code in this file implements a compact but reasonably
6211 ** efficient regular-expression matcher for posix extended regular
6212 ** expressions against UTF8 text.
6213 **
6214 ** This file is an SQLite extension. It registers a single function
6215 ** named "regexp(A,B)" where A is the regular expression and B is the
6216 ** string to be matched. By registering this function, SQLite will also
6217 ** then implement the "B regexp A" operator. Note that with the function
6218 ** the regular expression comes first, but with the operator it comes
6219 ** second.
6220 **
6221 ** The following regular expression syntax is supported:
6222 **
6223 ** X* zero or more occurrences of X
6224 ** X+ one or more occurrences of X
6225 ** X? zero or one occurrences of X
6226 ** X{p,q} between p and q occurrences of X
6227 ** (X) match X
6228 ** X|Y X or Y
6229 ** ^X X occurring at the beginning of the string
6230 ** X$ X occurring at the end of the string
6231 ** . Match any single character
6232 ** \c Character c where c is one of \{}()[]|*+?.
6233 ** \c C-language escapes for c in afnrtv. ex: \t or \n
6234 ** \uXXXX Where XXXX is exactly 4 hex digits, unicode value XXXX
6235 ** \xXX Where XX is exactly 2 hex digits, unicode value XX
6236 ** [abc] Any single character from the set abc
6237 ** [^abc] Any single character not in the set abc
6238 ** [a-z] Any single character in the range a-z
6239 ** [^a-z] Any single character not in the range a-z
6240 ** \b Word boundary
6241 ** \w Word character. [A-Za-z0-9_]
6242 ** \W Non-word character
6243 ** \d Digit
6244 ** \D Non-digit
6245 ** \s Whitespace character
6246 ** \S Non-whitespace character
6247 **
6248 ** A nondeterministic finite automaton (NFA) is used for matching, so the
6249 ** performance is bounded by O(N*M) where N is the size of the regular
6250 ** expression and M is the size of the input string. The matcher never
6251 ** exhibits exponential behavior. Note that the X{p,q} operator expands
6252 ** to p copies of X following by q-p copies of X? and that the size of the
6253 ** regular expression in the O(N*M) performance bound is computed after
6254 ** this expansion.
6255 */
6256 #include <string.h>
6257 #include <stdlib.h>
6258 /* #include "sqlite3ext.h" */
6259 SQLITE_EXTENSION_INIT1
6260
6261 /*
6262 ** The following #defines change the names of some functions implemented in
6263 ** this file to prevent name collisions with C-library functions of the
6264 ** same name.
6265 */
6266 #define re_match sqlite3re_match
6267 #define re_compile sqlite3re_compile
6268 #define re_free sqlite3re_free
6269
6270 /* The end-of-input character */
6271 #define RE_EOF 0 /* End of input */
6272 #define RE_START 0xfffffff /* Start of input - larger than an UTF-8 */
6273
6274 /* The NFA is implemented as sequence of opcodes taken from the following
6275 ** set. Each opcode has a single integer argument.
6276 */
6277 #define RE_OP_MATCH 1 /* Match the one character in the argument */
6278 #define RE_OP_ANY 2 /* Match any one character. (Implements ".") */
6279 #define RE_OP_ANYSTAR 3 /* Special optimized version of .* */
6280 #define RE_OP_FORK 4 /* Continue to both next and opcode at iArg */
6281 #define RE_OP_GOTO 5 /* Jump to opcode at iArg */
6282 #define RE_OP_ACCEPT 6 /* Halt and indicate a successful match */
6283 #define RE_OP_CC_INC 7 /* Beginning of a [...] character class */
6284 #define RE_OP_CC_EXC 8 /* Beginning of a [^...] character class */
6285 #define RE_OP_CC_VALUE 9 /* Single value in a character class */
6286 #define RE_OP_CC_RANGE 10 /* Range of values in a character class */
6287 #define RE_OP_WORD 11 /* Perl word character [A-Za-z0-9_] */
6288 #define RE_OP_NOTWORD 12 /* Not a perl word character */
6289 #define RE_OP_DIGIT 13 /* digit: [0-9] */
6290 #define RE_OP_NOTDIGIT 14 /* Not a digit */
6291 #define RE_OP_SPACE 15 /* space: [ \t\n\r\v\f] */
6292 #define RE_OP_NOTSPACE 16 /* Not a digit */
6293 #define RE_OP_BOUNDARY 17 /* Boundary between word and non-word */
6294 #define RE_OP_ATSTART 18 /* Currently at the start of the string */
6295
6296 #if defined(SQLITE_DEBUG)
6297 /* Opcode names used for symbolic debugging */
6298 static const char *ReOpName[] = {
6299 "EOF",
6300 "MATCH",
6301 "ANY",
6302 "ANYSTAR",
6303 "FORK",
6304 "GOTO",
6305 "ACCEPT",
6306 "CC_INC",
6307 "CC_EXC",
6308 "CC_VALUE",
6309 "CC_RANGE",
6310 "WORD",
6311 "NOTWORD",
6312 "DIGIT",
6313 "NOTDIGIT",
6314 "SPACE",
6315 "NOTSPACE",
6316 "BOUNDARY",
6317 "ATSTART",
6318 };
6319 #endif /* SQLITE_DEBUG */
6320
6321
6322 /* Each opcode is a "state" in the NFA */
6323 typedef unsigned short ReStateNumber;
6324
6325 /* Because this is an NFA and not a DFA, multiple states can be active at
6326 ** once. An instance of the following object records all active states in
6327 ** the NFA. The implementation is optimized for the common case where the
6328 ** number of actives states is small.
6329 */
6330 typedef struct ReStateSet {
6331 unsigned nState; /* Number of current states */
6332 ReStateNumber *aState; /* Current states */
6333 } ReStateSet;
6334
6335 /* An input string read one character at a time.
6336 */
6337 typedef struct ReInput ReInput;
6338 struct ReInput {
6339 const unsigned char *z; /* All text */
6340 int i; /* Next byte to read */
6341 int mx; /* EOF when i>=mx */
6342 };
6343
6344 /* A compiled NFA (or an NFA that is in the process of being compiled) is
6345 ** an instance of the following object.
6346 */
6347 typedef struct ReCompiled ReCompiled;
6348 struct ReCompiled {
6349 ReInput sIn; /* Regular expression text */
6350 const char *zErr; /* Error message to return */
6351 char *aOp; /* Operators for the virtual machine */
6352 int *aArg; /* Arguments to each operator */
6353 unsigned (*xNextChar)(ReInput*); /* Next character function */
6354 unsigned char zInit[12]; /* Initial text to match */
6355 int nInit; /* Number of bytes in zInit */
6356 unsigned nState; /* Number of entries in aOp[] and aArg[] */
6357 unsigned nAlloc; /* Slots allocated for aOp[] and aArg[] */
6358 };
6359
6360 /* Add a state to the given state set if it is not already there */
re_add_state(ReStateSet * pSet,int newState)6361 static void re_add_state(ReStateSet *pSet, int newState){
6362 unsigned i;
6363 for(i=0; i<pSet->nState; i++) if( pSet->aState[i]==newState ) return;
6364 pSet->aState[pSet->nState++] = (ReStateNumber)newState;
6365 }
6366
6367 /* Extract the next unicode character from *pzIn and return it. Advance
6368 ** *pzIn to the first byte past the end of the character returned. To
6369 ** be clear: this routine converts utf8 to unicode. This routine is
6370 ** optimized for the common case where the next character is a single byte.
6371 */
re_next_char(ReInput * p)6372 static unsigned re_next_char(ReInput *p){
6373 unsigned c;
6374 if( p->i>=p->mx ) return 0;
6375 c = p->z[p->i++];
6376 if( c>=0x80 ){
6377 if( (c&0xe0)==0xc0 && p->i<p->mx && (p->z[p->i]&0xc0)==0x80 ){
6378 c = (c&0x1f)<<6 | (p->z[p->i++]&0x3f);
6379 if( c<0x80 ) c = 0xfffd;
6380 }else if( (c&0xf0)==0xe0 && p->i+1<p->mx && (p->z[p->i]&0xc0)==0x80
6381 && (p->z[p->i+1]&0xc0)==0x80 ){
6382 c = (c&0x0f)<<12 | ((p->z[p->i]&0x3f)<<6) | (p->z[p->i+1]&0x3f);
6383 p->i += 2;
6384 if( c<=0x7ff || (c>=0xd800 && c<=0xdfff) ) c = 0xfffd;
6385 }else if( (c&0xf8)==0xf0 && p->i+2<p->mx && (p->z[p->i]&0xc0)==0x80
6386 && (p->z[p->i+1]&0xc0)==0x80 && (p->z[p->i+2]&0xc0)==0x80 ){
6387 c = (c&0x07)<<18 | ((p->z[p->i]&0x3f)<<12) | ((p->z[p->i+1]&0x3f)<<6)
6388 | (p->z[p->i+2]&0x3f);
6389 p->i += 3;
6390 if( c<=0xffff || c>0x10ffff ) c = 0xfffd;
6391 }else{
6392 c = 0xfffd;
6393 }
6394 }
6395 return c;
6396 }
re_next_char_nocase(ReInput * p)6397 static unsigned re_next_char_nocase(ReInput *p){
6398 unsigned c = re_next_char(p);
6399 if( c>='A' && c<='Z' ) c += 'a' - 'A';
6400 return c;
6401 }
6402
6403 /* Return true if c is a perl "word" character: [A-Za-z0-9_] */
re_word_char(int c)6404 static int re_word_char(int c){
6405 return (c>='0' && c<='9') || (c>='a' && c<='z')
6406 || (c>='A' && c<='Z') || c=='_';
6407 }
6408
6409 /* Return true if c is a "digit" character: [0-9] */
re_digit_char(int c)6410 static int re_digit_char(int c){
6411 return (c>='0' && c<='9');
6412 }
6413
6414 /* Return true if c is a perl "space" character: [ \t\r\n\v\f] */
re_space_char(int c)6415 static int re_space_char(int c){
6416 return c==' ' || c=='\t' || c=='\n' || c=='\r' || c=='\v' || c=='\f';
6417 }
6418
6419 /* Run a compiled regular expression on the zero-terminated input
6420 ** string zIn[]. Return true on a match and false if there is no match.
6421 */
re_match(ReCompiled * pRe,const unsigned char * zIn,int nIn)6422 static int re_match(ReCompiled *pRe, const unsigned char *zIn, int nIn){
6423 ReStateSet aStateSet[2], *pThis, *pNext;
6424 ReStateNumber aSpace[100];
6425 ReStateNumber *pToFree;
6426 unsigned int i = 0;
6427 unsigned int iSwap = 0;
6428 int c = RE_START;
6429 int cPrev = 0;
6430 int rc = 0;
6431 ReInput in;
6432
6433 in.z = zIn;
6434 in.i = 0;
6435 in.mx = nIn>=0 ? nIn : (int)strlen((char const*)zIn);
6436
6437 /* Look for the initial prefix match, if there is one. */
6438 if( pRe->nInit ){
6439 unsigned char x = pRe->zInit[0];
6440 while( in.i+pRe->nInit<=in.mx
6441 && (zIn[in.i]!=x ||
6442 strncmp((const char*)zIn+in.i, (const char*)pRe->zInit, pRe->nInit)!=0)
6443 ){
6444 in.i++;
6445 }
6446 if( in.i+pRe->nInit>in.mx ) return 0;
6447 c = RE_START-1;
6448 }
6449
6450 if( pRe->nState<=(sizeof(aSpace)/(sizeof(aSpace[0])*2)) ){
6451 pToFree = 0;
6452 aStateSet[0].aState = aSpace;
6453 }else{
6454 pToFree = sqlite3_malloc64( sizeof(ReStateNumber)*2*pRe->nState );
6455 if( pToFree==0 ) return -1;
6456 aStateSet[0].aState = pToFree;
6457 }
6458 aStateSet[1].aState = &aStateSet[0].aState[pRe->nState];
6459 pNext = &aStateSet[1];
6460 pNext->nState = 0;
6461 re_add_state(pNext, 0);
6462 while( c!=RE_EOF && pNext->nState>0 ){
6463 cPrev = c;
6464 c = pRe->xNextChar(&in);
6465 pThis = pNext;
6466 pNext = &aStateSet[iSwap];
6467 iSwap = 1 - iSwap;
6468 pNext->nState = 0;
6469 for(i=0; i<pThis->nState; i++){
6470 int x = pThis->aState[i];
6471 switch( pRe->aOp[x] ){
6472 case RE_OP_MATCH: {
6473 if( pRe->aArg[x]==c ) re_add_state(pNext, x+1);
6474 break;
6475 }
6476 case RE_OP_ATSTART: {
6477 if( cPrev==RE_START ) re_add_state(pThis, x+1);
6478 break;
6479 }
6480 case RE_OP_ANY: {
6481 if( c!=0 ) re_add_state(pNext, x+1);
6482 break;
6483 }
6484 case RE_OP_WORD: {
6485 if( re_word_char(c) ) re_add_state(pNext, x+1);
6486 break;
6487 }
6488 case RE_OP_NOTWORD: {
6489 if( !re_word_char(c) && c!=0 ) re_add_state(pNext, x+1);
6490 break;
6491 }
6492 case RE_OP_DIGIT: {
6493 if( re_digit_char(c) ) re_add_state(pNext, x+1);
6494 break;
6495 }
6496 case RE_OP_NOTDIGIT: {
6497 if( !re_digit_char(c) && c!=0 ) re_add_state(pNext, x+1);
6498 break;
6499 }
6500 case RE_OP_SPACE: {
6501 if( re_space_char(c) ) re_add_state(pNext, x+1);
6502 break;
6503 }
6504 case RE_OP_NOTSPACE: {
6505 if( !re_space_char(c) && c!=0 ) re_add_state(pNext, x+1);
6506 break;
6507 }
6508 case RE_OP_BOUNDARY: {
6509 if( re_word_char(c)!=re_word_char(cPrev) ) re_add_state(pThis, x+1);
6510 break;
6511 }
6512 case RE_OP_ANYSTAR: {
6513 re_add_state(pNext, x);
6514 re_add_state(pThis, x+1);
6515 break;
6516 }
6517 case RE_OP_FORK: {
6518 re_add_state(pThis, x+pRe->aArg[x]);
6519 re_add_state(pThis, x+1);
6520 break;
6521 }
6522 case RE_OP_GOTO: {
6523 re_add_state(pThis, x+pRe->aArg[x]);
6524 break;
6525 }
6526 case RE_OP_ACCEPT: {
6527 rc = 1;
6528 goto re_match_end;
6529 }
6530 case RE_OP_CC_EXC: {
6531 if( c==0 ) break;
6532 /* fall-through */ goto re_op_cc_inc;
6533 }
6534 case RE_OP_CC_INC: re_op_cc_inc: {
6535 int j = 1;
6536 int n = pRe->aArg[x];
6537 int hit = 0;
6538 for(j=1; j>0 && j<n; j++){
6539 if( pRe->aOp[x+j]==RE_OP_CC_VALUE ){
6540 if( pRe->aArg[x+j]==c ){
6541 hit = 1;
6542 j = -1;
6543 }
6544 }else{
6545 if( pRe->aArg[x+j]<=c && pRe->aArg[x+j+1]>=c ){
6546 hit = 1;
6547 j = -1;
6548 }else{
6549 j++;
6550 }
6551 }
6552 }
6553 if( pRe->aOp[x]==RE_OP_CC_EXC ) hit = !hit;
6554 if( hit ) re_add_state(pNext, x+n);
6555 break;
6556 }
6557 }
6558 }
6559 }
6560 for(i=0; i<pNext->nState; i++){
6561 int x = pNext->aState[i];
6562 while( pRe->aOp[x]==RE_OP_GOTO ) x += pRe->aArg[x];
6563 if( pRe->aOp[x]==RE_OP_ACCEPT ){ rc = 1; break; }
6564 }
6565 re_match_end:
6566 sqlite3_free(pToFree);
6567 return rc;
6568 }
6569
6570 /* Resize the opcode and argument arrays for an RE under construction.
6571 */
re_resize(ReCompiled * p,int N)6572 static int re_resize(ReCompiled *p, int N){
6573 char *aOp;
6574 int *aArg;
6575 aOp = sqlite3_realloc64(p->aOp, N*sizeof(p->aOp[0]));
6576 if( aOp==0 ) return 1;
6577 p->aOp = aOp;
6578 aArg = sqlite3_realloc64(p->aArg, N*sizeof(p->aArg[0]));
6579 if( aArg==0 ) return 1;
6580 p->aArg = aArg;
6581 p->nAlloc = N;
6582 return 0;
6583 }
6584
6585 /* Insert a new opcode and argument into an RE under construction. The
6586 ** insertion point is just prior to existing opcode iBefore.
6587 */
re_insert(ReCompiled * p,int iBefore,int op,int arg)6588 static int re_insert(ReCompiled *p, int iBefore, int op, int arg){
6589 int i;
6590 if( p->nAlloc<=p->nState && re_resize(p, p->nAlloc*2) ) return 0;
6591 for(i=p->nState; i>iBefore; i--){
6592 p->aOp[i] = p->aOp[i-1];
6593 p->aArg[i] = p->aArg[i-1];
6594 }
6595 p->nState++;
6596 p->aOp[iBefore] = (char)op;
6597 p->aArg[iBefore] = arg;
6598 return iBefore;
6599 }
6600
6601 /* Append a new opcode and argument to the end of the RE under construction.
6602 */
re_append(ReCompiled * p,int op,int arg)6603 static int re_append(ReCompiled *p, int op, int arg){
6604 return re_insert(p, p->nState, op, arg);
6605 }
6606
6607 /* Make a copy of N opcodes starting at iStart onto the end of the RE
6608 ** under construction.
6609 */
re_copy(ReCompiled * p,int iStart,int N)6610 static void re_copy(ReCompiled *p, int iStart, int N){
6611 if( p->nState+N>=p->nAlloc && re_resize(p, p->nAlloc*2+N) ) return;
6612 memcpy(&p->aOp[p->nState], &p->aOp[iStart], N*sizeof(p->aOp[0]));
6613 memcpy(&p->aArg[p->nState], &p->aArg[iStart], N*sizeof(p->aArg[0]));
6614 p->nState += N;
6615 }
6616
6617 /* Return true if c is a hexadecimal digit character: [0-9a-fA-F]
6618 ** If c is a hex digit, also set *pV = (*pV)*16 + valueof(c). If
6619 ** c is not a hex digit *pV is unchanged.
6620 */
re_hex(int c,int * pV)6621 static int re_hex(int c, int *pV){
6622 if( c>='0' && c<='9' ){
6623 c -= '0';
6624 }else if( c>='a' && c<='f' ){
6625 c -= 'a' - 10;
6626 }else if( c>='A' && c<='F' ){
6627 c -= 'A' - 10;
6628 }else{
6629 return 0;
6630 }
6631 *pV = (*pV)*16 + (c & 0xff);
6632 return 1;
6633 }
6634
6635 /* A backslash character has been seen, read the next character and
6636 ** return its interpretation.
6637 */
re_esc_char(ReCompiled * p)6638 static unsigned re_esc_char(ReCompiled *p){
6639 static const char zEsc[] = "afnrtv\\()*.+?[$^{|}]";
6640 static const char zTrans[] = "\a\f\n\r\t\v";
6641 int i, v = 0;
6642 char c;
6643 if( p->sIn.i>=p->sIn.mx ) return 0;
6644 c = p->sIn.z[p->sIn.i];
6645 if( c=='u' && p->sIn.i+4<p->sIn.mx ){
6646 const unsigned char *zIn = p->sIn.z + p->sIn.i;
6647 if( re_hex(zIn[1],&v)
6648 && re_hex(zIn[2],&v)
6649 && re_hex(zIn[3],&v)
6650 && re_hex(zIn[4],&v)
6651 ){
6652 p->sIn.i += 5;
6653 return v;
6654 }
6655 }
6656 if( c=='x' && p->sIn.i+2<p->sIn.mx ){
6657 const unsigned char *zIn = p->sIn.z + p->sIn.i;
6658 if( re_hex(zIn[1],&v)
6659 && re_hex(zIn[2],&v)
6660 ){
6661 p->sIn.i += 3;
6662 return v;
6663 }
6664 }
6665 for(i=0; zEsc[i] && zEsc[i]!=c; i++){}
6666 if( zEsc[i] ){
6667 if( i<6 ) c = zTrans[i];
6668 p->sIn.i++;
6669 }else{
6670 p->zErr = "unknown \\ escape";
6671 }
6672 return c;
6673 }
6674
6675 /* Forward declaration */
6676 static const char *re_subcompile_string(ReCompiled*);
6677
6678 /* Peek at the next byte of input */
rePeek(ReCompiled * p)6679 static unsigned char rePeek(ReCompiled *p){
6680 return p->sIn.i<p->sIn.mx ? p->sIn.z[p->sIn.i] : 0;
6681 }
6682
6683 /* Compile RE text into a sequence of opcodes. Continue up to the
6684 ** first unmatched ")" character, then return. If an error is found,
6685 ** return a pointer to the error message string.
6686 */
re_subcompile_re(ReCompiled * p)6687 static const char *re_subcompile_re(ReCompiled *p){
6688 const char *zErr;
6689 int iStart, iEnd, iGoto;
6690 iStart = p->nState;
6691 zErr = re_subcompile_string(p);
6692 if( zErr ) return zErr;
6693 while( rePeek(p)=='|' ){
6694 iEnd = p->nState;
6695 re_insert(p, iStart, RE_OP_FORK, iEnd + 2 - iStart);
6696 iGoto = re_append(p, RE_OP_GOTO, 0);
6697 p->sIn.i++;
6698 zErr = re_subcompile_string(p);
6699 if( zErr ) return zErr;
6700 p->aArg[iGoto] = p->nState - iGoto;
6701 }
6702 return 0;
6703 }
6704
6705 /* Compile an element of regular expression text (anything that can be
6706 ** an operand to the "|" operator). Return NULL on success or a pointer
6707 ** to the error message if there is a problem.
6708 */
re_subcompile_string(ReCompiled * p)6709 static const char *re_subcompile_string(ReCompiled *p){
6710 int iPrev = -1;
6711 int iStart;
6712 unsigned c;
6713 const char *zErr;
6714 while( (c = p->xNextChar(&p->sIn))!=0 ){
6715 iStart = p->nState;
6716 switch( c ){
6717 case '|':
6718 case ')': {
6719 p->sIn.i--;
6720 return 0;
6721 }
6722 case '(': {
6723 zErr = re_subcompile_re(p);
6724 if( zErr ) return zErr;
6725 if( rePeek(p)!=')' ) return "unmatched '('";
6726 p->sIn.i++;
6727 break;
6728 }
6729 case '.': {
6730 if( rePeek(p)=='*' ){
6731 re_append(p, RE_OP_ANYSTAR, 0);
6732 p->sIn.i++;
6733 }else{
6734 re_append(p, RE_OP_ANY, 0);
6735 }
6736 break;
6737 }
6738 case '*': {
6739 if( iPrev<0 ) return "'*' without operand";
6740 re_insert(p, iPrev, RE_OP_GOTO, p->nState - iPrev + 1);
6741 re_append(p, RE_OP_FORK, iPrev - p->nState + 1);
6742 break;
6743 }
6744 case '+': {
6745 if( iPrev<0 ) return "'+' without operand";
6746 re_append(p, RE_OP_FORK, iPrev - p->nState);
6747 break;
6748 }
6749 case '?': {
6750 if( iPrev<0 ) return "'?' without operand";
6751 re_insert(p, iPrev, RE_OP_FORK, p->nState - iPrev+1);
6752 break;
6753 }
6754 case '$': {
6755 re_append(p, RE_OP_MATCH, RE_EOF);
6756 break;
6757 }
6758 case '^': {
6759 re_append(p, RE_OP_ATSTART, 0);
6760 break;
6761 }
6762 case '{': {
6763 int m = 0, n = 0;
6764 int sz, j;
6765 if( iPrev<0 ) return "'{m,n}' without operand";
6766 while( (c=rePeek(p))>='0' && c<='9' ){ m = m*10 + c - '0'; p->sIn.i++; }
6767 n = m;
6768 if( c==',' ){
6769 p->sIn.i++;
6770 n = 0;
6771 while( (c=rePeek(p))>='0' && c<='9' ){ n = n*10 + c-'0'; p->sIn.i++; }
6772 }
6773 if( c!='}' ) return "unmatched '{'";
6774 if( n>0 && n<m ) return "n less than m in '{m,n}'";
6775 p->sIn.i++;
6776 sz = p->nState - iPrev;
6777 if( m==0 ){
6778 if( n==0 ) return "both m and n are zero in '{m,n}'";
6779 re_insert(p, iPrev, RE_OP_FORK, sz+1);
6780 iPrev++;
6781 n--;
6782 }else{
6783 for(j=1; j<m; j++) re_copy(p, iPrev, sz);
6784 }
6785 for(j=m; j<n; j++){
6786 re_append(p, RE_OP_FORK, sz+1);
6787 re_copy(p, iPrev, sz);
6788 }
6789 if( n==0 && m>0 ){
6790 re_append(p, RE_OP_FORK, -sz);
6791 }
6792 break;
6793 }
6794 case '[': {
6795 unsigned int iFirst = p->nState;
6796 if( rePeek(p)=='^' ){
6797 re_append(p, RE_OP_CC_EXC, 0);
6798 p->sIn.i++;
6799 }else{
6800 re_append(p, RE_OP_CC_INC, 0);
6801 }
6802 while( (c = p->xNextChar(&p->sIn))!=0 ){
6803 if( c=='[' && rePeek(p)==':' ){
6804 return "POSIX character classes not supported";
6805 }
6806 if( c=='\\' ) c = re_esc_char(p);
6807 if( rePeek(p)=='-' ){
6808 re_append(p, RE_OP_CC_RANGE, c);
6809 p->sIn.i++;
6810 c = p->xNextChar(&p->sIn);
6811 if( c=='\\' ) c = re_esc_char(p);
6812 re_append(p, RE_OP_CC_RANGE, c);
6813 }else{
6814 re_append(p, RE_OP_CC_VALUE, c);
6815 }
6816 if( rePeek(p)==']' ){ p->sIn.i++; break; }
6817 }
6818 if( c==0 ) return "unclosed '['";
6819 if( p->nState>iFirst ) p->aArg[iFirst] = p->nState - iFirst;
6820 break;
6821 }
6822 case '\\': {
6823 int specialOp = 0;
6824 switch( rePeek(p) ){
6825 case 'b': specialOp = RE_OP_BOUNDARY; break;
6826 case 'd': specialOp = RE_OP_DIGIT; break;
6827 case 'D': specialOp = RE_OP_NOTDIGIT; break;
6828 case 's': specialOp = RE_OP_SPACE; break;
6829 case 'S': specialOp = RE_OP_NOTSPACE; break;
6830 case 'w': specialOp = RE_OP_WORD; break;
6831 case 'W': specialOp = RE_OP_NOTWORD; break;
6832 }
6833 if( specialOp ){
6834 p->sIn.i++;
6835 re_append(p, specialOp, 0);
6836 }else{
6837 c = re_esc_char(p);
6838 re_append(p, RE_OP_MATCH, c);
6839 }
6840 break;
6841 }
6842 default: {
6843 re_append(p, RE_OP_MATCH, c);
6844 break;
6845 }
6846 }
6847 iPrev = iStart;
6848 }
6849 return 0;
6850 }
6851
6852 /* Free and reclaim all the memory used by a previously compiled
6853 ** regular expression. Applications should invoke this routine once
6854 ** for every call to re_compile() to avoid memory leaks.
6855 */
re_free(ReCompiled * pRe)6856 static void re_free(ReCompiled *pRe){
6857 if( pRe ){
6858 sqlite3_free(pRe->aOp);
6859 sqlite3_free(pRe->aArg);
6860 sqlite3_free(pRe);
6861 }
6862 }
6863
6864 /*
6865 ** Compile a textual regular expression in zIn[] into a compiled regular
6866 ** expression suitable for us by re_match() and return a pointer to the
6867 ** compiled regular expression in *ppRe. Return NULL on success or an
6868 ** error message if something goes wrong.
6869 */
re_compile(ReCompiled ** ppRe,const char * zIn,int noCase)6870 static const char *re_compile(ReCompiled **ppRe, const char *zIn, int noCase){
6871 ReCompiled *pRe;
6872 const char *zErr;
6873 int i, j;
6874
6875 *ppRe = 0;
6876 pRe = sqlite3_malloc( sizeof(*pRe) );
6877 if( pRe==0 ){
6878 return "out of memory";
6879 }
6880 memset(pRe, 0, sizeof(*pRe));
6881 pRe->xNextChar = noCase ? re_next_char_nocase : re_next_char;
6882 if( re_resize(pRe, 30) ){
6883 re_free(pRe);
6884 return "out of memory";
6885 }
6886 if( zIn[0]=='^' ){
6887 zIn++;
6888 }else{
6889 re_append(pRe, RE_OP_ANYSTAR, 0);
6890 }
6891 pRe->sIn.z = (unsigned char*)zIn;
6892 pRe->sIn.i = 0;
6893 pRe->sIn.mx = (int)strlen(zIn);
6894 zErr = re_subcompile_re(pRe);
6895 if( zErr ){
6896 re_free(pRe);
6897 return zErr;
6898 }
6899 if( pRe->sIn.i>=pRe->sIn.mx ){
6900 re_append(pRe, RE_OP_ACCEPT, 0);
6901 *ppRe = pRe;
6902 }else{
6903 re_free(pRe);
6904 return "unrecognized character";
6905 }
6906
6907 /* The following is a performance optimization. If the regex begins with
6908 ** ".*" (if the input regex lacks an initial "^") and afterwards there are
6909 ** one or more matching characters, enter those matching characters into
6910 ** zInit[]. The re_match() routine can then search ahead in the input
6911 ** string looking for the initial match without having to run the whole
6912 ** regex engine over the string. Do not worry about trying to match
6913 ** unicode characters beyond plane 0 - those are very rare and this is
6914 ** just an optimization. */
6915 if( pRe->aOp[0]==RE_OP_ANYSTAR && !noCase ){
6916 for(j=0, i=1; j<(int)sizeof(pRe->zInit)-2 && pRe->aOp[i]==RE_OP_MATCH; i++){
6917 unsigned x = pRe->aArg[i];
6918 if( x<=0x7f ){
6919 pRe->zInit[j++] = (unsigned char)x;
6920 }else if( x<=0x7ff ){
6921 pRe->zInit[j++] = (unsigned char)(0xc0 | (x>>6));
6922 pRe->zInit[j++] = 0x80 | (x&0x3f);
6923 }else if( x<=0xffff ){
6924 pRe->zInit[j++] = (unsigned char)(0xe0 | (x>>12));
6925 pRe->zInit[j++] = 0x80 | ((x>>6)&0x3f);
6926 pRe->zInit[j++] = 0x80 | (x&0x3f);
6927 }else{
6928 break;
6929 }
6930 }
6931 if( j>0 && pRe->zInit[j-1]==0 ) j--;
6932 pRe->nInit = j;
6933 }
6934 return pRe->zErr;
6935 }
6936
6937 /*
6938 ** Implementation of the regexp() SQL function. This function implements
6939 ** the build-in REGEXP operator. The first argument to the function is the
6940 ** pattern and the second argument is the string. So, the SQL statements:
6941 **
6942 ** A REGEXP B
6943 **
6944 ** is implemented as regexp(B,A).
6945 */
re_sql_func(sqlite3_context * context,int argc,sqlite3_value ** argv)6946 static void re_sql_func(
6947 sqlite3_context *context,
6948 int argc,
6949 sqlite3_value **argv
6950 ){
6951 ReCompiled *pRe; /* Compiled regular expression */
6952 const char *zPattern; /* The regular expression */
6953 const unsigned char *zStr;/* String being searched */
6954 const char *zErr; /* Compile error message */
6955 int setAux = 0; /* True to invoke sqlite3_set_auxdata() */
6956
6957 (void)argc; /* Unused */
6958 pRe = sqlite3_get_auxdata(context, 0);
6959 if( pRe==0 ){
6960 zPattern = (const char*)sqlite3_value_text(argv[0]);
6961 if( zPattern==0 ) return;
6962 zErr = re_compile(&pRe, zPattern, sqlite3_user_data(context)!=0);
6963 if( zErr ){
6964 re_free(pRe);
6965 sqlite3_result_error(context, zErr, -1);
6966 return;
6967 }
6968 if( pRe==0 ){
6969 sqlite3_result_error_nomem(context);
6970 return;
6971 }
6972 setAux = 1;
6973 }
6974 zStr = (const unsigned char*)sqlite3_value_text(argv[1]);
6975 if( zStr!=0 ){
6976 sqlite3_result_int(context, re_match(pRe, zStr, -1));
6977 }
6978 if( setAux ){
6979 sqlite3_set_auxdata(context, 0, pRe, (void(*)(void*))re_free);
6980 }
6981 }
6982
6983 #if defined(SQLITE_DEBUG)
6984 /*
6985 ** This function is used for testing and debugging only. It is only available
6986 ** if the SQLITE_DEBUG compile-time option is used.
6987 **
6988 ** Compile a regular expression and then convert the compiled expression into
6989 ** text and return that text.
6990 */
re_bytecode_func(sqlite3_context * context,int argc,sqlite3_value ** argv)6991 static void re_bytecode_func(
6992 sqlite3_context *context,
6993 int argc,
6994 sqlite3_value **argv
6995 ){
6996 const char *zPattern;
6997 const char *zErr;
6998 ReCompiled *pRe;
6999 sqlite3_str *pStr;
7000 int i;
7001 int n;
7002 char *z;
7003 (void)argc;
7004
7005 zPattern = (const char*)sqlite3_value_text(argv[0]);
7006 if( zPattern==0 ) return;
7007 zErr = re_compile(&pRe, zPattern, sqlite3_user_data(context)!=0);
7008 if( zErr ){
7009 re_free(pRe);
7010 sqlite3_result_error(context, zErr, -1);
7011 return;
7012 }
7013 if( pRe==0 ){
7014 sqlite3_result_error_nomem(context);
7015 return;
7016 }
7017 pStr = sqlite3_str_new(0);
7018 if( pStr==0 ) goto re_bytecode_func_err;
7019 if( pRe->nInit>0 ){
7020 sqlite3_str_appendf(pStr, "INIT ");
7021 for(i=0; i<pRe->nInit; i++){
7022 sqlite3_str_appendf(pStr, "%02x", pRe->zInit[i]);
7023 }
7024 sqlite3_str_appendf(pStr, "\n");
7025 }
7026 for(i=0; (unsigned)i<pRe->nState; i++){
7027 sqlite3_str_appendf(pStr, "%-8s %4d\n",
7028 ReOpName[(unsigned char)pRe->aOp[i]], pRe->aArg[i]);
7029 }
7030 n = sqlite3_str_length(pStr);
7031 z = sqlite3_str_finish(pStr);
7032 if( n==0 ){
7033 sqlite3_free(z);
7034 }else{
7035 sqlite3_result_text(context, z, n-1, sqlite3_free);
7036 }
7037
7038 re_bytecode_func_err:
7039 re_free(pRe);
7040 }
7041
7042 #endif /* SQLITE_DEBUG */
7043
7044
7045 /*
7046 ** Invoke this routine to register the regexp() function with the
7047 ** SQLite database connection.
7048 */
7049 #ifdef _WIN32
7050
7051 #endif
sqlite3_regexp_init(sqlite3 * db,char ** pzErrMsg,const sqlite3_api_routines * pApi)7052 static int sqlite3_regexp_init(
7053 sqlite3 *db,
7054 char **pzErrMsg,
7055 const sqlite3_api_routines *pApi
7056 ){
7057 int rc = SQLITE_OK;
7058 SQLITE_EXTENSION_INIT2(pApi);
7059 (void)pzErrMsg; /* Unused */
7060 rc = sqlite3_create_function(db, "regexp", 2,
7061 SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC,
7062 0, re_sql_func, 0, 0);
7063 if( rc==SQLITE_OK ){
7064 /* The regexpi(PATTERN,STRING) function is a case-insensitive version
7065 ** of regexp(PATTERN,STRING). */
7066 rc = sqlite3_create_function(db, "regexpi", 2,
7067 SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC,
7068 (void*)db, re_sql_func, 0, 0);
7069 #if defined(SQLITE_DEBUG)
7070 if( rc==SQLITE_OK ){
7071 rc = sqlite3_create_function(db, "regexp_bytecode", 1,
7072 SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC,
7073 0, re_bytecode_func, 0, 0);
7074 }
7075 #endif /* SQLITE_DEBUG */
7076 }
7077 return rc;
7078 }
7079
7080 /************************* End ../ext/misc/regexp.c ********************/
7081 #ifndef SQLITE_SHELL_FIDDLE
7082 /************************* Begin ../ext/misc/fileio.c ******************/
7083 /*
7084 ** 2014-06-13
7085 **
7086 ** The author disclaims copyright to this source code. In place of
7087 ** a legal notice, here is a blessing:
7088 **
7089 ** May you do good and not evil.
7090 ** May you find forgiveness for yourself and forgive others.
7091 ** May you share freely, never taking more than you give.
7092 **
7093 ******************************************************************************
7094 **
7095 ** This SQLite extension implements SQL functions readfile() and
7096 ** writefile(), and eponymous virtual type "fsdir".
7097 **
7098 ** WRITEFILE(FILE, DATA [, MODE [, MTIME]]):
7099 **
7100 ** If neither of the optional arguments is present, then this UDF
7101 ** function writes blob DATA to file FILE. If successful, the number
7102 ** of bytes written is returned. If an error occurs, NULL is returned.
7103 **
7104 ** If the first option argument - MODE - is present, then it must
7105 ** be passed an integer value that corresponds to a POSIX mode
7106 ** value (file type + permissions, as returned in the stat.st_mode
7107 ** field by the stat() system call). Three types of files may
7108 ** be written/created:
7109 **
7110 ** regular files: (mode & 0170000)==0100000
7111 ** symbolic links: (mode & 0170000)==0120000
7112 ** directories: (mode & 0170000)==0040000
7113 **
7114 ** For a directory, the DATA is ignored. For a symbolic link, it is
7115 ** interpreted as text and used as the target of the link. For a
7116 ** regular file, it is interpreted as a blob and written into the
7117 ** named file. Regardless of the type of file, its permissions are
7118 ** set to (mode & 0777) before returning.
7119 **
7120 ** If the optional MTIME argument is present, then it is interpreted
7121 ** as an integer - the number of seconds since the unix epoch. The
7122 ** modification-time of the target file is set to this value before
7123 ** returning.
7124 **
7125 ** If three or more arguments are passed to this function and an
7126 ** error is encountered, an exception is raised.
7127 **
7128 ** READFILE(FILE):
7129 **
7130 ** Read and return the contents of file FILE (type blob) from disk.
7131 **
7132 ** FSDIR:
7133 **
7134 ** Used as follows:
7135 **
7136 ** SELECT * FROM fsdir($path [, $dir]);
7137 **
7138 ** Parameter $path is an absolute or relative pathname. If the file that it
7139 ** refers to does not exist, it is an error. If the path refers to a regular
7140 ** file or symbolic link, it returns a single row. Or, if the path refers
7141 ** to a directory, it returns one row for the directory, and one row for each
7142 ** file within the hierarchy rooted at $path.
7143 **
7144 ** Each row has the following columns:
7145 **
7146 ** name: Path to file or directory (text value).
7147 ** mode: Value of stat.st_mode for directory entry (an integer).
7148 ** mtime: Value of stat.st_mtime for directory entry (an integer).
7149 ** data: For a regular file, a blob containing the file data. For a
7150 ** symlink, a text value containing the text of the link. For a
7151 ** directory, NULL.
7152 **
7153 ** If a non-NULL value is specified for the optional $dir parameter and
7154 ** $path is a relative path, then $path is interpreted relative to $dir.
7155 ** And the paths returned in the "name" column of the table are also
7156 ** relative to directory $dir.
7157 **
7158 ** Notes on building this extension for Windows:
7159 ** Unless linked statically with the SQLite library, a preprocessor
7160 ** symbol, FILEIO_WIN32_DLL, must be #define'd to create a stand-alone
7161 ** DLL form of this extension for WIN32. See its use below for details.
7162 */
7163 /* #include "sqlite3ext.h" */
7164 SQLITE_EXTENSION_INIT1
7165 #include <stdio.h>
7166 #include <string.h>
7167 #include <assert.h>
7168
7169 #include <sys/types.h>
7170 #include <sys/stat.h>
7171 #include <fcntl.h>
7172 #if !defined(_WIN32) && !defined(WIN32)
7173 # include <unistd.h>
7174 # include <dirent.h>
7175 # include <utime.h>
7176 # include <sys/time.h>
7177 #else
7178 # include "windows.h"
7179 # include <io.h>
7180 # include <direct.h>
7181 /* # include "test_windirent.h" */
7182 # define dirent DIRENT
7183 # ifndef chmod
7184 # define chmod _chmod
7185 # endif
7186 # ifndef stat
7187 # define stat _stat
7188 # endif
7189 # define mkdir(path,mode) _mkdir(path)
7190 # define lstat(path,buf) stat(path,buf)
7191 #endif
7192 #include <time.h>
7193 #include <errno.h>
7194
7195
7196 /*
7197 ** Structure of the fsdir() table-valued function
7198 */
7199 /* 0 1 2 3 4 5 */
7200 #define FSDIR_SCHEMA "(name,mode,mtime,data,path HIDDEN,dir HIDDEN)"
7201 #define FSDIR_COLUMN_NAME 0 /* Name of the file */
7202 #define FSDIR_COLUMN_MODE 1 /* Access mode */
7203 #define FSDIR_COLUMN_MTIME 2 /* Last modification time */
7204 #define FSDIR_COLUMN_DATA 3 /* File content */
7205 #define FSDIR_COLUMN_PATH 4 /* Path to top of search */
7206 #define FSDIR_COLUMN_DIR 5 /* Path is relative to this directory */
7207
7208
7209 /*
7210 ** Set the result stored by context ctx to a blob containing the
7211 ** contents of file zName. Or, leave the result unchanged (NULL)
7212 ** if the file does not exist or is unreadable.
7213 **
7214 ** If the file exceeds the SQLite blob size limit, through an
7215 ** SQLITE_TOOBIG error.
7216 **
7217 ** Throw an SQLITE_IOERR if there are difficulties pulling the file
7218 ** off of disk.
7219 */
readFileContents(sqlite3_context * ctx,const char * zName)7220 static void readFileContents(sqlite3_context *ctx, const char *zName){
7221 FILE *in;
7222 sqlite3_int64 nIn;
7223 void *pBuf;
7224 sqlite3 *db;
7225 int mxBlob;
7226
7227 in = fopen(zName, "rb");
7228 if( in==0 ){
7229 /* File does not exist or is unreadable. Leave the result set to NULL. */
7230 return;
7231 }
7232 fseek(in, 0, SEEK_END);
7233 nIn = ftell(in);
7234 rewind(in);
7235 db = sqlite3_context_db_handle(ctx);
7236 mxBlob = sqlite3_limit(db, SQLITE_LIMIT_LENGTH, -1);
7237 if( nIn>mxBlob ){
7238 sqlite3_result_error_code(ctx, SQLITE_TOOBIG);
7239 fclose(in);
7240 return;
7241 }
7242 pBuf = sqlite3_malloc64( nIn ? nIn : 1 );
7243 if( pBuf==0 ){
7244 sqlite3_result_error_nomem(ctx);
7245 fclose(in);
7246 return;
7247 }
7248 if( nIn==(sqlite3_int64)fread(pBuf, 1, (size_t)nIn, in) ){
7249 sqlite3_result_blob64(ctx, pBuf, nIn, sqlite3_free);
7250 }else{
7251 sqlite3_result_error_code(ctx, SQLITE_IOERR);
7252 sqlite3_free(pBuf);
7253 }
7254 fclose(in);
7255 }
7256
7257 /*
7258 ** Implementation of the "readfile(X)" SQL function. The entire content
7259 ** of the file named X is read and returned as a BLOB. NULL is returned
7260 ** if the file does not exist or is unreadable.
7261 */
readfileFunc(sqlite3_context * context,int argc,sqlite3_value ** argv)7262 static void readfileFunc(
7263 sqlite3_context *context,
7264 int argc,
7265 sqlite3_value **argv
7266 ){
7267 const char *zName;
7268 (void)(argc); /* Unused parameter */
7269 zName = (const char*)sqlite3_value_text(argv[0]);
7270 if( zName==0 ) return;
7271 readFileContents(context, zName);
7272 }
7273
7274 /*
7275 ** Set the error message contained in context ctx to the results of
7276 ** vprintf(zFmt, ...).
7277 */
ctxErrorMsg(sqlite3_context * ctx,const char * zFmt,...)7278 static void ctxErrorMsg(sqlite3_context *ctx, const char *zFmt, ...){
7279 char *zMsg = 0;
7280 va_list ap;
7281 va_start(ap, zFmt);
7282 zMsg = sqlite3_vmprintf(zFmt, ap);
7283 sqlite3_result_error(ctx, zMsg, -1);
7284 sqlite3_free(zMsg);
7285 va_end(ap);
7286 }
7287
7288 #if defined(_WIN32)
7289 /*
7290 ** This function is designed to convert a Win32 FILETIME structure into the
7291 ** number of seconds since the Unix Epoch (1970-01-01 00:00:00 UTC).
7292 */
fileTimeToUnixTime(LPFILETIME pFileTime)7293 static sqlite3_uint64 fileTimeToUnixTime(
7294 LPFILETIME pFileTime
7295 ){
7296 SYSTEMTIME epochSystemTime;
7297 ULARGE_INTEGER epochIntervals;
7298 FILETIME epochFileTime;
7299 ULARGE_INTEGER fileIntervals;
7300
7301 memset(&epochSystemTime, 0, sizeof(SYSTEMTIME));
7302 epochSystemTime.wYear = 1970;
7303 epochSystemTime.wMonth = 1;
7304 epochSystemTime.wDay = 1;
7305 SystemTimeToFileTime(&epochSystemTime, &epochFileTime);
7306 epochIntervals.LowPart = epochFileTime.dwLowDateTime;
7307 epochIntervals.HighPart = epochFileTime.dwHighDateTime;
7308
7309 fileIntervals.LowPart = pFileTime->dwLowDateTime;
7310 fileIntervals.HighPart = pFileTime->dwHighDateTime;
7311
7312 return (fileIntervals.QuadPart - epochIntervals.QuadPart) / 10000000;
7313 }
7314
7315
7316 #if defined(FILEIO_WIN32_DLL) && (defined(_WIN32) || defined(WIN32))
7317 # /* To allow a standalone DLL, use this next replacement function: */
7318 # undef sqlite3_win32_utf8_to_unicode
7319 # define sqlite3_win32_utf8_to_unicode utf8_to_utf16
7320 #
utf8_to_utf16(const char * z)7321 LPWSTR utf8_to_utf16(const char *z){
7322 int nAllot = MultiByteToWideChar(CP_UTF8, 0, z, -1, NULL, 0);
7323 LPWSTR rv = sqlite3_malloc(nAllot * sizeof(WCHAR));
7324 if( rv!=0 && 0 < MultiByteToWideChar(CP_UTF8, 0, z, -1, rv, nAllot) )
7325 return rv;
7326 sqlite3_free(rv);
7327 return 0;
7328 }
7329 #endif
7330
7331 /*
7332 ** This function attempts to normalize the time values found in the stat()
7333 ** buffer to UTC. This is necessary on Win32, where the runtime library
7334 ** appears to return these values as local times.
7335 */
statTimesToUtc(const char * zPath,struct stat * pStatBuf)7336 static void statTimesToUtc(
7337 const char *zPath,
7338 struct stat *pStatBuf
7339 ){
7340 HANDLE hFindFile;
7341 WIN32_FIND_DATAW fd;
7342 LPWSTR zUnicodeName;
7343 extern LPWSTR sqlite3_win32_utf8_to_unicode(const char*);
7344 zUnicodeName = sqlite3_win32_utf8_to_unicode(zPath);
7345 if( zUnicodeName ){
7346 memset(&fd, 0, sizeof(WIN32_FIND_DATAW));
7347 hFindFile = FindFirstFileW(zUnicodeName, &fd);
7348 if( hFindFile!=NULL ){
7349 pStatBuf->st_ctime = (time_t)fileTimeToUnixTime(&fd.ftCreationTime);
7350 pStatBuf->st_atime = (time_t)fileTimeToUnixTime(&fd.ftLastAccessTime);
7351 pStatBuf->st_mtime = (time_t)fileTimeToUnixTime(&fd.ftLastWriteTime);
7352 FindClose(hFindFile);
7353 }
7354 sqlite3_free(zUnicodeName);
7355 }
7356 }
7357 #endif
7358
7359 /*
7360 ** This function is used in place of stat(). On Windows, special handling
7361 ** is required in order for the included time to be returned as UTC. On all
7362 ** other systems, this function simply calls stat().
7363 */
fileStat(const char * zPath,struct stat * pStatBuf)7364 static int fileStat(
7365 const char *zPath,
7366 struct stat *pStatBuf
7367 ){
7368 #if defined(_WIN32)
7369 int rc = stat(zPath, pStatBuf);
7370 if( rc==0 ) statTimesToUtc(zPath, pStatBuf);
7371 return rc;
7372 #else
7373 return stat(zPath, pStatBuf);
7374 #endif
7375 }
7376
7377 /*
7378 ** This function is used in place of lstat(). On Windows, special handling
7379 ** is required in order for the included time to be returned as UTC. On all
7380 ** other systems, this function simply calls lstat().
7381 */
fileLinkStat(const char * zPath,struct stat * pStatBuf)7382 static int fileLinkStat(
7383 const char *zPath,
7384 struct stat *pStatBuf
7385 ){
7386 #if defined(_WIN32)
7387 int rc = lstat(zPath, pStatBuf);
7388 if( rc==0 ) statTimesToUtc(zPath, pStatBuf);
7389 return rc;
7390 #else
7391 return lstat(zPath, pStatBuf);
7392 #endif
7393 }
7394
7395 /*
7396 ** Argument zFile is the name of a file that will be created and/or written
7397 ** by SQL function writefile(). This function ensures that the directory
7398 ** zFile will be written to exists, creating it if required. The permissions
7399 ** for any path components created by this function are set in accordance
7400 ** with the current umask.
7401 **
7402 ** If an OOM condition is encountered, SQLITE_NOMEM is returned. Otherwise,
7403 ** SQLITE_OK is returned if the directory is successfully created, or
7404 ** SQLITE_ERROR otherwise.
7405 */
makeDirectory(const char * zFile)7406 static int makeDirectory(
7407 const char *zFile
7408 ){
7409 char *zCopy = sqlite3_mprintf("%s", zFile);
7410 int rc = SQLITE_OK;
7411
7412 if( zCopy==0 ){
7413 rc = SQLITE_NOMEM;
7414 }else{
7415 int nCopy = (int)strlen(zCopy);
7416 int i = 1;
7417
7418 while( rc==SQLITE_OK ){
7419 struct stat sStat;
7420 int rc2;
7421
7422 for(; zCopy[i]!='/' && i<nCopy; i++);
7423 if( i==nCopy ) break;
7424 zCopy[i] = '\0';
7425
7426 rc2 = fileStat(zCopy, &sStat);
7427 if( rc2!=0 ){
7428 if( mkdir(zCopy, 0777) ) rc = SQLITE_ERROR;
7429 }else{
7430 if( !S_ISDIR(sStat.st_mode) ) rc = SQLITE_ERROR;
7431 }
7432 zCopy[i] = '/';
7433 i++;
7434 }
7435
7436 sqlite3_free(zCopy);
7437 }
7438
7439 return rc;
7440 }
7441
7442 /*
7443 ** This function does the work for the writefile() UDF. Refer to
7444 ** header comments at the top of this file for details.
7445 */
writeFile(sqlite3_context * pCtx,const char * zFile,sqlite3_value * pData,mode_t mode,sqlite3_int64 mtime)7446 static int writeFile(
7447 sqlite3_context *pCtx, /* Context to return bytes written in */
7448 const char *zFile, /* File to write */
7449 sqlite3_value *pData, /* Data to write */
7450 mode_t mode, /* MODE parameter passed to writefile() */
7451 sqlite3_int64 mtime /* MTIME parameter (or -1 to not set time) */
7452 ){
7453 if( zFile==0 ) return 1;
7454 #if !defined(_WIN32) && !defined(WIN32)
7455 if( S_ISLNK(mode) ){
7456 const char *zTo = (const char*)sqlite3_value_text(pData);
7457 if( zTo==0 || symlink(zTo, zFile)<0 ) return 1;
7458 }else
7459 #endif
7460 {
7461 if( S_ISDIR(mode) ){
7462 if( mkdir(zFile, mode) ){
7463 /* The mkdir() call to create the directory failed. This might not
7464 ** be an error though - if there is already a directory at the same
7465 ** path and either the permissions already match or can be changed
7466 ** to do so using chmod(), it is not an error. */
7467 struct stat sStat;
7468 if( errno!=EEXIST
7469 || 0!=fileStat(zFile, &sStat)
7470 || !S_ISDIR(sStat.st_mode)
7471 || ((sStat.st_mode&0777)!=(mode&0777) && 0!=chmod(zFile, mode&0777))
7472 ){
7473 return 1;
7474 }
7475 }
7476 }else{
7477 sqlite3_int64 nWrite = 0;
7478 const char *z;
7479 int rc = 0;
7480 FILE *out = fopen(zFile, "wb");
7481 if( out==0 ) return 1;
7482 z = (const char*)sqlite3_value_blob(pData);
7483 if( z ){
7484 sqlite3_int64 n = fwrite(z, 1, sqlite3_value_bytes(pData), out);
7485 nWrite = sqlite3_value_bytes(pData);
7486 if( nWrite!=n ){
7487 rc = 1;
7488 }
7489 }
7490 fclose(out);
7491 if( rc==0 && mode && chmod(zFile, mode & 0777) ){
7492 rc = 1;
7493 }
7494 if( rc ) return 2;
7495 sqlite3_result_int64(pCtx, nWrite);
7496 }
7497 }
7498
7499 if( mtime>=0 ){
7500 #if defined(_WIN32)
7501 #if !SQLITE_OS_WINRT
7502 /* Windows */
7503 FILETIME lastAccess;
7504 FILETIME lastWrite;
7505 SYSTEMTIME currentTime;
7506 LONGLONG intervals;
7507 HANDLE hFile;
7508 LPWSTR zUnicodeName;
7509 extern LPWSTR sqlite3_win32_utf8_to_unicode(const char*);
7510
7511 GetSystemTime(¤tTime);
7512 SystemTimeToFileTime(¤tTime, &lastAccess);
7513 intervals = Int32x32To64(mtime, 10000000) + 116444736000000000;
7514 lastWrite.dwLowDateTime = (DWORD)intervals;
7515 lastWrite.dwHighDateTime = intervals >> 32;
7516 zUnicodeName = sqlite3_win32_utf8_to_unicode(zFile);
7517 if( zUnicodeName==0 ){
7518 return 1;
7519 }
7520 hFile = CreateFileW(
7521 zUnicodeName, FILE_WRITE_ATTRIBUTES, 0, NULL, OPEN_EXISTING,
7522 FILE_FLAG_BACKUP_SEMANTICS, NULL
7523 );
7524 sqlite3_free(zUnicodeName);
7525 if( hFile!=INVALID_HANDLE_VALUE ){
7526 BOOL bResult = SetFileTime(hFile, NULL, &lastAccess, &lastWrite);
7527 CloseHandle(hFile);
7528 return !bResult;
7529 }else{
7530 return 1;
7531 }
7532 #endif
7533 #elif defined(AT_FDCWD) && 0 /* utimensat() is not universally available */
7534 /* Recent unix */
7535 struct timespec times[2];
7536 times[0].tv_nsec = times[1].tv_nsec = 0;
7537 times[0].tv_sec = time(0);
7538 times[1].tv_sec = mtime;
7539 if( utimensat(AT_FDCWD, zFile, times, AT_SYMLINK_NOFOLLOW) ){
7540 return 1;
7541 }
7542 #else
7543 /* Legacy unix */
7544 struct timeval times[2];
7545 times[0].tv_usec = times[1].tv_usec = 0;
7546 times[0].tv_sec = time(0);
7547 times[1].tv_sec = mtime;
7548 if( utimes(zFile, times) ){
7549 return 1;
7550 }
7551 #endif
7552 }
7553
7554 return 0;
7555 }
7556
7557 /*
7558 ** Implementation of the "writefile(W,X[,Y[,Z]]])" SQL function.
7559 ** Refer to header comments at the top of this file for details.
7560 */
writefileFunc(sqlite3_context * context,int argc,sqlite3_value ** argv)7561 static void writefileFunc(
7562 sqlite3_context *context,
7563 int argc,
7564 sqlite3_value **argv
7565 ){
7566 const char *zFile;
7567 mode_t mode = 0;
7568 int res;
7569 sqlite3_int64 mtime = -1;
7570
7571 if( argc<2 || argc>4 ){
7572 sqlite3_result_error(context,
7573 "wrong number of arguments to function writefile()", -1
7574 );
7575 return;
7576 }
7577
7578 zFile = (const char*)sqlite3_value_text(argv[0]);
7579 if( zFile==0 ) return;
7580 if( argc>=3 ){
7581 mode = (mode_t)sqlite3_value_int(argv[2]);
7582 }
7583 if( argc==4 ){
7584 mtime = sqlite3_value_int64(argv[3]);
7585 }
7586
7587 res = writeFile(context, zFile, argv[1], mode, mtime);
7588 if( res==1 && errno==ENOENT ){
7589 if( makeDirectory(zFile)==SQLITE_OK ){
7590 res = writeFile(context, zFile, argv[1], mode, mtime);
7591 }
7592 }
7593
7594 if( argc>2 && res!=0 ){
7595 if( S_ISLNK(mode) ){
7596 ctxErrorMsg(context, "failed to create symlink: %s", zFile);
7597 }else if( S_ISDIR(mode) ){
7598 ctxErrorMsg(context, "failed to create directory: %s", zFile);
7599 }else{
7600 ctxErrorMsg(context, "failed to write file: %s", zFile);
7601 }
7602 }
7603 }
7604
7605 /*
7606 ** SQL function: lsmode(MODE)
7607 **
7608 ** Given a numberic st_mode from stat(), convert it into a human-readable
7609 ** text string in the style of "ls -l".
7610 */
lsModeFunc(sqlite3_context * context,int argc,sqlite3_value ** argv)7611 static void lsModeFunc(
7612 sqlite3_context *context,
7613 int argc,
7614 sqlite3_value **argv
7615 ){
7616 int i;
7617 int iMode = sqlite3_value_int(argv[0]);
7618 char z[16];
7619 (void)argc;
7620 if( S_ISLNK(iMode) ){
7621 z[0] = 'l';
7622 }else if( S_ISREG(iMode) ){
7623 z[0] = '-';
7624 }else if( S_ISDIR(iMode) ){
7625 z[0] = 'd';
7626 }else{
7627 z[0] = '?';
7628 }
7629 for(i=0; i<3; i++){
7630 int m = (iMode >> ((2-i)*3));
7631 char *a = &z[1 + i*3];
7632 a[0] = (m & 0x4) ? 'r' : '-';
7633 a[1] = (m & 0x2) ? 'w' : '-';
7634 a[2] = (m & 0x1) ? 'x' : '-';
7635 }
7636 z[10] = '\0';
7637 sqlite3_result_text(context, z, -1, SQLITE_TRANSIENT);
7638 }
7639
7640 #ifndef SQLITE_OMIT_VIRTUALTABLE
7641
7642 /*
7643 ** Cursor type for recursively iterating through a directory structure.
7644 */
7645 typedef struct fsdir_cursor fsdir_cursor;
7646 typedef struct FsdirLevel FsdirLevel;
7647
7648 struct FsdirLevel {
7649 DIR *pDir; /* From opendir() */
7650 char *zDir; /* Name of directory (nul-terminated) */
7651 };
7652
7653 struct fsdir_cursor {
7654 sqlite3_vtab_cursor base; /* Base class - must be first */
7655
7656 int nLvl; /* Number of entries in aLvl[] array */
7657 int iLvl; /* Index of current entry */
7658 FsdirLevel *aLvl; /* Hierarchy of directories being traversed */
7659
7660 const char *zBase;
7661 int nBase;
7662
7663 struct stat sStat; /* Current lstat() results */
7664 char *zPath; /* Path to current entry */
7665 sqlite3_int64 iRowid; /* Current rowid */
7666 };
7667
7668 typedef struct fsdir_tab fsdir_tab;
7669 struct fsdir_tab {
7670 sqlite3_vtab base; /* Base class - must be first */
7671 };
7672
7673 /*
7674 ** Construct a new fsdir virtual table object.
7675 */
fsdirConnect(sqlite3 * db,void * pAux,int argc,const char * const * argv,sqlite3_vtab ** ppVtab,char ** pzErr)7676 static int fsdirConnect(
7677 sqlite3 *db,
7678 void *pAux,
7679 int argc, const char *const*argv,
7680 sqlite3_vtab **ppVtab,
7681 char **pzErr
7682 ){
7683 fsdir_tab *pNew = 0;
7684 int rc;
7685 (void)pAux;
7686 (void)argc;
7687 (void)argv;
7688 (void)pzErr;
7689 rc = sqlite3_declare_vtab(db, "CREATE TABLE x" FSDIR_SCHEMA);
7690 if( rc==SQLITE_OK ){
7691 pNew = (fsdir_tab*)sqlite3_malloc( sizeof(*pNew) );
7692 if( pNew==0 ) return SQLITE_NOMEM;
7693 memset(pNew, 0, sizeof(*pNew));
7694 sqlite3_vtab_config(db, SQLITE_VTAB_DIRECTONLY);
7695 }
7696 *ppVtab = (sqlite3_vtab*)pNew;
7697 return rc;
7698 }
7699
7700 /*
7701 ** This method is the destructor for fsdir vtab objects.
7702 */
fsdirDisconnect(sqlite3_vtab * pVtab)7703 static int fsdirDisconnect(sqlite3_vtab *pVtab){
7704 sqlite3_free(pVtab);
7705 return SQLITE_OK;
7706 }
7707
7708 /*
7709 ** Constructor for a new fsdir_cursor object.
7710 */
fsdirOpen(sqlite3_vtab * p,sqlite3_vtab_cursor ** ppCursor)7711 static int fsdirOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){
7712 fsdir_cursor *pCur;
7713 (void)p;
7714 pCur = sqlite3_malloc( sizeof(*pCur) );
7715 if( pCur==0 ) return SQLITE_NOMEM;
7716 memset(pCur, 0, sizeof(*pCur));
7717 pCur->iLvl = -1;
7718 *ppCursor = &pCur->base;
7719 return SQLITE_OK;
7720 }
7721
7722 /*
7723 ** Reset a cursor back to the state it was in when first returned
7724 ** by fsdirOpen().
7725 */
fsdirResetCursor(fsdir_cursor * pCur)7726 static void fsdirResetCursor(fsdir_cursor *pCur){
7727 int i;
7728 for(i=0; i<=pCur->iLvl; i++){
7729 FsdirLevel *pLvl = &pCur->aLvl[i];
7730 if( pLvl->pDir ) closedir(pLvl->pDir);
7731 sqlite3_free(pLvl->zDir);
7732 }
7733 sqlite3_free(pCur->zPath);
7734 sqlite3_free(pCur->aLvl);
7735 pCur->aLvl = 0;
7736 pCur->zPath = 0;
7737 pCur->zBase = 0;
7738 pCur->nBase = 0;
7739 pCur->nLvl = 0;
7740 pCur->iLvl = -1;
7741 pCur->iRowid = 1;
7742 }
7743
7744 /*
7745 ** Destructor for an fsdir_cursor.
7746 */
fsdirClose(sqlite3_vtab_cursor * cur)7747 static int fsdirClose(sqlite3_vtab_cursor *cur){
7748 fsdir_cursor *pCur = (fsdir_cursor*)cur;
7749
7750 fsdirResetCursor(pCur);
7751 sqlite3_free(pCur);
7752 return SQLITE_OK;
7753 }
7754
7755 /*
7756 ** Set the error message for the virtual table associated with cursor
7757 ** pCur to the results of vprintf(zFmt, ...).
7758 */
fsdirSetErrmsg(fsdir_cursor * pCur,const char * zFmt,...)7759 static void fsdirSetErrmsg(fsdir_cursor *pCur, const char *zFmt, ...){
7760 va_list ap;
7761 va_start(ap, zFmt);
7762 pCur->base.pVtab->zErrMsg = sqlite3_vmprintf(zFmt, ap);
7763 va_end(ap);
7764 }
7765
7766
7767 /*
7768 ** Advance an fsdir_cursor to its next row of output.
7769 */
fsdirNext(sqlite3_vtab_cursor * cur)7770 static int fsdirNext(sqlite3_vtab_cursor *cur){
7771 fsdir_cursor *pCur = (fsdir_cursor*)cur;
7772 mode_t m = pCur->sStat.st_mode;
7773
7774 pCur->iRowid++;
7775 if( S_ISDIR(m) ){
7776 /* Descend into this directory */
7777 int iNew = pCur->iLvl + 1;
7778 FsdirLevel *pLvl;
7779 if( iNew>=pCur->nLvl ){
7780 int nNew = iNew+1;
7781 sqlite3_int64 nByte = nNew*sizeof(FsdirLevel);
7782 FsdirLevel *aNew = (FsdirLevel*)sqlite3_realloc64(pCur->aLvl, nByte);
7783 if( aNew==0 ) return SQLITE_NOMEM;
7784 memset(&aNew[pCur->nLvl], 0, sizeof(FsdirLevel)*(nNew-pCur->nLvl));
7785 pCur->aLvl = aNew;
7786 pCur->nLvl = nNew;
7787 }
7788 pCur->iLvl = iNew;
7789 pLvl = &pCur->aLvl[iNew];
7790
7791 pLvl->zDir = pCur->zPath;
7792 pCur->zPath = 0;
7793 pLvl->pDir = opendir(pLvl->zDir);
7794 if( pLvl->pDir==0 ){
7795 fsdirSetErrmsg(pCur, "cannot read directory: %s", pCur->zPath);
7796 return SQLITE_ERROR;
7797 }
7798 }
7799
7800 while( pCur->iLvl>=0 ){
7801 FsdirLevel *pLvl = &pCur->aLvl[pCur->iLvl];
7802 struct dirent *pEntry = readdir(pLvl->pDir);
7803 if( pEntry ){
7804 if( pEntry->d_name[0]=='.' ){
7805 if( pEntry->d_name[1]=='.' && pEntry->d_name[2]=='\0' ) continue;
7806 if( pEntry->d_name[1]=='\0' ) continue;
7807 }
7808 sqlite3_free(pCur->zPath);
7809 pCur->zPath = sqlite3_mprintf("%s/%s", pLvl->zDir, pEntry->d_name);
7810 if( pCur->zPath==0 ) return SQLITE_NOMEM;
7811 if( fileLinkStat(pCur->zPath, &pCur->sStat) ){
7812 fsdirSetErrmsg(pCur, "cannot stat file: %s", pCur->zPath);
7813 return SQLITE_ERROR;
7814 }
7815 return SQLITE_OK;
7816 }
7817 closedir(pLvl->pDir);
7818 sqlite3_free(pLvl->zDir);
7819 pLvl->pDir = 0;
7820 pLvl->zDir = 0;
7821 pCur->iLvl--;
7822 }
7823
7824 /* EOF */
7825 sqlite3_free(pCur->zPath);
7826 pCur->zPath = 0;
7827 return SQLITE_OK;
7828 }
7829
7830 /*
7831 ** Return values of columns for the row at which the series_cursor
7832 ** is currently pointing.
7833 */
fsdirColumn(sqlite3_vtab_cursor * cur,sqlite3_context * ctx,int i)7834 static int fsdirColumn(
7835 sqlite3_vtab_cursor *cur, /* The cursor */
7836 sqlite3_context *ctx, /* First argument to sqlite3_result_...() */
7837 int i /* Which column to return */
7838 ){
7839 fsdir_cursor *pCur = (fsdir_cursor*)cur;
7840 switch( i ){
7841 case FSDIR_COLUMN_NAME: {
7842 sqlite3_result_text(ctx, &pCur->zPath[pCur->nBase], -1, SQLITE_TRANSIENT);
7843 break;
7844 }
7845
7846 case FSDIR_COLUMN_MODE:
7847 sqlite3_result_int64(ctx, pCur->sStat.st_mode);
7848 break;
7849
7850 case FSDIR_COLUMN_MTIME:
7851 sqlite3_result_int64(ctx, pCur->sStat.st_mtime);
7852 break;
7853
7854 case FSDIR_COLUMN_DATA: {
7855 mode_t m = pCur->sStat.st_mode;
7856 if( S_ISDIR(m) ){
7857 sqlite3_result_null(ctx);
7858 #if !defined(_WIN32) && !defined(WIN32)
7859 }else if( S_ISLNK(m) ){
7860 char aStatic[64];
7861 char *aBuf = aStatic;
7862 sqlite3_int64 nBuf = 64;
7863 int n;
7864
7865 while( 1 ){
7866 n = readlink(pCur->zPath, aBuf, nBuf);
7867 if( n<nBuf ) break;
7868 if( aBuf!=aStatic ) sqlite3_free(aBuf);
7869 nBuf = nBuf*2;
7870 aBuf = sqlite3_malloc64(nBuf);
7871 if( aBuf==0 ){
7872 sqlite3_result_error_nomem(ctx);
7873 return SQLITE_NOMEM;
7874 }
7875 }
7876
7877 sqlite3_result_text(ctx, aBuf, n, SQLITE_TRANSIENT);
7878 if( aBuf!=aStatic ) sqlite3_free(aBuf);
7879 #endif
7880 }else{
7881 readFileContents(ctx, pCur->zPath);
7882 }
7883 }
7884 case FSDIR_COLUMN_PATH:
7885 default: {
7886 /* The FSDIR_COLUMN_PATH and FSDIR_COLUMN_DIR are input parameters.
7887 ** always return their values as NULL */
7888 break;
7889 }
7890 }
7891 return SQLITE_OK;
7892 }
7893
7894 /*
7895 ** Return the rowid for the current row. In this implementation, the
7896 ** first row returned is assigned rowid value 1, and each subsequent
7897 ** row a value 1 more than that of the previous.
7898 */
fsdirRowid(sqlite3_vtab_cursor * cur,sqlite_int64 * pRowid)7899 static int fsdirRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
7900 fsdir_cursor *pCur = (fsdir_cursor*)cur;
7901 *pRowid = pCur->iRowid;
7902 return SQLITE_OK;
7903 }
7904
7905 /*
7906 ** Return TRUE if the cursor has been moved off of the last
7907 ** row of output.
7908 */
fsdirEof(sqlite3_vtab_cursor * cur)7909 static int fsdirEof(sqlite3_vtab_cursor *cur){
7910 fsdir_cursor *pCur = (fsdir_cursor*)cur;
7911 return (pCur->zPath==0);
7912 }
7913
7914 /*
7915 ** xFilter callback.
7916 **
7917 ** idxNum==1 PATH parameter only
7918 ** idxNum==2 Both PATH and DIR supplied
7919 */
fsdirFilter(sqlite3_vtab_cursor * cur,int idxNum,const char * idxStr,int argc,sqlite3_value ** argv)7920 static int fsdirFilter(
7921 sqlite3_vtab_cursor *cur,
7922 int idxNum, const char *idxStr,
7923 int argc, sqlite3_value **argv
7924 ){
7925 const char *zDir = 0;
7926 fsdir_cursor *pCur = (fsdir_cursor*)cur;
7927 (void)idxStr;
7928 fsdirResetCursor(pCur);
7929
7930 if( idxNum==0 ){
7931 fsdirSetErrmsg(pCur, "table function fsdir requires an argument");
7932 return SQLITE_ERROR;
7933 }
7934
7935 assert( argc==idxNum && (argc==1 || argc==2) );
7936 zDir = (const char*)sqlite3_value_text(argv[0]);
7937 if( zDir==0 ){
7938 fsdirSetErrmsg(pCur, "table function fsdir requires a non-NULL argument");
7939 return SQLITE_ERROR;
7940 }
7941 if( argc==2 ){
7942 pCur->zBase = (const char*)sqlite3_value_text(argv[1]);
7943 }
7944 if( pCur->zBase ){
7945 pCur->nBase = (int)strlen(pCur->zBase)+1;
7946 pCur->zPath = sqlite3_mprintf("%s/%s", pCur->zBase, zDir);
7947 }else{
7948 pCur->zPath = sqlite3_mprintf("%s", zDir);
7949 }
7950
7951 if( pCur->zPath==0 ){
7952 return SQLITE_NOMEM;
7953 }
7954 if( fileLinkStat(pCur->zPath, &pCur->sStat) ){
7955 fsdirSetErrmsg(pCur, "cannot stat file: %s", pCur->zPath);
7956 return SQLITE_ERROR;
7957 }
7958
7959 return SQLITE_OK;
7960 }
7961
7962 /*
7963 ** SQLite will invoke this method one or more times while planning a query
7964 ** that uses the generate_series virtual table. This routine needs to create
7965 ** a query plan for each invocation and compute an estimated cost for that
7966 ** plan.
7967 **
7968 ** In this implementation idxNum is used to represent the
7969 ** query plan. idxStr is unused.
7970 **
7971 ** The query plan is represented by values of idxNum:
7972 **
7973 ** (1) The path value is supplied by argv[0]
7974 ** (2) Path is in argv[0] and dir is in argv[1]
7975 */
fsdirBestIndex(sqlite3_vtab * tab,sqlite3_index_info * pIdxInfo)7976 static int fsdirBestIndex(
7977 sqlite3_vtab *tab,
7978 sqlite3_index_info *pIdxInfo
7979 ){
7980 int i; /* Loop over constraints */
7981 int idxPath = -1; /* Index in pIdxInfo->aConstraint of PATH= */
7982 int idxDir = -1; /* Index in pIdxInfo->aConstraint of DIR= */
7983 int seenPath = 0; /* True if an unusable PATH= constraint is seen */
7984 int seenDir = 0; /* True if an unusable DIR= constraint is seen */
7985 const struct sqlite3_index_constraint *pConstraint;
7986
7987 (void)tab;
7988 pConstraint = pIdxInfo->aConstraint;
7989 for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){
7990 if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue;
7991 switch( pConstraint->iColumn ){
7992 case FSDIR_COLUMN_PATH: {
7993 if( pConstraint->usable ){
7994 idxPath = i;
7995 seenPath = 0;
7996 }else if( idxPath<0 ){
7997 seenPath = 1;
7998 }
7999 break;
8000 }
8001 case FSDIR_COLUMN_DIR: {
8002 if( pConstraint->usable ){
8003 idxDir = i;
8004 seenDir = 0;
8005 }else if( idxDir<0 ){
8006 seenDir = 1;
8007 }
8008 break;
8009 }
8010 }
8011 }
8012 if( seenPath || seenDir ){
8013 /* If input parameters are unusable, disallow this plan */
8014 return SQLITE_CONSTRAINT;
8015 }
8016
8017 if( idxPath<0 ){
8018 pIdxInfo->idxNum = 0;
8019 /* The pIdxInfo->estimatedCost should have been initialized to a huge
8020 ** number. Leave it unchanged. */
8021 pIdxInfo->estimatedRows = 0x7fffffff;
8022 }else{
8023 pIdxInfo->aConstraintUsage[idxPath].omit = 1;
8024 pIdxInfo->aConstraintUsage[idxPath].argvIndex = 1;
8025 if( idxDir>=0 ){
8026 pIdxInfo->aConstraintUsage[idxDir].omit = 1;
8027 pIdxInfo->aConstraintUsage[idxDir].argvIndex = 2;
8028 pIdxInfo->idxNum = 2;
8029 pIdxInfo->estimatedCost = 10.0;
8030 }else{
8031 pIdxInfo->idxNum = 1;
8032 pIdxInfo->estimatedCost = 100.0;
8033 }
8034 }
8035
8036 return SQLITE_OK;
8037 }
8038
8039 /*
8040 ** Register the "fsdir" virtual table.
8041 */
fsdirRegister(sqlite3 * db)8042 static int fsdirRegister(sqlite3 *db){
8043 static sqlite3_module fsdirModule = {
8044 0, /* iVersion */
8045 0, /* xCreate */
8046 fsdirConnect, /* xConnect */
8047 fsdirBestIndex, /* xBestIndex */
8048 fsdirDisconnect, /* xDisconnect */
8049 0, /* xDestroy */
8050 fsdirOpen, /* xOpen - open a cursor */
8051 fsdirClose, /* xClose - close a cursor */
8052 fsdirFilter, /* xFilter - configure scan constraints */
8053 fsdirNext, /* xNext - advance a cursor */
8054 fsdirEof, /* xEof - check for end of scan */
8055 fsdirColumn, /* xColumn - read data */
8056 fsdirRowid, /* xRowid - read data */
8057 0, /* xUpdate */
8058 0, /* xBegin */
8059 0, /* xSync */
8060 0, /* xCommit */
8061 0, /* xRollback */
8062 0, /* xFindMethod */
8063 0, /* xRename */
8064 0, /* xSavepoint */
8065 0, /* xRelease */
8066 0, /* xRollbackTo */
8067 0, /* xShadowName */
8068 0 /* xIntegrity */
8069 };
8070
8071 int rc = sqlite3_create_module(db, "fsdir", &fsdirModule, 0);
8072 return rc;
8073 }
8074 #else /* SQLITE_OMIT_VIRTUALTABLE */
8075 # define fsdirRegister(x) SQLITE_OK
8076 #endif
8077
8078 #ifdef _WIN32
8079
8080 #endif
sqlite3_fileio_init(sqlite3 * db,char ** pzErrMsg,const sqlite3_api_routines * pApi)8081 static int sqlite3_fileio_init(
8082 sqlite3 *db,
8083 char **pzErrMsg,
8084 const sqlite3_api_routines *pApi
8085 ){
8086 int rc = SQLITE_OK;
8087 SQLITE_EXTENSION_INIT2(pApi);
8088 (void)pzErrMsg; /* Unused parameter */
8089 rc = sqlite3_create_function(db, "readfile", 1,
8090 SQLITE_UTF8|SQLITE_DIRECTONLY, 0,
8091 readfileFunc, 0, 0);
8092 if( rc==SQLITE_OK ){
8093 rc = sqlite3_create_function(db, "writefile", -1,
8094 SQLITE_UTF8|SQLITE_DIRECTONLY, 0,
8095 writefileFunc, 0, 0);
8096 }
8097 if( rc==SQLITE_OK ){
8098 rc = sqlite3_create_function(db, "lsmode", 1, SQLITE_UTF8, 0,
8099 lsModeFunc, 0, 0);
8100 }
8101 if( rc==SQLITE_OK ){
8102 rc = fsdirRegister(db);
8103 }
8104 return rc;
8105 }
8106
8107 #if defined(FILEIO_WIN32_DLL) && (defined(_WIN32) || defined(WIN32))
8108 /* To allow a standalone DLL, make test_windirent.c use the same
8109 * redefined SQLite API calls as the above extension code does.
8110 * Just pull in this .c to accomplish this. As a beneficial side
8111 * effect, this extension becomes a single translation unit. */
8112 # include "test_windirent.c"
8113 #endif
8114
8115 /************************* End ../ext/misc/fileio.c ********************/
8116 /************************* Begin ../ext/misc/completion.c ******************/
8117 /*
8118 ** 2017-07-10
8119 **
8120 ** The author disclaims copyright to this source code. In place of
8121 ** a legal notice, here is a blessing:
8122 **
8123 ** May you do good and not evil.
8124 ** May you find forgiveness for yourself and forgive others.
8125 ** May you share freely, never taking more than you give.
8126 **
8127 *************************************************************************
8128 **
8129 ** This file implements an eponymous virtual table that returns suggested
8130 ** completions for a partial SQL input.
8131 **
8132 ** Suggested usage:
8133 **
8134 ** SELECT DISTINCT candidate COLLATE nocase
8135 ** FROM completion($prefix,$wholeline)
8136 ** ORDER BY 1;
8137 **
8138 ** The two query parameters are optional. $prefix is the text of the
8139 ** current word being typed and that is to be completed. $wholeline is
8140 ** the complete input line, used for context.
8141 **
8142 ** The raw completion() table might return the same candidate multiple
8143 ** times, for example if the same column name is used to two or more
8144 ** tables. And the candidates are returned in an arbitrary order. Hence,
8145 ** the DISTINCT and ORDER BY are recommended.
8146 **
8147 ** This virtual table operates at the speed of human typing, and so there
8148 ** is no attempt to make it fast. Even a slow implementation will be much
8149 ** faster than any human can type.
8150 **
8151 */
8152 /* #include "sqlite3ext.h" */
8153 SQLITE_EXTENSION_INIT1
8154 #include <assert.h>
8155 #include <string.h>
8156 #include <ctype.h>
8157
8158 #ifndef SQLITE_OMIT_VIRTUALTABLE
8159
8160 /* completion_vtab is a subclass of sqlite3_vtab which will
8161 ** serve as the underlying representation of a completion virtual table
8162 */
8163 typedef struct completion_vtab completion_vtab;
8164 struct completion_vtab {
8165 sqlite3_vtab base; /* Base class - must be first */
8166 sqlite3 *db; /* Database connection for this completion vtab */
8167 };
8168
8169 /* completion_cursor is a subclass of sqlite3_vtab_cursor which will
8170 ** serve as the underlying representation of a cursor that scans
8171 ** over rows of the result
8172 */
8173 typedef struct completion_cursor completion_cursor;
8174 struct completion_cursor {
8175 sqlite3_vtab_cursor base; /* Base class - must be first */
8176 sqlite3 *db; /* Database connection for this cursor */
8177 int nPrefix, nLine; /* Number of bytes in zPrefix and zLine */
8178 char *zPrefix; /* The prefix for the word we want to complete */
8179 char *zLine; /* The whole that we want to complete */
8180 const char *zCurrentRow; /* Current output row */
8181 int szRow; /* Length of the zCurrentRow string */
8182 sqlite3_stmt *pStmt; /* Current statement */
8183 sqlite3_int64 iRowid; /* The rowid */
8184 int ePhase; /* Current phase */
8185 int j; /* inter-phase counter */
8186 };
8187
8188 /* Values for ePhase:
8189 */
8190 #define COMPLETION_FIRST_PHASE 1
8191 #define COMPLETION_KEYWORDS 1
8192 #define COMPLETION_PRAGMAS 2
8193 #define COMPLETION_FUNCTIONS 3
8194 #define COMPLETION_COLLATIONS 4
8195 #define COMPLETION_INDEXES 5
8196 #define COMPLETION_TRIGGERS 6
8197 #define COMPLETION_DATABASES 7
8198 #define COMPLETION_TABLES 8 /* Also VIEWs and TRIGGERs */
8199 #define COMPLETION_COLUMNS 9
8200 #define COMPLETION_MODULES 10
8201 #define COMPLETION_EOF 11
8202
8203 /*
8204 ** The completionConnect() method is invoked to create a new
8205 ** completion_vtab that describes the completion virtual table.
8206 **
8207 ** Think of this routine as the constructor for completion_vtab objects.
8208 **
8209 ** All this routine needs to do is:
8210 **
8211 ** (1) Allocate the completion_vtab object and initialize all fields.
8212 **
8213 ** (2) Tell SQLite (via the sqlite3_declare_vtab() interface) what the
8214 ** result set of queries against completion will look like.
8215 */
completionConnect(sqlite3 * db,void * pAux,int argc,const char * const * argv,sqlite3_vtab ** ppVtab,char ** pzErr)8216 static int completionConnect(
8217 sqlite3 *db,
8218 void *pAux,
8219 int argc, const char *const*argv,
8220 sqlite3_vtab **ppVtab,
8221 char **pzErr
8222 ){
8223 completion_vtab *pNew;
8224 int rc;
8225
8226 (void)(pAux); /* Unused parameter */
8227 (void)(argc); /* Unused parameter */
8228 (void)(argv); /* Unused parameter */
8229 (void)(pzErr); /* Unused parameter */
8230
8231 /* Column numbers */
8232 #define COMPLETION_COLUMN_CANDIDATE 0 /* Suggested completion of the input */
8233 #define COMPLETION_COLUMN_PREFIX 1 /* Prefix of the word to be completed */
8234 #define COMPLETION_COLUMN_WHOLELINE 2 /* Entire line seen so far */
8235 #define COMPLETION_COLUMN_PHASE 3 /* ePhase - used for debugging only */
8236
8237 sqlite3_vtab_config(db, SQLITE_VTAB_INNOCUOUS);
8238 rc = sqlite3_declare_vtab(db,
8239 "CREATE TABLE x("
8240 " candidate TEXT,"
8241 " prefix TEXT HIDDEN,"
8242 " wholeline TEXT HIDDEN,"
8243 " phase INT HIDDEN" /* Used for debugging only */
8244 ")");
8245 if( rc==SQLITE_OK ){
8246 pNew = sqlite3_malloc( sizeof(*pNew) );
8247 *ppVtab = (sqlite3_vtab*)pNew;
8248 if( pNew==0 ) return SQLITE_NOMEM;
8249 memset(pNew, 0, sizeof(*pNew));
8250 pNew->db = db;
8251 }
8252 return rc;
8253 }
8254
8255 /*
8256 ** This method is the destructor for completion_cursor objects.
8257 */
completionDisconnect(sqlite3_vtab * pVtab)8258 static int completionDisconnect(sqlite3_vtab *pVtab){
8259 sqlite3_free(pVtab);
8260 return SQLITE_OK;
8261 }
8262
8263 /*
8264 ** Constructor for a new completion_cursor object.
8265 */
completionOpen(sqlite3_vtab * p,sqlite3_vtab_cursor ** ppCursor)8266 static int completionOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){
8267 completion_cursor *pCur;
8268 pCur = sqlite3_malloc( sizeof(*pCur) );
8269 if( pCur==0 ) return SQLITE_NOMEM;
8270 memset(pCur, 0, sizeof(*pCur));
8271 pCur->db = ((completion_vtab*)p)->db;
8272 *ppCursor = &pCur->base;
8273 return SQLITE_OK;
8274 }
8275
8276 /*
8277 ** Reset the completion_cursor.
8278 */
completionCursorReset(completion_cursor * pCur)8279 static void completionCursorReset(completion_cursor *pCur){
8280 sqlite3_free(pCur->zPrefix); pCur->zPrefix = 0; pCur->nPrefix = 0;
8281 sqlite3_free(pCur->zLine); pCur->zLine = 0; pCur->nLine = 0;
8282 sqlite3_finalize(pCur->pStmt); pCur->pStmt = 0;
8283 pCur->j = 0;
8284 }
8285
8286 /*
8287 ** Destructor for a completion_cursor.
8288 */
completionClose(sqlite3_vtab_cursor * cur)8289 static int completionClose(sqlite3_vtab_cursor *cur){
8290 completionCursorReset((completion_cursor*)cur);
8291 sqlite3_free(cur);
8292 return SQLITE_OK;
8293 }
8294
8295 /*
8296 ** Advance a completion_cursor to its next row of output.
8297 **
8298 ** The ->ePhase, ->j, and ->pStmt fields of the completion_cursor object
8299 ** record the current state of the scan. This routine sets ->zCurrentRow
8300 ** to the current row of output and then returns. If no more rows remain,
8301 ** then ->ePhase is set to COMPLETION_EOF which will signal the virtual
8302 ** table that has reached the end of its scan.
8303 **
8304 ** The current implementation just lists potential identifiers and
8305 ** keywords and filters them by zPrefix. Future enhancements should
8306 ** take zLine into account to try to restrict the set of identifiers and
8307 ** keywords based on what would be legal at the current point of input.
8308 */
completionNext(sqlite3_vtab_cursor * cur)8309 static int completionNext(sqlite3_vtab_cursor *cur){
8310 completion_cursor *pCur = (completion_cursor*)cur;
8311 int eNextPhase = 0; /* Next phase to try if current phase reaches end */
8312 int iCol = -1; /* If >=0, step pCur->pStmt and use the i-th column */
8313 pCur->iRowid++;
8314 while( pCur->ePhase!=COMPLETION_EOF ){
8315 switch( pCur->ePhase ){
8316 case COMPLETION_KEYWORDS: {
8317 if( pCur->j >= sqlite3_keyword_count() ){
8318 pCur->zCurrentRow = 0;
8319 pCur->ePhase = COMPLETION_DATABASES;
8320 }else{
8321 sqlite3_keyword_name(pCur->j++, &pCur->zCurrentRow, &pCur->szRow);
8322 }
8323 iCol = -1;
8324 break;
8325 }
8326 case COMPLETION_DATABASES: {
8327 if( pCur->pStmt==0 ){
8328 sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1,
8329 &pCur->pStmt, 0);
8330 }
8331 iCol = 1;
8332 eNextPhase = COMPLETION_TABLES;
8333 break;
8334 }
8335 case COMPLETION_TABLES: {
8336 if( pCur->pStmt==0 ){
8337 sqlite3_stmt *pS2;
8338 char *zSql = 0;
8339 const char *zSep = "";
8340 sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1, &pS2, 0);
8341 while( sqlite3_step(pS2)==SQLITE_ROW ){
8342 const char *zDb = (const char*)sqlite3_column_text(pS2, 1);
8343 zSql = sqlite3_mprintf(
8344 "%z%s"
8345 "SELECT name FROM \"%w\".sqlite_schema",
8346 zSql, zSep, zDb
8347 );
8348 if( zSql==0 ) return SQLITE_NOMEM;
8349 zSep = " UNION ";
8350 }
8351 sqlite3_finalize(pS2);
8352 sqlite3_prepare_v2(pCur->db, zSql, -1, &pCur->pStmt, 0);
8353 sqlite3_free(zSql);
8354 }
8355 iCol = 0;
8356 eNextPhase = COMPLETION_COLUMNS;
8357 break;
8358 }
8359 case COMPLETION_COLUMNS: {
8360 if( pCur->pStmt==0 ){
8361 sqlite3_stmt *pS2;
8362 char *zSql = 0;
8363 const char *zSep = "";
8364 sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1, &pS2, 0);
8365 while( sqlite3_step(pS2)==SQLITE_ROW ){
8366 const char *zDb = (const char*)sqlite3_column_text(pS2, 1);
8367 zSql = sqlite3_mprintf(
8368 "%z%s"
8369 "SELECT pti.name FROM \"%w\".sqlite_schema AS sm"
8370 " JOIN pragma_table_info(sm.name,%Q) AS pti"
8371 " WHERE sm.type='table'",
8372 zSql, zSep, zDb, zDb
8373 );
8374 if( zSql==0 ) return SQLITE_NOMEM;
8375 zSep = " UNION ";
8376 }
8377 sqlite3_finalize(pS2);
8378 sqlite3_prepare_v2(pCur->db, zSql, -1, &pCur->pStmt, 0);
8379 sqlite3_free(zSql);
8380 }
8381 iCol = 0;
8382 eNextPhase = COMPLETION_EOF;
8383 break;
8384 }
8385 }
8386 if( iCol<0 ){
8387 /* This case is when the phase presets zCurrentRow */
8388 if( pCur->zCurrentRow==0 ) continue;
8389 }else{
8390 if( sqlite3_step(pCur->pStmt)==SQLITE_ROW ){
8391 /* Extract the next row of content */
8392 pCur->zCurrentRow = (const char*)sqlite3_column_text(pCur->pStmt, iCol);
8393 pCur->szRow = sqlite3_column_bytes(pCur->pStmt, iCol);
8394 }else{
8395 /* When all rows are finished, advance to the next phase */
8396 sqlite3_finalize(pCur->pStmt);
8397 pCur->pStmt = 0;
8398 pCur->ePhase = eNextPhase;
8399 continue;
8400 }
8401 }
8402 if( pCur->nPrefix==0 ) break;
8403 if( pCur->nPrefix<=pCur->szRow
8404 && sqlite3_strnicmp(pCur->zPrefix, pCur->zCurrentRow, pCur->nPrefix)==0
8405 ){
8406 break;
8407 }
8408 }
8409
8410 return SQLITE_OK;
8411 }
8412
8413 /*
8414 ** Return values of columns for the row at which the completion_cursor
8415 ** is currently pointing.
8416 */
completionColumn(sqlite3_vtab_cursor * cur,sqlite3_context * ctx,int i)8417 static int completionColumn(
8418 sqlite3_vtab_cursor *cur, /* The cursor */
8419 sqlite3_context *ctx, /* First argument to sqlite3_result_...() */
8420 int i /* Which column to return */
8421 ){
8422 completion_cursor *pCur = (completion_cursor*)cur;
8423 switch( i ){
8424 case COMPLETION_COLUMN_CANDIDATE: {
8425 sqlite3_result_text(ctx, pCur->zCurrentRow, pCur->szRow,SQLITE_TRANSIENT);
8426 break;
8427 }
8428 case COMPLETION_COLUMN_PREFIX: {
8429 sqlite3_result_text(ctx, pCur->zPrefix, -1, SQLITE_TRANSIENT);
8430 break;
8431 }
8432 case COMPLETION_COLUMN_WHOLELINE: {
8433 sqlite3_result_text(ctx, pCur->zLine, -1, SQLITE_TRANSIENT);
8434 break;
8435 }
8436 case COMPLETION_COLUMN_PHASE: {
8437 sqlite3_result_int(ctx, pCur->ePhase);
8438 break;
8439 }
8440 }
8441 return SQLITE_OK;
8442 }
8443
8444 /*
8445 ** Return the rowid for the current row. In this implementation, the
8446 ** rowid is the same as the output value.
8447 */
completionRowid(sqlite3_vtab_cursor * cur,sqlite_int64 * pRowid)8448 static int completionRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
8449 completion_cursor *pCur = (completion_cursor*)cur;
8450 *pRowid = pCur->iRowid;
8451 return SQLITE_OK;
8452 }
8453
8454 /*
8455 ** Return TRUE if the cursor has been moved off of the last
8456 ** row of output.
8457 */
completionEof(sqlite3_vtab_cursor * cur)8458 static int completionEof(sqlite3_vtab_cursor *cur){
8459 completion_cursor *pCur = (completion_cursor*)cur;
8460 return pCur->ePhase >= COMPLETION_EOF;
8461 }
8462
8463 /*
8464 ** This method is called to "rewind" the completion_cursor object back
8465 ** to the first row of output. This method is always called at least
8466 ** once prior to any call to completionColumn() or completionRowid() or
8467 ** completionEof().
8468 */
completionFilter(sqlite3_vtab_cursor * pVtabCursor,int idxNum,const char * idxStr,int argc,sqlite3_value ** argv)8469 static int completionFilter(
8470 sqlite3_vtab_cursor *pVtabCursor,
8471 int idxNum, const char *idxStr,
8472 int argc, sqlite3_value **argv
8473 ){
8474 completion_cursor *pCur = (completion_cursor *)pVtabCursor;
8475 int iArg = 0;
8476 (void)(idxStr); /* Unused parameter */
8477 (void)(argc); /* Unused parameter */
8478 completionCursorReset(pCur);
8479 if( idxNum & 1 ){
8480 pCur->nPrefix = sqlite3_value_bytes(argv[iArg]);
8481 if( pCur->nPrefix>0 ){
8482 pCur->zPrefix = sqlite3_mprintf("%s", sqlite3_value_text(argv[iArg]));
8483 if( pCur->zPrefix==0 ) return SQLITE_NOMEM;
8484 }
8485 iArg = 1;
8486 }
8487 if( idxNum & 2 ){
8488 pCur->nLine = sqlite3_value_bytes(argv[iArg]);
8489 if( pCur->nLine>0 ){
8490 pCur->zLine = sqlite3_mprintf("%s", sqlite3_value_text(argv[iArg]));
8491 if( pCur->zLine==0 ) return SQLITE_NOMEM;
8492 }
8493 }
8494 if( pCur->zLine!=0 && pCur->zPrefix==0 ){
8495 int i = pCur->nLine;
8496 while( i>0 && (isalnum((unsigned char)pCur->zLine[i-1]) || pCur->zLine[i-1]=='_') ){
8497 i--;
8498 }
8499 pCur->nPrefix = pCur->nLine - i;
8500 if( pCur->nPrefix>0 ){
8501 pCur->zPrefix = sqlite3_mprintf("%.*s", pCur->nPrefix, pCur->zLine + i);
8502 if( pCur->zPrefix==0 ) return SQLITE_NOMEM;
8503 }
8504 }
8505 pCur->iRowid = 0;
8506 pCur->ePhase = COMPLETION_FIRST_PHASE;
8507 return completionNext(pVtabCursor);
8508 }
8509
8510 /*
8511 ** SQLite will invoke this method one or more times while planning a query
8512 ** that uses the completion virtual table. This routine needs to create
8513 ** a query plan for each invocation and compute an estimated cost for that
8514 ** plan.
8515 **
8516 ** There are two hidden parameters that act as arguments to the table-valued
8517 ** function: "prefix" and "wholeline". Bit 0 of idxNum is set if "prefix"
8518 ** is available and bit 1 is set if "wholeline" is available.
8519 */
completionBestIndex(sqlite3_vtab * tab,sqlite3_index_info * pIdxInfo)8520 static int completionBestIndex(
8521 sqlite3_vtab *tab,
8522 sqlite3_index_info *pIdxInfo
8523 ){
8524 int i; /* Loop over constraints */
8525 int idxNum = 0; /* The query plan bitmask */
8526 int prefixIdx = -1; /* Index of the start= constraint, or -1 if none */
8527 int wholelineIdx = -1; /* Index of the stop= constraint, or -1 if none */
8528 int nArg = 0; /* Number of arguments that completeFilter() expects */
8529 const struct sqlite3_index_constraint *pConstraint;
8530
8531 (void)(tab); /* Unused parameter */
8532 pConstraint = pIdxInfo->aConstraint;
8533 for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){
8534 if( pConstraint->usable==0 ) continue;
8535 if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue;
8536 switch( pConstraint->iColumn ){
8537 case COMPLETION_COLUMN_PREFIX:
8538 prefixIdx = i;
8539 idxNum |= 1;
8540 break;
8541 case COMPLETION_COLUMN_WHOLELINE:
8542 wholelineIdx = i;
8543 idxNum |= 2;
8544 break;
8545 }
8546 }
8547 if( prefixIdx>=0 ){
8548 pIdxInfo->aConstraintUsage[prefixIdx].argvIndex = ++nArg;
8549 pIdxInfo->aConstraintUsage[prefixIdx].omit = 1;
8550 }
8551 if( wholelineIdx>=0 ){
8552 pIdxInfo->aConstraintUsage[wholelineIdx].argvIndex = ++nArg;
8553 pIdxInfo->aConstraintUsage[wholelineIdx].omit = 1;
8554 }
8555 pIdxInfo->idxNum = idxNum;
8556 pIdxInfo->estimatedCost = (double)5000 - 1000*nArg;
8557 pIdxInfo->estimatedRows = 500 - 100*nArg;
8558 return SQLITE_OK;
8559 }
8560
8561 /*
8562 ** This following structure defines all the methods for the
8563 ** completion virtual table.
8564 */
8565 static sqlite3_module completionModule = {
8566 0, /* iVersion */
8567 0, /* xCreate */
8568 completionConnect, /* xConnect */
8569 completionBestIndex, /* xBestIndex */
8570 completionDisconnect, /* xDisconnect */
8571 0, /* xDestroy */
8572 completionOpen, /* xOpen - open a cursor */
8573 completionClose, /* xClose - close a cursor */
8574 completionFilter, /* xFilter - configure scan constraints */
8575 completionNext, /* xNext - advance a cursor */
8576 completionEof, /* xEof - check for end of scan */
8577 completionColumn, /* xColumn - read data */
8578 completionRowid, /* xRowid - read data */
8579 0, /* xUpdate */
8580 0, /* xBegin */
8581 0, /* xSync */
8582 0, /* xCommit */
8583 0, /* xRollback */
8584 0, /* xFindMethod */
8585 0, /* xRename */
8586 0, /* xSavepoint */
8587 0, /* xRelease */
8588 0, /* xRollbackTo */
8589 0, /* xShadowName */
8590 0 /* xIntegrity */
8591 };
8592
8593 #endif /* SQLITE_OMIT_VIRTUALTABLE */
8594
sqlite3CompletionVtabInit(sqlite3 * db)8595 static int sqlite3CompletionVtabInit(sqlite3 *db){
8596 int rc = SQLITE_OK;
8597 #ifndef SQLITE_OMIT_VIRTUALTABLE
8598 rc = sqlite3_create_module(db, "completion", &completionModule, 0);
8599 #endif
8600 return rc;
8601 }
8602
8603 #ifdef _WIN32
8604
8605 #endif
sqlite3_completion_init(sqlite3 * db,char ** pzErrMsg,const sqlite3_api_routines * pApi)8606 static int sqlite3_completion_init(
8607 sqlite3 *db,
8608 char **pzErrMsg,
8609 const sqlite3_api_routines *pApi
8610 ){
8611 int rc = SQLITE_OK;
8612 SQLITE_EXTENSION_INIT2(pApi);
8613 (void)(pzErrMsg); /* Unused parameter */
8614 #ifndef SQLITE_OMIT_VIRTUALTABLE
8615 rc = sqlite3CompletionVtabInit(db);
8616 #endif
8617 return rc;
8618 }
8619
8620 /************************* End ../ext/misc/completion.c ********************/
8621 /************************* Begin ../ext/misc/appendvfs.c ******************/
8622 /*
8623 ** 2017-10-20
8624 **
8625 ** The author disclaims copyright to this source code. In place of
8626 ** a legal notice, here is a blessing:
8627 **
8628 ** May you do good and not evil.
8629 ** May you find forgiveness for yourself and forgive others.
8630 ** May you share freely, never taking more than you give.
8631 **
8632 ******************************************************************************
8633 **
8634 ** This file implements a VFS shim that allows an SQLite database to be
8635 ** appended onto the end of some other file, such as an executable.
8636 **
8637 ** A special record must appear at the end of the file that identifies the
8638 ** file as an appended database and provides the offset to the first page
8639 ** of the exposed content. (Or, it is the length of the content prefix.)
8640 ** For best performance page 1 should be located at a disk page boundary,
8641 ** though that is not required.
8642 **
8643 ** When opening a database using this VFS, the connection might treat
8644 ** the file as an ordinary SQLite database, or it might treat it as a
8645 ** database appended onto some other file. The decision is made by
8646 ** applying the following rules in order:
8647 **
8648 ** (1) An empty file is an ordinary database.
8649 **
8650 ** (2) If the file ends with the appendvfs trailer string
8651 ** "Start-Of-SQLite3-NNNNNNNN" that file is an appended database.
8652 **
8653 ** (3) If the file begins with the standard SQLite prefix string
8654 ** "SQLite format 3", that file is an ordinary database.
8655 **
8656 ** (4) If none of the above apply and the SQLITE_OPEN_CREATE flag is
8657 ** set, then a new database is appended to the already existing file.
8658 **
8659 ** (5) Otherwise, SQLITE_CANTOPEN is returned.
8660 **
8661 ** To avoid unnecessary complications with the PENDING_BYTE, the size of
8662 ** the file containing the database is limited to 1GiB. (1073741824 bytes)
8663 ** This VFS will not read or write past the 1GiB mark. This restriction
8664 ** might be lifted in future versions. For now, if you need a larger
8665 ** database, then keep it in a separate file.
8666 **
8667 ** If the file being opened is a plain database (not an appended one), then
8668 ** this shim is a pass-through into the default underlying VFS. (rule 3)
8669 **/
8670 /* #include "sqlite3ext.h" */
8671 SQLITE_EXTENSION_INIT1
8672 #include <string.h>
8673 #include <assert.h>
8674
8675 /* The append mark at the end of the database is:
8676 **
8677 ** Start-Of-SQLite3-NNNNNNNN
8678 ** 123456789 123456789 12345
8679 **
8680 ** The NNNNNNNN represents a 64-bit big-endian unsigned integer which is
8681 ** the offset to page 1, and also the length of the prefix content.
8682 */
8683 #define APND_MARK_PREFIX "Start-Of-SQLite3-"
8684 #define APND_MARK_PREFIX_SZ 17
8685 #define APND_MARK_FOS_SZ 8
8686 #define APND_MARK_SIZE (APND_MARK_PREFIX_SZ+APND_MARK_FOS_SZ)
8687
8688 /*
8689 ** Maximum size of the combined prefix + database + append-mark. This
8690 ** must be less than 0x40000000 to avoid locking issues on Windows.
8691 */
8692 #define APND_MAX_SIZE (0x40000000)
8693
8694 /*
8695 ** Try to align the database to an even multiple of APND_ROUNDUP bytes.
8696 */
8697 #ifndef APND_ROUNDUP
8698 #define APND_ROUNDUP 4096
8699 #endif
8700 #define APND_ALIGN_MASK ((sqlite3_int64)(APND_ROUNDUP-1))
8701 #define APND_START_ROUNDUP(fsz) (((fsz)+APND_ALIGN_MASK) & ~APND_ALIGN_MASK)
8702
8703 /*
8704 ** Forward declaration of objects used by this utility
8705 */
8706 typedef struct sqlite3_vfs ApndVfs;
8707 typedef struct ApndFile ApndFile;
8708
8709 /* Access to a lower-level VFS that (might) implement dynamic loading,
8710 ** access to randomness, etc.
8711 */
8712 #define ORIGVFS(p) ((sqlite3_vfs*)((p)->pAppData))
8713 #define ORIGFILE(p) ((sqlite3_file*)(((ApndFile*)(p))+1))
8714
8715 /* An open appendvfs file
8716 **
8717 ** An instance of this structure describes the appended database file.
8718 ** A separate sqlite3_file object is always appended. The appended
8719 ** sqlite3_file object (which can be accessed using ORIGFILE()) describes
8720 ** the entire file, including the prefix, the database, and the
8721 ** append-mark.
8722 **
8723 ** The structure of an AppendVFS database is like this:
8724 **
8725 ** +-------------+---------+----------+-------------+
8726 ** | prefix-file | padding | database | append-mark |
8727 ** +-------------+---------+----------+-------------+
8728 ** ^ ^
8729 ** | |
8730 ** iPgOne iMark
8731 **
8732 **
8733 ** "prefix file" - file onto which the database has been appended.
8734 ** "padding" - zero or more bytes inserted so that "database"
8735 ** starts on an APND_ROUNDUP boundary
8736 ** "database" - The SQLite database file
8737 ** "append-mark" - The 25-byte "Start-Of-SQLite3-NNNNNNNN" that indicates
8738 ** the offset from the start of prefix-file to the start
8739 ** of "database".
8740 **
8741 ** The size of the database is iMark - iPgOne.
8742 **
8743 ** The NNNNNNNN in the "Start-Of-SQLite3-NNNNNNNN" suffix is the value
8744 ** of iPgOne stored as a big-ending 64-bit integer.
8745 **
8746 ** iMark will be the size of the underlying file minus 25 (APND_MARKSIZE).
8747 ** Or, iMark is -1 to indicate that it has not yet been written.
8748 */
8749 struct ApndFile {
8750 sqlite3_file base; /* Subclass. MUST BE FIRST! */
8751 sqlite3_int64 iPgOne; /* Offset to the start of the database */
8752 sqlite3_int64 iMark; /* Offset of the append mark. -1 if unwritten */
8753 /* Always followed by another sqlite3_file that describes the whole file */
8754 };
8755
8756 /*
8757 ** Methods for ApndFile
8758 */
8759 static int apndClose(sqlite3_file*);
8760 static int apndRead(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst);
8761 static int apndWrite(sqlite3_file*,const void*,int iAmt, sqlite3_int64 iOfst);
8762 static int apndTruncate(sqlite3_file*, sqlite3_int64 size);
8763 static int apndSync(sqlite3_file*, int flags);
8764 static int apndFileSize(sqlite3_file*, sqlite3_int64 *pSize);
8765 static int apndLock(sqlite3_file*, int);
8766 static int apndUnlock(sqlite3_file*, int);
8767 static int apndCheckReservedLock(sqlite3_file*, int *pResOut);
8768 static int apndFileControl(sqlite3_file*, int op, void *pArg);
8769 static int apndSectorSize(sqlite3_file*);
8770 static int apndDeviceCharacteristics(sqlite3_file*);
8771 static int apndShmMap(sqlite3_file*, int iPg, int pgsz, int, void volatile**);
8772 static int apndShmLock(sqlite3_file*, int offset, int n, int flags);
8773 static void apndShmBarrier(sqlite3_file*);
8774 static int apndShmUnmap(sqlite3_file*, int deleteFlag);
8775 static int apndFetch(sqlite3_file*, sqlite3_int64 iOfst, int iAmt, void **pp);
8776 static int apndUnfetch(sqlite3_file*, sqlite3_int64 iOfst, void *p);
8777
8778 /*
8779 ** Methods for ApndVfs
8780 */
8781 static int apndOpen(sqlite3_vfs*, const char *, sqlite3_file*, int , int *);
8782 static int apndDelete(sqlite3_vfs*, const char *zName, int syncDir);
8783 static int apndAccess(sqlite3_vfs*, const char *zName, int flags, int *);
8784 static int apndFullPathname(sqlite3_vfs*, const char *zName, int, char *zOut);
8785 static void *apndDlOpen(sqlite3_vfs*, const char *zFilename);
8786 static void apndDlError(sqlite3_vfs*, int nByte, char *zErrMsg);
8787 static void (*apndDlSym(sqlite3_vfs *pVfs, void *p, const char*zSym))(void);
8788 static void apndDlClose(sqlite3_vfs*, void*);
8789 static int apndRandomness(sqlite3_vfs*, int nByte, char *zOut);
8790 static int apndSleep(sqlite3_vfs*, int microseconds);
8791 static int apndCurrentTime(sqlite3_vfs*, double*);
8792 static int apndGetLastError(sqlite3_vfs*, int, char *);
8793 static int apndCurrentTimeInt64(sqlite3_vfs*, sqlite3_int64*);
8794 static int apndSetSystemCall(sqlite3_vfs*, const char*,sqlite3_syscall_ptr);
8795 static sqlite3_syscall_ptr apndGetSystemCall(sqlite3_vfs*, const char *z);
8796 static const char *apndNextSystemCall(sqlite3_vfs*, const char *zName);
8797
8798 static sqlite3_vfs apnd_vfs = {
8799 3, /* iVersion (set when registered) */
8800 0, /* szOsFile (set when registered) */
8801 1024, /* mxPathname */
8802 0, /* pNext */
8803 "apndvfs", /* zName */
8804 0, /* pAppData (set when registered) */
8805 apndOpen, /* xOpen */
8806 apndDelete, /* xDelete */
8807 apndAccess, /* xAccess */
8808 apndFullPathname, /* xFullPathname */
8809 apndDlOpen, /* xDlOpen */
8810 apndDlError, /* xDlError */
8811 apndDlSym, /* xDlSym */
8812 apndDlClose, /* xDlClose */
8813 apndRandomness, /* xRandomness */
8814 apndSleep, /* xSleep */
8815 apndCurrentTime, /* xCurrentTime */
8816 apndGetLastError, /* xGetLastError */
8817 apndCurrentTimeInt64, /* xCurrentTimeInt64 */
8818 apndSetSystemCall, /* xSetSystemCall */
8819 apndGetSystemCall, /* xGetSystemCall */
8820 apndNextSystemCall /* xNextSystemCall */
8821 };
8822
8823 static const sqlite3_io_methods apnd_io_methods = {
8824 3, /* iVersion */
8825 apndClose, /* xClose */
8826 apndRead, /* xRead */
8827 apndWrite, /* xWrite */
8828 apndTruncate, /* xTruncate */
8829 apndSync, /* xSync */
8830 apndFileSize, /* xFileSize */
8831 apndLock, /* xLock */
8832 apndUnlock, /* xUnlock */
8833 apndCheckReservedLock, /* xCheckReservedLock */
8834 apndFileControl, /* xFileControl */
8835 apndSectorSize, /* xSectorSize */
8836 apndDeviceCharacteristics, /* xDeviceCharacteristics */
8837 apndShmMap, /* xShmMap */
8838 apndShmLock, /* xShmLock */
8839 apndShmBarrier, /* xShmBarrier */
8840 apndShmUnmap, /* xShmUnmap */
8841 apndFetch, /* xFetch */
8842 apndUnfetch /* xUnfetch */
8843 };
8844
8845 /*
8846 ** Close an apnd-file.
8847 */
apndClose(sqlite3_file * pFile)8848 static int apndClose(sqlite3_file *pFile){
8849 pFile = ORIGFILE(pFile);
8850 return pFile->pMethods->xClose(pFile);
8851 }
8852
8853 /*
8854 ** Read data from an apnd-file.
8855 */
apndRead(sqlite3_file * pFile,void * zBuf,int iAmt,sqlite_int64 iOfst)8856 static int apndRead(
8857 sqlite3_file *pFile,
8858 void *zBuf,
8859 int iAmt,
8860 sqlite_int64 iOfst
8861 ){
8862 ApndFile *paf = (ApndFile *)pFile;
8863 pFile = ORIGFILE(pFile);
8864 return pFile->pMethods->xRead(pFile, zBuf, iAmt, paf->iPgOne+iOfst);
8865 }
8866
8867 /*
8868 ** Add the append-mark onto what should become the end of the file.
8869 * If and only if this succeeds, internal ApndFile.iMark is updated.
8870 * Parameter iWriteEnd is the appendvfs-relative offset of the new mark.
8871 */
apndWriteMark(ApndFile * paf,sqlite3_file * pFile,sqlite_int64 iWriteEnd)8872 static int apndWriteMark(
8873 ApndFile *paf,
8874 sqlite3_file *pFile,
8875 sqlite_int64 iWriteEnd
8876 ){
8877 sqlite_int64 iPgOne = paf->iPgOne;
8878 unsigned char a[APND_MARK_SIZE];
8879 int i = APND_MARK_FOS_SZ;
8880 int rc;
8881 assert(pFile == ORIGFILE(paf));
8882 memcpy(a, APND_MARK_PREFIX, APND_MARK_PREFIX_SZ);
8883 while( --i >= 0 ){
8884 a[APND_MARK_PREFIX_SZ+i] = (unsigned char)(iPgOne & 0xff);
8885 iPgOne >>= 8;
8886 }
8887 iWriteEnd += paf->iPgOne;
8888 if( SQLITE_OK==(rc = pFile->pMethods->xWrite
8889 (pFile, a, APND_MARK_SIZE, iWriteEnd)) ){
8890 paf->iMark = iWriteEnd;
8891 }
8892 return rc;
8893 }
8894
8895 /*
8896 ** Write data to an apnd-file.
8897 */
apndWrite(sqlite3_file * pFile,const void * zBuf,int iAmt,sqlite_int64 iOfst)8898 static int apndWrite(
8899 sqlite3_file *pFile,
8900 const void *zBuf,
8901 int iAmt,
8902 sqlite_int64 iOfst
8903 ){
8904 ApndFile *paf = (ApndFile *)pFile;
8905 sqlite_int64 iWriteEnd = iOfst + iAmt;
8906 if( iWriteEnd>=APND_MAX_SIZE ) return SQLITE_FULL;
8907 pFile = ORIGFILE(pFile);
8908 /* If append-mark is absent or will be overwritten, write it. */
8909 if( paf->iMark < 0 || paf->iPgOne + iWriteEnd > paf->iMark ){
8910 int rc = apndWriteMark(paf, pFile, iWriteEnd);
8911 if( SQLITE_OK!=rc ) return rc;
8912 }
8913 return pFile->pMethods->xWrite(pFile, zBuf, iAmt, paf->iPgOne+iOfst);
8914 }
8915
8916 /*
8917 ** Truncate an apnd-file.
8918 */
apndTruncate(sqlite3_file * pFile,sqlite_int64 size)8919 static int apndTruncate(sqlite3_file *pFile, sqlite_int64 size){
8920 ApndFile *paf = (ApndFile *)pFile;
8921 pFile = ORIGFILE(pFile);
8922 /* The append mark goes out first so truncate failure does not lose it. */
8923 if( SQLITE_OK!=apndWriteMark(paf, pFile, size) ) return SQLITE_IOERR;
8924 /* Truncate underlying file just past append mark */
8925 return pFile->pMethods->xTruncate(pFile, paf->iMark+APND_MARK_SIZE);
8926 }
8927
8928 /*
8929 ** Sync an apnd-file.
8930 */
apndSync(sqlite3_file * pFile,int flags)8931 static int apndSync(sqlite3_file *pFile, int flags){
8932 pFile = ORIGFILE(pFile);
8933 return pFile->pMethods->xSync(pFile, flags);
8934 }
8935
8936 /*
8937 ** Return the current file-size of an apnd-file.
8938 ** If the append mark is not yet there, the file-size is 0.
8939 */
apndFileSize(sqlite3_file * pFile,sqlite_int64 * pSize)8940 static int apndFileSize(sqlite3_file *pFile, sqlite_int64 *pSize){
8941 ApndFile *paf = (ApndFile *)pFile;
8942 *pSize = ( paf->iMark >= 0 )? (paf->iMark - paf->iPgOne) : 0;
8943 return SQLITE_OK;
8944 }
8945
8946 /*
8947 ** Lock an apnd-file.
8948 */
apndLock(sqlite3_file * pFile,int eLock)8949 static int apndLock(sqlite3_file *pFile, int eLock){
8950 pFile = ORIGFILE(pFile);
8951 return pFile->pMethods->xLock(pFile, eLock);
8952 }
8953
8954 /*
8955 ** Unlock an apnd-file.
8956 */
apndUnlock(sqlite3_file * pFile,int eLock)8957 static int apndUnlock(sqlite3_file *pFile, int eLock){
8958 pFile = ORIGFILE(pFile);
8959 return pFile->pMethods->xUnlock(pFile, eLock);
8960 }
8961
8962 /*
8963 ** Check if another file-handle holds a RESERVED lock on an apnd-file.
8964 */
apndCheckReservedLock(sqlite3_file * pFile,int * pResOut)8965 static int apndCheckReservedLock(sqlite3_file *pFile, int *pResOut){
8966 pFile = ORIGFILE(pFile);
8967 return pFile->pMethods->xCheckReservedLock(pFile, pResOut);
8968 }
8969
8970 /*
8971 ** File control method. For custom operations on an apnd-file.
8972 */
apndFileControl(sqlite3_file * pFile,int op,void * pArg)8973 static int apndFileControl(sqlite3_file *pFile, int op, void *pArg){
8974 ApndFile *paf = (ApndFile *)pFile;
8975 int rc;
8976 pFile = ORIGFILE(pFile);
8977 if( op==SQLITE_FCNTL_SIZE_HINT ) *(sqlite3_int64*)pArg += paf->iPgOne;
8978 rc = pFile->pMethods->xFileControl(pFile, op, pArg);
8979 if( rc==SQLITE_OK && op==SQLITE_FCNTL_VFSNAME ){
8980 *(char**)pArg = sqlite3_mprintf("apnd(%lld)/%z", paf->iPgOne,*(char**)pArg);
8981 }
8982 return rc;
8983 }
8984
8985 /*
8986 ** Return the sector-size in bytes for an apnd-file.
8987 */
apndSectorSize(sqlite3_file * pFile)8988 static int apndSectorSize(sqlite3_file *pFile){
8989 pFile = ORIGFILE(pFile);
8990 return pFile->pMethods->xSectorSize(pFile);
8991 }
8992
8993 /*
8994 ** Return the device characteristic flags supported by an apnd-file.
8995 */
apndDeviceCharacteristics(sqlite3_file * pFile)8996 static int apndDeviceCharacteristics(sqlite3_file *pFile){
8997 pFile = ORIGFILE(pFile);
8998 return pFile->pMethods->xDeviceCharacteristics(pFile);
8999 }
9000
9001 /* Create a shared memory file mapping */
apndShmMap(sqlite3_file * pFile,int iPg,int pgsz,int bExtend,void volatile ** pp)9002 static int apndShmMap(
9003 sqlite3_file *pFile,
9004 int iPg,
9005 int pgsz,
9006 int bExtend,
9007 void volatile **pp
9008 ){
9009 pFile = ORIGFILE(pFile);
9010 return pFile->pMethods->xShmMap(pFile,iPg,pgsz,bExtend,pp);
9011 }
9012
9013 /* Perform locking on a shared-memory segment */
apndShmLock(sqlite3_file * pFile,int offset,int n,int flags)9014 static int apndShmLock(sqlite3_file *pFile, int offset, int n, int flags){
9015 pFile = ORIGFILE(pFile);
9016 return pFile->pMethods->xShmLock(pFile,offset,n,flags);
9017 }
9018
9019 /* Memory barrier operation on shared memory */
apndShmBarrier(sqlite3_file * pFile)9020 static void apndShmBarrier(sqlite3_file *pFile){
9021 pFile = ORIGFILE(pFile);
9022 pFile->pMethods->xShmBarrier(pFile);
9023 }
9024
9025 /* Unmap a shared memory segment */
apndShmUnmap(sqlite3_file * pFile,int deleteFlag)9026 static int apndShmUnmap(sqlite3_file *pFile, int deleteFlag){
9027 pFile = ORIGFILE(pFile);
9028 return pFile->pMethods->xShmUnmap(pFile,deleteFlag);
9029 }
9030
9031 /* Fetch a page of a memory-mapped file */
apndFetch(sqlite3_file * pFile,sqlite3_int64 iOfst,int iAmt,void ** pp)9032 static int apndFetch(
9033 sqlite3_file *pFile,
9034 sqlite3_int64 iOfst,
9035 int iAmt,
9036 void **pp
9037 ){
9038 ApndFile *p = (ApndFile *)pFile;
9039 if( p->iMark < 0 || iOfst+iAmt > p->iMark ){
9040 return SQLITE_IOERR; /* Cannot read what is not yet there. */
9041 }
9042 pFile = ORIGFILE(pFile);
9043 return pFile->pMethods->xFetch(pFile, iOfst+p->iPgOne, iAmt, pp);
9044 }
9045
9046 /* Release a memory-mapped page */
apndUnfetch(sqlite3_file * pFile,sqlite3_int64 iOfst,void * pPage)9047 static int apndUnfetch(sqlite3_file *pFile, sqlite3_int64 iOfst, void *pPage){
9048 ApndFile *p = (ApndFile *)pFile;
9049 pFile = ORIGFILE(pFile);
9050 return pFile->pMethods->xUnfetch(pFile, iOfst+p->iPgOne, pPage);
9051 }
9052
9053 /*
9054 ** Try to read the append-mark off the end of a file. Return the
9055 ** start of the appended database if the append-mark is present.
9056 ** If there is no valid append-mark, return -1;
9057 **
9058 ** An append-mark is only valid if the NNNNNNNN start-of-database offset
9059 ** indicates that the appended database contains at least one page. The
9060 ** start-of-database value must be a multiple of 512.
9061 */
apndReadMark(sqlite3_int64 sz,sqlite3_file * pFile)9062 static sqlite3_int64 apndReadMark(sqlite3_int64 sz, sqlite3_file *pFile){
9063 int rc, i;
9064 sqlite3_int64 iMark;
9065 int msbs = 8 * (APND_MARK_FOS_SZ-1);
9066 unsigned char a[APND_MARK_SIZE];
9067
9068 if( APND_MARK_SIZE!=(sz & 0x1ff) ) return -1;
9069 rc = pFile->pMethods->xRead(pFile, a, APND_MARK_SIZE, sz-APND_MARK_SIZE);
9070 if( rc ) return -1;
9071 if( memcmp(a, APND_MARK_PREFIX, APND_MARK_PREFIX_SZ)!=0 ) return -1;
9072 iMark = ((sqlite3_int64)(a[APND_MARK_PREFIX_SZ] & 0x7f)) << msbs;
9073 for(i=1; i<8; i++){
9074 msbs -= 8;
9075 iMark |= (sqlite3_int64)a[APND_MARK_PREFIX_SZ+i]<<msbs;
9076 }
9077 if( iMark > (sz - APND_MARK_SIZE - 512) ) return -1;
9078 if( iMark & 0x1ff ) return -1;
9079 return iMark;
9080 }
9081
9082 static const char apvfsSqliteHdr[] = "SQLite format 3";
9083 /*
9084 ** Check to see if the file is an appendvfs SQLite database file.
9085 ** Return true iff it is such. Parameter sz is the file's size.
9086 */
apndIsAppendvfsDatabase(sqlite3_int64 sz,sqlite3_file * pFile)9087 static int apndIsAppendvfsDatabase(sqlite3_int64 sz, sqlite3_file *pFile){
9088 int rc;
9089 char zHdr[16];
9090 sqlite3_int64 iMark = apndReadMark(sz, pFile);
9091 if( iMark>=0 ){
9092 /* If file has the correct end-marker, the expected odd size, and the
9093 ** SQLite DB type marker where the end-marker puts it, then it
9094 ** is an appendvfs database.
9095 */
9096 rc = pFile->pMethods->xRead(pFile, zHdr, sizeof(zHdr), iMark);
9097 if( SQLITE_OK==rc
9098 && memcmp(zHdr, apvfsSqliteHdr, sizeof(zHdr))==0
9099 && (sz & 0x1ff) == APND_MARK_SIZE
9100 && sz>=512+APND_MARK_SIZE
9101 ){
9102 return 1; /* It's an appendvfs database */
9103 }
9104 }
9105 return 0;
9106 }
9107
9108 /*
9109 ** Check to see if the file is an ordinary SQLite database file.
9110 ** Return true iff so. Parameter sz is the file's size.
9111 */
apndIsOrdinaryDatabaseFile(sqlite3_int64 sz,sqlite3_file * pFile)9112 static int apndIsOrdinaryDatabaseFile(sqlite3_int64 sz, sqlite3_file *pFile){
9113 char zHdr[16];
9114 if( apndIsAppendvfsDatabase(sz, pFile) /* rule 2 */
9115 || (sz & 0x1ff) != 0
9116 || SQLITE_OK!=pFile->pMethods->xRead(pFile, zHdr, sizeof(zHdr), 0)
9117 || memcmp(zHdr, apvfsSqliteHdr, sizeof(zHdr))!=0
9118 ){
9119 return 0;
9120 }else{
9121 return 1;
9122 }
9123 }
9124
9125 /*
9126 ** Open an apnd file handle.
9127 */
apndOpen(sqlite3_vfs * pApndVfs,const char * zName,sqlite3_file * pFile,int flags,int * pOutFlags)9128 static int apndOpen(
9129 sqlite3_vfs *pApndVfs,
9130 const char *zName,
9131 sqlite3_file *pFile,
9132 int flags,
9133 int *pOutFlags
9134 ){
9135 ApndFile *pApndFile = (ApndFile*)pFile;
9136 sqlite3_file *pBaseFile = ORIGFILE(pFile);
9137 sqlite3_vfs *pBaseVfs = ORIGVFS(pApndVfs);
9138 int rc;
9139 sqlite3_int64 sz = 0;
9140 if( (flags & SQLITE_OPEN_MAIN_DB)==0 ){
9141 /* The appendvfs is not to be used for transient or temporary databases.
9142 ** Just use the base VFS open to initialize the given file object and
9143 ** open the underlying file. (Appendvfs is then unused for this file.)
9144 */
9145 return pBaseVfs->xOpen(pBaseVfs, zName, pFile, flags, pOutFlags);
9146 }
9147 memset(pApndFile, 0, sizeof(ApndFile));
9148 pFile->pMethods = &apnd_io_methods;
9149 pApndFile->iMark = -1; /* Append mark not yet written */
9150
9151 rc = pBaseVfs->xOpen(pBaseVfs, zName, pBaseFile, flags, pOutFlags);
9152 if( rc==SQLITE_OK ){
9153 rc = pBaseFile->pMethods->xFileSize(pBaseFile, &sz);
9154 if( rc ){
9155 pBaseFile->pMethods->xClose(pBaseFile);
9156 }
9157 }
9158 if( rc ){
9159 pFile->pMethods = 0;
9160 return rc;
9161 }
9162 if( apndIsOrdinaryDatabaseFile(sz, pBaseFile) ){
9163 /* The file being opened appears to be just an ordinary DB. Copy
9164 ** the base dispatch-table so this instance mimics the base VFS.
9165 */
9166 memmove(pApndFile, pBaseFile, pBaseVfs->szOsFile);
9167 return SQLITE_OK;
9168 }
9169 pApndFile->iPgOne = apndReadMark(sz, pFile);
9170 if( pApndFile->iPgOne>=0 ){
9171 pApndFile->iMark = sz - APND_MARK_SIZE; /* Append mark found */
9172 return SQLITE_OK;
9173 }
9174 if( (flags & SQLITE_OPEN_CREATE)==0 ){
9175 pBaseFile->pMethods->xClose(pBaseFile);
9176 rc = SQLITE_CANTOPEN;
9177 pFile->pMethods = 0;
9178 }else{
9179 /* Round newly added appendvfs location to #define'd page boundary.
9180 ** Note that nothing has yet been written to the underlying file.
9181 ** The append mark will be written along with first content write.
9182 ** Until then, paf->iMark value indicates it is not yet written.
9183 */
9184 pApndFile->iPgOne = APND_START_ROUNDUP(sz);
9185 }
9186 return rc;
9187 }
9188
9189 /*
9190 ** Delete an apnd file.
9191 ** For an appendvfs, this could mean delete the appendvfs portion,
9192 ** leaving the appendee as it was before it gained an appendvfs.
9193 ** For now, this code deletes the underlying file too.
9194 */
apndDelete(sqlite3_vfs * pVfs,const char * zPath,int dirSync)9195 static int apndDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){
9196 return ORIGVFS(pVfs)->xDelete(ORIGVFS(pVfs), zPath, dirSync);
9197 }
9198
9199 /*
9200 ** All other VFS methods are pass-thrus.
9201 */
apndAccess(sqlite3_vfs * pVfs,const char * zPath,int flags,int * pResOut)9202 static int apndAccess(
9203 sqlite3_vfs *pVfs,
9204 const char *zPath,
9205 int flags,
9206 int *pResOut
9207 ){
9208 return ORIGVFS(pVfs)->xAccess(ORIGVFS(pVfs), zPath, flags, pResOut);
9209 }
apndFullPathname(sqlite3_vfs * pVfs,const char * zPath,int nOut,char * zOut)9210 static int apndFullPathname(
9211 sqlite3_vfs *pVfs,
9212 const char *zPath,
9213 int nOut,
9214 char *zOut
9215 ){
9216 return ORIGVFS(pVfs)->xFullPathname(ORIGVFS(pVfs),zPath,nOut,zOut);
9217 }
apndDlOpen(sqlite3_vfs * pVfs,const char * zPath)9218 static void *apndDlOpen(sqlite3_vfs *pVfs, const char *zPath){
9219 return ORIGVFS(pVfs)->xDlOpen(ORIGVFS(pVfs), zPath);
9220 }
apndDlError(sqlite3_vfs * pVfs,int nByte,char * zErrMsg)9221 static void apndDlError(sqlite3_vfs *pVfs, int nByte, char *zErrMsg){
9222 ORIGVFS(pVfs)->xDlError(ORIGVFS(pVfs), nByte, zErrMsg);
9223 }
apndDlSym(sqlite3_vfs * pVfs,void * p,const char * zSym)9224 static void (*apndDlSym(sqlite3_vfs *pVfs, void *p, const char *zSym))(void){
9225 return ORIGVFS(pVfs)->xDlSym(ORIGVFS(pVfs), p, zSym);
9226 }
apndDlClose(sqlite3_vfs * pVfs,void * pHandle)9227 static void apndDlClose(sqlite3_vfs *pVfs, void *pHandle){
9228 ORIGVFS(pVfs)->xDlClose(ORIGVFS(pVfs), pHandle);
9229 }
apndRandomness(sqlite3_vfs * pVfs,int nByte,char * zBufOut)9230 static int apndRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){
9231 return ORIGVFS(pVfs)->xRandomness(ORIGVFS(pVfs), nByte, zBufOut);
9232 }
apndSleep(sqlite3_vfs * pVfs,int nMicro)9233 static int apndSleep(sqlite3_vfs *pVfs, int nMicro){
9234 return ORIGVFS(pVfs)->xSleep(ORIGVFS(pVfs), nMicro);
9235 }
apndCurrentTime(sqlite3_vfs * pVfs,double * pTimeOut)9236 static int apndCurrentTime(sqlite3_vfs *pVfs, double *pTimeOut){
9237 return ORIGVFS(pVfs)->xCurrentTime(ORIGVFS(pVfs), pTimeOut);
9238 }
apndGetLastError(sqlite3_vfs * pVfs,int a,char * b)9239 static int apndGetLastError(sqlite3_vfs *pVfs, int a, char *b){
9240 return ORIGVFS(pVfs)->xGetLastError(ORIGVFS(pVfs), a, b);
9241 }
apndCurrentTimeInt64(sqlite3_vfs * pVfs,sqlite3_int64 * p)9242 static int apndCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *p){
9243 return ORIGVFS(pVfs)->xCurrentTimeInt64(ORIGVFS(pVfs), p);
9244 }
apndSetSystemCall(sqlite3_vfs * pVfs,const char * zName,sqlite3_syscall_ptr pCall)9245 static int apndSetSystemCall(
9246 sqlite3_vfs *pVfs,
9247 const char *zName,
9248 sqlite3_syscall_ptr pCall
9249 ){
9250 return ORIGVFS(pVfs)->xSetSystemCall(ORIGVFS(pVfs),zName,pCall);
9251 }
apndGetSystemCall(sqlite3_vfs * pVfs,const char * zName)9252 static sqlite3_syscall_ptr apndGetSystemCall(
9253 sqlite3_vfs *pVfs,
9254 const char *zName
9255 ){
9256 return ORIGVFS(pVfs)->xGetSystemCall(ORIGVFS(pVfs),zName);
9257 }
apndNextSystemCall(sqlite3_vfs * pVfs,const char * zName)9258 static const char *apndNextSystemCall(sqlite3_vfs *pVfs, const char *zName){
9259 return ORIGVFS(pVfs)->xNextSystemCall(ORIGVFS(pVfs), zName);
9260 }
9261
9262
9263 #ifdef _WIN32
9264
9265 #endif
9266 /*
9267 ** This routine is called when the extension is loaded.
9268 ** Register the new VFS.
9269 */
sqlite3_appendvfs_init(sqlite3 * db,char ** pzErrMsg,const sqlite3_api_routines * pApi)9270 static int sqlite3_appendvfs_init(
9271 sqlite3 *db,
9272 char **pzErrMsg,
9273 const sqlite3_api_routines *pApi
9274 ){
9275 int rc = SQLITE_OK;
9276 sqlite3_vfs *pOrig;
9277 SQLITE_EXTENSION_INIT2(pApi);
9278 (void)pzErrMsg;
9279 (void)db;
9280 pOrig = sqlite3_vfs_find(0);
9281 if( pOrig==0 ) return SQLITE_ERROR;
9282 apnd_vfs.iVersion = pOrig->iVersion;
9283 apnd_vfs.pAppData = pOrig;
9284 apnd_vfs.szOsFile = pOrig->szOsFile + sizeof(ApndFile);
9285 rc = sqlite3_vfs_register(&apnd_vfs, 0);
9286 #ifdef APPENDVFS_TEST
9287 if( rc==SQLITE_OK ){
9288 rc = sqlite3_auto_extension((void(*)(void))apndvfsRegister);
9289 }
9290 #endif
9291 if( rc==SQLITE_OK ) rc = SQLITE_OK_LOAD_PERMANENTLY;
9292 return rc;
9293 }
9294
9295 /************************* End ../ext/misc/appendvfs.c ********************/
9296 #endif
9297 #ifdef SQLITE_HAVE_ZLIB
9298 /************************* Begin ../ext/misc/zipfile.c ******************/
9299 /*
9300 ** 2017-12-26
9301 **
9302 ** The author disclaims copyright to this source code. In place of
9303 ** a legal notice, here is a blessing:
9304 **
9305 ** May you do good and not evil.
9306 ** May you find forgiveness for yourself and forgive others.
9307 ** May you share freely, never taking more than you give.
9308 **
9309 ******************************************************************************
9310 **
9311 ** This file implements a virtual table for reading and writing ZIP archive
9312 ** files.
9313 **
9314 ** Usage example:
9315 **
9316 ** SELECT name, sz, datetime(mtime,'unixepoch') FROM zipfile($filename);
9317 **
9318 ** Current limitations:
9319 **
9320 ** * No support for encryption
9321 ** * No support for ZIP archives spanning multiple files
9322 ** * No support for zip64 extensions
9323 ** * Only the "inflate/deflate" (zlib) compression method is supported
9324 */
9325 /* #include "sqlite3ext.h" */
9326 SQLITE_EXTENSION_INIT1
9327 #include <stdio.h>
9328 #include <string.h>
9329 #include <assert.h>
9330 #include <stdint.h>
9331
9332 #include <zlib.h>
9333
9334 #ifndef SQLITE_OMIT_VIRTUALTABLE
9335
9336 #ifndef SQLITE_AMALGAMATION
9337
9338 #ifndef UINT32_TYPE
9339 # ifdef HAVE_UINT32_T
9340 # define UINT32_TYPE uint32_t
9341 # else
9342 # define UINT32_TYPE unsigned int
9343 # endif
9344 #endif
9345 #ifndef UINT16_TYPE
9346 # ifdef HAVE_UINT16_T
9347 # define UINT16_TYPE uint16_t
9348 # else
9349 # define UINT16_TYPE unsigned short int
9350 # endif
9351 #endif
9352 /* typedef sqlite3_int64 i64; */
9353 /* typedef unsigned char u8; */
9354 /* typedef UINT32_TYPE u32; // 4-byte unsigned integer // */
9355 /* typedef UINT16_TYPE u16; // 2-byte unsigned integer // */
9356 #define MIN(a,b) ((a)<(b) ? (a) : (b))
9357
9358 #if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST)
9359 # define SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS 1
9360 #endif
9361 #if defined(SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS)
9362 # define ALWAYS(X) (1)
9363 # define NEVER(X) (0)
9364 #elif !defined(NDEBUG)
9365 # define ALWAYS(X) ((X)?1:(assert(0),0))
9366 # define NEVER(X) ((X)?(assert(0),1):0)
9367 #else
9368 # define ALWAYS(X) (X)
9369 # define NEVER(X) (X)
9370 #endif
9371
9372 #endif /* SQLITE_AMALGAMATION */
9373
9374 /*
9375 ** Definitions for mode bitmasks S_IFDIR, S_IFREG and S_IFLNK.
9376 **
9377 ** In some ways it would be better to obtain these values from system
9378 ** header files. But, the dependency is undesirable and (a) these
9379 ** have been stable for decades, (b) the values are part of POSIX and
9380 ** are also made explicit in [man stat], and (c) are part of the
9381 ** file format for zip archives.
9382 */
9383 #ifndef S_IFDIR
9384 # define S_IFDIR 0040000
9385 #endif
9386 #ifndef S_IFREG
9387 # define S_IFREG 0100000
9388 #endif
9389 #ifndef S_IFLNK
9390 # define S_IFLNK 0120000
9391 #endif
9392
9393 static const char ZIPFILE_SCHEMA[] =
9394 "CREATE TABLE y("
9395 "name PRIMARY KEY," /* 0: Name of file in zip archive */
9396 "mode," /* 1: POSIX mode for file */
9397 "mtime," /* 2: Last modification time (secs since 1970)*/
9398 "sz," /* 3: Size of object */
9399 "rawdata," /* 4: Raw data */
9400 "data," /* 5: Uncompressed data */
9401 "method," /* 6: Compression method (integer) */
9402 "z HIDDEN" /* 7: Name of zip file */
9403 ") WITHOUT ROWID;";
9404
9405 #define ZIPFILE_F_COLUMN_IDX 7 /* Index of column "file" in the above */
9406 #define ZIPFILE_BUFFER_SIZE (64*1024)
9407
9408
9409 /*
9410 ** Magic numbers used to read and write zip files.
9411 **
9412 ** ZIPFILE_NEWENTRY_MADEBY:
9413 ** Use this value for the "version-made-by" field in new zip file
9414 ** entries. The upper byte indicates "unix", and the lower byte
9415 ** indicates that the zip file matches pkzip specification 3.0.
9416 ** This is what info-zip seems to do.
9417 **
9418 ** ZIPFILE_NEWENTRY_REQUIRED:
9419 ** Value for "version-required-to-extract" field of new entries.
9420 ** Version 2.0 is required to support folders and deflate compression.
9421 **
9422 ** ZIPFILE_NEWENTRY_FLAGS:
9423 ** Value for "general-purpose-bit-flags" field of new entries. Bit
9424 ** 11 means "utf-8 filename and comment".
9425 **
9426 ** ZIPFILE_SIGNATURE_CDS:
9427 ** First 4 bytes of a valid CDS record.
9428 **
9429 ** ZIPFILE_SIGNATURE_LFH:
9430 ** First 4 bytes of a valid LFH record.
9431 **
9432 ** ZIPFILE_SIGNATURE_EOCD
9433 ** First 4 bytes of a valid EOCD record.
9434 */
9435 #define ZIPFILE_EXTRA_TIMESTAMP 0x5455
9436 #define ZIPFILE_NEWENTRY_MADEBY ((3<<8) + 30)
9437 #define ZIPFILE_NEWENTRY_REQUIRED 20
9438 #define ZIPFILE_NEWENTRY_FLAGS 0x800
9439 #define ZIPFILE_SIGNATURE_CDS 0x02014b50
9440 #define ZIPFILE_SIGNATURE_LFH 0x04034b50
9441 #define ZIPFILE_SIGNATURE_EOCD 0x06054b50
9442
9443 /*
9444 ** The sizes of the fixed-size part of each of the three main data
9445 ** structures in a zip archive.
9446 */
9447 #define ZIPFILE_LFH_FIXED_SZ 30
9448 #define ZIPFILE_EOCD_FIXED_SZ 22
9449 #define ZIPFILE_CDS_FIXED_SZ 46
9450
9451 /*
9452 *** 4.3.16 End of central directory record:
9453 ***
9454 *** end of central dir signature 4 bytes (0x06054b50)
9455 *** number of this disk 2 bytes
9456 *** number of the disk with the
9457 *** start of the central directory 2 bytes
9458 *** total number of entries in the
9459 *** central directory on this disk 2 bytes
9460 *** total number of entries in
9461 *** the central directory 2 bytes
9462 *** size of the central directory 4 bytes
9463 *** offset of start of central
9464 *** directory with respect to
9465 *** the starting disk number 4 bytes
9466 *** .ZIP file comment length 2 bytes
9467 *** .ZIP file comment (variable size)
9468 */
9469 typedef struct ZipfileEOCD ZipfileEOCD;
9470 struct ZipfileEOCD {
9471 u16 iDisk;
9472 u16 iFirstDisk;
9473 u16 nEntry;
9474 u16 nEntryTotal;
9475 u32 nSize;
9476 u32 iOffset;
9477 };
9478
9479 /*
9480 *** 4.3.12 Central directory structure:
9481 ***
9482 *** ...
9483 ***
9484 *** central file header signature 4 bytes (0x02014b50)
9485 *** version made by 2 bytes
9486 *** version needed to extract 2 bytes
9487 *** general purpose bit flag 2 bytes
9488 *** compression method 2 bytes
9489 *** last mod file time 2 bytes
9490 *** last mod file date 2 bytes
9491 *** crc-32 4 bytes
9492 *** compressed size 4 bytes
9493 *** uncompressed size 4 bytes
9494 *** file name length 2 bytes
9495 *** extra field length 2 bytes
9496 *** file comment length 2 bytes
9497 *** disk number start 2 bytes
9498 *** internal file attributes 2 bytes
9499 *** external file attributes 4 bytes
9500 *** relative offset of local header 4 bytes
9501 */
9502 typedef struct ZipfileCDS ZipfileCDS;
9503 struct ZipfileCDS {
9504 u16 iVersionMadeBy;
9505 u16 iVersionExtract;
9506 u16 flags;
9507 u16 iCompression;
9508 u16 mTime;
9509 u16 mDate;
9510 u32 crc32;
9511 u32 szCompressed;
9512 u32 szUncompressed;
9513 u16 nFile;
9514 u16 nExtra;
9515 u16 nComment;
9516 u16 iDiskStart;
9517 u16 iInternalAttr;
9518 u32 iExternalAttr;
9519 u32 iOffset;
9520 char *zFile; /* Filename (sqlite3_malloc()) */
9521 };
9522
9523 /*
9524 *** 4.3.7 Local file header:
9525 ***
9526 *** local file header signature 4 bytes (0x04034b50)
9527 *** version needed to extract 2 bytes
9528 *** general purpose bit flag 2 bytes
9529 *** compression method 2 bytes
9530 *** last mod file time 2 bytes
9531 *** last mod file date 2 bytes
9532 *** crc-32 4 bytes
9533 *** compressed size 4 bytes
9534 *** uncompressed size 4 bytes
9535 *** file name length 2 bytes
9536 *** extra field length 2 bytes
9537 ***
9538 */
9539 typedef struct ZipfileLFH ZipfileLFH;
9540 struct ZipfileLFH {
9541 u16 iVersionExtract;
9542 u16 flags;
9543 u16 iCompression;
9544 u16 mTime;
9545 u16 mDate;
9546 u32 crc32;
9547 u32 szCompressed;
9548 u32 szUncompressed;
9549 u16 nFile;
9550 u16 nExtra;
9551 };
9552
9553 typedef struct ZipfileEntry ZipfileEntry;
9554 struct ZipfileEntry {
9555 ZipfileCDS cds; /* Parsed CDS record */
9556 u32 mUnixTime; /* Modification time, in UNIX format */
9557 u8 *aExtra; /* cds.nExtra+cds.nComment bytes of extra data */
9558 i64 iDataOff; /* Offset to data in file (if aData==0) */
9559 u8 *aData; /* cds.szCompressed bytes of compressed data */
9560 ZipfileEntry *pNext; /* Next element in in-memory CDS */
9561 };
9562
9563 /*
9564 ** Cursor type for zipfile tables.
9565 */
9566 typedef struct ZipfileCsr ZipfileCsr;
9567 struct ZipfileCsr {
9568 sqlite3_vtab_cursor base; /* Base class - must be first */
9569 i64 iId; /* Cursor ID */
9570 u8 bEof; /* True when at EOF */
9571 u8 bNoop; /* If next xNext() call is no-op */
9572
9573 /* Used outside of write transactions */
9574 FILE *pFile; /* Zip file */
9575 i64 iNextOff; /* Offset of next record in central directory */
9576 ZipfileEOCD eocd; /* Parse of central directory record */
9577
9578 ZipfileEntry *pFreeEntry; /* Free this list when cursor is closed or reset */
9579 ZipfileEntry *pCurrent; /* Current entry */
9580 ZipfileCsr *pCsrNext; /* Next cursor on same virtual table */
9581 };
9582
9583 typedef struct ZipfileTab ZipfileTab;
9584 struct ZipfileTab {
9585 sqlite3_vtab base; /* Base class - must be first */
9586 char *zFile; /* Zip file this table accesses (may be NULL) */
9587 sqlite3 *db; /* Host database connection */
9588 u8 *aBuffer; /* Temporary buffer used for various tasks */
9589
9590 ZipfileCsr *pCsrList; /* List of cursors */
9591 i64 iNextCsrid;
9592
9593 /* The following are used by write transactions only */
9594 ZipfileEntry *pFirstEntry; /* Linked list of all files (if pWriteFd!=0) */
9595 ZipfileEntry *pLastEntry; /* Last element in pFirstEntry list */
9596 FILE *pWriteFd; /* File handle open on zip archive */
9597 i64 szCurrent; /* Current size of zip archive */
9598 i64 szOrig; /* Size of archive at start of transaction */
9599 };
9600
9601 /*
9602 ** Set the error message contained in context ctx to the results of
9603 ** vprintf(zFmt, ...).
9604 */
zipfileCtxErrorMsg(sqlite3_context * ctx,const char * zFmt,...)9605 static void zipfileCtxErrorMsg(sqlite3_context *ctx, const char *zFmt, ...){
9606 char *zMsg = 0;
9607 va_list ap;
9608 va_start(ap, zFmt);
9609 zMsg = sqlite3_vmprintf(zFmt, ap);
9610 sqlite3_result_error(ctx, zMsg, -1);
9611 sqlite3_free(zMsg);
9612 va_end(ap);
9613 }
9614
9615 /*
9616 ** If string zIn is quoted, dequote it in place. Otherwise, if the string
9617 ** is not quoted, do nothing.
9618 */
zipfileDequote(char * zIn)9619 static void zipfileDequote(char *zIn){
9620 char q = zIn[0];
9621 if( q=='"' || q=='\'' || q=='`' || q=='[' ){
9622 int iIn = 1;
9623 int iOut = 0;
9624 if( q=='[' ) q = ']';
9625 while( ALWAYS(zIn[iIn]) ){
9626 char c = zIn[iIn++];
9627 if( c==q && zIn[iIn++]!=q ) break;
9628 zIn[iOut++] = c;
9629 }
9630 zIn[iOut] = '\0';
9631 }
9632 }
9633
9634 /*
9635 ** Construct a new ZipfileTab virtual table object.
9636 **
9637 ** argv[0] -> module name ("zipfile")
9638 ** argv[1] -> database name
9639 ** argv[2] -> table name
9640 ** argv[...] -> "column name" and other module argument fields.
9641 */
zipfileConnect(sqlite3 * db,void * pAux,int argc,const char * const * argv,sqlite3_vtab ** ppVtab,char ** pzErr)9642 static int zipfileConnect(
9643 sqlite3 *db,
9644 void *pAux,
9645 int argc, const char *const*argv,
9646 sqlite3_vtab **ppVtab,
9647 char **pzErr
9648 ){
9649 int nByte = sizeof(ZipfileTab) + ZIPFILE_BUFFER_SIZE;
9650 int nFile = 0;
9651 const char *zFile = 0;
9652 ZipfileTab *pNew = 0;
9653 int rc;
9654 (void)pAux;
9655
9656 /* If the table name is not "zipfile", require that the argument be
9657 ** specified. This stops zipfile tables from being created as:
9658 **
9659 ** CREATE VIRTUAL TABLE zzz USING zipfile();
9660 **
9661 ** It does not prevent:
9662 **
9663 ** CREATE VIRTUAL TABLE zipfile USING zipfile();
9664 */
9665 assert( 0==sqlite3_stricmp(argv[0], "zipfile") );
9666 if( (0!=sqlite3_stricmp(argv[2], "zipfile") && argc<4) || argc>4 ){
9667 *pzErr = sqlite3_mprintf("zipfile constructor requires one argument");
9668 return SQLITE_ERROR;
9669 }
9670
9671 if( argc>3 ){
9672 zFile = argv[3];
9673 nFile = (int)strlen(zFile)+1;
9674 }
9675
9676 rc = sqlite3_declare_vtab(db, ZIPFILE_SCHEMA);
9677 if( rc==SQLITE_OK ){
9678 pNew = (ZipfileTab*)sqlite3_malloc64((sqlite3_int64)nByte+nFile);
9679 if( pNew==0 ) return SQLITE_NOMEM;
9680 memset(pNew, 0, nByte+nFile);
9681 pNew->db = db;
9682 pNew->aBuffer = (u8*)&pNew[1];
9683 if( zFile ){
9684 pNew->zFile = (char*)&pNew->aBuffer[ZIPFILE_BUFFER_SIZE];
9685 memcpy(pNew->zFile, zFile, nFile);
9686 zipfileDequote(pNew->zFile);
9687 }
9688 }
9689 sqlite3_vtab_config(db, SQLITE_VTAB_DIRECTONLY);
9690 *ppVtab = (sqlite3_vtab*)pNew;
9691 return rc;
9692 }
9693
9694 /*
9695 ** Free the ZipfileEntry structure indicated by the only argument.
9696 */
zipfileEntryFree(ZipfileEntry * p)9697 static void zipfileEntryFree(ZipfileEntry *p){
9698 if( p ){
9699 sqlite3_free(p->cds.zFile);
9700 sqlite3_free(p);
9701 }
9702 }
9703
9704 /*
9705 ** Release resources that should be freed at the end of a write
9706 ** transaction.
9707 */
zipfileCleanupTransaction(ZipfileTab * pTab)9708 static void zipfileCleanupTransaction(ZipfileTab *pTab){
9709 ZipfileEntry *pEntry;
9710 ZipfileEntry *pNext;
9711
9712 if( pTab->pWriteFd ){
9713 fclose(pTab->pWriteFd);
9714 pTab->pWriteFd = 0;
9715 }
9716 for(pEntry=pTab->pFirstEntry; pEntry; pEntry=pNext){
9717 pNext = pEntry->pNext;
9718 zipfileEntryFree(pEntry);
9719 }
9720 pTab->pFirstEntry = 0;
9721 pTab->pLastEntry = 0;
9722 pTab->szCurrent = 0;
9723 pTab->szOrig = 0;
9724 }
9725
9726 /*
9727 ** This method is the destructor for zipfile vtab objects.
9728 */
zipfileDisconnect(sqlite3_vtab * pVtab)9729 static int zipfileDisconnect(sqlite3_vtab *pVtab){
9730 zipfileCleanupTransaction((ZipfileTab*)pVtab);
9731 sqlite3_free(pVtab);
9732 return SQLITE_OK;
9733 }
9734
9735 /*
9736 ** Constructor for a new ZipfileCsr object.
9737 */
zipfileOpen(sqlite3_vtab * p,sqlite3_vtab_cursor ** ppCsr)9738 static int zipfileOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCsr){
9739 ZipfileTab *pTab = (ZipfileTab*)p;
9740 ZipfileCsr *pCsr;
9741 pCsr = sqlite3_malloc(sizeof(*pCsr));
9742 *ppCsr = (sqlite3_vtab_cursor*)pCsr;
9743 if( pCsr==0 ){
9744 return SQLITE_NOMEM;
9745 }
9746 memset(pCsr, 0, sizeof(*pCsr));
9747 pCsr->iId = ++pTab->iNextCsrid;
9748 pCsr->pCsrNext = pTab->pCsrList;
9749 pTab->pCsrList = pCsr;
9750 return SQLITE_OK;
9751 }
9752
9753 /*
9754 ** Reset a cursor back to the state it was in when first returned
9755 ** by zipfileOpen().
9756 */
zipfileResetCursor(ZipfileCsr * pCsr)9757 static void zipfileResetCursor(ZipfileCsr *pCsr){
9758 ZipfileEntry *p;
9759 ZipfileEntry *pNext;
9760
9761 pCsr->bEof = 0;
9762 if( pCsr->pFile ){
9763 fclose(pCsr->pFile);
9764 pCsr->pFile = 0;
9765 zipfileEntryFree(pCsr->pCurrent);
9766 pCsr->pCurrent = 0;
9767 }
9768
9769 for(p=pCsr->pFreeEntry; p; p=pNext){
9770 pNext = p->pNext;
9771 zipfileEntryFree(p);
9772 }
9773 }
9774
9775 /*
9776 ** Destructor for an ZipfileCsr.
9777 */
zipfileClose(sqlite3_vtab_cursor * cur)9778 static int zipfileClose(sqlite3_vtab_cursor *cur){
9779 ZipfileCsr *pCsr = (ZipfileCsr*)cur;
9780 ZipfileTab *pTab = (ZipfileTab*)(pCsr->base.pVtab);
9781 ZipfileCsr **pp;
9782 zipfileResetCursor(pCsr);
9783
9784 /* Remove this cursor from the ZipfileTab.pCsrList list. */
9785 for(pp=&pTab->pCsrList; *pp!=pCsr; pp=&((*pp)->pCsrNext));
9786 *pp = pCsr->pCsrNext;
9787
9788 sqlite3_free(pCsr);
9789 return SQLITE_OK;
9790 }
9791
9792 /*
9793 ** Set the error message for the virtual table associated with cursor
9794 ** pCsr to the results of vprintf(zFmt, ...).
9795 */
zipfileTableErr(ZipfileTab * pTab,const char * zFmt,...)9796 static void zipfileTableErr(ZipfileTab *pTab, const char *zFmt, ...){
9797 va_list ap;
9798 va_start(ap, zFmt);
9799 sqlite3_free(pTab->base.zErrMsg);
9800 pTab->base.zErrMsg = sqlite3_vmprintf(zFmt, ap);
9801 va_end(ap);
9802 }
zipfileCursorErr(ZipfileCsr * pCsr,const char * zFmt,...)9803 static void zipfileCursorErr(ZipfileCsr *pCsr, const char *zFmt, ...){
9804 va_list ap;
9805 va_start(ap, zFmt);
9806 sqlite3_free(pCsr->base.pVtab->zErrMsg);
9807 pCsr->base.pVtab->zErrMsg = sqlite3_vmprintf(zFmt, ap);
9808 va_end(ap);
9809 }
9810
9811 /*
9812 ** Read nRead bytes of data from offset iOff of file pFile into buffer
9813 ** aRead[]. Return SQLITE_OK if successful, or an SQLite error code
9814 ** otherwise.
9815 **
9816 ** If an error does occur, output variable (*pzErrmsg) may be set to point
9817 ** to an English language error message. It is the responsibility of the
9818 ** caller to eventually free this buffer using
9819 ** sqlite3_free().
9820 */
zipfileReadData(FILE * pFile,u8 * aRead,int nRead,i64 iOff,char ** pzErrmsg)9821 static int zipfileReadData(
9822 FILE *pFile, /* Read from this file */
9823 u8 *aRead, /* Read into this buffer */
9824 int nRead, /* Number of bytes to read */
9825 i64 iOff, /* Offset to read from */
9826 char **pzErrmsg /* OUT: Error message (from sqlite3_malloc) */
9827 ){
9828 size_t n;
9829 fseek(pFile, (long)iOff, SEEK_SET);
9830 n = fread(aRead, 1, nRead, pFile);
9831 if( (int)n!=nRead ){
9832 *pzErrmsg = sqlite3_mprintf("error in fread()");
9833 return SQLITE_ERROR;
9834 }
9835 return SQLITE_OK;
9836 }
9837
zipfileAppendData(ZipfileTab * pTab,const u8 * aWrite,int nWrite)9838 static int zipfileAppendData(
9839 ZipfileTab *pTab,
9840 const u8 *aWrite,
9841 int nWrite
9842 ){
9843 if( nWrite>0 ){
9844 size_t n = nWrite;
9845 fseek(pTab->pWriteFd, (long)pTab->szCurrent, SEEK_SET);
9846 n = fwrite(aWrite, 1, nWrite, pTab->pWriteFd);
9847 if( (int)n!=nWrite ){
9848 pTab->base.zErrMsg = sqlite3_mprintf("error in fwrite()");
9849 return SQLITE_ERROR;
9850 }
9851 pTab->szCurrent += nWrite;
9852 }
9853 return SQLITE_OK;
9854 }
9855
9856 /*
9857 ** Read and return a 16-bit little-endian unsigned integer from buffer aBuf.
9858 */
zipfileGetU16(const u8 * aBuf)9859 static u16 zipfileGetU16(const u8 *aBuf){
9860 return (aBuf[1] << 8) + aBuf[0];
9861 }
9862
9863 /*
9864 ** Read and return a 32-bit little-endian unsigned integer from buffer aBuf.
9865 */
zipfileGetU32(const u8 * aBuf)9866 static u32 zipfileGetU32(const u8 *aBuf){
9867 if( aBuf==0 ) return 0;
9868 return ((u32)(aBuf[3]) << 24)
9869 + ((u32)(aBuf[2]) << 16)
9870 + ((u32)(aBuf[1]) << 8)
9871 + ((u32)(aBuf[0]) << 0);
9872 }
9873
9874 /*
9875 ** Write a 16-bit little endiate integer into buffer aBuf.
9876 */
zipfilePutU16(u8 * aBuf,u16 val)9877 static void zipfilePutU16(u8 *aBuf, u16 val){
9878 aBuf[0] = val & 0xFF;
9879 aBuf[1] = (val>>8) & 0xFF;
9880 }
9881
9882 /*
9883 ** Write a 32-bit little endiate integer into buffer aBuf.
9884 */
zipfilePutU32(u8 * aBuf,u32 val)9885 static void zipfilePutU32(u8 *aBuf, u32 val){
9886 aBuf[0] = val & 0xFF;
9887 aBuf[1] = (val>>8) & 0xFF;
9888 aBuf[2] = (val>>16) & 0xFF;
9889 aBuf[3] = (val>>24) & 0xFF;
9890 }
9891
9892 #define zipfileRead32(aBuf) ( aBuf+=4, zipfileGetU32(aBuf-4) )
9893 #define zipfileRead16(aBuf) ( aBuf+=2, zipfileGetU16(aBuf-2) )
9894
9895 #define zipfileWrite32(aBuf,val) { zipfilePutU32(aBuf,val); aBuf+=4; }
9896 #define zipfileWrite16(aBuf,val) { zipfilePutU16(aBuf,val); aBuf+=2; }
9897
9898 /*
9899 ** Magic numbers used to read CDS records.
9900 */
9901 #define ZIPFILE_CDS_NFILE_OFF 28
9902 #define ZIPFILE_CDS_SZCOMPRESSED_OFF 20
9903
9904 /*
9905 ** Decode the CDS record in buffer aBuf into (*pCDS). Return SQLITE_ERROR
9906 ** if the record is not well-formed, or SQLITE_OK otherwise.
9907 */
zipfileReadCDS(u8 * aBuf,ZipfileCDS * pCDS)9908 static int zipfileReadCDS(u8 *aBuf, ZipfileCDS *pCDS){
9909 u8 *aRead = aBuf;
9910 u32 sig = zipfileRead32(aRead);
9911 int rc = SQLITE_OK;
9912 if( sig!=ZIPFILE_SIGNATURE_CDS ){
9913 rc = SQLITE_ERROR;
9914 }else{
9915 pCDS->iVersionMadeBy = zipfileRead16(aRead);
9916 pCDS->iVersionExtract = zipfileRead16(aRead);
9917 pCDS->flags = zipfileRead16(aRead);
9918 pCDS->iCompression = zipfileRead16(aRead);
9919 pCDS->mTime = zipfileRead16(aRead);
9920 pCDS->mDate = zipfileRead16(aRead);
9921 pCDS->crc32 = zipfileRead32(aRead);
9922 pCDS->szCompressed = zipfileRead32(aRead);
9923 pCDS->szUncompressed = zipfileRead32(aRead);
9924 assert( aRead==&aBuf[ZIPFILE_CDS_NFILE_OFF] );
9925 pCDS->nFile = zipfileRead16(aRead);
9926 pCDS->nExtra = zipfileRead16(aRead);
9927 pCDS->nComment = zipfileRead16(aRead);
9928 pCDS->iDiskStart = zipfileRead16(aRead);
9929 pCDS->iInternalAttr = zipfileRead16(aRead);
9930 pCDS->iExternalAttr = zipfileRead32(aRead);
9931 pCDS->iOffset = zipfileRead32(aRead);
9932 assert( aRead==&aBuf[ZIPFILE_CDS_FIXED_SZ] );
9933 }
9934
9935 return rc;
9936 }
9937
9938 /*
9939 ** Decode the LFH record in buffer aBuf into (*pLFH). Return SQLITE_ERROR
9940 ** if the record is not well-formed, or SQLITE_OK otherwise.
9941 */
zipfileReadLFH(u8 * aBuffer,ZipfileLFH * pLFH)9942 static int zipfileReadLFH(
9943 u8 *aBuffer,
9944 ZipfileLFH *pLFH
9945 ){
9946 u8 *aRead = aBuffer;
9947 int rc = SQLITE_OK;
9948
9949 u32 sig = zipfileRead32(aRead);
9950 if( sig!=ZIPFILE_SIGNATURE_LFH ){
9951 rc = SQLITE_ERROR;
9952 }else{
9953 pLFH->iVersionExtract = zipfileRead16(aRead);
9954 pLFH->flags = zipfileRead16(aRead);
9955 pLFH->iCompression = zipfileRead16(aRead);
9956 pLFH->mTime = zipfileRead16(aRead);
9957 pLFH->mDate = zipfileRead16(aRead);
9958 pLFH->crc32 = zipfileRead32(aRead);
9959 pLFH->szCompressed = zipfileRead32(aRead);
9960 pLFH->szUncompressed = zipfileRead32(aRead);
9961 pLFH->nFile = zipfileRead16(aRead);
9962 pLFH->nExtra = zipfileRead16(aRead);
9963 }
9964 return rc;
9965 }
9966
9967
9968 /*
9969 ** Buffer aExtra (size nExtra bytes) contains zip archive "extra" fields.
9970 ** Scan through this buffer to find an "extra-timestamp" field. If one
9971 ** exists, extract the 32-bit modification-timestamp from it and store
9972 ** the value in output parameter *pmTime.
9973 **
9974 ** Zero is returned if no extra-timestamp record could be found (and so
9975 ** *pmTime is left unchanged), or non-zero otherwise.
9976 **
9977 ** The general format of an extra field is:
9978 **
9979 ** Header ID 2 bytes
9980 ** Data Size 2 bytes
9981 ** Data N bytes
9982 */
zipfileScanExtra(u8 * aExtra,int nExtra,u32 * pmTime)9983 static int zipfileScanExtra(u8 *aExtra, int nExtra, u32 *pmTime){
9984 int ret = 0;
9985 u8 *p = aExtra;
9986 u8 *pEnd = &aExtra[nExtra];
9987
9988 while( p<pEnd ){
9989 u16 id = zipfileRead16(p);
9990 u16 nByte = zipfileRead16(p);
9991
9992 switch( id ){
9993 case ZIPFILE_EXTRA_TIMESTAMP: {
9994 u8 b = p[0];
9995 if( b & 0x01 ){ /* 0x01 -> modtime is present */
9996 *pmTime = zipfileGetU32(&p[1]);
9997 ret = 1;
9998 }
9999 break;
10000 }
10001 }
10002
10003 p += nByte;
10004 }
10005 return ret;
10006 }
10007
10008 /*
10009 ** Convert the standard MS-DOS timestamp stored in the mTime and mDate
10010 ** fields of the CDS structure passed as the only argument to a 32-bit
10011 ** UNIX seconds-since-the-epoch timestamp. Return the result.
10012 **
10013 ** "Standard" MS-DOS time format:
10014 **
10015 ** File modification time:
10016 ** Bits 00-04: seconds divided by 2
10017 ** Bits 05-10: minute
10018 ** Bits 11-15: hour
10019 ** File modification date:
10020 ** Bits 00-04: day
10021 ** Bits 05-08: month (1-12)
10022 ** Bits 09-15: years from 1980
10023 **
10024 ** https://msdn.microsoft.com/en-us/library/9kkf9tah.aspx
10025 */
zipfileMtime(ZipfileCDS * pCDS)10026 static u32 zipfileMtime(ZipfileCDS *pCDS){
10027 int Y,M,D,X1,X2,A,B,sec,min,hr;
10028 i64 JDsec;
10029 Y = (1980 + ((pCDS->mDate >> 9) & 0x7F));
10030 M = ((pCDS->mDate >> 5) & 0x0F);
10031 D = (pCDS->mDate & 0x1F);
10032 sec = (pCDS->mTime & 0x1F)*2;
10033 min = (pCDS->mTime >> 5) & 0x3F;
10034 hr = (pCDS->mTime >> 11) & 0x1F;
10035 if( M<=2 ){
10036 Y--;
10037 M += 12;
10038 }
10039 X1 = 36525*(Y+4716)/100;
10040 X2 = 306001*(M+1)/10000;
10041 A = Y/100;
10042 B = 2 - A + (A/4);
10043 JDsec = (i64)((X1 + X2 + D + B - 1524.5)*86400) + hr*3600 + min*60 + sec;
10044 return (u32)(JDsec - (i64)24405875*(i64)8640);
10045 }
10046
10047 /*
10048 ** The opposite of zipfileMtime(). This function populates the mTime and
10049 ** mDate fields of the CDS structure passed as the first argument according
10050 ** to the UNIX timestamp value passed as the second.
10051 */
zipfileMtimeToDos(ZipfileCDS * pCds,u32 mUnixTime)10052 static void zipfileMtimeToDos(ZipfileCDS *pCds, u32 mUnixTime){
10053 /* Convert unix timestamp to JD (2440588 is noon on 1/1/1970) */
10054 i64 JD = (i64)2440588 + mUnixTime / (24*60*60);
10055
10056 int A, B, C, D, E;
10057 int yr, mon, day;
10058 int hr, min, sec;
10059
10060 A = (int)((JD - 1867216.25)/36524.25);
10061 A = (int)(JD + 1 + A - (A/4));
10062 B = A + 1524;
10063 C = (int)((B - 122.1)/365.25);
10064 D = (36525*(C&32767))/100;
10065 E = (int)((B-D)/30.6001);
10066
10067 day = B - D - (int)(30.6001*E);
10068 mon = (E<14 ? E-1 : E-13);
10069 yr = mon>2 ? C-4716 : C-4715;
10070
10071 hr = (mUnixTime % (24*60*60)) / (60*60);
10072 min = (mUnixTime % (60*60)) / 60;
10073 sec = (mUnixTime % 60);
10074
10075 if( yr>=1980 ){
10076 pCds->mDate = (u16)(day + (mon << 5) + ((yr-1980) << 9));
10077 pCds->mTime = (u16)(sec/2 + (min<<5) + (hr<<11));
10078 }else{
10079 pCds->mDate = pCds->mTime = 0;
10080 }
10081
10082 assert( mUnixTime<315507600
10083 || mUnixTime==zipfileMtime(pCds)
10084 || ((mUnixTime % 2) && mUnixTime-1==zipfileMtime(pCds))
10085 /* || (mUnixTime % 2) */
10086 );
10087 }
10088
10089 /*
10090 ** If aBlob is not NULL, then it is a pointer to a buffer (nBlob bytes in
10091 ** size) containing an entire zip archive image. Or, if aBlob is NULL,
10092 ** then pFile is a file-handle open on a zip file. In either case, this
10093 ** function creates a ZipfileEntry object based on the zip archive entry
10094 ** for which the CDS record is at offset iOff.
10095 **
10096 ** If successful, SQLITE_OK is returned and (*ppEntry) set to point to
10097 ** the new object. Otherwise, an SQLite error code is returned and the
10098 ** final value of (*ppEntry) undefined.
10099 */
zipfileGetEntry(ZipfileTab * pTab,const u8 * aBlob,int nBlob,FILE * pFile,i64 iOff,ZipfileEntry ** ppEntry)10100 static int zipfileGetEntry(
10101 ZipfileTab *pTab, /* Store any error message here */
10102 const u8 *aBlob, /* Pointer to in-memory file image */
10103 int nBlob, /* Size of aBlob[] in bytes */
10104 FILE *pFile, /* If aBlob==0, read from this file */
10105 i64 iOff, /* Offset of CDS record */
10106 ZipfileEntry **ppEntry /* OUT: Pointer to new object */
10107 ){
10108 u8 *aRead;
10109 char **pzErr = &pTab->base.zErrMsg;
10110 int rc = SQLITE_OK;
10111 (void)nBlob;
10112
10113 if( aBlob==0 ){
10114 aRead = pTab->aBuffer;
10115 rc = zipfileReadData(pFile, aRead, ZIPFILE_CDS_FIXED_SZ, iOff, pzErr);
10116 }else{
10117 aRead = (u8*)&aBlob[iOff];
10118 }
10119
10120 if( rc==SQLITE_OK ){
10121 sqlite3_int64 nAlloc;
10122 ZipfileEntry *pNew;
10123
10124 int nFile = zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF]);
10125 int nExtra = zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF+2]);
10126 nExtra += zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF+4]);
10127
10128 nAlloc = sizeof(ZipfileEntry) + nExtra;
10129 if( aBlob ){
10130 nAlloc += zipfileGetU32(&aRead[ZIPFILE_CDS_SZCOMPRESSED_OFF]);
10131 }
10132
10133 pNew = (ZipfileEntry*)sqlite3_malloc64(nAlloc);
10134 if( pNew==0 ){
10135 rc = SQLITE_NOMEM;
10136 }else{
10137 memset(pNew, 0, sizeof(ZipfileEntry));
10138 rc = zipfileReadCDS(aRead, &pNew->cds);
10139 if( rc!=SQLITE_OK ){
10140 *pzErr = sqlite3_mprintf("failed to read CDS at offset %lld", iOff);
10141 }else if( aBlob==0 ){
10142 rc = zipfileReadData(
10143 pFile, aRead, nExtra+nFile, iOff+ZIPFILE_CDS_FIXED_SZ, pzErr
10144 );
10145 }else{
10146 aRead = (u8*)&aBlob[iOff + ZIPFILE_CDS_FIXED_SZ];
10147 }
10148 }
10149
10150 if( rc==SQLITE_OK ){
10151 u32 *pt = &pNew->mUnixTime;
10152 pNew->cds.zFile = sqlite3_mprintf("%.*s", nFile, aRead);
10153 pNew->aExtra = (u8*)&pNew[1];
10154 memcpy(pNew->aExtra, &aRead[nFile], nExtra);
10155 if( pNew->cds.zFile==0 ){
10156 rc = SQLITE_NOMEM;
10157 }else if( 0==zipfileScanExtra(&aRead[nFile], pNew->cds.nExtra, pt) ){
10158 pNew->mUnixTime = zipfileMtime(&pNew->cds);
10159 }
10160 }
10161
10162 if( rc==SQLITE_OK ){
10163 static const int szFix = ZIPFILE_LFH_FIXED_SZ;
10164 ZipfileLFH lfh;
10165 if( pFile ){
10166 rc = zipfileReadData(pFile, aRead, szFix, pNew->cds.iOffset, pzErr);
10167 }else{
10168 aRead = (u8*)&aBlob[pNew->cds.iOffset];
10169 }
10170
10171 if( rc==SQLITE_OK ) rc = zipfileReadLFH(aRead, &lfh);
10172 if( rc==SQLITE_OK ){
10173 pNew->iDataOff = pNew->cds.iOffset + ZIPFILE_LFH_FIXED_SZ;
10174 pNew->iDataOff += lfh.nFile + lfh.nExtra;
10175 if( aBlob && pNew->cds.szCompressed ){
10176 pNew->aData = &pNew->aExtra[nExtra];
10177 memcpy(pNew->aData, &aBlob[pNew->iDataOff], pNew->cds.szCompressed);
10178 }
10179 }else{
10180 *pzErr = sqlite3_mprintf("failed to read LFH at offset %d",
10181 (int)pNew->cds.iOffset
10182 );
10183 }
10184 }
10185
10186 if( rc!=SQLITE_OK ){
10187 zipfileEntryFree(pNew);
10188 }else{
10189 *ppEntry = pNew;
10190 }
10191 }
10192
10193 return rc;
10194 }
10195
10196 /*
10197 ** Advance an ZipfileCsr to its next row of output.
10198 */
zipfileNext(sqlite3_vtab_cursor * cur)10199 static int zipfileNext(sqlite3_vtab_cursor *cur){
10200 ZipfileCsr *pCsr = (ZipfileCsr*)cur;
10201 int rc = SQLITE_OK;
10202
10203 if( pCsr->pFile ){
10204 i64 iEof = pCsr->eocd.iOffset + pCsr->eocd.nSize;
10205 zipfileEntryFree(pCsr->pCurrent);
10206 pCsr->pCurrent = 0;
10207 if( pCsr->iNextOff>=iEof ){
10208 pCsr->bEof = 1;
10209 }else{
10210 ZipfileEntry *p = 0;
10211 ZipfileTab *pTab = (ZipfileTab*)(cur->pVtab);
10212 rc = zipfileGetEntry(pTab, 0, 0, pCsr->pFile, pCsr->iNextOff, &p);
10213 if( rc==SQLITE_OK ){
10214 pCsr->iNextOff += ZIPFILE_CDS_FIXED_SZ;
10215 pCsr->iNextOff += (int)p->cds.nExtra + p->cds.nFile + p->cds.nComment;
10216 }
10217 pCsr->pCurrent = p;
10218 }
10219 }else{
10220 if( !pCsr->bNoop ){
10221 pCsr->pCurrent = pCsr->pCurrent->pNext;
10222 }
10223 if( pCsr->pCurrent==0 ){
10224 pCsr->bEof = 1;
10225 }
10226 }
10227
10228 pCsr->bNoop = 0;
10229 return rc;
10230 }
10231
zipfileFree(void * p)10232 static void zipfileFree(void *p) {
10233 sqlite3_free(p);
10234 }
10235
10236 /*
10237 ** Buffer aIn (size nIn bytes) contains compressed data. Uncompressed, the
10238 ** size is nOut bytes. This function uncompresses the data and sets the
10239 ** return value in context pCtx to the result (a blob).
10240 **
10241 ** If an error occurs, an error code is left in pCtx instead.
10242 */
zipfileInflate(sqlite3_context * pCtx,const u8 * aIn,int nIn,int nOut)10243 static void zipfileInflate(
10244 sqlite3_context *pCtx, /* Store result here */
10245 const u8 *aIn, /* Compressed data */
10246 int nIn, /* Size of buffer aIn[] in bytes */
10247 int nOut /* Expected output size */
10248 ){
10249 u8 *aRes = sqlite3_malloc(nOut);
10250 if( aRes==0 ){
10251 sqlite3_result_error_nomem(pCtx);
10252 }else{
10253 int err;
10254 z_stream str;
10255 memset(&str, 0, sizeof(str));
10256
10257 str.next_in = (Byte*)aIn;
10258 str.avail_in = nIn;
10259 str.next_out = (Byte*)aRes;
10260 str.avail_out = nOut;
10261
10262 err = inflateInit2(&str, -15);
10263 if( err!=Z_OK ){
10264 zipfileCtxErrorMsg(pCtx, "inflateInit2() failed (%d)", err);
10265 }else{
10266 err = inflate(&str, Z_NO_FLUSH);
10267 if( err!=Z_STREAM_END ){
10268 zipfileCtxErrorMsg(pCtx, "inflate() failed (%d)", err);
10269 }else{
10270 sqlite3_result_blob(pCtx, aRes, nOut, zipfileFree);
10271 aRes = 0;
10272 }
10273 }
10274 sqlite3_free(aRes);
10275 inflateEnd(&str);
10276 }
10277 }
10278
10279 /*
10280 ** Buffer aIn (size nIn bytes) contains uncompressed data. This function
10281 ** compresses it and sets (*ppOut) to point to a buffer containing the
10282 ** compressed data. The caller is responsible for eventually calling
10283 ** sqlite3_free() to release buffer (*ppOut). Before returning, (*pnOut)
10284 ** is set to the size of buffer (*ppOut) in bytes.
10285 **
10286 ** If no error occurs, SQLITE_OK is returned. Otherwise, an SQLite error
10287 ** code is returned and an error message left in virtual-table handle
10288 ** pTab. The values of (*ppOut) and (*pnOut) are left unchanged in this
10289 ** case.
10290 */
zipfileDeflate(const u8 * aIn,int nIn,u8 ** ppOut,int * pnOut,char ** pzErr)10291 static int zipfileDeflate(
10292 const u8 *aIn, int nIn, /* Input */
10293 u8 **ppOut, int *pnOut, /* Output */
10294 char **pzErr /* OUT: Error message */
10295 ){
10296 int rc = SQLITE_OK;
10297 sqlite3_int64 nAlloc;
10298 z_stream str;
10299 u8 *aOut;
10300
10301 memset(&str, 0, sizeof(str));
10302 str.next_in = (Bytef*)aIn;
10303 str.avail_in = nIn;
10304 deflateInit2(&str, 9, Z_DEFLATED, -15, 8, Z_DEFAULT_STRATEGY);
10305
10306 nAlloc = deflateBound(&str, nIn);
10307 aOut = (u8*)sqlite3_malloc64(nAlloc);
10308 if( aOut==0 ){
10309 rc = SQLITE_NOMEM;
10310 }else{
10311 int res;
10312 str.next_out = aOut;
10313 str.avail_out = nAlloc;
10314 res = deflate(&str, Z_FINISH);
10315 if( res==Z_STREAM_END ){
10316 *ppOut = aOut;
10317 *pnOut = (int)str.total_out;
10318 }else{
10319 sqlite3_free(aOut);
10320 *pzErr = sqlite3_mprintf("zipfile: deflate() error");
10321 rc = SQLITE_ERROR;
10322 }
10323 deflateEnd(&str);
10324 }
10325
10326 return rc;
10327 }
10328
10329
10330 /*
10331 ** Return values of columns for the row at which the series_cursor
10332 ** is currently pointing.
10333 */
zipfileColumn(sqlite3_vtab_cursor * cur,sqlite3_context * ctx,int i)10334 static int zipfileColumn(
10335 sqlite3_vtab_cursor *cur, /* The cursor */
10336 sqlite3_context *ctx, /* First argument to sqlite3_result_...() */
10337 int i /* Which column to return */
10338 ){
10339 ZipfileCsr *pCsr = (ZipfileCsr*)cur;
10340 ZipfileCDS *pCDS = &pCsr->pCurrent->cds;
10341 int rc = SQLITE_OK;
10342 switch( i ){
10343 case 0: /* name */
10344 sqlite3_result_text(ctx, pCDS->zFile, -1, SQLITE_TRANSIENT);
10345 break;
10346 case 1: /* mode */
10347 /* TODO: Whether or not the following is correct surely depends on
10348 ** the platform on which the archive was created. */
10349 sqlite3_result_int(ctx, pCDS->iExternalAttr >> 16);
10350 break;
10351 case 2: { /* mtime */
10352 sqlite3_result_int64(ctx, pCsr->pCurrent->mUnixTime);
10353 break;
10354 }
10355 case 3: { /* sz */
10356 if( sqlite3_vtab_nochange(ctx)==0 ){
10357 sqlite3_result_int64(ctx, pCDS->szUncompressed);
10358 }
10359 break;
10360 }
10361 case 4: /* rawdata */
10362 if( sqlite3_vtab_nochange(ctx) ) break;
10363 case 5: { /* data */
10364 if( i==4 || pCDS->iCompression==0 || pCDS->iCompression==8 ){
10365 int sz = pCDS->szCompressed;
10366 int szFinal = pCDS->szUncompressed;
10367 if( szFinal>0 ){
10368 u8 *aBuf;
10369 u8 *aFree = 0;
10370 if( pCsr->pCurrent->aData ){
10371 aBuf = pCsr->pCurrent->aData;
10372 }else{
10373 aBuf = aFree = sqlite3_malloc64(sz);
10374 if( aBuf==0 ){
10375 rc = SQLITE_NOMEM;
10376 }else{
10377 FILE *pFile = pCsr->pFile;
10378 if( pFile==0 ){
10379 pFile = ((ZipfileTab*)(pCsr->base.pVtab))->pWriteFd;
10380 }
10381 rc = zipfileReadData(pFile, aBuf, sz, pCsr->pCurrent->iDataOff,
10382 &pCsr->base.pVtab->zErrMsg
10383 );
10384 }
10385 }
10386 if( rc==SQLITE_OK ){
10387 if( i==5 && pCDS->iCompression ){
10388 zipfileInflate(ctx, aBuf, sz, szFinal);
10389 }else{
10390 sqlite3_result_blob(ctx, aBuf, sz, SQLITE_TRANSIENT);
10391 }
10392 }
10393 sqlite3_free(aFree);
10394 }else{
10395 /* Figure out if this is a directory or a zero-sized file. Consider
10396 ** it to be a directory either if the mode suggests so, or if
10397 ** the final character in the name is '/'. */
10398 u32 mode = pCDS->iExternalAttr >> 16;
10399 if( !(mode & S_IFDIR)
10400 && pCDS->nFile>=1
10401 && pCDS->zFile[pCDS->nFile-1]!='/'
10402 ){
10403 sqlite3_result_blob(ctx, "", 0, SQLITE_STATIC);
10404 }
10405 }
10406 }
10407 break;
10408 }
10409 case 6: /* method */
10410 sqlite3_result_int(ctx, pCDS->iCompression);
10411 break;
10412 default: /* z */
10413 assert( i==7 );
10414 sqlite3_result_int64(ctx, pCsr->iId);
10415 break;
10416 }
10417
10418 return rc;
10419 }
10420
10421 /*
10422 ** Return TRUE if the cursor is at EOF.
10423 */
zipfileEof(sqlite3_vtab_cursor * cur)10424 static int zipfileEof(sqlite3_vtab_cursor *cur){
10425 ZipfileCsr *pCsr = (ZipfileCsr*)cur;
10426 return pCsr->bEof;
10427 }
10428
10429 /*
10430 ** If aBlob is not NULL, then it points to a buffer nBlob bytes in size
10431 ** containing an entire zip archive image. Or, if aBlob is NULL, then pFile
10432 ** is guaranteed to be a file-handle open on a zip file.
10433 **
10434 ** This function attempts to locate the EOCD record within the zip archive
10435 ** and populate *pEOCD with the results of decoding it. SQLITE_OK is
10436 ** returned if successful. Otherwise, an SQLite error code is returned and
10437 ** an English language error message may be left in virtual-table pTab.
10438 */
zipfileReadEOCD(ZipfileTab * pTab,const u8 * aBlob,int nBlob,FILE * pFile,ZipfileEOCD * pEOCD)10439 static int zipfileReadEOCD(
10440 ZipfileTab *pTab, /* Return errors here */
10441 const u8 *aBlob, /* Pointer to in-memory file image */
10442 int nBlob, /* Size of aBlob[] in bytes */
10443 FILE *pFile, /* Read from this file if aBlob==0 */
10444 ZipfileEOCD *pEOCD /* Object to populate */
10445 ){
10446 u8 *aRead = pTab->aBuffer; /* Temporary buffer */
10447 int nRead; /* Bytes to read from file */
10448 int rc = SQLITE_OK;
10449
10450 memset(pEOCD, 0, sizeof(ZipfileEOCD));
10451 if( aBlob==0 ){
10452 i64 iOff; /* Offset to read from */
10453 i64 szFile; /* Total size of file in bytes */
10454 fseek(pFile, 0, SEEK_END);
10455 szFile = (i64)ftell(pFile);
10456 if( szFile==0 ){
10457 return SQLITE_OK;
10458 }
10459 nRead = (int)(MIN(szFile, ZIPFILE_BUFFER_SIZE));
10460 iOff = szFile - nRead;
10461 rc = zipfileReadData(pFile, aRead, nRead, iOff, &pTab->base.zErrMsg);
10462 }else{
10463 nRead = (int)(MIN(nBlob, ZIPFILE_BUFFER_SIZE));
10464 aRead = (u8*)&aBlob[nBlob-nRead];
10465 }
10466
10467 if( rc==SQLITE_OK ){
10468 int i;
10469
10470 /* Scan backwards looking for the signature bytes */
10471 for(i=nRead-20; i>=0; i--){
10472 if( aRead[i]==0x50 && aRead[i+1]==0x4b
10473 && aRead[i+2]==0x05 && aRead[i+3]==0x06
10474 ){
10475 break;
10476 }
10477 }
10478 if( i<0 ){
10479 pTab->base.zErrMsg = sqlite3_mprintf(
10480 "cannot find end of central directory record"
10481 );
10482 return SQLITE_ERROR;
10483 }
10484
10485 aRead += i+4;
10486 pEOCD->iDisk = zipfileRead16(aRead);
10487 pEOCD->iFirstDisk = zipfileRead16(aRead);
10488 pEOCD->nEntry = zipfileRead16(aRead);
10489 pEOCD->nEntryTotal = zipfileRead16(aRead);
10490 pEOCD->nSize = zipfileRead32(aRead);
10491 pEOCD->iOffset = zipfileRead32(aRead);
10492 }
10493
10494 return rc;
10495 }
10496
10497 /*
10498 ** Add object pNew to the linked list that begins at ZipfileTab.pFirstEntry
10499 ** and ends with pLastEntry. If argument pBefore is NULL, then pNew is added
10500 ** to the end of the list. Otherwise, it is added to the list immediately
10501 ** before pBefore (which is guaranteed to be a part of said list).
10502 */
zipfileAddEntry(ZipfileTab * pTab,ZipfileEntry * pBefore,ZipfileEntry * pNew)10503 static void zipfileAddEntry(
10504 ZipfileTab *pTab,
10505 ZipfileEntry *pBefore,
10506 ZipfileEntry *pNew
10507 ){
10508 assert( (pTab->pFirstEntry==0)==(pTab->pLastEntry==0) );
10509 assert( pNew->pNext==0 );
10510 if( pBefore==0 ){
10511 if( pTab->pFirstEntry==0 ){
10512 pTab->pFirstEntry = pTab->pLastEntry = pNew;
10513 }else{
10514 assert( pTab->pLastEntry->pNext==0 );
10515 pTab->pLastEntry->pNext = pNew;
10516 pTab->pLastEntry = pNew;
10517 }
10518 }else{
10519 ZipfileEntry **pp;
10520 for(pp=&pTab->pFirstEntry; *pp!=pBefore; pp=&((*pp)->pNext));
10521 pNew->pNext = pBefore;
10522 *pp = pNew;
10523 }
10524 }
10525
zipfileLoadDirectory(ZipfileTab * pTab,const u8 * aBlob,int nBlob)10526 static int zipfileLoadDirectory(ZipfileTab *pTab, const u8 *aBlob, int nBlob){
10527 ZipfileEOCD eocd;
10528 int rc;
10529 int i;
10530 i64 iOff;
10531
10532 rc = zipfileReadEOCD(pTab, aBlob, nBlob, pTab->pWriteFd, &eocd);
10533 iOff = eocd.iOffset;
10534 for(i=0; rc==SQLITE_OK && i<eocd.nEntry; i++){
10535 ZipfileEntry *pNew = 0;
10536 rc = zipfileGetEntry(pTab, aBlob, nBlob, pTab->pWriteFd, iOff, &pNew);
10537
10538 if( rc==SQLITE_OK ){
10539 zipfileAddEntry(pTab, 0, pNew);
10540 iOff += ZIPFILE_CDS_FIXED_SZ;
10541 iOff += (int)pNew->cds.nExtra + pNew->cds.nFile + pNew->cds.nComment;
10542 }
10543 }
10544 return rc;
10545 }
10546
10547 /*
10548 ** xFilter callback.
10549 */
zipfileFilter(sqlite3_vtab_cursor * cur,int idxNum,const char * idxStr,int argc,sqlite3_value ** argv)10550 static int zipfileFilter(
10551 sqlite3_vtab_cursor *cur,
10552 int idxNum, const char *idxStr,
10553 int argc, sqlite3_value **argv
10554 ){
10555 ZipfileTab *pTab = (ZipfileTab*)cur->pVtab;
10556 ZipfileCsr *pCsr = (ZipfileCsr*)cur;
10557 const char *zFile = 0; /* Zip file to scan */
10558 int rc = SQLITE_OK; /* Return Code */
10559 int bInMemory = 0; /* True for an in-memory zipfile */
10560
10561 (void)idxStr;
10562 (void)argc;
10563
10564 zipfileResetCursor(pCsr);
10565
10566 if( pTab->zFile ){
10567 zFile = pTab->zFile;
10568 }else if( idxNum==0 ){
10569 zipfileCursorErr(pCsr, "zipfile() function requires an argument");
10570 return SQLITE_ERROR;
10571 }else if( sqlite3_value_type(argv[0])==SQLITE_BLOB ){
10572 static const u8 aEmptyBlob = 0;
10573 const u8 *aBlob = (const u8*)sqlite3_value_blob(argv[0]);
10574 int nBlob = sqlite3_value_bytes(argv[0]);
10575 assert( pTab->pFirstEntry==0 );
10576 if( aBlob==0 ){
10577 aBlob = &aEmptyBlob;
10578 nBlob = 0;
10579 }
10580 rc = zipfileLoadDirectory(pTab, aBlob, nBlob);
10581 pCsr->pFreeEntry = pTab->pFirstEntry;
10582 pTab->pFirstEntry = pTab->pLastEntry = 0;
10583 if( rc!=SQLITE_OK ) return rc;
10584 bInMemory = 1;
10585 }else{
10586 zFile = (const char*)sqlite3_value_text(argv[0]);
10587 }
10588
10589 if( 0==pTab->pWriteFd && 0==bInMemory ){
10590 pCsr->pFile = zFile ? fopen(zFile, "rb") : 0;
10591 if( pCsr->pFile==0 ){
10592 zipfileCursorErr(pCsr, "cannot open file: %s", zFile);
10593 rc = SQLITE_ERROR;
10594 }else{
10595 rc = zipfileReadEOCD(pTab, 0, 0, pCsr->pFile, &pCsr->eocd);
10596 if( rc==SQLITE_OK ){
10597 if( pCsr->eocd.nEntry==0 ){
10598 pCsr->bEof = 1;
10599 }else{
10600 pCsr->iNextOff = pCsr->eocd.iOffset;
10601 rc = zipfileNext(cur);
10602 }
10603 }
10604 }
10605 }else{
10606 pCsr->bNoop = 1;
10607 pCsr->pCurrent = pCsr->pFreeEntry ? pCsr->pFreeEntry : pTab->pFirstEntry;
10608 rc = zipfileNext(cur);
10609 }
10610
10611 return rc;
10612 }
10613
10614 /*
10615 ** xBestIndex callback.
10616 */
zipfileBestIndex(sqlite3_vtab * tab,sqlite3_index_info * pIdxInfo)10617 static int zipfileBestIndex(
10618 sqlite3_vtab *tab,
10619 sqlite3_index_info *pIdxInfo
10620 ){
10621 int i;
10622 int idx = -1;
10623 int unusable = 0;
10624 (void)tab;
10625
10626 for(i=0; i<pIdxInfo->nConstraint; i++){
10627 const struct sqlite3_index_constraint *pCons = &pIdxInfo->aConstraint[i];
10628 if( pCons->iColumn!=ZIPFILE_F_COLUMN_IDX ) continue;
10629 if( pCons->usable==0 ){
10630 unusable = 1;
10631 }else if( pCons->op==SQLITE_INDEX_CONSTRAINT_EQ ){
10632 idx = i;
10633 }
10634 }
10635 pIdxInfo->estimatedCost = 1000.0;
10636 if( idx>=0 ){
10637 pIdxInfo->aConstraintUsage[idx].argvIndex = 1;
10638 pIdxInfo->aConstraintUsage[idx].omit = 1;
10639 pIdxInfo->idxNum = 1;
10640 }else if( unusable ){
10641 return SQLITE_CONSTRAINT;
10642 }
10643 return SQLITE_OK;
10644 }
10645
zipfileNewEntry(const char * zPath)10646 static ZipfileEntry *zipfileNewEntry(const char *zPath){
10647 ZipfileEntry *pNew;
10648 pNew = sqlite3_malloc(sizeof(ZipfileEntry));
10649 if( pNew ){
10650 memset(pNew, 0, sizeof(ZipfileEntry));
10651 pNew->cds.zFile = sqlite3_mprintf("%s", zPath);
10652 if( pNew->cds.zFile==0 ){
10653 sqlite3_free(pNew);
10654 pNew = 0;
10655 }
10656 }
10657 return pNew;
10658 }
10659
zipfileSerializeLFH(ZipfileEntry * pEntry,u8 * aBuf)10660 static int zipfileSerializeLFH(ZipfileEntry *pEntry, u8 *aBuf){
10661 ZipfileCDS *pCds = &pEntry->cds;
10662 u8 *a = aBuf;
10663
10664 pCds->nExtra = 9;
10665
10666 /* Write the LFH itself */
10667 zipfileWrite32(a, ZIPFILE_SIGNATURE_LFH);
10668 zipfileWrite16(a, pCds->iVersionExtract);
10669 zipfileWrite16(a, pCds->flags);
10670 zipfileWrite16(a, pCds->iCompression);
10671 zipfileWrite16(a, pCds->mTime);
10672 zipfileWrite16(a, pCds->mDate);
10673 zipfileWrite32(a, pCds->crc32);
10674 zipfileWrite32(a, pCds->szCompressed);
10675 zipfileWrite32(a, pCds->szUncompressed);
10676 zipfileWrite16(a, (u16)pCds->nFile);
10677 zipfileWrite16(a, pCds->nExtra);
10678 assert( a==&aBuf[ZIPFILE_LFH_FIXED_SZ] );
10679
10680 /* Add the file name */
10681 memcpy(a, pCds->zFile, (int)pCds->nFile);
10682 a += (int)pCds->nFile;
10683
10684 /* The "extra" data */
10685 zipfileWrite16(a, ZIPFILE_EXTRA_TIMESTAMP);
10686 zipfileWrite16(a, 5);
10687 *a++ = 0x01;
10688 zipfileWrite32(a, pEntry->mUnixTime);
10689
10690 return a-aBuf;
10691 }
10692
zipfileAppendEntry(ZipfileTab * pTab,ZipfileEntry * pEntry,const u8 * pData,int nData)10693 static int zipfileAppendEntry(
10694 ZipfileTab *pTab,
10695 ZipfileEntry *pEntry,
10696 const u8 *pData,
10697 int nData
10698 ){
10699 u8 *aBuf = pTab->aBuffer;
10700 int nBuf;
10701 int rc;
10702
10703 nBuf = zipfileSerializeLFH(pEntry, aBuf);
10704 rc = zipfileAppendData(pTab, aBuf, nBuf);
10705 if( rc==SQLITE_OK ){
10706 pEntry->iDataOff = pTab->szCurrent;
10707 rc = zipfileAppendData(pTab, pData, nData);
10708 }
10709
10710 return rc;
10711 }
10712
zipfileGetMode(sqlite3_value * pVal,int bIsDir,u32 * pMode,char ** pzErr)10713 static int zipfileGetMode(
10714 sqlite3_value *pVal,
10715 int bIsDir, /* If true, default to directory */
10716 u32 *pMode, /* OUT: Mode value */
10717 char **pzErr /* OUT: Error message */
10718 ){
10719 const char *z = (const char*)sqlite3_value_text(pVal);
10720 u32 mode = 0;
10721 if( z==0 ){
10722 mode = (bIsDir ? (S_IFDIR + 0755) : (S_IFREG + 0644));
10723 }else if( z[0]>='0' && z[0]<='9' ){
10724 mode = (unsigned int)sqlite3_value_int(pVal);
10725 }else{
10726 const char zTemplate[11] = "-rwxrwxrwx";
10727 int i;
10728 if( strlen(z)!=10 ) goto parse_error;
10729 switch( z[0] ){
10730 case '-': mode |= S_IFREG; break;
10731 case 'd': mode |= S_IFDIR; break;
10732 case 'l': mode |= S_IFLNK; break;
10733 default: goto parse_error;
10734 }
10735 for(i=1; i<10; i++){
10736 if( z[i]==zTemplate[i] ) mode |= 1 << (9-i);
10737 else if( z[i]!='-' ) goto parse_error;
10738 }
10739 }
10740 if( ((mode & S_IFDIR)==0)==bIsDir ){
10741 /* The "mode" attribute is a directory, but data has been specified.
10742 ** Or vice-versa - no data but "mode" is a file or symlink. */
10743 *pzErr = sqlite3_mprintf("zipfile: mode does not match data");
10744 return SQLITE_CONSTRAINT;
10745 }
10746 *pMode = mode;
10747 return SQLITE_OK;
10748
10749 parse_error:
10750 *pzErr = sqlite3_mprintf("zipfile: parse error in mode: %s", z);
10751 return SQLITE_ERROR;
10752 }
10753
10754 /*
10755 ** Both (const char*) arguments point to nul-terminated strings. Argument
10756 ** nB is the value of strlen(zB). This function returns 0 if the strings are
10757 ** identical, ignoring any trailing '/' character in either path. */
zipfileComparePath(const char * zA,const char * zB,int nB)10758 static int zipfileComparePath(const char *zA, const char *zB, int nB){
10759 int nA = (int)strlen(zA);
10760 if( nA>0 && zA[nA-1]=='/' ) nA--;
10761 if( nB>0 && zB[nB-1]=='/' ) nB--;
10762 if( nA==nB && memcmp(zA, zB, nA)==0 ) return 0;
10763 return 1;
10764 }
10765
zipfileBegin(sqlite3_vtab * pVtab)10766 static int zipfileBegin(sqlite3_vtab *pVtab){
10767 ZipfileTab *pTab = (ZipfileTab*)pVtab;
10768 int rc = SQLITE_OK;
10769
10770 assert( pTab->pWriteFd==0 );
10771 if( pTab->zFile==0 || pTab->zFile[0]==0 ){
10772 pTab->base.zErrMsg = sqlite3_mprintf("zipfile: missing filename");
10773 return SQLITE_ERROR;
10774 }
10775
10776 /* Open a write fd on the file. Also load the entire central directory
10777 ** structure into memory. During the transaction any new file data is
10778 ** appended to the archive file, but the central directory is accumulated
10779 ** in main-memory until the transaction is committed. */
10780 pTab->pWriteFd = fopen(pTab->zFile, "ab+");
10781 if( pTab->pWriteFd==0 ){
10782 pTab->base.zErrMsg = sqlite3_mprintf(
10783 "zipfile: failed to open file %s for writing", pTab->zFile
10784 );
10785 rc = SQLITE_ERROR;
10786 }else{
10787 fseek(pTab->pWriteFd, 0, SEEK_END);
10788 pTab->szCurrent = pTab->szOrig = (i64)ftell(pTab->pWriteFd);
10789 rc = zipfileLoadDirectory(pTab, 0, 0);
10790 }
10791
10792 if( rc!=SQLITE_OK ){
10793 zipfileCleanupTransaction(pTab);
10794 }
10795
10796 return rc;
10797 }
10798
10799 /*
10800 ** Return the current time as a 32-bit timestamp in UNIX epoch format (like
10801 ** time(2)).
10802 */
zipfileTime(void)10803 static u32 zipfileTime(void){
10804 sqlite3_vfs *pVfs = sqlite3_vfs_find(0);
10805 u32 ret;
10806 if( pVfs==0 ) return 0;
10807 if( pVfs->iVersion>=2 && pVfs->xCurrentTimeInt64 ){
10808 i64 ms;
10809 pVfs->xCurrentTimeInt64(pVfs, &ms);
10810 ret = (u32)((ms/1000) - ((i64)24405875 * 8640));
10811 }else{
10812 double day;
10813 pVfs->xCurrentTime(pVfs, &day);
10814 ret = (u32)((day - 2440587.5) * 86400);
10815 }
10816 return ret;
10817 }
10818
10819 /*
10820 ** Return a 32-bit timestamp in UNIX epoch format.
10821 **
10822 ** If the value passed as the only argument is either NULL or an SQL NULL,
10823 ** return the current time. Otherwise, return the value stored in (*pVal)
10824 ** cast to a 32-bit unsigned integer.
10825 */
zipfileGetTime(sqlite3_value * pVal)10826 static u32 zipfileGetTime(sqlite3_value *pVal){
10827 if( pVal==0 || sqlite3_value_type(pVal)==SQLITE_NULL ){
10828 return zipfileTime();
10829 }
10830 return (u32)sqlite3_value_int64(pVal);
10831 }
10832
10833 /*
10834 ** Unless it is NULL, entry pOld is currently part of the pTab->pFirstEntry
10835 ** linked list. Remove it from the list and free the object.
10836 */
zipfileRemoveEntryFromList(ZipfileTab * pTab,ZipfileEntry * pOld)10837 static void zipfileRemoveEntryFromList(ZipfileTab *pTab, ZipfileEntry *pOld){
10838 if( pOld ){
10839 if( pTab->pFirstEntry==pOld ){
10840 pTab->pFirstEntry = pOld->pNext;
10841 if( pTab->pLastEntry==pOld ) pTab->pLastEntry = 0;
10842 }else{
10843 ZipfileEntry *p;
10844 for(p=pTab->pFirstEntry; p; p=p->pNext){
10845 if( p->pNext==pOld ){
10846 p->pNext = pOld->pNext;
10847 if( pTab->pLastEntry==pOld ) pTab->pLastEntry = p;
10848 break;
10849 }
10850 }
10851 }
10852 zipfileEntryFree(pOld);
10853 }
10854 }
10855
10856 /*
10857 ** xUpdate method.
10858 */
zipfileUpdate(sqlite3_vtab * pVtab,int nVal,sqlite3_value ** apVal,sqlite_int64 * pRowid)10859 static int zipfileUpdate(
10860 sqlite3_vtab *pVtab,
10861 int nVal,
10862 sqlite3_value **apVal,
10863 sqlite_int64 *pRowid
10864 ){
10865 ZipfileTab *pTab = (ZipfileTab*)pVtab;
10866 int rc = SQLITE_OK; /* Return Code */
10867 ZipfileEntry *pNew = 0; /* New in-memory CDS entry */
10868
10869 u32 mode = 0; /* Mode for new entry */
10870 u32 mTime = 0; /* Modification time for new entry */
10871 i64 sz = 0; /* Uncompressed size */
10872 const char *zPath = 0; /* Path for new entry */
10873 int nPath = 0; /* strlen(zPath) */
10874 const u8 *pData = 0; /* Pointer to buffer containing content */
10875 int nData = 0; /* Size of pData buffer in bytes */
10876 int iMethod = 0; /* Compression method for new entry */
10877 u8 *pFree = 0; /* Free this */
10878 char *zFree = 0; /* Also free this */
10879 ZipfileEntry *pOld = 0;
10880 ZipfileEntry *pOld2 = 0;
10881 int bUpdate = 0; /* True for an update that modifies "name" */
10882 int bIsDir = 0;
10883 u32 iCrc32 = 0;
10884
10885 (void)pRowid;
10886
10887 if( pTab->pWriteFd==0 ){
10888 rc = zipfileBegin(pVtab);
10889 if( rc!=SQLITE_OK ) return rc;
10890 }
10891
10892 /* If this is a DELETE or UPDATE, find the archive entry to delete. */
10893 if( sqlite3_value_type(apVal[0])!=SQLITE_NULL ){
10894 const char *zDelete = (const char*)sqlite3_value_text(apVal[0]);
10895 int nDelete = (int)strlen(zDelete);
10896 if( nVal>1 ){
10897 const char *zUpdate = (const char*)sqlite3_value_text(apVal[1]);
10898 if( zUpdate && zipfileComparePath(zUpdate, zDelete, nDelete)!=0 ){
10899 bUpdate = 1;
10900 }
10901 }
10902 for(pOld=pTab->pFirstEntry; 1; pOld=pOld->pNext){
10903 if( zipfileComparePath(pOld->cds.zFile, zDelete, nDelete)==0 ){
10904 break;
10905 }
10906 assert( pOld->pNext );
10907 }
10908 }
10909
10910 if( nVal>1 ){
10911 /* Check that "sz" and "rawdata" are both NULL: */
10912 if( sqlite3_value_type(apVal[5])!=SQLITE_NULL ){
10913 zipfileTableErr(pTab, "sz must be NULL");
10914 rc = SQLITE_CONSTRAINT;
10915 }
10916 if( sqlite3_value_type(apVal[6])!=SQLITE_NULL ){
10917 zipfileTableErr(pTab, "rawdata must be NULL");
10918 rc = SQLITE_CONSTRAINT;
10919 }
10920
10921 if( rc==SQLITE_OK ){
10922 if( sqlite3_value_type(apVal[7])==SQLITE_NULL ){
10923 /* data=NULL. A directory */
10924 bIsDir = 1;
10925 }else{
10926 /* Value specified for "data", and possibly "method". This must be
10927 ** a regular file or a symlink. */
10928 const u8 *aIn = sqlite3_value_blob(apVal[7]);
10929 int nIn = sqlite3_value_bytes(apVal[7]);
10930 int bAuto = sqlite3_value_type(apVal[8])==SQLITE_NULL;
10931
10932 iMethod = sqlite3_value_int(apVal[8]);
10933 sz = nIn;
10934 pData = aIn;
10935 nData = nIn;
10936 if( iMethod!=0 && iMethod!=8 ){
10937 zipfileTableErr(pTab, "unknown compression method: %d", iMethod);
10938 rc = SQLITE_CONSTRAINT;
10939 }else{
10940 if( bAuto || iMethod ){
10941 int nCmp;
10942 rc = zipfileDeflate(aIn, nIn, &pFree, &nCmp, &pTab->base.zErrMsg);
10943 if( rc==SQLITE_OK ){
10944 if( iMethod || nCmp<nIn ){
10945 iMethod = 8;
10946 pData = pFree;
10947 nData = nCmp;
10948 }
10949 }
10950 }
10951 iCrc32 = crc32(0, aIn, nIn);
10952 }
10953 }
10954 }
10955
10956 if( rc==SQLITE_OK ){
10957 rc = zipfileGetMode(apVal[3], bIsDir, &mode, &pTab->base.zErrMsg);
10958 }
10959
10960 if( rc==SQLITE_OK ){
10961 zPath = (const char*)sqlite3_value_text(apVal[2]);
10962 if( zPath==0 ) zPath = "";
10963 nPath = (int)strlen(zPath);
10964 mTime = zipfileGetTime(apVal[4]);
10965 }
10966
10967 if( rc==SQLITE_OK && bIsDir ){
10968 /* For a directory, check that the last character in the path is a
10969 ** '/'. This appears to be required for compatibility with info-zip
10970 ** (the unzip command on unix). It does not create directories
10971 ** otherwise. */
10972 if( nPath<=0 || zPath[nPath-1]!='/' ){
10973 zFree = sqlite3_mprintf("%s/", zPath);
10974 zPath = (const char*)zFree;
10975 if( zFree==0 ){
10976 rc = SQLITE_NOMEM;
10977 nPath = 0;
10978 }else{
10979 nPath = (int)strlen(zPath);
10980 }
10981 }
10982 }
10983
10984 /* Check that we're not inserting a duplicate entry -OR- updating an
10985 ** entry with a path, thereby making it into a duplicate. */
10986 if( (pOld==0 || bUpdate) && rc==SQLITE_OK ){
10987 ZipfileEntry *p;
10988 for(p=pTab->pFirstEntry; p; p=p->pNext){
10989 if( zipfileComparePath(p->cds.zFile, zPath, nPath)==0 ){
10990 switch( sqlite3_vtab_on_conflict(pTab->db) ){
10991 case SQLITE_IGNORE: {
10992 goto zipfile_update_done;
10993 }
10994 case SQLITE_REPLACE: {
10995 pOld2 = p;
10996 break;
10997 }
10998 default: {
10999 zipfileTableErr(pTab, "duplicate name: \"%s\"", zPath);
11000 rc = SQLITE_CONSTRAINT;
11001 break;
11002 }
11003 }
11004 break;
11005 }
11006 }
11007 }
11008
11009 if( rc==SQLITE_OK ){
11010 /* Create the new CDS record. */
11011 pNew = zipfileNewEntry(zPath);
11012 if( pNew==0 ){
11013 rc = SQLITE_NOMEM;
11014 }else{
11015 pNew->cds.iVersionMadeBy = ZIPFILE_NEWENTRY_MADEBY;
11016 pNew->cds.iVersionExtract = ZIPFILE_NEWENTRY_REQUIRED;
11017 pNew->cds.flags = ZIPFILE_NEWENTRY_FLAGS;
11018 pNew->cds.iCompression = (u16)iMethod;
11019 zipfileMtimeToDos(&pNew->cds, mTime);
11020 pNew->cds.crc32 = iCrc32;
11021 pNew->cds.szCompressed = nData;
11022 pNew->cds.szUncompressed = (u32)sz;
11023 pNew->cds.iExternalAttr = (mode<<16);
11024 pNew->cds.iOffset = (u32)pTab->szCurrent;
11025 pNew->cds.nFile = (u16)nPath;
11026 pNew->mUnixTime = (u32)mTime;
11027 rc = zipfileAppendEntry(pTab, pNew, pData, nData);
11028 zipfileAddEntry(pTab, pOld, pNew);
11029 }
11030 }
11031 }
11032
11033 if( rc==SQLITE_OK && (pOld || pOld2) ){
11034 ZipfileCsr *pCsr;
11035 for(pCsr=pTab->pCsrList; pCsr; pCsr=pCsr->pCsrNext){
11036 if( pCsr->pCurrent && (pCsr->pCurrent==pOld || pCsr->pCurrent==pOld2) ){
11037 pCsr->pCurrent = pCsr->pCurrent->pNext;
11038 pCsr->bNoop = 1;
11039 }
11040 }
11041
11042 zipfileRemoveEntryFromList(pTab, pOld);
11043 zipfileRemoveEntryFromList(pTab, pOld2);
11044 }
11045
11046 zipfile_update_done:
11047 sqlite3_free(pFree);
11048 sqlite3_free(zFree);
11049 return rc;
11050 }
11051
zipfileSerializeEOCD(ZipfileEOCD * p,u8 * aBuf)11052 static int zipfileSerializeEOCD(ZipfileEOCD *p, u8 *aBuf){
11053 u8 *a = aBuf;
11054 zipfileWrite32(a, ZIPFILE_SIGNATURE_EOCD);
11055 zipfileWrite16(a, p->iDisk);
11056 zipfileWrite16(a, p->iFirstDisk);
11057 zipfileWrite16(a, p->nEntry);
11058 zipfileWrite16(a, p->nEntryTotal);
11059 zipfileWrite32(a, p->nSize);
11060 zipfileWrite32(a, p->iOffset);
11061 zipfileWrite16(a, 0); /* Size of trailing comment in bytes*/
11062
11063 return a-aBuf;
11064 }
11065
zipfileAppendEOCD(ZipfileTab * pTab,ZipfileEOCD * p)11066 static int zipfileAppendEOCD(ZipfileTab *pTab, ZipfileEOCD *p){
11067 int nBuf = zipfileSerializeEOCD(p, pTab->aBuffer);
11068 assert( nBuf==ZIPFILE_EOCD_FIXED_SZ );
11069 return zipfileAppendData(pTab, pTab->aBuffer, nBuf);
11070 }
11071
11072 /*
11073 ** Serialize the CDS structure into buffer aBuf[]. Return the number
11074 ** of bytes written.
11075 */
zipfileSerializeCDS(ZipfileEntry * pEntry,u8 * aBuf)11076 static int zipfileSerializeCDS(ZipfileEntry *pEntry, u8 *aBuf){
11077 u8 *a = aBuf;
11078 ZipfileCDS *pCDS = &pEntry->cds;
11079
11080 if( pEntry->aExtra==0 ){
11081 pCDS->nExtra = 9;
11082 }
11083
11084 zipfileWrite32(a, ZIPFILE_SIGNATURE_CDS);
11085 zipfileWrite16(a, pCDS->iVersionMadeBy);
11086 zipfileWrite16(a, pCDS->iVersionExtract);
11087 zipfileWrite16(a, pCDS->flags);
11088 zipfileWrite16(a, pCDS->iCompression);
11089 zipfileWrite16(a, pCDS->mTime);
11090 zipfileWrite16(a, pCDS->mDate);
11091 zipfileWrite32(a, pCDS->crc32);
11092 zipfileWrite32(a, pCDS->szCompressed);
11093 zipfileWrite32(a, pCDS->szUncompressed);
11094 assert( a==&aBuf[ZIPFILE_CDS_NFILE_OFF] );
11095 zipfileWrite16(a, pCDS->nFile);
11096 zipfileWrite16(a, pCDS->nExtra);
11097 zipfileWrite16(a, pCDS->nComment);
11098 zipfileWrite16(a, pCDS->iDiskStart);
11099 zipfileWrite16(a, pCDS->iInternalAttr);
11100 zipfileWrite32(a, pCDS->iExternalAttr);
11101 zipfileWrite32(a, pCDS->iOffset);
11102
11103 memcpy(a, pCDS->zFile, pCDS->nFile);
11104 a += pCDS->nFile;
11105
11106 if( pEntry->aExtra ){
11107 int n = (int)pCDS->nExtra + (int)pCDS->nComment;
11108 memcpy(a, pEntry->aExtra, n);
11109 a += n;
11110 }else{
11111 assert( pCDS->nExtra==9 );
11112 zipfileWrite16(a, ZIPFILE_EXTRA_TIMESTAMP);
11113 zipfileWrite16(a, 5);
11114 *a++ = 0x01;
11115 zipfileWrite32(a, pEntry->mUnixTime);
11116 }
11117
11118 return a-aBuf;
11119 }
11120
zipfileCommit(sqlite3_vtab * pVtab)11121 static int zipfileCommit(sqlite3_vtab *pVtab){
11122 ZipfileTab *pTab = (ZipfileTab*)pVtab;
11123 int rc = SQLITE_OK;
11124 if( pTab->pWriteFd ){
11125 i64 iOffset = pTab->szCurrent;
11126 ZipfileEntry *p;
11127 ZipfileEOCD eocd;
11128 int nEntry = 0;
11129
11130 /* Write out all entries */
11131 for(p=pTab->pFirstEntry; rc==SQLITE_OK && p; p=p->pNext){
11132 int n = zipfileSerializeCDS(p, pTab->aBuffer);
11133 rc = zipfileAppendData(pTab, pTab->aBuffer, n);
11134 nEntry++;
11135 }
11136
11137 /* Write out the EOCD record */
11138 eocd.iDisk = 0;
11139 eocd.iFirstDisk = 0;
11140 eocd.nEntry = (u16)nEntry;
11141 eocd.nEntryTotal = (u16)nEntry;
11142 eocd.nSize = (u32)(pTab->szCurrent - iOffset);
11143 eocd.iOffset = (u32)iOffset;
11144 rc = zipfileAppendEOCD(pTab, &eocd);
11145
11146 zipfileCleanupTransaction(pTab);
11147 }
11148 return rc;
11149 }
11150
zipfileRollback(sqlite3_vtab * pVtab)11151 static int zipfileRollback(sqlite3_vtab *pVtab){
11152 return zipfileCommit(pVtab);
11153 }
11154
zipfileFindCursor(ZipfileTab * pTab,i64 iId)11155 static ZipfileCsr *zipfileFindCursor(ZipfileTab *pTab, i64 iId){
11156 ZipfileCsr *pCsr;
11157 for(pCsr=pTab->pCsrList; pCsr; pCsr=pCsr->pCsrNext){
11158 if( iId==pCsr->iId ) break;
11159 }
11160 return pCsr;
11161 }
11162
zipfileFunctionCds(sqlite3_context * context,int argc,sqlite3_value ** argv)11163 static void zipfileFunctionCds(
11164 sqlite3_context *context,
11165 int argc,
11166 sqlite3_value **argv
11167 ){
11168 ZipfileCsr *pCsr;
11169 ZipfileTab *pTab = (ZipfileTab*)sqlite3_user_data(context);
11170 assert( argc>0 );
11171
11172 pCsr = zipfileFindCursor(pTab, sqlite3_value_int64(argv[0]));
11173 if( pCsr ){
11174 ZipfileCDS *p = &pCsr->pCurrent->cds;
11175 char *zRes = sqlite3_mprintf("{"
11176 "\"version-made-by\" : %u, "
11177 "\"version-to-extract\" : %u, "
11178 "\"flags\" : %u, "
11179 "\"compression\" : %u, "
11180 "\"time\" : %u, "
11181 "\"date\" : %u, "
11182 "\"crc32\" : %u, "
11183 "\"compressed-size\" : %u, "
11184 "\"uncompressed-size\" : %u, "
11185 "\"file-name-length\" : %u, "
11186 "\"extra-field-length\" : %u, "
11187 "\"file-comment-length\" : %u, "
11188 "\"disk-number-start\" : %u, "
11189 "\"internal-attr\" : %u, "
11190 "\"external-attr\" : %u, "
11191 "\"offset\" : %u }",
11192 (u32)p->iVersionMadeBy, (u32)p->iVersionExtract,
11193 (u32)p->flags, (u32)p->iCompression,
11194 (u32)p->mTime, (u32)p->mDate,
11195 (u32)p->crc32, (u32)p->szCompressed,
11196 (u32)p->szUncompressed, (u32)p->nFile,
11197 (u32)p->nExtra, (u32)p->nComment,
11198 (u32)p->iDiskStart, (u32)p->iInternalAttr,
11199 (u32)p->iExternalAttr, (u32)p->iOffset
11200 );
11201
11202 if( zRes==0 ){
11203 sqlite3_result_error_nomem(context);
11204 }else{
11205 sqlite3_result_text(context, zRes, -1, SQLITE_TRANSIENT);
11206 sqlite3_free(zRes);
11207 }
11208 }
11209 }
11210
11211 /*
11212 ** xFindFunction method.
11213 */
zipfileFindFunction(sqlite3_vtab * pVtab,int nArg,const char * zName,void (** pxFunc)(sqlite3_context *,int,sqlite3_value **),void ** ppArg)11214 static int zipfileFindFunction(
11215 sqlite3_vtab *pVtab, /* Virtual table handle */
11216 int nArg, /* Number of SQL function arguments */
11217 const char *zName, /* Name of SQL function */
11218 void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), /* OUT: Result */
11219 void **ppArg /* OUT: User data for *pxFunc */
11220 ){
11221 (void)nArg;
11222 if( sqlite3_stricmp("zipfile_cds", zName)==0 ){
11223 *pxFunc = zipfileFunctionCds;
11224 *ppArg = (void*)pVtab;
11225 return 1;
11226 }
11227 return 0;
11228 }
11229
11230 typedef struct ZipfileBuffer ZipfileBuffer;
11231 struct ZipfileBuffer {
11232 u8 *a; /* Pointer to buffer */
11233 int n; /* Size of buffer in bytes */
11234 int nAlloc; /* Byte allocated at a[] */
11235 };
11236
11237 typedef struct ZipfileCtx ZipfileCtx;
11238 struct ZipfileCtx {
11239 int nEntry;
11240 ZipfileBuffer body;
11241 ZipfileBuffer cds;
11242 };
11243
zipfileBufferGrow(ZipfileBuffer * pBuf,int nByte)11244 static int zipfileBufferGrow(ZipfileBuffer *pBuf, int nByte){
11245 if( pBuf->n+nByte>pBuf->nAlloc ){
11246 u8 *aNew;
11247 sqlite3_int64 nNew = pBuf->n ? pBuf->n*2 : 512;
11248 int nReq = pBuf->n + nByte;
11249
11250 while( nNew<nReq ) nNew = nNew*2;
11251 aNew = sqlite3_realloc64(pBuf->a, nNew);
11252 if( aNew==0 ) return SQLITE_NOMEM;
11253 pBuf->a = aNew;
11254 pBuf->nAlloc = (int)nNew;
11255 }
11256 return SQLITE_OK;
11257 }
11258
11259 /*
11260 ** xStep() callback for the zipfile() aggregate. This can be called in
11261 ** any of the following ways:
11262 **
11263 ** SELECT zipfile(name,data) ...
11264 ** SELECT zipfile(name,mode,mtime,data) ...
11265 ** SELECT zipfile(name,mode,mtime,data,method) ...
11266 */
zipfileStep(sqlite3_context * pCtx,int nVal,sqlite3_value ** apVal)11267 static void zipfileStep(sqlite3_context *pCtx, int nVal, sqlite3_value **apVal){
11268 ZipfileCtx *p; /* Aggregate function context */
11269 ZipfileEntry e; /* New entry to add to zip archive */
11270
11271 sqlite3_value *pName = 0;
11272 sqlite3_value *pMode = 0;
11273 sqlite3_value *pMtime = 0;
11274 sqlite3_value *pData = 0;
11275 sqlite3_value *pMethod = 0;
11276
11277 int bIsDir = 0;
11278 u32 mode;
11279 int rc = SQLITE_OK;
11280 char *zErr = 0;
11281
11282 int iMethod = -1; /* Compression method to use (0 or 8) */
11283
11284 const u8 *aData = 0; /* Possibly compressed data for new entry */
11285 int nData = 0; /* Size of aData[] in bytes */
11286 int szUncompressed = 0; /* Size of data before compression */
11287 u8 *aFree = 0; /* Free this before returning */
11288 u32 iCrc32 = 0; /* crc32 of uncompressed data */
11289
11290 char *zName = 0; /* Path (name) of new entry */
11291 int nName = 0; /* Size of zName in bytes */
11292 char *zFree = 0; /* Free this before returning */
11293 int nByte;
11294
11295 memset(&e, 0, sizeof(e));
11296 p = (ZipfileCtx*)sqlite3_aggregate_context(pCtx, sizeof(ZipfileCtx));
11297 if( p==0 ) return;
11298
11299 /* Martial the arguments into stack variables */
11300 if( nVal!=2 && nVal!=4 && nVal!=5 ){
11301 zErr = sqlite3_mprintf("wrong number of arguments to function zipfile()");
11302 rc = SQLITE_ERROR;
11303 goto zipfile_step_out;
11304 }
11305 pName = apVal[0];
11306 if( nVal==2 ){
11307 pData = apVal[1];
11308 }else{
11309 pMode = apVal[1];
11310 pMtime = apVal[2];
11311 pData = apVal[3];
11312 if( nVal==5 ){
11313 pMethod = apVal[4];
11314 }
11315 }
11316
11317 /* Check that the 'name' parameter looks ok. */
11318 zName = (char*)sqlite3_value_text(pName);
11319 nName = sqlite3_value_bytes(pName);
11320 if( zName==0 ){
11321 zErr = sqlite3_mprintf("first argument to zipfile() must be non-NULL");
11322 rc = SQLITE_ERROR;
11323 goto zipfile_step_out;
11324 }
11325
11326 /* Inspect the 'method' parameter. This must be either 0 (store), 8 (use
11327 ** deflate compression) or NULL (choose automatically). */
11328 if( pMethod && SQLITE_NULL!=sqlite3_value_type(pMethod) ){
11329 iMethod = (int)sqlite3_value_int64(pMethod);
11330 if( iMethod!=0 && iMethod!=8 ){
11331 zErr = sqlite3_mprintf("illegal method value: %d", iMethod);
11332 rc = SQLITE_ERROR;
11333 goto zipfile_step_out;
11334 }
11335 }
11336
11337 /* Now inspect the data. If this is NULL, then the new entry must be a
11338 ** directory. Otherwise, figure out whether or not the data should
11339 ** be deflated or simply stored in the zip archive. */
11340 if( sqlite3_value_type(pData)==SQLITE_NULL ){
11341 bIsDir = 1;
11342 iMethod = 0;
11343 }else{
11344 aData = sqlite3_value_blob(pData);
11345 szUncompressed = nData = sqlite3_value_bytes(pData);
11346 iCrc32 = crc32(0, aData, nData);
11347 if( iMethod<0 || iMethod==8 ){
11348 int nOut = 0;
11349 rc = zipfileDeflate(aData, nData, &aFree, &nOut, &zErr);
11350 if( rc!=SQLITE_OK ){
11351 goto zipfile_step_out;
11352 }
11353 if( iMethod==8 || nOut<nData ){
11354 aData = aFree;
11355 nData = nOut;
11356 iMethod = 8;
11357 }else{
11358 iMethod = 0;
11359 }
11360 }
11361 }
11362
11363 /* Decode the "mode" argument. */
11364 rc = zipfileGetMode(pMode, bIsDir, &mode, &zErr);
11365 if( rc ) goto zipfile_step_out;
11366
11367 /* Decode the "mtime" argument. */
11368 e.mUnixTime = zipfileGetTime(pMtime);
11369
11370 /* If this is a directory entry, ensure that there is exactly one '/'
11371 ** at the end of the path. Or, if this is not a directory and the path
11372 ** ends in '/' it is an error. */
11373 if( bIsDir==0 ){
11374 if( nName>0 && zName[nName-1]=='/' ){
11375 zErr = sqlite3_mprintf("non-directory name must not end with /");
11376 rc = SQLITE_ERROR;
11377 goto zipfile_step_out;
11378 }
11379 }else{
11380 if( nName==0 || zName[nName-1]!='/' ){
11381 zName = zFree = sqlite3_mprintf("%s/", zName);
11382 if( zName==0 ){
11383 rc = SQLITE_NOMEM;
11384 goto zipfile_step_out;
11385 }
11386 nName = (int)strlen(zName);
11387 }else{
11388 while( nName>1 && zName[nName-2]=='/' ) nName--;
11389 }
11390 }
11391
11392 /* Assemble the ZipfileEntry object for the new zip archive entry */
11393 e.cds.iVersionMadeBy = ZIPFILE_NEWENTRY_MADEBY;
11394 e.cds.iVersionExtract = ZIPFILE_NEWENTRY_REQUIRED;
11395 e.cds.flags = ZIPFILE_NEWENTRY_FLAGS;
11396 e.cds.iCompression = (u16)iMethod;
11397 zipfileMtimeToDos(&e.cds, (u32)e.mUnixTime);
11398 e.cds.crc32 = iCrc32;
11399 e.cds.szCompressed = nData;
11400 e.cds.szUncompressed = szUncompressed;
11401 e.cds.iExternalAttr = (mode<<16);
11402 e.cds.iOffset = p->body.n;
11403 e.cds.nFile = (u16)nName;
11404 e.cds.zFile = zName;
11405
11406 /* Append the LFH to the body of the new archive */
11407 nByte = ZIPFILE_LFH_FIXED_SZ + e.cds.nFile + 9;
11408 if( (rc = zipfileBufferGrow(&p->body, nByte)) ) goto zipfile_step_out;
11409 p->body.n += zipfileSerializeLFH(&e, &p->body.a[p->body.n]);
11410
11411 /* Append the data to the body of the new archive */
11412 if( nData>0 ){
11413 if( (rc = zipfileBufferGrow(&p->body, nData)) ) goto zipfile_step_out;
11414 memcpy(&p->body.a[p->body.n], aData, nData);
11415 p->body.n += nData;
11416 }
11417
11418 /* Append the CDS record to the directory of the new archive */
11419 nByte = ZIPFILE_CDS_FIXED_SZ + e.cds.nFile + 9;
11420 if( (rc = zipfileBufferGrow(&p->cds, nByte)) ) goto zipfile_step_out;
11421 p->cds.n += zipfileSerializeCDS(&e, &p->cds.a[p->cds.n]);
11422
11423 /* Increment the count of entries in the archive */
11424 p->nEntry++;
11425
11426 zipfile_step_out:
11427 sqlite3_free(aFree);
11428 sqlite3_free(zFree);
11429 if( rc ){
11430 if( zErr ){
11431 sqlite3_result_error(pCtx, zErr, -1);
11432 }else{
11433 sqlite3_result_error_code(pCtx, rc);
11434 }
11435 }
11436 sqlite3_free(zErr);
11437 }
11438
11439 /*
11440 ** xFinalize() callback for zipfile aggregate function.
11441 */
zipfileFinal(sqlite3_context * pCtx)11442 static void zipfileFinal(sqlite3_context *pCtx){
11443 ZipfileCtx *p;
11444 ZipfileEOCD eocd;
11445 sqlite3_int64 nZip;
11446 u8 *aZip;
11447
11448 p = (ZipfileCtx*)sqlite3_aggregate_context(pCtx, sizeof(ZipfileCtx));
11449 if( p==0 ) return;
11450 if( p->nEntry>0 ){
11451 memset(&eocd, 0, sizeof(eocd));
11452 eocd.nEntry = (u16)p->nEntry;
11453 eocd.nEntryTotal = (u16)p->nEntry;
11454 eocd.nSize = p->cds.n;
11455 eocd.iOffset = p->body.n;
11456
11457 nZip = p->body.n + p->cds.n + ZIPFILE_EOCD_FIXED_SZ;
11458 aZip = (u8*)sqlite3_malloc64(nZip);
11459 if( aZip==0 ){
11460 sqlite3_result_error_nomem(pCtx);
11461 }else{
11462 memcpy(aZip, p->body.a, p->body.n);
11463 memcpy(&aZip[p->body.n], p->cds.a, p->cds.n);
11464 zipfileSerializeEOCD(&eocd, &aZip[p->body.n + p->cds.n]);
11465 sqlite3_result_blob(pCtx, aZip, (int)nZip, zipfileFree);
11466 }
11467 }
11468
11469 sqlite3_free(p->body.a);
11470 sqlite3_free(p->cds.a);
11471 }
11472
11473
11474 /*
11475 ** Register the "zipfile" virtual table.
11476 */
zipfileRegister(sqlite3 * db)11477 static int zipfileRegister(sqlite3 *db){
11478 static sqlite3_module zipfileModule = {
11479 1, /* iVersion */
11480 zipfileConnect, /* xCreate */
11481 zipfileConnect, /* xConnect */
11482 zipfileBestIndex, /* xBestIndex */
11483 zipfileDisconnect, /* xDisconnect */
11484 zipfileDisconnect, /* xDestroy */
11485 zipfileOpen, /* xOpen - open a cursor */
11486 zipfileClose, /* xClose - close a cursor */
11487 zipfileFilter, /* xFilter - configure scan constraints */
11488 zipfileNext, /* xNext - advance a cursor */
11489 zipfileEof, /* xEof - check for end of scan */
11490 zipfileColumn, /* xColumn - read data */
11491 0, /* xRowid - read data */
11492 zipfileUpdate, /* xUpdate */
11493 zipfileBegin, /* xBegin */
11494 0, /* xSync */
11495 zipfileCommit, /* xCommit */
11496 zipfileRollback, /* xRollback */
11497 zipfileFindFunction, /* xFindMethod */
11498 0, /* xRename */
11499 0, /* xSavepoint */
11500 0, /* xRelease */
11501 0, /* xRollback */
11502 0, /* xShadowName */
11503 0 /* xIntegrity */
11504 };
11505
11506 int rc = sqlite3_create_module(db, "zipfile" , &zipfileModule, 0);
11507 if( rc==SQLITE_OK ) rc = sqlite3_overload_function(db, "zipfile_cds", -1);
11508 if( rc==SQLITE_OK ){
11509 rc = sqlite3_create_function(db, "zipfile", -1, SQLITE_UTF8, 0, 0,
11510 zipfileStep, zipfileFinal
11511 );
11512 }
11513 assert( sizeof(i64)==8 );
11514 assert( sizeof(u32)==4 );
11515 assert( sizeof(u16)==2 );
11516 assert( sizeof(u8)==1 );
11517 return rc;
11518 }
11519 #else /* SQLITE_OMIT_VIRTUALTABLE */
11520 # define zipfileRegister(x) SQLITE_OK
11521 #endif
11522
11523 #ifdef _WIN32
11524
11525 #endif
sqlite3_zipfile_init(sqlite3 * db,char ** pzErrMsg,const sqlite3_api_routines * pApi)11526 int sqlite3_zipfile_init(
11527 sqlite3 *db,
11528 char **pzErrMsg,
11529 const sqlite3_api_routines *pApi
11530 ){
11531 SQLITE_EXTENSION_INIT2(pApi);
11532 (void)pzErrMsg; /* Unused parameter */
11533 return zipfileRegister(db);
11534 }
11535
11536 /************************* End ../ext/misc/zipfile.c ********************/
11537 /************************* Begin ../ext/misc/sqlar.c ******************/
11538 /*
11539 ** 2017-12-17
11540 **
11541 ** The author disclaims copyright to this source code. In place of
11542 ** a legal notice, here is a blessing:
11543 **
11544 ** May you do good and not evil.
11545 ** May you find forgiveness for yourself and forgive others.
11546 ** May you share freely, never taking more than you give.
11547 **
11548 ******************************************************************************
11549 **
11550 ** Utility functions sqlar_compress() and sqlar_uncompress(). Useful
11551 ** for working with sqlar archives and used by the shell tool's built-in
11552 ** sqlar support.
11553 */
11554 /* #include "sqlite3ext.h" */
11555 SQLITE_EXTENSION_INIT1
11556 #include <zlib.h>
11557 #include <assert.h>
11558
11559 /*
11560 ** Implementation of the "sqlar_compress(X)" SQL function.
11561 **
11562 ** If the type of X is SQLITE_BLOB, and compressing that blob using
11563 ** zlib utility function compress() yields a smaller blob, return the
11564 ** compressed blob. Otherwise, return a copy of X.
11565 **
11566 ** SQLar uses the "zlib format" for compressed content. The zlib format
11567 ** contains a two-byte identification header and a four-byte checksum at
11568 ** the end. This is different from ZIP which uses the raw deflate format.
11569 **
11570 ** Future enhancements to SQLar might add support for new compression formats.
11571 ** If so, those new formats will be identified by alternative headers in the
11572 ** compressed data.
11573 */
sqlarCompressFunc(sqlite3_context * context,int argc,sqlite3_value ** argv)11574 static void sqlarCompressFunc(
11575 sqlite3_context *context,
11576 int argc,
11577 sqlite3_value **argv
11578 ){
11579 assert( argc==1 );
11580 if( sqlite3_value_type(argv[0])==SQLITE_BLOB ){
11581 const Bytef *pData = sqlite3_value_blob(argv[0]);
11582 uLong nData = sqlite3_value_bytes(argv[0]);
11583 uLongf nOut = compressBound(nData);
11584 Bytef *pOut;
11585
11586 pOut = (Bytef*)sqlite3_malloc(nOut);
11587 if( pOut==0 ){
11588 sqlite3_result_error_nomem(context);
11589 return;
11590 }else{
11591 if( Z_OK!=compress(pOut, &nOut, pData, nData) ){
11592 sqlite3_result_error(context, "error in compress()", -1);
11593 }else if( nOut<nData ){
11594 sqlite3_result_blob(context, pOut, nOut, SQLITE_TRANSIENT);
11595 }else{
11596 sqlite3_result_value(context, argv[0]);
11597 }
11598 sqlite3_free(pOut);
11599 }
11600 }else{
11601 sqlite3_result_value(context, argv[0]);
11602 }
11603 }
11604
11605 /*
11606 ** Implementation of the "sqlar_uncompress(X,SZ)" SQL function
11607 **
11608 ** Parameter SZ is interpreted as an integer. If it is less than or
11609 ** equal to zero, then this function returns a copy of X. Or, if
11610 ** SZ is equal to the size of X when interpreted as a blob, also
11611 ** return a copy of X. Otherwise, decompress blob X using zlib
11612 ** utility function uncompress() and return the results (another
11613 ** blob).
11614 */
sqlarUncompressFunc(sqlite3_context * context,int argc,sqlite3_value ** argv)11615 static void sqlarUncompressFunc(
11616 sqlite3_context *context,
11617 int argc,
11618 sqlite3_value **argv
11619 ){
11620 uLong nData;
11621 uLongf sz;
11622
11623 assert( argc==2 );
11624 sz = sqlite3_value_int(argv[1]);
11625
11626 if( sz<=0 || sz==(nData = sqlite3_value_bytes(argv[0])) ){
11627 sqlite3_result_value(context, argv[0]);
11628 }else{
11629 const Bytef *pData= sqlite3_value_blob(argv[0]);
11630 Bytef *pOut = sqlite3_malloc(sz);
11631 if( pOut==0 ){
11632 sqlite3_result_error_nomem(context);
11633 }else if( Z_OK!=uncompress(pOut, &sz, pData, nData) ){
11634 sqlite3_result_error(context, "error in uncompress()", -1);
11635 }else{
11636 sqlite3_result_blob(context, pOut, sz, SQLITE_TRANSIENT);
11637 }
11638 sqlite3_free(pOut);
11639 }
11640 }
11641
11642 #ifdef _WIN32
11643
11644 #endif
sqlite3_sqlar_init(sqlite3 * db,char ** pzErrMsg,const sqlite3_api_routines * pApi)11645 int sqlite3_sqlar_init(
11646 sqlite3 *db,
11647 char **pzErrMsg,
11648 const sqlite3_api_routines *pApi
11649 ){
11650 int rc = SQLITE_OK;
11651 SQLITE_EXTENSION_INIT2(pApi);
11652 (void)pzErrMsg; /* Unused parameter */
11653 rc = sqlite3_create_function(db, "sqlar_compress", 1,
11654 SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
11655 sqlarCompressFunc, 0, 0);
11656 if( rc==SQLITE_OK ){
11657 rc = sqlite3_create_function(db, "sqlar_uncompress", 2,
11658 SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
11659 sqlarUncompressFunc, 0, 0);
11660 }
11661 return rc;
11662 }
11663
11664 /************************* End ../ext/misc/sqlar.c ********************/
11665 #endif
11666 /************************* Begin ../ext/expert/sqlite3expert.h ******************/
11667 /*
11668 ** 2017 April 07
11669 **
11670 ** The author disclaims copyright to this source code. In place of
11671 ** a legal notice, here is a blessing:
11672 **
11673 ** May you do good and not evil.
11674 ** May you find forgiveness for yourself and forgive others.
11675 ** May you share freely, never taking more than you give.
11676 **
11677 *************************************************************************
11678 */
11679 #if !defined(SQLITEEXPERT_H)
11680 #define SQLITEEXPERT_H 1
11681 /* #include "sqlite3.h" */
11682
11683 typedef struct sqlite3expert sqlite3expert;
11684
11685 /*
11686 ** Create a new sqlite3expert object.
11687 **
11688 ** If successful, a pointer to the new object is returned and (*pzErr) set
11689 ** to NULL. Or, if an error occurs, NULL is returned and (*pzErr) set to
11690 ** an English-language error message. In this case it is the responsibility
11691 ** of the caller to eventually free the error message buffer using
11692 ** sqlite3_free().
11693 */
11694 sqlite3expert *sqlite3_expert_new(sqlite3 *db, char **pzErr);
11695
11696 /*
11697 ** Configure an sqlite3expert object.
11698 **
11699 ** EXPERT_CONFIG_SAMPLE:
11700 ** By default, sqlite3_expert_analyze() generates sqlite_stat1 data for
11701 ** each candidate index. This involves scanning and sorting the entire
11702 ** contents of each user database table once for each candidate index
11703 ** associated with the table. For large databases, this can be
11704 ** prohibitively slow. This option allows the sqlite3expert object to
11705 ** be configured so that sqlite_stat1 data is instead generated based on a
11706 ** subset of each table, or so that no sqlite_stat1 data is used at all.
11707 **
11708 ** A single integer argument is passed to this option. If the value is less
11709 ** than or equal to zero, then no sqlite_stat1 data is generated or used by
11710 ** the analysis - indexes are recommended based on the database schema only.
11711 ** Or, if the value is 100 or greater, complete sqlite_stat1 data is
11712 ** generated for each candidate index (this is the default). Finally, if the
11713 ** value falls between 0 and 100, then it represents the percentage of user
11714 ** table rows that should be considered when generating sqlite_stat1 data.
11715 **
11716 ** Examples:
11717 **
11718 ** // Do not generate any sqlite_stat1 data
11719 ** sqlite3_expert_config(pExpert, EXPERT_CONFIG_SAMPLE, 0);
11720 **
11721 ** // Generate sqlite_stat1 data based on 10% of the rows in each table.
11722 ** sqlite3_expert_config(pExpert, EXPERT_CONFIG_SAMPLE, 10);
11723 */
11724 int sqlite3_expert_config(sqlite3expert *p, int op, ...);
11725
11726 #define EXPERT_CONFIG_SAMPLE 1 /* int */
11727
11728 /*
11729 ** Specify zero or more SQL statements to be included in the analysis.
11730 **
11731 ** Buffer zSql must contain zero or more complete SQL statements. This
11732 ** function parses all statements contained in the buffer and adds them
11733 ** to the internal list of statements to analyze. If successful, SQLITE_OK
11734 ** is returned and (*pzErr) set to NULL. Or, if an error occurs - for example
11735 ** due to a error in the SQL - an SQLite error code is returned and (*pzErr)
11736 ** may be set to point to an English language error message. In this case
11737 ** the caller is responsible for eventually freeing the error message buffer
11738 ** using sqlite3_free().
11739 **
11740 ** If an error does occur while processing one of the statements in the
11741 ** buffer passed as the second argument, none of the statements in the
11742 ** buffer are added to the analysis.
11743 **
11744 ** This function must be called before sqlite3_expert_analyze(). If a call
11745 ** to this function is made on an sqlite3expert object that has already
11746 ** been passed to sqlite3_expert_analyze() SQLITE_MISUSE is returned
11747 ** immediately and no statements are added to the analysis.
11748 */
11749 int sqlite3_expert_sql(
11750 sqlite3expert *p, /* From a successful sqlite3_expert_new() */
11751 const char *zSql, /* SQL statement(s) to add */
11752 char **pzErr /* OUT: Error message (if any) */
11753 );
11754
11755
11756 /*
11757 ** This function is called after the sqlite3expert object has been configured
11758 ** with all SQL statements using sqlite3_expert_sql() to actually perform
11759 ** the analysis. Once this function has been called, it is not possible to
11760 ** add further SQL statements to the analysis.
11761 **
11762 ** If successful, SQLITE_OK is returned and (*pzErr) is set to NULL. Or, if
11763 ** an error occurs, an SQLite error code is returned and (*pzErr) set to
11764 ** point to a buffer containing an English language error message. In this
11765 ** case it is the responsibility of the caller to eventually free the buffer
11766 ** using sqlite3_free().
11767 **
11768 ** If an error does occur within this function, the sqlite3expert object
11769 ** is no longer useful for any purpose. At that point it is no longer
11770 ** possible to add further SQL statements to the object or to re-attempt
11771 ** the analysis. The sqlite3expert object must still be freed using a call
11772 ** sqlite3_expert_destroy().
11773 */
11774 int sqlite3_expert_analyze(sqlite3expert *p, char **pzErr);
11775
11776 /*
11777 ** Return the total number of statements loaded using sqlite3_expert_sql().
11778 ** The total number of SQL statements may be different from the total number
11779 ** to calls to sqlite3_expert_sql().
11780 */
11781 int sqlite3_expert_count(sqlite3expert*);
11782
11783 /*
11784 ** Return a component of the report.
11785 **
11786 ** This function is called after sqlite3_expert_analyze() to extract the
11787 ** results of the analysis. Each call to this function returns either a
11788 ** NULL pointer or a pointer to a buffer containing a nul-terminated string.
11789 ** The value passed as the third argument must be one of the EXPERT_REPORT_*
11790 ** #define constants defined below.
11791 **
11792 ** For some EXPERT_REPORT_* parameters, the buffer returned contains
11793 ** information relating to a specific SQL statement. In these cases that
11794 ** SQL statement is identified by the value passed as the second argument.
11795 ** SQL statements are numbered from 0 in the order in which they are parsed.
11796 ** If an out-of-range value (less than zero or equal to or greater than the
11797 ** value returned by sqlite3_expert_count()) is passed as the second argument
11798 ** along with such an EXPERT_REPORT_* parameter, NULL is always returned.
11799 **
11800 ** EXPERT_REPORT_SQL:
11801 ** Return the text of SQL statement iStmt.
11802 **
11803 ** EXPERT_REPORT_INDEXES:
11804 ** Return a buffer containing the CREATE INDEX statements for all recommended
11805 ** indexes for statement iStmt. If there are no new recommeded indexes, NULL
11806 ** is returned.
11807 **
11808 ** EXPERT_REPORT_PLAN:
11809 ** Return a buffer containing the EXPLAIN QUERY PLAN output for SQL query
11810 ** iStmt after the proposed indexes have been added to the database schema.
11811 **
11812 ** EXPERT_REPORT_CANDIDATES:
11813 ** Return a pointer to a buffer containing the CREATE INDEX statements
11814 ** for all indexes that were tested (for all SQL statements). The iStmt
11815 ** parameter is ignored for EXPERT_REPORT_CANDIDATES calls.
11816 */
11817 const char *sqlite3_expert_report(sqlite3expert*, int iStmt, int eReport);
11818
11819 /*
11820 ** Values for the third argument passed to sqlite3_expert_report().
11821 */
11822 #define EXPERT_REPORT_SQL 1
11823 #define EXPERT_REPORT_INDEXES 2
11824 #define EXPERT_REPORT_PLAN 3
11825 #define EXPERT_REPORT_CANDIDATES 4
11826
11827 /*
11828 ** Free an (sqlite3expert*) handle and all associated resources. There
11829 ** should be one call to this function for each successful call to
11830 ** sqlite3-expert_new().
11831 */
11832 void sqlite3_expert_destroy(sqlite3expert*);
11833
11834 #endif /* !defined(SQLITEEXPERT_H) */
11835
11836 /************************* End ../ext/expert/sqlite3expert.h ********************/
11837 /************************* Begin ../ext/expert/sqlite3expert.c ******************/
11838 /*
11839 ** 2017 April 09
11840 **
11841 ** The author disclaims copyright to this source code. In place of
11842 ** a legal notice, here is a blessing:
11843 **
11844 ** May you do good and not evil.
11845 ** May you find forgiveness for yourself and forgive others.
11846 ** May you share freely, never taking more than you give.
11847 **
11848 *************************************************************************
11849 */
11850 /* #include "sqlite3expert.h" */
11851 #include <assert.h>
11852 #include <string.h>
11853 #include <stdio.h>
11854
11855 #if !defined(SQLITE_AMALGAMATION)
11856 #if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST)
11857 # define SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS 1
11858 #endif
11859 #if defined(SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS)
11860 # define ALWAYS(X) (1)
11861 # define NEVER(X) (0)
11862 #elif !defined(NDEBUG)
11863 # define ALWAYS(X) ((X)?1:(assert(0),0))
11864 # define NEVER(X) ((X)?(assert(0),1):0)
11865 #else
11866 # define ALWAYS(X) (X)
11867 # define NEVER(X) (X)
11868 #endif
11869 #endif /* !defined(SQLITE_AMALGAMATION) */
11870
11871
11872 #ifndef SQLITE_OMIT_VIRTUALTABLE
11873
11874 /* typedef sqlite3_int64 i64; */
11875 /* typedef sqlite3_uint64 u64; */
11876
11877 typedef struct IdxColumn IdxColumn;
11878 typedef struct IdxConstraint IdxConstraint;
11879 typedef struct IdxScan IdxScan;
11880 typedef struct IdxStatement IdxStatement;
11881 typedef struct IdxTable IdxTable;
11882 typedef struct IdxWrite IdxWrite;
11883
11884 #define STRLEN (int)strlen
11885
11886 /*
11887 ** A temp table name that we assume no user database will actually use.
11888 ** If this assumption proves incorrect triggers on the table with the
11889 ** conflicting name will be ignored.
11890 */
11891 #define UNIQUE_TABLE_NAME "t592690916721053953805701627921227776"
11892
11893 /*
11894 ** A single constraint. Equivalent to either "col = ?" or "col < ?" (or
11895 ** any other type of single-ended range constraint on a column).
11896 **
11897 ** pLink:
11898 ** Used to temporarily link IdxConstraint objects into lists while
11899 ** creating candidate indexes.
11900 */
11901 struct IdxConstraint {
11902 char *zColl; /* Collation sequence */
11903 int bRange; /* True for range, false for eq */
11904 int iCol; /* Constrained table column */
11905 int bFlag; /* Used by idxFindCompatible() */
11906 int bDesc; /* True if ORDER BY <expr> DESC */
11907 IdxConstraint *pNext; /* Next constraint in pEq or pRange list */
11908 IdxConstraint *pLink; /* See above */
11909 };
11910
11911 /*
11912 ** A single scan of a single table.
11913 */
11914 struct IdxScan {
11915 IdxTable *pTab; /* Associated table object */
11916 int iDb; /* Database containing table zTable */
11917 i64 covering; /* Mask of columns required for cov. index */
11918 IdxConstraint *pOrder; /* ORDER BY columns */
11919 IdxConstraint *pEq; /* List of == constraints */
11920 IdxConstraint *pRange; /* List of < constraints */
11921 IdxScan *pNextScan; /* Next IdxScan object for same analysis */
11922 };
11923
11924 /*
11925 ** Information regarding a single database table. Extracted from
11926 ** "PRAGMA table_info" by function idxGetTableInfo().
11927 */
11928 struct IdxColumn {
11929 char *zName;
11930 char *zColl;
11931 int iPk;
11932 };
11933 struct IdxTable {
11934 int nCol;
11935 char *zName; /* Table name */
11936 IdxColumn *aCol;
11937 IdxTable *pNext; /* Next table in linked list of all tables */
11938 };
11939
11940 /*
11941 ** An object of the following type is created for each unique table/write-op
11942 ** seen. The objects are stored in a singly-linked list beginning at
11943 ** sqlite3expert.pWrite.
11944 */
11945 struct IdxWrite {
11946 IdxTable *pTab;
11947 int eOp; /* SQLITE_UPDATE, DELETE or INSERT */
11948 IdxWrite *pNext;
11949 };
11950
11951 /*
11952 ** Each statement being analyzed is represented by an instance of this
11953 ** structure.
11954 */
11955 struct IdxStatement {
11956 int iId; /* Statement number */
11957 char *zSql; /* SQL statement */
11958 char *zIdx; /* Indexes */
11959 char *zEQP; /* Plan */
11960 IdxStatement *pNext;
11961 };
11962
11963
11964 /*
11965 ** A hash table for storing strings. With space for a payload string
11966 ** with each entry. Methods are:
11967 **
11968 ** idxHashInit()
11969 ** idxHashClear()
11970 ** idxHashAdd()
11971 ** idxHashSearch()
11972 */
11973 #define IDX_HASH_SIZE 1023
11974 typedef struct IdxHashEntry IdxHashEntry;
11975 typedef struct IdxHash IdxHash;
11976 struct IdxHashEntry {
11977 char *zKey; /* nul-terminated key */
11978 char *zVal; /* nul-terminated value string */
11979 char *zVal2; /* nul-terminated value string 2 */
11980 IdxHashEntry *pHashNext; /* Next entry in same hash bucket */
11981 IdxHashEntry *pNext; /* Next entry in hash */
11982 };
11983 struct IdxHash {
11984 IdxHashEntry *pFirst;
11985 IdxHashEntry *aHash[IDX_HASH_SIZE];
11986 };
11987
11988 /*
11989 ** sqlite3expert object.
11990 */
11991 struct sqlite3expert {
11992 int iSample; /* Percentage of tables to sample for stat1 */
11993 sqlite3 *db; /* User database */
11994 sqlite3 *dbm; /* In-memory db for this analysis */
11995 sqlite3 *dbv; /* Vtab schema for this analysis */
11996 IdxTable *pTable; /* List of all IdxTable objects */
11997 IdxScan *pScan; /* List of scan objects */
11998 IdxWrite *pWrite; /* List of write objects */
11999 IdxStatement *pStatement; /* List of IdxStatement objects */
12000 int bRun; /* True once analysis has run */
12001 char **pzErrmsg;
12002 int rc; /* Error code from whereinfo hook */
12003 IdxHash hIdx; /* Hash containing all candidate indexes */
12004 char *zCandidates; /* For EXPERT_REPORT_CANDIDATES */
12005 };
12006
12007
12008 /*
12009 ** Allocate and return nByte bytes of zeroed memory using sqlite3_malloc().
12010 ** If the allocation fails, set *pRc to SQLITE_NOMEM and return NULL.
12011 */
idxMalloc(int * pRc,int nByte)12012 static void *idxMalloc(int *pRc, int nByte){
12013 void *pRet;
12014 assert( *pRc==SQLITE_OK );
12015 assert( nByte>0 );
12016 pRet = sqlite3_malloc(nByte);
12017 if( pRet ){
12018 memset(pRet, 0, nByte);
12019 }else{
12020 *pRc = SQLITE_NOMEM;
12021 }
12022 return pRet;
12023 }
12024
12025 /*
12026 ** Initialize an IdxHash hash table.
12027 */
idxHashInit(IdxHash * pHash)12028 static void idxHashInit(IdxHash *pHash){
12029 memset(pHash, 0, sizeof(IdxHash));
12030 }
12031
12032 /*
12033 ** Reset an IdxHash hash table.
12034 */
idxHashClear(IdxHash * pHash)12035 static void idxHashClear(IdxHash *pHash){
12036 int i;
12037 for(i=0; i<IDX_HASH_SIZE; i++){
12038 IdxHashEntry *pEntry;
12039 IdxHashEntry *pNext;
12040 for(pEntry=pHash->aHash[i]; pEntry; pEntry=pNext){
12041 pNext = pEntry->pHashNext;
12042 sqlite3_free(pEntry->zVal2);
12043 sqlite3_free(pEntry);
12044 }
12045 }
12046 memset(pHash, 0, sizeof(IdxHash));
12047 }
12048
12049 /*
12050 ** Return the index of the hash bucket that the string specified by the
12051 ** arguments to this function belongs.
12052 */
idxHashString(const char * z,int n)12053 static int idxHashString(const char *z, int n){
12054 unsigned int ret = 0;
12055 int i;
12056 for(i=0; i<n; i++){
12057 ret += (ret<<3) + (unsigned char)(z[i]);
12058 }
12059 return (int)(ret % IDX_HASH_SIZE);
12060 }
12061
12062 /*
12063 ** If zKey is already present in the hash table, return non-zero and do
12064 ** nothing. Otherwise, add an entry with key zKey and payload string zVal to
12065 ** the hash table passed as the second argument.
12066 */
idxHashAdd(int * pRc,IdxHash * pHash,const char * zKey,const char * zVal)12067 static int idxHashAdd(
12068 int *pRc,
12069 IdxHash *pHash,
12070 const char *zKey,
12071 const char *zVal
12072 ){
12073 int nKey = STRLEN(zKey);
12074 int iHash = idxHashString(zKey, nKey);
12075 int nVal = (zVal ? STRLEN(zVal) : 0);
12076 IdxHashEntry *pEntry;
12077 assert( iHash>=0 );
12078 for(pEntry=pHash->aHash[iHash]; pEntry; pEntry=pEntry->pHashNext){
12079 if( STRLEN(pEntry->zKey)==nKey && 0==memcmp(pEntry->zKey, zKey, nKey) ){
12080 return 1;
12081 }
12082 }
12083 pEntry = idxMalloc(pRc, sizeof(IdxHashEntry) + nKey+1 + nVal+1);
12084 if( pEntry ){
12085 pEntry->zKey = (char*)&pEntry[1];
12086 memcpy(pEntry->zKey, zKey, nKey);
12087 if( zVal ){
12088 pEntry->zVal = &pEntry->zKey[nKey+1];
12089 memcpy(pEntry->zVal, zVal, nVal);
12090 }
12091 pEntry->pHashNext = pHash->aHash[iHash];
12092 pHash->aHash[iHash] = pEntry;
12093
12094 pEntry->pNext = pHash->pFirst;
12095 pHash->pFirst = pEntry;
12096 }
12097 return 0;
12098 }
12099
12100 /*
12101 ** If zKey/nKey is present in the hash table, return a pointer to the
12102 ** hash-entry object.
12103 */
idxHashFind(IdxHash * pHash,const char * zKey,int nKey)12104 static IdxHashEntry *idxHashFind(IdxHash *pHash, const char *zKey, int nKey){
12105 int iHash;
12106 IdxHashEntry *pEntry;
12107 if( nKey<0 ) nKey = STRLEN(zKey);
12108 iHash = idxHashString(zKey, nKey);
12109 assert( iHash>=0 );
12110 for(pEntry=pHash->aHash[iHash]; pEntry; pEntry=pEntry->pHashNext){
12111 if( STRLEN(pEntry->zKey)==nKey && 0==memcmp(pEntry->zKey, zKey, nKey) ){
12112 return pEntry;
12113 }
12114 }
12115 return 0;
12116 }
12117
12118 /*
12119 ** If the hash table contains an entry with a key equal to the string
12120 ** passed as the final two arguments to this function, return a pointer
12121 ** to the payload string. Otherwise, if zKey/nKey is not present in the
12122 ** hash table, return NULL.
12123 */
idxHashSearch(IdxHash * pHash,const char * zKey,int nKey)12124 static const char *idxHashSearch(IdxHash *pHash, const char *zKey, int nKey){
12125 IdxHashEntry *pEntry = idxHashFind(pHash, zKey, nKey);
12126 if( pEntry ) return pEntry->zVal;
12127 return 0;
12128 }
12129
12130 /*
12131 ** Allocate and return a new IdxConstraint object. Set the IdxConstraint.zColl
12132 ** variable to point to a copy of nul-terminated string zColl.
12133 */
idxNewConstraint(int * pRc,const char * zColl)12134 static IdxConstraint *idxNewConstraint(int *pRc, const char *zColl){
12135 IdxConstraint *pNew;
12136 int nColl = STRLEN(zColl);
12137
12138 assert( *pRc==SQLITE_OK );
12139 pNew = (IdxConstraint*)idxMalloc(pRc, sizeof(IdxConstraint) * nColl + 1);
12140 if( pNew ){
12141 pNew->zColl = (char*)&pNew[1];
12142 memcpy(pNew->zColl, zColl, nColl+1);
12143 }
12144 return pNew;
12145 }
12146
12147 /*
12148 ** An error associated with database handle db has just occurred. Pass
12149 ** the error message to callback function xOut.
12150 */
idxDatabaseError(sqlite3 * db,char ** pzErrmsg)12151 static void idxDatabaseError(
12152 sqlite3 *db, /* Database handle */
12153 char **pzErrmsg /* Write error here */
12154 ){
12155 *pzErrmsg = sqlite3_mprintf("%s", sqlite3_errmsg(db));
12156 }
12157
12158 /*
12159 ** Prepare an SQL statement.
12160 */
idxPrepareStmt(sqlite3 * db,sqlite3_stmt ** ppStmt,char ** pzErrmsg,const char * zSql)12161 static int idxPrepareStmt(
12162 sqlite3 *db, /* Database handle to compile against */
12163 sqlite3_stmt **ppStmt, /* OUT: Compiled SQL statement */
12164 char **pzErrmsg, /* OUT: sqlite3_malloc()ed error message */
12165 const char *zSql /* SQL statement to compile */
12166 ){
12167 int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0);
12168 if( rc!=SQLITE_OK ){
12169 *ppStmt = 0;
12170 idxDatabaseError(db, pzErrmsg);
12171 }
12172 return rc;
12173 }
12174
12175 /*
12176 ** Prepare an SQL statement using the results of a printf() formatting.
12177 */
idxPrintfPrepareStmt(sqlite3 * db,sqlite3_stmt ** ppStmt,char ** pzErrmsg,const char * zFmt,...)12178 static int idxPrintfPrepareStmt(
12179 sqlite3 *db, /* Database handle to compile against */
12180 sqlite3_stmt **ppStmt, /* OUT: Compiled SQL statement */
12181 char **pzErrmsg, /* OUT: sqlite3_malloc()ed error message */
12182 const char *zFmt, /* printf() format of SQL statement */
12183 ... /* Trailing printf() arguments */
12184 ){
12185 va_list ap;
12186 int rc;
12187 char *zSql;
12188 va_start(ap, zFmt);
12189 zSql = sqlite3_vmprintf(zFmt, ap);
12190 if( zSql==0 ){
12191 rc = SQLITE_NOMEM;
12192 }else{
12193 rc = idxPrepareStmt(db, ppStmt, pzErrmsg, zSql);
12194 sqlite3_free(zSql);
12195 }
12196 va_end(ap);
12197 return rc;
12198 }
12199
12200
12201 /*************************************************************************
12202 ** Beginning of virtual table implementation.
12203 */
12204 typedef struct ExpertVtab ExpertVtab;
12205 struct ExpertVtab {
12206 sqlite3_vtab base;
12207 IdxTable *pTab;
12208 sqlite3expert *pExpert;
12209 };
12210
12211 typedef struct ExpertCsr ExpertCsr;
12212 struct ExpertCsr {
12213 sqlite3_vtab_cursor base;
12214 sqlite3_stmt *pData;
12215 };
12216
expertDequote(const char * zIn)12217 static char *expertDequote(const char *zIn){
12218 int n = STRLEN(zIn);
12219 char *zRet = sqlite3_malloc(n);
12220
12221 assert( zIn[0]=='\'' );
12222 assert( zIn[n-1]=='\'' );
12223
12224 if( zRet ){
12225 int iOut = 0;
12226 int iIn = 0;
12227 for(iIn=1; iIn<(n-1); iIn++){
12228 if( zIn[iIn]=='\'' ){
12229 assert( zIn[iIn+1]=='\'' );
12230 iIn++;
12231 }
12232 zRet[iOut++] = zIn[iIn];
12233 }
12234 zRet[iOut] = '\0';
12235 }
12236
12237 return zRet;
12238 }
12239
12240 /*
12241 ** This function is the implementation of both the xConnect and xCreate
12242 ** methods of the r-tree virtual table.
12243 **
12244 ** argv[0] -> module name
12245 ** argv[1] -> database name
12246 ** argv[2] -> table name
12247 ** argv[...] -> column names...
12248 */
expertConnect(sqlite3 * db,void * pAux,int argc,const char * const * argv,sqlite3_vtab ** ppVtab,char ** pzErr)12249 static int expertConnect(
12250 sqlite3 *db,
12251 void *pAux,
12252 int argc, const char *const*argv,
12253 sqlite3_vtab **ppVtab,
12254 char **pzErr
12255 ){
12256 sqlite3expert *pExpert = (sqlite3expert*)pAux;
12257 ExpertVtab *p = 0;
12258 int rc;
12259
12260 if( argc!=4 ){
12261 *pzErr = sqlite3_mprintf("internal error!");
12262 rc = SQLITE_ERROR;
12263 }else{
12264 char *zCreateTable = expertDequote(argv[3]);
12265 if( zCreateTable ){
12266 rc = sqlite3_declare_vtab(db, zCreateTable);
12267 if( rc==SQLITE_OK ){
12268 p = idxMalloc(&rc, sizeof(ExpertVtab));
12269 }
12270 if( rc==SQLITE_OK ){
12271 p->pExpert = pExpert;
12272 p->pTab = pExpert->pTable;
12273 assert( sqlite3_stricmp(p->pTab->zName, argv[2])==0 );
12274 }
12275 sqlite3_free(zCreateTable);
12276 }else{
12277 rc = SQLITE_NOMEM;
12278 }
12279 }
12280
12281 *ppVtab = (sqlite3_vtab*)p;
12282 return rc;
12283 }
12284
expertDisconnect(sqlite3_vtab * pVtab)12285 static int expertDisconnect(sqlite3_vtab *pVtab){
12286 ExpertVtab *p = (ExpertVtab*)pVtab;
12287 sqlite3_free(p);
12288 return SQLITE_OK;
12289 }
12290
expertBestIndex(sqlite3_vtab * pVtab,sqlite3_index_info * pIdxInfo)12291 static int expertBestIndex(sqlite3_vtab *pVtab, sqlite3_index_info *pIdxInfo){
12292 ExpertVtab *p = (ExpertVtab*)pVtab;
12293 int rc = SQLITE_OK;
12294 int n = 0;
12295 IdxScan *pScan;
12296 const int opmask =
12297 SQLITE_INDEX_CONSTRAINT_EQ | SQLITE_INDEX_CONSTRAINT_GT |
12298 SQLITE_INDEX_CONSTRAINT_LT | SQLITE_INDEX_CONSTRAINT_GE |
12299 SQLITE_INDEX_CONSTRAINT_LE;
12300
12301 pScan = idxMalloc(&rc, sizeof(IdxScan));
12302 if( pScan ){
12303 int i;
12304
12305 /* Link the new scan object into the list */
12306 pScan->pTab = p->pTab;
12307 pScan->pNextScan = p->pExpert->pScan;
12308 p->pExpert->pScan = pScan;
12309
12310 /* Add the constraints to the IdxScan object */
12311 for(i=0; i<pIdxInfo->nConstraint; i++){
12312 struct sqlite3_index_constraint *pCons = &pIdxInfo->aConstraint[i];
12313 if( pCons->usable
12314 && pCons->iColumn>=0
12315 && p->pTab->aCol[pCons->iColumn].iPk==0
12316 && (pCons->op & opmask)
12317 ){
12318 IdxConstraint *pNew;
12319 const char *zColl = sqlite3_vtab_collation(pIdxInfo, i);
12320 pNew = idxNewConstraint(&rc, zColl);
12321 if( pNew ){
12322 pNew->iCol = pCons->iColumn;
12323 if( pCons->op==SQLITE_INDEX_CONSTRAINT_EQ ){
12324 pNew->pNext = pScan->pEq;
12325 pScan->pEq = pNew;
12326 }else{
12327 pNew->bRange = 1;
12328 pNew->pNext = pScan->pRange;
12329 pScan->pRange = pNew;
12330 }
12331 }
12332 n++;
12333 pIdxInfo->aConstraintUsage[i].argvIndex = n;
12334 }
12335 }
12336
12337 /* Add the ORDER BY to the IdxScan object */
12338 for(i=pIdxInfo->nOrderBy-1; i>=0; i--){
12339 int iCol = pIdxInfo->aOrderBy[i].iColumn;
12340 if( iCol>=0 ){
12341 IdxConstraint *pNew = idxNewConstraint(&rc, p->pTab->aCol[iCol].zColl);
12342 if( pNew ){
12343 pNew->iCol = iCol;
12344 pNew->bDesc = pIdxInfo->aOrderBy[i].desc;
12345 pNew->pNext = pScan->pOrder;
12346 pNew->pLink = pScan->pOrder;
12347 pScan->pOrder = pNew;
12348 n++;
12349 }
12350 }
12351 }
12352 }
12353
12354 pIdxInfo->estimatedCost = 1000000.0 / (n+1);
12355 return rc;
12356 }
12357
expertUpdate(sqlite3_vtab * pVtab,int nData,sqlite3_value ** azData,sqlite_int64 * pRowid)12358 static int expertUpdate(
12359 sqlite3_vtab *pVtab,
12360 int nData,
12361 sqlite3_value **azData,
12362 sqlite_int64 *pRowid
12363 ){
12364 (void)pVtab;
12365 (void)nData;
12366 (void)azData;
12367 (void)pRowid;
12368 return SQLITE_OK;
12369 }
12370
12371 /*
12372 ** Virtual table module xOpen method.
12373 */
expertOpen(sqlite3_vtab * pVTab,sqlite3_vtab_cursor ** ppCursor)12374 static int expertOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){
12375 int rc = SQLITE_OK;
12376 ExpertCsr *pCsr;
12377 (void)pVTab;
12378 pCsr = idxMalloc(&rc, sizeof(ExpertCsr));
12379 *ppCursor = (sqlite3_vtab_cursor*)pCsr;
12380 return rc;
12381 }
12382
12383 /*
12384 ** Virtual table module xClose method.
12385 */
expertClose(sqlite3_vtab_cursor * cur)12386 static int expertClose(sqlite3_vtab_cursor *cur){
12387 ExpertCsr *pCsr = (ExpertCsr*)cur;
12388 sqlite3_finalize(pCsr->pData);
12389 sqlite3_free(pCsr);
12390 return SQLITE_OK;
12391 }
12392
12393 /*
12394 ** Virtual table module xEof method.
12395 **
12396 ** Return non-zero if the cursor does not currently point to a valid
12397 ** record (i.e if the scan has finished), or zero otherwise.
12398 */
expertEof(sqlite3_vtab_cursor * cur)12399 static int expertEof(sqlite3_vtab_cursor *cur){
12400 ExpertCsr *pCsr = (ExpertCsr*)cur;
12401 return pCsr->pData==0;
12402 }
12403
12404 /*
12405 ** Virtual table module xNext method.
12406 */
expertNext(sqlite3_vtab_cursor * cur)12407 static int expertNext(sqlite3_vtab_cursor *cur){
12408 ExpertCsr *pCsr = (ExpertCsr*)cur;
12409 int rc = SQLITE_OK;
12410
12411 assert( pCsr->pData );
12412 rc = sqlite3_step(pCsr->pData);
12413 if( rc!=SQLITE_ROW ){
12414 rc = sqlite3_finalize(pCsr->pData);
12415 pCsr->pData = 0;
12416 }else{
12417 rc = SQLITE_OK;
12418 }
12419
12420 return rc;
12421 }
12422
12423 /*
12424 ** Virtual table module xRowid method.
12425 */
expertRowid(sqlite3_vtab_cursor * cur,sqlite_int64 * pRowid)12426 static int expertRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
12427 (void)cur;
12428 *pRowid = 0;
12429 return SQLITE_OK;
12430 }
12431
12432 /*
12433 ** Virtual table module xColumn method.
12434 */
expertColumn(sqlite3_vtab_cursor * cur,sqlite3_context * ctx,int i)12435 static int expertColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){
12436 ExpertCsr *pCsr = (ExpertCsr*)cur;
12437 sqlite3_value *pVal;
12438 pVal = sqlite3_column_value(pCsr->pData, i);
12439 if( pVal ){
12440 sqlite3_result_value(ctx, pVal);
12441 }
12442 return SQLITE_OK;
12443 }
12444
12445 /*
12446 ** Virtual table module xFilter method.
12447 */
expertFilter(sqlite3_vtab_cursor * cur,int idxNum,const char * idxStr,int argc,sqlite3_value ** argv)12448 static int expertFilter(
12449 sqlite3_vtab_cursor *cur,
12450 int idxNum, const char *idxStr,
12451 int argc, sqlite3_value **argv
12452 ){
12453 ExpertCsr *pCsr = (ExpertCsr*)cur;
12454 ExpertVtab *pVtab = (ExpertVtab*)(cur->pVtab);
12455 sqlite3expert *pExpert = pVtab->pExpert;
12456 int rc;
12457
12458 (void)idxNum;
12459 (void)idxStr;
12460 (void)argc;
12461 (void)argv;
12462 rc = sqlite3_finalize(pCsr->pData);
12463 pCsr->pData = 0;
12464 if( rc==SQLITE_OK ){
12465 rc = idxPrintfPrepareStmt(pExpert->db, &pCsr->pData, &pVtab->base.zErrMsg,
12466 "SELECT * FROM main.%Q WHERE sample()", pVtab->pTab->zName
12467 );
12468 }
12469
12470 if( rc==SQLITE_OK ){
12471 rc = expertNext(cur);
12472 }
12473 return rc;
12474 }
12475
idxRegisterVtab(sqlite3expert * p)12476 static int idxRegisterVtab(sqlite3expert *p){
12477 static sqlite3_module expertModule = {
12478 2, /* iVersion */
12479 expertConnect, /* xCreate - create a table */
12480 expertConnect, /* xConnect - connect to an existing table */
12481 expertBestIndex, /* xBestIndex - Determine search strategy */
12482 expertDisconnect, /* xDisconnect - Disconnect from a table */
12483 expertDisconnect, /* xDestroy - Drop a table */
12484 expertOpen, /* xOpen - open a cursor */
12485 expertClose, /* xClose - close a cursor */
12486 expertFilter, /* xFilter - configure scan constraints */
12487 expertNext, /* xNext - advance a cursor */
12488 expertEof, /* xEof */
12489 expertColumn, /* xColumn - read data */
12490 expertRowid, /* xRowid - read data */
12491 expertUpdate, /* xUpdate - write data */
12492 0, /* xBegin - begin transaction */
12493 0, /* xSync - sync transaction */
12494 0, /* xCommit - commit transaction */
12495 0, /* xRollback - rollback transaction */
12496 0, /* xFindFunction - function overloading */
12497 0, /* xRename - rename the table */
12498 0, /* xSavepoint */
12499 0, /* xRelease */
12500 0, /* xRollbackTo */
12501 0, /* xShadowName */
12502 0, /* xIntegrity */
12503 };
12504
12505 return sqlite3_create_module(p->dbv, "expert", &expertModule, (void*)p);
12506 }
12507 /*
12508 ** End of virtual table implementation.
12509 *************************************************************************/
12510 /*
12511 ** Finalize SQL statement pStmt. If (*pRc) is SQLITE_OK when this function
12512 ** is called, set it to the return value of sqlite3_finalize() before
12513 ** returning. Otherwise, discard the sqlite3_finalize() return value.
12514 */
idxFinalize(int * pRc,sqlite3_stmt * pStmt)12515 static void idxFinalize(int *pRc, sqlite3_stmt *pStmt){
12516 int rc = sqlite3_finalize(pStmt);
12517 if( *pRc==SQLITE_OK ) *pRc = rc;
12518 }
12519
12520 /*
12521 ** Attempt to allocate an IdxTable structure corresponding to table zTab
12522 ** in the main database of connection db. If successful, set (*ppOut) to
12523 ** point to the new object and return SQLITE_OK. Otherwise, return an
12524 ** SQLite error code and set (*ppOut) to NULL. In this case *pzErrmsg may be
12525 ** set to point to an error string.
12526 **
12527 ** It is the responsibility of the caller to eventually free either the
12528 ** IdxTable object or error message using sqlite3_free().
12529 */
idxGetTableInfo(sqlite3 * db,const char * zTab,IdxTable ** ppOut,char ** pzErrmsg)12530 static int idxGetTableInfo(
12531 sqlite3 *db, /* Database connection to read details from */
12532 const char *zTab, /* Table name */
12533 IdxTable **ppOut, /* OUT: New object (if successful) */
12534 char **pzErrmsg /* OUT: Error message (if not) */
12535 ){
12536 sqlite3_stmt *p1 = 0;
12537 int nCol = 0;
12538 int nTab;
12539 int nByte;
12540 IdxTable *pNew = 0;
12541 int rc, rc2;
12542 char *pCsr = 0;
12543 int nPk = 0;
12544
12545 *ppOut = 0;
12546 if( zTab==0 ) return SQLITE_ERROR;
12547 nTab = STRLEN(zTab);
12548 nByte = sizeof(IdxTable) + nTab + 1;
12549 rc = idxPrintfPrepareStmt(db, &p1, pzErrmsg, "PRAGMA table_xinfo=%Q", zTab);
12550 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(p1) ){
12551 const char *zCol = (const char*)sqlite3_column_text(p1, 1);
12552 const char *zColSeq = 0;
12553 if( zCol==0 ){
12554 rc = SQLITE_ERROR;
12555 break;
12556 }
12557 nByte += 1 + STRLEN(zCol);
12558 rc = sqlite3_table_column_metadata(
12559 db, "main", zTab, zCol, 0, &zColSeq, 0, 0, 0
12560 );
12561 if( zColSeq==0 ) zColSeq = "binary";
12562 nByte += 1 + STRLEN(zColSeq);
12563 nCol++;
12564 nPk += (sqlite3_column_int(p1, 5)>0);
12565 }
12566 rc2 = sqlite3_reset(p1);
12567 if( rc==SQLITE_OK ) rc = rc2;
12568
12569 nByte += sizeof(IdxColumn) * nCol;
12570 if( rc==SQLITE_OK ){
12571 pNew = idxMalloc(&rc, nByte);
12572 }
12573 if( rc==SQLITE_OK ){
12574 pNew->aCol = (IdxColumn*)&pNew[1];
12575 pNew->nCol = nCol;
12576 pCsr = (char*)&pNew->aCol[nCol];
12577 }
12578
12579 nCol = 0;
12580 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(p1) ){
12581 const char *zCol = (const char*)sqlite3_column_text(p1, 1);
12582 const char *zColSeq = 0;
12583 int nCopy;
12584 if( zCol==0 ) continue;
12585 nCopy = STRLEN(zCol) + 1;
12586 pNew->aCol[nCol].zName = pCsr;
12587 pNew->aCol[nCol].iPk = (sqlite3_column_int(p1, 5)==1 && nPk==1);
12588 memcpy(pCsr, zCol, nCopy);
12589 pCsr += nCopy;
12590
12591 rc = sqlite3_table_column_metadata(
12592 db, "main", zTab, zCol, 0, &zColSeq, 0, 0, 0
12593 );
12594 if( rc==SQLITE_OK ){
12595 if( zColSeq==0 ) zColSeq = "binary";
12596 nCopy = STRLEN(zColSeq) + 1;
12597 pNew->aCol[nCol].zColl = pCsr;
12598 memcpy(pCsr, zColSeq, nCopy);
12599 pCsr += nCopy;
12600 }
12601
12602 nCol++;
12603 }
12604 idxFinalize(&rc, p1);
12605
12606 if( rc!=SQLITE_OK ){
12607 sqlite3_free(pNew);
12608 pNew = 0;
12609 }else if( ALWAYS(pNew!=0) ){
12610 pNew->zName = pCsr;
12611 if( ALWAYS(pNew->zName!=0) ) memcpy(pNew->zName, zTab, nTab+1);
12612 }
12613
12614 *ppOut = pNew;
12615 return rc;
12616 }
12617
12618 /*
12619 ** This function is a no-op if *pRc is set to anything other than
12620 ** SQLITE_OK when it is called.
12621 **
12622 ** If *pRc is initially set to SQLITE_OK, then the text specified by
12623 ** the printf() style arguments is appended to zIn and the result returned
12624 ** in a buffer allocated by sqlite3_malloc(). sqlite3_free() is called on
12625 ** zIn before returning.
12626 */
idxAppendText(int * pRc,char * zIn,const char * zFmt,...)12627 static char *idxAppendText(int *pRc, char *zIn, const char *zFmt, ...){
12628 va_list ap;
12629 char *zAppend = 0;
12630 char *zRet = 0;
12631 int nIn = zIn ? STRLEN(zIn) : 0;
12632 int nAppend = 0;
12633 va_start(ap, zFmt);
12634 if( *pRc==SQLITE_OK ){
12635 zAppend = sqlite3_vmprintf(zFmt, ap);
12636 if( zAppend ){
12637 nAppend = STRLEN(zAppend);
12638 zRet = (char*)sqlite3_malloc(nIn + nAppend + 1);
12639 }
12640 if( zAppend && zRet ){
12641 if( nIn ) memcpy(zRet, zIn, nIn);
12642 memcpy(&zRet[nIn], zAppend, nAppend+1);
12643 }else{
12644 sqlite3_free(zRet);
12645 zRet = 0;
12646 *pRc = SQLITE_NOMEM;
12647 }
12648 sqlite3_free(zAppend);
12649 sqlite3_free(zIn);
12650 }
12651 va_end(ap);
12652 return zRet;
12653 }
12654
12655 /*
12656 ** Return true if zId must be quoted in order to use it as an SQL
12657 ** identifier, or false otherwise.
12658 */
idxIdentifierRequiresQuotes(const char * zId)12659 static int idxIdentifierRequiresQuotes(const char *zId){
12660 int i;
12661 int nId = STRLEN(zId);
12662
12663 if( sqlite3_keyword_check(zId, nId) ) return 1;
12664
12665 for(i=0; zId[i]; i++){
12666 if( !(zId[i]=='_')
12667 && !(zId[i]>='0' && zId[i]<='9')
12668 && !(zId[i]>='a' && zId[i]<='z')
12669 && !(zId[i]>='A' && zId[i]<='Z')
12670 ){
12671 return 1;
12672 }
12673 }
12674 return 0;
12675 }
12676
12677 /*
12678 ** This function appends an index column definition suitable for constraint
12679 ** pCons to the string passed as zIn and returns the result.
12680 */
idxAppendColDefn(int * pRc,char * zIn,IdxTable * pTab,IdxConstraint * pCons)12681 static char *idxAppendColDefn(
12682 int *pRc, /* IN/OUT: Error code */
12683 char *zIn, /* Column defn accumulated so far */
12684 IdxTable *pTab, /* Table index will be created on */
12685 IdxConstraint *pCons
12686 ){
12687 char *zRet = zIn;
12688 IdxColumn *p = &pTab->aCol[pCons->iCol];
12689 if( zRet ) zRet = idxAppendText(pRc, zRet, ", ");
12690
12691 if( idxIdentifierRequiresQuotes(p->zName) ){
12692 zRet = idxAppendText(pRc, zRet, "%Q", p->zName);
12693 }else{
12694 zRet = idxAppendText(pRc, zRet, "%s", p->zName);
12695 }
12696
12697 if( sqlite3_stricmp(p->zColl, pCons->zColl) ){
12698 if( idxIdentifierRequiresQuotes(pCons->zColl) ){
12699 zRet = idxAppendText(pRc, zRet, " COLLATE %Q", pCons->zColl);
12700 }else{
12701 zRet = idxAppendText(pRc, zRet, " COLLATE %s", pCons->zColl);
12702 }
12703 }
12704
12705 if( pCons->bDesc ){
12706 zRet = idxAppendText(pRc, zRet, " DESC");
12707 }
12708 return zRet;
12709 }
12710
12711 /*
12712 ** Search database dbm for an index compatible with the one idxCreateFromCons()
12713 ** would create from arguments pScan, pEq and pTail. If no error occurs and
12714 ** such an index is found, return non-zero. Or, if no such index is found,
12715 ** return zero.
12716 **
12717 ** If an error occurs, set *pRc to an SQLite error code and return zero.
12718 */
idxFindCompatible(int * pRc,sqlite3 * dbm,IdxScan * pScan,IdxConstraint * pEq,IdxConstraint * pTail)12719 static int idxFindCompatible(
12720 int *pRc, /* OUT: Error code */
12721 sqlite3* dbm, /* Database to search */
12722 IdxScan *pScan, /* Scan for table to search for index on */
12723 IdxConstraint *pEq, /* List of == constraints */
12724 IdxConstraint *pTail /* List of range constraints */
12725 ){
12726 const char *zTbl = pScan->pTab->zName;
12727 sqlite3_stmt *pIdxList = 0;
12728 IdxConstraint *pIter;
12729 int nEq = 0; /* Number of elements in pEq */
12730 int rc;
12731
12732 /* Count the elements in list pEq */
12733 for(pIter=pEq; pIter; pIter=pIter->pLink) nEq++;
12734
12735 rc = idxPrintfPrepareStmt(dbm, &pIdxList, 0, "PRAGMA index_list=%Q", zTbl);
12736 while( rc==SQLITE_OK && sqlite3_step(pIdxList)==SQLITE_ROW ){
12737 int bMatch = 1;
12738 IdxConstraint *pT = pTail;
12739 sqlite3_stmt *pInfo = 0;
12740 const char *zIdx = (const char*)sqlite3_column_text(pIdxList, 1);
12741 if( zIdx==0 ) continue;
12742
12743 /* Zero the IdxConstraint.bFlag values in the pEq list */
12744 for(pIter=pEq; pIter; pIter=pIter->pLink) pIter->bFlag = 0;
12745
12746 rc = idxPrintfPrepareStmt(dbm, &pInfo, 0, "PRAGMA index_xInfo=%Q", zIdx);
12747 while( rc==SQLITE_OK && sqlite3_step(pInfo)==SQLITE_ROW ){
12748 int iIdx = sqlite3_column_int(pInfo, 0);
12749 int iCol = sqlite3_column_int(pInfo, 1);
12750 const char *zColl = (const char*)sqlite3_column_text(pInfo, 4);
12751
12752 if( iIdx<nEq ){
12753 for(pIter=pEq; pIter; pIter=pIter->pLink){
12754 if( pIter->bFlag ) continue;
12755 if( pIter->iCol!=iCol ) continue;
12756 if( sqlite3_stricmp(pIter->zColl, zColl) ) continue;
12757 pIter->bFlag = 1;
12758 break;
12759 }
12760 if( pIter==0 ){
12761 bMatch = 0;
12762 break;
12763 }
12764 }else{
12765 if( pT ){
12766 if( pT->iCol!=iCol || sqlite3_stricmp(pT->zColl, zColl) ){
12767 bMatch = 0;
12768 break;
12769 }
12770 pT = pT->pLink;
12771 }
12772 }
12773 }
12774 idxFinalize(&rc, pInfo);
12775
12776 if( rc==SQLITE_OK && bMatch ){
12777 sqlite3_finalize(pIdxList);
12778 return 1;
12779 }
12780 }
12781 idxFinalize(&rc, pIdxList);
12782
12783 *pRc = rc;
12784 return 0;
12785 }
12786
12787 /* Callback for sqlite3_exec() with query with leading count(*) column.
12788 * The first argument is expected to be an int*, referent to be incremented
12789 * if that leading column is not exactly '0'.
12790 */
countNonzeros(void * pCount,int nc,char * azResults[],char * azColumns[])12791 static int countNonzeros(void* pCount, int nc,
12792 char* azResults[], char* azColumns[]){
12793 (void)azColumns; /* Suppress unused parameter warning */
12794 if( nc>0 && (azResults[0][0]!='0' || azResults[0][1]!=0) ){
12795 *((int *)pCount) += 1;
12796 }
12797 return 0;
12798 }
12799
idxCreateFromCons(sqlite3expert * p,IdxScan * pScan,IdxConstraint * pEq,IdxConstraint * pTail)12800 static int idxCreateFromCons(
12801 sqlite3expert *p,
12802 IdxScan *pScan,
12803 IdxConstraint *pEq,
12804 IdxConstraint *pTail
12805 ){
12806 sqlite3 *dbm = p->dbm;
12807 int rc = SQLITE_OK;
12808 if( (pEq || pTail) && 0==idxFindCompatible(&rc, dbm, pScan, pEq, pTail) ){
12809 IdxTable *pTab = pScan->pTab;
12810 char *zCols = 0;
12811 char *zIdx = 0;
12812 IdxConstraint *pCons;
12813 unsigned int h = 0;
12814 const char *zFmt;
12815
12816 for(pCons=pEq; pCons; pCons=pCons->pLink){
12817 zCols = idxAppendColDefn(&rc, zCols, pTab, pCons);
12818 }
12819 for(pCons=pTail; pCons; pCons=pCons->pLink){
12820 zCols = idxAppendColDefn(&rc, zCols, pTab, pCons);
12821 }
12822
12823 if( rc==SQLITE_OK ){
12824 /* Hash the list of columns to come up with a name for the index */
12825 const char *zTable = pScan->pTab->zName;
12826 int quoteTable = idxIdentifierRequiresQuotes(zTable);
12827 char *zName = 0; /* Index name */
12828 int collisions = 0;
12829 do{
12830 int i;
12831 char *zFind;
12832 for(i=0; zCols[i]; i++){
12833 h += ((h<<3) + zCols[i]);
12834 }
12835 sqlite3_free(zName);
12836 zName = sqlite3_mprintf("%s_idx_%08x", zTable, h);
12837 if( zName==0 ) break;
12838 /* Is is unique among table, view and index names? */
12839 zFmt = "SELECT count(*) FROM sqlite_schema WHERE name=%Q"
12840 " AND type in ('index','table','view')";
12841 zFind = sqlite3_mprintf(zFmt, zName);
12842 i = 0;
12843 rc = sqlite3_exec(dbm, zFind, countNonzeros, &i, 0);
12844 assert(rc==SQLITE_OK);
12845 sqlite3_free(zFind);
12846 if( i==0 ){
12847 collisions = 0;
12848 break;
12849 }
12850 ++collisions;
12851 }while( collisions<50 && zName!=0 );
12852 if( collisions ){
12853 /* This return means "Gave up trying to find a unique index name." */
12854 rc = SQLITE_BUSY_TIMEOUT;
12855 }else if( zName==0 ){
12856 rc = SQLITE_NOMEM;
12857 }else{
12858 if( quoteTable ){
12859 zFmt = "CREATE INDEX \"%w\" ON \"%w\"(%s)";
12860 }else{
12861 zFmt = "CREATE INDEX %s ON %s(%s)";
12862 }
12863 zIdx = sqlite3_mprintf(zFmt, zName, zTable, zCols);
12864 if( !zIdx ){
12865 rc = SQLITE_NOMEM;
12866 }else{
12867 rc = sqlite3_exec(dbm, zIdx, 0, 0, p->pzErrmsg);
12868 if( rc!=SQLITE_OK ){
12869 rc = SQLITE_BUSY_TIMEOUT;
12870 }else{
12871 idxHashAdd(&rc, &p->hIdx, zName, zIdx);
12872 }
12873 }
12874 sqlite3_free(zName);
12875 sqlite3_free(zIdx);
12876 }
12877 }
12878
12879 sqlite3_free(zCols);
12880 }
12881 return rc;
12882 }
12883
12884 /*
12885 ** Return true if list pList (linked by IdxConstraint.pLink) contains
12886 ** a constraint compatible with *p. Otherwise return false.
12887 */
idxFindConstraint(IdxConstraint * pList,IdxConstraint * p)12888 static int idxFindConstraint(IdxConstraint *pList, IdxConstraint *p){
12889 IdxConstraint *pCmp;
12890 for(pCmp=pList; pCmp; pCmp=pCmp->pLink){
12891 if( p->iCol==pCmp->iCol ) return 1;
12892 }
12893 return 0;
12894 }
12895
idxCreateFromWhere(sqlite3expert * p,IdxScan * pScan,IdxConstraint * pTail)12896 static int idxCreateFromWhere(
12897 sqlite3expert *p,
12898 IdxScan *pScan, /* Create indexes for this scan */
12899 IdxConstraint *pTail /* range/ORDER BY constraints for inclusion */
12900 ){
12901 IdxConstraint *p1 = 0;
12902 IdxConstraint *pCon;
12903 int rc;
12904
12905 /* Gather up all the == constraints. */
12906 for(pCon=pScan->pEq; pCon; pCon=pCon->pNext){
12907 if( !idxFindConstraint(p1, pCon) && !idxFindConstraint(pTail, pCon) ){
12908 pCon->pLink = p1;
12909 p1 = pCon;
12910 }
12911 }
12912
12913 /* Create an index using the == constraints collected above. And the
12914 ** range constraint/ORDER BY terms passed in by the caller, if any. */
12915 rc = idxCreateFromCons(p, pScan, p1, pTail);
12916
12917 /* If no range/ORDER BY passed by the caller, create a version of the
12918 ** index for each range constraint. */
12919 if( pTail==0 ){
12920 for(pCon=pScan->pRange; rc==SQLITE_OK && pCon; pCon=pCon->pNext){
12921 assert( pCon->pLink==0 );
12922 if( !idxFindConstraint(p1, pCon) && !idxFindConstraint(pTail, pCon) ){
12923 rc = idxCreateFromCons(p, pScan, p1, pCon);
12924 }
12925 }
12926 }
12927
12928 return rc;
12929 }
12930
12931 /*
12932 ** Create candidate indexes in database [dbm] based on the data in
12933 ** linked-list pScan.
12934 */
idxCreateCandidates(sqlite3expert * p)12935 static int idxCreateCandidates(sqlite3expert *p){
12936 int rc = SQLITE_OK;
12937 IdxScan *pIter;
12938
12939 for(pIter=p->pScan; pIter && rc==SQLITE_OK; pIter=pIter->pNextScan){
12940 rc = idxCreateFromWhere(p, pIter, 0);
12941 if( rc==SQLITE_OK && pIter->pOrder ){
12942 rc = idxCreateFromWhere(p, pIter, pIter->pOrder);
12943 }
12944 }
12945
12946 return rc;
12947 }
12948
12949 /*
12950 ** Free all elements of the linked list starting at pConstraint.
12951 */
idxConstraintFree(IdxConstraint * pConstraint)12952 static void idxConstraintFree(IdxConstraint *pConstraint){
12953 IdxConstraint *pNext;
12954 IdxConstraint *p;
12955
12956 for(p=pConstraint; p; p=pNext){
12957 pNext = p->pNext;
12958 sqlite3_free(p);
12959 }
12960 }
12961
12962 /*
12963 ** Free all elements of the linked list starting from pScan up until pLast
12964 ** (pLast is not freed).
12965 */
idxScanFree(IdxScan * pScan,IdxScan * pLast)12966 static void idxScanFree(IdxScan *pScan, IdxScan *pLast){
12967 IdxScan *p;
12968 IdxScan *pNext;
12969 for(p=pScan; p!=pLast; p=pNext){
12970 pNext = p->pNextScan;
12971 idxConstraintFree(p->pOrder);
12972 idxConstraintFree(p->pEq);
12973 idxConstraintFree(p->pRange);
12974 sqlite3_free(p);
12975 }
12976 }
12977
12978 /*
12979 ** Free all elements of the linked list starting from pStatement up
12980 ** until pLast (pLast is not freed).
12981 */
idxStatementFree(IdxStatement * pStatement,IdxStatement * pLast)12982 static void idxStatementFree(IdxStatement *pStatement, IdxStatement *pLast){
12983 IdxStatement *p;
12984 IdxStatement *pNext;
12985 for(p=pStatement; p!=pLast; p=pNext){
12986 pNext = p->pNext;
12987 sqlite3_free(p->zEQP);
12988 sqlite3_free(p->zIdx);
12989 sqlite3_free(p);
12990 }
12991 }
12992
12993 /*
12994 ** Free the linked list of IdxTable objects starting at pTab.
12995 */
idxTableFree(IdxTable * pTab)12996 static void idxTableFree(IdxTable *pTab){
12997 IdxTable *pIter;
12998 IdxTable *pNext;
12999 for(pIter=pTab; pIter; pIter=pNext){
13000 pNext = pIter->pNext;
13001 sqlite3_free(pIter);
13002 }
13003 }
13004
13005 /*
13006 ** Free the linked list of IdxWrite objects starting at pTab.
13007 */
idxWriteFree(IdxWrite * pTab)13008 static void idxWriteFree(IdxWrite *pTab){
13009 IdxWrite *pIter;
13010 IdxWrite *pNext;
13011 for(pIter=pTab; pIter; pIter=pNext){
13012 pNext = pIter->pNext;
13013 sqlite3_free(pIter);
13014 }
13015 }
13016
13017
13018
13019 /*
13020 ** This function is called after candidate indexes have been created. It
13021 ** runs all the queries to see which indexes they prefer, and populates
13022 ** IdxStatement.zIdx and IdxStatement.zEQP with the results.
13023 */
idxFindIndexes(sqlite3expert * p,char ** pzErr)13024 static int idxFindIndexes(
13025 sqlite3expert *p,
13026 char **pzErr /* OUT: Error message (sqlite3_malloc) */
13027 ){
13028 IdxStatement *pStmt;
13029 sqlite3 *dbm = p->dbm;
13030 int rc = SQLITE_OK;
13031
13032 IdxHash hIdx;
13033 idxHashInit(&hIdx);
13034
13035 for(pStmt=p->pStatement; rc==SQLITE_OK && pStmt; pStmt=pStmt->pNext){
13036 IdxHashEntry *pEntry;
13037 sqlite3_stmt *pExplain = 0;
13038 idxHashClear(&hIdx);
13039 rc = idxPrintfPrepareStmt(dbm, &pExplain, pzErr,
13040 "EXPLAIN QUERY PLAN %s", pStmt->zSql
13041 );
13042 while( rc==SQLITE_OK && sqlite3_step(pExplain)==SQLITE_ROW ){
13043 /* int iId = sqlite3_column_int(pExplain, 0); */
13044 /* int iParent = sqlite3_column_int(pExplain, 1); */
13045 /* int iNotUsed = sqlite3_column_int(pExplain, 2); */
13046 const char *zDetail = (const char*)sqlite3_column_text(pExplain, 3);
13047 int nDetail;
13048 int i;
13049
13050 if( !zDetail ) continue;
13051 nDetail = STRLEN(zDetail);
13052
13053 for(i=0; i<nDetail; i++){
13054 const char *zIdx = 0;
13055 if( i+13<nDetail && memcmp(&zDetail[i], " USING INDEX ", 13)==0 ){
13056 zIdx = &zDetail[i+13];
13057 }else if( i+22<nDetail
13058 && memcmp(&zDetail[i], " USING COVERING INDEX ", 22)==0
13059 ){
13060 zIdx = &zDetail[i+22];
13061 }
13062 if( zIdx ){
13063 const char *zSql;
13064 int nIdx = 0;
13065 while( zIdx[nIdx]!='\0' && (zIdx[nIdx]!=' ' || zIdx[nIdx+1]!='(') ){
13066 nIdx++;
13067 }
13068 zSql = idxHashSearch(&p->hIdx, zIdx, nIdx);
13069 if( zSql ){
13070 idxHashAdd(&rc, &hIdx, zSql, 0);
13071 if( rc ) goto find_indexes_out;
13072 }
13073 break;
13074 }
13075 }
13076
13077 if( zDetail[0]!='-' ){
13078 pStmt->zEQP = idxAppendText(&rc, pStmt->zEQP, "%s\n", zDetail);
13079 }
13080 }
13081
13082 for(pEntry=hIdx.pFirst; pEntry; pEntry=pEntry->pNext){
13083 pStmt->zIdx = idxAppendText(&rc, pStmt->zIdx, "%s;\n", pEntry->zKey);
13084 }
13085
13086 idxFinalize(&rc, pExplain);
13087 }
13088
13089 find_indexes_out:
13090 idxHashClear(&hIdx);
13091 return rc;
13092 }
13093
idxAuthCallback(void * pCtx,int eOp,const char * z3,const char * z4,const char * zDb,const char * zTrigger)13094 static int idxAuthCallback(
13095 void *pCtx,
13096 int eOp,
13097 const char *z3,
13098 const char *z4,
13099 const char *zDb,
13100 const char *zTrigger
13101 ){
13102 int rc = SQLITE_OK;
13103 (void)z4;
13104 (void)zTrigger;
13105 if( eOp==SQLITE_INSERT || eOp==SQLITE_UPDATE || eOp==SQLITE_DELETE ){
13106 if( sqlite3_stricmp(zDb, "main")==0 ){
13107 sqlite3expert *p = (sqlite3expert*)pCtx;
13108 IdxTable *pTab;
13109 for(pTab=p->pTable; pTab; pTab=pTab->pNext){
13110 if( 0==sqlite3_stricmp(z3, pTab->zName) ) break;
13111 }
13112 if( pTab ){
13113 IdxWrite *pWrite;
13114 for(pWrite=p->pWrite; pWrite; pWrite=pWrite->pNext){
13115 if( pWrite->pTab==pTab && pWrite->eOp==eOp ) break;
13116 }
13117 if( pWrite==0 ){
13118 pWrite = idxMalloc(&rc, sizeof(IdxWrite));
13119 if( rc==SQLITE_OK ){
13120 pWrite->pTab = pTab;
13121 pWrite->eOp = eOp;
13122 pWrite->pNext = p->pWrite;
13123 p->pWrite = pWrite;
13124 }
13125 }
13126 }
13127 }
13128 }
13129 return rc;
13130 }
13131
idxProcessOneTrigger(sqlite3expert * p,IdxWrite * pWrite,char ** pzErr)13132 static int idxProcessOneTrigger(
13133 sqlite3expert *p,
13134 IdxWrite *pWrite,
13135 char **pzErr
13136 ){
13137 static const char *zInt = UNIQUE_TABLE_NAME;
13138 static const char *zDrop = "DROP TABLE " UNIQUE_TABLE_NAME;
13139 IdxTable *pTab = pWrite->pTab;
13140 const char *zTab = pTab->zName;
13141 const char *zSql =
13142 "SELECT 'CREATE TEMP' || substr(sql, 7) FROM sqlite_schema "
13143 "WHERE tbl_name = %Q AND type IN ('table', 'trigger') "
13144 "ORDER BY type;";
13145 sqlite3_stmt *pSelect = 0;
13146 int rc = SQLITE_OK;
13147 char *zWrite = 0;
13148
13149 /* Create the table and its triggers in the temp schema */
13150 rc = idxPrintfPrepareStmt(p->db, &pSelect, pzErr, zSql, zTab, zTab);
13151 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSelect) ){
13152 const char *zCreate = (const char*)sqlite3_column_text(pSelect, 0);
13153 if( zCreate==0 ) continue;
13154 rc = sqlite3_exec(p->dbv, zCreate, 0, 0, pzErr);
13155 }
13156 idxFinalize(&rc, pSelect);
13157
13158 /* Rename the table in the temp schema to zInt */
13159 if( rc==SQLITE_OK ){
13160 char *z = sqlite3_mprintf("ALTER TABLE temp.%Q RENAME TO %Q", zTab, zInt);
13161 if( z==0 ){
13162 rc = SQLITE_NOMEM;
13163 }else{
13164 rc = sqlite3_exec(p->dbv, z, 0, 0, pzErr);
13165 sqlite3_free(z);
13166 }
13167 }
13168
13169 switch( pWrite->eOp ){
13170 case SQLITE_INSERT: {
13171 int i;
13172 zWrite = idxAppendText(&rc, zWrite, "INSERT INTO %Q VALUES(", zInt);
13173 for(i=0; i<pTab->nCol; i++){
13174 zWrite = idxAppendText(&rc, zWrite, "%s?", i==0 ? "" : ", ");
13175 }
13176 zWrite = idxAppendText(&rc, zWrite, ")");
13177 break;
13178 }
13179 case SQLITE_UPDATE: {
13180 int i;
13181 zWrite = idxAppendText(&rc, zWrite, "UPDATE %Q SET ", zInt);
13182 for(i=0; i<pTab->nCol; i++){
13183 zWrite = idxAppendText(&rc, zWrite, "%s%Q=?", i==0 ? "" : ", ",
13184 pTab->aCol[i].zName
13185 );
13186 }
13187 break;
13188 }
13189 default: {
13190 assert( pWrite->eOp==SQLITE_DELETE );
13191 if( rc==SQLITE_OK ){
13192 zWrite = sqlite3_mprintf("DELETE FROM %Q", zInt);
13193 if( zWrite==0 ) rc = SQLITE_NOMEM;
13194 }
13195 }
13196 }
13197
13198 if( rc==SQLITE_OK ){
13199 sqlite3_stmt *pX = 0;
13200 rc = sqlite3_prepare_v2(p->dbv, zWrite, -1, &pX, 0);
13201 idxFinalize(&rc, pX);
13202 if( rc!=SQLITE_OK ){
13203 idxDatabaseError(p->dbv, pzErr);
13204 }
13205 }
13206 sqlite3_free(zWrite);
13207
13208 if( rc==SQLITE_OK ){
13209 rc = sqlite3_exec(p->dbv, zDrop, 0, 0, pzErr);
13210 }
13211
13212 return rc;
13213 }
13214
idxProcessTriggers(sqlite3expert * p,char ** pzErr)13215 static int idxProcessTriggers(sqlite3expert *p, char **pzErr){
13216 int rc = SQLITE_OK;
13217 IdxWrite *pEnd = 0;
13218 IdxWrite *pFirst = p->pWrite;
13219
13220 while( rc==SQLITE_OK && pFirst!=pEnd ){
13221 IdxWrite *pIter;
13222 for(pIter=pFirst; rc==SQLITE_OK && pIter!=pEnd; pIter=pIter->pNext){
13223 rc = idxProcessOneTrigger(p, pIter, pzErr);
13224 }
13225 pEnd = pFirst;
13226 pFirst = p->pWrite;
13227 }
13228
13229 return rc;
13230 }
13231
13232
idxCreateVtabSchema(sqlite3expert * p,char ** pzErrmsg)13233 static int idxCreateVtabSchema(sqlite3expert *p, char **pzErrmsg){
13234 int rc = idxRegisterVtab(p);
13235 sqlite3_stmt *pSchema = 0;
13236
13237 /* For each table in the main db schema:
13238 **
13239 ** 1) Add an entry to the p->pTable list, and
13240 ** 2) Create the equivalent virtual table in dbv.
13241 */
13242 rc = idxPrepareStmt(p->db, &pSchema, pzErrmsg,
13243 "SELECT type, name, sql, 1 FROM sqlite_schema "
13244 "WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%%' "
13245 " UNION ALL "
13246 "SELECT type, name, sql, 2 FROM sqlite_schema "
13247 "WHERE type = 'trigger'"
13248 " AND tbl_name IN(SELECT name FROM sqlite_schema WHERE type = 'view') "
13249 "ORDER BY 4, 1"
13250 );
13251 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSchema) ){
13252 const char *zType = (const char*)sqlite3_column_text(pSchema, 0);
13253 const char *zName = (const char*)sqlite3_column_text(pSchema, 1);
13254 const char *zSql = (const char*)sqlite3_column_text(pSchema, 2);
13255
13256 if( zType==0 || zName==0 ) continue;
13257 if( zType[0]=='v' || zType[1]=='r' ){
13258 if( zSql ) rc = sqlite3_exec(p->dbv, zSql, 0, 0, pzErrmsg);
13259 }else{
13260 IdxTable *pTab;
13261 rc = idxGetTableInfo(p->db, zName, &pTab, pzErrmsg);
13262 if( rc==SQLITE_OK ){
13263 int i;
13264 char *zInner = 0;
13265 char *zOuter = 0;
13266 pTab->pNext = p->pTable;
13267 p->pTable = pTab;
13268
13269 /* The statement the vtab will pass to sqlite3_declare_vtab() */
13270 zInner = idxAppendText(&rc, 0, "CREATE TABLE x(");
13271 for(i=0; i<pTab->nCol; i++){
13272 zInner = idxAppendText(&rc, zInner, "%s%Q COLLATE %s",
13273 (i==0 ? "" : ", "), pTab->aCol[i].zName, pTab->aCol[i].zColl
13274 );
13275 }
13276 zInner = idxAppendText(&rc, zInner, ")");
13277
13278 /* The CVT statement to create the vtab */
13279 zOuter = idxAppendText(&rc, 0,
13280 "CREATE VIRTUAL TABLE %Q USING expert(%Q)", zName, zInner
13281 );
13282 if( rc==SQLITE_OK ){
13283 rc = sqlite3_exec(p->dbv, zOuter, 0, 0, pzErrmsg);
13284 }
13285 sqlite3_free(zInner);
13286 sqlite3_free(zOuter);
13287 }
13288 }
13289 }
13290 idxFinalize(&rc, pSchema);
13291 return rc;
13292 }
13293
13294 struct IdxSampleCtx {
13295 int iTarget;
13296 double target; /* Target nRet/nRow value */
13297 double nRow; /* Number of rows seen */
13298 double nRet; /* Number of rows returned */
13299 };
13300
idxSampleFunc(sqlite3_context * pCtx,int argc,sqlite3_value ** argv)13301 static void idxSampleFunc(
13302 sqlite3_context *pCtx,
13303 int argc,
13304 sqlite3_value **argv
13305 ){
13306 struct IdxSampleCtx *p = (struct IdxSampleCtx*)sqlite3_user_data(pCtx);
13307 int bRet;
13308
13309 (void)argv;
13310 assert( argc==0 );
13311 if( p->nRow==0.0 ){
13312 bRet = 1;
13313 }else{
13314 bRet = (p->nRet / p->nRow) <= p->target;
13315 if( bRet==0 ){
13316 unsigned short rnd;
13317 sqlite3_randomness(2, (void*)&rnd);
13318 bRet = ((int)rnd % 100) <= p->iTarget;
13319 }
13320 }
13321
13322 sqlite3_result_int(pCtx, bRet);
13323 p->nRow += 1.0;
13324 p->nRet += (double)bRet;
13325 }
13326
13327 struct IdxRemCtx {
13328 int nSlot;
13329 struct IdxRemSlot {
13330 int eType; /* SQLITE_NULL, INTEGER, REAL, TEXT, BLOB */
13331 i64 iVal; /* SQLITE_INTEGER value */
13332 double rVal; /* SQLITE_FLOAT value */
13333 int nByte; /* Bytes of space allocated at z */
13334 int n; /* Size of buffer z */
13335 char *z; /* SQLITE_TEXT/BLOB value */
13336 } aSlot[1];
13337 };
13338
13339 /*
13340 ** Implementation of scalar function rem().
13341 */
idxRemFunc(sqlite3_context * pCtx,int argc,sqlite3_value ** argv)13342 static void idxRemFunc(
13343 sqlite3_context *pCtx,
13344 int argc,
13345 sqlite3_value **argv
13346 ){
13347 struct IdxRemCtx *p = (struct IdxRemCtx*)sqlite3_user_data(pCtx);
13348 struct IdxRemSlot *pSlot;
13349 int iSlot;
13350 assert( argc==2 );
13351
13352 iSlot = sqlite3_value_int(argv[0]);
13353 assert( iSlot<=p->nSlot );
13354 pSlot = &p->aSlot[iSlot];
13355
13356 switch( pSlot->eType ){
13357 case SQLITE_NULL:
13358 /* no-op */
13359 break;
13360
13361 case SQLITE_INTEGER:
13362 sqlite3_result_int64(pCtx, pSlot->iVal);
13363 break;
13364
13365 case SQLITE_FLOAT:
13366 sqlite3_result_double(pCtx, pSlot->rVal);
13367 break;
13368
13369 case SQLITE_BLOB:
13370 sqlite3_result_blob(pCtx, pSlot->z, pSlot->n, SQLITE_TRANSIENT);
13371 break;
13372
13373 case SQLITE_TEXT:
13374 sqlite3_result_text(pCtx, pSlot->z, pSlot->n, SQLITE_TRANSIENT);
13375 break;
13376 }
13377
13378 pSlot->eType = sqlite3_value_type(argv[1]);
13379 switch( pSlot->eType ){
13380 case SQLITE_NULL:
13381 /* no-op */
13382 break;
13383
13384 case SQLITE_INTEGER:
13385 pSlot->iVal = sqlite3_value_int64(argv[1]);
13386 break;
13387
13388 case SQLITE_FLOAT:
13389 pSlot->rVal = sqlite3_value_double(argv[1]);
13390 break;
13391
13392 case SQLITE_BLOB:
13393 case SQLITE_TEXT: {
13394 int nByte = sqlite3_value_bytes(argv[1]);
13395 const void *pData = 0;
13396 if( nByte>pSlot->nByte ){
13397 char *zNew = (char*)sqlite3_realloc(pSlot->z, nByte*2);
13398 if( zNew==0 ){
13399 sqlite3_result_error_nomem(pCtx);
13400 return;
13401 }
13402 pSlot->nByte = nByte*2;
13403 pSlot->z = zNew;
13404 }
13405 pSlot->n = nByte;
13406 if( pSlot->eType==SQLITE_BLOB ){
13407 pData = sqlite3_value_blob(argv[1]);
13408 if( pData ) memcpy(pSlot->z, pData, nByte);
13409 }else{
13410 pData = sqlite3_value_text(argv[1]);
13411 memcpy(pSlot->z, pData, nByte);
13412 }
13413 break;
13414 }
13415 }
13416 }
13417
idxLargestIndex(sqlite3 * db,int * pnMax,char ** pzErr)13418 static int idxLargestIndex(sqlite3 *db, int *pnMax, char **pzErr){
13419 int rc = SQLITE_OK;
13420 const char *zMax =
13421 "SELECT max(i.seqno) FROM "
13422 " sqlite_schema AS s, "
13423 " pragma_index_list(s.name) AS l, "
13424 " pragma_index_info(l.name) AS i "
13425 "WHERE s.type = 'table'";
13426 sqlite3_stmt *pMax = 0;
13427
13428 *pnMax = 0;
13429 rc = idxPrepareStmt(db, &pMax, pzErr, zMax);
13430 if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pMax) ){
13431 *pnMax = sqlite3_column_int(pMax, 0) + 1;
13432 }
13433 idxFinalize(&rc, pMax);
13434
13435 return rc;
13436 }
13437
idxPopulateOneStat1(sqlite3expert * p,sqlite3_stmt * pIndexXInfo,sqlite3_stmt * pWriteStat,const char * zTab,const char * zIdx,char ** pzErr)13438 static int idxPopulateOneStat1(
13439 sqlite3expert *p,
13440 sqlite3_stmt *pIndexXInfo,
13441 sqlite3_stmt *pWriteStat,
13442 const char *zTab,
13443 const char *zIdx,
13444 char **pzErr
13445 ){
13446 char *zCols = 0;
13447 char *zOrder = 0;
13448 char *zQuery = 0;
13449 int nCol = 0;
13450 int i;
13451 sqlite3_stmt *pQuery = 0;
13452 int *aStat = 0;
13453 int rc = SQLITE_OK;
13454
13455 assert( p->iSample>0 );
13456
13457 /* Formulate the query text */
13458 sqlite3_bind_text(pIndexXInfo, 1, zIdx, -1, SQLITE_STATIC);
13459 while( SQLITE_OK==rc && SQLITE_ROW==sqlite3_step(pIndexXInfo) ){
13460 const char *zComma = zCols==0 ? "" : ", ";
13461 const char *zName = (const char*)sqlite3_column_text(pIndexXInfo, 0);
13462 const char *zColl = (const char*)sqlite3_column_text(pIndexXInfo, 1);
13463 zCols = idxAppendText(&rc, zCols,
13464 "%sx.%Q IS rem(%d, x.%Q) COLLATE %s", zComma, zName, nCol, zName, zColl
13465 );
13466 zOrder = idxAppendText(&rc, zOrder, "%s%d", zComma, ++nCol);
13467 }
13468 sqlite3_reset(pIndexXInfo);
13469 if( rc==SQLITE_OK ){
13470 if( p->iSample==100 ){
13471 zQuery = sqlite3_mprintf(
13472 "SELECT %s FROM %Q x ORDER BY %s", zCols, zTab, zOrder
13473 );
13474 }else{
13475 zQuery = sqlite3_mprintf(
13476 "SELECT %s FROM temp."UNIQUE_TABLE_NAME" x ORDER BY %s", zCols, zOrder
13477 );
13478 }
13479 }
13480 sqlite3_free(zCols);
13481 sqlite3_free(zOrder);
13482
13483 /* Formulate the query text */
13484 if( rc==SQLITE_OK ){
13485 sqlite3 *dbrem = (p->iSample==100 ? p->db : p->dbv);
13486 rc = idxPrepareStmt(dbrem, &pQuery, pzErr, zQuery);
13487 }
13488 sqlite3_free(zQuery);
13489
13490 if( rc==SQLITE_OK ){
13491 aStat = (int*)idxMalloc(&rc, sizeof(int)*(nCol+1));
13492 }
13493 if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pQuery) ){
13494 IdxHashEntry *pEntry;
13495 char *zStat = 0;
13496 for(i=0; i<=nCol; i++) aStat[i] = 1;
13497 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pQuery) ){
13498 aStat[0]++;
13499 for(i=0; i<nCol; i++){
13500 if( sqlite3_column_int(pQuery, i)==0 ) break;
13501 }
13502 for(/*no-op*/; i<nCol; i++){
13503 aStat[i+1]++;
13504 }
13505 }
13506
13507 if( rc==SQLITE_OK ){
13508 int s0 = aStat[0];
13509 zStat = sqlite3_mprintf("%d", s0);
13510 if( zStat==0 ) rc = SQLITE_NOMEM;
13511 for(i=1; rc==SQLITE_OK && i<=nCol; i++){
13512 zStat = idxAppendText(&rc, zStat, " %d", (s0+aStat[i]/2) / aStat[i]);
13513 }
13514 }
13515
13516 if( rc==SQLITE_OK ){
13517 sqlite3_bind_text(pWriteStat, 1, zTab, -1, SQLITE_STATIC);
13518 sqlite3_bind_text(pWriteStat, 2, zIdx, -1, SQLITE_STATIC);
13519 sqlite3_bind_text(pWriteStat, 3, zStat, -1, SQLITE_STATIC);
13520 sqlite3_step(pWriteStat);
13521 rc = sqlite3_reset(pWriteStat);
13522 }
13523
13524 pEntry = idxHashFind(&p->hIdx, zIdx, STRLEN(zIdx));
13525 if( pEntry ){
13526 assert( pEntry->zVal2==0 );
13527 pEntry->zVal2 = zStat;
13528 }else{
13529 sqlite3_free(zStat);
13530 }
13531 }
13532 sqlite3_free(aStat);
13533 idxFinalize(&rc, pQuery);
13534
13535 return rc;
13536 }
13537
idxBuildSampleTable(sqlite3expert * p,const char * zTab)13538 static int idxBuildSampleTable(sqlite3expert *p, const char *zTab){
13539 int rc;
13540 char *zSql;
13541
13542 rc = sqlite3_exec(p->dbv,"DROP TABLE IF EXISTS temp."UNIQUE_TABLE_NAME,0,0,0);
13543 if( rc!=SQLITE_OK ) return rc;
13544
13545 zSql = sqlite3_mprintf(
13546 "CREATE TABLE temp." UNIQUE_TABLE_NAME " AS SELECT * FROM %Q", zTab
13547 );
13548 if( zSql==0 ) return SQLITE_NOMEM;
13549 rc = sqlite3_exec(p->dbv, zSql, 0, 0, 0);
13550 sqlite3_free(zSql);
13551
13552 return rc;
13553 }
13554
13555 /*
13556 ** This function is called as part of sqlite3_expert_analyze(). Candidate
13557 ** indexes have already been created in database sqlite3expert.dbm, this
13558 ** function populates sqlite_stat1 table in the same database.
13559 **
13560 ** The stat1 data is generated by querying the
13561 */
idxPopulateStat1(sqlite3expert * p,char ** pzErr)13562 static int idxPopulateStat1(sqlite3expert *p, char **pzErr){
13563 int rc = SQLITE_OK;
13564 int nMax =0;
13565 struct IdxRemCtx *pCtx = 0;
13566 struct IdxSampleCtx samplectx;
13567 int i;
13568 i64 iPrev = -100000;
13569 sqlite3_stmt *pAllIndex = 0;
13570 sqlite3_stmt *pIndexXInfo = 0;
13571 sqlite3_stmt *pWrite = 0;
13572
13573 const char *zAllIndex =
13574 "SELECT s.rowid, s.name, l.name FROM "
13575 " sqlite_schema AS s, "
13576 " pragma_index_list(s.name) AS l "
13577 "WHERE s.type = 'table'";
13578 const char *zIndexXInfo =
13579 "SELECT name, coll FROM pragma_index_xinfo(?) WHERE key";
13580 const char *zWrite = "INSERT INTO sqlite_stat1 VALUES(?, ?, ?)";
13581
13582 /* If iSample==0, no sqlite_stat1 data is required. */
13583 if( p->iSample==0 ) return SQLITE_OK;
13584
13585 rc = idxLargestIndex(p->dbm, &nMax, pzErr);
13586 if( nMax<=0 || rc!=SQLITE_OK ) return rc;
13587
13588 rc = sqlite3_exec(p->dbm, "ANALYZE; PRAGMA writable_schema=1", 0, 0, 0);
13589
13590 if( rc==SQLITE_OK ){
13591 int nByte = sizeof(struct IdxRemCtx) + (sizeof(struct IdxRemSlot) * nMax);
13592 pCtx = (struct IdxRemCtx*)idxMalloc(&rc, nByte);
13593 }
13594
13595 if( rc==SQLITE_OK ){
13596 sqlite3 *dbrem = (p->iSample==100 ? p->db : p->dbv);
13597 rc = sqlite3_create_function(
13598 dbrem, "rem", 2, SQLITE_UTF8, (void*)pCtx, idxRemFunc, 0, 0
13599 );
13600 }
13601 if( rc==SQLITE_OK ){
13602 rc = sqlite3_create_function(
13603 p->db, "sample", 0, SQLITE_UTF8, (void*)&samplectx, idxSampleFunc, 0, 0
13604 );
13605 }
13606
13607 if( rc==SQLITE_OK ){
13608 pCtx->nSlot = nMax+1;
13609 rc = idxPrepareStmt(p->dbm, &pAllIndex, pzErr, zAllIndex);
13610 }
13611 if( rc==SQLITE_OK ){
13612 rc = idxPrepareStmt(p->dbm, &pIndexXInfo, pzErr, zIndexXInfo);
13613 }
13614 if( rc==SQLITE_OK ){
13615 rc = idxPrepareStmt(p->dbm, &pWrite, pzErr, zWrite);
13616 }
13617
13618 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pAllIndex) ){
13619 i64 iRowid = sqlite3_column_int64(pAllIndex, 0);
13620 const char *zTab = (const char*)sqlite3_column_text(pAllIndex, 1);
13621 const char *zIdx = (const char*)sqlite3_column_text(pAllIndex, 2);
13622 if( zTab==0 || zIdx==0 ) continue;
13623 if( p->iSample<100 && iPrev!=iRowid ){
13624 samplectx.target = (double)p->iSample / 100.0;
13625 samplectx.iTarget = p->iSample;
13626 samplectx.nRow = 0.0;
13627 samplectx.nRet = 0.0;
13628 rc = idxBuildSampleTable(p, zTab);
13629 if( rc!=SQLITE_OK ) break;
13630 }
13631 rc = idxPopulateOneStat1(p, pIndexXInfo, pWrite, zTab, zIdx, pzErr);
13632 iPrev = iRowid;
13633 }
13634 if( rc==SQLITE_OK && p->iSample<100 ){
13635 rc = sqlite3_exec(p->dbv,
13636 "DROP TABLE IF EXISTS temp." UNIQUE_TABLE_NAME, 0,0,0
13637 );
13638 }
13639
13640 idxFinalize(&rc, pAllIndex);
13641 idxFinalize(&rc, pIndexXInfo);
13642 idxFinalize(&rc, pWrite);
13643
13644 if( pCtx ){
13645 for(i=0; i<pCtx->nSlot; i++){
13646 sqlite3_free(pCtx->aSlot[i].z);
13647 }
13648 sqlite3_free(pCtx);
13649 }
13650
13651 if( rc==SQLITE_OK ){
13652 rc = sqlite3_exec(p->dbm, "ANALYZE sqlite_schema", 0, 0, 0);
13653 }
13654
13655 sqlite3_exec(p->db, "DROP TABLE IF EXISTS temp."UNIQUE_TABLE_NAME,0,0,0);
13656 return rc;
13657 }
13658
13659 /*
13660 ** Define and possibly pretend to use a useless collation sequence.
13661 ** This pretense allows expert to accept SQL using custom collations.
13662 */
dummyCompare(void * up1,int up2,const void * up3,int up4,const void * up5)13663 static int dummyCompare(void *up1, int up2, const void *up3, int up4, const void *up5){
13664 (void)up1;
13665 (void)up2;
13666 (void)up3;
13667 (void)up4;
13668 (void)up5;
13669 assert(0); /* VDBE should never be run. */
13670 return 0;
13671 }
13672 /* And a callback to register above upon actual need */
useDummyCS(void * up1,sqlite3 * db,int etr,const char * zName)13673 static void useDummyCS(void *up1, sqlite3 *db, int etr, const char *zName){
13674 (void)up1;
13675 sqlite3_create_collation_v2(db, zName, etr, 0, dummyCompare, 0);
13676 }
13677
13678 #if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) \
13679 && !defined(SQLITE_OMIT_INTROSPECTION_PRAGMAS)
13680 /*
13681 ** dummy functions for no-op implementation of UDFs during expert's work
13682 */
dummyUDF(sqlite3_context * up1,int up2,sqlite3_value ** up3)13683 static void dummyUDF(sqlite3_context *up1, int up2, sqlite3_value **up3){
13684 (void)up1;
13685 (void)up2;
13686 (void)up3;
13687 assert(0); /* VDBE should never be run. */
13688 }
dummyUDFvalue(sqlite3_context * up1)13689 static void dummyUDFvalue(sqlite3_context *up1){
13690 (void)up1;
13691 assert(0); /* VDBE should never be run. */
13692 }
13693
13694 /*
13695 ** Register UDFs from user database with another.
13696 */
registerUDFs(sqlite3 * dbSrc,sqlite3 * dbDst)13697 static int registerUDFs(sqlite3 *dbSrc, sqlite3 *dbDst){
13698 sqlite3_stmt *pStmt;
13699 int rc = sqlite3_prepare_v2(dbSrc,
13700 "SELECT name,type,enc,narg,flags "
13701 "FROM pragma_function_list() "
13702 "WHERE builtin==0", -1, &pStmt, 0);
13703 if( rc==SQLITE_OK ){
13704 while( SQLITE_ROW==(rc = sqlite3_step(pStmt)) ){
13705 int nargs = sqlite3_column_int(pStmt,3);
13706 int flags = sqlite3_column_int(pStmt,4);
13707 const char *name = (char*)sqlite3_column_text(pStmt,0);
13708 const char *type = (char*)sqlite3_column_text(pStmt,1);
13709 const char *enc = (char*)sqlite3_column_text(pStmt,2);
13710 if( name==0 || type==0 || enc==0 ){
13711 /* no-op. Only happens on OOM */
13712 }else{
13713 int ienc = SQLITE_UTF8;
13714 int rcf = SQLITE_ERROR;
13715 if( strcmp(enc,"utf16le")==0 ) ienc = SQLITE_UTF16LE;
13716 else if( strcmp(enc,"utf16be")==0 ) ienc = SQLITE_UTF16BE;
13717 ienc |= (flags & (SQLITE_DETERMINISTIC|SQLITE_DIRECTONLY));
13718 if( strcmp(type,"w")==0 ){
13719 rcf = sqlite3_create_window_function(dbDst,name,nargs,ienc,0,
13720 dummyUDF,dummyUDFvalue,0,0,0);
13721 }else if( strcmp(type,"a")==0 ){
13722 rcf = sqlite3_create_function(dbDst,name,nargs,ienc,0,
13723 0,dummyUDF,dummyUDFvalue);
13724 }else if( strcmp(type,"s")==0 ){
13725 rcf = sqlite3_create_function(dbDst,name,nargs,ienc,0,
13726 dummyUDF,0,0);
13727 }
13728 if( rcf!=SQLITE_OK ){
13729 rc = rcf;
13730 break;
13731 }
13732 }
13733 }
13734 sqlite3_finalize(pStmt);
13735 if( rc==SQLITE_DONE ) rc = SQLITE_OK;
13736 }
13737 return rc;
13738 }
13739 #endif
13740
13741 /*
13742 ** Allocate a new sqlite3expert object.
13743 */
sqlite3_expert_new(sqlite3 * db,char ** pzErrmsg)13744 sqlite3expert *sqlite3_expert_new(sqlite3 *db, char **pzErrmsg){
13745 int rc = SQLITE_OK;
13746 sqlite3expert *pNew;
13747
13748 pNew = (sqlite3expert*)idxMalloc(&rc, sizeof(sqlite3expert));
13749
13750 /* Open two in-memory databases to work with. The "vtab database" (dbv)
13751 ** will contain a virtual table corresponding to each real table in
13752 ** the user database schema, and a copy of each view. It is used to
13753 ** collect information regarding the WHERE, ORDER BY and other clauses
13754 ** of the user's query.
13755 */
13756 if( rc==SQLITE_OK ){
13757 pNew->db = db;
13758 pNew->iSample = 100;
13759 rc = sqlite3_open(":memory:", &pNew->dbv);
13760 }
13761 if( rc==SQLITE_OK ){
13762 rc = sqlite3_open(":memory:", &pNew->dbm);
13763 if( rc==SQLITE_OK ){
13764 sqlite3_db_config(pNew->dbm, SQLITE_DBCONFIG_TRIGGER_EQP, 1, (int*)0);
13765 }
13766 }
13767
13768 /* Allow custom collations to be dealt with through prepare. */
13769 if( rc==SQLITE_OK ) rc = sqlite3_collation_needed(pNew->dbm,0,useDummyCS);
13770 if( rc==SQLITE_OK ) rc = sqlite3_collation_needed(pNew->dbv,0,useDummyCS);
13771
13772 #if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) \
13773 && !defined(SQLITE_OMIT_INTROSPECTION_PRAGMAS)
13774 /* Register UDFs from database [db] with [dbm] and [dbv]. */
13775 if( rc==SQLITE_OK ){
13776 rc = registerUDFs(pNew->db, pNew->dbm);
13777 }
13778 if( rc==SQLITE_OK ){
13779 rc = registerUDFs(pNew->db, pNew->dbv);
13780 }
13781 #endif
13782
13783 /* Copy the entire schema of database [db] into [dbm]. */
13784 if( rc==SQLITE_OK ){
13785 sqlite3_stmt *pSql = 0;
13786 rc = idxPrintfPrepareStmt(pNew->db, &pSql, pzErrmsg,
13787 "SELECT sql FROM sqlite_schema WHERE name NOT LIKE 'sqlite_%%'"
13788 " AND sql NOT LIKE 'CREATE VIRTUAL %%'"
13789 );
13790 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
13791 const char *zSql = (const char*)sqlite3_column_text(pSql, 0);
13792 if( zSql ) rc = sqlite3_exec(pNew->dbm, zSql, 0, 0, pzErrmsg);
13793 }
13794 idxFinalize(&rc, pSql);
13795 }
13796
13797 /* Create the vtab schema */
13798 if( rc==SQLITE_OK ){
13799 rc = idxCreateVtabSchema(pNew, pzErrmsg);
13800 }
13801
13802 /* Register the auth callback with dbv */
13803 if( rc==SQLITE_OK ){
13804 sqlite3_set_authorizer(pNew->dbv, idxAuthCallback, (void*)pNew);
13805 }
13806
13807 /* If an error has occurred, free the new object and reutrn NULL. Otherwise,
13808 ** return the new sqlite3expert handle. */
13809 if( rc!=SQLITE_OK ){
13810 sqlite3_expert_destroy(pNew);
13811 pNew = 0;
13812 }
13813 return pNew;
13814 }
13815
13816 /*
13817 ** Configure an sqlite3expert object.
13818 */
sqlite3_expert_config(sqlite3expert * p,int op,...)13819 int sqlite3_expert_config(sqlite3expert *p, int op, ...){
13820 int rc = SQLITE_OK;
13821 va_list ap;
13822 va_start(ap, op);
13823 switch( op ){
13824 case EXPERT_CONFIG_SAMPLE: {
13825 int iVal = va_arg(ap, int);
13826 if( iVal<0 ) iVal = 0;
13827 if( iVal>100 ) iVal = 100;
13828 p->iSample = iVal;
13829 break;
13830 }
13831 default:
13832 rc = SQLITE_NOTFOUND;
13833 break;
13834 }
13835
13836 va_end(ap);
13837 return rc;
13838 }
13839
13840 /*
13841 ** Add an SQL statement to the analysis.
13842 */
sqlite3_expert_sql(sqlite3expert * p,const char * zSql,char ** pzErr)13843 int sqlite3_expert_sql(
13844 sqlite3expert *p, /* From sqlite3_expert_new() */
13845 const char *zSql, /* SQL statement to add */
13846 char **pzErr /* OUT: Error message (if any) */
13847 ){
13848 IdxScan *pScanOrig = p->pScan;
13849 IdxStatement *pStmtOrig = p->pStatement;
13850 int rc = SQLITE_OK;
13851 const char *zStmt = zSql;
13852
13853 if( p->bRun ) return SQLITE_MISUSE;
13854
13855 while( rc==SQLITE_OK && zStmt && zStmt[0] ){
13856 sqlite3_stmt *pStmt = 0;
13857 /* Ensure that the provided statement compiles against user's DB. */
13858 rc = idxPrepareStmt(p->db, &pStmt, pzErr, zStmt);
13859 if( rc!=SQLITE_OK ) break;
13860 sqlite3_finalize(pStmt);
13861 rc = sqlite3_prepare_v2(p->dbv, zStmt, -1, &pStmt, &zStmt);
13862 if( rc==SQLITE_OK ){
13863 if( pStmt ){
13864 IdxStatement *pNew;
13865 const char *z = sqlite3_sql(pStmt);
13866 int n = STRLEN(z);
13867 pNew = (IdxStatement*)idxMalloc(&rc, sizeof(IdxStatement) + n+1);
13868 if( rc==SQLITE_OK ){
13869 pNew->zSql = (char*)&pNew[1];
13870 memcpy(pNew->zSql, z, n+1);
13871 pNew->pNext = p->pStatement;
13872 if( p->pStatement ) pNew->iId = p->pStatement->iId+1;
13873 p->pStatement = pNew;
13874 }
13875 sqlite3_finalize(pStmt);
13876 }
13877 }else{
13878 idxDatabaseError(p->dbv, pzErr);
13879 }
13880 }
13881
13882 if( rc!=SQLITE_OK ){
13883 idxScanFree(p->pScan, pScanOrig);
13884 idxStatementFree(p->pStatement, pStmtOrig);
13885 p->pScan = pScanOrig;
13886 p->pStatement = pStmtOrig;
13887 }
13888
13889 return rc;
13890 }
13891
sqlite3_expert_analyze(sqlite3expert * p,char ** pzErr)13892 int sqlite3_expert_analyze(sqlite3expert *p, char **pzErr){
13893 int rc;
13894 IdxHashEntry *pEntry;
13895
13896 /* Do trigger processing to collect any extra IdxScan structures */
13897 rc = idxProcessTriggers(p, pzErr);
13898
13899 /* Create candidate indexes within the in-memory database file */
13900 if( rc==SQLITE_OK ){
13901 rc = idxCreateCandidates(p);
13902 }else if ( rc==SQLITE_BUSY_TIMEOUT ){
13903 if( pzErr )
13904 *pzErr = sqlite3_mprintf("Cannot find a unique index name to propose.");
13905 return rc;
13906 }
13907
13908 /* Generate the stat1 data */
13909 if( rc==SQLITE_OK ){
13910 rc = idxPopulateStat1(p, pzErr);
13911 }
13912
13913 /* Formulate the EXPERT_REPORT_CANDIDATES text */
13914 for(pEntry=p->hIdx.pFirst; pEntry; pEntry=pEntry->pNext){
13915 p->zCandidates = idxAppendText(&rc, p->zCandidates,
13916 "%s;%s%s\n", pEntry->zVal,
13917 pEntry->zVal2 ? " -- stat1: " : "", pEntry->zVal2
13918 );
13919 }
13920
13921 /* Figure out which of the candidate indexes are preferred by the query
13922 ** planner and report the results to the user. */
13923 if( rc==SQLITE_OK ){
13924 rc = idxFindIndexes(p, pzErr);
13925 }
13926
13927 if( rc==SQLITE_OK ){
13928 p->bRun = 1;
13929 }
13930 return rc;
13931 }
13932
13933 /*
13934 ** Return the total number of statements that have been added to this
13935 ** sqlite3expert using sqlite3_expert_sql().
13936 */
sqlite3_expert_count(sqlite3expert * p)13937 int sqlite3_expert_count(sqlite3expert *p){
13938 int nRet = 0;
13939 if( p->pStatement ) nRet = p->pStatement->iId+1;
13940 return nRet;
13941 }
13942
13943 /*
13944 ** Return a component of the report.
13945 */
sqlite3_expert_report(sqlite3expert * p,int iStmt,int eReport)13946 const char *sqlite3_expert_report(sqlite3expert *p, int iStmt, int eReport){
13947 const char *zRet = 0;
13948 IdxStatement *pStmt;
13949
13950 if( p->bRun==0 ) return 0;
13951 for(pStmt=p->pStatement; pStmt && pStmt->iId!=iStmt; pStmt=pStmt->pNext);
13952 switch( eReport ){
13953 case EXPERT_REPORT_SQL:
13954 if( pStmt ) zRet = pStmt->zSql;
13955 break;
13956 case EXPERT_REPORT_INDEXES:
13957 if( pStmt ) zRet = pStmt->zIdx;
13958 break;
13959 case EXPERT_REPORT_PLAN:
13960 if( pStmt ) zRet = pStmt->zEQP;
13961 break;
13962 case EXPERT_REPORT_CANDIDATES:
13963 zRet = p->zCandidates;
13964 break;
13965 }
13966 return zRet;
13967 }
13968
13969 /*
13970 ** Free an sqlite3expert object.
13971 */
sqlite3_expert_destroy(sqlite3expert * p)13972 void sqlite3_expert_destroy(sqlite3expert *p){
13973 if( p ){
13974 sqlite3_close(p->dbm);
13975 sqlite3_close(p->dbv);
13976 idxScanFree(p->pScan, 0);
13977 idxStatementFree(p->pStatement, 0);
13978 idxTableFree(p->pTable);
13979 idxWriteFree(p->pWrite);
13980 idxHashClear(&p->hIdx);
13981 sqlite3_free(p->zCandidates);
13982 sqlite3_free(p);
13983 }
13984 }
13985
13986 #endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
13987
13988 /************************* End ../ext/expert/sqlite3expert.c ********************/
13989
13990 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
13991 #define SQLITE_SHELL_HAVE_RECOVER 1
13992 #else
13993 #define SQLITE_SHELL_HAVE_RECOVER 0
13994 #endif
13995 #if SQLITE_SHELL_HAVE_RECOVER
13996 /************************* Begin ../ext/recover/sqlite3recover.h ******************/
13997 /*
13998 ** 2022-08-27
13999 **
14000 ** The author disclaims copyright to this source code. In place of
14001 ** a legal notice, here is a blessing:
14002 **
14003 ** May you do good and not evil.
14004 ** May you find forgiveness for yourself and forgive others.
14005 ** May you share freely, never taking more than you give.
14006 **
14007 *************************************************************************
14008 **
14009 ** This file contains the public interface to the "recover" extension -
14010 ** an SQLite extension designed to recover data from corrupted database
14011 ** files.
14012 */
14013
14014 /*
14015 ** OVERVIEW:
14016 **
14017 ** To use the API to recover data from a corrupted database, an
14018 ** application:
14019 **
14020 ** 1) Creates an sqlite3_recover handle by calling either
14021 ** sqlite3_recover_init() or sqlite3_recover_init_sql().
14022 **
14023 ** 2) Configures the new handle using one or more calls to
14024 ** sqlite3_recover_config().
14025 **
14026 ** 3) Executes the recovery by repeatedly calling sqlite3_recover_step() on
14027 ** the handle until it returns something other than SQLITE_OK. If it
14028 ** returns SQLITE_DONE, then the recovery operation completed without
14029 ** error. If it returns some other non-SQLITE_OK value, then an error
14030 ** has occurred.
14031 **
14032 ** 4) Retrieves any error code and English language error message using the
14033 ** sqlite3_recover_errcode() and sqlite3_recover_errmsg() APIs,
14034 ** respectively.
14035 **
14036 ** 5) Destroys the sqlite3_recover handle and frees all resources
14037 ** using sqlite3_recover_finish().
14038 **
14039 ** The application may abandon the recovery operation at any point
14040 ** before it is finished by passing the sqlite3_recover handle to
14041 ** sqlite3_recover_finish(). This is not an error, but the final state
14042 ** of the output database, or the results of running the partial script
14043 ** delivered to the SQL callback, are undefined.
14044 */
14045
14046 #ifndef _SQLITE_RECOVER_H
14047 #define _SQLITE_RECOVER_H
14048
14049 /* #include "sqlite3.h" */
14050
14051 #ifdef __cplusplus
14052 extern "C" {
14053 #endif
14054
14055 /*
14056 ** An instance of the sqlite3_recover object represents a recovery
14057 ** operation in progress.
14058 **
14059 ** Constructors:
14060 **
14061 ** sqlite3_recover_init()
14062 ** sqlite3_recover_init_sql()
14063 **
14064 ** Destructor:
14065 **
14066 ** sqlite3_recover_finish()
14067 **
14068 ** Methods:
14069 **
14070 ** sqlite3_recover_config()
14071 ** sqlite3_recover_errcode()
14072 ** sqlite3_recover_errmsg()
14073 ** sqlite3_recover_run()
14074 ** sqlite3_recover_step()
14075 */
14076 typedef struct sqlite3_recover sqlite3_recover;
14077
14078 /*
14079 ** These two APIs attempt to create and return a new sqlite3_recover object.
14080 ** In both cases the first two arguments identify the (possibly
14081 ** corrupt) database to recover data from. The first argument is an open
14082 ** database handle and the second the name of a database attached to that
14083 ** handle (i.e. "main", "temp" or the name of an attached database).
14084 **
14085 ** If sqlite3_recover_init() is used to create the new sqlite3_recover
14086 ** handle, then data is recovered into a new database, identified by
14087 ** string parameter zUri. zUri may be an absolute or relative file path,
14088 ** or may be an SQLite URI. If the identified database file already exists,
14089 ** it is overwritten.
14090 **
14091 ** If sqlite3_recover_init_sql() is invoked, then any recovered data will
14092 ** be returned to the user as a series of SQL statements. Executing these
14093 ** SQL statements results in the same database as would have been created
14094 ** had sqlite3_recover_init() been used. For each SQL statement in the
14095 ** output, the callback function passed as the third argument (xSql) is
14096 ** invoked once. The first parameter is a passed a copy of the fourth argument
14097 ** to this function (pCtx) as its first parameter, and a pointer to a
14098 ** nul-terminated buffer containing the SQL statement formated as UTF-8 as
14099 ** the second. If the xSql callback returns any value other than SQLITE_OK,
14100 ** then processing is immediately abandoned and the value returned used as
14101 ** the recover handle error code (see below).
14102 **
14103 ** If an out-of-memory error occurs, NULL may be returned instead of
14104 ** a valid handle. In all other cases, it is the responsibility of the
14105 ** application to avoid resource leaks by ensuring that
14106 ** sqlite3_recover_finish() is called on all allocated handles.
14107 */
14108 sqlite3_recover *sqlite3_recover_init(
14109 sqlite3* db,
14110 const char *zDb,
14111 const char *zUri
14112 );
14113 sqlite3_recover *sqlite3_recover_init_sql(
14114 sqlite3* db,
14115 const char *zDb,
14116 int (*xSql)(void*, const char*),
14117 void *pCtx
14118 );
14119
14120 /*
14121 ** Configure an sqlite3_recover object that has just been created using
14122 ** sqlite3_recover_init() or sqlite3_recover_init_sql(). This function
14123 ** may only be called before the first call to sqlite3_recover_step()
14124 ** or sqlite3_recover_run() on the object.
14125 **
14126 ** The second argument passed to this function must be one of the
14127 ** SQLITE_RECOVER_* symbols defined below. Valid values for the third argument
14128 ** depend on the specific SQLITE_RECOVER_* symbol in use.
14129 **
14130 ** SQLITE_OK is returned if the configuration operation was successful,
14131 ** or an SQLite error code otherwise.
14132 */
14133 int sqlite3_recover_config(sqlite3_recover*, int op, void *pArg);
14134
14135 /*
14136 ** SQLITE_RECOVER_LOST_AND_FOUND:
14137 ** The pArg argument points to a string buffer containing the name
14138 ** of a "lost-and-found" table in the output database, or NULL. If
14139 ** the argument is non-NULL and the database contains seemingly
14140 ** valid pages that cannot be associated with any table in the
14141 ** recovered part of the schema, data is extracted from these
14142 ** pages to add to the lost-and-found table.
14143 **
14144 ** SQLITE_RECOVER_FREELIST_CORRUPT:
14145 ** The pArg value must actually be a pointer to a value of type
14146 ** int containing value 0 or 1 cast as a (void*). If this option is set
14147 ** (argument is 1) and a lost-and-found table has been configured using
14148 ** SQLITE_RECOVER_LOST_AND_FOUND, then is assumed that the freelist is
14149 ** corrupt and an attempt is made to recover records from pages that
14150 ** appear to be linked into the freelist. Otherwise, pages on the freelist
14151 ** are ignored. Setting this option can recover more data from the
14152 ** database, but often ends up "recovering" deleted records. The default
14153 ** value is 0 (clear).
14154 **
14155 ** SQLITE_RECOVER_ROWIDS:
14156 ** The pArg value must actually be a pointer to a value of type
14157 ** int containing value 0 or 1 cast as a (void*). If this option is set
14158 ** (argument is 1), then an attempt is made to recover rowid values
14159 ** that are not also INTEGER PRIMARY KEY values. If this option is
14160 ** clear, then new rowids are assigned to all recovered rows. The
14161 ** default value is 1 (set).
14162 **
14163 ** SQLITE_RECOVER_SLOWINDEXES:
14164 ** The pArg value must actually be a pointer to a value of type
14165 ** int containing value 0 or 1 cast as a (void*). If this option is clear
14166 ** (argument is 0), then when creating an output database, the recover
14167 ** module creates and populates non-UNIQUE indexes right at the end of the
14168 ** recovery operation - after all recoverable data has been inserted
14169 ** into the new database. This is faster overall, but means that the
14170 ** final call to sqlite3_recover_step() for a recovery operation may
14171 ** be need to create a large number of indexes, which may be very slow.
14172 **
14173 ** Or, if this option is set (argument is 1), then non-UNIQUE indexes
14174 ** are created in the output database before it is populated with
14175 ** recovered data. This is slower overall, but avoids the slow call
14176 ** to sqlite3_recover_step() at the end of the recovery operation.
14177 **
14178 ** The default option value is 0.
14179 */
14180 #define SQLITE_RECOVER_LOST_AND_FOUND 1
14181 #define SQLITE_RECOVER_FREELIST_CORRUPT 2
14182 #define SQLITE_RECOVER_ROWIDS 3
14183 #define SQLITE_RECOVER_SLOWINDEXES 4
14184
14185 /*
14186 ** Perform a unit of work towards the recovery operation. This function
14187 ** must normally be called multiple times to complete database recovery.
14188 **
14189 ** If no error occurs but the recovery operation is not completed, this
14190 ** function returns SQLITE_OK. If recovery has been completed successfully
14191 ** then SQLITE_DONE is returned. If an error has occurred, then an SQLite
14192 ** error code (e.g. SQLITE_IOERR or SQLITE_NOMEM) is returned. It is not
14193 ** considered an error if some or all of the data cannot be recovered
14194 ** due to database corruption.
14195 **
14196 ** Once sqlite3_recover_step() has returned a value other than SQLITE_OK,
14197 ** all further such calls on the same recover handle are no-ops that return
14198 ** the same non-SQLITE_OK value.
14199 */
14200 int sqlite3_recover_step(sqlite3_recover*);
14201
14202 /*
14203 ** Run the recovery operation to completion. Return SQLITE_OK if successful,
14204 ** or an SQLite error code otherwise. Calling this function is the same
14205 ** as executing:
14206 **
14207 ** while( SQLITE_OK==sqlite3_recover_step(p) );
14208 ** return sqlite3_recover_errcode(p);
14209 */
14210 int sqlite3_recover_run(sqlite3_recover*);
14211
14212 /*
14213 ** If an error has been encountered during a prior call to
14214 ** sqlite3_recover_step(), then this function attempts to return a
14215 ** pointer to a buffer containing an English language explanation of
14216 ** the error. If no error message is available, or if an out-of memory
14217 ** error occurs while attempting to allocate a buffer in which to format
14218 ** the error message, NULL is returned.
14219 **
14220 ** The returned buffer remains valid until the sqlite3_recover handle is
14221 ** destroyed using sqlite3_recover_finish().
14222 */
14223 const char *sqlite3_recover_errmsg(sqlite3_recover*);
14224
14225 /*
14226 ** If this function is called on an sqlite3_recover handle after
14227 ** an error occurs, an SQLite error code is returned. Otherwise, SQLITE_OK.
14228 */
14229 int sqlite3_recover_errcode(sqlite3_recover*);
14230
14231 /*
14232 ** Clean up a recovery object created by a call to sqlite3_recover_init().
14233 ** The results of using a recovery object with any API after it has been
14234 ** passed to this function are undefined.
14235 **
14236 ** This function returns the same value as sqlite3_recover_errcode().
14237 */
14238 int sqlite3_recover_finish(sqlite3_recover*);
14239
14240
14241 #ifdef __cplusplus
14242 } /* end of the 'extern "C"' block */
14243 #endif
14244
14245 #endif /* ifndef _SQLITE_RECOVER_H */
14246
14247 /************************* End ../ext/recover/sqlite3recover.h ********************/
14248 # ifndef SQLITE_HAVE_SQLITE3R
14249 /************************* Begin ../ext/recover/dbdata.c ******************/
14250 /*
14251 ** 2019-04-17
14252 **
14253 ** The author disclaims copyright to this source code. In place of
14254 ** a legal notice, here is a blessing:
14255 **
14256 ** May you do good and not evil.
14257 ** May you find forgiveness for yourself and forgive others.
14258 ** May you share freely, never taking more than you give.
14259 **
14260 ******************************************************************************
14261 **
14262 ** This file contains an implementation of two eponymous virtual tables,
14263 ** "sqlite_dbdata" and "sqlite_dbptr". Both modules require that the
14264 ** "sqlite_dbpage" eponymous virtual table be available.
14265 **
14266 ** SQLITE_DBDATA:
14267 ** sqlite_dbdata is used to extract data directly from a database b-tree
14268 ** page and its associated overflow pages, bypassing the b-tree layer.
14269 ** The table schema is equivalent to:
14270 **
14271 ** CREATE TABLE sqlite_dbdata(
14272 ** pgno INTEGER,
14273 ** cell INTEGER,
14274 ** field INTEGER,
14275 ** value ANY,
14276 ** schema TEXT HIDDEN
14277 ** );
14278 **
14279 ** IMPORTANT: THE VIRTUAL TABLE SCHEMA ABOVE IS SUBJECT TO CHANGE. IN THE
14280 ** FUTURE NEW NON-HIDDEN COLUMNS MAY BE ADDED BETWEEN "value" AND
14281 ** "schema".
14282 **
14283 ** Each page of the database is inspected. If it cannot be interpreted as
14284 ** a b-tree page, or if it is a b-tree page containing 0 entries, the
14285 ** sqlite_dbdata table contains no rows for that page. Otherwise, the
14286 ** table contains one row for each field in the record associated with
14287 ** each cell on the page. For intkey b-trees, the key value is stored in
14288 ** field -1.
14289 **
14290 ** For example, for the database:
14291 **
14292 ** CREATE TABLE t1(a, b); -- root page is page 2
14293 ** INSERT INTO t1(rowid, a, b) VALUES(5, 'v', 'five');
14294 ** INSERT INTO t1(rowid, a, b) VALUES(10, 'x', 'ten');
14295 **
14296 ** the sqlite_dbdata table contains, as well as from entries related to
14297 ** page 1, content equivalent to:
14298 **
14299 ** INSERT INTO sqlite_dbdata(pgno, cell, field, value) VALUES
14300 ** (2, 0, -1, 5 ),
14301 ** (2, 0, 0, 'v' ),
14302 ** (2, 0, 1, 'five'),
14303 ** (2, 1, -1, 10 ),
14304 ** (2, 1, 0, 'x' ),
14305 ** (2, 1, 1, 'ten' );
14306 **
14307 ** If database corruption is encountered, this module does not report an
14308 ** error. Instead, it attempts to extract as much data as possible and
14309 ** ignores the corruption.
14310 **
14311 ** SQLITE_DBPTR:
14312 ** The sqlite_dbptr table has the following schema:
14313 **
14314 ** CREATE TABLE sqlite_dbptr(
14315 ** pgno INTEGER,
14316 ** child INTEGER,
14317 ** schema TEXT HIDDEN
14318 ** );
14319 **
14320 ** It contains one entry for each b-tree pointer between a parent and
14321 ** child page in the database.
14322 */
14323
14324 #if !defined(SQLITEINT_H)
14325 /* #include "sqlite3.h" */
14326
14327 /* typedef unsigned char u8; */
14328 /* typedef unsigned int u32; */
14329
14330 #endif
14331 #include <string.h>
14332 #include <assert.h>
14333
14334 #ifndef SQLITE_OMIT_VIRTUALTABLE
14335
14336 #define DBDATA_PADDING_BYTES 100
14337
14338 typedef struct DbdataTable DbdataTable;
14339 typedef struct DbdataCursor DbdataCursor;
14340
14341 /* Cursor object */
14342 struct DbdataCursor {
14343 sqlite3_vtab_cursor base; /* Base class. Must be first */
14344 sqlite3_stmt *pStmt; /* For fetching database pages */
14345
14346 int iPgno; /* Current page number */
14347 u8 *aPage; /* Buffer containing page */
14348 int nPage; /* Size of aPage[] in bytes */
14349 int nCell; /* Number of cells on aPage[] */
14350 int iCell; /* Current cell number */
14351 int bOnePage; /* True to stop after one page */
14352 int szDb;
14353 sqlite3_int64 iRowid;
14354
14355 /* Only for the sqlite_dbdata table */
14356 u8 *pRec; /* Buffer containing current record */
14357 sqlite3_int64 nRec; /* Size of pRec[] in bytes */
14358 sqlite3_int64 nHdr; /* Size of header in bytes */
14359 int iField; /* Current field number */
14360 u8 *pHdrPtr;
14361 u8 *pPtr;
14362 u32 enc; /* Text encoding */
14363
14364 sqlite3_int64 iIntkey; /* Integer key value */
14365 };
14366
14367 /* Table object */
14368 struct DbdataTable {
14369 sqlite3_vtab base; /* Base class. Must be first */
14370 sqlite3 *db; /* The database connection */
14371 sqlite3_stmt *pStmt; /* For fetching database pages */
14372 int bPtr; /* True for sqlite3_dbptr table */
14373 };
14374
14375 /* Column and schema definitions for sqlite_dbdata */
14376 #define DBDATA_COLUMN_PGNO 0
14377 #define DBDATA_COLUMN_CELL 1
14378 #define DBDATA_COLUMN_FIELD 2
14379 #define DBDATA_COLUMN_VALUE 3
14380 #define DBDATA_COLUMN_SCHEMA 4
14381 #define DBDATA_SCHEMA \
14382 "CREATE TABLE x(" \
14383 " pgno INTEGER," \
14384 " cell INTEGER," \
14385 " field INTEGER," \
14386 " value ANY," \
14387 " schema TEXT HIDDEN" \
14388 ")"
14389
14390 /* Column and schema definitions for sqlite_dbptr */
14391 #define DBPTR_COLUMN_PGNO 0
14392 #define DBPTR_COLUMN_CHILD 1
14393 #define DBPTR_COLUMN_SCHEMA 2
14394 #define DBPTR_SCHEMA \
14395 "CREATE TABLE x(" \
14396 " pgno INTEGER," \
14397 " child INTEGER," \
14398 " schema TEXT HIDDEN" \
14399 ")"
14400
14401 /*
14402 ** Connect to an sqlite_dbdata (pAux==0) or sqlite_dbptr (pAux!=0) virtual
14403 ** table.
14404 */
dbdataConnect(sqlite3 * db,void * pAux,int argc,const char * const * argv,sqlite3_vtab ** ppVtab,char ** pzErr)14405 static int dbdataConnect(
14406 sqlite3 *db,
14407 void *pAux,
14408 int argc, const char *const*argv,
14409 sqlite3_vtab **ppVtab,
14410 char **pzErr
14411 ){
14412 DbdataTable *pTab = 0;
14413 int rc = sqlite3_declare_vtab(db, pAux ? DBPTR_SCHEMA : DBDATA_SCHEMA);
14414
14415 (void)argc;
14416 (void)argv;
14417 (void)pzErr;
14418 sqlite3_vtab_config(db, SQLITE_VTAB_USES_ALL_SCHEMAS);
14419 if( rc==SQLITE_OK ){
14420 pTab = (DbdataTable*)sqlite3_malloc64(sizeof(DbdataTable));
14421 if( pTab==0 ){
14422 rc = SQLITE_NOMEM;
14423 }else{
14424 memset(pTab, 0, sizeof(DbdataTable));
14425 pTab->db = db;
14426 pTab->bPtr = (pAux!=0);
14427 }
14428 }
14429
14430 *ppVtab = (sqlite3_vtab*)pTab;
14431 return rc;
14432 }
14433
14434 /*
14435 ** Disconnect from or destroy a sqlite_dbdata or sqlite_dbptr virtual table.
14436 */
dbdataDisconnect(sqlite3_vtab * pVtab)14437 static int dbdataDisconnect(sqlite3_vtab *pVtab){
14438 DbdataTable *pTab = (DbdataTable*)pVtab;
14439 if( pTab ){
14440 sqlite3_finalize(pTab->pStmt);
14441 sqlite3_free(pVtab);
14442 }
14443 return SQLITE_OK;
14444 }
14445
14446 /*
14447 ** This function interprets two types of constraints:
14448 **
14449 ** schema=?
14450 ** pgno=?
14451 **
14452 ** If neither are present, idxNum is set to 0. If schema=? is present,
14453 ** the 0x01 bit in idxNum is set. If pgno=? is present, the 0x02 bit
14454 ** in idxNum is set.
14455 **
14456 ** If both parameters are present, schema is in position 0 and pgno in
14457 ** position 1.
14458 */
dbdataBestIndex(sqlite3_vtab * tab,sqlite3_index_info * pIdx)14459 static int dbdataBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdx){
14460 DbdataTable *pTab = (DbdataTable*)tab;
14461 int i;
14462 int iSchema = -1;
14463 int iPgno = -1;
14464 int colSchema = (pTab->bPtr ? DBPTR_COLUMN_SCHEMA : DBDATA_COLUMN_SCHEMA);
14465
14466 for(i=0; i<pIdx->nConstraint; i++){
14467 struct sqlite3_index_constraint *p = &pIdx->aConstraint[i];
14468 if( p->op==SQLITE_INDEX_CONSTRAINT_EQ ){
14469 if( p->iColumn==colSchema ){
14470 if( p->usable==0 ) return SQLITE_CONSTRAINT;
14471 iSchema = i;
14472 }
14473 if( p->iColumn==DBDATA_COLUMN_PGNO && p->usable ){
14474 iPgno = i;
14475 }
14476 }
14477 }
14478
14479 if( iSchema>=0 ){
14480 pIdx->aConstraintUsage[iSchema].argvIndex = 1;
14481 pIdx->aConstraintUsage[iSchema].omit = 1;
14482 }
14483 if( iPgno>=0 ){
14484 pIdx->aConstraintUsage[iPgno].argvIndex = 1 + (iSchema>=0);
14485 pIdx->aConstraintUsage[iPgno].omit = 1;
14486 pIdx->estimatedCost = 100;
14487 pIdx->estimatedRows = 50;
14488
14489 if( pTab->bPtr==0 && pIdx->nOrderBy && pIdx->aOrderBy[0].desc==0 ){
14490 int iCol = pIdx->aOrderBy[0].iColumn;
14491 if( pIdx->nOrderBy==1 ){
14492 pIdx->orderByConsumed = (iCol==0 || iCol==1);
14493 }else if( pIdx->nOrderBy==2 && pIdx->aOrderBy[1].desc==0 && iCol==0 ){
14494 pIdx->orderByConsumed = (pIdx->aOrderBy[1].iColumn==1);
14495 }
14496 }
14497
14498 }else{
14499 pIdx->estimatedCost = 100000000;
14500 pIdx->estimatedRows = 1000000000;
14501 }
14502 pIdx->idxNum = (iSchema>=0 ? 0x01 : 0x00) | (iPgno>=0 ? 0x02 : 0x00);
14503 return SQLITE_OK;
14504 }
14505
14506 /*
14507 ** Open a new sqlite_dbdata or sqlite_dbptr cursor.
14508 */
dbdataOpen(sqlite3_vtab * pVTab,sqlite3_vtab_cursor ** ppCursor)14509 static int dbdataOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){
14510 DbdataCursor *pCsr;
14511
14512 pCsr = (DbdataCursor*)sqlite3_malloc64(sizeof(DbdataCursor));
14513 if( pCsr==0 ){
14514 return SQLITE_NOMEM;
14515 }else{
14516 memset(pCsr, 0, sizeof(DbdataCursor));
14517 pCsr->base.pVtab = pVTab;
14518 }
14519
14520 *ppCursor = (sqlite3_vtab_cursor *)pCsr;
14521 return SQLITE_OK;
14522 }
14523
14524 /*
14525 ** Restore a cursor object to the state it was in when first allocated
14526 ** by dbdataOpen().
14527 */
dbdataResetCursor(DbdataCursor * pCsr)14528 static void dbdataResetCursor(DbdataCursor *pCsr){
14529 DbdataTable *pTab = (DbdataTable*)(pCsr->base.pVtab);
14530 if( pTab->pStmt==0 ){
14531 pTab->pStmt = pCsr->pStmt;
14532 }else{
14533 sqlite3_finalize(pCsr->pStmt);
14534 }
14535 pCsr->pStmt = 0;
14536 pCsr->iPgno = 1;
14537 pCsr->iCell = 0;
14538 pCsr->iField = 0;
14539 pCsr->bOnePage = 0;
14540 sqlite3_free(pCsr->aPage);
14541 sqlite3_free(pCsr->pRec);
14542 pCsr->pRec = 0;
14543 pCsr->aPage = 0;
14544 }
14545
14546 /*
14547 ** Close an sqlite_dbdata or sqlite_dbptr cursor.
14548 */
dbdataClose(sqlite3_vtab_cursor * pCursor)14549 static int dbdataClose(sqlite3_vtab_cursor *pCursor){
14550 DbdataCursor *pCsr = (DbdataCursor*)pCursor;
14551 dbdataResetCursor(pCsr);
14552 sqlite3_free(pCsr);
14553 return SQLITE_OK;
14554 }
14555
14556 /*
14557 ** Utility methods to decode 16 and 32-bit big-endian unsigned integers.
14558 */
get_uint16(unsigned char * a)14559 static u32 get_uint16(unsigned char *a){
14560 return (a[0]<<8)|a[1];
14561 }
get_uint32(unsigned char * a)14562 static u32 get_uint32(unsigned char *a){
14563 return ((u32)a[0]<<24)
14564 | ((u32)a[1]<<16)
14565 | ((u32)a[2]<<8)
14566 | ((u32)a[3]);
14567 }
14568
14569 /*
14570 ** Load page pgno from the database via the sqlite_dbpage virtual table.
14571 ** If successful, set (*ppPage) to point to a buffer containing the page
14572 ** data, (*pnPage) to the size of that buffer in bytes and return
14573 ** SQLITE_OK. In this case it is the responsibility of the caller to
14574 ** eventually free the buffer using sqlite3_free().
14575 **
14576 ** Or, if an error occurs, set both (*ppPage) and (*pnPage) to 0 and
14577 ** return an SQLite error code.
14578 */
dbdataLoadPage(DbdataCursor * pCsr,u32 pgno,u8 ** ppPage,int * pnPage)14579 static int dbdataLoadPage(
14580 DbdataCursor *pCsr, /* Cursor object */
14581 u32 pgno, /* Page number of page to load */
14582 u8 **ppPage, /* OUT: pointer to page buffer */
14583 int *pnPage /* OUT: Size of (*ppPage) in bytes */
14584 ){
14585 int rc2;
14586 int rc = SQLITE_OK;
14587 sqlite3_stmt *pStmt = pCsr->pStmt;
14588
14589 *ppPage = 0;
14590 *pnPage = 0;
14591 if( pgno>0 ){
14592 sqlite3_bind_int64(pStmt, 2, pgno);
14593 if( SQLITE_ROW==sqlite3_step(pStmt) ){
14594 int nCopy = sqlite3_column_bytes(pStmt, 0);
14595 if( nCopy>0 ){
14596 u8 *pPage;
14597 pPage = (u8*)sqlite3_malloc64(nCopy + DBDATA_PADDING_BYTES);
14598 if( pPage==0 ){
14599 rc = SQLITE_NOMEM;
14600 }else{
14601 const u8 *pCopy = sqlite3_column_blob(pStmt, 0);
14602 memcpy(pPage, pCopy, nCopy);
14603 memset(&pPage[nCopy], 0, DBDATA_PADDING_BYTES);
14604 }
14605 *ppPage = pPage;
14606 *pnPage = nCopy;
14607 }
14608 }
14609 rc2 = sqlite3_reset(pStmt);
14610 if( rc==SQLITE_OK ) rc = rc2;
14611 }
14612
14613 return rc;
14614 }
14615
14616 /*
14617 ** Read a varint. Put the value in *pVal and return the number of bytes.
14618 */
dbdataGetVarint(const u8 * z,sqlite3_int64 * pVal)14619 static int dbdataGetVarint(const u8 *z, sqlite3_int64 *pVal){
14620 sqlite3_uint64 u = 0;
14621 int i;
14622 for(i=0; i<8; i++){
14623 u = (u<<7) + (z[i]&0x7f);
14624 if( (z[i]&0x80)==0 ){ *pVal = (sqlite3_int64)u; return i+1; }
14625 }
14626 u = (u<<8) + (z[i]&0xff);
14627 *pVal = (sqlite3_int64)u;
14628 return 9;
14629 }
14630
14631 /*
14632 ** Like dbdataGetVarint(), but set the output to 0 if it is less than 0
14633 ** or greater than 0xFFFFFFFF. This can be used for all varints in an
14634 ** SQLite database except for key values in intkey tables.
14635 */
dbdataGetVarintU32(const u8 * z,sqlite3_int64 * pVal)14636 static int dbdataGetVarintU32(const u8 *z, sqlite3_int64 *pVal){
14637 sqlite3_int64 val;
14638 int nRet = dbdataGetVarint(z, &val);
14639 if( val<0 || val>0xFFFFFFFF ) val = 0;
14640 *pVal = val;
14641 return nRet;
14642 }
14643
14644 /*
14645 ** Return the number of bytes of space used by an SQLite value of type
14646 ** eType.
14647 */
dbdataValueBytes(int eType)14648 static int dbdataValueBytes(int eType){
14649 switch( eType ){
14650 case 0: case 8: case 9:
14651 case 10: case 11:
14652 return 0;
14653 case 1:
14654 return 1;
14655 case 2:
14656 return 2;
14657 case 3:
14658 return 3;
14659 case 4:
14660 return 4;
14661 case 5:
14662 return 6;
14663 case 6:
14664 case 7:
14665 return 8;
14666 default:
14667 if( eType>0 ){
14668 return ((eType-12) / 2);
14669 }
14670 return 0;
14671 }
14672 }
14673
14674 /*
14675 ** Load a value of type eType from buffer pData and use it to set the
14676 ** result of context object pCtx.
14677 */
dbdataValue(sqlite3_context * pCtx,u32 enc,int eType,u8 * pData,sqlite3_int64 nData)14678 static void dbdataValue(
14679 sqlite3_context *pCtx,
14680 u32 enc,
14681 int eType,
14682 u8 *pData,
14683 sqlite3_int64 nData
14684 ){
14685 if( eType>=0 && dbdataValueBytes(eType)<=nData ){
14686 switch( eType ){
14687 case 0:
14688 case 10:
14689 case 11:
14690 sqlite3_result_null(pCtx);
14691 break;
14692
14693 case 8:
14694 sqlite3_result_int(pCtx, 0);
14695 break;
14696 case 9:
14697 sqlite3_result_int(pCtx, 1);
14698 break;
14699
14700 case 1: case 2: case 3: case 4: case 5: case 6: case 7: {
14701 sqlite3_uint64 v = (signed char)pData[0];
14702 pData++;
14703 switch( eType ){
14704 case 7:
14705 case 6: v = (v<<16) + (pData[0]<<8) + pData[1]; pData += 2;
14706 case 5: v = (v<<16) + (pData[0]<<8) + pData[1]; pData += 2;
14707 case 4: v = (v<<8) + pData[0]; pData++;
14708 case 3: v = (v<<8) + pData[0]; pData++;
14709 case 2: v = (v<<8) + pData[0]; pData++;
14710 }
14711
14712 if( eType==7 ){
14713 double r;
14714 memcpy(&r, &v, sizeof(r));
14715 sqlite3_result_double(pCtx, r);
14716 }else{
14717 sqlite3_result_int64(pCtx, (sqlite3_int64)v);
14718 }
14719 break;
14720 }
14721
14722 default: {
14723 int n = ((eType-12) / 2);
14724 if( eType % 2 ){
14725 switch( enc ){
14726 #ifndef SQLITE_OMIT_UTF16
14727 case SQLITE_UTF16BE:
14728 sqlite3_result_text16be(pCtx, (void*)pData, n, SQLITE_TRANSIENT);
14729 break;
14730 case SQLITE_UTF16LE:
14731 sqlite3_result_text16le(pCtx, (void*)pData, n, SQLITE_TRANSIENT);
14732 break;
14733 #endif
14734 default:
14735 sqlite3_result_text(pCtx, (char*)pData, n, SQLITE_TRANSIENT);
14736 break;
14737 }
14738 }else{
14739 sqlite3_result_blob(pCtx, pData, n, SQLITE_TRANSIENT);
14740 }
14741 }
14742 }
14743 }
14744 }
14745
14746 /*
14747 ** Move an sqlite_dbdata or sqlite_dbptr cursor to the next entry.
14748 */
dbdataNext(sqlite3_vtab_cursor * pCursor)14749 static int dbdataNext(sqlite3_vtab_cursor *pCursor){
14750 DbdataCursor *pCsr = (DbdataCursor*)pCursor;
14751 DbdataTable *pTab = (DbdataTable*)pCursor->pVtab;
14752
14753 pCsr->iRowid++;
14754 while( 1 ){
14755 int rc;
14756 int iOff = (pCsr->iPgno==1 ? 100 : 0);
14757 int bNextPage = 0;
14758
14759 if( pCsr->aPage==0 ){
14760 while( 1 ){
14761 if( pCsr->bOnePage==0 && pCsr->iPgno>pCsr->szDb ) return SQLITE_OK;
14762 rc = dbdataLoadPage(pCsr, pCsr->iPgno, &pCsr->aPage, &pCsr->nPage);
14763 if( rc!=SQLITE_OK ) return rc;
14764 if( pCsr->aPage && pCsr->nPage>=256 ) break;
14765 sqlite3_free(pCsr->aPage);
14766 pCsr->aPage = 0;
14767 if( pCsr->bOnePage ) return SQLITE_OK;
14768 pCsr->iPgno++;
14769 }
14770
14771 assert( iOff+3+2<=pCsr->nPage );
14772 pCsr->iCell = pTab->bPtr ? -2 : 0;
14773 pCsr->nCell = get_uint16(&pCsr->aPage[iOff+3]);
14774 }
14775
14776 if( pTab->bPtr ){
14777 if( pCsr->aPage[iOff]!=0x02 && pCsr->aPage[iOff]!=0x05 ){
14778 pCsr->iCell = pCsr->nCell;
14779 }
14780 pCsr->iCell++;
14781 if( pCsr->iCell>=pCsr->nCell ){
14782 sqlite3_free(pCsr->aPage);
14783 pCsr->aPage = 0;
14784 if( pCsr->bOnePage ) return SQLITE_OK;
14785 pCsr->iPgno++;
14786 }else{
14787 return SQLITE_OK;
14788 }
14789 }else{
14790 /* If there is no record loaded, load it now. */
14791 if( pCsr->pRec==0 ){
14792 int bHasRowid = 0;
14793 int nPointer = 0;
14794 sqlite3_int64 nPayload = 0;
14795 sqlite3_int64 nHdr = 0;
14796 int iHdr;
14797 int U, X;
14798 int nLocal;
14799
14800 switch( pCsr->aPage[iOff] ){
14801 case 0x02:
14802 nPointer = 4;
14803 break;
14804 case 0x0a:
14805 break;
14806 case 0x0d:
14807 bHasRowid = 1;
14808 break;
14809 default:
14810 /* This is not a b-tree page with records on it. Continue. */
14811 pCsr->iCell = pCsr->nCell;
14812 break;
14813 }
14814
14815 if( pCsr->iCell>=pCsr->nCell ){
14816 bNextPage = 1;
14817 }else{
14818
14819 iOff += 8 + nPointer + pCsr->iCell*2;
14820 if( iOff>pCsr->nPage ){
14821 bNextPage = 1;
14822 }else{
14823 iOff = get_uint16(&pCsr->aPage[iOff]);
14824 }
14825
14826 /* For an interior node cell, skip past the child-page number */
14827 iOff += nPointer;
14828
14829 /* Load the "byte of payload including overflow" field */
14830 if( bNextPage || iOff>pCsr->nPage ){
14831 bNextPage = 1;
14832 }else{
14833 iOff += dbdataGetVarintU32(&pCsr->aPage[iOff], &nPayload);
14834 if( nPayload>0x7fffff00 ) nPayload &= 0x3fff;
14835 }
14836
14837 /* If this is a leaf intkey cell, load the rowid */
14838 if( bHasRowid && !bNextPage && iOff<pCsr->nPage ){
14839 iOff += dbdataGetVarint(&pCsr->aPage[iOff], &pCsr->iIntkey);
14840 }
14841
14842 /* Figure out how much data to read from the local page */
14843 U = pCsr->nPage;
14844 if( bHasRowid ){
14845 X = U-35;
14846 }else{
14847 X = ((U-12)*64/255)-23;
14848 }
14849 if( nPayload<=X ){
14850 nLocal = nPayload;
14851 }else{
14852 int M, K;
14853 M = ((U-12)*32/255)-23;
14854 K = M+((nPayload-M)%(U-4));
14855 if( K<=X ){
14856 nLocal = K;
14857 }else{
14858 nLocal = M;
14859 }
14860 }
14861
14862 if( bNextPage || nLocal+iOff>pCsr->nPage ){
14863 bNextPage = 1;
14864 }else{
14865
14866 /* Allocate space for payload. And a bit more to catch small buffer
14867 ** overruns caused by attempting to read a varint or similar from
14868 ** near the end of a corrupt record. */
14869 pCsr->pRec = (u8*)sqlite3_malloc64(nPayload+DBDATA_PADDING_BYTES);
14870 if( pCsr->pRec==0 ) return SQLITE_NOMEM;
14871 memset(pCsr->pRec, 0, nPayload+DBDATA_PADDING_BYTES);
14872 pCsr->nRec = nPayload;
14873
14874 /* Load the nLocal bytes of payload */
14875 memcpy(pCsr->pRec, &pCsr->aPage[iOff], nLocal);
14876 iOff += nLocal;
14877
14878 /* Load content from overflow pages */
14879 if( nPayload>nLocal ){
14880 sqlite3_int64 nRem = nPayload - nLocal;
14881 u32 pgnoOvfl = get_uint32(&pCsr->aPage[iOff]);
14882 while( nRem>0 ){
14883 u8 *aOvfl = 0;
14884 int nOvfl = 0;
14885 int nCopy;
14886 rc = dbdataLoadPage(pCsr, pgnoOvfl, &aOvfl, &nOvfl);
14887 assert( rc!=SQLITE_OK || aOvfl==0 || nOvfl==pCsr->nPage );
14888 if( rc!=SQLITE_OK ) return rc;
14889 if( aOvfl==0 ) break;
14890
14891 nCopy = U-4;
14892 if( nCopy>nRem ) nCopy = nRem;
14893 memcpy(&pCsr->pRec[nPayload-nRem], &aOvfl[4], nCopy);
14894 nRem -= nCopy;
14895
14896 pgnoOvfl = get_uint32(aOvfl);
14897 sqlite3_free(aOvfl);
14898 }
14899 }
14900
14901 iHdr = dbdataGetVarintU32(pCsr->pRec, &nHdr);
14902 if( nHdr>nPayload ) nHdr = 0;
14903 pCsr->nHdr = nHdr;
14904 pCsr->pHdrPtr = &pCsr->pRec[iHdr];
14905 pCsr->pPtr = &pCsr->pRec[pCsr->nHdr];
14906 pCsr->iField = (bHasRowid ? -1 : 0);
14907 }
14908 }
14909 }else{
14910 pCsr->iField++;
14911 if( pCsr->iField>0 ){
14912 sqlite3_int64 iType;
14913 if( pCsr->pHdrPtr>&pCsr->pRec[pCsr->nRec] ){
14914 bNextPage = 1;
14915 }else{
14916 int szField = 0;
14917 pCsr->pHdrPtr += dbdataGetVarintU32(pCsr->pHdrPtr, &iType);
14918 szField = dbdataValueBytes(iType);
14919 if( (pCsr->nRec - (pCsr->pPtr - pCsr->pRec))<szField ){
14920 pCsr->pPtr = &pCsr->pRec[pCsr->nRec];
14921 }else{
14922 pCsr->pPtr += szField;
14923 }
14924 }
14925 }
14926 }
14927
14928 if( bNextPage ){
14929 sqlite3_free(pCsr->aPage);
14930 sqlite3_free(pCsr->pRec);
14931 pCsr->aPage = 0;
14932 pCsr->pRec = 0;
14933 if( pCsr->bOnePage ) return SQLITE_OK;
14934 pCsr->iPgno++;
14935 }else{
14936 if( pCsr->iField<0 || pCsr->pHdrPtr<&pCsr->pRec[pCsr->nHdr] ){
14937 return SQLITE_OK;
14938 }
14939
14940 /* Advance to the next cell. The next iteration of the loop will load
14941 ** the record and so on. */
14942 sqlite3_free(pCsr->pRec);
14943 pCsr->pRec = 0;
14944 pCsr->iCell++;
14945 }
14946 }
14947 }
14948
14949 assert( !"can't get here" );
14950 return SQLITE_OK;
14951 }
14952
14953 /*
14954 ** Return true if the cursor is at EOF.
14955 */
dbdataEof(sqlite3_vtab_cursor * pCursor)14956 static int dbdataEof(sqlite3_vtab_cursor *pCursor){
14957 DbdataCursor *pCsr = (DbdataCursor*)pCursor;
14958 return pCsr->aPage==0;
14959 }
14960
14961 /*
14962 ** Return true if nul-terminated string zSchema ends in "()". Or false
14963 ** otherwise.
14964 */
dbdataIsFunction(const char * zSchema)14965 static int dbdataIsFunction(const char *zSchema){
14966 size_t n = strlen(zSchema);
14967 if( n>2 && zSchema[n-2]=='(' && zSchema[n-1]==')' ){
14968 return (int)n-2;
14969 }
14970 return 0;
14971 }
14972
14973 /*
14974 ** Determine the size in pages of database zSchema (where zSchema is
14975 ** "main", "temp" or the name of an attached database) and set
14976 ** pCsr->szDb accordingly. If successful, return SQLITE_OK. Otherwise,
14977 ** an SQLite error code.
14978 */
dbdataDbsize(DbdataCursor * pCsr,const char * zSchema)14979 static int dbdataDbsize(DbdataCursor *pCsr, const char *zSchema){
14980 DbdataTable *pTab = (DbdataTable*)pCsr->base.pVtab;
14981 char *zSql = 0;
14982 int rc, rc2;
14983 int nFunc = 0;
14984 sqlite3_stmt *pStmt = 0;
14985
14986 if( (nFunc = dbdataIsFunction(zSchema))>0 ){
14987 zSql = sqlite3_mprintf("SELECT %.*s(0)", nFunc, zSchema);
14988 }else{
14989 zSql = sqlite3_mprintf("PRAGMA %Q.page_count", zSchema);
14990 }
14991 if( zSql==0 ) return SQLITE_NOMEM;
14992
14993 rc = sqlite3_prepare_v2(pTab->db, zSql, -1, &pStmt, 0);
14994 sqlite3_free(zSql);
14995 if( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
14996 pCsr->szDb = sqlite3_column_int(pStmt, 0);
14997 }
14998 rc2 = sqlite3_finalize(pStmt);
14999 if( rc==SQLITE_OK ) rc = rc2;
15000 return rc;
15001 }
15002
15003 /*
15004 ** Attempt to figure out the encoding of the database by retrieving page 1
15005 ** and inspecting the header field. If successful, set the pCsr->enc variable
15006 ** and return SQLITE_OK. Otherwise, return an SQLite error code.
15007 */
dbdataGetEncoding(DbdataCursor * pCsr)15008 static int dbdataGetEncoding(DbdataCursor *pCsr){
15009 int rc = SQLITE_OK;
15010 int nPg1 = 0;
15011 u8 *aPg1 = 0;
15012 rc = dbdataLoadPage(pCsr, 1, &aPg1, &nPg1);
15013 if( rc==SQLITE_OK && nPg1>=(56+4) ){
15014 pCsr->enc = get_uint32(&aPg1[56]);
15015 }
15016 sqlite3_free(aPg1);
15017 return rc;
15018 }
15019
15020
15021 /*
15022 ** xFilter method for sqlite_dbdata and sqlite_dbptr.
15023 */
dbdataFilter(sqlite3_vtab_cursor * pCursor,int idxNum,const char * idxStr,int argc,sqlite3_value ** argv)15024 static int dbdataFilter(
15025 sqlite3_vtab_cursor *pCursor,
15026 int idxNum, const char *idxStr,
15027 int argc, sqlite3_value **argv
15028 ){
15029 DbdataCursor *pCsr = (DbdataCursor*)pCursor;
15030 DbdataTable *pTab = (DbdataTable*)pCursor->pVtab;
15031 int rc = SQLITE_OK;
15032 const char *zSchema = "main";
15033 (void)idxStr;
15034 (void)argc;
15035
15036 dbdataResetCursor(pCsr);
15037 assert( pCsr->iPgno==1 );
15038 if( idxNum & 0x01 ){
15039 zSchema = (const char*)sqlite3_value_text(argv[0]);
15040 if( zSchema==0 ) zSchema = "";
15041 }
15042 if( idxNum & 0x02 ){
15043 pCsr->iPgno = sqlite3_value_int(argv[(idxNum & 0x01)]);
15044 pCsr->bOnePage = 1;
15045 }else{
15046 rc = dbdataDbsize(pCsr, zSchema);
15047 }
15048
15049 if( rc==SQLITE_OK ){
15050 int nFunc = 0;
15051 if( pTab->pStmt ){
15052 pCsr->pStmt = pTab->pStmt;
15053 pTab->pStmt = 0;
15054 }else if( (nFunc = dbdataIsFunction(zSchema))>0 ){
15055 char *zSql = sqlite3_mprintf("SELECT %.*s(?2)", nFunc, zSchema);
15056 if( zSql==0 ){
15057 rc = SQLITE_NOMEM;
15058 }else{
15059 rc = sqlite3_prepare_v2(pTab->db, zSql, -1, &pCsr->pStmt, 0);
15060 sqlite3_free(zSql);
15061 }
15062 }else{
15063 rc = sqlite3_prepare_v2(pTab->db,
15064 "SELECT data FROM sqlite_dbpage(?) WHERE pgno=?", -1,
15065 &pCsr->pStmt, 0
15066 );
15067 }
15068 }
15069 if( rc==SQLITE_OK ){
15070 rc = sqlite3_bind_text(pCsr->pStmt, 1, zSchema, -1, SQLITE_TRANSIENT);
15071 }
15072
15073 /* Try to determine the encoding of the db by inspecting the header
15074 ** field on page 1. */
15075 if( rc==SQLITE_OK ){
15076 rc = dbdataGetEncoding(pCsr);
15077 }
15078
15079 if( rc!=SQLITE_OK ){
15080 pTab->base.zErrMsg = sqlite3_mprintf("%s", sqlite3_errmsg(pTab->db));
15081 }
15082
15083 if( rc==SQLITE_OK ){
15084 rc = dbdataNext(pCursor);
15085 }
15086 return rc;
15087 }
15088
15089 /*
15090 ** Return a column for the sqlite_dbdata or sqlite_dbptr table.
15091 */
dbdataColumn(sqlite3_vtab_cursor * pCursor,sqlite3_context * ctx,int i)15092 static int dbdataColumn(
15093 sqlite3_vtab_cursor *pCursor,
15094 sqlite3_context *ctx,
15095 int i
15096 ){
15097 DbdataCursor *pCsr = (DbdataCursor*)pCursor;
15098 DbdataTable *pTab = (DbdataTable*)pCursor->pVtab;
15099 if( pTab->bPtr ){
15100 switch( i ){
15101 case DBPTR_COLUMN_PGNO:
15102 sqlite3_result_int64(ctx, pCsr->iPgno);
15103 break;
15104 case DBPTR_COLUMN_CHILD: {
15105 int iOff = pCsr->iPgno==1 ? 100 : 0;
15106 if( pCsr->iCell<0 ){
15107 iOff += 8;
15108 }else{
15109 iOff += 12 + pCsr->iCell*2;
15110 if( iOff>pCsr->nPage ) return SQLITE_OK;
15111 iOff = get_uint16(&pCsr->aPage[iOff]);
15112 }
15113 if( iOff<=pCsr->nPage ){
15114 sqlite3_result_int64(ctx, get_uint32(&pCsr->aPage[iOff]));
15115 }
15116 break;
15117 }
15118 }
15119 }else{
15120 switch( i ){
15121 case DBDATA_COLUMN_PGNO:
15122 sqlite3_result_int64(ctx, pCsr->iPgno);
15123 break;
15124 case DBDATA_COLUMN_CELL:
15125 sqlite3_result_int(ctx, pCsr->iCell);
15126 break;
15127 case DBDATA_COLUMN_FIELD:
15128 sqlite3_result_int(ctx, pCsr->iField);
15129 break;
15130 case DBDATA_COLUMN_VALUE: {
15131 if( pCsr->iField<0 ){
15132 sqlite3_result_int64(ctx, pCsr->iIntkey);
15133 }else if( &pCsr->pRec[pCsr->nRec] >= pCsr->pPtr ){
15134 sqlite3_int64 iType;
15135 dbdataGetVarintU32(pCsr->pHdrPtr, &iType);
15136 dbdataValue(
15137 ctx, pCsr->enc, iType, pCsr->pPtr,
15138 &pCsr->pRec[pCsr->nRec] - pCsr->pPtr
15139 );
15140 }
15141 break;
15142 }
15143 }
15144 }
15145 return SQLITE_OK;
15146 }
15147
15148 /*
15149 ** Return the rowid for an sqlite_dbdata or sqlite_dptr table.
15150 */
dbdataRowid(sqlite3_vtab_cursor * pCursor,sqlite_int64 * pRowid)15151 static int dbdataRowid(sqlite3_vtab_cursor *pCursor, sqlite_int64 *pRowid){
15152 DbdataCursor *pCsr = (DbdataCursor*)pCursor;
15153 *pRowid = pCsr->iRowid;
15154 return SQLITE_OK;
15155 }
15156
15157
15158 /*
15159 ** Invoke this routine to register the "sqlite_dbdata" virtual table module
15160 */
sqlite3DbdataRegister(sqlite3 * db)15161 static int sqlite3DbdataRegister(sqlite3 *db){
15162 static sqlite3_module dbdata_module = {
15163 0, /* iVersion */
15164 0, /* xCreate */
15165 dbdataConnect, /* xConnect */
15166 dbdataBestIndex, /* xBestIndex */
15167 dbdataDisconnect, /* xDisconnect */
15168 0, /* xDestroy */
15169 dbdataOpen, /* xOpen - open a cursor */
15170 dbdataClose, /* xClose - close a cursor */
15171 dbdataFilter, /* xFilter - configure scan constraints */
15172 dbdataNext, /* xNext - advance a cursor */
15173 dbdataEof, /* xEof - check for end of scan */
15174 dbdataColumn, /* xColumn - read data */
15175 dbdataRowid, /* xRowid - read data */
15176 0, /* xUpdate */
15177 0, /* xBegin */
15178 0, /* xSync */
15179 0, /* xCommit */
15180 0, /* xRollback */
15181 0, /* xFindMethod */
15182 0, /* xRename */
15183 0, /* xSavepoint */
15184 0, /* xRelease */
15185 0, /* xRollbackTo */
15186 0, /* xShadowName */
15187 0 /* xIntegrity */
15188 };
15189
15190 int rc = sqlite3_create_module(db, "sqlite_dbdata", &dbdata_module, 0);
15191 if( rc==SQLITE_OK ){
15192 rc = sqlite3_create_module(db, "sqlite_dbptr", &dbdata_module, (void*)1);
15193 }
15194 return rc;
15195 }
15196
sqlite3_dbdata_init(sqlite3 * db,char ** pzErrMsg,const sqlite3_api_routines * pApi)15197 int sqlite3_dbdata_init(
15198 sqlite3 *db,
15199 char **pzErrMsg,
15200 const sqlite3_api_routines *pApi
15201 ){
15202 (void)pzErrMsg;
15203 return sqlite3DbdataRegister(db);
15204 }
15205
15206 #endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
15207
15208 /************************* End ../ext/recover/dbdata.c ********************/
15209 /************************* Begin ../ext/recover/sqlite3recover.c ******************/
15210 /*
15211 ** 2022-08-27
15212 **
15213 ** The author disclaims copyright to this source code. In place of
15214 ** a legal notice, here is a blessing:
15215 **
15216 ** May you do good and not evil.
15217 ** May you find forgiveness for yourself and forgive others.
15218 ** May you share freely, never taking more than you give.
15219 **
15220 *************************************************************************
15221 **
15222 */
15223
15224
15225 /* #include "sqlite3recover.h" */
15226 #include <assert.h>
15227 #include <string.h>
15228
15229 #ifndef SQLITE_OMIT_VIRTUALTABLE
15230
15231 /*
15232 ** Declaration for public API function in file dbdata.c. This may be called
15233 ** with NULL as the final two arguments to register the sqlite_dbptr and
15234 ** sqlite_dbdata virtual tables with a database handle.
15235 */
15236 #ifdef _WIN32
15237
15238 #endif
15239 int sqlite3_dbdata_init(sqlite3*, char**, const sqlite3_api_routines*);
15240
15241 /* typedef unsigned int u32; */
15242 /* typedef unsigned char u8; */
15243 /* typedef sqlite3_int64 i64; */
15244
15245 typedef struct RecoverTable RecoverTable;
15246 typedef struct RecoverColumn RecoverColumn;
15247
15248 /*
15249 ** When recovering rows of data that can be associated with table
15250 ** definitions recovered from the sqlite_schema table, each table is
15251 ** represented by an instance of the following object.
15252 **
15253 ** iRoot:
15254 ** The root page in the original database. Not necessarily (and usually
15255 ** not) the same in the recovered database.
15256 **
15257 ** zTab:
15258 ** Name of the table.
15259 **
15260 ** nCol/aCol[]:
15261 ** aCol[] is an array of nCol columns. In the order in which they appear
15262 ** in the table.
15263 **
15264 ** bIntkey:
15265 ** Set to true for intkey tables, false for WITHOUT ROWID.
15266 **
15267 ** iRowidBind:
15268 ** Each column in the aCol[] array has associated with it the index of
15269 ** the bind parameter its values will be bound to in the INSERT statement
15270 ** used to construct the output database. If the table does has a rowid
15271 ** but not an INTEGER PRIMARY KEY column, then iRowidBind contains the
15272 ** index of the bind paramater to which the rowid value should be bound.
15273 ** Otherwise, it contains -1. If the table does contain an INTEGER PRIMARY
15274 ** KEY column, then the rowid value should be bound to the index associated
15275 ** with the column.
15276 **
15277 ** pNext:
15278 ** All RecoverTable objects used by the recovery operation are allocated
15279 ** and populated as part of creating the recovered database schema in
15280 ** the output database, before any non-schema data are recovered. They
15281 ** are then stored in a singly-linked list linked by this variable beginning
15282 ** at sqlite3_recover.pTblList.
15283 */
15284 struct RecoverTable {
15285 u32 iRoot; /* Root page in original database */
15286 char *zTab; /* Name of table */
15287 int nCol; /* Number of columns in table */
15288 RecoverColumn *aCol; /* Array of columns */
15289 int bIntkey; /* True for intkey, false for without rowid */
15290 int iRowidBind; /* If >0, bind rowid to INSERT here */
15291 RecoverTable *pNext;
15292 };
15293
15294 /*
15295 ** Each database column is represented by an instance of the following object
15296 ** stored in the RecoverTable.aCol[] array of the associated table.
15297 **
15298 ** iField:
15299 ** The index of the associated field within database records. Or -1 if
15300 ** there is no associated field (e.g. for virtual generated columns).
15301 **
15302 ** iBind:
15303 ** The bind index of the INSERT statement to bind this columns values
15304 ** to. Or 0 if there is no such index (iff (iField<0)).
15305 **
15306 ** bIPK:
15307 ** True if this is the INTEGER PRIMARY KEY column.
15308 **
15309 ** zCol:
15310 ** Name of column.
15311 **
15312 ** eHidden:
15313 ** A RECOVER_EHIDDEN_* constant value (see below for interpretation of each).
15314 */
15315 struct RecoverColumn {
15316 int iField; /* Field in record on disk */
15317 int iBind; /* Binding to use in INSERT */
15318 int bIPK; /* True for IPK column */
15319 char *zCol;
15320 int eHidden;
15321 };
15322
15323 #define RECOVER_EHIDDEN_NONE 0 /* Normal database column */
15324 #define RECOVER_EHIDDEN_HIDDEN 1 /* Column is __HIDDEN__ */
15325 #define RECOVER_EHIDDEN_VIRTUAL 2 /* Virtual generated column */
15326 #define RECOVER_EHIDDEN_STORED 3 /* Stored generated column */
15327
15328 /*
15329 ** Bitmap object used to track pages in the input database. Allocated
15330 ** and manipulated only by the following functions:
15331 **
15332 ** recoverBitmapAlloc()
15333 ** recoverBitmapFree()
15334 ** recoverBitmapSet()
15335 ** recoverBitmapQuery()
15336 **
15337 ** nPg:
15338 ** Largest page number that may be stored in the bitmap. The range
15339 ** of valid keys is 1 to nPg, inclusive.
15340 **
15341 ** aElem[]:
15342 ** Array large enough to contain a bit for each key. For key value
15343 ** iKey, the associated bit is the bit (iKey%32) of aElem[iKey/32].
15344 ** In other words, the following is true if bit iKey is set, or
15345 ** false if it is clear:
15346 **
15347 ** (aElem[iKey/32] & (1 << (iKey%32))) ? 1 : 0
15348 */
15349 typedef struct RecoverBitmap RecoverBitmap;
15350 struct RecoverBitmap {
15351 i64 nPg; /* Size of bitmap */
15352 u32 aElem[1]; /* Array of 32-bit bitmasks */
15353 };
15354
15355 /*
15356 ** State variables (part of the sqlite3_recover structure) used while
15357 ** recovering data for tables identified in the recovered schema (state
15358 ** RECOVER_STATE_WRITING).
15359 */
15360 typedef struct RecoverStateW1 RecoverStateW1;
15361 struct RecoverStateW1 {
15362 sqlite3_stmt *pTbls;
15363 sqlite3_stmt *pSel;
15364 sqlite3_stmt *pInsert;
15365 int nInsert;
15366
15367 RecoverTable *pTab; /* Table currently being written */
15368 int nMax; /* Max column count in any schema table */
15369 sqlite3_value **apVal; /* Array of nMax values */
15370 int nVal; /* Number of valid entries in apVal[] */
15371 int bHaveRowid;
15372 i64 iRowid;
15373 i64 iPrevPage;
15374 int iPrevCell;
15375 };
15376
15377 /*
15378 ** State variables (part of the sqlite3_recover structure) used while
15379 ** recovering data destined for the lost and found table (states
15380 ** RECOVER_STATE_LOSTANDFOUND[123]).
15381 */
15382 typedef struct RecoverStateLAF RecoverStateLAF;
15383 struct RecoverStateLAF {
15384 RecoverBitmap *pUsed;
15385 i64 nPg; /* Size of db in pages */
15386 sqlite3_stmt *pAllAndParent;
15387 sqlite3_stmt *pMapInsert;
15388 sqlite3_stmt *pMaxField;
15389 sqlite3_stmt *pUsedPages;
15390 sqlite3_stmt *pFindRoot;
15391 sqlite3_stmt *pInsert; /* INSERT INTO lost_and_found ... */
15392 sqlite3_stmt *pAllPage;
15393 sqlite3_stmt *pPageData;
15394 sqlite3_value **apVal;
15395 int nMaxField;
15396 };
15397
15398 /*
15399 ** Main recover handle structure.
15400 */
15401 struct sqlite3_recover {
15402 /* Copies of sqlite3_recover_init[_sql]() parameters */
15403 sqlite3 *dbIn; /* Input database */
15404 char *zDb; /* Name of input db ("main" etc.) */
15405 char *zUri; /* URI for output database */
15406 void *pSqlCtx; /* SQL callback context */
15407 int (*xSql)(void*,const char*); /* Pointer to SQL callback function */
15408
15409 /* Values configured by sqlite3_recover_config() */
15410 char *zStateDb; /* State database to use (or NULL) */
15411 char *zLostAndFound; /* Name of lost-and-found table (or NULL) */
15412 int bFreelistCorrupt; /* SQLITE_RECOVER_FREELIST_CORRUPT setting */
15413 int bRecoverRowid; /* SQLITE_RECOVER_ROWIDS setting */
15414 int bSlowIndexes; /* SQLITE_RECOVER_SLOWINDEXES setting */
15415
15416 int pgsz;
15417 int detected_pgsz;
15418 int nReserve;
15419 u8 *pPage1Disk;
15420 u8 *pPage1Cache;
15421
15422 /* Error code and error message */
15423 int errCode; /* For sqlite3_recover_errcode() */
15424 char *zErrMsg; /* For sqlite3_recover_errmsg() */
15425
15426 int eState;
15427 int bCloseTransaction;
15428
15429 /* Variables used with eState==RECOVER_STATE_WRITING */
15430 RecoverStateW1 w1;
15431
15432 /* Variables used with states RECOVER_STATE_LOSTANDFOUND[123] */
15433 RecoverStateLAF laf;
15434
15435 /* Fields used within sqlite3_recover_run() */
15436 sqlite3 *dbOut; /* Output database */
15437 sqlite3_stmt *pGetPage; /* SELECT against input db sqlite_dbdata */
15438 RecoverTable *pTblList; /* List of tables recovered from schema */
15439 };
15440
15441 /*
15442 ** The various states in which an sqlite3_recover object may exist:
15443 **
15444 ** RECOVER_STATE_INIT:
15445 ** The object is initially created in this state. sqlite3_recover_step()
15446 ** has yet to be called. This is the only state in which it is permitted
15447 ** to call sqlite3_recover_config().
15448 **
15449 ** RECOVER_STATE_WRITING:
15450 **
15451 ** RECOVER_STATE_LOSTANDFOUND1:
15452 ** State to populate the bitmap of pages used by other tables or the
15453 ** database freelist.
15454 **
15455 ** RECOVER_STATE_LOSTANDFOUND2:
15456 ** Populate the recovery.map table - used to figure out a "root" page
15457 ** for each lost page from in the database from which records are
15458 ** extracted.
15459 **
15460 ** RECOVER_STATE_LOSTANDFOUND3:
15461 ** Populate the lost-and-found table itself.
15462 */
15463 #define RECOVER_STATE_INIT 0
15464 #define RECOVER_STATE_WRITING 1
15465 #define RECOVER_STATE_LOSTANDFOUND1 2
15466 #define RECOVER_STATE_LOSTANDFOUND2 3
15467 #define RECOVER_STATE_LOSTANDFOUND3 4
15468 #define RECOVER_STATE_SCHEMA2 5
15469 #define RECOVER_STATE_DONE 6
15470
15471
15472 /*
15473 ** Global variables used by this extension.
15474 */
15475 typedef struct RecoverGlobal RecoverGlobal;
15476 struct RecoverGlobal {
15477 const sqlite3_io_methods *pMethods;
15478 sqlite3_recover *p;
15479 };
15480 static RecoverGlobal recover_g;
15481
15482 /*
15483 ** Use this static SQLite mutex to protect the globals during the
15484 ** first call to sqlite3_recover_step().
15485 */
15486 #define RECOVER_MUTEX_ID SQLITE_MUTEX_STATIC_APP2
15487
15488
15489 /*
15490 ** Default value for SQLITE_RECOVER_ROWIDS (sqlite3_recover.bRecoverRowid).
15491 */
15492 #define RECOVER_ROWID_DEFAULT 1
15493
15494 /*
15495 ** Mutex handling:
15496 **
15497 ** recoverEnterMutex() - Enter the recovery mutex
15498 ** recoverLeaveMutex() - Leave the recovery mutex
15499 ** recoverAssertMutexHeld() - Assert that the recovery mutex is held
15500 */
15501 #if defined(SQLITE_THREADSAFE) && SQLITE_THREADSAFE==0
15502 # define recoverEnterMutex()
15503 # define recoverLeaveMutex()
15504 #else
recoverEnterMutex(void)15505 static void recoverEnterMutex(void){
15506 sqlite3_mutex_enter(sqlite3_mutex_alloc(RECOVER_MUTEX_ID));
15507 }
recoverLeaveMutex(void)15508 static void recoverLeaveMutex(void){
15509 sqlite3_mutex_leave(sqlite3_mutex_alloc(RECOVER_MUTEX_ID));
15510 }
15511 #endif
15512 #if SQLITE_THREADSAFE+0>=1 && defined(SQLITE_DEBUG)
recoverAssertMutexHeld(void)15513 static void recoverAssertMutexHeld(void){
15514 assert( sqlite3_mutex_held(sqlite3_mutex_alloc(RECOVER_MUTEX_ID)) );
15515 }
15516 #else
15517 # define recoverAssertMutexHeld()
15518 #endif
15519
15520
15521 /*
15522 ** Like strlen(). But handles NULL pointer arguments.
15523 */
recoverStrlen(const char * zStr)15524 static int recoverStrlen(const char *zStr){
15525 if( zStr==0 ) return 0;
15526 return (int)(strlen(zStr)&0x7fffffff);
15527 }
15528
15529 /*
15530 ** This function is a no-op if the recover handle passed as the first
15531 ** argument already contains an error (if p->errCode!=SQLITE_OK).
15532 **
15533 ** Otherwise, an attempt is made to allocate, zero and return a buffer nByte
15534 ** bytes in size. If successful, a pointer to the new buffer is returned. Or,
15535 ** if an OOM error occurs, NULL is returned and the handle error code
15536 ** (p->errCode) set to SQLITE_NOMEM.
15537 */
recoverMalloc(sqlite3_recover * p,i64 nByte)15538 static void *recoverMalloc(sqlite3_recover *p, i64 nByte){
15539 void *pRet = 0;
15540 assert( nByte>0 );
15541 if( p->errCode==SQLITE_OK ){
15542 pRet = sqlite3_malloc64(nByte);
15543 if( pRet ){
15544 memset(pRet, 0, nByte);
15545 }else{
15546 p->errCode = SQLITE_NOMEM;
15547 }
15548 }
15549 return pRet;
15550 }
15551
15552 /*
15553 ** Set the error code and error message for the recover handle passed as
15554 ** the first argument. The error code is set to the value of parameter
15555 ** errCode.
15556 **
15557 ** Parameter zFmt must be a printf() style formatting string. The handle
15558 ** error message is set to the result of using any trailing arguments for
15559 ** parameter substitutions in the formatting string.
15560 **
15561 ** For example:
15562 **
15563 ** recoverError(p, SQLITE_ERROR, "no such table: %s", zTablename);
15564 */
recoverError(sqlite3_recover * p,int errCode,const char * zFmt,...)15565 static int recoverError(
15566 sqlite3_recover *p,
15567 int errCode,
15568 const char *zFmt, ...
15569 ){
15570 char *z = 0;
15571 va_list ap;
15572 va_start(ap, zFmt);
15573 if( zFmt ){
15574 z = sqlite3_vmprintf(zFmt, ap);
15575 va_end(ap);
15576 }
15577 sqlite3_free(p->zErrMsg);
15578 p->zErrMsg = z;
15579 p->errCode = errCode;
15580 return errCode;
15581 }
15582
15583
15584 /*
15585 ** This function is a no-op if p->errCode is initially other than SQLITE_OK.
15586 ** In this case it returns NULL.
15587 **
15588 ** Otherwise, an attempt is made to allocate and return a bitmap object
15589 ** large enough to store a bit for all page numbers between 1 and nPg,
15590 ** inclusive. The bitmap is initially zeroed.
15591 */
recoverBitmapAlloc(sqlite3_recover * p,i64 nPg)15592 static RecoverBitmap *recoverBitmapAlloc(sqlite3_recover *p, i64 nPg){
15593 int nElem = (nPg+1+31) / 32;
15594 int nByte = sizeof(RecoverBitmap) + nElem*sizeof(u32);
15595 RecoverBitmap *pRet = (RecoverBitmap*)recoverMalloc(p, nByte);
15596
15597 if( pRet ){
15598 pRet->nPg = nPg;
15599 }
15600 return pRet;
15601 }
15602
15603 /*
15604 ** Free a bitmap object allocated by recoverBitmapAlloc().
15605 */
recoverBitmapFree(RecoverBitmap * pMap)15606 static void recoverBitmapFree(RecoverBitmap *pMap){
15607 sqlite3_free(pMap);
15608 }
15609
15610 /*
15611 ** Set the bit associated with page iPg in bitvec pMap.
15612 */
recoverBitmapSet(RecoverBitmap * pMap,i64 iPg)15613 static void recoverBitmapSet(RecoverBitmap *pMap, i64 iPg){
15614 if( iPg<=pMap->nPg ){
15615 int iElem = (iPg / 32);
15616 int iBit = (iPg % 32);
15617 pMap->aElem[iElem] |= (((u32)1) << iBit);
15618 }
15619 }
15620
15621 /*
15622 ** Query bitmap object pMap for the state of the bit associated with page
15623 ** iPg. Return 1 if it is set, or 0 otherwise.
15624 */
recoverBitmapQuery(RecoverBitmap * pMap,i64 iPg)15625 static int recoverBitmapQuery(RecoverBitmap *pMap, i64 iPg){
15626 int ret = 1;
15627 if( iPg<=pMap->nPg && iPg>0 ){
15628 int iElem = (iPg / 32);
15629 int iBit = (iPg % 32);
15630 ret = (pMap->aElem[iElem] & (((u32)1) << iBit)) ? 1 : 0;
15631 }
15632 return ret;
15633 }
15634
15635 /*
15636 ** Set the recover handle error to the error code and message returned by
15637 ** calling sqlite3_errcode() and sqlite3_errmsg(), respectively, on database
15638 ** handle db.
15639 */
recoverDbError(sqlite3_recover * p,sqlite3 * db)15640 static int recoverDbError(sqlite3_recover *p, sqlite3 *db){
15641 return recoverError(p, sqlite3_errcode(db), "%s", sqlite3_errmsg(db));
15642 }
15643
15644 /*
15645 ** This function is a no-op if recover handle p already contains an error
15646 ** (if p->errCode!=SQLITE_OK).
15647 **
15648 ** Otherwise, it attempts to prepare the SQL statement in zSql against
15649 ** database handle db. If successful, the statement handle is returned.
15650 ** Or, if an error occurs, NULL is returned and an error left in the
15651 ** recover handle.
15652 */
recoverPrepare(sqlite3_recover * p,sqlite3 * db,const char * zSql)15653 static sqlite3_stmt *recoverPrepare(
15654 sqlite3_recover *p,
15655 sqlite3 *db,
15656 const char *zSql
15657 ){
15658 sqlite3_stmt *pStmt = 0;
15659 if( p->errCode==SQLITE_OK ){
15660 if( sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0) ){
15661 recoverDbError(p, db);
15662 }
15663 }
15664 return pStmt;
15665 }
15666
15667 /*
15668 ** This function is a no-op if recover handle p already contains an error
15669 ** (if p->errCode!=SQLITE_OK).
15670 **
15671 ** Otherwise, argument zFmt is used as a printf() style format string,
15672 ** along with any trailing arguments, to create an SQL statement. This
15673 ** SQL statement is prepared against database handle db and, if successful,
15674 ** the statment handle returned. Or, if an error occurs - either during
15675 ** the printf() formatting or when preparing the resulting SQL - an
15676 ** error code and message are left in the recover handle.
15677 */
recoverPreparePrintf(sqlite3_recover * p,sqlite3 * db,const char * zFmt,...)15678 static sqlite3_stmt *recoverPreparePrintf(
15679 sqlite3_recover *p,
15680 sqlite3 *db,
15681 const char *zFmt, ...
15682 ){
15683 sqlite3_stmt *pStmt = 0;
15684 if( p->errCode==SQLITE_OK ){
15685 va_list ap;
15686 char *z;
15687 va_start(ap, zFmt);
15688 z = sqlite3_vmprintf(zFmt, ap);
15689 va_end(ap);
15690 if( z==0 ){
15691 p->errCode = SQLITE_NOMEM;
15692 }else{
15693 pStmt = recoverPrepare(p, db, z);
15694 sqlite3_free(z);
15695 }
15696 }
15697 return pStmt;
15698 }
15699
15700 /*
15701 ** Reset SQLite statement handle pStmt. If the call to sqlite3_reset()
15702 ** indicates that an error occurred, and there is not already an error
15703 ** in the recover handle passed as the first argument, set the error
15704 ** code and error message appropriately.
15705 **
15706 ** This function returns a copy of the statement handle pointer passed
15707 ** as the second argument.
15708 */
recoverReset(sqlite3_recover * p,sqlite3_stmt * pStmt)15709 static sqlite3_stmt *recoverReset(sqlite3_recover *p, sqlite3_stmt *pStmt){
15710 int rc = sqlite3_reset(pStmt);
15711 if( rc!=SQLITE_OK && rc!=SQLITE_CONSTRAINT && p->errCode==SQLITE_OK ){
15712 recoverDbError(p, sqlite3_db_handle(pStmt));
15713 }
15714 return pStmt;
15715 }
15716
15717 /*
15718 ** Finalize SQLite statement handle pStmt. If the call to sqlite3_reset()
15719 ** indicates that an error occurred, and there is not already an error
15720 ** in the recover handle passed as the first argument, set the error
15721 ** code and error message appropriately.
15722 */
recoverFinalize(sqlite3_recover * p,sqlite3_stmt * pStmt)15723 static void recoverFinalize(sqlite3_recover *p, sqlite3_stmt *pStmt){
15724 sqlite3 *db = sqlite3_db_handle(pStmt);
15725 int rc = sqlite3_finalize(pStmt);
15726 if( rc!=SQLITE_OK && p->errCode==SQLITE_OK ){
15727 recoverDbError(p, db);
15728 }
15729 }
15730
15731 /*
15732 ** This function is a no-op if recover handle p already contains an error
15733 ** (if p->errCode!=SQLITE_OK). A copy of p->errCode is returned in this
15734 ** case.
15735 **
15736 ** Otherwise, execute SQL script zSql. If successful, return SQLITE_OK.
15737 ** Or, if an error occurs, leave an error code and message in the recover
15738 ** handle and return a copy of the error code.
15739 */
recoverExec(sqlite3_recover * p,sqlite3 * db,const char * zSql)15740 static int recoverExec(sqlite3_recover *p, sqlite3 *db, const char *zSql){
15741 if( p->errCode==SQLITE_OK ){
15742 int rc = sqlite3_exec(db, zSql, 0, 0, 0);
15743 if( rc ){
15744 recoverDbError(p, db);
15745 }
15746 }
15747 return p->errCode;
15748 }
15749
15750 /*
15751 ** Bind the value pVal to parameter iBind of statement pStmt. Leave an
15752 ** error in the recover handle passed as the first argument if an error
15753 ** (e.g. an OOM) occurs.
15754 */
recoverBindValue(sqlite3_recover * p,sqlite3_stmt * pStmt,int iBind,sqlite3_value * pVal)15755 static void recoverBindValue(
15756 sqlite3_recover *p,
15757 sqlite3_stmt *pStmt,
15758 int iBind,
15759 sqlite3_value *pVal
15760 ){
15761 if( p->errCode==SQLITE_OK ){
15762 int rc = sqlite3_bind_value(pStmt, iBind, pVal);
15763 if( rc ) recoverError(p, rc, 0);
15764 }
15765 }
15766
15767 /*
15768 ** This function is a no-op if recover handle p already contains an error
15769 ** (if p->errCode!=SQLITE_OK). NULL is returned in this case.
15770 **
15771 ** Otherwise, an attempt is made to interpret zFmt as a printf() style
15772 ** formatting string and the result of using the trailing arguments for
15773 ** parameter substitution with it written into a buffer obtained from
15774 ** sqlite3_malloc(). If successful, a pointer to the buffer is returned.
15775 ** It is the responsibility of the caller to eventually free the buffer
15776 ** using sqlite3_free().
15777 **
15778 ** Or, if an error occurs, an error code and message is left in the recover
15779 ** handle and NULL returned.
15780 */
recoverMPrintf(sqlite3_recover * p,const char * zFmt,...)15781 static char *recoverMPrintf(sqlite3_recover *p, const char *zFmt, ...){
15782 va_list ap;
15783 char *z;
15784 va_start(ap, zFmt);
15785 z = sqlite3_vmprintf(zFmt, ap);
15786 va_end(ap);
15787 if( p->errCode==SQLITE_OK ){
15788 if( z==0 ) p->errCode = SQLITE_NOMEM;
15789 }else{
15790 sqlite3_free(z);
15791 z = 0;
15792 }
15793 return z;
15794 }
15795
15796 /*
15797 ** This function is a no-op if recover handle p already contains an error
15798 ** (if p->errCode!=SQLITE_OK). Zero is returned in this case.
15799 **
15800 ** Otherwise, execute "PRAGMA page_count" against the input database. If
15801 ** successful, return the integer result. Or, if an error occurs, leave an
15802 ** error code and error message in the sqlite3_recover handle and return
15803 ** zero.
15804 */
recoverPageCount(sqlite3_recover * p)15805 static i64 recoverPageCount(sqlite3_recover *p){
15806 i64 nPg = 0;
15807 if( p->errCode==SQLITE_OK ){
15808 sqlite3_stmt *pStmt = 0;
15809 pStmt = recoverPreparePrintf(p, p->dbIn, "PRAGMA %Q.page_count", p->zDb);
15810 if( pStmt ){
15811 sqlite3_step(pStmt);
15812 nPg = sqlite3_column_int64(pStmt, 0);
15813 }
15814 recoverFinalize(p, pStmt);
15815 }
15816 return nPg;
15817 }
15818
15819 /*
15820 ** Implementation of SQL scalar function "read_i32". The first argument to
15821 ** this function must be a blob. The second a non-negative integer. This
15822 ** function reads and returns a 32-bit big-endian integer from byte
15823 ** offset (4*<arg2>) of the blob.
15824 **
15825 ** SELECT read_i32(<blob>, <idx>)
15826 */
recoverReadI32(sqlite3_context * context,int argc,sqlite3_value ** argv)15827 static void recoverReadI32(
15828 sqlite3_context *context,
15829 int argc,
15830 sqlite3_value **argv
15831 ){
15832 const unsigned char *pBlob;
15833 int nBlob;
15834 int iInt;
15835
15836 assert( argc==2 );
15837 nBlob = sqlite3_value_bytes(argv[0]);
15838 pBlob = (const unsigned char*)sqlite3_value_blob(argv[0]);
15839 iInt = sqlite3_value_int(argv[1]) & 0xFFFF;
15840
15841 if( (iInt+1)*4<=nBlob ){
15842 const unsigned char *a = &pBlob[iInt*4];
15843 i64 iVal = ((i64)a[0]<<24)
15844 + ((i64)a[1]<<16)
15845 + ((i64)a[2]<< 8)
15846 + ((i64)a[3]<< 0);
15847 sqlite3_result_int64(context, iVal);
15848 }
15849 }
15850
15851 /*
15852 ** Implementation of SQL scalar function "page_is_used". This function
15853 ** is used as part of the procedure for locating orphan rows for the
15854 ** lost-and-found table, and it depends on those routines having populated
15855 ** the sqlite3_recover.laf.pUsed variable.
15856 **
15857 ** The only argument to this function is a page-number. It returns true
15858 ** if the page has already been used somehow during data recovery, or false
15859 ** otherwise.
15860 **
15861 ** SELECT page_is_used(<pgno>);
15862 */
recoverPageIsUsed(sqlite3_context * pCtx,int nArg,sqlite3_value ** apArg)15863 static void recoverPageIsUsed(
15864 sqlite3_context *pCtx,
15865 int nArg,
15866 sqlite3_value **apArg
15867 ){
15868 sqlite3_recover *p = (sqlite3_recover*)sqlite3_user_data(pCtx);
15869 i64 pgno = sqlite3_value_int64(apArg[0]);
15870 assert( nArg==1 );
15871 sqlite3_result_int(pCtx, recoverBitmapQuery(p->laf.pUsed, pgno));
15872 }
15873
15874 /*
15875 ** The implementation of a user-defined SQL function invoked by the
15876 ** sqlite_dbdata and sqlite_dbptr virtual table modules to access pages
15877 ** of the database being recovered.
15878 **
15879 ** This function always takes a single integer argument. If the argument
15880 ** is zero, then the value returned is the number of pages in the db being
15881 ** recovered. If the argument is greater than zero, it is a page number.
15882 ** The value returned in this case is an SQL blob containing the data for
15883 ** the identified page of the db being recovered. e.g.
15884 **
15885 ** SELECT getpage(0); -- return number of pages in db
15886 ** SELECT getpage(4); -- return page 4 of db as a blob of data
15887 */
recoverGetPage(sqlite3_context * pCtx,int nArg,sqlite3_value ** apArg)15888 static void recoverGetPage(
15889 sqlite3_context *pCtx,
15890 int nArg,
15891 sqlite3_value **apArg
15892 ){
15893 sqlite3_recover *p = (sqlite3_recover*)sqlite3_user_data(pCtx);
15894 i64 pgno = sqlite3_value_int64(apArg[0]);
15895 sqlite3_stmt *pStmt = 0;
15896
15897 assert( nArg==1 );
15898 if( pgno==0 ){
15899 i64 nPg = recoverPageCount(p);
15900 sqlite3_result_int64(pCtx, nPg);
15901 return;
15902 }else{
15903 if( p->pGetPage==0 ){
15904 pStmt = p->pGetPage = recoverPreparePrintf(
15905 p, p->dbIn, "SELECT data FROM sqlite_dbpage(%Q) WHERE pgno=?", p->zDb
15906 );
15907 }else if( p->errCode==SQLITE_OK ){
15908 pStmt = p->pGetPage;
15909 }
15910
15911 if( pStmt ){
15912 sqlite3_bind_int64(pStmt, 1, pgno);
15913 if( SQLITE_ROW==sqlite3_step(pStmt) ){
15914 const u8 *aPg;
15915 int nPg;
15916 assert( p->errCode==SQLITE_OK );
15917 aPg = sqlite3_column_blob(pStmt, 0);
15918 nPg = sqlite3_column_bytes(pStmt, 0);
15919 if( pgno==1 && nPg==p->pgsz && 0==memcmp(p->pPage1Cache, aPg, nPg) ){
15920 aPg = p->pPage1Disk;
15921 }
15922 sqlite3_result_blob(pCtx, aPg, nPg-p->nReserve, SQLITE_TRANSIENT);
15923 }
15924 recoverReset(p, pStmt);
15925 }
15926 }
15927
15928 if( p->errCode ){
15929 if( p->zErrMsg ) sqlite3_result_error(pCtx, p->zErrMsg, -1);
15930 sqlite3_result_error_code(pCtx, p->errCode);
15931 }
15932 }
15933
15934 /*
15935 ** Find a string that is not found anywhere in z[]. Return a pointer
15936 ** to that string.
15937 **
15938 ** Try to use zA and zB first. If both of those are already found in z[]
15939 ** then make up some string and store it in the buffer zBuf.
15940 */
recoverUnusedString(const char * z,const char * zA,const char * zB,char * zBuf)15941 static const char *recoverUnusedString(
15942 const char *z, /* Result must not appear anywhere in z */
15943 const char *zA, const char *zB, /* Try these first */
15944 char *zBuf /* Space to store a generated string */
15945 ){
15946 unsigned i = 0;
15947 if( strstr(z, zA)==0 ) return zA;
15948 if( strstr(z, zB)==0 ) return zB;
15949 do{
15950 sqlite3_snprintf(20,zBuf,"(%s%u)", zA, i++);
15951 }while( strstr(z,zBuf)!=0 );
15952 return zBuf;
15953 }
15954
15955 /*
15956 ** Implementation of scalar SQL function "escape_crnl". The argument passed to
15957 ** this function is the output of built-in function quote(). If the first
15958 ** character of the input is "'", indicating that the value passed to quote()
15959 ** was a text value, then this function searches the input for "\n" and "\r"
15960 ** characters and adds a wrapper similar to the following:
15961 **
15962 ** replace(replace(<input>, '\n', char(10), '\r', char(13));
15963 **
15964 ** Or, if the first character of the input is not "'", then a copy of the input
15965 ** is returned.
15966 */
recoverEscapeCrnl(sqlite3_context * context,int argc,sqlite3_value ** argv)15967 static void recoverEscapeCrnl(
15968 sqlite3_context *context,
15969 int argc,
15970 sqlite3_value **argv
15971 ){
15972 const char *zText = (const char*)sqlite3_value_text(argv[0]);
15973 (void)argc;
15974 if( zText && zText[0]=='\'' ){
15975 int nText = sqlite3_value_bytes(argv[0]);
15976 int i;
15977 char zBuf1[20];
15978 char zBuf2[20];
15979 const char *zNL = 0;
15980 const char *zCR = 0;
15981 int nCR = 0;
15982 int nNL = 0;
15983
15984 for(i=0; zText[i]; i++){
15985 if( zNL==0 && zText[i]=='\n' ){
15986 zNL = recoverUnusedString(zText, "\\n", "\\012", zBuf1);
15987 nNL = (int)strlen(zNL);
15988 }
15989 if( zCR==0 && zText[i]=='\r' ){
15990 zCR = recoverUnusedString(zText, "\\r", "\\015", zBuf2);
15991 nCR = (int)strlen(zCR);
15992 }
15993 }
15994
15995 if( zNL || zCR ){
15996 int iOut = 0;
15997 i64 nMax = (nNL > nCR) ? nNL : nCR;
15998 i64 nAlloc = nMax * nText + (nMax+64)*2;
15999 char *zOut = (char*)sqlite3_malloc64(nAlloc);
16000 if( zOut==0 ){
16001 sqlite3_result_error_nomem(context);
16002 return;
16003 }
16004
16005 if( zNL && zCR ){
16006 memcpy(&zOut[iOut], "replace(replace(", 16);
16007 iOut += 16;
16008 }else{
16009 memcpy(&zOut[iOut], "replace(", 8);
16010 iOut += 8;
16011 }
16012 for(i=0; zText[i]; i++){
16013 if( zText[i]=='\n' ){
16014 memcpy(&zOut[iOut], zNL, nNL);
16015 iOut += nNL;
16016 }else if( zText[i]=='\r' ){
16017 memcpy(&zOut[iOut], zCR, nCR);
16018 iOut += nCR;
16019 }else{
16020 zOut[iOut] = zText[i];
16021 iOut++;
16022 }
16023 }
16024
16025 if( zNL ){
16026 memcpy(&zOut[iOut], ",'", 2); iOut += 2;
16027 memcpy(&zOut[iOut], zNL, nNL); iOut += nNL;
16028 memcpy(&zOut[iOut], "', char(10))", 12); iOut += 12;
16029 }
16030 if( zCR ){
16031 memcpy(&zOut[iOut], ",'", 2); iOut += 2;
16032 memcpy(&zOut[iOut], zCR, nCR); iOut += nCR;
16033 memcpy(&zOut[iOut], "', char(13))", 12); iOut += 12;
16034 }
16035
16036 sqlite3_result_text(context, zOut, iOut, SQLITE_TRANSIENT);
16037 sqlite3_free(zOut);
16038 return;
16039 }
16040 }
16041
16042 sqlite3_result_value(context, argv[0]);
16043 }
16044
16045 /*
16046 ** This function is a no-op if recover handle p already contains an error
16047 ** (if p->errCode!=SQLITE_OK). A copy of the error code is returned in
16048 ** this case.
16049 **
16050 ** Otherwise, attempt to populate temporary table "recovery.schema" with the
16051 ** parts of the database schema that can be extracted from the input database.
16052 **
16053 ** If no error occurs, SQLITE_OK is returned. Otherwise, an error code
16054 ** and error message are left in the recover handle and a copy of the
16055 ** error code returned. It is not considered an error if part of all of
16056 ** the database schema cannot be recovered due to corruption.
16057 */
recoverCacheSchema(sqlite3_recover * p)16058 static int recoverCacheSchema(sqlite3_recover *p){
16059 return recoverExec(p, p->dbOut,
16060 "WITH RECURSIVE pages(p) AS ("
16061 " SELECT 1"
16062 " UNION"
16063 " SELECT child FROM sqlite_dbptr('getpage()'), pages WHERE pgno=p"
16064 ")"
16065 "INSERT INTO recovery.schema SELECT"
16066 " max(CASE WHEN field=0 THEN value ELSE NULL END),"
16067 " max(CASE WHEN field=1 THEN value ELSE NULL END),"
16068 " max(CASE WHEN field=2 THEN value ELSE NULL END),"
16069 " max(CASE WHEN field=3 THEN value ELSE NULL END),"
16070 " max(CASE WHEN field=4 THEN value ELSE NULL END)"
16071 "FROM sqlite_dbdata('getpage()') WHERE pgno IN ("
16072 " SELECT p FROM pages"
16073 ") GROUP BY pgno, cell"
16074 );
16075 }
16076
16077 /*
16078 ** If this recover handle is not in SQL callback mode (i.e. was not created
16079 ** using sqlite3_recover_init_sql()) of if an error has already occurred,
16080 ** this function is a no-op. Otherwise, issue a callback with SQL statement
16081 ** zSql as the parameter.
16082 **
16083 ** If the callback returns non-zero, set the recover handle error code to
16084 ** the value returned (so that the caller will abandon processing).
16085 */
recoverSqlCallback(sqlite3_recover * p,const char * zSql)16086 static void recoverSqlCallback(sqlite3_recover *p, const char *zSql){
16087 if( p->errCode==SQLITE_OK && p->xSql ){
16088 int res = p->xSql(p->pSqlCtx, zSql);
16089 if( res ){
16090 recoverError(p, SQLITE_ERROR, "callback returned an error - %d", res);
16091 }
16092 }
16093 }
16094
16095 /*
16096 ** Transfer the following settings from the input database to the output
16097 ** database:
16098 **
16099 ** + page-size,
16100 ** + auto-vacuum settings,
16101 ** + database encoding,
16102 ** + user-version (PRAGMA user_version), and
16103 ** + application-id (PRAGMA application_id), and
16104 */
recoverTransferSettings(sqlite3_recover * p)16105 static void recoverTransferSettings(sqlite3_recover *p){
16106 const char *aPragma[] = {
16107 "encoding",
16108 "page_size",
16109 "auto_vacuum",
16110 "user_version",
16111 "application_id"
16112 };
16113 int ii;
16114
16115 /* Truncate the output database to 0 pages in size. This is done by
16116 ** opening a new, empty, temp db, then using the backup API to clobber
16117 ** any existing output db with a copy of it. */
16118 if( p->errCode==SQLITE_OK ){
16119 sqlite3 *db2 = 0;
16120 int rc = sqlite3_open("", &db2);
16121 if( rc!=SQLITE_OK ){
16122 recoverDbError(p, db2);
16123 return;
16124 }
16125
16126 for(ii=0; ii<(int)(sizeof(aPragma)/sizeof(aPragma[0])); ii++){
16127 const char *zPrag = aPragma[ii];
16128 sqlite3_stmt *p1 = 0;
16129 p1 = recoverPreparePrintf(p, p->dbIn, "PRAGMA %Q.%s", p->zDb, zPrag);
16130 if( p->errCode==SQLITE_OK && sqlite3_step(p1)==SQLITE_ROW ){
16131 const char *zArg = (const char*)sqlite3_column_text(p1, 0);
16132 char *z2 = recoverMPrintf(p, "PRAGMA %s = %Q", zPrag, zArg);
16133 recoverSqlCallback(p, z2);
16134 recoverExec(p, db2, z2);
16135 sqlite3_free(z2);
16136 if( zArg==0 ){
16137 recoverError(p, SQLITE_NOMEM, 0);
16138 }
16139 }
16140 recoverFinalize(p, p1);
16141 }
16142 recoverExec(p, db2, "CREATE TABLE t1(a); DROP TABLE t1;");
16143
16144 if( p->errCode==SQLITE_OK ){
16145 sqlite3 *db = p->dbOut;
16146 sqlite3_backup *pBackup = sqlite3_backup_init(db, "main", db2, "main");
16147 if( pBackup ){
16148 sqlite3_backup_step(pBackup, -1);
16149 p->errCode = sqlite3_backup_finish(pBackup);
16150 }else{
16151 recoverDbError(p, db);
16152 }
16153 }
16154
16155 sqlite3_close(db2);
16156 }
16157 }
16158
16159 /*
16160 ** This function is a no-op if recover handle p already contains an error
16161 ** (if p->errCode!=SQLITE_OK). A copy of the error code is returned in
16162 ** this case.
16163 **
16164 ** Otherwise, an attempt is made to open the output database, attach
16165 ** and create the schema of the temporary database used to store
16166 ** intermediate data, and to register all required user functions and
16167 ** virtual table modules with the output handle.
16168 **
16169 ** If no error occurs, SQLITE_OK is returned. Otherwise, an error code
16170 ** and error message are left in the recover handle and a copy of the
16171 ** error code returned.
16172 */
recoverOpenOutput(sqlite3_recover * p)16173 static int recoverOpenOutput(sqlite3_recover *p){
16174 struct Func {
16175 const char *zName;
16176 int nArg;
16177 void (*xFunc)(sqlite3_context*,int,sqlite3_value **);
16178 } aFunc[] = {
16179 { "getpage", 1, recoverGetPage },
16180 { "page_is_used", 1, recoverPageIsUsed },
16181 { "read_i32", 2, recoverReadI32 },
16182 { "escape_crnl", 1, recoverEscapeCrnl },
16183 };
16184
16185 const int flags = SQLITE_OPEN_URI|SQLITE_OPEN_CREATE|SQLITE_OPEN_READWRITE;
16186 sqlite3 *db = 0; /* New database handle */
16187 int ii; /* For iterating through aFunc[] */
16188
16189 assert( p->dbOut==0 );
16190
16191 if( sqlite3_open_v2(p->zUri, &db, flags, 0) ){
16192 recoverDbError(p, db);
16193 }
16194
16195 /* Register the sqlite_dbdata and sqlite_dbptr virtual table modules.
16196 ** These two are registered with the output database handle - this
16197 ** module depends on the input handle supporting the sqlite_dbpage
16198 ** virtual table only. */
16199 if( p->errCode==SQLITE_OK ){
16200 p->errCode = sqlite3_dbdata_init(db, 0, 0);
16201 }
16202
16203 /* Register the custom user-functions with the output handle. */
16204 for(ii=0;
16205 p->errCode==SQLITE_OK && ii<(int)(sizeof(aFunc)/sizeof(aFunc[0]));
16206 ii++){
16207 p->errCode = sqlite3_create_function(db, aFunc[ii].zName,
16208 aFunc[ii].nArg, SQLITE_UTF8, (void*)p, aFunc[ii].xFunc, 0, 0
16209 );
16210 }
16211
16212 p->dbOut = db;
16213 return p->errCode;
16214 }
16215
16216 /*
16217 ** Attach the auxiliary database 'recovery' to the output database handle.
16218 ** This temporary database is used during the recovery process and then
16219 ** discarded.
16220 */
recoverOpenRecovery(sqlite3_recover * p)16221 static void recoverOpenRecovery(sqlite3_recover *p){
16222 char *zSql = recoverMPrintf(p, "ATTACH %Q AS recovery;", p->zStateDb);
16223 recoverExec(p, p->dbOut, zSql);
16224 recoverExec(p, p->dbOut,
16225 "PRAGMA writable_schema = 1;"
16226 "CREATE TABLE recovery.map(pgno INTEGER PRIMARY KEY, parent INT);"
16227 "CREATE TABLE recovery.schema(type, name, tbl_name, rootpage, sql);"
16228 );
16229 sqlite3_free(zSql);
16230 }
16231
16232
16233 /*
16234 ** This function is a no-op if recover handle p already contains an error
16235 ** (if p->errCode!=SQLITE_OK).
16236 **
16237 ** Otherwise, argument zName must be the name of a table that has just been
16238 ** created in the output database. This function queries the output db
16239 ** for the schema of said table, and creates a RecoverTable object to
16240 ** store the schema in memory. The new RecoverTable object is linked into
16241 ** the list at sqlite3_recover.pTblList.
16242 **
16243 ** Parameter iRoot must be the root page of table zName in the INPUT
16244 ** database.
16245 */
recoverAddTable(sqlite3_recover * p,const char * zName,i64 iRoot)16246 static void recoverAddTable(
16247 sqlite3_recover *p,
16248 const char *zName, /* Name of table created in output db */
16249 i64 iRoot /* Root page of same table in INPUT db */
16250 ){
16251 sqlite3_stmt *pStmt = recoverPreparePrintf(p, p->dbOut,
16252 "PRAGMA table_xinfo(%Q)", zName
16253 );
16254
16255 if( pStmt ){
16256 int iPk = -1;
16257 int iBind = 1;
16258 RecoverTable *pNew = 0;
16259 int nCol = 0;
16260 int nName = recoverStrlen(zName);
16261 int nByte = 0;
16262 while( sqlite3_step(pStmt)==SQLITE_ROW ){
16263 nCol++;
16264 nByte += (sqlite3_column_bytes(pStmt, 1)+1);
16265 }
16266 nByte += sizeof(RecoverTable) + nCol*sizeof(RecoverColumn) + nName+1;
16267 recoverReset(p, pStmt);
16268
16269 pNew = recoverMalloc(p, nByte);
16270 if( pNew ){
16271 int i = 0;
16272 int iField = 0;
16273 char *csr = 0;
16274 pNew->aCol = (RecoverColumn*)&pNew[1];
16275 pNew->zTab = csr = (char*)&pNew->aCol[nCol];
16276 pNew->nCol = nCol;
16277 pNew->iRoot = iRoot;
16278 memcpy(csr, zName, nName);
16279 csr += nName+1;
16280
16281 for(i=0; sqlite3_step(pStmt)==SQLITE_ROW; i++){
16282 int iPKF = sqlite3_column_int(pStmt, 5);
16283 int n = sqlite3_column_bytes(pStmt, 1);
16284 const char *z = (const char*)sqlite3_column_text(pStmt, 1);
16285 const char *zType = (const char*)sqlite3_column_text(pStmt, 2);
16286 int eHidden = sqlite3_column_int(pStmt, 6);
16287
16288 if( iPk==-1 && iPKF==1 && !sqlite3_stricmp("integer", zType) ) iPk = i;
16289 if( iPKF>1 ) iPk = -2;
16290 pNew->aCol[i].zCol = csr;
16291 pNew->aCol[i].eHidden = eHidden;
16292 if( eHidden==RECOVER_EHIDDEN_VIRTUAL ){
16293 pNew->aCol[i].iField = -1;
16294 }else{
16295 pNew->aCol[i].iField = iField++;
16296 }
16297 if( eHidden!=RECOVER_EHIDDEN_VIRTUAL
16298 && eHidden!=RECOVER_EHIDDEN_STORED
16299 ){
16300 pNew->aCol[i].iBind = iBind++;
16301 }
16302 memcpy(csr, z, n);
16303 csr += (n+1);
16304 }
16305
16306 pNew->pNext = p->pTblList;
16307 p->pTblList = pNew;
16308 pNew->bIntkey = 1;
16309 }
16310
16311 recoverFinalize(p, pStmt);
16312
16313 pStmt = recoverPreparePrintf(p, p->dbOut, "PRAGMA index_xinfo(%Q)", zName);
16314 while( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){
16315 int iField = sqlite3_column_int(pStmt, 0);
16316 int iCol = sqlite3_column_int(pStmt, 1);
16317
16318 assert( iCol<pNew->nCol );
16319 pNew->aCol[iCol].iField = iField;
16320
16321 pNew->bIntkey = 0;
16322 iPk = -2;
16323 }
16324 recoverFinalize(p, pStmt);
16325
16326 if( p->errCode==SQLITE_OK ){
16327 if( iPk>=0 ){
16328 pNew->aCol[iPk].bIPK = 1;
16329 }else if( pNew->bIntkey ){
16330 pNew->iRowidBind = iBind++;
16331 }
16332 }
16333 }
16334 }
16335
16336 /*
16337 ** This function is called after recoverCacheSchema() has cached those parts
16338 ** of the input database schema that could be recovered in temporary table
16339 ** "recovery.schema". This function creates in the output database copies
16340 ** of all parts of that schema that must be created before the tables can
16341 ** be populated. Specifically, this means:
16342 **
16343 ** * all tables that are not VIRTUAL, and
16344 ** * UNIQUE indexes.
16345 **
16346 ** If the recovery handle uses SQL callbacks, then callbacks containing
16347 ** the associated "CREATE TABLE" and "CREATE INDEX" statements are made.
16348 **
16349 ** Additionally, records are added to the sqlite_schema table of the
16350 ** output database for any VIRTUAL tables. The CREATE VIRTUAL TABLE
16351 ** records are written directly to sqlite_schema, not actually executed.
16352 ** If the handle is in SQL callback mode, then callbacks are invoked
16353 ** with equivalent SQL statements.
16354 */
recoverWriteSchema1(sqlite3_recover * p)16355 static int recoverWriteSchema1(sqlite3_recover *p){
16356 sqlite3_stmt *pSelect = 0;
16357 sqlite3_stmt *pTblname = 0;
16358
16359 pSelect = recoverPrepare(p, p->dbOut,
16360 "WITH dbschema(rootpage, name, sql, tbl, isVirtual, isIndex) AS ("
16361 " SELECT rootpage, name, sql, "
16362 " type='table', "
16363 " sql LIKE 'create virtual%',"
16364 " (type='index' AND (sql LIKE '%unique%' OR ?1))"
16365 " FROM recovery.schema"
16366 ")"
16367 "SELECT rootpage, tbl, isVirtual, name, sql"
16368 " FROM dbschema "
16369 " WHERE tbl OR isIndex"
16370 " ORDER BY tbl DESC, name=='sqlite_sequence' DESC"
16371 );
16372
16373 pTblname = recoverPrepare(p, p->dbOut,
16374 "SELECT name FROM sqlite_schema "
16375 "WHERE type='table' ORDER BY rowid DESC LIMIT 1"
16376 );
16377
16378 if( pSelect ){
16379 sqlite3_bind_int(pSelect, 1, p->bSlowIndexes);
16380 while( sqlite3_step(pSelect)==SQLITE_ROW ){
16381 i64 iRoot = sqlite3_column_int64(pSelect, 0);
16382 int bTable = sqlite3_column_int(pSelect, 1);
16383 int bVirtual = sqlite3_column_int(pSelect, 2);
16384 const char *zName = (const char*)sqlite3_column_text(pSelect, 3);
16385 const char *zSql = (const char*)sqlite3_column_text(pSelect, 4);
16386 char *zFree = 0;
16387 int rc = SQLITE_OK;
16388
16389 if( bVirtual ){
16390 zSql = (const char*)(zFree = recoverMPrintf(p,
16391 "INSERT INTO sqlite_schema VALUES('table', %Q, %Q, 0, %Q)",
16392 zName, zName, zSql
16393 ));
16394 }
16395 rc = sqlite3_exec(p->dbOut, zSql, 0, 0, 0);
16396 if( rc==SQLITE_OK ){
16397 recoverSqlCallback(p, zSql);
16398 if( bTable && !bVirtual ){
16399 if( SQLITE_ROW==sqlite3_step(pTblname) ){
16400 const char *zTbl = (const char*)sqlite3_column_text(pTblname, 0);
16401 recoverAddTable(p, zTbl, iRoot);
16402 }
16403 recoverReset(p, pTblname);
16404 }
16405 }else if( rc!=SQLITE_ERROR ){
16406 recoverDbError(p, p->dbOut);
16407 }
16408 sqlite3_free(zFree);
16409 }
16410 }
16411 recoverFinalize(p, pSelect);
16412 recoverFinalize(p, pTblname);
16413
16414 return p->errCode;
16415 }
16416
16417 /*
16418 ** This function is called after the output database has been populated. It
16419 ** adds all recovered schema elements that were not created in the output
16420 ** database by recoverWriteSchema1() - everything except for tables and
16421 ** UNIQUE indexes. Specifically:
16422 **
16423 ** * views,
16424 ** * triggers,
16425 ** * non-UNIQUE indexes.
16426 **
16427 ** If the recover handle is in SQL callback mode, then equivalent callbacks
16428 ** are issued to create the schema elements.
16429 */
recoverWriteSchema2(sqlite3_recover * p)16430 static int recoverWriteSchema2(sqlite3_recover *p){
16431 sqlite3_stmt *pSelect = 0;
16432
16433 pSelect = recoverPrepare(p, p->dbOut,
16434 p->bSlowIndexes ?
16435 "SELECT rootpage, sql FROM recovery.schema "
16436 " WHERE type!='table' AND type!='index'"
16437 :
16438 "SELECT rootpage, sql FROM recovery.schema "
16439 " WHERE type!='table' AND (type!='index' OR sql NOT LIKE '%unique%')"
16440 );
16441
16442 if( pSelect ){
16443 while( sqlite3_step(pSelect)==SQLITE_ROW ){
16444 const char *zSql = (const char*)sqlite3_column_text(pSelect, 1);
16445 int rc = sqlite3_exec(p->dbOut, zSql, 0, 0, 0);
16446 if( rc==SQLITE_OK ){
16447 recoverSqlCallback(p, zSql);
16448 }else if( rc!=SQLITE_ERROR ){
16449 recoverDbError(p, p->dbOut);
16450 }
16451 }
16452 }
16453 recoverFinalize(p, pSelect);
16454
16455 return p->errCode;
16456 }
16457
16458 /*
16459 ** This function is a no-op if recover handle p already contains an error
16460 ** (if p->errCode!=SQLITE_OK). In this case it returns NULL.
16461 **
16462 ** Otherwise, if the recover handle is configured to create an output
16463 ** database (was created by sqlite3_recover_init()), then this function
16464 ** prepares and returns an SQL statement to INSERT a new record into table
16465 ** pTab, assuming the first nField fields of a record extracted from disk
16466 ** are valid.
16467 **
16468 ** For example, if table pTab is:
16469 **
16470 ** CREATE TABLE name(a, b GENERATED ALWAYS AS (a+1) STORED, c, d, e);
16471 **
16472 ** And nField is 4, then the SQL statement prepared and returned is:
16473 **
16474 ** INSERT INTO (a, c, d) VALUES (?1, ?2, ?3);
16475 **
16476 ** In this case even though 4 values were extracted from the input db,
16477 ** only 3 are written to the output, as the generated STORED column
16478 ** cannot be written.
16479 **
16480 ** If the recover handle is in SQL callback mode, then the SQL statement
16481 ** prepared is such that evaluating it returns a single row containing
16482 ** a single text value - itself an SQL statement similar to the above,
16483 ** except with SQL literals in place of the variables. For example:
16484 **
16485 ** SELECT 'INSERT INTO (a, c, d) VALUES ('
16486 ** || quote(?1) || ', '
16487 ** || quote(?2) || ', '
16488 ** || quote(?3) || ')';
16489 **
16490 ** In either case, it is the responsibility of the caller to eventually
16491 ** free the statement handle using sqlite3_finalize().
16492 */
recoverInsertStmt(sqlite3_recover * p,RecoverTable * pTab,int nField)16493 static sqlite3_stmt *recoverInsertStmt(
16494 sqlite3_recover *p,
16495 RecoverTable *pTab,
16496 int nField
16497 ){
16498 sqlite3_stmt *pRet = 0;
16499 const char *zSep = "";
16500 const char *zSqlSep = "";
16501 char *zSql = 0;
16502 char *zFinal = 0;
16503 char *zBind = 0;
16504 int ii;
16505 int bSql = p->xSql ? 1 : 0;
16506
16507 if( nField<=0 ) return 0;
16508
16509 assert( nField<=pTab->nCol );
16510
16511 zSql = recoverMPrintf(p, "INSERT OR IGNORE INTO %Q(", pTab->zTab);
16512
16513 if( pTab->iRowidBind ){
16514 assert( pTab->bIntkey );
16515 zSql = recoverMPrintf(p, "%z_rowid_", zSql);
16516 if( bSql ){
16517 zBind = recoverMPrintf(p, "%zquote(?%d)", zBind, pTab->iRowidBind);
16518 }else{
16519 zBind = recoverMPrintf(p, "%z?%d", zBind, pTab->iRowidBind);
16520 }
16521 zSqlSep = "||', '||";
16522 zSep = ", ";
16523 }
16524
16525 for(ii=0; ii<nField; ii++){
16526 int eHidden = pTab->aCol[ii].eHidden;
16527 if( eHidden!=RECOVER_EHIDDEN_VIRTUAL
16528 && eHidden!=RECOVER_EHIDDEN_STORED
16529 ){
16530 assert( pTab->aCol[ii].iField>=0 && pTab->aCol[ii].iBind>=1 );
16531 zSql = recoverMPrintf(p, "%z%s%Q", zSql, zSep, pTab->aCol[ii].zCol);
16532
16533 if( bSql ){
16534 zBind = recoverMPrintf(p,
16535 "%z%sescape_crnl(quote(?%d))", zBind, zSqlSep, pTab->aCol[ii].iBind
16536 );
16537 zSqlSep = "||', '||";
16538 }else{
16539 zBind = recoverMPrintf(p, "%z%s?%d", zBind, zSep, pTab->aCol[ii].iBind);
16540 }
16541 zSep = ", ";
16542 }
16543 }
16544
16545 if( bSql ){
16546 zFinal = recoverMPrintf(p, "SELECT %Q || ') VALUES (' || %s || ')'",
16547 zSql, zBind
16548 );
16549 }else{
16550 zFinal = recoverMPrintf(p, "%s) VALUES (%s)", zSql, zBind);
16551 }
16552
16553 pRet = recoverPrepare(p, p->dbOut, zFinal);
16554 sqlite3_free(zSql);
16555 sqlite3_free(zBind);
16556 sqlite3_free(zFinal);
16557
16558 return pRet;
16559 }
16560
16561
16562 /*
16563 ** Search the list of RecoverTable objects at p->pTblList for one that
16564 ** has root page iRoot in the input database. If such an object is found,
16565 ** return a pointer to it. Otherwise, return NULL.
16566 */
recoverFindTable(sqlite3_recover * p,u32 iRoot)16567 static RecoverTable *recoverFindTable(sqlite3_recover *p, u32 iRoot){
16568 RecoverTable *pRet = 0;
16569 for(pRet=p->pTblList; pRet && pRet->iRoot!=iRoot; pRet=pRet->pNext);
16570 return pRet;
16571 }
16572
16573 /*
16574 ** This function attempts to create a lost and found table within the
16575 ** output db. If successful, it returns a pointer to a buffer containing
16576 ** the name of the new table. It is the responsibility of the caller to
16577 ** eventually free this buffer using sqlite3_free().
16578 **
16579 ** If an error occurs, NULL is returned and an error code and error
16580 ** message left in the recover handle.
16581 */
recoverLostAndFoundCreate(sqlite3_recover * p,int nField)16582 static char *recoverLostAndFoundCreate(
16583 sqlite3_recover *p, /* Recover object */
16584 int nField /* Number of column fields in new table */
16585 ){
16586 char *zTbl = 0;
16587 sqlite3_stmt *pProbe = 0;
16588 int ii = 0;
16589
16590 pProbe = recoverPrepare(p, p->dbOut,
16591 "SELECT 1 FROM sqlite_schema WHERE name=?"
16592 );
16593 for(ii=-1; zTbl==0 && p->errCode==SQLITE_OK && ii<1000; ii++){
16594 int bFail = 0;
16595 if( ii<0 ){
16596 zTbl = recoverMPrintf(p, "%s", p->zLostAndFound);
16597 }else{
16598 zTbl = recoverMPrintf(p, "%s_%d", p->zLostAndFound, ii);
16599 }
16600
16601 if( p->errCode==SQLITE_OK ){
16602 sqlite3_bind_text(pProbe, 1, zTbl, -1, SQLITE_STATIC);
16603 if( SQLITE_ROW==sqlite3_step(pProbe) ){
16604 bFail = 1;
16605 }
16606 recoverReset(p, pProbe);
16607 }
16608
16609 if( bFail ){
16610 sqlite3_clear_bindings(pProbe);
16611 sqlite3_free(zTbl);
16612 zTbl = 0;
16613 }
16614 }
16615 recoverFinalize(p, pProbe);
16616
16617 if( zTbl ){
16618 const char *zSep = 0;
16619 char *zField = 0;
16620 char *zSql = 0;
16621
16622 zSep = "rootpgno INTEGER, pgno INTEGER, nfield INTEGER, id INTEGER, ";
16623 for(ii=0; p->errCode==SQLITE_OK && ii<nField; ii++){
16624 zField = recoverMPrintf(p, "%z%sc%d", zField, zSep, ii);
16625 zSep = ", ";
16626 }
16627
16628 zSql = recoverMPrintf(p, "CREATE TABLE %s(%s)", zTbl, zField);
16629 sqlite3_free(zField);
16630
16631 recoverExec(p, p->dbOut, zSql);
16632 recoverSqlCallback(p, zSql);
16633 sqlite3_free(zSql);
16634 }else if( p->errCode==SQLITE_OK ){
16635 recoverError(
16636 p, SQLITE_ERROR, "failed to create %s output table", p->zLostAndFound
16637 );
16638 }
16639
16640 return zTbl;
16641 }
16642
16643 /*
16644 ** Synthesize and prepare an INSERT statement to write to the lost_and_found
16645 ** table in the output database. The name of the table is zTab, and it has
16646 ** nField c* fields.
16647 */
recoverLostAndFoundInsert(sqlite3_recover * p,const char * zTab,int nField)16648 static sqlite3_stmt *recoverLostAndFoundInsert(
16649 sqlite3_recover *p,
16650 const char *zTab,
16651 int nField
16652 ){
16653 int nTotal = nField + 4;
16654 int ii;
16655 char *zBind = 0;
16656 sqlite3_stmt *pRet = 0;
16657
16658 if( p->xSql==0 ){
16659 for(ii=0; ii<nTotal; ii++){
16660 zBind = recoverMPrintf(p, "%z%s?", zBind, zBind?", ":"", ii);
16661 }
16662 pRet = recoverPreparePrintf(
16663 p, p->dbOut, "INSERT INTO %s VALUES(%s)", zTab, zBind
16664 );
16665 }else{
16666 const char *zSep = "";
16667 for(ii=0; ii<nTotal; ii++){
16668 zBind = recoverMPrintf(p, "%z%squote(?)", zBind, zSep);
16669 zSep = "|| ', ' ||";
16670 }
16671 pRet = recoverPreparePrintf(
16672 p, p->dbOut, "SELECT 'INSERT INTO %s VALUES(' || %s || ')'", zTab, zBind
16673 );
16674 }
16675
16676 sqlite3_free(zBind);
16677 return pRet;
16678 }
16679
16680 /*
16681 ** Input database page iPg contains data that will be written to the
16682 ** lost-and-found table of the output database. This function attempts
16683 ** to identify the root page of the tree that page iPg belonged to.
16684 ** If successful, it sets output variable (*piRoot) to the page number
16685 ** of the root page and returns SQLITE_OK. Otherwise, if an error occurs,
16686 ** an SQLite error code is returned and the final value of *piRoot
16687 ** undefined.
16688 */
recoverLostAndFoundFindRoot(sqlite3_recover * p,i64 iPg,i64 * piRoot)16689 static int recoverLostAndFoundFindRoot(
16690 sqlite3_recover *p,
16691 i64 iPg,
16692 i64 *piRoot
16693 ){
16694 RecoverStateLAF *pLaf = &p->laf;
16695
16696 if( pLaf->pFindRoot==0 ){
16697 pLaf->pFindRoot = recoverPrepare(p, p->dbOut,
16698 "WITH RECURSIVE p(pgno) AS ("
16699 " SELECT ?"
16700 " UNION"
16701 " SELECT parent FROM recovery.map AS m, p WHERE m.pgno=p.pgno"
16702 ") "
16703 "SELECT p.pgno FROM p, recovery.map m WHERE m.pgno=p.pgno "
16704 " AND m.parent IS NULL"
16705 );
16706 }
16707 if( p->errCode==SQLITE_OK ){
16708 sqlite3_bind_int64(pLaf->pFindRoot, 1, iPg);
16709 if( sqlite3_step(pLaf->pFindRoot)==SQLITE_ROW ){
16710 *piRoot = sqlite3_column_int64(pLaf->pFindRoot, 0);
16711 }else{
16712 *piRoot = iPg;
16713 }
16714 recoverReset(p, pLaf->pFindRoot);
16715 }
16716 return p->errCode;
16717 }
16718
16719 /*
16720 ** Recover data from page iPage of the input database and write it to
16721 ** the lost-and-found table in the output database.
16722 */
recoverLostAndFoundOnePage(sqlite3_recover * p,i64 iPage)16723 static void recoverLostAndFoundOnePage(sqlite3_recover *p, i64 iPage){
16724 RecoverStateLAF *pLaf = &p->laf;
16725 sqlite3_value **apVal = pLaf->apVal;
16726 sqlite3_stmt *pPageData = pLaf->pPageData;
16727 sqlite3_stmt *pInsert = pLaf->pInsert;
16728
16729 int nVal = -1;
16730 int iPrevCell = 0;
16731 i64 iRoot = 0;
16732 int bHaveRowid = 0;
16733 i64 iRowid = 0;
16734 int ii = 0;
16735
16736 if( recoverLostAndFoundFindRoot(p, iPage, &iRoot) ) return;
16737 sqlite3_bind_int64(pPageData, 1, iPage);
16738 while( p->errCode==SQLITE_OK && SQLITE_ROW==sqlite3_step(pPageData) ){
16739 int iCell = sqlite3_column_int64(pPageData, 0);
16740 int iField = sqlite3_column_int64(pPageData, 1);
16741
16742 if( iPrevCell!=iCell && nVal>=0 ){
16743 /* Insert the new row */
16744 sqlite3_bind_int64(pInsert, 1, iRoot); /* rootpgno */
16745 sqlite3_bind_int64(pInsert, 2, iPage); /* pgno */
16746 sqlite3_bind_int(pInsert, 3, nVal); /* nfield */
16747 if( bHaveRowid ){
16748 sqlite3_bind_int64(pInsert, 4, iRowid); /* id */
16749 }
16750 for(ii=0; ii<nVal; ii++){
16751 recoverBindValue(p, pInsert, 5+ii, apVal[ii]);
16752 }
16753 if( sqlite3_step(pInsert)==SQLITE_ROW ){
16754 recoverSqlCallback(p, (const char*)sqlite3_column_text(pInsert, 0));
16755 }
16756 recoverReset(p, pInsert);
16757
16758 /* Discard the accumulated row data */
16759 for(ii=0; ii<nVal; ii++){
16760 sqlite3_value_free(apVal[ii]);
16761 apVal[ii] = 0;
16762 }
16763 sqlite3_clear_bindings(pInsert);
16764 bHaveRowid = 0;
16765 nVal = -1;
16766 }
16767
16768 if( iCell<0 ) break;
16769
16770 if( iField<0 ){
16771 assert( nVal==-1 );
16772 iRowid = sqlite3_column_int64(pPageData, 2);
16773 bHaveRowid = 1;
16774 nVal = 0;
16775 }else if( iField<pLaf->nMaxField ){
16776 sqlite3_value *pVal = sqlite3_column_value(pPageData, 2);
16777 apVal[iField] = sqlite3_value_dup(pVal);
16778 assert( iField==nVal || (nVal==-1 && iField==0) );
16779 nVal = iField+1;
16780 if( apVal[iField]==0 ){
16781 recoverError(p, SQLITE_NOMEM, 0);
16782 }
16783 }
16784
16785 iPrevCell = iCell;
16786 }
16787 recoverReset(p, pPageData);
16788
16789 for(ii=0; ii<nVal; ii++){
16790 sqlite3_value_free(apVal[ii]);
16791 apVal[ii] = 0;
16792 }
16793 }
16794
16795 /*
16796 ** Perform one step (sqlite3_recover_step()) of work for the connection
16797 ** passed as the only argument, which is guaranteed to be in
16798 ** RECOVER_STATE_LOSTANDFOUND3 state - during which the lost-and-found
16799 ** table of the output database is populated with recovered data that can
16800 ** not be assigned to any recovered schema object.
16801 */
recoverLostAndFound3Step(sqlite3_recover * p)16802 static int recoverLostAndFound3Step(sqlite3_recover *p){
16803 RecoverStateLAF *pLaf = &p->laf;
16804 if( p->errCode==SQLITE_OK ){
16805 if( pLaf->pInsert==0 ){
16806 return SQLITE_DONE;
16807 }else{
16808 if( p->errCode==SQLITE_OK ){
16809 int res = sqlite3_step(pLaf->pAllPage);
16810 if( res==SQLITE_ROW ){
16811 i64 iPage = sqlite3_column_int64(pLaf->pAllPage, 0);
16812 if( recoverBitmapQuery(pLaf->pUsed, iPage)==0 ){
16813 recoverLostAndFoundOnePage(p, iPage);
16814 }
16815 }else{
16816 recoverReset(p, pLaf->pAllPage);
16817 return SQLITE_DONE;
16818 }
16819 }
16820 }
16821 }
16822 return SQLITE_OK;
16823 }
16824
16825 /*
16826 ** Initialize resources required in RECOVER_STATE_LOSTANDFOUND3
16827 ** state - during which the lost-and-found table of the output database
16828 ** is populated with recovered data that can not be assigned to any
16829 ** recovered schema object.
16830 */
recoverLostAndFound3Init(sqlite3_recover * p)16831 static void recoverLostAndFound3Init(sqlite3_recover *p){
16832 RecoverStateLAF *pLaf = &p->laf;
16833
16834 if( pLaf->nMaxField>0 ){
16835 char *zTab = 0; /* Name of lost_and_found table */
16836
16837 zTab = recoverLostAndFoundCreate(p, pLaf->nMaxField);
16838 pLaf->pInsert = recoverLostAndFoundInsert(p, zTab, pLaf->nMaxField);
16839 sqlite3_free(zTab);
16840
16841 pLaf->pAllPage = recoverPreparePrintf(p, p->dbOut,
16842 "WITH RECURSIVE seq(ii) AS ("
16843 " SELECT 1 UNION ALL SELECT ii+1 FROM seq WHERE ii<%lld"
16844 ")"
16845 "SELECT ii FROM seq" , p->laf.nPg
16846 );
16847 pLaf->pPageData = recoverPrepare(p, p->dbOut,
16848 "SELECT cell, field, value "
16849 "FROM sqlite_dbdata('getpage()') d WHERE d.pgno=? "
16850 "UNION ALL "
16851 "SELECT -1, -1, -1"
16852 );
16853
16854 pLaf->apVal = (sqlite3_value**)recoverMalloc(p,
16855 pLaf->nMaxField*sizeof(sqlite3_value*)
16856 );
16857 }
16858 }
16859
16860 /*
16861 ** Initialize resources required in RECOVER_STATE_WRITING state - during which
16862 ** tables recovered from the schema of the input database are populated with
16863 ** recovered data.
16864 */
recoverWriteDataInit(sqlite3_recover * p)16865 static int recoverWriteDataInit(sqlite3_recover *p){
16866 RecoverStateW1 *p1 = &p->w1;
16867 RecoverTable *pTbl = 0;
16868 int nByte = 0;
16869
16870 /* Figure out the maximum number of columns for any table in the schema */
16871 assert( p1->nMax==0 );
16872 for(pTbl=p->pTblList; pTbl; pTbl=pTbl->pNext){
16873 if( pTbl->nCol>p1->nMax ) p1->nMax = pTbl->nCol;
16874 }
16875
16876 /* Allocate an array of (sqlite3_value*) in which to accumulate the values
16877 ** that will be written to the output database in a single row. */
16878 nByte = sizeof(sqlite3_value*) * (p1->nMax+1);
16879 p1->apVal = (sqlite3_value**)recoverMalloc(p, nByte);
16880 if( p1->apVal==0 ) return p->errCode;
16881
16882 /* Prepare the SELECT to loop through schema tables (pTbls) and the SELECT
16883 ** to loop through cells that appear to belong to a single table (pSel). */
16884 p1->pTbls = recoverPrepare(p, p->dbOut,
16885 "SELECT rootpage FROM recovery.schema "
16886 " WHERE type='table' AND (sql NOT LIKE 'create virtual%')"
16887 " ORDER BY (tbl_name='sqlite_sequence') ASC"
16888 );
16889 p1->pSel = recoverPrepare(p, p->dbOut,
16890 "WITH RECURSIVE pages(page) AS ("
16891 " SELECT ?1"
16892 " UNION"
16893 " SELECT child FROM sqlite_dbptr('getpage()'), pages "
16894 " WHERE pgno=page"
16895 ") "
16896 "SELECT page, cell, field, value "
16897 "FROM sqlite_dbdata('getpage()') d, pages p WHERE p.page=d.pgno "
16898 "UNION ALL "
16899 "SELECT 0, 0, 0, 0"
16900 );
16901
16902 return p->errCode;
16903 }
16904
16905 /*
16906 ** Clean up resources allocated by recoverWriteDataInit() (stuff in
16907 ** sqlite3_recover.w1).
16908 */
recoverWriteDataCleanup(sqlite3_recover * p)16909 static void recoverWriteDataCleanup(sqlite3_recover *p){
16910 RecoverStateW1 *p1 = &p->w1;
16911 int ii;
16912 for(ii=0; ii<p1->nVal; ii++){
16913 sqlite3_value_free(p1->apVal[ii]);
16914 }
16915 sqlite3_free(p1->apVal);
16916 recoverFinalize(p, p1->pInsert);
16917 recoverFinalize(p, p1->pTbls);
16918 recoverFinalize(p, p1->pSel);
16919 memset(p1, 0, sizeof(*p1));
16920 }
16921
16922 /*
16923 ** Perform one step (sqlite3_recover_step()) of work for the connection
16924 ** passed as the only argument, which is guaranteed to be in
16925 ** RECOVER_STATE_WRITING state - during which tables recovered from the
16926 ** schema of the input database are populated with recovered data.
16927 */
recoverWriteDataStep(sqlite3_recover * p)16928 static int recoverWriteDataStep(sqlite3_recover *p){
16929 RecoverStateW1 *p1 = &p->w1;
16930 sqlite3_stmt *pSel = p1->pSel;
16931 sqlite3_value **apVal = p1->apVal;
16932
16933 if( p->errCode==SQLITE_OK && p1->pTab==0 ){
16934 if( sqlite3_step(p1->pTbls)==SQLITE_ROW ){
16935 i64 iRoot = sqlite3_column_int64(p1->pTbls, 0);
16936 p1->pTab = recoverFindTable(p, iRoot);
16937
16938 recoverFinalize(p, p1->pInsert);
16939 p1->pInsert = 0;
16940
16941 /* If this table is unknown, return early. The caller will invoke this
16942 ** function again and it will move on to the next table. */
16943 if( p1->pTab==0 ) return p->errCode;
16944
16945 /* If this is the sqlite_sequence table, delete any rows added by
16946 ** earlier INSERT statements on tables with AUTOINCREMENT primary
16947 ** keys before recovering its contents. The p1->pTbls SELECT statement
16948 ** is rigged to deliver "sqlite_sequence" last of all, so we don't
16949 ** worry about it being modified after it is recovered. */
16950 if( sqlite3_stricmp("sqlite_sequence", p1->pTab->zTab)==0 ){
16951 recoverExec(p, p->dbOut, "DELETE FROM sqlite_sequence");
16952 recoverSqlCallback(p, "DELETE FROM sqlite_sequence");
16953 }
16954
16955 /* Bind the root page of this table within the original database to
16956 ** SELECT statement p1->pSel. The SELECT statement will then iterate
16957 ** through cells that look like they belong to table pTab. */
16958 sqlite3_bind_int64(pSel, 1, iRoot);
16959
16960 p1->nVal = 0;
16961 p1->bHaveRowid = 0;
16962 p1->iPrevPage = -1;
16963 p1->iPrevCell = -1;
16964 }else{
16965 return SQLITE_DONE;
16966 }
16967 }
16968 assert( p->errCode!=SQLITE_OK || p1->pTab );
16969
16970 if( p->errCode==SQLITE_OK && sqlite3_step(pSel)==SQLITE_ROW ){
16971 RecoverTable *pTab = p1->pTab;
16972
16973 i64 iPage = sqlite3_column_int64(pSel, 0);
16974 int iCell = sqlite3_column_int(pSel, 1);
16975 int iField = sqlite3_column_int(pSel, 2);
16976 sqlite3_value *pVal = sqlite3_column_value(pSel, 3);
16977 int bNewCell = (p1->iPrevPage!=iPage || p1->iPrevCell!=iCell);
16978
16979 assert( bNewCell==0 || (iField==-1 || iField==0) );
16980 assert( bNewCell || iField==p1->nVal || p1->nVal==pTab->nCol );
16981
16982 if( bNewCell ){
16983 int ii = 0;
16984 if( p1->nVal>=0 ){
16985 if( p1->pInsert==0 || p1->nVal!=p1->nInsert ){
16986 recoverFinalize(p, p1->pInsert);
16987 p1->pInsert = recoverInsertStmt(p, pTab, p1->nVal);
16988 p1->nInsert = p1->nVal;
16989 }
16990 if( p1->nVal>0 ){
16991 sqlite3_stmt *pInsert = p1->pInsert;
16992 for(ii=0; ii<pTab->nCol; ii++){
16993 RecoverColumn *pCol = &pTab->aCol[ii];
16994 int iBind = pCol->iBind;
16995 if( iBind>0 ){
16996 if( pCol->bIPK ){
16997 sqlite3_bind_int64(pInsert, iBind, p1->iRowid);
16998 }else if( pCol->iField<p1->nVal ){
16999 recoverBindValue(p, pInsert, iBind, apVal[pCol->iField]);
17000 }
17001 }
17002 }
17003 if( p->bRecoverRowid && pTab->iRowidBind>0 && p1->bHaveRowid ){
17004 sqlite3_bind_int64(pInsert, pTab->iRowidBind, p1->iRowid);
17005 }
17006 if( SQLITE_ROW==sqlite3_step(pInsert) ){
17007 const char *z = (const char*)sqlite3_column_text(pInsert, 0);
17008 recoverSqlCallback(p, z);
17009 }
17010 recoverReset(p, pInsert);
17011 assert( p->errCode || pInsert );
17012 if( pInsert ) sqlite3_clear_bindings(pInsert);
17013 }
17014 }
17015
17016 for(ii=0; ii<p1->nVal; ii++){
17017 sqlite3_value_free(apVal[ii]);
17018 apVal[ii] = 0;
17019 }
17020 p1->nVal = -1;
17021 p1->bHaveRowid = 0;
17022 }
17023
17024 if( iPage!=0 ){
17025 if( iField<0 ){
17026 p1->iRowid = sqlite3_column_int64(pSel, 3);
17027 assert( p1->nVal==-1 );
17028 p1->nVal = 0;
17029 p1->bHaveRowid = 1;
17030 }else if( iField<pTab->nCol ){
17031 assert( apVal[iField]==0 );
17032 apVal[iField] = sqlite3_value_dup( pVal );
17033 if( apVal[iField]==0 ){
17034 recoverError(p, SQLITE_NOMEM, 0);
17035 }
17036 p1->nVal = iField+1;
17037 }
17038 p1->iPrevCell = iCell;
17039 p1->iPrevPage = iPage;
17040 }
17041 }else{
17042 recoverReset(p, pSel);
17043 p1->pTab = 0;
17044 }
17045
17046 return p->errCode;
17047 }
17048
17049 /*
17050 ** Initialize resources required by sqlite3_recover_step() in
17051 ** RECOVER_STATE_LOSTANDFOUND1 state - during which the set of pages not
17052 ** already allocated to a recovered schema element is determined.
17053 */
recoverLostAndFound1Init(sqlite3_recover * p)17054 static void recoverLostAndFound1Init(sqlite3_recover *p){
17055 RecoverStateLAF *pLaf = &p->laf;
17056 sqlite3_stmt *pStmt = 0;
17057
17058 assert( p->laf.pUsed==0 );
17059 pLaf->nPg = recoverPageCount(p);
17060 pLaf->pUsed = recoverBitmapAlloc(p, pLaf->nPg);
17061
17062 /* Prepare a statement to iterate through all pages that are part of any tree
17063 ** in the recoverable part of the input database schema to the bitmap. And,
17064 ** if !p->bFreelistCorrupt, add all pages that appear to be part of the
17065 ** freelist. */
17066 pStmt = recoverPrepare(
17067 p, p->dbOut,
17068 "WITH trunk(pgno) AS ("
17069 " SELECT read_i32(getpage(1), 8) AS x WHERE x>0"
17070 " UNION"
17071 " SELECT read_i32(getpage(trunk.pgno), 0) AS x FROM trunk WHERE x>0"
17072 "),"
17073 "trunkdata(pgno, data) AS ("
17074 " SELECT pgno, getpage(pgno) FROM trunk"
17075 "),"
17076 "freelist(data, n, freepgno) AS ("
17077 " SELECT data, min(16384, read_i32(data, 1)-1), pgno FROM trunkdata"
17078 " UNION ALL"
17079 " SELECT data, n-1, read_i32(data, 2+n) FROM freelist WHERE n>=0"
17080 "),"
17081 ""
17082 "roots(r) AS ("
17083 " SELECT 1 UNION ALL"
17084 " SELECT rootpage FROM recovery.schema WHERE rootpage>0"
17085 "),"
17086 "used(page) AS ("
17087 " SELECT r FROM roots"
17088 " UNION"
17089 " SELECT child FROM sqlite_dbptr('getpage()'), used "
17090 " WHERE pgno=page"
17091 ") "
17092 "SELECT page FROM used"
17093 " UNION ALL "
17094 "SELECT freepgno FROM freelist WHERE NOT ?"
17095 );
17096 if( pStmt ) sqlite3_bind_int(pStmt, 1, p->bFreelistCorrupt);
17097 pLaf->pUsedPages = pStmt;
17098 }
17099
17100 /*
17101 ** Perform one step (sqlite3_recover_step()) of work for the connection
17102 ** passed as the only argument, which is guaranteed to be in
17103 ** RECOVER_STATE_LOSTANDFOUND1 state - during which the set of pages not
17104 ** already allocated to a recovered schema element is determined.
17105 */
recoverLostAndFound1Step(sqlite3_recover * p)17106 static int recoverLostAndFound1Step(sqlite3_recover *p){
17107 RecoverStateLAF *pLaf = &p->laf;
17108 int rc = p->errCode;
17109 if( rc==SQLITE_OK ){
17110 rc = sqlite3_step(pLaf->pUsedPages);
17111 if( rc==SQLITE_ROW ){
17112 i64 iPg = sqlite3_column_int64(pLaf->pUsedPages, 0);
17113 recoverBitmapSet(pLaf->pUsed, iPg);
17114 rc = SQLITE_OK;
17115 }else{
17116 recoverFinalize(p, pLaf->pUsedPages);
17117 pLaf->pUsedPages = 0;
17118 }
17119 }
17120 return rc;
17121 }
17122
17123 /*
17124 ** Initialize resources required by RECOVER_STATE_LOSTANDFOUND2
17125 ** state - during which the pages identified in RECOVER_STATE_LOSTANDFOUND1
17126 ** are sorted into sets that likely belonged to the same database tree.
17127 */
recoverLostAndFound2Init(sqlite3_recover * p)17128 static void recoverLostAndFound2Init(sqlite3_recover *p){
17129 RecoverStateLAF *pLaf = &p->laf;
17130
17131 assert( p->laf.pAllAndParent==0 );
17132 assert( p->laf.pMapInsert==0 );
17133 assert( p->laf.pMaxField==0 );
17134 assert( p->laf.nMaxField==0 );
17135
17136 pLaf->pMapInsert = recoverPrepare(p, p->dbOut,
17137 "INSERT OR IGNORE INTO recovery.map(pgno, parent) VALUES(?, ?)"
17138 );
17139 pLaf->pAllAndParent = recoverPreparePrintf(p, p->dbOut,
17140 "WITH RECURSIVE seq(ii) AS ("
17141 " SELECT 1 UNION ALL SELECT ii+1 FROM seq WHERE ii<%lld"
17142 ")"
17143 "SELECT pgno, child FROM sqlite_dbptr('getpage()') "
17144 " UNION ALL "
17145 "SELECT NULL, ii FROM seq", p->laf.nPg
17146 );
17147 pLaf->pMaxField = recoverPreparePrintf(p, p->dbOut,
17148 "SELECT max(field)+1 FROM sqlite_dbdata('getpage') WHERE pgno = ?"
17149 );
17150 }
17151
17152 /*
17153 ** Perform one step (sqlite3_recover_step()) of work for the connection
17154 ** passed as the only argument, which is guaranteed to be in
17155 ** RECOVER_STATE_LOSTANDFOUND2 state - during which the pages identified
17156 ** in RECOVER_STATE_LOSTANDFOUND1 are sorted into sets that likely belonged
17157 ** to the same database tree.
17158 */
recoverLostAndFound2Step(sqlite3_recover * p)17159 static int recoverLostAndFound2Step(sqlite3_recover *p){
17160 RecoverStateLAF *pLaf = &p->laf;
17161 if( p->errCode==SQLITE_OK ){
17162 int res = sqlite3_step(pLaf->pAllAndParent);
17163 if( res==SQLITE_ROW ){
17164 i64 iChild = sqlite3_column_int(pLaf->pAllAndParent, 1);
17165 if( recoverBitmapQuery(pLaf->pUsed, iChild)==0 ){
17166 sqlite3_bind_int64(pLaf->pMapInsert, 1, iChild);
17167 sqlite3_bind_value(pLaf->pMapInsert, 2,
17168 sqlite3_column_value(pLaf->pAllAndParent, 0)
17169 );
17170 sqlite3_step(pLaf->pMapInsert);
17171 recoverReset(p, pLaf->pMapInsert);
17172 sqlite3_bind_int64(pLaf->pMaxField, 1, iChild);
17173 if( SQLITE_ROW==sqlite3_step(pLaf->pMaxField) ){
17174 int nMax = sqlite3_column_int(pLaf->pMaxField, 0);
17175 if( nMax>pLaf->nMaxField ) pLaf->nMaxField = nMax;
17176 }
17177 recoverReset(p, pLaf->pMaxField);
17178 }
17179 }else{
17180 recoverFinalize(p, pLaf->pAllAndParent);
17181 pLaf->pAllAndParent =0;
17182 return SQLITE_DONE;
17183 }
17184 }
17185 return p->errCode;
17186 }
17187
17188 /*
17189 ** Free all resources allocated as part of sqlite3_recover_step() calls
17190 ** in one of the RECOVER_STATE_LOSTANDFOUND[123] states.
17191 */
recoverLostAndFoundCleanup(sqlite3_recover * p)17192 static void recoverLostAndFoundCleanup(sqlite3_recover *p){
17193 recoverBitmapFree(p->laf.pUsed);
17194 p->laf.pUsed = 0;
17195 sqlite3_finalize(p->laf.pUsedPages);
17196 sqlite3_finalize(p->laf.pAllAndParent);
17197 sqlite3_finalize(p->laf.pMapInsert);
17198 sqlite3_finalize(p->laf.pMaxField);
17199 sqlite3_finalize(p->laf.pFindRoot);
17200 sqlite3_finalize(p->laf.pInsert);
17201 sqlite3_finalize(p->laf.pAllPage);
17202 sqlite3_finalize(p->laf.pPageData);
17203 p->laf.pUsedPages = 0;
17204 p->laf.pAllAndParent = 0;
17205 p->laf.pMapInsert = 0;
17206 p->laf.pMaxField = 0;
17207 p->laf.pFindRoot = 0;
17208 p->laf.pInsert = 0;
17209 p->laf.pAllPage = 0;
17210 p->laf.pPageData = 0;
17211 sqlite3_free(p->laf.apVal);
17212 p->laf.apVal = 0;
17213 }
17214
17215 /*
17216 ** Free all resources allocated as part of sqlite3_recover_step() calls.
17217 */
recoverFinalCleanup(sqlite3_recover * p)17218 static void recoverFinalCleanup(sqlite3_recover *p){
17219 RecoverTable *pTab = 0;
17220 RecoverTable *pNext = 0;
17221
17222 recoverWriteDataCleanup(p);
17223 recoverLostAndFoundCleanup(p);
17224
17225 for(pTab=p->pTblList; pTab; pTab=pNext){
17226 pNext = pTab->pNext;
17227 sqlite3_free(pTab);
17228 }
17229 p->pTblList = 0;
17230 sqlite3_finalize(p->pGetPage);
17231 p->pGetPage = 0;
17232 sqlite3_file_control(p->dbIn, p->zDb, SQLITE_FCNTL_RESET_CACHE, 0);
17233
17234 {
17235 #ifndef NDEBUG
17236 int res =
17237 #endif
17238 sqlite3_close(p->dbOut);
17239 assert( res==SQLITE_OK );
17240 }
17241 p->dbOut = 0;
17242 }
17243
17244 /*
17245 ** Decode and return an unsigned 16-bit big-endian integer value from
17246 ** buffer a[].
17247 */
recoverGetU16(const u8 * a)17248 static u32 recoverGetU16(const u8 *a){
17249 return (((u32)a[0])<<8) + ((u32)a[1]);
17250 }
17251
17252 /*
17253 ** Decode and return an unsigned 32-bit big-endian integer value from
17254 ** buffer a[].
17255 */
recoverGetU32(const u8 * a)17256 static u32 recoverGetU32(const u8 *a){
17257 return (((u32)a[0])<<24) + (((u32)a[1])<<16) + (((u32)a[2])<<8) + ((u32)a[3]);
17258 }
17259
17260 /*
17261 ** Decode an SQLite varint from buffer a[]. Write the decoded value to (*pVal)
17262 ** and return the number of bytes consumed.
17263 */
recoverGetVarint(const u8 * a,i64 * pVal)17264 static int recoverGetVarint(const u8 *a, i64 *pVal){
17265 sqlite3_uint64 u = 0;
17266 int i;
17267 for(i=0; i<8; i++){
17268 u = (u<<7) + (a[i]&0x7f);
17269 if( (a[i]&0x80)==0 ){ *pVal = (sqlite3_int64)u; return i+1; }
17270 }
17271 u = (u<<8) + (a[i]&0xff);
17272 *pVal = (sqlite3_int64)u;
17273 return 9;
17274 }
17275
17276 /*
17277 ** The second argument points to a buffer n bytes in size. If this buffer
17278 ** or a prefix thereof appears to contain a well-formed SQLite b-tree page,
17279 ** return the page-size in bytes. Otherwise, if the buffer does not
17280 ** appear to contain a well-formed b-tree page, return 0.
17281 */
recoverIsValidPage(u8 * aTmp,const u8 * a,int n)17282 static int recoverIsValidPage(u8 *aTmp, const u8 *a, int n){
17283 u8 *aUsed = aTmp;
17284 int nFrag = 0;
17285 int nActual = 0;
17286 int iFree = 0;
17287 int nCell = 0; /* Number of cells on page */
17288 int iCellOff = 0; /* Offset of cell array in page */
17289 int iContent = 0;
17290 int eType = 0;
17291 int ii = 0;
17292
17293 eType = (int)a[0];
17294 if( eType!=0x02 && eType!=0x05 && eType!=0x0A && eType!=0x0D ) return 0;
17295
17296 iFree = (int)recoverGetU16(&a[1]);
17297 nCell = (int)recoverGetU16(&a[3]);
17298 iContent = (int)recoverGetU16(&a[5]);
17299 if( iContent==0 ) iContent = 65536;
17300 nFrag = (int)a[7];
17301
17302 if( iContent>n ) return 0;
17303
17304 memset(aUsed, 0, n);
17305 memset(aUsed, 0xFF, iContent);
17306
17307 /* Follow the free-list. This is the same format for all b-tree pages. */
17308 if( iFree && iFree<=iContent ) return 0;
17309 while( iFree ){
17310 int iNext = 0;
17311 int nByte = 0;
17312 if( iFree>(n-4) ) return 0;
17313 iNext = recoverGetU16(&a[iFree]);
17314 nByte = recoverGetU16(&a[iFree+2]);
17315 if( iFree+nByte>n || nByte<4 ) return 0;
17316 if( iNext && iNext<iFree+nByte ) return 0;
17317 memset(&aUsed[iFree], 0xFF, nByte);
17318 iFree = iNext;
17319 }
17320
17321 /* Run through the cells */
17322 if( eType==0x02 || eType==0x05 ){
17323 iCellOff = 12;
17324 }else{
17325 iCellOff = 8;
17326 }
17327 if( (iCellOff + 2*nCell)>iContent ) return 0;
17328 for(ii=0; ii<nCell; ii++){
17329 int iByte;
17330 i64 nPayload = 0;
17331 int nByte = 0;
17332 int iOff = recoverGetU16(&a[iCellOff + 2*ii]);
17333 if( iOff<iContent || iOff>n ){
17334 return 0;
17335 }
17336 if( eType==0x05 || eType==0x02 ) nByte += 4;
17337 nByte += recoverGetVarint(&a[iOff+nByte], &nPayload);
17338 if( eType==0x0D ){
17339 i64 dummy = 0;
17340 nByte += recoverGetVarint(&a[iOff+nByte], &dummy);
17341 }
17342 if( eType!=0x05 ){
17343 int X = (eType==0x0D) ? n-35 : (((n-12)*64/255)-23);
17344 int M = ((n-12)*32/255)-23;
17345 int K = M+((nPayload-M)%(n-4));
17346
17347 if( nPayload<X ){
17348 nByte += nPayload;
17349 }else if( K<=X ){
17350 nByte += K+4;
17351 }else{
17352 nByte += M+4;
17353 }
17354 }
17355
17356 if( iOff+nByte>n ){
17357 return 0;
17358 }
17359 for(iByte=iOff; iByte<(iOff+nByte); iByte++){
17360 if( aUsed[iByte]!=0 ){
17361 return 0;
17362 }
17363 aUsed[iByte] = 0xFF;
17364 }
17365 }
17366
17367 nActual = 0;
17368 for(ii=0; ii<n; ii++){
17369 if( aUsed[ii]==0 ) nActual++;
17370 }
17371 return (nActual==nFrag);
17372 }
17373
17374
17375 static int recoverVfsClose(sqlite3_file*);
17376 static int recoverVfsRead(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst);
17377 static int recoverVfsWrite(sqlite3_file*, const void*, int, sqlite3_int64);
17378 static int recoverVfsTruncate(sqlite3_file*, sqlite3_int64 size);
17379 static int recoverVfsSync(sqlite3_file*, int flags);
17380 static int recoverVfsFileSize(sqlite3_file*, sqlite3_int64 *pSize);
17381 static int recoverVfsLock(sqlite3_file*, int);
17382 static int recoverVfsUnlock(sqlite3_file*, int);
17383 static int recoverVfsCheckReservedLock(sqlite3_file*, int *pResOut);
17384 static int recoverVfsFileControl(sqlite3_file*, int op, void *pArg);
17385 static int recoverVfsSectorSize(sqlite3_file*);
17386 static int recoverVfsDeviceCharacteristics(sqlite3_file*);
17387 static int recoverVfsShmMap(sqlite3_file*, int, int, int, void volatile**);
17388 static int recoverVfsShmLock(sqlite3_file*, int offset, int n, int flags);
17389 static void recoverVfsShmBarrier(sqlite3_file*);
17390 static int recoverVfsShmUnmap(sqlite3_file*, int deleteFlag);
17391 static int recoverVfsFetch(sqlite3_file*, sqlite3_int64, int, void**);
17392 static int recoverVfsUnfetch(sqlite3_file *pFd, sqlite3_int64 iOff, void *p);
17393
17394 static sqlite3_io_methods recover_methods = {
17395 2, /* iVersion */
17396 recoverVfsClose,
17397 recoverVfsRead,
17398 recoverVfsWrite,
17399 recoverVfsTruncate,
17400 recoverVfsSync,
17401 recoverVfsFileSize,
17402 recoverVfsLock,
17403 recoverVfsUnlock,
17404 recoverVfsCheckReservedLock,
17405 recoverVfsFileControl,
17406 recoverVfsSectorSize,
17407 recoverVfsDeviceCharacteristics,
17408 recoverVfsShmMap,
17409 recoverVfsShmLock,
17410 recoverVfsShmBarrier,
17411 recoverVfsShmUnmap,
17412 recoverVfsFetch,
17413 recoverVfsUnfetch
17414 };
17415
recoverVfsClose(sqlite3_file * pFd)17416 static int recoverVfsClose(sqlite3_file *pFd){
17417 assert( pFd->pMethods!=&recover_methods );
17418 return pFd->pMethods->xClose(pFd);
17419 }
17420
17421 /*
17422 ** Write value v to buffer a[] as a 16-bit big-endian unsigned integer.
17423 */
recoverPutU16(u8 * a,u32 v)17424 static void recoverPutU16(u8 *a, u32 v){
17425 a[0] = (v>>8) & 0x00FF;
17426 a[1] = (v>>0) & 0x00FF;
17427 }
17428
17429 /*
17430 ** Write value v to buffer a[] as a 32-bit big-endian unsigned integer.
17431 */
recoverPutU32(u8 * a,u32 v)17432 static void recoverPutU32(u8 *a, u32 v){
17433 a[0] = (v>>24) & 0x00FF;
17434 a[1] = (v>>16) & 0x00FF;
17435 a[2] = (v>>8) & 0x00FF;
17436 a[3] = (v>>0) & 0x00FF;
17437 }
17438
17439 /*
17440 ** Detect the page-size of the database opened by file-handle pFd by
17441 ** searching the first part of the file for a well-formed SQLite b-tree
17442 ** page. If parameter nReserve is non-zero, then as well as searching for
17443 ** a b-tree page with zero reserved bytes, this function searches for one
17444 ** with nReserve reserved bytes at the end of it.
17445 **
17446 ** If successful, set variable p->detected_pgsz to the detected page-size
17447 ** in bytes and return SQLITE_OK. Or, if no error occurs but no valid page
17448 ** can be found, return SQLITE_OK but leave p->detected_pgsz set to 0. Or,
17449 ** if an error occurs (e.g. an IO or OOM error), then an SQLite error code
17450 ** is returned. The final value of p->detected_pgsz is undefined in this
17451 ** case.
17452 */
recoverVfsDetectPagesize(sqlite3_recover * p,sqlite3_file * pFd,u32 nReserve,i64 nSz)17453 static int recoverVfsDetectPagesize(
17454 sqlite3_recover *p, /* Recover handle */
17455 sqlite3_file *pFd, /* File-handle open on input database */
17456 u32 nReserve, /* Possible nReserve value */
17457 i64 nSz /* Size of database file in bytes */
17458 ){
17459 int rc = SQLITE_OK;
17460 const int nMin = 512;
17461 const int nMax = 65536;
17462 const int nMaxBlk = 4;
17463 u32 pgsz = 0;
17464 int iBlk = 0;
17465 u8 *aPg = 0;
17466 u8 *aTmp = 0;
17467 int nBlk = 0;
17468
17469 aPg = (u8*)sqlite3_malloc(2*nMax);
17470 if( aPg==0 ) return SQLITE_NOMEM;
17471 aTmp = &aPg[nMax];
17472
17473 nBlk = (nSz+nMax-1)/nMax;
17474 if( nBlk>nMaxBlk ) nBlk = nMaxBlk;
17475
17476 do {
17477 for(iBlk=0; rc==SQLITE_OK && iBlk<nBlk; iBlk++){
17478 int nByte = (nSz>=((iBlk+1)*nMax)) ? nMax : (nSz % nMax);
17479 memset(aPg, 0, nMax);
17480 rc = pFd->pMethods->xRead(pFd, aPg, nByte, iBlk*nMax);
17481 if( rc==SQLITE_OK ){
17482 int pgsz2;
17483 for(pgsz2=(pgsz ? pgsz*2 : nMin); pgsz2<=nMax; pgsz2=pgsz2*2){
17484 int iOff;
17485 for(iOff=0; iOff<nMax; iOff+=pgsz2){
17486 if( recoverIsValidPage(aTmp, &aPg[iOff], pgsz2-nReserve) ){
17487 pgsz = pgsz2;
17488 break;
17489 }
17490 }
17491 }
17492 }
17493 }
17494 if( pgsz>(u32)p->detected_pgsz ){
17495 p->detected_pgsz = pgsz;
17496 p->nReserve = nReserve;
17497 }
17498 if( nReserve==0 ) break;
17499 nReserve = 0;
17500 }while( 1 );
17501
17502 p->detected_pgsz = pgsz;
17503 sqlite3_free(aPg);
17504 return rc;
17505 }
17506
17507 /*
17508 ** The xRead() method of the wrapper VFS. This is used to intercept calls
17509 ** to read page 1 of the input database.
17510 */
recoverVfsRead(sqlite3_file * pFd,void * aBuf,int nByte,i64 iOff)17511 static int recoverVfsRead(sqlite3_file *pFd, void *aBuf, int nByte, i64 iOff){
17512 int rc = SQLITE_OK;
17513 if( pFd->pMethods==&recover_methods ){
17514 pFd->pMethods = recover_g.pMethods;
17515 rc = pFd->pMethods->xRead(pFd, aBuf, nByte, iOff);
17516 if( nByte==16 ){
17517 sqlite3_randomness(16, aBuf);
17518 }else
17519 if( rc==SQLITE_OK && iOff==0 && nByte>=108 ){
17520 /* Ensure that the database has a valid header file. The only fields
17521 ** that really matter to recovery are:
17522 **
17523 ** + Database page size (16-bits at offset 16)
17524 ** + Size of db in pages (32-bits at offset 28)
17525 ** + Database encoding (32-bits at offset 56)
17526 **
17527 ** Also preserved are:
17528 **
17529 ** + first freelist page (32-bits at offset 32)
17530 ** + size of freelist (32-bits at offset 36)
17531 ** + the wal-mode flags (16-bits at offset 18)
17532 **
17533 ** We also try to preserve the auto-vacuum, incr-value, user-version
17534 ** and application-id fields - all 32 bit quantities at offsets
17535 ** 52, 60, 64 and 68. All other fields are set to known good values.
17536 **
17537 ** Byte offset 105 should also contain the page-size as a 16-bit
17538 ** integer.
17539 */
17540 const int aPreserve[] = {32, 36, 52, 60, 64, 68};
17541 u8 aHdr[108] = {
17542 0x53, 0x51, 0x4c, 0x69, 0x74, 0x65, 0x20, 0x66,
17543 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x33, 0x00,
17544 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x40, 0x20, 0x20,
17545 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
17546 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
17547 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
17548 0x00, 0x00, 0x10, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
17549 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
17550 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
17551 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
17552 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
17553 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
17554 0x00, 0x2e, 0x5b, 0x30,
17555
17556 0x0D, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00
17557 };
17558 u8 *a = (u8*)aBuf;
17559
17560 u32 pgsz = recoverGetU16(&a[16]);
17561 u32 nReserve = a[20];
17562 u32 enc = recoverGetU32(&a[56]);
17563 u32 dbsz = 0;
17564 i64 dbFileSize = 0;
17565 int ii;
17566 sqlite3_recover *p = recover_g.p;
17567
17568 if( pgsz==0x01 ) pgsz = 65536;
17569 rc = pFd->pMethods->xFileSize(pFd, &dbFileSize);
17570
17571 if( rc==SQLITE_OK && p->detected_pgsz==0 ){
17572 rc = recoverVfsDetectPagesize(p, pFd, nReserve, dbFileSize);
17573 }
17574 if( p->detected_pgsz ){
17575 pgsz = p->detected_pgsz;
17576 nReserve = p->nReserve;
17577 }
17578
17579 if( pgsz ){
17580 dbsz = dbFileSize / pgsz;
17581 }
17582 if( enc!=SQLITE_UTF8 && enc!=SQLITE_UTF16BE && enc!=SQLITE_UTF16LE ){
17583 enc = SQLITE_UTF8;
17584 }
17585
17586 sqlite3_free(p->pPage1Cache);
17587 p->pPage1Cache = 0;
17588 p->pPage1Disk = 0;
17589
17590 p->pgsz = nByte;
17591 p->pPage1Cache = (u8*)recoverMalloc(p, nByte*2);
17592 if( p->pPage1Cache ){
17593 p->pPage1Disk = &p->pPage1Cache[nByte];
17594 memcpy(p->pPage1Disk, aBuf, nByte);
17595 aHdr[18] = a[18];
17596 aHdr[19] = a[19];
17597 recoverPutU32(&aHdr[28], dbsz);
17598 recoverPutU32(&aHdr[56], enc);
17599 recoverPutU16(&aHdr[105], pgsz-nReserve);
17600 if( pgsz==65536 ) pgsz = 1;
17601 recoverPutU16(&aHdr[16], pgsz);
17602 aHdr[20] = nReserve;
17603 for(ii=0; ii<(int)(sizeof(aPreserve)/sizeof(aPreserve[0])); ii++){
17604 memcpy(&aHdr[aPreserve[ii]], &a[aPreserve[ii]], 4);
17605 }
17606 memcpy(aBuf, aHdr, sizeof(aHdr));
17607 memset(&((u8*)aBuf)[sizeof(aHdr)], 0, nByte-sizeof(aHdr));
17608
17609 memcpy(p->pPage1Cache, aBuf, nByte);
17610 }else{
17611 rc = p->errCode;
17612 }
17613
17614 }
17615 pFd->pMethods = &recover_methods;
17616 }else{
17617 rc = pFd->pMethods->xRead(pFd, aBuf, nByte, iOff);
17618 }
17619 return rc;
17620 }
17621
17622 /*
17623 ** Used to make sqlite3_io_methods wrapper methods less verbose.
17624 */
17625 #define RECOVER_VFS_WRAPPER(code) \
17626 int rc = SQLITE_OK; \
17627 if( pFd->pMethods==&recover_methods ){ \
17628 pFd->pMethods = recover_g.pMethods; \
17629 rc = code; \
17630 pFd->pMethods = &recover_methods; \
17631 }else{ \
17632 rc = code; \
17633 } \
17634 return rc;
17635
17636 /*
17637 ** Methods of the wrapper VFS. All methods except for xRead() and xClose()
17638 ** simply uninstall the sqlite3_io_methods wrapper, invoke the equivalent
17639 ** method on the lower level VFS, then reinstall the wrapper before returning.
17640 ** Those that return an integer value use the RECOVER_VFS_WRAPPER macro.
17641 */
recoverVfsWrite(sqlite3_file * pFd,const void * aBuf,int nByte,i64 iOff)17642 static int recoverVfsWrite(
17643 sqlite3_file *pFd, const void *aBuf, int nByte, i64 iOff
17644 ){
17645 RECOVER_VFS_WRAPPER (
17646 pFd->pMethods->xWrite(pFd, aBuf, nByte, iOff)
17647 );
17648 }
recoverVfsTruncate(sqlite3_file * pFd,sqlite3_int64 size)17649 static int recoverVfsTruncate(sqlite3_file *pFd, sqlite3_int64 size){
17650 RECOVER_VFS_WRAPPER (
17651 pFd->pMethods->xTruncate(pFd, size)
17652 );
17653 }
recoverVfsSync(sqlite3_file * pFd,int flags)17654 static int recoverVfsSync(sqlite3_file *pFd, int flags){
17655 RECOVER_VFS_WRAPPER (
17656 pFd->pMethods->xSync(pFd, flags)
17657 );
17658 }
recoverVfsFileSize(sqlite3_file * pFd,sqlite3_int64 * pSize)17659 static int recoverVfsFileSize(sqlite3_file *pFd, sqlite3_int64 *pSize){
17660 RECOVER_VFS_WRAPPER (
17661 pFd->pMethods->xFileSize(pFd, pSize)
17662 );
17663 }
recoverVfsLock(sqlite3_file * pFd,int eLock)17664 static int recoverVfsLock(sqlite3_file *pFd, int eLock){
17665 RECOVER_VFS_WRAPPER (
17666 pFd->pMethods->xLock(pFd, eLock)
17667 );
17668 }
recoverVfsUnlock(sqlite3_file * pFd,int eLock)17669 static int recoverVfsUnlock(sqlite3_file *pFd, int eLock){
17670 RECOVER_VFS_WRAPPER (
17671 pFd->pMethods->xUnlock(pFd, eLock)
17672 );
17673 }
recoverVfsCheckReservedLock(sqlite3_file * pFd,int * pResOut)17674 static int recoverVfsCheckReservedLock(sqlite3_file *pFd, int *pResOut){
17675 RECOVER_VFS_WRAPPER (
17676 pFd->pMethods->xCheckReservedLock(pFd, pResOut)
17677 );
17678 }
recoverVfsFileControl(sqlite3_file * pFd,int op,void * pArg)17679 static int recoverVfsFileControl(sqlite3_file *pFd, int op, void *pArg){
17680 RECOVER_VFS_WRAPPER (
17681 (pFd->pMethods ? pFd->pMethods->xFileControl(pFd, op, pArg) : SQLITE_NOTFOUND)
17682 );
17683 }
recoverVfsSectorSize(sqlite3_file * pFd)17684 static int recoverVfsSectorSize(sqlite3_file *pFd){
17685 RECOVER_VFS_WRAPPER (
17686 pFd->pMethods->xSectorSize(pFd)
17687 );
17688 }
recoverVfsDeviceCharacteristics(sqlite3_file * pFd)17689 static int recoverVfsDeviceCharacteristics(sqlite3_file *pFd){
17690 RECOVER_VFS_WRAPPER (
17691 pFd->pMethods->xDeviceCharacteristics(pFd)
17692 );
17693 }
recoverVfsShmMap(sqlite3_file * pFd,int iPg,int pgsz,int bExtend,void volatile ** pp)17694 static int recoverVfsShmMap(
17695 sqlite3_file *pFd, int iPg, int pgsz, int bExtend, void volatile **pp
17696 ){
17697 RECOVER_VFS_WRAPPER (
17698 pFd->pMethods->xShmMap(pFd, iPg, pgsz, bExtend, pp)
17699 );
17700 }
recoverVfsShmLock(sqlite3_file * pFd,int offset,int n,int flags)17701 static int recoverVfsShmLock(sqlite3_file *pFd, int offset, int n, int flags){
17702 RECOVER_VFS_WRAPPER (
17703 pFd->pMethods->xShmLock(pFd, offset, n, flags)
17704 );
17705 }
recoverVfsShmBarrier(sqlite3_file * pFd)17706 static void recoverVfsShmBarrier(sqlite3_file *pFd){
17707 if( pFd->pMethods==&recover_methods ){
17708 pFd->pMethods = recover_g.pMethods;
17709 pFd->pMethods->xShmBarrier(pFd);
17710 pFd->pMethods = &recover_methods;
17711 }else{
17712 pFd->pMethods->xShmBarrier(pFd);
17713 }
17714 }
recoverVfsShmUnmap(sqlite3_file * pFd,int deleteFlag)17715 static int recoverVfsShmUnmap(sqlite3_file *pFd, int deleteFlag){
17716 RECOVER_VFS_WRAPPER (
17717 pFd->pMethods->xShmUnmap(pFd, deleteFlag)
17718 );
17719 }
17720
recoverVfsFetch(sqlite3_file * pFd,sqlite3_int64 iOff,int iAmt,void ** pp)17721 static int recoverVfsFetch(
17722 sqlite3_file *pFd,
17723 sqlite3_int64 iOff,
17724 int iAmt,
17725 void **pp
17726 ){
17727 (void)pFd;
17728 (void)iOff;
17729 (void)iAmt;
17730 *pp = 0;
17731 return SQLITE_OK;
17732 }
recoverVfsUnfetch(sqlite3_file * pFd,sqlite3_int64 iOff,void * p)17733 static int recoverVfsUnfetch(sqlite3_file *pFd, sqlite3_int64 iOff, void *p){
17734 (void)pFd;
17735 (void)iOff;
17736 (void)p;
17737 return SQLITE_OK;
17738 }
17739
17740 /*
17741 ** Install the VFS wrapper around the file-descriptor open on the input
17742 ** database for recover handle p. Mutex RECOVER_MUTEX_ID must be held
17743 ** when this function is called.
17744 */
recoverInstallWrapper(sqlite3_recover * p)17745 static void recoverInstallWrapper(sqlite3_recover *p){
17746 sqlite3_file *pFd = 0;
17747 assert( recover_g.pMethods==0 );
17748 recoverAssertMutexHeld();
17749 sqlite3_file_control(p->dbIn, p->zDb, SQLITE_FCNTL_FILE_POINTER, (void*)&pFd);
17750 assert( pFd==0 || pFd->pMethods!=&recover_methods );
17751 if( pFd && pFd->pMethods ){
17752 int iVersion = 1 + (pFd->pMethods->iVersion>1 && pFd->pMethods->xShmMap!=0);
17753 recover_g.pMethods = pFd->pMethods;
17754 recover_g.p = p;
17755 recover_methods.iVersion = iVersion;
17756 pFd->pMethods = &recover_methods;
17757 }
17758 }
17759
17760 /*
17761 ** Uninstall the VFS wrapper that was installed around the file-descriptor open
17762 ** on the input database for recover handle p. Mutex RECOVER_MUTEX_ID must be
17763 ** held when this function is called.
17764 */
recoverUninstallWrapper(sqlite3_recover * p)17765 static void recoverUninstallWrapper(sqlite3_recover *p){
17766 sqlite3_file *pFd = 0;
17767 recoverAssertMutexHeld();
17768 sqlite3_file_control(p->dbIn, p->zDb,SQLITE_FCNTL_FILE_POINTER,(void*)&pFd);
17769 if( pFd && pFd->pMethods ){
17770 pFd->pMethods = recover_g.pMethods;
17771 recover_g.pMethods = 0;
17772 recover_g.p = 0;
17773 }
17774 }
17775
17776 /*
17777 ** This function does the work of a single sqlite3_recover_step() call. It
17778 ** is guaranteed that the handle is not in an error state when this
17779 ** function is called.
17780 */
recoverStep(sqlite3_recover * p)17781 static void recoverStep(sqlite3_recover *p){
17782 assert( p && p->errCode==SQLITE_OK );
17783 switch( p->eState ){
17784 case RECOVER_STATE_INIT:
17785 /* This is the very first call to sqlite3_recover_step() on this object.
17786 */
17787 recoverSqlCallback(p, "BEGIN");
17788 recoverSqlCallback(p, "PRAGMA writable_schema = on");
17789
17790 recoverEnterMutex();
17791 recoverInstallWrapper(p);
17792
17793 /* Open the output database. And register required virtual tables and
17794 ** user functions with the new handle. */
17795 recoverOpenOutput(p);
17796
17797 /* Open transactions on both the input and output databases. */
17798 sqlite3_file_control(p->dbIn, p->zDb, SQLITE_FCNTL_RESET_CACHE, 0);
17799 recoverExec(p, p->dbIn, "PRAGMA writable_schema = on");
17800 recoverExec(p, p->dbIn, "BEGIN");
17801 if( p->errCode==SQLITE_OK ) p->bCloseTransaction = 1;
17802 recoverExec(p, p->dbIn, "SELECT 1 FROM sqlite_schema");
17803 recoverTransferSettings(p);
17804 recoverOpenRecovery(p);
17805 recoverCacheSchema(p);
17806
17807 recoverUninstallWrapper(p);
17808 recoverLeaveMutex();
17809
17810 recoverExec(p, p->dbOut, "BEGIN");
17811
17812 recoverWriteSchema1(p);
17813 p->eState = RECOVER_STATE_WRITING;
17814 break;
17815
17816 case RECOVER_STATE_WRITING: {
17817 if( p->w1.pTbls==0 ){
17818 recoverWriteDataInit(p);
17819 }
17820 if( SQLITE_DONE==recoverWriteDataStep(p) ){
17821 recoverWriteDataCleanup(p);
17822 if( p->zLostAndFound ){
17823 p->eState = RECOVER_STATE_LOSTANDFOUND1;
17824 }else{
17825 p->eState = RECOVER_STATE_SCHEMA2;
17826 }
17827 }
17828 break;
17829 }
17830
17831 case RECOVER_STATE_LOSTANDFOUND1: {
17832 if( p->laf.pUsed==0 ){
17833 recoverLostAndFound1Init(p);
17834 }
17835 if( SQLITE_DONE==recoverLostAndFound1Step(p) ){
17836 p->eState = RECOVER_STATE_LOSTANDFOUND2;
17837 }
17838 break;
17839 }
17840 case RECOVER_STATE_LOSTANDFOUND2: {
17841 if( p->laf.pAllAndParent==0 ){
17842 recoverLostAndFound2Init(p);
17843 }
17844 if( SQLITE_DONE==recoverLostAndFound2Step(p) ){
17845 p->eState = RECOVER_STATE_LOSTANDFOUND3;
17846 }
17847 break;
17848 }
17849
17850 case RECOVER_STATE_LOSTANDFOUND3: {
17851 if( p->laf.pInsert==0 ){
17852 recoverLostAndFound3Init(p);
17853 }
17854 if( SQLITE_DONE==recoverLostAndFound3Step(p) ){
17855 p->eState = RECOVER_STATE_SCHEMA2;
17856 }
17857 break;
17858 }
17859
17860 case RECOVER_STATE_SCHEMA2: {
17861 int rc = SQLITE_OK;
17862
17863 recoverWriteSchema2(p);
17864 p->eState = RECOVER_STATE_DONE;
17865
17866 /* If no error has occurred, commit the write transaction on the output
17867 ** database. Regardless of whether or not an error has occurred, make
17868 ** an attempt to end the read transaction on the input database. */
17869 recoverExec(p, p->dbOut, "COMMIT");
17870 rc = sqlite3_exec(p->dbIn, "END", 0, 0, 0);
17871 if( p->errCode==SQLITE_OK ) p->errCode = rc;
17872
17873 recoverSqlCallback(p, "PRAGMA writable_schema = off");
17874 recoverSqlCallback(p, "COMMIT");
17875 p->eState = RECOVER_STATE_DONE;
17876 recoverFinalCleanup(p);
17877 break;
17878 };
17879
17880 case RECOVER_STATE_DONE: {
17881 /* no-op */
17882 break;
17883 };
17884 }
17885 }
17886
17887
17888 /*
17889 ** This is a worker function that does the heavy lifting for both init
17890 ** functions:
17891 **
17892 ** sqlite3_recover_init()
17893 ** sqlite3_recover_init_sql()
17894 **
17895 ** All this function does is allocate space for the recover handle and
17896 ** take copies of the input parameters. All the real work is done within
17897 ** sqlite3_recover_run().
17898 */
recoverInit(sqlite3 * db,const char * zDb,const char * zUri,int (* xSql)(void *,const char *),void * pSqlCtx)17899 sqlite3_recover *recoverInit(
17900 sqlite3* db,
17901 const char *zDb,
17902 const char *zUri, /* Output URI for _recover_init() */
17903 int (*xSql)(void*, const char*),/* SQL callback for _recover_init_sql() */
17904 void *pSqlCtx /* Context arg for _recover_init_sql() */
17905 ){
17906 sqlite3_recover *pRet = 0;
17907 int nDb = 0;
17908 int nUri = 0;
17909 int nByte = 0;
17910
17911 if( zDb==0 ){ zDb = "main"; }
17912
17913 nDb = recoverStrlen(zDb);
17914 nUri = recoverStrlen(zUri);
17915
17916 nByte = sizeof(sqlite3_recover) + nDb+1 + nUri+1;
17917 pRet = (sqlite3_recover*)sqlite3_malloc(nByte);
17918 if( pRet ){
17919 memset(pRet, 0, nByte);
17920 pRet->dbIn = db;
17921 pRet->zDb = (char*)&pRet[1];
17922 pRet->zUri = &pRet->zDb[nDb+1];
17923 memcpy(pRet->zDb, zDb, nDb);
17924 if( nUri>0 && zUri ) memcpy(pRet->zUri, zUri, nUri);
17925 pRet->xSql = xSql;
17926 pRet->pSqlCtx = pSqlCtx;
17927 pRet->bRecoverRowid = RECOVER_ROWID_DEFAULT;
17928 }
17929
17930 return pRet;
17931 }
17932
17933 /*
17934 ** Initialize a recovery handle that creates a new database containing
17935 ** the recovered data.
17936 */
sqlite3_recover_init(sqlite3 * db,const char * zDb,const char * zUri)17937 sqlite3_recover *sqlite3_recover_init(
17938 sqlite3* db,
17939 const char *zDb,
17940 const char *zUri
17941 ){
17942 return recoverInit(db, zDb, zUri, 0, 0);
17943 }
17944
17945 /*
17946 ** Initialize a recovery handle that returns recovered data in the
17947 ** form of SQL statements via a callback.
17948 */
sqlite3_recover_init_sql(sqlite3 * db,const char * zDb,int (* xSql)(void *,const char *),void * pSqlCtx)17949 sqlite3_recover *sqlite3_recover_init_sql(
17950 sqlite3* db,
17951 const char *zDb,
17952 int (*xSql)(void*, const char*),
17953 void *pSqlCtx
17954 ){
17955 return recoverInit(db, zDb, 0, xSql, pSqlCtx);
17956 }
17957
17958 /*
17959 ** Return the handle error message, if any.
17960 */
sqlite3_recover_errmsg(sqlite3_recover * p)17961 const char *sqlite3_recover_errmsg(sqlite3_recover *p){
17962 return (p && p->errCode!=SQLITE_NOMEM) ? p->zErrMsg : "out of memory";
17963 }
17964
17965 /*
17966 ** Return the handle error code.
17967 */
sqlite3_recover_errcode(sqlite3_recover * p)17968 int sqlite3_recover_errcode(sqlite3_recover *p){
17969 return p ? p->errCode : SQLITE_NOMEM;
17970 }
17971
17972 /*
17973 ** Configure the handle.
17974 */
sqlite3_recover_config(sqlite3_recover * p,int op,void * pArg)17975 int sqlite3_recover_config(sqlite3_recover *p, int op, void *pArg){
17976 int rc = SQLITE_OK;
17977 if( p==0 ){
17978 rc = SQLITE_NOMEM;
17979 }else if( p->eState!=RECOVER_STATE_INIT ){
17980 rc = SQLITE_MISUSE;
17981 }else{
17982 switch( op ){
17983 case 789:
17984 /* This undocumented magic configuration option is used to set the
17985 ** name of the auxiliary database that is ATTACH-ed to the database
17986 ** connection and used to hold state information during the
17987 ** recovery process. This option is for debugging use only and
17988 ** is subject to change or removal at any time. */
17989 sqlite3_free(p->zStateDb);
17990 p->zStateDb = recoverMPrintf(p, "%s", (char*)pArg);
17991 break;
17992
17993 case SQLITE_RECOVER_LOST_AND_FOUND: {
17994 const char *zArg = (const char*)pArg;
17995 sqlite3_free(p->zLostAndFound);
17996 if( zArg ){
17997 p->zLostAndFound = recoverMPrintf(p, "%s", zArg);
17998 }else{
17999 p->zLostAndFound = 0;
18000 }
18001 break;
18002 }
18003
18004 case SQLITE_RECOVER_FREELIST_CORRUPT:
18005 p->bFreelistCorrupt = *(int*)pArg;
18006 break;
18007
18008 case SQLITE_RECOVER_ROWIDS:
18009 p->bRecoverRowid = *(int*)pArg;
18010 break;
18011
18012 case SQLITE_RECOVER_SLOWINDEXES:
18013 p->bSlowIndexes = *(int*)pArg;
18014 break;
18015
18016 default:
18017 rc = SQLITE_NOTFOUND;
18018 break;
18019 }
18020 }
18021
18022 return rc;
18023 }
18024
18025 /*
18026 ** Do a unit of work towards the recovery job. Return SQLITE_OK if
18027 ** no error has occurred but database recovery is not finished, SQLITE_DONE
18028 ** if database recovery has been successfully completed, or an SQLite
18029 ** error code if an error has occurred.
18030 */
sqlite3_recover_step(sqlite3_recover * p)18031 int sqlite3_recover_step(sqlite3_recover *p){
18032 if( p==0 ) return SQLITE_NOMEM;
18033 if( p->errCode==SQLITE_OK ) recoverStep(p);
18034 if( p->eState==RECOVER_STATE_DONE && p->errCode==SQLITE_OK ){
18035 return SQLITE_DONE;
18036 }
18037 return p->errCode;
18038 }
18039
18040 /*
18041 ** Do the configured recovery operation. Return SQLITE_OK if successful, or
18042 ** else an SQLite error code.
18043 */
sqlite3_recover_run(sqlite3_recover * p)18044 int sqlite3_recover_run(sqlite3_recover *p){
18045 while( SQLITE_OK==sqlite3_recover_step(p) );
18046 return sqlite3_recover_errcode(p);
18047 }
18048
18049
18050 /*
18051 ** Free all resources associated with the recover handle passed as the only
18052 ** argument. The results of using a handle with any sqlite3_recover_**
18053 ** API function after it has been passed to this function are undefined.
18054 **
18055 ** A copy of the value returned by the first call made to sqlite3_recover_run()
18056 ** on this handle is returned, or SQLITE_OK if sqlite3_recover_run() has
18057 ** not been called on this handle.
18058 */
sqlite3_recover_finish(sqlite3_recover * p)18059 int sqlite3_recover_finish(sqlite3_recover *p){
18060 int rc;
18061 if( p==0 ){
18062 rc = SQLITE_NOMEM;
18063 }else{
18064 recoverFinalCleanup(p);
18065 if( p->bCloseTransaction && sqlite3_get_autocommit(p->dbIn)==0 ){
18066 rc = sqlite3_exec(p->dbIn, "END", 0, 0, 0);
18067 if( p->errCode==SQLITE_OK ) p->errCode = rc;
18068 }
18069 rc = p->errCode;
18070 sqlite3_free(p->zErrMsg);
18071 sqlite3_free(p->zStateDb);
18072 sqlite3_free(p->zLostAndFound);
18073 sqlite3_free(p->pPage1Cache);
18074 sqlite3_free(p);
18075 }
18076 return rc;
18077 }
18078
18079 #endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
18080
18081 /************************* End ../ext/recover/sqlite3recover.c ********************/
18082 # endif /* SQLITE_HAVE_SQLITE3R */
18083 #endif
18084 #ifdef SQLITE_SHELL_EXTSRC
18085 # include SHELL_STRINGIFY(SQLITE_SHELL_EXTSRC)
18086 #endif
18087
18088 #if defined(SQLITE_ENABLE_SESSION)
18089 /*
18090 ** State information for a single open session
18091 */
18092 typedef struct OpenSession OpenSession;
18093 struct OpenSession {
18094 char *zName; /* Symbolic name for this session */
18095 int nFilter; /* Number of xFilter rejection GLOB patterns */
18096 char **azFilter; /* Array of xFilter rejection GLOB patterns */
18097 sqlite3_session *p; /* The open session */
18098 };
18099 #endif
18100
18101 typedef struct ExpertInfo ExpertInfo;
18102 struct ExpertInfo {
18103 sqlite3expert *pExpert;
18104 int bVerbose;
18105 };
18106
18107 /* A single line in the EQP output */
18108 typedef struct EQPGraphRow EQPGraphRow;
18109 struct EQPGraphRow {
18110 int iEqpId; /* ID for this row */
18111 int iParentId; /* ID of the parent row */
18112 EQPGraphRow *pNext; /* Next row in sequence */
18113 char zText[1]; /* Text to display for this row */
18114 };
18115
18116 /* All EQP output is collected into an instance of the following */
18117 typedef struct EQPGraph EQPGraph;
18118 struct EQPGraph {
18119 EQPGraphRow *pRow; /* Linked list of all rows of the EQP output */
18120 EQPGraphRow *pLast; /* Last element of the pRow list */
18121 char zPrefix[100]; /* Graph prefix */
18122 };
18123
18124 /* Parameters affecting columnar mode result display (defaulting together) */
18125 typedef struct ColModeOpts {
18126 int iWrap; /* In columnar modes, wrap lines reaching this limit */
18127 u8 bQuote; /* Quote results for .mode box and table */
18128 u8 bWordWrap; /* In columnar modes, wrap at word boundaries */
18129 } ColModeOpts;
18130 #define ColModeOpts_default { 60, 0, 0 }
18131 #define ColModeOpts_default_qbox { 60, 1, 0 }
18132
18133 /*
18134 ** State information about the database connection is contained in an
18135 ** instance of the following structure.
18136 */
18137 typedef struct ShellState ShellState;
18138 struct ShellState {
18139 sqlite3 *db; /* The database */
18140 u8 autoExplain; /* Automatically turn on .explain mode */
18141 u8 autoEQP; /* Run EXPLAIN QUERY PLAN prior to each SQL stmt */
18142 u8 autoEQPtest; /* autoEQP is in test mode */
18143 u8 autoEQPtrace; /* autoEQP is in trace mode */
18144 u8 scanstatsOn; /* True to display scan stats before each finalize */
18145 u8 openMode; /* SHELL_OPEN_NORMAL, _APPENDVFS, or _ZIPFILE */
18146 u8 doXdgOpen; /* Invoke start/open/xdg-open in output_reset() */
18147 u8 nEqpLevel; /* Depth of the EQP output graph */
18148 u8 eTraceType; /* SHELL_TRACE_* value for type of trace */
18149 u8 bSafeMode; /* True to prohibit unsafe operations */
18150 u8 bSafeModePersist; /* The long-term value of bSafeMode */
18151 u8 eRestoreState; /* See comments above doAutoDetectRestore() */
18152 ColModeOpts cmOpts; /* Option values affecting columnar mode output */
18153 unsigned statsOn; /* True to display memory stats before each finalize */
18154 unsigned mEqpLines; /* Mask of vertical lines in the EQP output graph */
18155 int inputNesting; /* Track nesting level of .read and other redirects */
18156 int outCount; /* Revert to stdout when reaching zero */
18157 int cnt; /* Number of records displayed so far */
18158 int lineno; /* Line number of last line read from in */
18159 int openFlags; /* Additional flags to open. (SQLITE_OPEN_NOFOLLOW) */
18160 FILE *in; /* Read commands from this stream */
18161 FILE *out; /* Write results here */
18162 FILE *traceOut; /* Output for sqlite3_trace() */
18163 int nErr; /* Number of errors seen */
18164 int mode; /* An output mode setting */
18165 int modePrior; /* Saved mode */
18166 int cMode; /* temporary output mode for the current query */
18167 int normalMode; /* Output mode before ".explain on" */
18168 int writableSchema; /* True if PRAGMA writable_schema=ON */
18169 int showHeader; /* True to show column names in List or Column mode */
18170 int nCheck; /* Number of ".check" commands run */
18171 unsigned nProgress; /* Number of progress callbacks encountered */
18172 unsigned mxProgress; /* Maximum progress callbacks before failing */
18173 unsigned flgProgress; /* Flags for the progress callback */
18174 unsigned shellFlgs; /* Various flags */
18175 unsigned priorShFlgs; /* Saved copy of flags */
18176 sqlite3_int64 szMax; /* --maxsize argument to .open */
18177 char *zDestTable; /* Name of destination table when MODE_Insert */
18178 char *zTempFile; /* Temporary file that might need deleting */
18179 char zTestcase[30]; /* Name of current test case */
18180 char colSeparator[20]; /* Column separator character for several modes */
18181 char rowSeparator[20]; /* Row separator character for MODE_Ascii */
18182 char colSepPrior[20]; /* Saved column separator */
18183 char rowSepPrior[20]; /* Saved row separator */
18184 int *colWidth; /* Requested width of each column in columnar modes */
18185 int *actualWidth; /* Actual width of each column */
18186 int nWidth; /* Number of slots in colWidth[] and actualWidth[] */
18187 char nullValue[20]; /* The text to print when a NULL comes back from
18188 ** the database */
18189 char outfile[FILENAME_MAX]; /* Filename for *out */
18190 sqlite3_stmt *pStmt; /* Current statement if any. */
18191 FILE *pLog; /* Write log output here */
18192 struct AuxDb { /* Storage space for auxiliary database connections */
18193 sqlite3 *db; /* Connection pointer */
18194 const char *zDbFilename; /* Filename used to open the connection */
18195 char *zFreeOnClose; /* Free this memory allocation on close */
18196 #if defined(SQLITE_ENABLE_SESSION)
18197 int nSession; /* Number of active sessions */
18198 OpenSession aSession[4]; /* Array of sessions. [0] is in focus. */
18199 #endif
18200 } aAuxDb[5], /* Array of all database connections */
18201 *pAuxDb; /* Currently active database connection */
18202 int *aiIndent; /* Array of indents used in MODE_Explain */
18203 int nIndent; /* Size of array aiIndent[] */
18204 int iIndent; /* Index of current op in aiIndent[] */
18205 char *zNonce; /* Nonce for temporary safe-mode escapes */
18206 EQPGraph sGraph; /* Information for the graphical EXPLAIN QUERY PLAN */
18207 ExpertInfo expert; /* Valid if previous command was ".expert OPT..." */
18208 #ifdef SQLITE_SHELL_FIDDLE
18209 struct {
18210 const char * zInput; /* Input string from wasm/JS proxy */
18211 const char * zPos; /* Cursor pos into zInput */
18212 const char * zDefaultDbName; /* Default name for db file */
18213 } wasm;
18214 #endif
18215 };
18216
18217 #ifdef SQLITE_SHELL_FIDDLE
18218 static ShellState shellState;
18219 #endif
18220
18221
18222 /* Allowed values for ShellState.autoEQP
18223 */
18224 #define AUTOEQP_off 0 /* Automatic EXPLAIN QUERY PLAN is off */
18225 #define AUTOEQP_on 1 /* Automatic EQP is on */
18226 #define AUTOEQP_trigger 2 /* On and also show plans for triggers */
18227 #define AUTOEQP_full 3 /* Show full EXPLAIN */
18228
18229 /* Allowed values for ShellState.openMode
18230 */
18231 #define SHELL_OPEN_UNSPEC 0 /* No open-mode specified */
18232 #define SHELL_OPEN_NORMAL 1 /* Normal database file */
18233 #define SHELL_OPEN_APPENDVFS 2 /* Use appendvfs */
18234 #define SHELL_OPEN_ZIPFILE 3 /* Use the zipfile virtual table */
18235 #define SHELL_OPEN_READONLY 4 /* Open a normal database read-only */
18236 #define SHELL_OPEN_DESERIALIZE 5 /* Open using sqlite3_deserialize() */
18237 #define SHELL_OPEN_HEXDB 6 /* Use "dbtotxt" output as data source */
18238
18239 /* Allowed values for ShellState.eTraceType
18240 */
18241 #define SHELL_TRACE_PLAIN 0 /* Show input SQL text */
18242 #define SHELL_TRACE_EXPANDED 1 /* Show expanded SQL text */
18243 #define SHELL_TRACE_NORMALIZED 2 /* Show normalized SQL text */
18244
18245 /* Bits in the ShellState.flgProgress variable */
18246 #define SHELL_PROGRESS_QUIET 0x01 /* Omit announcing every progress callback */
18247 #define SHELL_PROGRESS_RESET 0x02 /* Reset the count when the progress
18248 ** callback limit is reached, and for each
18249 ** top-level SQL statement */
18250 #define SHELL_PROGRESS_ONCE 0x04 /* Cancel the --limit after firing once */
18251
18252 /*
18253 ** These are the allowed shellFlgs values
18254 */
18255 #define SHFLG_Pagecache 0x00000001 /* The --pagecache option is used */
18256 #define SHFLG_Lookaside 0x00000002 /* Lookaside memory is used */
18257 #define SHFLG_Backslash 0x00000004 /* The --backslash option is used */
18258 #define SHFLG_PreserveRowid 0x00000008 /* .dump preserves rowid values */
18259 #define SHFLG_Newlines 0x00000010 /* .dump --newline flag */
18260 #define SHFLG_CountChanges 0x00000020 /* .changes setting */
18261 #define SHFLG_Echo 0x00000040 /* .echo on/off, or --echo setting */
18262 #define SHFLG_HeaderSet 0x00000080 /* showHeader has been specified */
18263 #define SHFLG_DumpDataOnly 0x00000100 /* .dump show data only */
18264 #define SHFLG_DumpNoSys 0x00000200 /* .dump omits system tables */
18265 #define SHFLG_TestingMode 0x00000400 /* allow unsafe testing features */
18266
18267 /*
18268 ** Macros for testing and setting shellFlgs
18269 */
18270 #define ShellHasFlag(P,X) (((P)->shellFlgs & (X))!=0)
18271 #define ShellSetFlag(P,X) ((P)->shellFlgs|=(X))
18272 #define ShellClearFlag(P,X) ((P)->shellFlgs&=(~(X)))
18273
18274 /*
18275 ** These are the allowed modes.
18276 */
18277 #define MODE_Line 0 /* One column per line. Blank line between records */
18278 #define MODE_Column 1 /* One record per line in neat columns */
18279 #define MODE_List 2 /* One record per line with a separator */
18280 #define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */
18281 #define MODE_Html 4 /* Generate an XHTML table */
18282 #define MODE_Insert 5 /* Generate SQL "insert" statements */
18283 #define MODE_Quote 6 /* Quote values as for SQL */
18284 #define MODE_Tcl 7 /* Generate ANSI-C or TCL quoted elements */
18285 #define MODE_Csv 8 /* Quote strings, numbers are plain */
18286 #define MODE_Explain 9 /* Like MODE_Column, but do not truncate data */
18287 #define MODE_Ascii 10 /* Use ASCII unit and record separators (0x1F/0x1E) */
18288 #define MODE_Pretty 11 /* Pretty-print schemas */
18289 #define MODE_EQP 12 /* Converts EXPLAIN QUERY PLAN output into a graph */
18290 #define MODE_Json 13 /* Output JSON */
18291 #define MODE_Markdown 14 /* Markdown formatting */
18292 #define MODE_Table 15 /* MySQL-style table formatting */
18293 #define MODE_Box 16 /* Unicode box-drawing characters */
18294 #define MODE_Count 17 /* Output only a count of the rows of output */
18295 #define MODE_Off 18 /* No query output shown */
18296 #define MODE_ScanExp 19 /* Like MODE_Explain, but for ".scanstats vm" */
18297
18298 static const char *modeDescr[] = {
18299 "line",
18300 "column",
18301 "list",
18302 "semi",
18303 "html",
18304 "insert",
18305 "quote",
18306 "tcl",
18307 "csv",
18308 "explain",
18309 "ascii",
18310 "prettyprint",
18311 "eqp",
18312 "json",
18313 "markdown",
18314 "table",
18315 "box",
18316 "count",
18317 "off"
18318 };
18319
18320 /*
18321 ** These are the column/row/line separators used by the various
18322 ** import/export modes.
18323 */
18324 #define SEP_Column "|"
18325 #define SEP_Row "\n"
18326 #define SEP_Tab "\t"
18327 #define SEP_Space " "
18328 #define SEP_Comma ","
18329 #define SEP_CrLf "\r\n"
18330 #define SEP_Unit "\x1F"
18331 #define SEP_Record "\x1E"
18332
18333 /*
18334 ** Limit input nesting via .read or any other input redirect.
18335 ** It's not too expensive, so a generous allowance can be made.
18336 */
18337 #define MAX_INPUT_NESTING 25
18338
18339 /*
18340 ** A callback for the sqlite3_log() interface.
18341 */
shellLog(void * pArg,int iErrCode,const char * zMsg)18342 static void shellLog(void *pArg, int iErrCode, const char *zMsg){
18343 ShellState *p = (ShellState*)pArg;
18344 if( p->pLog==0 ) return;
18345 sputf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
18346 fflush(p->pLog);
18347 }
18348
18349 /*
18350 ** SQL function: shell_putsnl(X)
18351 **
18352 ** Write the text X to the screen (or whatever output is being directed)
18353 ** adding a newline at the end, and then return X.
18354 */
shellPutsFunc(sqlite3_context * pCtx,int nVal,sqlite3_value ** apVal)18355 static void shellPutsFunc(
18356 sqlite3_context *pCtx,
18357 int nVal,
18358 sqlite3_value **apVal
18359 ){
18360 /* Unused: (ShellState*)sqlite3_user_data(pCtx); */
18361 (void)nVal;
18362 oputf("%s\n", sqlite3_value_text(apVal[0]));
18363 sqlite3_result_value(pCtx, apVal[0]);
18364 }
18365
18366 /*
18367 ** If in safe mode, print an error message described by the arguments
18368 ** and exit immediately.
18369 */
failIfSafeMode(ShellState * p,const char * zErrMsg,...)18370 static void failIfSafeMode(
18371 ShellState *p,
18372 const char *zErrMsg,
18373 ...
18374 ){
18375 if( p->bSafeMode ){
18376 va_list ap;
18377 char *zMsg;
18378 va_start(ap, zErrMsg);
18379 zMsg = sqlite3_vmprintf(zErrMsg, ap);
18380 va_end(ap);
18381 eputf("line %d: %s\n", p->lineno, zMsg);
18382 exit(1);
18383 }
18384 }
18385
18386 /*
18387 ** SQL function: edit(VALUE)
18388 ** edit(VALUE,EDITOR)
18389 **
18390 ** These steps:
18391 **
18392 ** (1) Write VALUE into a temporary file.
18393 ** (2) Run program EDITOR on that temporary file.
18394 ** (3) Read the temporary file back and return its content as the result.
18395 ** (4) Delete the temporary file
18396 **
18397 ** If the EDITOR argument is omitted, use the value in the VISUAL
18398 ** environment variable. If still there is no EDITOR, through an error.
18399 **
18400 ** Also throw an error if the EDITOR program returns a non-zero exit code.
18401 */
18402 #ifndef SQLITE_NOHAVE_SYSTEM
editFunc(sqlite3_context * context,int argc,sqlite3_value ** argv)18403 static void editFunc(
18404 sqlite3_context *context,
18405 int argc,
18406 sqlite3_value **argv
18407 ){
18408 const char *zEditor;
18409 char *zTempFile = 0;
18410 sqlite3 *db;
18411 char *zCmd = 0;
18412 int bBin;
18413 int rc;
18414 int hasCRNL = 0;
18415 FILE *f = 0;
18416 sqlite3_int64 sz;
18417 sqlite3_int64 x;
18418 unsigned char *p = 0;
18419
18420 if( argc==2 ){
18421 zEditor = (const char*)sqlite3_value_text(argv[1]);
18422 }else{
18423 zEditor = getenv("VISUAL");
18424 }
18425 if( zEditor==0 ){
18426 sqlite3_result_error(context, "no editor for edit()", -1);
18427 return;
18428 }
18429 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
18430 sqlite3_result_error(context, "NULL input to edit()", -1);
18431 return;
18432 }
18433 db = sqlite3_context_db_handle(context);
18434 zTempFile = 0;
18435 sqlite3_file_control(db, 0, SQLITE_FCNTL_TEMPFILENAME, &zTempFile);
18436 if( zTempFile==0 ){
18437 sqlite3_uint64 r = 0;
18438 sqlite3_randomness(sizeof(r), &r);
18439 zTempFile = sqlite3_mprintf("temp%llx", r);
18440 if( zTempFile==0 ){
18441 sqlite3_result_error_nomem(context);
18442 return;
18443 }
18444 }
18445 bBin = sqlite3_value_type(argv[0])==SQLITE_BLOB;
18446 /* When writing the file to be edited, do \n to \r\n conversions on systems
18447 ** that want \r\n line endings */
18448 f = fopen(zTempFile, bBin ? "wb" : "w");
18449 if( f==0 ){
18450 sqlite3_result_error(context, "edit() cannot open temp file", -1);
18451 goto edit_func_end;
18452 }
18453 sz = sqlite3_value_bytes(argv[0]);
18454 if( bBin ){
18455 x = fwrite(sqlite3_value_blob(argv[0]), 1, (size_t)sz, f);
18456 }else{
18457 const char *z = (const char*)sqlite3_value_text(argv[0]);
18458 /* Remember whether or not the value originally contained \r\n */
18459 if( z && strstr(z,"\r\n")!=0 ) hasCRNL = 1;
18460 x = fwrite(sqlite3_value_text(argv[0]), 1, (size_t)sz, f);
18461 }
18462 fclose(f);
18463 f = 0;
18464 if( x!=sz ){
18465 sqlite3_result_error(context, "edit() could not write the whole file", -1);
18466 goto edit_func_end;
18467 }
18468 zCmd = sqlite3_mprintf("%s \"%s\"", zEditor, zTempFile);
18469 if( zCmd==0 ){
18470 sqlite3_result_error_nomem(context);
18471 goto edit_func_end;
18472 }
18473 rc = system(zCmd);
18474 sqlite3_free(zCmd);
18475 if( rc ){
18476 sqlite3_result_error(context, "EDITOR returned non-zero", -1);
18477 goto edit_func_end;
18478 }
18479 f = fopen(zTempFile, "rb");
18480 if( f==0 ){
18481 sqlite3_result_error(context,
18482 "edit() cannot reopen temp file after edit", -1);
18483 goto edit_func_end;
18484 }
18485 fseek(f, 0, SEEK_END);
18486 sz = ftell(f);
18487 rewind(f);
18488 p = sqlite3_malloc64( sz+1 );
18489 if( p==0 ){
18490 sqlite3_result_error_nomem(context);
18491 goto edit_func_end;
18492 }
18493 x = fread(p, 1, (size_t)sz, f);
18494 fclose(f);
18495 f = 0;
18496 if( x!=sz ){
18497 sqlite3_result_error(context, "could not read back the whole file", -1);
18498 goto edit_func_end;
18499 }
18500 if( bBin ){
18501 sqlite3_result_blob64(context, p, sz, sqlite3_free);
18502 }else{
18503 sqlite3_int64 i, j;
18504 if( hasCRNL ){
18505 /* If the original contains \r\n then do no conversions back to \n */
18506 }else{
18507 /* If the file did not originally contain \r\n then convert any new
18508 ** \r\n back into \n */
18509 p[sz] = 0;
18510 for(i=j=0; i<sz; i++){
18511 if( p[i]=='\r' && p[i+1]=='\n' ) i++;
18512 p[j++] = p[i];
18513 }
18514 sz = j;
18515 p[sz] = 0;
18516 }
18517 sqlite3_result_text64(context, (const char*)p, sz,
18518 sqlite3_free, SQLITE_UTF8);
18519 }
18520 p = 0;
18521
18522 edit_func_end:
18523 if( f ) fclose(f);
18524 unlink(zTempFile);
18525 sqlite3_free(zTempFile);
18526 sqlite3_free(p);
18527 }
18528 #endif /* SQLITE_NOHAVE_SYSTEM */
18529
18530 /*
18531 ** Save or restore the current output mode
18532 */
outputModePush(ShellState * p)18533 static void outputModePush(ShellState *p){
18534 p->modePrior = p->mode;
18535 p->priorShFlgs = p->shellFlgs;
18536 memcpy(p->colSepPrior, p->colSeparator, sizeof(p->colSeparator));
18537 memcpy(p->rowSepPrior, p->rowSeparator, sizeof(p->rowSeparator));
18538 }
outputModePop(ShellState * p)18539 static void outputModePop(ShellState *p){
18540 p->mode = p->modePrior;
18541 p->shellFlgs = p->priorShFlgs;
18542 memcpy(p->colSeparator, p->colSepPrior, sizeof(p->colSeparator));
18543 memcpy(p->rowSeparator, p->rowSepPrior, sizeof(p->rowSeparator));
18544 }
18545
18546 /*
18547 ** Output the given string as a hex-encoded blob (eg. X'1234' )
18548 */
output_hex_blob(const void * pBlob,int nBlob)18549 static void output_hex_blob(const void *pBlob, int nBlob){
18550 int i;
18551 unsigned char *aBlob = (unsigned char*)pBlob;
18552
18553 char *zStr = sqlite3_malloc(nBlob*2 + 1);
18554 shell_check_oom(zStr);
18555
18556 for(i=0; i<nBlob; i++){
18557 static const char aHex[] = {
18558 '0', '1', '2', '3', '4', '5', '6', '7',
18559 '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
18560 };
18561 zStr[i*2] = aHex[ (aBlob[i] >> 4) ];
18562 zStr[i*2+1] = aHex[ (aBlob[i] & 0x0F) ];
18563 }
18564 zStr[i*2] = '\0';
18565
18566 oputf("X'%s'", zStr);
18567 sqlite3_free(zStr);
18568 }
18569
18570 /*
18571 ** Find a string that is not found anywhere in z[]. Return a pointer
18572 ** to that string.
18573 **
18574 ** Try to use zA and zB first. If both of those are already found in z[]
18575 ** then make up some string and store it in the buffer zBuf.
18576 */
unused_string(const char * z,const char * zA,const char * zB,char * zBuf)18577 static const char *unused_string(
18578 const char *z, /* Result must not appear anywhere in z */
18579 const char *zA, const char *zB, /* Try these first */
18580 char *zBuf /* Space to store a generated string */
18581 ){
18582 unsigned i = 0;
18583 if( strstr(z, zA)==0 ) return zA;
18584 if( strstr(z, zB)==0 ) return zB;
18585 do{
18586 sqlite3_snprintf(20,zBuf,"(%s%u)", zA, i++);
18587 }while( strstr(z,zBuf)!=0 );
18588 return zBuf;
18589 }
18590
18591 /*
18592 ** Output the given string as a quoted string using SQL quoting conventions.
18593 **
18594 ** See also: output_quoted_escaped_string()
18595 */
output_quoted_string(const char * z)18596 static void output_quoted_string(const char *z){
18597 int i;
18598 char c;
18599 #ifndef SQLITE_SHELL_FIDDLE
18600 FILE *pfO = setOutputStream(invalidFileStream);
18601 setBinaryMode(pfO, 1);
18602 #endif
18603 if( z==0 ) return;
18604 for(i=0; (c = z[i])!=0 && c!='\''; i++){}
18605 if( c==0 ){
18606 oputf("'%s'",z);
18607 }else{
18608 oputz("'");
18609 while( *z ){
18610 for(i=0; (c = z[i])!=0 && c!='\''; i++){}
18611 if( c=='\'' ) i++;
18612 if( i ){
18613 oputf("%.*s", i, z);
18614 z += i;
18615 }
18616 if( c=='\'' ){
18617 oputz("'");
18618 continue;
18619 }
18620 if( c==0 ){
18621 break;
18622 }
18623 z++;
18624 }
18625 oputz("'");
18626 }
18627 #ifndef SQLITE_SHELL_FIDDLE
18628 setTextMode(pfO, 1);
18629 #else
18630 setTextMode(stdout, 1);
18631 #endif
18632 }
18633
18634 /*
18635 ** Output the given string as a quoted string using SQL quoting conventions.
18636 ** Additionallly , escape the "\n" and "\r" characters so that they do not
18637 ** get corrupted by end-of-line translation facilities in some operating
18638 ** systems.
18639 **
18640 ** This is like output_quoted_string() but with the addition of the \r\n
18641 ** escape mechanism.
18642 */
output_quoted_escaped_string(const char * z)18643 static void output_quoted_escaped_string(const char *z){
18644 int i;
18645 char c;
18646 #ifndef SQLITE_SHELL_FIDDLE
18647 FILE *pfO = setOutputStream(invalidFileStream);
18648 setBinaryMode(pfO, 1);
18649 #endif
18650 for(i=0; (c = z[i])!=0 && c!='\'' && c!='\n' && c!='\r'; i++){}
18651 if( c==0 ){
18652 oputf("'%s'",z);
18653 }else{
18654 const char *zNL = 0;
18655 const char *zCR = 0;
18656 int nNL = 0;
18657 int nCR = 0;
18658 char zBuf1[20], zBuf2[20];
18659 for(i=0; z[i]; i++){
18660 if( z[i]=='\n' ) nNL++;
18661 if( z[i]=='\r' ) nCR++;
18662 }
18663 if( nNL ){
18664 oputz("replace(");
18665 zNL = unused_string(z, "\\n", "\\012", zBuf1);
18666 }
18667 if( nCR ){
18668 oputz("replace(");
18669 zCR = unused_string(z, "\\r", "\\015", zBuf2);
18670 }
18671 oputz("'");
18672 while( *z ){
18673 for(i=0; (c = z[i])!=0 && c!='\n' && c!='\r' && c!='\''; i++){}
18674 if( c=='\'' ) i++;
18675 if( i ){
18676 oputf("%.*s", i, z);
18677 z += i;
18678 }
18679 if( c=='\'' ){
18680 oputz("'");
18681 continue;
18682 }
18683 if( c==0 ){
18684 break;
18685 }
18686 z++;
18687 if( c=='\n' ){
18688 oputz(zNL);
18689 continue;
18690 }
18691 oputz(zCR);
18692 }
18693 oputz("'");
18694 if( nCR ){
18695 oputf(",'%s',char(13))", zCR);
18696 }
18697 if( nNL ){
18698 oputf(",'%s',char(10))", zNL);
18699 }
18700 }
18701 #ifndef SQLITE_SHELL_FIDDLE
18702 setTextMode(pfO, 1);
18703 #else
18704 setTextMode(stdout, 1);
18705 #endif
18706 }
18707
18708 /*
18709 ** Find earliest of chars within s specified in zAny.
18710 ** With ns == ~0, is like strpbrk(s,zAny) and s must be 0-terminated.
18711 */
anyOfInStr(const char * s,const char * zAny,size_t ns)18712 static const char *anyOfInStr(const char *s, const char *zAny, size_t ns){
18713 const char *pcFirst = 0;
18714 if( ns == ~(size_t)0 ) ns = strlen(s);
18715 while(*zAny){
18716 const char *pc = (const char*)memchr(s, *zAny&0xff, ns);
18717 if( pc ){
18718 pcFirst = pc;
18719 ns = pcFirst - s;
18720 }
18721 ++zAny;
18722 }
18723 return pcFirst;
18724 }
18725 /*
18726 ** Output the given string as a quoted according to C or TCL quoting rules.
18727 */
output_c_string(const char * z)18728 static void output_c_string(const char *z){
18729 char c;
18730 static const char *zq = "\"";
18731 static long ctrlMask = ~0L;
18732 static const char *zDQBSRO = "\"\\\x7f"; /* double-quote, backslash, rubout */
18733 char ace[3] = "\\?";
18734 char cbsSay;
18735 oputz(zq);
18736 while( *z!=0 ){
18737 const char *pcDQBSRO = anyOfInStr(z, zDQBSRO, ~(size_t)0);
18738 const char *pcPast = zSkipValidUtf8(z, INT_MAX, ctrlMask);
18739 const char *pcEnd = (pcDQBSRO && pcDQBSRO < pcPast)? pcDQBSRO : pcPast;
18740 if( pcEnd > z ) oputb(z, (int)(pcEnd-z));
18741 if( (c = *pcEnd)==0 ) break;
18742 ++pcEnd;
18743 switch( c ){
18744 case '\\': case '"':
18745 cbsSay = (char)c;
18746 break;
18747 case '\t': cbsSay = 't'; break;
18748 case '\n': cbsSay = 'n'; break;
18749 case '\r': cbsSay = 'r'; break;
18750 case '\f': cbsSay = 'f'; break;
18751 default: cbsSay = 0; break;
18752 }
18753 if( cbsSay ){
18754 ace[1] = cbsSay;
18755 oputz(ace);
18756 }else if( !isprint(c&0xff) ){
18757 oputf("\\%03o", c&0xff);
18758 }else{
18759 ace[1] = (char)c;
18760 oputz(ace+1);
18761 }
18762 z = pcEnd;
18763 }
18764 oputz(zq);
18765 }
18766
18767 /*
18768 ** Output the given string as a quoted according to JSON quoting rules.
18769 */
output_json_string(const char * z,i64 n)18770 static void output_json_string(const char *z, i64 n){
18771 char c;
18772 static const char *zq = "\"";
18773 static long ctrlMask = ~0L;
18774 static const char *zDQBS = "\"\\";
18775 const char *pcLimit;
18776 char ace[3] = "\\?";
18777 char cbsSay;
18778
18779 if( z==0 ) z = "";
18780 pcLimit = z + ((n<0)? strlen(z) : (size_t)n);
18781 oputz(zq);
18782 while( z < pcLimit ){
18783 const char *pcDQBS = anyOfInStr(z, zDQBS, pcLimit-z);
18784 const char *pcPast = zSkipValidUtf8(z, (int)(pcLimit-z), ctrlMask);
18785 const char *pcEnd = (pcDQBS && pcDQBS < pcPast)? pcDQBS : pcPast;
18786 if( pcEnd > z ){
18787 oputb(z, (int)(pcEnd-z));
18788 z = pcEnd;
18789 }
18790 if( z >= pcLimit ) break;
18791 c = *(z++);
18792 switch( c ){
18793 case '"': case '\\':
18794 cbsSay = (char)c;
18795 break;
18796 case '\b': cbsSay = 'b'; break;
18797 case '\f': cbsSay = 'f'; break;
18798 case '\n': cbsSay = 'n'; break;
18799 case '\r': cbsSay = 'r'; break;
18800 case '\t': cbsSay = 't'; break;
18801 default: cbsSay = 0; break;
18802 }
18803 if( cbsSay ){
18804 ace[1] = cbsSay;
18805 oputz(ace);
18806 }else if( c<=0x1f ){
18807 oputf("u%04x", c);
18808 }else{
18809 ace[1] = (char)c;
18810 oputz(ace+1);
18811 }
18812 }
18813 oputz(zq);
18814 }
18815
18816 /*
18817 ** Output the given string with characters that are special to
18818 ** HTML escaped.
18819 */
output_html_string(const char * z)18820 static void output_html_string(const char *z){
18821 int i;
18822 if( z==0 ) z = "";
18823 while( *z ){
18824 for(i=0; z[i]
18825 && z[i]!='<'
18826 && z[i]!='&'
18827 && z[i]!='>'
18828 && z[i]!='\"'
18829 && z[i]!='\'';
18830 i++){}
18831 if( i>0 ){
18832 oputf("%.*s",i,z);
18833 }
18834 if( z[i]=='<' ){
18835 oputz("<");
18836 }else if( z[i]=='&' ){
18837 oputz("&");
18838 }else if( z[i]=='>' ){
18839 oputz(">");
18840 }else if( z[i]=='\"' ){
18841 oputz(""");
18842 }else if( z[i]=='\'' ){
18843 oputz("'");
18844 }else{
18845 break;
18846 }
18847 z += i + 1;
18848 }
18849 }
18850
18851 /*
18852 ** If a field contains any character identified by a 1 in the following
18853 ** array, then the string must be quoted for CSV.
18854 */
18855 static const char needCsvQuote[] = {
18856 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
18857 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
18858 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
18859 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
18860 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
18861 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
18862 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
18863 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
18864 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
18865 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
18866 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
18867 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
18868 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
18869 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
18870 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
18871 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
18872 };
18873
18874 /*
18875 ** Output a single term of CSV. Actually, p->colSeparator is used for
18876 ** the separator, which may or may not be a comma. p->nullValue is
18877 ** the null value. Strings are quoted if necessary. The separator
18878 ** is only issued if bSep is true.
18879 */
output_csv(ShellState * p,const char * z,int bSep)18880 static void output_csv(ShellState *p, const char *z, int bSep){
18881 if( z==0 ){
18882 oputf("%s",p->nullValue);
18883 }else{
18884 unsigned i;
18885 for(i=0; z[i]; i++){
18886 if( needCsvQuote[((unsigned char*)z)[i]] ){
18887 i = 0;
18888 break;
18889 }
18890 }
18891 if( i==0 || strstr(z, p->colSeparator)!=0 ){
18892 char *zQuoted = sqlite3_mprintf("\"%w\"", z);
18893 shell_check_oom(zQuoted);
18894 oputz(zQuoted);
18895 sqlite3_free(zQuoted);
18896 }else{
18897 oputz(z);
18898 }
18899 }
18900 if( bSep ){
18901 oputz(p->colSeparator);
18902 }
18903 }
18904
18905 /*
18906 ** This routine runs when the user presses Ctrl-C
18907 */
interrupt_handler(int NotUsed)18908 static void interrupt_handler(int NotUsed){
18909 UNUSED_PARAMETER(NotUsed);
18910 if( ++seenInterrupt>1 ) exit(1);
18911 if( globalDb ) sqlite3_interrupt(globalDb);
18912 }
18913
18914 #if (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE)
18915 /*
18916 ** This routine runs for console events (e.g. Ctrl-C) on Win32
18917 */
ConsoleCtrlHandler(DWORD dwCtrlType)18918 static BOOL WINAPI ConsoleCtrlHandler(
18919 DWORD dwCtrlType /* One of the CTRL_*_EVENT constants */
18920 ){
18921 if( dwCtrlType==CTRL_C_EVENT ){
18922 interrupt_handler(0);
18923 return TRUE;
18924 }
18925 return FALSE;
18926 }
18927 #endif
18928
18929 #ifndef SQLITE_OMIT_AUTHORIZATION
18930 /*
18931 ** This authorizer runs in safe mode.
18932 */
safeModeAuth(void * pClientData,int op,const char * zA1,const char * zA2,const char * zA3,const char * zA4)18933 static int safeModeAuth(
18934 void *pClientData,
18935 int op,
18936 const char *zA1,
18937 const char *zA2,
18938 const char *zA3,
18939 const char *zA4
18940 ){
18941 ShellState *p = (ShellState*)pClientData;
18942 static const char *azProhibitedFunctions[] = {
18943 "edit",
18944 "fts3_tokenizer",
18945 "load_extension",
18946 "readfile",
18947 "writefile",
18948 "zipfile",
18949 "zipfile_cds",
18950 };
18951 UNUSED_PARAMETER(zA1);
18952 UNUSED_PARAMETER(zA3);
18953 UNUSED_PARAMETER(zA4);
18954 switch( op ){
18955 case SQLITE_ATTACH: {
18956 #ifndef SQLITE_SHELL_FIDDLE
18957 /* In WASM builds the filesystem is a virtual sandbox, so
18958 ** there's no harm in using ATTACH. */
18959 failIfSafeMode(p, "cannot run ATTACH in safe mode");
18960 #endif
18961 break;
18962 }
18963 case SQLITE_FUNCTION: {
18964 int i;
18965 for(i=0; i<ArraySize(azProhibitedFunctions); i++){
18966 if( sqlite3_stricmp(zA2, azProhibitedFunctions[i])==0 ){
18967 failIfSafeMode(p, "cannot use the %s() function in safe mode",
18968 azProhibitedFunctions[i]);
18969 }
18970 }
18971 break;
18972 }
18973 }
18974 return SQLITE_OK;
18975 }
18976
18977 /*
18978 ** When the ".auth ON" is set, the following authorizer callback is
18979 ** invoked. It always returns SQLITE_OK.
18980 */
shellAuth(void * pClientData,int op,const char * zA1,const char * zA2,const char * zA3,const char * zA4)18981 static int shellAuth(
18982 void *pClientData,
18983 int op,
18984 const char *zA1,
18985 const char *zA2,
18986 const char *zA3,
18987 const char *zA4
18988 ){
18989 ShellState *p = (ShellState*)pClientData;
18990 static const char *azAction[] = { 0,
18991 "CREATE_INDEX", "CREATE_TABLE", "CREATE_TEMP_INDEX",
18992 "CREATE_TEMP_TABLE", "CREATE_TEMP_TRIGGER", "CREATE_TEMP_VIEW",
18993 "CREATE_TRIGGER", "CREATE_VIEW", "DELETE",
18994 "DROP_INDEX", "DROP_TABLE", "DROP_TEMP_INDEX",
18995 "DROP_TEMP_TABLE", "DROP_TEMP_TRIGGER", "DROP_TEMP_VIEW",
18996 "DROP_TRIGGER", "DROP_VIEW", "INSERT",
18997 "PRAGMA", "READ", "SELECT",
18998 "TRANSACTION", "UPDATE", "ATTACH",
18999 "DETACH", "ALTER_TABLE", "REINDEX",
19000 "ANALYZE", "CREATE_VTABLE", "DROP_VTABLE",
19001 "FUNCTION", "SAVEPOINT", "RECURSIVE"
19002 };
19003 int i;
19004 const char *az[4];
19005 az[0] = zA1;
19006 az[1] = zA2;
19007 az[2] = zA3;
19008 az[3] = zA4;
19009 oputf("authorizer: %s", azAction[op]);
19010 for(i=0; i<4; i++){
19011 oputz(" ");
19012 if( az[i] ){
19013 output_c_string(az[i]);
19014 }else{
19015 oputz("NULL");
19016 }
19017 }
19018 oputz("\n");
19019 if( p->bSafeMode ) (void)safeModeAuth(pClientData, op, zA1, zA2, zA3, zA4);
19020 return SQLITE_OK;
19021 }
19022 #endif
19023
19024 /*
19025 ** Print a schema statement. Part of MODE_Semi and MODE_Pretty output.
19026 **
19027 ** This routine converts some CREATE TABLE statements for shadow tables
19028 ** in FTS3/4/5 into CREATE TABLE IF NOT EXISTS statements.
19029 **
19030 ** If the schema statement in z[] contains a start-of-comment and if
19031 ** sqlite3_complete() returns false, try to terminate the comment before
19032 ** printing the result. https://sqlite.org/forum/forumpost/d7be961c5c
19033 */
printSchemaLine(const char * z,const char * zTail)19034 static void printSchemaLine(const char *z, const char *zTail){
19035 char *zToFree = 0;
19036 if( z==0 ) return;
19037 if( zTail==0 ) return;
19038 if( zTail[0]==';' && (strstr(z, "/*")!=0 || strstr(z,"--")!=0) ){
19039 const char *zOrig = z;
19040 static const char *azTerm[] = { "", "*/", "\n" };
19041 int i;
19042 for(i=0; i<ArraySize(azTerm); i++){
19043 char *zNew = sqlite3_mprintf("%s%s;", zOrig, azTerm[i]);
19044 shell_check_oom(zNew);
19045 if( sqlite3_complete(zNew) ){
19046 size_t n = strlen(zNew);
19047 zNew[n-1] = 0;
19048 zToFree = zNew;
19049 z = zNew;
19050 break;
19051 }
19052 sqlite3_free(zNew);
19053 }
19054 }
19055 if( sqlite3_strglob("CREATE TABLE ['\"]*", z)==0 ){
19056 oputf("CREATE TABLE IF NOT EXISTS %s%s", z+13, zTail);
19057 }else{
19058 oputf("%s%s", z, zTail);
19059 }
19060 sqlite3_free(zToFree);
19061 }
printSchemaLineN(char * z,int n,const char * zTail)19062 static void printSchemaLineN(char *z, int n, const char *zTail){
19063 char c = z[n];
19064 z[n] = 0;
19065 printSchemaLine(z, zTail);
19066 z[n] = c;
19067 }
19068
19069 /*
19070 ** Return true if string z[] has nothing but whitespace and comments to the
19071 ** end of the first line.
19072 */
wsToEol(const char * z)19073 static int wsToEol(const char *z){
19074 int i;
19075 for(i=0; z[i]; i++){
19076 if( z[i]=='\n' ) return 1;
19077 if( IsSpace(z[i]) ) continue;
19078 if( z[i]=='-' && z[i+1]=='-' ) return 1;
19079 return 0;
19080 }
19081 return 1;
19082 }
19083
19084 /*
19085 ** Add a new entry to the EXPLAIN QUERY PLAN data
19086 */
eqp_append(ShellState * p,int iEqpId,int p2,const char * zText)19087 static void eqp_append(ShellState *p, int iEqpId, int p2, const char *zText){
19088 EQPGraphRow *pNew;
19089 i64 nText;
19090 if( zText==0 ) return;
19091 nText = strlen(zText);
19092 if( p->autoEQPtest ){
19093 oputf("%d,%d,%s\n", iEqpId, p2, zText);
19094 }
19095 pNew = sqlite3_malloc64( sizeof(*pNew) + nText );
19096 shell_check_oom(pNew);
19097 pNew->iEqpId = iEqpId;
19098 pNew->iParentId = p2;
19099 memcpy(pNew->zText, zText, nText+1);
19100 pNew->pNext = 0;
19101 if( p->sGraph.pLast ){
19102 p->sGraph.pLast->pNext = pNew;
19103 }else{
19104 p->sGraph.pRow = pNew;
19105 }
19106 p->sGraph.pLast = pNew;
19107 }
19108
19109 /*
19110 ** Free and reset the EXPLAIN QUERY PLAN data that has been collected
19111 ** in p->sGraph.
19112 */
eqp_reset(ShellState * p)19113 static void eqp_reset(ShellState *p){
19114 EQPGraphRow *pRow, *pNext;
19115 for(pRow = p->sGraph.pRow; pRow; pRow = pNext){
19116 pNext = pRow->pNext;
19117 sqlite3_free(pRow);
19118 }
19119 memset(&p->sGraph, 0, sizeof(p->sGraph));
19120 }
19121
19122 /* Return the next EXPLAIN QUERY PLAN line with iEqpId that occurs after
19123 ** pOld, or return the first such line if pOld is NULL
19124 */
eqp_next_row(ShellState * p,int iEqpId,EQPGraphRow * pOld)19125 static EQPGraphRow *eqp_next_row(ShellState *p, int iEqpId, EQPGraphRow *pOld){
19126 EQPGraphRow *pRow = pOld ? pOld->pNext : p->sGraph.pRow;
19127 while( pRow && pRow->iParentId!=iEqpId ) pRow = pRow->pNext;
19128 return pRow;
19129 }
19130
19131 /* Render a single level of the graph that has iEqpId as its parent. Called
19132 ** recursively to render sublevels.
19133 */
eqp_render_level(ShellState * p,int iEqpId)19134 static void eqp_render_level(ShellState *p, int iEqpId){
19135 EQPGraphRow *pRow, *pNext;
19136 i64 n = strlen(p->sGraph.zPrefix);
19137 char *z;
19138 for(pRow = eqp_next_row(p, iEqpId, 0); pRow; pRow = pNext){
19139 pNext = eqp_next_row(p, iEqpId, pRow);
19140 z = pRow->zText;
19141 oputf("%s%s%s\n", p->sGraph.zPrefix, pNext ? "|--" : "`--", z);
19142 if( n<(i64)sizeof(p->sGraph.zPrefix)-7 ){
19143 memcpy(&p->sGraph.zPrefix[n], pNext ? "| " : " ", 4);
19144 eqp_render_level(p, pRow->iEqpId);
19145 p->sGraph.zPrefix[n] = 0;
19146 }
19147 }
19148 }
19149
19150 /*
19151 ** Display and reset the EXPLAIN QUERY PLAN data
19152 */
eqp_render(ShellState * p,i64 nCycle)19153 static void eqp_render(ShellState *p, i64 nCycle){
19154 EQPGraphRow *pRow = p->sGraph.pRow;
19155 if( pRow ){
19156 if( pRow->zText[0]=='-' ){
19157 if( pRow->pNext==0 ){
19158 eqp_reset(p);
19159 return;
19160 }
19161 oputf("%s\n", pRow->zText+3);
19162 p->sGraph.pRow = pRow->pNext;
19163 sqlite3_free(pRow);
19164 }else if( nCycle>0 ){
19165 oputf("QUERY PLAN (cycles=%lld [100%%])\n", nCycle);
19166 }else{
19167 oputz("QUERY PLAN\n");
19168 }
19169 p->sGraph.zPrefix[0] = 0;
19170 eqp_render_level(p, 0);
19171 eqp_reset(p);
19172 }
19173 }
19174
19175 #ifndef SQLITE_OMIT_PROGRESS_CALLBACK
19176 /*
19177 ** Progress handler callback.
19178 */
progress_handler(void * pClientData)19179 static int progress_handler(void *pClientData) {
19180 ShellState *p = (ShellState*)pClientData;
19181 p->nProgress++;
19182 if( p->nProgress>=p->mxProgress && p->mxProgress>0 ){
19183 oputf("Progress limit reached (%u)\n", p->nProgress);
19184 if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0;
19185 if( p->flgProgress & SHELL_PROGRESS_ONCE ) p->mxProgress = 0;
19186 return 1;
19187 }
19188 if( (p->flgProgress & SHELL_PROGRESS_QUIET)==0 ){
19189 oputf("Progress %u\n", p->nProgress);
19190 }
19191 return 0;
19192 }
19193 #endif /* SQLITE_OMIT_PROGRESS_CALLBACK */
19194
19195 /*
19196 ** Print N dashes
19197 */
print_dashes(int N)19198 static void print_dashes(int N){
19199 const char zDash[] = "--------------------------------------------------";
19200 const int nDash = sizeof(zDash) - 1;
19201 while( N>nDash ){
19202 oputz(zDash);
19203 N -= nDash;
19204 }
19205 oputf("%.*s", N, zDash);
19206 }
19207
19208 /*
19209 ** Print a markdown or table-style row separator using ascii-art
19210 */
print_row_separator(ShellState * p,int nArg,const char * zSep)19211 static void print_row_separator(
19212 ShellState *p,
19213 int nArg,
19214 const char *zSep
19215 ){
19216 int i;
19217 if( nArg>0 ){
19218 oputz(zSep);
19219 print_dashes(p->actualWidth[0]+2);
19220 for(i=1; i<nArg; i++){
19221 oputz(zSep);
19222 print_dashes(p->actualWidth[i]+2);
19223 }
19224 oputz(zSep);
19225 }
19226 oputz("\n");
19227 }
19228
19229 /*
19230 ** This is the callback routine that the shell
19231 ** invokes for each row of a query result.
19232 */
shell_callback(void * pArg,int nArg,char ** azArg,char ** azCol,int * aiType)19233 static int shell_callback(
19234 void *pArg,
19235 int nArg, /* Number of result columns */
19236 char **azArg, /* Text of each result column */
19237 char **azCol, /* Column names */
19238 int *aiType /* Column types. Might be NULL */
19239 ){
19240 int i;
19241 ShellState *p = (ShellState*)pArg;
19242
19243 if( azArg==0 ) return 0;
19244 switch( p->cMode ){
19245 case MODE_Count:
19246 case MODE_Off: {
19247 break;
19248 }
19249 case MODE_Line: {
19250 int w = 5;
19251 if( azArg==0 ) break;
19252 for(i=0; i<nArg; i++){
19253 int len = strlen30(azCol[i] ? azCol[i] : "");
19254 if( len>w ) w = len;
19255 }
19256 if( p->cnt++>0 ) oputz(p->rowSeparator);
19257 for(i=0; i<nArg; i++){
19258 oputf("%*s = %s%s", w, azCol[i],
19259 azArg[i] ? azArg[i] : p->nullValue, p->rowSeparator);
19260 }
19261 break;
19262 }
19263 case MODE_ScanExp:
19264 case MODE_Explain: {
19265 static const int aExplainWidth[] = {4, 13, 4, 4, 4, 13, 2, 13};
19266 static const int aExplainMap[] = {0, 1, 2, 3, 4, 5, 6, 7 };
19267 static const int aScanExpWidth[] = {4, 6, 6, 13, 4, 4, 4, 13, 2, 13};
19268 static const int aScanExpMap[] = {0, 9, 8, 1, 2, 3, 4, 5, 6, 7 };
19269
19270 const int *aWidth = aExplainWidth;
19271 const int *aMap = aExplainMap;
19272 int nWidth = ArraySize(aExplainWidth);
19273 int iIndent = 1;
19274
19275 if( p->cMode==MODE_ScanExp ){
19276 aWidth = aScanExpWidth;
19277 aMap = aScanExpMap;
19278 nWidth = ArraySize(aScanExpWidth);
19279 iIndent = 3;
19280 }
19281 if( nArg>nWidth ) nArg = nWidth;
19282
19283 /* If this is the first row seen, print out the headers */
19284 if( p->cnt++==0 ){
19285 for(i=0; i<nArg; i++){
19286 utf8_width_print(aWidth[i], azCol[ aMap[i] ]);
19287 oputz(i==nArg-1 ? "\n" : " ");
19288 }
19289 for(i=0; i<nArg; i++){
19290 print_dashes(aWidth[i]);
19291 oputz(i==nArg-1 ? "\n" : " ");
19292 }
19293 }
19294
19295 /* If there is no data, exit early. */
19296 if( azArg==0 ) break;
19297
19298 for(i=0; i<nArg; i++){
19299 const char *zSep = " ";
19300 int w = aWidth[i];
19301 const char *zVal = azArg[ aMap[i] ];
19302 if( i==nArg-1 ) w = 0;
19303 if( zVal && strlenChar(zVal)>w ){
19304 w = strlenChar(zVal);
19305 zSep = " ";
19306 }
19307 if( i==iIndent && p->aiIndent && p->pStmt ){
19308 if( p->iIndent<p->nIndent ){
19309 oputf("%*.s", p->aiIndent[p->iIndent], "");
19310 }
19311 p->iIndent++;
19312 }
19313 utf8_width_print(w, zVal ? zVal : p->nullValue);
19314 oputz(i==nArg-1 ? "\n" : zSep);
19315 }
19316 break;
19317 }
19318 case MODE_Semi: { /* .schema and .fullschema output */
19319 printSchemaLine(azArg[0], ";\n");
19320 break;
19321 }
19322 case MODE_Pretty: { /* .schema and .fullschema with --indent */
19323 char *z;
19324 int j;
19325 int nParen = 0;
19326 char cEnd = 0;
19327 char c;
19328 int nLine = 0;
19329 assert( nArg==1 );
19330 if( azArg[0]==0 ) break;
19331 if( sqlite3_strlike("CREATE VIEW%", azArg[0], 0)==0
19332 || sqlite3_strlike("CREATE TRIG%", azArg[0], 0)==0
19333 ){
19334 oputf("%s;\n", azArg[0]);
19335 break;
19336 }
19337 z = sqlite3_mprintf("%s", azArg[0]);
19338 shell_check_oom(z);
19339 j = 0;
19340 for(i=0; IsSpace(z[i]); i++){}
19341 for(; (c = z[i])!=0; i++){
19342 if( IsSpace(c) ){
19343 if( z[j-1]=='\r' ) z[j-1] = '\n';
19344 if( IsSpace(z[j-1]) || z[j-1]=='(' ) continue;
19345 }else if( (c=='(' || c==')') && j>0 && IsSpace(z[j-1]) ){
19346 j--;
19347 }
19348 z[j++] = c;
19349 }
19350 while( j>0 && IsSpace(z[j-1]) ){ j--; }
19351 z[j] = 0;
19352 if( strlen30(z)>=79 ){
19353 for(i=j=0; (c = z[i])!=0; i++){ /* Copy from z[i] back to z[j] */
19354 if( c==cEnd ){
19355 cEnd = 0;
19356 }else if( c=='"' || c=='\'' || c=='`' ){
19357 cEnd = c;
19358 }else if( c=='[' ){
19359 cEnd = ']';
19360 }else if( c=='-' && z[i+1]=='-' ){
19361 cEnd = '\n';
19362 }else if( c=='(' ){
19363 nParen++;
19364 }else if( c==')' ){
19365 nParen--;
19366 if( nLine>0 && nParen==0 && j>0 ){
19367 printSchemaLineN(z, j, "\n");
19368 j = 0;
19369 }
19370 }
19371 z[j++] = c;
19372 if( nParen==1 && cEnd==0
19373 && (c=='(' || c=='\n' || (c==',' && !wsToEol(z+i+1)))
19374 ){
19375 if( c=='\n' ) j--;
19376 printSchemaLineN(z, j, "\n ");
19377 j = 0;
19378 nLine++;
19379 while( IsSpace(z[i+1]) ){ i++; }
19380 }
19381 }
19382 z[j] = 0;
19383 }
19384 printSchemaLine(z, ";\n");
19385 sqlite3_free(z);
19386 break;
19387 }
19388 case MODE_List: {
19389 if( p->cnt++==0 && p->showHeader ){
19390 for(i=0; i<nArg; i++){
19391 oputf("%s%s",azCol[i], i==nArg-1 ? p->rowSeparator : p->colSeparator);
19392 }
19393 }
19394 if( azArg==0 ) break;
19395 for(i=0; i<nArg; i++){
19396 char *z = azArg[i];
19397 if( z==0 ) z = p->nullValue;
19398 oputz(z);
19399 oputz((i<nArg-1)? p->colSeparator : p->rowSeparator);
19400 }
19401 break;
19402 }
19403 case MODE_Html: {
19404 if( p->cnt++==0 && p->showHeader ){
19405 oputz("<TR>");
19406 for(i=0; i<nArg; i++){
19407 oputz("<TH>");
19408 output_html_string(azCol[i]);
19409 oputz("</TH>\n");
19410 }
19411 oputz("</TR>\n");
19412 }
19413 if( azArg==0 ) break;
19414 oputz("<TR>");
19415 for(i=0; i<nArg; i++){
19416 oputz("<TD>");
19417 output_html_string(azArg[i] ? azArg[i] : p->nullValue);
19418 oputz("</TD>\n");
19419 }
19420 oputz("</TR>\n");
19421 break;
19422 }
19423 case MODE_Tcl: {
19424 if( p->cnt++==0 && p->showHeader ){
19425 for(i=0; i<nArg; i++){
19426 output_c_string(azCol[i] ? azCol[i] : "");
19427 if(i<nArg-1) oputz(p->colSeparator);
19428 }
19429 oputz(p->rowSeparator);
19430 }
19431 if( azArg==0 ) break;
19432 for(i=0; i<nArg; i++){
19433 output_c_string(azArg[i] ? azArg[i] : p->nullValue);
19434 if(i<nArg-1) oputz(p->colSeparator);
19435 }
19436 oputz(p->rowSeparator);
19437 break;
19438 }
19439 case MODE_Csv: {
19440 setBinaryMode(p->out, 1);
19441 if( p->cnt++==0 && p->showHeader ){
19442 for(i=0; i<nArg; i++){
19443 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
19444 }
19445 oputz(p->rowSeparator);
19446 }
19447 if( nArg>0 ){
19448 for(i=0; i<nArg; i++){
19449 output_csv(p, azArg[i], i<nArg-1);
19450 }
19451 oputz(p->rowSeparator);
19452 }
19453 setTextMode(p->out, 1);
19454 break;
19455 }
19456 case MODE_Insert: {
19457 if( azArg==0 ) break;
19458 oputf("INSERT INTO %s",p->zDestTable);
19459 if( p->showHeader ){
19460 oputz("(");
19461 for(i=0; i<nArg; i++){
19462 if( i>0 ) oputz(",");
19463 if( quoteChar(azCol[i]) ){
19464 char *z = sqlite3_mprintf("\"%w\"", azCol[i]);
19465 shell_check_oom(z);
19466 oputz(z);
19467 sqlite3_free(z);
19468 }else{
19469 oputf("%s", azCol[i]);
19470 }
19471 }
19472 oputz(")");
19473 }
19474 p->cnt++;
19475 for(i=0; i<nArg; i++){
19476 oputz(i>0 ? "," : " VALUES(");
19477 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
19478 oputz("NULL");
19479 }else if( aiType && aiType[i]==SQLITE_TEXT ){
19480 if( ShellHasFlag(p, SHFLG_Newlines) ){
19481 output_quoted_string(azArg[i]);
19482 }else{
19483 output_quoted_escaped_string(azArg[i]);
19484 }
19485 }else if( aiType && aiType[i]==SQLITE_INTEGER ){
19486 oputz(azArg[i]);
19487 }else if( aiType && aiType[i]==SQLITE_FLOAT ){
19488 char z[50];
19489 double r = sqlite3_column_double(p->pStmt, i);
19490 sqlite3_uint64 ur;
19491 memcpy(&ur,&r,sizeof(r));
19492 if( ur==0x7ff0000000000000LL ){
19493 oputz("9.0e+999");
19494 }else if( ur==0xfff0000000000000LL ){
19495 oputz("-9.0e+999");
19496 }else{
19497 sqlite3_int64 ir = (sqlite3_int64)r;
19498 if( r==(double)ir ){
19499 sqlite3_snprintf(50,z,"%lld.0", ir);
19500 }else{
19501 sqlite3_snprintf(50,z,"%!.20g", r);
19502 }
19503 oputz(z);
19504 }
19505 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
19506 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
19507 int nBlob = sqlite3_column_bytes(p->pStmt, i);
19508 output_hex_blob(pBlob, nBlob);
19509 }else if( isNumber(azArg[i], 0) ){
19510 oputz(azArg[i]);
19511 }else if( ShellHasFlag(p, SHFLG_Newlines) ){
19512 output_quoted_string(azArg[i]);
19513 }else{
19514 output_quoted_escaped_string(azArg[i]);
19515 }
19516 }
19517 oputz(");\n");
19518 break;
19519 }
19520 case MODE_Json: {
19521 if( azArg==0 ) break;
19522 if( p->cnt==0 ){
19523 fputs("[{", p->out);
19524 }else{
19525 fputs(",\n{", p->out);
19526 }
19527 p->cnt++;
19528 for(i=0; i<nArg; i++){
19529 output_json_string(azCol[i], -1);
19530 oputz(":");
19531 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
19532 oputz("null");
19533 }else if( aiType && aiType[i]==SQLITE_FLOAT ){
19534 char z[50];
19535 double r = sqlite3_column_double(p->pStmt, i);
19536 sqlite3_uint64 ur;
19537 memcpy(&ur,&r,sizeof(r));
19538 if( ur==0x7ff0000000000000LL ){
19539 oputz("9.0e+999");
19540 }else if( ur==0xfff0000000000000LL ){
19541 oputz("-9.0e+999");
19542 }else{
19543 sqlite3_snprintf(50,z,"%!.20g", r);
19544 oputz(z);
19545 }
19546 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
19547 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
19548 int nBlob = sqlite3_column_bytes(p->pStmt, i);
19549 output_json_string(pBlob, nBlob);
19550 }else if( aiType && aiType[i]==SQLITE_TEXT ){
19551 output_json_string(azArg[i], -1);
19552 }else{
19553 oputz(azArg[i]);
19554 }
19555 if( i<nArg-1 ){
19556 oputz(",");
19557 }
19558 }
19559 oputz("}");
19560 break;
19561 }
19562 case MODE_Quote: {
19563 if( azArg==0 ) break;
19564 if( p->cnt==0 && p->showHeader ){
19565 for(i=0; i<nArg; i++){
19566 if( i>0 ) fputs(p->colSeparator, p->out);
19567 output_quoted_string(azCol[i]);
19568 }
19569 fputs(p->rowSeparator, p->out);
19570 }
19571 p->cnt++;
19572 for(i=0; i<nArg; i++){
19573 if( i>0 ) fputs(p->colSeparator, p->out);
19574 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
19575 oputz("NULL");
19576 }else if( aiType && aiType[i]==SQLITE_TEXT ){
19577 output_quoted_string(azArg[i]);
19578 }else if( aiType && aiType[i]==SQLITE_INTEGER ){
19579 oputz(azArg[i]);
19580 }else if( aiType && aiType[i]==SQLITE_FLOAT ){
19581 char z[50];
19582 double r = sqlite3_column_double(p->pStmt, i);
19583 sqlite3_snprintf(50,z,"%!.20g", r);
19584 oputz(z);
19585 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
19586 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
19587 int nBlob = sqlite3_column_bytes(p->pStmt, i);
19588 output_hex_blob(pBlob, nBlob);
19589 }else if( isNumber(azArg[i], 0) ){
19590 oputz(azArg[i]);
19591 }else{
19592 output_quoted_string(azArg[i]);
19593 }
19594 }
19595 fputs(p->rowSeparator, p->out);
19596 break;
19597 }
19598 case MODE_Ascii: {
19599 if( p->cnt++==0 && p->showHeader ){
19600 for(i=0; i<nArg; i++){
19601 if( i>0 ) oputz(p->colSeparator);
19602 oputz(azCol[i] ? azCol[i] : "");
19603 }
19604 oputz(p->rowSeparator);
19605 }
19606 if( azArg==0 ) break;
19607 for(i=0; i<nArg; i++){
19608 if( i>0 ) oputz(p->colSeparator);
19609 oputz(azArg[i] ? azArg[i] : p->nullValue);
19610 }
19611 oputz(p->rowSeparator);
19612 break;
19613 }
19614 case MODE_EQP: {
19615 eqp_append(p, atoi(azArg[0]), atoi(azArg[1]), azArg[3]);
19616 break;
19617 }
19618 }
19619 return 0;
19620 }
19621
19622 /*
19623 ** This is the callback routine that the SQLite library
19624 ** invokes for each row of a query result.
19625 */
callback(void * pArg,int nArg,char ** azArg,char ** azCol)19626 static int callback(void *pArg, int nArg, char **azArg, char **azCol){
19627 /* since we don't have type info, call the shell_callback with a NULL value */
19628 return shell_callback(pArg, nArg, azArg, azCol, NULL);
19629 }
19630
19631 /*
19632 ** This is the callback routine from sqlite3_exec() that appends all
19633 ** output onto the end of a ShellText object.
19634 */
captureOutputCallback(void * pArg,int nArg,char ** azArg,char ** az)19635 static int captureOutputCallback(void *pArg, int nArg, char **azArg, char **az){
19636 ShellText *p = (ShellText*)pArg;
19637 int i;
19638 UNUSED_PARAMETER(az);
19639 if( azArg==0 ) return 0;
19640 if( p->n ) appendText(p, "|", 0);
19641 for(i=0; i<nArg; i++){
19642 if( i ) appendText(p, ",", 0);
19643 if( azArg[i] ) appendText(p, azArg[i], 0);
19644 }
19645 return 0;
19646 }
19647
19648 /*
19649 ** Generate an appropriate SELFTEST table in the main database.
19650 */
createSelftestTable(ShellState * p)19651 static void createSelftestTable(ShellState *p){
19652 char *zErrMsg = 0;
19653 sqlite3_exec(p->db,
19654 "SAVEPOINT selftest_init;\n"
19655 "CREATE TABLE IF NOT EXISTS selftest(\n"
19656 " tno INTEGER PRIMARY KEY,\n" /* Test number */
19657 " op TEXT,\n" /* Operator: memo run */
19658 " cmd TEXT,\n" /* Command text */
19659 " ans TEXT\n" /* Desired answer */
19660 ");"
19661 "CREATE TEMP TABLE [_shell$self](op,cmd,ans);\n"
19662 "INSERT INTO [_shell$self](rowid,op,cmd)\n"
19663 " VALUES(coalesce((SELECT (max(tno)+100)/10 FROM selftest),10),\n"
19664 " 'memo','Tests generated by --init');\n"
19665 "INSERT INTO [_shell$self]\n"
19666 " SELECT 'run',\n"
19667 " 'SELECT hex(sha3_query(''SELECT type,name,tbl_name,sql "
19668 "FROM sqlite_schema ORDER BY 2'',224))',\n"
19669 " hex(sha3_query('SELECT type,name,tbl_name,sql "
19670 "FROM sqlite_schema ORDER BY 2',224));\n"
19671 "INSERT INTO [_shell$self]\n"
19672 " SELECT 'run',"
19673 " 'SELECT hex(sha3_query(''SELECT * FROM \"' ||"
19674 " printf('%w',name) || '\" NOT INDEXED'',224))',\n"
19675 " hex(sha3_query(printf('SELECT * FROM \"%w\" NOT INDEXED',name),224))\n"
19676 " FROM (\n"
19677 " SELECT name FROM sqlite_schema\n"
19678 " WHERE type='table'\n"
19679 " AND name<>'selftest'\n"
19680 " AND coalesce(rootpage,0)>0\n"
19681 " )\n"
19682 " ORDER BY name;\n"
19683 "INSERT INTO [_shell$self]\n"
19684 " VALUES('run','PRAGMA integrity_check','ok');\n"
19685 "INSERT INTO selftest(tno,op,cmd,ans)"
19686 " SELECT rowid*10,op,cmd,ans FROM [_shell$self];\n"
19687 "DROP TABLE [_shell$self];"
19688 ,0,0,&zErrMsg);
19689 if( zErrMsg ){
19690 eputf("SELFTEST initialization failure: %s\n", zErrMsg);
19691 sqlite3_free(zErrMsg);
19692 }
19693 sqlite3_exec(p->db, "RELEASE selftest_init",0,0,0);
19694 }
19695
19696
19697 /*
19698 ** Set the destination table field of the ShellState structure to
19699 ** the name of the table given. Escape any quote characters in the
19700 ** table name.
19701 */
set_table_name(ShellState * p,const char * zName)19702 static void set_table_name(ShellState *p, const char *zName){
19703 int i, n;
19704 char cQuote;
19705 char *z;
19706
19707 if( p->zDestTable ){
19708 free(p->zDestTable);
19709 p->zDestTable = 0;
19710 }
19711 if( zName==0 ) return;
19712 cQuote = quoteChar(zName);
19713 n = strlen30(zName);
19714 if( cQuote ) n += n+2;
19715 z = p->zDestTable = malloc( n+1 );
19716 shell_check_oom(z);
19717 n = 0;
19718 if( cQuote ) z[n++] = cQuote;
19719 for(i=0; zName[i]; i++){
19720 z[n++] = zName[i];
19721 if( zName[i]==cQuote ) z[n++] = cQuote;
19722 }
19723 if( cQuote ) z[n++] = cQuote;
19724 z[n] = 0;
19725 }
19726
19727 /*
19728 ** Maybe construct two lines of text that point out the position of a
19729 ** syntax error. Return a pointer to the text, in memory obtained from
19730 ** sqlite3_malloc(). Or, if the most recent error does not involve a
19731 ** specific token that we can point to, return an empty string.
19732 **
19733 ** In all cases, the memory returned is obtained from sqlite3_malloc64()
19734 ** and should be released by the caller invoking sqlite3_free().
19735 */
shell_error_context(const char * zSql,sqlite3 * db)19736 static char *shell_error_context(const char *zSql, sqlite3 *db){
19737 int iOffset;
19738 size_t len;
19739 char *zCode;
19740 char *zMsg;
19741 int i;
19742 if( db==0
19743 || zSql==0
19744 || (iOffset = sqlite3_error_offset(db))<0
19745 || iOffset>=(int)strlen(zSql)
19746 ){
19747 return sqlite3_mprintf("");
19748 }
19749 while( iOffset>50 ){
19750 iOffset--;
19751 zSql++;
19752 while( (zSql[0]&0xc0)==0x80 ){ zSql++; iOffset--; }
19753 }
19754 len = strlen(zSql);
19755 if( len>78 ){
19756 len = 78;
19757 while( len>0 && (zSql[len]&0xc0)==0x80 ) len--;
19758 }
19759 zCode = sqlite3_mprintf("%.*s", len, zSql);
19760 shell_check_oom(zCode);
19761 for(i=0; zCode[i]; i++){ if( IsSpace(zSql[i]) ) zCode[i] = ' '; }
19762 if( iOffset<25 ){
19763 zMsg = sqlite3_mprintf("\n %z\n %*s^--- error here", zCode,iOffset,"");
19764 }else{
19765 zMsg = sqlite3_mprintf("\n %z\n %*serror here ---^", zCode,iOffset-14,"");
19766 }
19767 return zMsg;
19768 }
19769
19770
19771 /*
19772 ** Execute a query statement that will generate SQL output. Print
19773 ** the result columns, comma-separated, on a line and then add a
19774 ** semicolon terminator to the end of that line.
19775 **
19776 ** If the number of columns is 1 and that column contains text "--"
19777 ** then write the semicolon on a separate line. That way, if a
19778 ** "--" comment occurs at the end of the statement, the comment
19779 ** won't consume the semicolon terminator.
19780 */
run_table_dump_query(ShellState * p,const char * zSelect)19781 static int run_table_dump_query(
19782 ShellState *p, /* Query context */
19783 const char *zSelect /* SELECT statement to extract content */
19784 ){
19785 sqlite3_stmt *pSelect;
19786 int rc;
19787 int nResult;
19788 int i;
19789 const char *z;
19790 rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0);
19791 if( rc!=SQLITE_OK || !pSelect ){
19792 char *zContext = shell_error_context(zSelect, p->db);
19793 oputf("/**** ERROR: (%d) %s *****/\n%s",
19794 rc, sqlite3_errmsg(p->db), zContext);
19795 sqlite3_free(zContext);
19796 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
19797 return rc;
19798 }
19799 rc = sqlite3_step(pSelect);
19800 nResult = sqlite3_column_count(pSelect);
19801 while( rc==SQLITE_ROW ){
19802 z = (const char*)sqlite3_column_text(pSelect, 0);
19803 oputf("%s", z);
19804 for(i=1; i<nResult; i++){
19805 oputf(",%s", sqlite3_column_text(pSelect, i));
19806 }
19807 if( z==0 ) z = "";
19808 while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
19809 if( z[0] ){
19810 oputz("\n;\n");
19811 }else{
19812 oputz(";\n");
19813 }
19814 rc = sqlite3_step(pSelect);
19815 }
19816 rc = sqlite3_finalize(pSelect);
19817 if( rc!=SQLITE_OK ){
19818 oputf("/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
19819 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
19820 }
19821 return rc;
19822 }
19823
19824 /*
19825 ** Allocate space and save off string indicating current error.
19826 */
save_err_msg(sqlite3 * db,const char * zPhase,int rc,const char * zSql)19827 static char *save_err_msg(
19828 sqlite3 *db, /* Database to query */
19829 const char *zPhase, /* When the error occurs */
19830 int rc, /* Error code returned from API */
19831 const char *zSql /* SQL string, or NULL */
19832 ){
19833 char *zErr;
19834 char *zContext;
19835 sqlite3_str *pStr = sqlite3_str_new(0);
19836 sqlite3_str_appendf(pStr, "%s, %s", zPhase, sqlite3_errmsg(db));
19837 if( rc>1 ){
19838 sqlite3_str_appendf(pStr, " (%d)", rc);
19839 }
19840 zContext = shell_error_context(zSql, db);
19841 if( zContext ){
19842 sqlite3_str_appendall(pStr, zContext);
19843 sqlite3_free(zContext);
19844 }
19845 zErr = sqlite3_str_finish(pStr);
19846 shell_check_oom(zErr);
19847 return zErr;
19848 }
19849
19850 #ifdef __linux__
19851 /*
19852 ** Attempt to display I/O stats on Linux using /proc/PID/io
19853 */
displayLinuxIoStats(void)19854 static void displayLinuxIoStats(void){
19855 FILE *in;
19856 char z[200];
19857 sqlite3_snprintf(sizeof(z), z, "/proc/%d/io", getpid());
19858 in = fopen(z, "rb");
19859 if( in==0 ) return;
19860 while( fgets(z, sizeof(z), in)!=0 ){
19861 static const struct {
19862 const char *zPattern;
19863 const char *zDesc;
19864 } aTrans[] = {
19865 { "rchar: ", "Bytes received by read():" },
19866 { "wchar: ", "Bytes sent to write():" },
19867 { "syscr: ", "Read() system calls:" },
19868 { "syscw: ", "Write() system calls:" },
19869 { "read_bytes: ", "Bytes read from storage:" },
19870 { "write_bytes: ", "Bytes written to storage:" },
19871 { "cancelled_write_bytes: ", "Cancelled write bytes:" },
19872 };
19873 int i;
19874 for(i=0; i<ArraySize(aTrans); i++){
19875 int n = strlen30(aTrans[i].zPattern);
19876 if( cli_strncmp(aTrans[i].zPattern, z, n)==0 ){
19877 oputf("%-36s %s", aTrans[i].zDesc, &z[n]);
19878 break;
19879 }
19880 }
19881 }
19882 fclose(in);
19883 }
19884 #endif
19885
19886 /*
19887 ** Display a single line of status using 64-bit values.
19888 */
displayStatLine(char * zLabel,char * zFormat,int iStatusCtrl,int bReset)19889 static void displayStatLine(
19890 char *zLabel, /* Label for this one line */
19891 char *zFormat, /* Format for the result */
19892 int iStatusCtrl, /* Which status to display */
19893 int bReset /* True to reset the stats */
19894 ){
19895 sqlite3_int64 iCur = -1;
19896 sqlite3_int64 iHiwtr = -1;
19897 int i, nPercent;
19898 char zLine[200];
19899 sqlite3_status64(iStatusCtrl, &iCur, &iHiwtr, bReset);
19900 for(i=0, nPercent=0; zFormat[i]; i++){
19901 if( zFormat[i]=='%' ) nPercent++;
19902 }
19903 if( nPercent>1 ){
19904 sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iCur, iHiwtr);
19905 }else{
19906 sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iHiwtr);
19907 }
19908 oputf("%-36s %s\n", zLabel, zLine);
19909 }
19910
19911 /*
19912 ** Display memory stats.
19913 */
display_stats(sqlite3 * db,ShellState * pArg,int bReset)19914 static int display_stats(
19915 sqlite3 *db, /* Database to query */
19916 ShellState *pArg, /* Pointer to ShellState */
19917 int bReset /* True to reset the stats */
19918 ){
19919 int iCur;
19920 int iHiwtr;
19921 if( pArg==0 || pArg->out==0 ) return 0;
19922
19923 if( pArg->pStmt && pArg->statsOn==2 ){
19924 int nCol, i, x;
19925 sqlite3_stmt *pStmt = pArg->pStmt;
19926 char z[100];
19927 nCol = sqlite3_column_count(pStmt);
19928 oputf("%-36s %d\n", "Number of output columns:", nCol);
19929 for(i=0; i<nCol; i++){
19930 sqlite3_snprintf(sizeof(z),z,"Column %d %nname:", i, &x);
19931 oputf("%-36s %s\n", z, sqlite3_column_name(pStmt,i));
19932 #ifndef SQLITE_OMIT_DECLTYPE
19933 sqlite3_snprintf(30, z+x, "declared type:");
19934 oputf("%-36s %s\n", z, sqlite3_column_decltype(pStmt, i));
19935 #endif
19936 #ifdef SQLITE_ENABLE_COLUMN_METADATA
19937 sqlite3_snprintf(30, z+x, "database name:");
19938 oputf("%-36s %s\n", z, sqlite3_column_database_name(pStmt,i));
19939 sqlite3_snprintf(30, z+x, "table name:");
19940 oputf("%-36s %s\n", z, sqlite3_column_table_name(pStmt,i));
19941 sqlite3_snprintf(30, z+x, "origin name:");
19942 oputf("%-36s %s\n", z, sqlite3_column_origin_name(pStmt,i));
19943 #endif
19944 }
19945 }
19946
19947 if( pArg->statsOn==3 ){
19948 if( pArg->pStmt ){
19949 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP,bReset);
19950 oputf("VM-steps: %d\n", iCur);
19951 }
19952 return 0;
19953 }
19954
19955 displayStatLine("Memory Used:",
19956 "%lld (max %lld) bytes", SQLITE_STATUS_MEMORY_USED, bReset);
19957 displayStatLine("Number of Outstanding Allocations:",
19958 "%lld (max %lld)", SQLITE_STATUS_MALLOC_COUNT, bReset);
19959 if( pArg->shellFlgs & SHFLG_Pagecache ){
19960 displayStatLine("Number of Pcache Pages Used:",
19961 "%lld (max %lld) pages", SQLITE_STATUS_PAGECACHE_USED, bReset);
19962 }
19963 displayStatLine("Number of Pcache Overflow Bytes:",
19964 "%lld (max %lld) bytes", SQLITE_STATUS_PAGECACHE_OVERFLOW, bReset);
19965 displayStatLine("Largest Allocation:",
19966 "%lld bytes", SQLITE_STATUS_MALLOC_SIZE, bReset);
19967 displayStatLine("Largest Pcache Allocation:",
19968 "%lld bytes", SQLITE_STATUS_PAGECACHE_SIZE, bReset);
19969 #ifdef YYTRACKMAXSTACKDEPTH
19970 displayStatLine("Deepest Parser Stack:",
19971 "%lld (max %lld)", SQLITE_STATUS_PARSER_STACK, bReset);
19972 #endif
19973
19974 if( db ){
19975 if( pArg->shellFlgs & SHFLG_Lookaside ){
19976 iHiwtr = iCur = -1;
19977 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED,
19978 &iCur, &iHiwtr, bReset);
19979 oputf("Lookaside Slots Used: %d (max %d)\n", iCur, iHiwtr);
19980 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT,
19981 &iCur, &iHiwtr, bReset);
19982 oputf("Successful lookaside attempts: %d\n", iHiwtr);
19983 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE,
19984 &iCur, &iHiwtr, bReset);
19985 oputf("Lookaside failures due to size: %d\n", iHiwtr);
19986 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL,
19987 &iCur, &iHiwtr, bReset);
19988 oputf("Lookaside failures due to OOM: %d\n", iHiwtr);
19989 }
19990 iHiwtr = iCur = -1;
19991 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
19992 oputf("Pager Heap Usage: %d bytes\n", iCur);
19993 iHiwtr = iCur = -1;
19994 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
19995 oputf("Page cache hits: %d\n", iCur);
19996 iHiwtr = iCur = -1;
19997 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
19998 oputf("Page cache misses: %d\n", iCur);
19999 iHiwtr = iCur = -1;
20000 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
20001 oputf("Page cache writes: %d\n", iCur);
20002 iHiwtr = iCur = -1;
20003 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_SPILL, &iCur, &iHiwtr, 1);
20004 oputf("Page cache spills: %d\n", iCur);
20005 iHiwtr = iCur = -1;
20006 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
20007 oputf("Schema Heap Usage: %d bytes\n", iCur);
20008 iHiwtr = iCur = -1;
20009 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
20010 oputf("Statement Heap/Lookaside Usage: %d bytes\n", iCur);
20011 }
20012
20013 if( pArg->pStmt ){
20014 int iHit, iMiss;
20015 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP,
20016 bReset);
20017 oputf("Fullscan Steps: %d\n", iCur);
20018 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
20019 oputf("Sort Operations: %d\n", iCur);
20020 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX,bReset);
20021 oputf("Autoindex Inserts: %d\n", iCur);
20022 iHit = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FILTER_HIT,
20023 bReset);
20024 iMiss = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FILTER_MISS,
20025 bReset);
20026 if( iHit || iMiss ){
20027 oputf("Bloom filter bypass taken: %d/%d\n", iHit, iHit+iMiss);
20028 }
20029 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
20030 oputf("Virtual Machine Steps: %d\n", iCur);
20031 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_REPREPARE,bReset);
20032 oputf("Reprepare operations: %d\n", iCur);
20033 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_RUN, bReset);
20034 oputf("Number of times run: %d\n", iCur);
20035 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_MEMUSED, bReset);
20036 oputf("Memory used by prepared stmt: %d\n", iCur);
20037 }
20038
20039 #ifdef __linux__
20040 displayLinuxIoStats();
20041 #endif
20042
20043 /* Do not remove this machine readable comment: extra-stats-output-here */
20044
20045 return 0;
20046 }
20047
20048
20049 #ifdef SQLITE_ENABLE_STMT_SCANSTATUS
scanStatsHeight(sqlite3_stmt * p,int iEntry)20050 static int scanStatsHeight(sqlite3_stmt *p, int iEntry){
20051 int iPid = 0;
20052 int ret = 1;
20053 sqlite3_stmt_scanstatus_v2(p, iEntry,
20054 SQLITE_SCANSTAT_SELECTID, SQLITE_SCANSTAT_COMPLEX, (void*)&iPid
20055 );
20056 while( iPid!=0 ){
20057 int ii;
20058 for(ii=0; 1; ii++){
20059 int iId;
20060 int res;
20061 res = sqlite3_stmt_scanstatus_v2(p, ii,
20062 SQLITE_SCANSTAT_SELECTID, SQLITE_SCANSTAT_COMPLEX, (void*)&iId
20063 );
20064 if( res ) break;
20065 if( iId==iPid ){
20066 sqlite3_stmt_scanstatus_v2(p, ii,
20067 SQLITE_SCANSTAT_PARENTID, SQLITE_SCANSTAT_COMPLEX, (void*)&iPid
20068 );
20069 }
20070 }
20071 ret++;
20072 }
20073 return ret;
20074 }
20075 #endif
20076
20077 #ifdef SQLITE_ENABLE_STMT_SCANSTATUS
display_explain_scanstats(sqlite3 * db,ShellState * pArg)20078 static void display_explain_scanstats(
20079 sqlite3 *db, /* Database to query */
20080 ShellState *pArg /* Pointer to ShellState */
20081 ){
20082 static const int f = SQLITE_SCANSTAT_COMPLEX;
20083 sqlite3_stmt *p = pArg->pStmt;
20084 int ii = 0;
20085 i64 nTotal = 0;
20086 int nWidth = 0;
20087 eqp_reset(pArg);
20088
20089 for(ii=0; 1; ii++){
20090 const char *z = 0;
20091 int n = 0;
20092 if( sqlite3_stmt_scanstatus_v2(p,ii,SQLITE_SCANSTAT_EXPLAIN,f,(void*)&z) ){
20093 break;
20094 }
20095 n = (int)strlen(z) + scanStatsHeight(p, ii)*3;
20096 if( n>nWidth ) nWidth = n;
20097 }
20098 nWidth += 4;
20099
20100 sqlite3_stmt_scanstatus_v2(p, -1, SQLITE_SCANSTAT_NCYCLE, f, (void*)&nTotal);
20101 for(ii=0; 1; ii++){
20102 i64 nLoop = 0;
20103 i64 nRow = 0;
20104 i64 nCycle = 0;
20105 int iId = 0;
20106 int iPid = 0;
20107 const char *zo = 0;
20108 const char *zName = 0;
20109 char *zText = 0;
20110 double rEst = 0.0;
20111
20112 if( sqlite3_stmt_scanstatus_v2(p,ii,SQLITE_SCANSTAT_EXPLAIN,f,(void*)&zo) ){
20113 break;
20114 }
20115 sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_EST,f,(void*)&rEst);
20116 sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_NLOOP,f,(void*)&nLoop);
20117 sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_NVISIT,f,(void*)&nRow);
20118 sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_NCYCLE,f,(void*)&nCycle);
20119 sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_SELECTID,f,(void*)&iId);
20120 sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_PARENTID,f,(void*)&iPid);
20121 sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_NAME,f,(void*)&zName);
20122
20123 zText = sqlite3_mprintf("%s", zo);
20124 if( nCycle>=0 || nLoop>=0 || nRow>=0 ){
20125 char *z = 0;
20126 if( nCycle>=0 && nTotal>0 ){
20127 z = sqlite3_mprintf("%zcycles=%lld [%d%%]", z,
20128 nCycle, ((nCycle*100)+nTotal/2) / nTotal
20129 );
20130 }
20131 if( nLoop>=0 ){
20132 z = sqlite3_mprintf("%z%sloops=%lld", z, z ? " " : "", nLoop);
20133 }
20134 if( nRow>=0 ){
20135 z = sqlite3_mprintf("%z%srows=%lld", z, z ? " " : "", nRow);
20136 }
20137
20138 if( zName && pArg->scanstatsOn>1 ){
20139 double rpl = (double)nRow / (double)nLoop;
20140 z = sqlite3_mprintf("%z rpl=%.1f est=%.1f", z, rpl, rEst);
20141 }
20142
20143 zText = sqlite3_mprintf(
20144 "% *z (%z)", -1*(nWidth-scanStatsHeight(p, ii)*3), zText, z
20145 );
20146 }
20147
20148 eqp_append(pArg, iId, iPid, zText);
20149 sqlite3_free(zText);
20150 }
20151
20152 eqp_render(pArg, nTotal);
20153 }
20154 #endif
20155
20156
20157 /*
20158 ** Parameter azArray points to a zero-terminated array of strings. zStr
20159 ** points to a single nul-terminated string. Return non-zero if zStr
20160 ** is equal, according to strcmp(), to any of the strings in the array.
20161 ** Otherwise, return zero.
20162 */
str_in_array(const char * zStr,const char ** azArray)20163 static int str_in_array(const char *zStr, const char **azArray){
20164 int i;
20165 for(i=0; azArray[i]; i++){
20166 if( 0==cli_strcmp(zStr, azArray[i]) ) return 1;
20167 }
20168 return 0;
20169 }
20170
20171 /*
20172 ** If compiled statement pSql appears to be an EXPLAIN statement, allocate
20173 ** and populate the ShellState.aiIndent[] array with the number of
20174 ** spaces each opcode should be indented before it is output.
20175 **
20176 ** The indenting rules are:
20177 **
20178 ** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
20179 ** all opcodes that occur between the p2 jump destination and the opcode
20180 ** itself by 2 spaces.
20181 **
20182 ** * Do the previous for "Return" instructions for when P2 is positive.
20183 ** See tag-20220407a in wherecode.c and vdbe.c.
20184 **
20185 ** * For each "Goto", if the jump destination is earlier in the program
20186 ** and ends on one of:
20187 ** Yield SeekGt SeekLt RowSetRead Rewind
20188 ** or if the P1 parameter is one instead of zero,
20189 ** then indent all opcodes between the earlier instruction
20190 ** and "Goto" by 2 spaces.
20191 */
explain_data_prepare(ShellState * p,sqlite3_stmt * pSql)20192 static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){
20193 int *abYield = 0; /* True if op is an OP_Yield */
20194 int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */
20195 int iOp; /* Index of operation in p->aiIndent[] */
20196
20197 const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext",
20198 "Return", 0 };
20199 const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead",
20200 "Rewind", 0 };
20201 const char *azGoto[] = { "Goto", 0 };
20202
20203 /* The caller guarantees that the leftmost 4 columns of the statement
20204 ** passed to this function are equivalent to the leftmost 4 columns
20205 ** of EXPLAIN statement output. In practice the statement may be
20206 ** an EXPLAIN, or it may be a query on the bytecode() virtual table. */
20207 assert( sqlite3_column_count(pSql)>=4 );
20208 assert( 0==sqlite3_stricmp( sqlite3_column_name(pSql, 0), "addr" ) );
20209 assert( 0==sqlite3_stricmp( sqlite3_column_name(pSql, 1), "opcode" ) );
20210 assert( 0==sqlite3_stricmp( sqlite3_column_name(pSql, 2), "p1" ) );
20211 assert( 0==sqlite3_stricmp( sqlite3_column_name(pSql, 3), "p2" ) );
20212
20213 for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
20214 int i;
20215 int iAddr = sqlite3_column_int(pSql, 0);
20216 const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
20217 int p1 = sqlite3_column_int(pSql, 2);
20218 int p2 = sqlite3_column_int(pSql, 3);
20219
20220 /* Assuming that p2 is an instruction address, set variable p2op to the
20221 ** index of that instruction in the aiIndent[] array. p2 and p2op may be
20222 ** different if the current instruction is part of a sub-program generated
20223 ** by an SQL trigger or foreign key. */
20224 int p2op = (p2 + (iOp-iAddr));
20225
20226 /* Grow the p->aiIndent array as required */
20227 if( iOp>=nAlloc ){
20228 nAlloc += 100;
20229 p->aiIndent = (int*)sqlite3_realloc64(p->aiIndent, nAlloc*sizeof(int));
20230 shell_check_oom(p->aiIndent);
20231 abYield = (int*)sqlite3_realloc64(abYield, nAlloc*sizeof(int));
20232 shell_check_oom(abYield);
20233 }
20234
20235 abYield[iOp] = str_in_array(zOp, azYield);
20236 p->aiIndent[iOp] = 0;
20237 p->nIndent = iOp+1;
20238 if( str_in_array(zOp, azNext) && p2op>0 ){
20239 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
20240 }
20241 if( str_in_array(zOp, azGoto) && p2op<iOp && (abYield[p2op] || p1) ){
20242 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
20243 }
20244 }
20245
20246 p->iIndent = 0;
20247 sqlite3_free(abYield);
20248 sqlite3_reset(pSql);
20249 }
20250
20251 /*
20252 ** Free the array allocated by explain_data_prepare().
20253 */
explain_data_delete(ShellState * p)20254 static void explain_data_delete(ShellState *p){
20255 sqlite3_free(p->aiIndent);
20256 p->aiIndent = 0;
20257 p->nIndent = 0;
20258 p->iIndent = 0;
20259 }
20260
20261 static void exec_prepared_stmt(ShellState*, sqlite3_stmt*);
20262
20263 /*
20264 ** Display scan stats.
20265 */
display_scanstats(sqlite3 * db,ShellState * pArg)20266 static void display_scanstats(
20267 sqlite3 *db, /* Database to query */
20268 ShellState *pArg /* Pointer to ShellState */
20269 ){
20270 #ifndef SQLITE_ENABLE_STMT_SCANSTATUS
20271 UNUSED_PARAMETER(db);
20272 UNUSED_PARAMETER(pArg);
20273 #else
20274 if( pArg->scanstatsOn==3 ){
20275 const char *zSql =
20276 " SELECT addr, opcode, p1, p2, p3, p4, p5, comment, nexec,"
20277 " round(ncycle*100.0 / (sum(ncycle) OVER ()), 2)||'%' AS cycles"
20278 " FROM bytecode(?)";
20279
20280 int rc = SQLITE_OK;
20281 sqlite3_stmt *pStmt = 0;
20282 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
20283 if( rc==SQLITE_OK ){
20284 sqlite3_stmt *pSave = pArg->pStmt;
20285 pArg->pStmt = pStmt;
20286 sqlite3_bind_pointer(pStmt, 1, pSave, "stmt-pointer", 0);
20287
20288 pArg->cnt = 0;
20289 pArg->cMode = MODE_ScanExp;
20290 explain_data_prepare(pArg, pStmt);
20291 exec_prepared_stmt(pArg, pStmt);
20292 explain_data_delete(pArg);
20293
20294 sqlite3_finalize(pStmt);
20295 pArg->pStmt = pSave;
20296 }
20297 }else{
20298 display_explain_scanstats(db, pArg);
20299 }
20300 #endif
20301 }
20302
20303 /*
20304 ** Disable and restore .wheretrace and .treetrace/.selecttrace settings.
20305 */
20306 static unsigned int savedSelectTrace;
20307 static unsigned int savedWhereTrace;
disable_debug_trace_modes(void)20308 static void disable_debug_trace_modes(void){
20309 unsigned int zero = 0;
20310 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 0, &savedSelectTrace);
20311 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &zero);
20312 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 2, &savedWhereTrace);
20313 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &zero);
20314 }
restore_debug_trace_modes(void)20315 static void restore_debug_trace_modes(void){
20316 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &savedSelectTrace);
20317 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &savedWhereTrace);
20318 }
20319
20320 /* Create the TEMP table used to store parameter bindings */
bind_table_init(ShellState * p)20321 static void bind_table_init(ShellState *p){
20322 int wrSchema = 0;
20323 int defensiveMode = 0;
20324 sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, -1, &defensiveMode);
20325 sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, 0, 0);
20326 sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, -1, &wrSchema);
20327 sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, 1, 0);
20328 sqlite3_exec(p->db,
20329 "CREATE TABLE IF NOT EXISTS temp.sqlite_parameters(\n"
20330 " key TEXT PRIMARY KEY,\n"
20331 " value\n"
20332 ") WITHOUT ROWID;",
20333 0, 0, 0);
20334 sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, wrSchema, 0);
20335 sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, defensiveMode, 0);
20336 }
20337
20338 /*
20339 ** Bind parameters on a prepared statement.
20340 **
20341 ** Parameter bindings are taken from a TEMP table of the form:
20342 **
20343 ** CREATE TEMP TABLE sqlite_parameters(key TEXT PRIMARY KEY, value)
20344 ** WITHOUT ROWID;
20345 **
20346 ** No bindings occur if this table does not exist. The name of the table
20347 ** begins with "sqlite_" so that it will not collide with ordinary application
20348 ** tables. The table must be in the TEMP schema.
20349 */
bind_prepared_stmt(ShellState * pArg,sqlite3_stmt * pStmt)20350 static void bind_prepared_stmt(ShellState *pArg, sqlite3_stmt *pStmt){
20351 int nVar;
20352 int i;
20353 int rc;
20354 sqlite3_stmt *pQ = 0;
20355
20356 nVar = sqlite3_bind_parameter_count(pStmt);
20357 if( nVar==0 ) return; /* Nothing to do */
20358 if( sqlite3_table_column_metadata(pArg->db, "TEMP", "sqlite_parameters",
20359 "key", 0, 0, 0, 0, 0)!=SQLITE_OK ){
20360 rc = SQLITE_NOTFOUND;
20361 pQ = 0;
20362 }else{
20363 rc = sqlite3_prepare_v2(pArg->db,
20364 "SELECT value FROM temp.sqlite_parameters"
20365 " WHERE key=?1", -1, &pQ, 0);
20366 }
20367 for(i=1; i<=nVar; i++){
20368 char zNum[30];
20369 const char *zVar = sqlite3_bind_parameter_name(pStmt, i);
20370 if( zVar==0 ){
20371 sqlite3_snprintf(sizeof(zNum),zNum,"?%d",i);
20372 zVar = zNum;
20373 }
20374 sqlite3_bind_text(pQ, 1, zVar, -1, SQLITE_STATIC);
20375 if( rc==SQLITE_OK && pQ && sqlite3_step(pQ)==SQLITE_ROW ){
20376 sqlite3_bind_value(pStmt, i, sqlite3_column_value(pQ, 0));
20377 #ifdef NAN
20378 }else if( sqlite3_strlike("_NAN", zVar, 0)==0 ){
20379 sqlite3_bind_double(pStmt, i, NAN);
20380 #endif
20381 #ifdef INFINITY
20382 }else if( sqlite3_strlike("_INF", zVar, 0)==0 ){
20383 sqlite3_bind_double(pStmt, i, INFINITY);
20384 #endif
20385 }else{
20386 sqlite3_bind_null(pStmt, i);
20387 }
20388 sqlite3_reset(pQ);
20389 }
20390 sqlite3_finalize(pQ);
20391 }
20392
20393 /*
20394 ** UTF8 box-drawing characters. Imagine box lines like this:
20395 **
20396 ** 1
20397 ** |
20398 ** 4 --+-- 2
20399 ** |
20400 ** 3
20401 **
20402 ** Each box characters has between 2 and 4 of the lines leading from
20403 ** the center. The characters are here identified by the numbers of
20404 ** their corresponding lines.
20405 */
20406 #define BOX_24 "\342\224\200" /* U+2500 --- */
20407 #define BOX_13 "\342\224\202" /* U+2502 | */
20408 #define BOX_23 "\342\224\214" /* U+250c ,- */
20409 #define BOX_34 "\342\224\220" /* U+2510 -, */
20410 #define BOX_12 "\342\224\224" /* U+2514 '- */
20411 #define BOX_14 "\342\224\230" /* U+2518 -' */
20412 #define BOX_123 "\342\224\234" /* U+251c |- */
20413 #define BOX_134 "\342\224\244" /* U+2524 -| */
20414 #define BOX_234 "\342\224\254" /* U+252c -,- */
20415 #define BOX_124 "\342\224\264" /* U+2534 -'- */
20416 #define BOX_1234 "\342\224\274" /* U+253c -|- */
20417
20418 /* Draw horizontal line N characters long using unicode box
20419 ** characters
20420 */
print_box_line(int N)20421 static void print_box_line(int N){
20422 const char zDash[] =
20423 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24
20424 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24;
20425 const int nDash = sizeof(zDash) - 1;
20426 N *= 3;
20427 while( N>nDash ){
20428 oputz(zDash);
20429 N -= nDash;
20430 }
20431 oputf("%.*s", N, zDash);
20432 }
20433
20434 /*
20435 ** Draw a horizontal separator for a MODE_Box table.
20436 */
print_box_row_separator(ShellState * p,int nArg,const char * zSep1,const char * zSep2,const char * zSep3)20437 static void print_box_row_separator(
20438 ShellState *p,
20439 int nArg,
20440 const char *zSep1,
20441 const char *zSep2,
20442 const char *zSep3
20443 ){
20444 int i;
20445 if( nArg>0 ){
20446 oputz(zSep1);
20447 print_box_line(p->actualWidth[0]+2);
20448 for(i=1; i<nArg; i++){
20449 oputz(zSep2);
20450 print_box_line(p->actualWidth[i]+2);
20451 }
20452 oputz(zSep3);
20453 }
20454 oputz("\n");
20455 }
20456
20457 /*
20458 ** z[] is a line of text that is to be displayed the .mode box or table or
20459 ** similar tabular formats. z[] might contain control characters such
20460 ** as \n, \t, \f, or \r.
20461 **
20462 ** Compute characters to display on the first line of z[]. Stop at the
20463 ** first \r, \n, or \f. Expand \t into spaces. Return a copy (obtained
20464 ** from malloc()) of that first line, which caller should free sometime.
20465 ** Write anything to display on the next line into *pzTail. If this is
20466 ** the last line, write a NULL into *pzTail. (*pzTail is not allocated.)
20467 */
translateForDisplayAndDup(const unsigned char * z,const unsigned char ** pzTail,int mxWidth,u8 bWordWrap)20468 static char *translateForDisplayAndDup(
20469 const unsigned char *z, /* Input text to be transformed */
20470 const unsigned char **pzTail, /* OUT: Tail of the input for next line */
20471 int mxWidth, /* Max width. 0 means no limit */
20472 u8 bWordWrap /* If true, avoid breaking mid-word */
20473 ){
20474 int i; /* Input bytes consumed */
20475 int j; /* Output bytes generated */
20476 int k; /* Input bytes to be displayed */
20477 int n; /* Output column number */
20478 unsigned char *zOut; /* Output text */
20479
20480 if( z==0 ){
20481 *pzTail = 0;
20482 return 0;
20483 }
20484 if( mxWidth<0 ) mxWidth = -mxWidth;
20485 if( mxWidth==0 ) mxWidth = 1000000;
20486 i = j = n = 0;
20487 while( n<mxWidth ){
20488 if( z[i]>=' ' ){
20489 n++;
20490 do{ i++; j++; }while( (z[i]&0xc0)==0x80 );
20491 continue;
20492 }
20493 if( z[i]=='\t' ){
20494 do{
20495 n++;
20496 j++;
20497 }while( (n&7)!=0 && n<mxWidth );
20498 i++;
20499 continue;
20500 }
20501 break;
20502 }
20503 if( n>=mxWidth && bWordWrap ){
20504 /* Perhaps try to back up to a better place to break the line */
20505 for(k=i; k>i/2; k--){
20506 if( isspace(z[k-1]) ) break;
20507 }
20508 if( k<=i/2 ){
20509 for(k=i; k>i/2; k--){
20510 if( isalnum(z[k-1])!=isalnum(z[k]) && (z[k]&0xc0)!=0x80 ) break;
20511 }
20512 }
20513 if( k<=i/2 ){
20514 k = i;
20515 }else{
20516 i = k;
20517 while( z[i]==' ' ) i++;
20518 }
20519 }else{
20520 k = i;
20521 }
20522 if( n>=mxWidth && z[i]>=' ' ){
20523 *pzTail = &z[i];
20524 }else if( z[i]=='\r' && z[i+1]=='\n' ){
20525 *pzTail = z[i+2] ? &z[i+2] : 0;
20526 }else if( z[i]==0 || z[i+1]==0 ){
20527 *pzTail = 0;
20528 }else{
20529 *pzTail = &z[i+1];
20530 }
20531 zOut = malloc( j+1 );
20532 shell_check_oom(zOut);
20533 i = j = n = 0;
20534 while( i<k ){
20535 if( z[i]>=' ' ){
20536 n++;
20537 do{ zOut[j++] = z[i++]; }while( (z[i]&0xc0)==0x80 );
20538 continue;
20539 }
20540 if( z[i]=='\t' ){
20541 do{
20542 n++;
20543 zOut[j++] = ' ';
20544 }while( (n&7)!=0 && n<mxWidth );
20545 i++;
20546 continue;
20547 }
20548 break;
20549 }
20550 zOut[j] = 0;
20551 return (char*)zOut;
20552 }
20553
20554 /* Extract the value of the i-th current column for pStmt as an SQL literal
20555 ** value. Memory is obtained from sqlite3_malloc64() and must be freed by
20556 ** the caller.
20557 */
quoted_column(sqlite3_stmt * pStmt,int i)20558 static char *quoted_column(sqlite3_stmt *pStmt, int i){
20559 switch( sqlite3_column_type(pStmt, i) ){
20560 case SQLITE_NULL: {
20561 return sqlite3_mprintf("NULL");
20562 }
20563 case SQLITE_INTEGER:
20564 case SQLITE_FLOAT: {
20565 return sqlite3_mprintf("%s",sqlite3_column_text(pStmt,i));
20566 }
20567 case SQLITE_TEXT: {
20568 return sqlite3_mprintf("%Q",sqlite3_column_text(pStmt,i));
20569 }
20570 case SQLITE_BLOB: {
20571 int j;
20572 sqlite3_str *pStr = sqlite3_str_new(0);
20573 const unsigned char *a = sqlite3_column_blob(pStmt,i);
20574 int n = sqlite3_column_bytes(pStmt,i);
20575 sqlite3_str_append(pStr, "x'", 2);
20576 for(j=0; j<n; j++){
20577 sqlite3_str_appendf(pStr, "%02x", a[j]);
20578 }
20579 sqlite3_str_append(pStr, "'", 1);
20580 return sqlite3_str_finish(pStr);
20581 }
20582 }
20583 return 0; /* Not reached */
20584 }
20585
20586 /*
20587 ** Run a prepared statement and output the result in one of the
20588 ** table-oriented formats: MODE_Column, MODE_Markdown, MODE_Table,
20589 ** or MODE_Box.
20590 **
20591 ** This is different from ordinary exec_prepared_stmt() in that
20592 ** it has to run the entire query and gather the results into memory
20593 ** first, in order to determine column widths, before providing
20594 ** any output.
20595 */
exec_prepared_stmt_columnar(ShellState * p,sqlite3_stmt * pStmt)20596 static void exec_prepared_stmt_columnar(
20597 ShellState *p, /* Pointer to ShellState */
20598 sqlite3_stmt *pStmt /* Statement to run */
20599 ){
20600 sqlite3_int64 nRow = 0;
20601 int nColumn = 0;
20602 char **azData = 0;
20603 sqlite3_int64 nAlloc = 0;
20604 char *abRowDiv = 0;
20605 const unsigned char *uz;
20606 const char *z;
20607 char **azQuoted = 0;
20608 int rc;
20609 sqlite3_int64 i, nData;
20610 int j, nTotal, w, n;
20611 const char *colSep = 0;
20612 const char *rowSep = 0;
20613 const unsigned char **azNextLine = 0;
20614 int bNextLine = 0;
20615 int bMultiLineRowExists = 0;
20616 int bw = p->cmOpts.bWordWrap;
20617 const char *zEmpty = "";
20618 const char *zShowNull = p->nullValue;
20619
20620 rc = sqlite3_step(pStmt);
20621 if( rc!=SQLITE_ROW ) return;
20622 nColumn = sqlite3_column_count(pStmt);
20623 nAlloc = nColumn*4;
20624 if( nAlloc<=0 ) nAlloc = 1;
20625 azData = sqlite3_malloc64( nAlloc*sizeof(char*) );
20626 shell_check_oom(azData);
20627 azNextLine = sqlite3_malloc64( nColumn*sizeof(char*) );
20628 shell_check_oom(azNextLine);
20629 memset((void*)azNextLine, 0, nColumn*sizeof(char*) );
20630 if( p->cmOpts.bQuote ){
20631 azQuoted = sqlite3_malloc64( nColumn*sizeof(char*) );
20632 shell_check_oom(azQuoted);
20633 memset(azQuoted, 0, nColumn*sizeof(char*) );
20634 }
20635 abRowDiv = sqlite3_malloc64( nAlloc/nColumn );
20636 shell_check_oom(abRowDiv);
20637 if( nColumn>p->nWidth ){
20638 p->colWidth = realloc(p->colWidth, (nColumn+1)*2*sizeof(int));
20639 shell_check_oom(p->colWidth);
20640 for(i=p->nWidth; i<nColumn; i++) p->colWidth[i] = 0;
20641 p->nWidth = nColumn;
20642 p->actualWidth = &p->colWidth[nColumn];
20643 }
20644 memset(p->actualWidth, 0, nColumn*sizeof(int));
20645 for(i=0; i<nColumn; i++){
20646 w = p->colWidth[i];
20647 if( w<0 ) w = -w;
20648 p->actualWidth[i] = w;
20649 }
20650 for(i=0; i<nColumn; i++){
20651 const unsigned char *zNotUsed;
20652 int wx = p->colWidth[i];
20653 if( wx==0 ){
20654 wx = p->cmOpts.iWrap;
20655 }
20656 if( wx<0 ) wx = -wx;
20657 uz = (const unsigned char*)sqlite3_column_name(pStmt,i);
20658 if( uz==0 ) uz = (u8*)"";
20659 azData[i] = translateForDisplayAndDup(uz, &zNotUsed, wx, bw);
20660 }
20661 do{
20662 int useNextLine = bNextLine;
20663 bNextLine = 0;
20664 if( (nRow+2)*nColumn >= nAlloc ){
20665 nAlloc *= 2;
20666 azData = sqlite3_realloc64(azData, nAlloc*sizeof(char*));
20667 shell_check_oom(azData);
20668 abRowDiv = sqlite3_realloc64(abRowDiv, nAlloc/nColumn);
20669 shell_check_oom(abRowDiv);
20670 }
20671 abRowDiv[nRow] = 1;
20672 nRow++;
20673 for(i=0; i<nColumn; i++){
20674 int wx = p->colWidth[i];
20675 if( wx==0 ){
20676 wx = p->cmOpts.iWrap;
20677 }
20678 if( wx<0 ) wx = -wx;
20679 if( useNextLine ){
20680 uz = azNextLine[i];
20681 if( uz==0 ) uz = (u8*)zEmpty;
20682 }else if( p->cmOpts.bQuote ){
20683 sqlite3_free(azQuoted[i]);
20684 azQuoted[i] = quoted_column(pStmt,i);
20685 uz = (const unsigned char*)azQuoted[i];
20686 }else{
20687 uz = (const unsigned char*)sqlite3_column_text(pStmt,i);
20688 if( uz==0 ) uz = (u8*)zShowNull;
20689 }
20690 azData[nRow*nColumn + i]
20691 = translateForDisplayAndDup(uz, &azNextLine[i], wx, bw);
20692 if( azNextLine[i] ){
20693 bNextLine = 1;
20694 abRowDiv[nRow-1] = 0;
20695 bMultiLineRowExists = 1;
20696 }
20697 }
20698 }while( bNextLine || sqlite3_step(pStmt)==SQLITE_ROW );
20699 nTotal = nColumn*(nRow+1);
20700 for(i=0; i<nTotal; i++){
20701 z = azData[i];
20702 if( z==0 ) z = (char*)zEmpty;
20703 n = strlenChar(z);
20704 j = i%nColumn;
20705 if( n>p->actualWidth[j] ) p->actualWidth[j] = n;
20706 }
20707 if( seenInterrupt ) goto columnar_end;
20708 if( nColumn==0 ) goto columnar_end;
20709 switch( p->cMode ){
20710 case MODE_Column: {
20711 colSep = " ";
20712 rowSep = "\n";
20713 if( p->showHeader ){
20714 for(i=0; i<nColumn; i++){
20715 w = p->actualWidth[i];
20716 if( p->colWidth[i]<0 ) w = -w;
20717 utf8_width_print(w, azData[i]);
20718 fputs(i==nColumn-1?"\n":" ", p->out);
20719 }
20720 for(i=0; i<nColumn; i++){
20721 print_dashes(p->actualWidth[i]);
20722 fputs(i==nColumn-1?"\n":" ", p->out);
20723 }
20724 }
20725 break;
20726 }
20727 case MODE_Table: {
20728 colSep = " | ";
20729 rowSep = " |\n";
20730 print_row_separator(p, nColumn, "+");
20731 fputs("| ", p->out);
20732 for(i=0; i<nColumn; i++){
20733 w = p->actualWidth[i];
20734 n = strlenChar(azData[i]);
20735 oputf("%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, "");
20736 oputz(i==nColumn-1?" |\n":" | ");
20737 }
20738 print_row_separator(p, nColumn, "+");
20739 break;
20740 }
20741 case MODE_Markdown: {
20742 colSep = " | ";
20743 rowSep = " |\n";
20744 fputs("| ", p->out);
20745 for(i=0; i<nColumn; i++){
20746 w = p->actualWidth[i];
20747 n = strlenChar(azData[i]);
20748 oputf("%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, "");
20749 oputz(i==nColumn-1?" |\n":" | ");
20750 }
20751 print_row_separator(p, nColumn, "|");
20752 break;
20753 }
20754 case MODE_Box: {
20755 colSep = " " BOX_13 " ";
20756 rowSep = " " BOX_13 "\n";
20757 print_box_row_separator(p, nColumn, BOX_23, BOX_234, BOX_34);
20758 oputz(BOX_13 " ");
20759 for(i=0; i<nColumn; i++){
20760 w = p->actualWidth[i];
20761 n = strlenChar(azData[i]);
20762 oputf("%*s%s%*s%s",
20763 (w-n)/2, "", azData[i], (w-n+1)/2, "",
20764 i==nColumn-1?" "BOX_13"\n":" "BOX_13" ");
20765 }
20766 print_box_row_separator(p, nColumn, BOX_123, BOX_1234, BOX_134);
20767 break;
20768 }
20769 }
20770 for(i=nColumn, j=0; i<nTotal; i++, j++){
20771 if( j==0 && p->cMode!=MODE_Column ){
20772 oputz(p->cMode==MODE_Box?BOX_13" ":"| ");
20773 }
20774 z = azData[i];
20775 if( z==0 ) z = p->nullValue;
20776 w = p->actualWidth[j];
20777 if( p->colWidth[j]<0 ) w = -w;
20778 utf8_width_print(w, z);
20779 if( j==nColumn-1 ){
20780 oputz(rowSep);
20781 if( bMultiLineRowExists && abRowDiv[i/nColumn-1] && i+1<nTotal ){
20782 if( p->cMode==MODE_Table ){
20783 print_row_separator(p, nColumn, "+");
20784 }else if( p->cMode==MODE_Box ){
20785 print_box_row_separator(p, nColumn, BOX_123, BOX_1234, BOX_134);
20786 }else if( p->cMode==MODE_Column ){
20787 oputz("\n");
20788 }
20789 }
20790 j = -1;
20791 if( seenInterrupt ) goto columnar_end;
20792 }else{
20793 oputz(colSep);
20794 }
20795 }
20796 if( p->cMode==MODE_Table ){
20797 print_row_separator(p, nColumn, "+");
20798 }else if( p->cMode==MODE_Box ){
20799 print_box_row_separator(p, nColumn, BOX_12, BOX_124, BOX_14);
20800 }
20801 columnar_end:
20802 if( seenInterrupt ){
20803 oputz("Interrupt\n");
20804 }
20805 nData = (nRow+1)*nColumn;
20806 for(i=0; i<nData; i++){
20807 z = azData[i];
20808 if( z!=zEmpty && z!=zShowNull ) free(azData[i]);
20809 }
20810 sqlite3_free(azData);
20811 sqlite3_free((void*)azNextLine);
20812 sqlite3_free(abRowDiv);
20813 if( azQuoted ){
20814 for(i=0; i<nColumn; i++) sqlite3_free(azQuoted[i]);
20815 sqlite3_free(azQuoted);
20816 }
20817 }
20818
20819 /*
20820 ** Run a prepared statement
20821 */
exec_prepared_stmt(ShellState * pArg,sqlite3_stmt * pStmt)20822 static void exec_prepared_stmt(
20823 ShellState *pArg, /* Pointer to ShellState */
20824 sqlite3_stmt *pStmt /* Statement to run */
20825 ){
20826 int rc;
20827 sqlite3_uint64 nRow = 0;
20828
20829 if( pArg->cMode==MODE_Column
20830 || pArg->cMode==MODE_Table
20831 || pArg->cMode==MODE_Box
20832 || pArg->cMode==MODE_Markdown
20833 ){
20834 exec_prepared_stmt_columnar(pArg, pStmt);
20835 return;
20836 }
20837
20838 /* perform the first step. this will tell us if we
20839 ** have a result set or not and how wide it is.
20840 */
20841 rc = sqlite3_step(pStmt);
20842 /* if we have a result set... */
20843 if( SQLITE_ROW == rc ){
20844 /* allocate space for col name ptr, value ptr, and type */
20845 int nCol = sqlite3_column_count(pStmt);
20846 void *pData = sqlite3_malloc64(3*nCol*sizeof(const char*) + 1);
20847 if( !pData ){
20848 shell_out_of_memory();
20849 }else{
20850 char **azCols = (char **)pData; /* Names of result columns */
20851 char **azVals = &azCols[nCol]; /* Results */
20852 int *aiTypes = (int *)&azVals[nCol]; /* Result types */
20853 int i, x;
20854 assert(sizeof(int) <= sizeof(char *));
20855 /* save off ptrs to column names */
20856 for(i=0; i<nCol; i++){
20857 azCols[i] = (char *)sqlite3_column_name(pStmt, i);
20858 }
20859 do{
20860 nRow++;
20861 /* extract the data and data types */
20862 for(i=0; i<nCol; i++){
20863 aiTypes[i] = x = sqlite3_column_type(pStmt, i);
20864 if( x==SQLITE_BLOB
20865 && pArg
20866 && (pArg->cMode==MODE_Insert || pArg->cMode==MODE_Quote)
20867 ){
20868 azVals[i] = "";
20869 }else{
20870 azVals[i] = (char*)sqlite3_column_text(pStmt, i);
20871 }
20872 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
20873 rc = SQLITE_NOMEM;
20874 break; /* from for */
20875 }
20876 } /* end for */
20877
20878 /* if data and types extracted successfully... */
20879 if( SQLITE_ROW == rc ){
20880 /* call the supplied callback with the result row data */
20881 if( shell_callback(pArg, nCol, azVals, azCols, aiTypes) ){
20882 rc = SQLITE_ABORT;
20883 }else{
20884 rc = sqlite3_step(pStmt);
20885 }
20886 }
20887 } while( SQLITE_ROW == rc );
20888 sqlite3_free(pData);
20889 if( pArg->cMode==MODE_Json ){
20890 fputs("]\n", pArg->out);
20891 }else if( pArg->cMode==MODE_Count ){
20892 char zBuf[200];
20893 sqlite3_snprintf(sizeof(zBuf), zBuf, "%llu row%s\n",
20894 nRow, nRow!=1 ? "s" : "");
20895 printf("%s", zBuf);
20896 }
20897 }
20898 }
20899 }
20900
20901 #ifndef SQLITE_OMIT_VIRTUALTABLE
20902 /*
20903 ** This function is called to process SQL if the previous shell command
20904 ** was ".expert". It passes the SQL in the second argument directly to
20905 ** the sqlite3expert object.
20906 **
20907 ** If successful, SQLITE_OK is returned. Otherwise, an SQLite error
20908 ** code. In this case, (*pzErr) may be set to point to a buffer containing
20909 ** an English language error message. It is the responsibility of the
20910 ** caller to eventually free this buffer using sqlite3_free().
20911 */
expertHandleSQL(ShellState * pState,const char * zSql,char ** pzErr)20912 static int expertHandleSQL(
20913 ShellState *pState,
20914 const char *zSql,
20915 char **pzErr
20916 ){
20917 assert( pState->expert.pExpert );
20918 assert( pzErr==0 || *pzErr==0 );
20919 return sqlite3_expert_sql(pState->expert.pExpert, zSql, pzErr);
20920 }
20921
20922 /*
20923 ** This function is called either to silently clean up the object
20924 ** created by the ".expert" command (if bCancel==1), or to generate a
20925 ** report from it and then clean it up (if bCancel==0).
20926 **
20927 ** If successful, SQLITE_OK is returned. Otherwise, an SQLite error
20928 ** code. In this case, (*pzErr) may be set to point to a buffer containing
20929 ** an English language error message. It is the responsibility of the
20930 ** caller to eventually free this buffer using sqlite3_free().
20931 */
expertFinish(ShellState * pState,int bCancel,char ** pzErr)20932 static int expertFinish(
20933 ShellState *pState,
20934 int bCancel,
20935 char **pzErr
20936 ){
20937 int rc = SQLITE_OK;
20938 sqlite3expert *p = pState->expert.pExpert;
20939 assert( p );
20940 assert( bCancel || pzErr==0 || *pzErr==0 );
20941 if( bCancel==0 ){
20942 int bVerbose = pState->expert.bVerbose;
20943
20944 rc = sqlite3_expert_analyze(p, pzErr);
20945 if( rc==SQLITE_OK ){
20946 int nQuery = sqlite3_expert_count(p);
20947 int i;
20948
20949 if( bVerbose ){
20950 const char *zCand = sqlite3_expert_report(p,0,EXPERT_REPORT_CANDIDATES);
20951 oputz("-- Candidates -----------------------------\n");
20952 oputf("%s\n", zCand);
20953 }
20954 for(i=0; i<nQuery; i++){
20955 const char *zSql = sqlite3_expert_report(p, i, EXPERT_REPORT_SQL);
20956 const char *zIdx = sqlite3_expert_report(p, i, EXPERT_REPORT_INDEXES);
20957 const char *zEQP = sqlite3_expert_report(p, i, EXPERT_REPORT_PLAN);
20958 if( zIdx==0 ) zIdx = "(no new indexes)\n";
20959 if( bVerbose ){
20960 oputf("-- Query %d --------------------------------\n",i+1);
20961 oputf("%s\n\n", zSql);
20962 }
20963 oputf("%s\n", zIdx);
20964 oputf("%s\n", zEQP);
20965 }
20966 }
20967 }
20968 sqlite3_expert_destroy(p);
20969 pState->expert.pExpert = 0;
20970 return rc;
20971 }
20972
20973 /*
20974 ** Implementation of ".expert" dot command.
20975 */
expertDotCommand(ShellState * pState,char ** azArg,int nArg)20976 static int expertDotCommand(
20977 ShellState *pState, /* Current shell tool state */
20978 char **azArg, /* Array of arguments passed to dot command */
20979 int nArg /* Number of entries in azArg[] */
20980 ){
20981 int rc = SQLITE_OK;
20982 char *zErr = 0;
20983 int i;
20984 int iSample = 0;
20985
20986 assert( pState->expert.pExpert==0 );
20987 memset(&pState->expert, 0, sizeof(ExpertInfo));
20988
20989 for(i=1; rc==SQLITE_OK && i<nArg; i++){
20990 char *z = azArg[i];
20991 int n;
20992 if( z[0]=='-' && z[1]=='-' ) z++;
20993 n = strlen30(z);
20994 if( n>=2 && 0==cli_strncmp(z, "-verbose", n) ){
20995 pState->expert.bVerbose = 1;
20996 }
20997 else if( n>=2 && 0==cli_strncmp(z, "-sample", n) ){
20998 if( i==(nArg-1) ){
20999 eputf("option requires an argument: %s\n", z);
21000 rc = SQLITE_ERROR;
21001 }else{
21002 iSample = (int)integerValue(azArg[++i]);
21003 if( iSample<0 || iSample>100 ){
21004 eputf("value out of range: %s\n", azArg[i]);
21005 rc = SQLITE_ERROR;
21006 }
21007 }
21008 }
21009 else{
21010 eputf("unknown option: %s\n", z);
21011 rc = SQLITE_ERROR;
21012 }
21013 }
21014
21015 if( rc==SQLITE_OK ){
21016 pState->expert.pExpert = sqlite3_expert_new(pState->db, &zErr);
21017 if( pState->expert.pExpert==0 ){
21018 eputf("sqlite3_expert_new: %s\n", zErr ? zErr : "out of memory");
21019 rc = SQLITE_ERROR;
21020 }else{
21021 sqlite3_expert_config(
21022 pState->expert.pExpert, EXPERT_CONFIG_SAMPLE, iSample
21023 );
21024 }
21025 }
21026 sqlite3_free(zErr);
21027
21028 return rc;
21029 }
21030 #endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
21031
21032 /*
21033 ** Execute a statement or set of statements. Print
21034 ** any result rows/columns depending on the current mode
21035 ** set via the supplied callback.
21036 **
21037 ** This is very similar to SQLite's built-in sqlite3_exec()
21038 ** function except it takes a slightly different callback
21039 ** and callback data argument.
21040 */
shell_exec(ShellState * pArg,const char * zSql,char ** pzErrMsg)21041 static int shell_exec(
21042 ShellState *pArg, /* Pointer to ShellState */
21043 const char *zSql, /* SQL to be evaluated */
21044 char **pzErrMsg /* Error msg written here */
21045 ){
21046 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */
21047 int rc = SQLITE_OK; /* Return Code */
21048 int rc2;
21049 const char *zLeftover; /* Tail of unprocessed SQL */
21050 sqlite3 *db = pArg->db;
21051
21052 if( pzErrMsg ){
21053 *pzErrMsg = NULL;
21054 }
21055
21056 #ifndef SQLITE_OMIT_VIRTUALTABLE
21057 if( pArg->expert.pExpert ){
21058 rc = expertHandleSQL(pArg, zSql, pzErrMsg);
21059 return expertFinish(pArg, (rc!=SQLITE_OK), pzErrMsg);
21060 }
21061 #endif
21062
21063 while( zSql[0] && (SQLITE_OK == rc) ){
21064 static const char *zStmtSql;
21065 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
21066 if( SQLITE_OK != rc ){
21067 if( pzErrMsg ){
21068 *pzErrMsg = save_err_msg(db, "in prepare", rc, zSql);
21069 }
21070 }else{
21071 if( !pStmt ){
21072 /* this happens for a comment or white-space */
21073 zSql = zLeftover;
21074 while( IsSpace(zSql[0]) ) zSql++;
21075 continue;
21076 }
21077 zStmtSql = sqlite3_sql(pStmt);
21078 if( zStmtSql==0 ) zStmtSql = "";
21079 while( IsSpace(zStmtSql[0]) ) zStmtSql++;
21080
21081 /* save off the prepared statement handle and reset row count */
21082 if( pArg ){
21083 pArg->pStmt = pStmt;
21084 pArg->cnt = 0;
21085 }
21086
21087 /* Show the EXPLAIN QUERY PLAN if .eqp is on */
21088 if( pArg && pArg->autoEQP && sqlite3_stmt_isexplain(pStmt)==0 ){
21089 sqlite3_stmt *pExplain;
21090 int triggerEQP = 0;
21091 disable_debug_trace_modes();
21092 sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, -1, &triggerEQP);
21093 if( pArg->autoEQP>=AUTOEQP_trigger ){
21094 sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 1, 0);
21095 }
21096 pExplain = pStmt;
21097 sqlite3_reset(pExplain);
21098 rc = sqlite3_stmt_explain(pExplain, 2);
21099 if( rc==SQLITE_OK ){
21100 while( sqlite3_step(pExplain)==SQLITE_ROW ){
21101 const char *zEQPLine = (const char*)sqlite3_column_text(pExplain,3);
21102 int iEqpId = sqlite3_column_int(pExplain, 0);
21103 int iParentId = sqlite3_column_int(pExplain, 1);
21104 if( zEQPLine==0 ) zEQPLine = "";
21105 if( zEQPLine[0]=='-' ) eqp_render(pArg, 0);
21106 eqp_append(pArg, iEqpId, iParentId, zEQPLine);
21107 }
21108 eqp_render(pArg, 0);
21109 }
21110 if( pArg->autoEQP>=AUTOEQP_full ){
21111 /* Also do an EXPLAIN for ".eqp full" mode */
21112 sqlite3_reset(pExplain);
21113 rc = sqlite3_stmt_explain(pExplain, 1);
21114 if( rc==SQLITE_OK ){
21115 pArg->cMode = MODE_Explain;
21116 assert( sqlite3_stmt_isexplain(pExplain)==1 );
21117 explain_data_prepare(pArg, pExplain);
21118 exec_prepared_stmt(pArg, pExplain);
21119 explain_data_delete(pArg);
21120 }
21121 }
21122 if( pArg->autoEQP>=AUTOEQP_trigger && triggerEQP==0 ){
21123 sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 0, 0);
21124 }
21125 sqlite3_reset(pStmt);
21126 sqlite3_stmt_explain(pStmt, 0);
21127 restore_debug_trace_modes();
21128 }
21129
21130 if( pArg ){
21131 int bIsExplain = (sqlite3_stmt_isexplain(pStmt)==1);
21132 pArg->cMode = pArg->mode;
21133 if( pArg->autoExplain ){
21134 if( bIsExplain ){
21135 pArg->cMode = MODE_Explain;
21136 }
21137 if( sqlite3_stmt_isexplain(pStmt)==2 ){
21138 pArg->cMode = MODE_EQP;
21139 }
21140 }
21141
21142 /* If the shell is currently in ".explain" mode, gather the extra
21143 ** data required to add indents to the output.*/
21144 if( pArg->cMode==MODE_Explain && bIsExplain ){
21145 explain_data_prepare(pArg, pStmt);
21146 }
21147 }
21148
21149 bind_prepared_stmt(pArg, pStmt);
21150 exec_prepared_stmt(pArg, pStmt);
21151 explain_data_delete(pArg);
21152 eqp_render(pArg, 0);
21153
21154 /* print usage stats if stats on */
21155 if( pArg && pArg->statsOn ){
21156 display_stats(db, pArg, 0);
21157 }
21158
21159 /* print loop-counters if required */
21160 if( pArg && pArg->scanstatsOn ){
21161 display_scanstats(db, pArg);
21162 }
21163
21164 /* Finalize the statement just executed. If this fails, save a
21165 ** copy of the error message. Otherwise, set zSql to point to the
21166 ** next statement to execute. */
21167 rc2 = sqlite3_finalize(pStmt);
21168 if( rc!=SQLITE_NOMEM ) rc = rc2;
21169 if( rc==SQLITE_OK ){
21170 zSql = zLeftover;
21171 while( IsSpace(zSql[0]) ) zSql++;
21172 }else if( pzErrMsg ){
21173 *pzErrMsg = save_err_msg(db, "stepping", rc, 0);
21174 }
21175
21176 /* clear saved stmt handle */
21177 if( pArg ){
21178 pArg->pStmt = NULL;
21179 }
21180 }
21181 } /* end while */
21182
21183 return rc;
21184 }
21185
21186 /*
21187 ** Release memory previously allocated by tableColumnList().
21188 */
freeColumnList(char ** azCol)21189 static void freeColumnList(char **azCol){
21190 int i;
21191 for(i=1; azCol[i]; i++){
21192 sqlite3_free(azCol[i]);
21193 }
21194 /* azCol[0] is a static string */
21195 sqlite3_free(azCol);
21196 }
21197
21198 /*
21199 ** Return a list of pointers to strings which are the names of all
21200 ** columns in table zTab. The memory to hold the names is dynamically
21201 ** allocated and must be released by the caller using a subsequent call
21202 ** to freeColumnList().
21203 **
21204 ** The azCol[0] entry is usually NULL. However, if zTab contains a rowid
21205 ** value that needs to be preserved, then azCol[0] is filled in with the
21206 ** name of the rowid column.
21207 **
21208 ** The first regular column in the table is azCol[1]. The list is terminated
21209 ** by an entry with azCol[i]==0.
21210 */
tableColumnList(ShellState * p,const char * zTab)21211 static char **tableColumnList(ShellState *p, const char *zTab){
21212 char **azCol = 0;
21213 sqlite3_stmt *pStmt;
21214 char *zSql;
21215 int nCol = 0;
21216 int nAlloc = 0;
21217 int nPK = 0; /* Number of PRIMARY KEY columns seen */
21218 int isIPK = 0; /* True if one PRIMARY KEY column of type INTEGER */
21219 int preserveRowid = ShellHasFlag(p, SHFLG_PreserveRowid);
21220 int rc;
21221
21222 zSql = sqlite3_mprintf("PRAGMA table_info=%Q", zTab);
21223 shell_check_oom(zSql);
21224 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
21225 sqlite3_free(zSql);
21226 if( rc ) return 0;
21227 while( sqlite3_step(pStmt)==SQLITE_ROW ){
21228 if( nCol>=nAlloc-2 ){
21229 nAlloc = nAlloc*2 + nCol + 10;
21230 azCol = sqlite3_realloc(azCol, nAlloc*sizeof(azCol[0]));
21231 shell_check_oom(azCol);
21232 }
21233 azCol[++nCol] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 1));
21234 shell_check_oom(azCol[nCol]);
21235 if( sqlite3_column_int(pStmt, 5) ){
21236 nPK++;
21237 if( nPK==1
21238 && sqlite3_stricmp((const char*)sqlite3_column_text(pStmt,2),
21239 "INTEGER")==0
21240 ){
21241 isIPK = 1;
21242 }else{
21243 isIPK = 0;
21244 }
21245 }
21246 }
21247 sqlite3_finalize(pStmt);
21248 if( azCol==0 ) return 0;
21249 azCol[0] = 0;
21250 azCol[nCol+1] = 0;
21251
21252 /* The decision of whether or not a rowid really needs to be preserved
21253 ** is tricky. We never need to preserve a rowid for a WITHOUT ROWID table
21254 ** or a table with an INTEGER PRIMARY KEY. We are unable to preserve
21255 ** rowids on tables where the rowid is inaccessible because there are other
21256 ** columns in the table named "rowid", "_rowid_", and "oid".
21257 */
21258 if( preserveRowid && isIPK ){
21259 /* If a single PRIMARY KEY column with type INTEGER was seen, then it
21260 ** might be an alias for the ROWID. But it might also be a WITHOUT ROWID
21261 ** table or a INTEGER PRIMARY KEY DESC column, neither of which are
21262 ** ROWID aliases. To distinguish these cases, check to see if
21263 ** there is a "pk" entry in "PRAGMA index_list". There will be
21264 ** no "pk" index if the PRIMARY KEY really is an alias for the ROWID.
21265 */
21266 zSql = sqlite3_mprintf("SELECT 1 FROM pragma_index_list(%Q)"
21267 " WHERE origin='pk'", zTab);
21268 shell_check_oom(zSql);
21269 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
21270 sqlite3_free(zSql);
21271 if( rc ){
21272 freeColumnList(azCol);
21273 return 0;
21274 }
21275 rc = sqlite3_step(pStmt);
21276 sqlite3_finalize(pStmt);
21277 preserveRowid = rc==SQLITE_ROW;
21278 }
21279 if( preserveRowid ){
21280 /* Only preserve the rowid if we can find a name to use for the
21281 ** rowid */
21282 static char *azRowid[] = { "rowid", "_rowid_", "oid" };
21283 int i, j;
21284 for(j=0; j<3; j++){
21285 for(i=1; i<=nCol; i++){
21286 if( sqlite3_stricmp(azRowid[j],azCol[i])==0 ) break;
21287 }
21288 if( i>nCol ){
21289 /* At this point, we know that azRowid[j] is not the name of any
21290 ** ordinary column in the table. Verify that azRowid[j] is a valid
21291 ** name for the rowid before adding it to azCol[0]. WITHOUT ROWID
21292 ** tables will fail this last check */
21293 rc = sqlite3_table_column_metadata(p->db,0,zTab,azRowid[j],0,0,0,0,0);
21294 if( rc==SQLITE_OK ) azCol[0] = azRowid[j];
21295 break;
21296 }
21297 }
21298 }
21299 return azCol;
21300 }
21301
21302 /*
21303 ** Toggle the reverse_unordered_selects setting.
21304 */
toggleSelectOrder(sqlite3 * db)21305 static void toggleSelectOrder(sqlite3 *db){
21306 sqlite3_stmt *pStmt = 0;
21307 int iSetting = 0;
21308 char zStmt[100];
21309 sqlite3_prepare_v2(db, "PRAGMA reverse_unordered_selects", -1, &pStmt, 0);
21310 if( sqlite3_step(pStmt)==SQLITE_ROW ){
21311 iSetting = sqlite3_column_int(pStmt, 0);
21312 }
21313 sqlite3_finalize(pStmt);
21314 sqlite3_snprintf(sizeof(zStmt), zStmt,
21315 "PRAGMA reverse_unordered_selects(%d)", !iSetting);
21316 sqlite3_exec(db, zStmt, 0, 0, 0);
21317 }
21318
21319 /*
21320 ** This is a different callback routine used for dumping the database.
21321 ** Each row received by this callback consists of a table name,
21322 ** the table type ("index" or "table") and SQL to create the table.
21323 ** This routine should print text sufficient to recreate the table.
21324 */
dump_callback(void * pArg,int nArg,char ** azArg,char ** azNotUsed)21325 static int dump_callback(void *pArg, int nArg, char **azArg, char **azNotUsed){
21326 int rc;
21327 const char *zTable;
21328 const char *zType;
21329 const char *zSql;
21330 ShellState *p = (ShellState *)pArg;
21331 int dataOnly;
21332 int noSys;
21333
21334 UNUSED_PARAMETER(azNotUsed);
21335 if( nArg!=3 || azArg==0 ) return 0;
21336 zTable = azArg[0];
21337 zType = azArg[1];
21338 zSql = azArg[2];
21339 if( zTable==0 ) return 0;
21340 if( zType==0 ) return 0;
21341 dataOnly = (p->shellFlgs & SHFLG_DumpDataOnly)!=0;
21342 noSys = (p->shellFlgs & SHFLG_DumpNoSys)!=0;
21343
21344 if( cli_strcmp(zTable, "sqlite_sequence")==0 && !noSys ){
21345 if( !dataOnly ) oputz("DELETE FROM sqlite_sequence;\n");
21346 }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 && !noSys ){
21347 if( !dataOnly ) oputz("ANALYZE sqlite_schema;\n");
21348 }else if( cli_strncmp(zTable, "sqlite_", 7)==0 ){
21349 return 0;
21350 }else if( dataOnly ){
21351 /* no-op */
21352 }else if( cli_strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
21353 char *zIns;
21354 if( !p->writableSchema ){
21355 oputz("PRAGMA writable_schema=ON;\n");
21356 p->writableSchema = 1;
21357 }
21358 zIns = sqlite3_mprintf(
21359 "INSERT INTO sqlite_schema(type,name,tbl_name,rootpage,sql)"
21360 "VALUES('table','%q','%q',0,'%q');",
21361 zTable, zTable, zSql);
21362 shell_check_oom(zIns);
21363 oputf("%s\n", zIns);
21364 sqlite3_free(zIns);
21365 return 0;
21366 }else{
21367 printSchemaLine(zSql, ";\n");
21368 }
21369
21370 if( cli_strcmp(zType, "table")==0 ){
21371 ShellText sSelect;
21372 ShellText sTable;
21373 char **azCol;
21374 int i;
21375 char *savedDestTable;
21376 int savedMode;
21377
21378 azCol = tableColumnList(p, zTable);
21379 if( azCol==0 ){
21380 p->nErr++;
21381 return 0;
21382 }
21383
21384 /* Always quote the table name, even if it appears to be pure ascii,
21385 ** in case it is a keyword. Ex: INSERT INTO "table" ... */
21386 initText(&sTable);
21387 appendText(&sTable, zTable, quoteChar(zTable));
21388 /* If preserving the rowid, add a column list after the table name.
21389 ** In other words: "INSERT INTO tab(rowid,a,b,c,...) VALUES(...)"
21390 ** instead of the usual "INSERT INTO tab VALUES(...)".
21391 */
21392 if( azCol[0] ){
21393 appendText(&sTable, "(", 0);
21394 appendText(&sTable, azCol[0], 0);
21395 for(i=1; azCol[i]; i++){
21396 appendText(&sTable, ",", 0);
21397 appendText(&sTable, azCol[i], quoteChar(azCol[i]));
21398 }
21399 appendText(&sTable, ")", 0);
21400 }
21401
21402 /* Build an appropriate SELECT statement */
21403 initText(&sSelect);
21404 appendText(&sSelect, "SELECT ", 0);
21405 if( azCol[0] ){
21406 appendText(&sSelect, azCol[0], 0);
21407 appendText(&sSelect, ",", 0);
21408 }
21409 for(i=1; azCol[i]; i++){
21410 appendText(&sSelect, azCol[i], quoteChar(azCol[i]));
21411 if( azCol[i+1] ){
21412 appendText(&sSelect, ",", 0);
21413 }
21414 }
21415 freeColumnList(azCol);
21416 appendText(&sSelect, " FROM ", 0);
21417 appendText(&sSelect, zTable, quoteChar(zTable));
21418
21419 savedDestTable = p->zDestTable;
21420 savedMode = p->mode;
21421 p->zDestTable = sTable.z;
21422 p->mode = p->cMode = MODE_Insert;
21423 rc = shell_exec(p, sSelect.z, 0);
21424 if( (rc&0xff)==SQLITE_CORRUPT ){
21425 oputz("/****** CORRUPTION ERROR *******/\n");
21426 toggleSelectOrder(p->db);
21427 shell_exec(p, sSelect.z, 0);
21428 toggleSelectOrder(p->db);
21429 }
21430 p->zDestTable = savedDestTable;
21431 p->mode = savedMode;
21432 freeText(&sTable);
21433 freeText(&sSelect);
21434 if( rc ) p->nErr++;
21435 }
21436 return 0;
21437 }
21438
21439 /*
21440 ** Run zQuery. Use dump_callback() as the callback routine so that
21441 ** the contents of the query are output as SQL statements.
21442 **
21443 ** If we get a SQLITE_CORRUPT error, rerun the query after appending
21444 ** "ORDER BY rowid DESC" to the end.
21445 */
run_schema_dump_query(ShellState * p,const char * zQuery)21446 static int run_schema_dump_query(
21447 ShellState *p,
21448 const char *zQuery
21449 ){
21450 int rc;
21451 char *zErr = 0;
21452 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
21453 if( rc==SQLITE_CORRUPT ){
21454 char *zQ2;
21455 int len = strlen30(zQuery);
21456 oputz("/****** CORRUPTION ERROR *******/\n");
21457 if( zErr ){
21458 oputf("/****** %s ******/\n", zErr);
21459 sqlite3_free(zErr);
21460 zErr = 0;
21461 }
21462 zQ2 = malloc( len+100 );
21463 if( zQ2==0 ) return rc;
21464 sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
21465 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
21466 if( rc ){
21467 oputf("/****** ERROR: %s ******/\n", zErr);
21468 }else{
21469 rc = SQLITE_CORRUPT;
21470 }
21471 sqlite3_free(zErr);
21472 free(zQ2);
21473 }
21474 return rc;
21475 }
21476
21477 /*
21478 ** Text of help messages.
21479 **
21480 ** The help text for each individual command begins with a line that starts
21481 ** with ".". Subsequent lines are supplemental information.
21482 **
21483 ** There must be two or more spaces between the end of the command and the
21484 ** start of the description of what that command does.
21485 */
21486 static const char *(azHelp[]) = {
21487 #if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE) \
21488 && !defined(SQLITE_SHELL_FIDDLE)
21489 ".archive ... Manage SQL archives",
21490 " Each command must have exactly one of the following options:",
21491 " -c, --create Create a new archive",
21492 " -u, --update Add or update files with changed mtime",
21493 " -i, --insert Like -u but always add even if unchanged",
21494 " -r, --remove Remove files from archive",
21495 " -t, --list List contents of archive",
21496 " -x, --extract Extract files from archive",
21497 " Optional arguments:",
21498 " -v, --verbose Print each filename as it is processed",
21499 " -f FILE, --file FILE Use archive FILE (default is current db)",
21500 " -a FILE, --append FILE Open FILE using the apndvfs VFS",
21501 " -C DIR, --directory DIR Read/extract files from directory DIR",
21502 " -g, --glob Use glob matching for names in archive",
21503 " -n, --dryrun Show the SQL that would have occurred",
21504 " Examples:",
21505 " .ar -cf ARCHIVE foo bar # Create ARCHIVE from files foo and bar",
21506 " .ar -tf ARCHIVE # List members of ARCHIVE",
21507 " .ar -xvf ARCHIVE # Verbosely extract files from ARCHIVE",
21508 " See also:",
21509 " http://sqlite.org/cli.html#sqlite_archive_support",
21510 #endif
21511 #ifndef SQLITE_OMIT_AUTHORIZATION
21512 ".auth ON|OFF Show authorizer callbacks",
21513 #endif
21514 #ifndef SQLITE_SHELL_FIDDLE
21515 ".backup ?DB? FILE Backup DB (default \"main\") to FILE",
21516 " Options:",
21517 " --append Use the appendvfs",
21518 " --async Write to FILE without journal and fsync()",
21519 #endif
21520 ".bail on|off Stop after hitting an error. Default OFF",
21521 #ifndef SQLITE_SHELL_FIDDLE
21522 ".cd DIRECTORY Change the working directory to DIRECTORY",
21523 #endif
21524 ".changes on|off Show number of rows changed by SQL",
21525 #ifndef SQLITE_SHELL_FIDDLE
21526 ".check GLOB Fail if output since .testcase does not match",
21527 ".clone NEWDB Clone data into NEWDB from the existing database",
21528 #endif
21529 ".connection [close] [#] Open or close an auxiliary database connection",
21530 #if defined(_WIN32) || defined(WIN32)
21531 ".crnl on|off Translate \\n to \\r\\n. Default ON",
21532 #endif
21533 ".databases List names and files of attached databases",
21534 ".dbconfig ?op? ?val? List or change sqlite3_db_config() options",
21535 #if SQLITE_SHELL_HAVE_RECOVER
21536 ".dbinfo ?DB? Show status information about the database",
21537 #endif
21538 ".dump ?OBJECTS? Render database content as SQL",
21539 " Options:",
21540 " --data-only Output only INSERT statements",
21541 " --newlines Allow unescaped newline characters in output",
21542 " --nosys Omit system tables (ex: \"sqlite_stat1\")",
21543 " --preserve-rowids Include ROWID values in the output",
21544 " OBJECTS is a LIKE pattern for tables, indexes, triggers or views to dump",
21545 " Additional LIKE patterns can be given in subsequent arguments",
21546 ".echo on|off Turn command echo on or off",
21547 ".eqp on|off|full|... Enable or disable automatic EXPLAIN QUERY PLAN",
21548 " Other Modes:",
21549 #ifdef SQLITE_DEBUG
21550 " test Show raw EXPLAIN QUERY PLAN output",
21551 " trace Like \"full\" but enable \"PRAGMA vdbe_trace\"",
21552 #endif
21553 " trigger Like \"full\" but also show trigger bytecode",
21554 #ifndef SQLITE_SHELL_FIDDLE
21555 ".excel Display the output of next command in spreadsheet",
21556 " --bom Put a UTF8 byte-order mark on intermediate file",
21557 #endif
21558 #ifndef SQLITE_SHELL_FIDDLE
21559 ".exit ?CODE? Exit this program with return-code CODE",
21560 #endif
21561 ".expert EXPERIMENTAL. Suggest indexes for queries",
21562 ".explain ?on|off|auto? Change the EXPLAIN formatting mode. Default: auto",
21563 ".filectrl CMD ... Run various sqlite3_file_control() operations",
21564 " --schema SCHEMA Use SCHEMA instead of \"main\"",
21565 " --help Show CMD details",
21566 ".fullschema ?--indent? Show schema and the content of sqlite_stat tables",
21567 ".headers on|off Turn display of headers on or off",
21568 ".help ?-all? ?PATTERN? Show help text for PATTERN",
21569 #ifndef SQLITE_SHELL_FIDDLE
21570 ".import FILE TABLE Import data from FILE into TABLE",
21571 " Options:",
21572 " --ascii Use \\037 and \\036 as column and row separators",
21573 " --csv Use , and \\n as column and row separators",
21574 " --skip N Skip the first N rows of input",
21575 " --schema S Target table to be S.TABLE",
21576 " -v \"Verbose\" - increase auxiliary output",
21577 " Notes:",
21578 " * If TABLE does not exist, it is created. The first row of input",
21579 " determines the column names.",
21580 " * If neither --csv or --ascii are used, the input mode is derived",
21581 " from the \".mode\" output mode",
21582 " * If FILE begins with \"|\" then it is a command that generates the",
21583 " input text.",
21584 #endif
21585 #ifndef SQLITE_OMIT_TEST_CONTROL
21586 ",imposter INDEX TABLE Create imposter table TABLE on index INDEX",
21587 #endif
21588 ".indexes ?TABLE? Show names of indexes",
21589 " If TABLE is specified, only show indexes for",
21590 " tables matching TABLE using the LIKE operator.",
21591 #ifdef SQLITE_ENABLE_IOTRACE
21592 ",iotrace FILE Enable I/O diagnostic logging to FILE",
21593 #endif
21594 ".limit ?LIMIT? ?VAL? Display or change the value of an SQLITE_LIMIT",
21595 ".lint OPTIONS Report potential schema issues.",
21596 " Options:",
21597 " fkey-indexes Find missing foreign key indexes",
21598 #if !defined(SQLITE_OMIT_LOAD_EXTENSION) && !defined(SQLITE_SHELL_FIDDLE)
21599 ".load FILE ?ENTRY? Load an extension library",
21600 #endif
21601 #if !defined(SQLITE_SHELL_FIDDLE)
21602 ".log FILE|on|off Turn logging on or off. FILE can be stderr/stdout",
21603 #else
21604 ".log on|off Turn logging on or off.",
21605 #endif
21606 ".mode MODE ?OPTIONS? Set output mode",
21607 " MODE is one of:",
21608 " ascii Columns/rows delimited by 0x1F and 0x1E",
21609 " box Tables using unicode box-drawing characters",
21610 " csv Comma-separated values",
21611 " column Output in columns. (See .width)",
21612 " html HTML <table> code",
21613 " insert SQL insert statements for TABLE",
21614 " json Results in a JSON array",
21615 " line One value per line",
21616 " list Values delimited by \"|\"",
21617 " markdown Markdown table format",
21618 " qbox Shorthand for \"box --wrap 60 --quote\"",
21619 " quote Escape answers as for SQL",
21620 " table ASCII-art table",
21621 " tabs Tab-separated values",
21622 " tcl TCL list elements",
21623 " OPTIONS: (for columnar modes or insert mode):",
21624 " --wrap N Wrap output lines to no longer than N characters",
21625 " --wordwrap B Wrap or not at word boundaries per B (on/off)",
21626 " --ww Shorthand for \"--wordwrap 1\"",
21627 " --quote Quote output text as SQL literals",
21628 " --noquote Do not quote output text",
21629 " TABLE The name of SQL table used for \"insert\" mode",
21630 #ifndef SQLITE_SHELL_FIDDLE
21631 ".nonce STRING Suspend safe mode for one command if nonce matches",
21632 #endif
21633 ".nullvalue STRING Use STRING in place of NULL values",
21634 #ifndef SQLITE_SHELL_FIDDLE
21635 ".once ?OPTIONS? ?FILE? Output for the next SQL command only to FILE",
21636 " If FILE begins with '|' then open as a pipe",
21637 " --bom Put a UTF8 byte-order mark at the beginning",
21638 " -e Send output to the system text editor",
21639 " -x Send output as CSV to a spreadsheet (same as \".excel\")",
21640 /* Note that .open is (partially) available in WASM builds but is
21641 ** currently only intended to be used by the fiddle tool, not
21642 ** end users, so is "undocumented." */
21643 ".open ?OPTIONS? ?FILE? Close existing database and reopen FILE",
21644 " Options:",
21645 " --append Use appendvfs to append database to the end of FILE",
21646 #endif
21647 #ifndef SQLITE_OMIT_DESERIALIZE
21648 " --deserialize Load into memory using sqlite3_deserialize()",
21649 " --hexdb Load the output of \"dbtotxt\" as an in-memory db",
21650 " --maxsize N Maximum size for --hexdb or --deserialized database",
21651 #endif
21652 " --new Initialize FILE to an empty database",
21653 " --nofollow Do not follow symbolic links",
21654 " --readonly Open FILE readonly",
21655 " --zip FILE is a ZIP archive",
21656 #ifndef SQLITE_SHELL_FIDDLE
21657 ".output ?FILE? Send output to FILE or stdout if FILE is omitted",
21658 " If FILE begins with '|' then open it as a pipe.",
21659 " Options:",
21660 " --bom Prefix output with a UTF8 byte-order mark",
21661 " -e Send output to the system text editor",
21662 " -x Send output as CSV to a spreadsheet",
21663 #endif
21664 ".parameter CMD ... Manage SQL parameter bindings",
21665 " clear Erase all bindings",
21666 " init Initialize the TEMP table that holds bindings",
21667 " list List the current parameter bindings",
21668 " set PARAMETER VALUE Given SQL parameter PARAMETER a value of VALUE",
21669 " PARAMETER should start with one of: $ : @ ?",
21670 " unset PARAMETER Remove PARAMETER from the binding table",
21671 ".print STRING... Print literal STRING",
21672 #ifndef SQLITE_OMIT_PROGRESS_CALLBACK
21673 ".progress N Invoke progress handler after every N opcodes",
21674 " --limit N Interrupt after N progress callbacks",
21675 " --once Do no more than one progress interrupt",
21676 " --quiet|-q No output except at interrupts",
21677 " --reset Reset the count for each input and interrupt",
21678 #endif
21679 ".prompt MAIN CONTINUE Replace the standard prompts",
21680 #ifndef SQLITE_SHELL_FIDDLE
21681 ".quit Stop interpreting input stream, exit if primary.",
21682 ".read FILE Read input from FILE or command output",
21683 " If FILE begins with \"|\", it is a command that generates the input.",
21684 #endif
21685 #if SQLITE_SHELL_HAVE_RECOVER
21686 ".recover Recover as much data as possible from corrupt db.",
21687 " --ignore-freelist Ignore pages that appear to be on db freelist",
21688 " --lost-and-found TABLE Alternative name for the lost-and-found table",
21689 " --no-rowids Do not attempt to recover rowid values",
21690 " that are not also INTEGER PRIMARY KEYs",
21691 #endif
21692 #ifndef SQLITE_SHELL_FIDDLE
21693 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE",
21694 ".save ?OPTIONS? FILE Write database to FILE (an alias for .backup ...)",
21695 #endif
21696 ".scanstats on|off|est Turn sqlite3_stmt_scanstatus() metrics on or off",
21697 ".schema ?PATTERN? Show the CREATE statements matching PATTERN",
21698 " Options:",
21699 " --indent Try to pretty-print the schema",
21700 " --nosys Omit objects whose names start with \"sqlite_\"",
21701 ",selftest ?OPTIONS? Run tests defined in the SELFTEST table",
21702 " Options:",
21703 " --init Create a new SELFTEST table",
21704 " -v Verbose output",
21705 ".separator COL ?ROW? Change the column and row separators",
21706 #if defined(SQLITE_ENABLE_SESSION)
21707 ".session ?NAME? CMD ... Create or control sessions",
21708 " Subcommands:",
21709 " attach TABLE Attach TABLE",
21710 " changeset FILE Write a changeset into FILE",
21711 " close Close one session",
21712 " enable ?BOOLEAN? Set or query the enable bit",
21713 " filter GLOB... Reject tables matching GLOBs",
21714 " indirect ?BOOLEAN? Mark or query the indirect status",
21715 " isempty Query whether the session is empty",
21716 " list List currently open session names",
21717 " open DB NAME Open a new session on DB",
21718 " patchset FILE Write a patchset into FILE",
21719 " If ?NAME? is omitted, the first defined session is used.",
21720 #endif
21721 ".sha3sum ... Compute a SHA3 hash of database content",
21722 " Options:",
21723 " --schema Also hash the sqlite_schema table",
21724 " --sha3-224 Use the sha3-224 algorithm",
21725 " --sha3-256 Use the sha3-256 algorithm (default)",
21726 " --sha3-384 Use the sha3-384 algorithm",
21727 " --sha3-512 Use the sha3-512 algorithm",
21728 " Any other argument is a LIKE pattern for tables to hash",
21729 #if !defined(SQLITE_NOHAVE_SYSTEM) && !defined(SQLITE_SHELL_FIDDLE)
21730 ".shell CMD ARGS... Run CMD ARGS... in a system shell",
21731 #endif
21732 ".show Show the current values for various settings",
21733 ".stats ?ARG? Show stats or turn stats on or off",
21734 " off Turn off automatic stat display",
21735 " on Turn on automatic stat display",
21736 " stmt Show statement stats",
21737 " vmstep Show the virtual machine step count only",
21738 #if !defined(SQLITE_NOHAVE_SYSTEM) && !defined(SQLITE_SHELL_FIDDLE)
21739 ".system CMD ARGS... Run CMD ARGS... in a system shell",
21740 #endif
21741 ".tables ?TABLE? List names of tables matching LIKE pattern TABLE",
21742 #ifndef SQLITE_SHELL_FIDDLE
21743 ",testcase NAME Begin redirecting output to 'testcase-out.txt'",
21744 #endif
21745 ",testctrl CMD ... Run various sqlite3_test_control() operations",
21746 " Run \".testctrl\" with no arguments for details",
21747 ".timeout MS Try opening locked tables for MS milliseconds",
21748 ".timer on|off Turn SQL timer on or off",
21749 #ifndef SQLITE_OMIT_TRACE
21750 ".trace ?OPTIONS? Output each SQL statement as it is run",
21751 " FILE Send output to FILE",
21752 " stdout Send output to stdout",
21753 " stderr Send output to stderr",
21754 " off Disable tracing",
21755 " --expanded Expand query parameters",
21756 #ifdef SQLITE_ENABLE_NORMALIZE
21757 " --normalized Normal the SQL statements",
21758 #endif
21759 " --plain Show SQL as it is input",
21760 " --stmt Trace statement execution (SQLITE_TRACE_STMT)",
21761 " --profile Profile statements (SQLITE_TRACE_PROFILE)",
21762 " --row Trace each row (SQLITE_TRACE_ROW)",
21763 " --close Trace connection close (SQLITE_TRACE_CLOSE)",
21764 #endif /* SQLITE_OMIT_TRACE */
21765 #ifdef SQLITE_DEBUG
21766 ".unmodule NAME ... Unregister virtual table modules",
21767 " --allexcept Unregister everything except those named",
21768 #endif
21769 ".version Show source, library and compiler versions",
21770 ".vfsinfo ?AUX? Information about the top-level VFS",
21771 ".vfslist List all available VFSes",
21772 ".vfsname ?AUX? Print the name of the VFS stack",
21773 ".width NUM1 NUM2 ... Set minimum column widths for columnar output",
21774 " Negative values right-justify",
21775 };
21776
21777 /*
21778 ** Output help text.
21779 **
21780 ** zPattern describes the set of commands for which help text is provided.
21781 ** If zPattern is NULL, then show all commands, but only give a one-line
21782 ** description of each.
21783 **
21784 ** Return the number of matches.
21785 */
showHelp(FILE * out,const char * zPattern)21786 static int showHelp(FILE *out, const char *zPattern){
21787 int i = 0;
21788 int j = 0;
21789 int n = 0;
21790 char *zPat;
21791 if( zPattern==0
21792 || zPattern[0]=='0'
21793 || cli_strcmp(zPattern,"-a")==0
21794 || cli_strcmp(zPattern,"-all")==0
21795 || cli_strcmp(zPattern,"--all")==0
21796 ){
21797 enum HelpWanted { HW_NoCull = 0, HW_SummaryOnly = 1, HW_Undoc = 2 };
21798 enum HelpHave { HH_Undoc = 2, HH_Summary = 1, HH_More = 0 };
21799 /* Show all or most commands
21800 ** *zPattern==0 => summary of documented commands only
21801 ** *zPattern=='0' => whole help for undocumented commands
21802 ** Otherwise => whole help for documented commands
21803 */
21804 enum HelpWanted hw = HW_SummaryOnly;
21805 enum HelpHave hh = HH_More;
21806 if( zPattern!=0 ){
21807 hw = (*zPattern=='0')? HW_NoCull|HW_Undoc : HW_NoCull;
21808 }
21809 for(i=0; i<ArraySize(azHelp); i++){
21810 switch( azHelp[i][0] ){
21811 case ',':
21812 hh = HH_Summary|HH_Undoc;
21813 break;
21814 case '.':
21815 hh = HH_Summary;
21816 break;
21817 default:
21818 hh &= ~HH_Summary;
21819 break;
21820 }
21821 if( ((hw^hh)&HH_Undoc)==0 ){
21822 if( (hh&HH_Summary)!=0 ){
21823 sputf(out, ".%s\n", azHelp[i]+1);
21824 ++n;
21825 }else if( (hw&HW_SummaryOnly)==0 ){
21826 sputf(out, "%s\n", azHelp[i]);
21827 }
21828 }
21829 }
21830 }else{
21831 /* Seek documented commands for which zPattern is an exact prefix */
21832 zPat = sqlite3_mprintf(".%s*", zPattern);
21833 shell_check_oom(zPat);
21834 for(i=0; i<ArraySize(azHelp); i++){
21835 if( sqlite3_strglob(zPat, azHelp[i])==0 ){
21836 sputf(out, "%s\n", azHelp[i]);
21837 j = i+1;
21838 n++;
21839 }
21840 }
21841 sqlite3_free(zPat);
21842 if( n ){
21843 if( n==1 ){
21844 /* when zPattern is a prefix of exactly one command, then include
21845 ** the details of that command, which should begin at offset j */
21846 while( j<ArraySize(azHelp)-1 && azHelp[j][0]==' ' ){
21847 sputf(out, "%s\n", azHelp[j]);
21848 j++;
21849 }
21850 }
21851 return n;
21852 }
21853 /* Look for documented commands that contain zPattern anywhere.
21854 ** Show complete text of all documented commands that match. */
21855 zPat = sqlite3_mprintf("%%%s%%", zPattern);
21856 shell_check_oom(zPat);
21857 for(i=0; i<ArraySize(azHelp); i++){
21858 if( azHelp[i][0]==',' ){
21859 while( i<ArraySize(azHelp)-1 && azHelp[i+1][0]==' ' ) ++i;
21860 continue;
21861 }
21862 if( azHelp[i][0]=='.' ) j = i;
21863 if( sqlite3_strlike(zPat, azHelp[i], 0)==0 ){
21864 sputf(out, "%s\n", azHelp[j]);
21865 while( j<ArraySize(azHelp)-1 && azHelp[j+1][0]==' ' ){
21866 j++;
21867 sputf(out, "%s\n", azHelp[j]);
21868 }
21869 i = j;
21870 n++;
21871 }
21872 }
21873 sqlite3_free(zPat);
21874 }
21875 return n;
21876 }
21877
21878 /* Forward reference */
21879 static int process_input(ShellState *p);
21880
21881 /*
21882 ** Read the content of file zName into memory obtained from sqlite3_malloc64()
21883 ** and return a pointer to the buffer. The caller is responsible for freeing
21884 ** the memory.
21885 **
21886 ** If parameter pnByte is not NULL, (*pnByte) is set to the number of bytes
21887 ** read.
21888 **
21889 ** For convenience, a nul-terminator byte is always appended to the data read
21890 ** from the file before the buffer is returned. This byte is not included in
21891 ** the final value of (*pnByte), if applicable.
21892 **
21893 ** NULL is returned if any error is encountered. The final value of *pnByte
21894 ** is undefined in this case.
21895 */
readFile(const char * zName,int * pnByte)21896 static char *readFile(const char *zName, int *pnByte){
21897 FILE *in = fopen(zName, "rb");
21898 long nIn;
21899 size_t nRead;
21900 char *pBuf;
21901 int rc;
21902 if( in==0 ) return 0;
21903 rc = fseek(in, 0, SEEK_END);
21904 if( rc!=0 ){
21905 eputf("Error: '%s' not seekable\n", zName);
21906 fclose(in);
21907 return 0;
21908 }
21909 nIn = ftell(in);
21910 rewind(in);
21911 pBuf = sqlite3_malloc64( nIn+1 );
21912 if( pBuf==0 ){
21913 eputz("Error: out of memory\n");
21914 fclose(in);
21915 return 0;
21916 }
21917 nRead = fread(pBuf, nIn, 1, in);
21918 fclose(in);
21919 if( nRead!=1 ){
21920 sqlite3_free(pBuf);
21921 eputf("Error: cannot read '%s'\n", zName);
21922 return 0;
21923 }
21924 pBuf[nIn] = 0;
21925 if( pnByte ) *pnByte = nIn;
21926 return pBuf;
21927 }
21928
21929 #if defined(SQLITE_ENABLE_SESSION)
21930 /*
21931 ** Close a single OpenSession object and release all of its associated
21932 ** resources.
21933 */
session_close(OpenSession * pSession)21934 static void session_close(OpenSession *pSession){
21935 int i;
21936 sqlite3session_delete(pSession->p);
21937 sqlite3_free(pSession->zName);
21938 for(i=0; i<pSession->nFilter; i++){
21939 sqlite3_free(pSession->azFilter[i]);
21940 }
21941 sqlite3_free(pSession->azFilter);
21942 memset(pSession, 0, sizeof(OpenSession));
21943 }
21944 #endif
21945
21946 /*
21947 ** Close all OpenSession objects and release all associated resources.
21948 */
21949 #if defined(SQLITE_ENABLE_SESSION)
session_close_all(ShellState * p,int i)21950 static void session_close_all(ShellState *p, int i){
21951 int j;
21952 struct AuxDb *pAuxDb = i<0 ? p->pAuxDb : &p->aAuxDb[i];
21953 for(j=0; j<pAuxDb->nSession; j++){
21954 session_close(&pAuxDb->aSession[j]);
21955 }
21956 pAuxDb->nSession = 0;
21957 }
21958 #else
21959 # define session_close_all(X,Y)
21960 #endif
21961
21962 /*
21963 ** Implementation of the xFilter function for an open session. Omit
21964 ** any tables named by ".session filter" but let all other table through.
21965 */
21966 #if defined(SQLITE_ENABLE_SESSION)
session_filter(void * pCtx,const char * zTab)21967 static int session_filter(void *pCtx, const char *zTab){
21968 OpenSession *pSession = (OpenSession*)pCtx;
21969 int i;
21970 for(i=0; i<pSession->nFilter; i++){
21971 if( sqlite3_strglob(pSession->azFilter[i], zTab)==0 ) return 0;
21972 }
21973 return 1;
21974 }
21975 #endif
21976
21977 /*
21978 ** Try to deduce the type of file for zName based on its content. Return
21979 ** one of the SHELL_OPEN_* constants.
21980 **
21981 ** If the file does not exist or is empty but its name looks like a ZIP
21982 ** archive and the dfltZip flag is true, then assume it is a ZIP archive.
21983 ** Otherwise, assume an ordinary database regardless of the filename if
21984 ** the type cannot be determined from content.
21985 */
deduceDatabaseType(const char * zName,int dfltZip)21986 static int deduceDatabaseType(const char *zName, int dfltZip){
21987 FILE *f = fopen(zName, "rb");
21988 size_t n;
21989 int rc = SHELL_OPEN_UNSPEC;
21990 char zBuf[100];
21991 if( f==0 ){
21992 if( dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){
21993 return SHELL_OPEN_ZIPFILE;
21994 }else{
21995 return SHELL_OPEN_NORMAL;
21996 }
21997 }
21998 n = fread(zBuf, 16, 1, f);
21999 if( n==1 && memcmp(zBuf, "SQLite format 3", 16)==0 ){
22000 fclose(f);
22001 return SHELL_OPEN_NORMAL;
22002 }
22003 fseek(f, -25, SEEK_END);
22004 n = fread(zBuf, 25, 1, f);
22005 if( n==1 && memcmp(zBuf, "Start-Of-SQLite3-", 17)==0 ){
22006 rc = SHELL_OPEN_APPENDVFS;
22007 }else{
22008 fseek(f, -22, SEEK_END);
22009 n = fread(zBuf, 22, 1, f);
22010 if( n==1 && zBuf[0]==0x50 && zBuf[1]==0x4b && zBuf[2]==0x05
22011 && zBuf[3]==0x06 ){
22012 rc = SHELL_OPEN_ZIPFILE;
22013 }else if( n==0 && dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){
22014 rc = SHELL_OPEN_ZIPFILE;
22015 }
22016 }
22017 fclose(f);
22018 return rc;
22019 }
22020
22021 #ifndef SQLITE_OMIT_DESERIALIZE
22022 /*
22023 ** Reconstruct an in-memory database using the output from the "dbtotxt"
22024 ** program. Read content from the file in p->aAuxDb[].zDbFilename.
22025 ** If p->aAuxDb[].zDbFilename is 0, then read from standard input.
22026 */
readHexDb(ShellState * p,int * pnData)22027 static unsigned char *readHexDb(ShellState *p, int *pnData){
22028 unsigned char *a = 0;
22029 int nLine;
22030 int n = 0;
22031 int pgsz = 0;
22032 int iOffset = 0;
22033 int j, k;
22034 int rc;
22035 FILE *in;
22036 const char *zDbFilename = p->pAuxDb->zDbFilename;
22037 unsigned int x[16];
22038 char zLine[1000];
22039 if( zDbFilename ){
22040 in = fopen(zDbFilename, "r");
22041 if( in==0 ){
22042 eputf("cannot open \"%s\" for reading\n", zDbFilename);
22043 return 0;
22044 }
22045 nLine = 0;
22046 }else{
22047 in = p->in;
22048 nLine = p->lineno;
22049 if( in==0 ) in = stdin;
22050 }
22051 *pnData = 0;
22052 nLine++;
22053 if( fgets(zLine, sizeof(zLine), in)==0 ) goto readHexDb_error;
22054 rc = sscanf(zLine, "| size %d pagesize %d", &n, &pgsz);
22055 if( rc!=2 ) goto readHexDb_error;
22056 if( n<0 ) goto readHexDb_error;
22057 if( pgsz<512 || pgsz>65536 || (pgsz&(pgsz-1))!=0 ) goto readHexDb_error;
22058 n = (n+pgsz-1)&~(pgsz-1); /* Round n up to the next multiple of pgsz */
22059 a = sqlite3_malloc( n ? n : 1 );
22060 shell_check_oom(a);
22061 memset(a, 0, n);
22062 if( pgsz<512 || pgsz>65536 || (pgsz & (pgsz-1))!=0 ){
22063 eputz("invalid pagesize\n");
22064 goto readHexDb_error;
22065 }
22066 for(nLine++; fgets(zLine, sizeof(zLine), in)!=0; nLine++){
22067 rc = sscanf(zLine, "| page %d offset %d", &j, &k);
22068 if( rc==2 ){
22069 iOffset = k;
22070 continue;
22071 }
22072 if( cli_strncmp(zLine, "| end ", 6)==0 ){
22073 break;
22074 }
22075 rc = sscanf(zLine,"| %d: %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x",
22076 &j, &x[0], &x[1], &x[2], &x[3], &x[4], &x[5], &x[6], &x[7],
22077 &x[8], &x[9], &x[10], &x[11], &x[12], &x[13], &x[14], &x[15]);
22078 if( rc==17 ){
22079 k = iOffset+j;
22080 if( k+16<=n && k>=0 ){
22081 int ii;
22082 for(ii=0; ii<16; ii++) a[k+ii] = x[ii]&0xff;
22083 }
22084 }
22085 }
22086 *pnData = n;
22087 if( in!=p->in ){
22088 fclose(in);
22089 }else{
22090 p->lineno = nLine;
22091 }
22092 return a;
22093
22094 readHexDb_error:
22095 if( in!=p->in ){
22096 fclose(in);
22097 }else{
22098 while( fgets(zLine, sizeof(zLine), p->in)!=0 ){
22099 nLine++;
22100 if(cli_strncmp(zLine, "| end ", 6)==0 ) break;
22101 }
22102 p->lineno = nLine;
22103 }
22104 sqlite3_free(a);
22105 eputf("Error on line %d of --hexdb input\n", nLine);
22106 return 0;
22107 }
22108 #endif /* SQLITE_OMIT_DESERIALIZE */
22109
22110 /*
22111 ** Scalar function "usleep(X)" invokes sqlite3_sleep(X) and returns X.
22112 */
shellUSleepFunc(sqlite3_context * context,int argcUnused,sqlite3_value ** argv)22113 static void shellUSleepFunc(
22114 sqlite3_context *context,
22115 int argcUnused,
22116 sqlite3_value **argv
22117 ){
22118 int sleep = sqlite3_value_int(argv[0]);
22119 (void)argcUnused;
22120 sqlite3_sleep(sleep/1000);
22121 sqlite3_result_int(context, sleep);
22122 }
22123
22124 /* Flags for open_db().
22125 **
22126 ** The default behavior of open_db() is to exit(1) if the database fails to
22127 ** open. The OPEN_DB_KEEPALIVE flag changes that so that it prints an error
22128 ** but still returns without calling exit.
22129 **
22130 ** The OPEN_DB_ZIPFILE flag causes open_db() to prefer to open files as a
22131 ** ZIP archive if the file does not exist or is empty and its name matches
22132 ** the *.zip pattern.
22133 */
22134 #define OPEN_DB_KEEPALIVE 0x001 /* Return after error if true */
22135 #define OPEN_DB_ZIPFILE 0x002 /* Open as ZIP if name matches *.zip */
22136
22137 /*
22138 ** Make sure the database is open. If it is not, then open it. If
22139 ** the database fails to open, print an error message and exit.
22140 */
open_db(ShellState * p,int openFlags)22141 static void open_db(ShellState *p, int openFlags){
22142 if( p->db==0 ){
22143 const char *zDbFilename = p->pAuxDb->zDbFilename;
22144 if( p->openMode==SHELL_OPEN_UNSPEC ){
22145 if( zDbFilename==0 || zDbFilename[0]==0 ){
22146 p->openMode = SHELL_OPEN_NORMAL;
22147 }else{
22148 p->openMode = (u8)deduceDatabaseType(zDbFilename,
22149 (openFlags & OPEN_DB_ZIPFILE)!=0);
22150 }
22151 }
22152 switch( p->openMode ){
22153 case SHELL_OPEN_APPENDVFS: {
22154 sqlite3_open_v2(zDbFilename, &p->db,
22155 SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, "apndvfs");
22156 break;
22157 }
22158 case SHELL_OPEN_HEXDB:
22159 case SHELL_OPEN_DESERIALIZE: {
22160 sqlite3_open(0, &p->db);
22161 break;
22162 }
22163 case SHELL_OPEN_ZIPFILE: {
22164 sqlite3_open(":memory:", &p->db);
22165 break;
22166 }
22167 case SHELL_OPEN_READONLY: {
22168 sqlite3_open_v2(zDbFilename, &p->db,
22169 SQLITE_OPEN_READONLY|p->openFlags, 0);
22170 break;
22171 }
22172 case SHELL_OPEN_UNSPEC:
22173 case SHELL_OPEN_NORMAL: {
22174 sqlite3_open_v2(zDbFilename, &p->db,
22175 SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, 0);
22176 break;
22177 }
22178 }
22179 if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){
22180 eputf("Error: unable to open database \"%s\": %s\n",
22181 zDbFilename, sqlite3_errmsg(p->db));
22182 if( (openFlags & OPEN_DB_KEEPALIVE)==0 ){
22183 exit(1);
22184 }
22185 sqlite3_close(p->db);
22186 sqlite3_open(":memory:", &p->db);
22187 if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){
22188 eputz("Also: unable to open substitute in-memory database.\n");
22189 exit(1);
22190 }else{
22191 eputf("Notice: using substitute in-memory database instead of \"%s\"\n",
22192 zDbFilename);
22193 }
22194 }
22195 globalDb = p->db;
22196 sqlite3_db_config(p->db, SQLITE_DBCONFIG_STMT_SCANSTATUS, (int)0, (int*)0);
22197
22198 /* Reflect the use or absence of --unsafe-testing invocation. */
22199 {
22200 int testmode_on = ShellHasFlag(p,SHFLG_TestingMode);
22201 sqlite3_db_config(p->db, SQLITE_DBCONFIG_TRUSTED_SCHEMA, testmode_on,0);
22202 sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, !testmode_on,0);
22203 }
22204
22205 #ifndef SQLITE_OMIT_LOAD_EXTENSION
22206 sqlite3_enable_load_extension(p->db, 1);
22207 #endif
22208 sqlite3_shathree_init(p->db, 0, 0);
22209 sqlite3_uint_init(p->db, 0, 0);
22210 sqlite3_decimal_init(p->db, 0, 0);
22211 sqlite3_base64_init(p->db, 0, 0);
22212 sqlite3_base85_init(p->db, 0, 0);
22213 sqlite3_regexp_init(p->db, 0, 0);
22214 sqlite3_ieee_init(p->db, 0, 0);
22215 sqlite3_series_init(p->db, 0, 0);
22216 #ifndef SQLITE_SHELL_FIDDLE
22217 sqlite3_fileio_init(p->db, 0, 0);
22218 sqlite3_completion_init(p->db, 0, 0);
22219 #endif
22220 #ifdef SQLITE_HAVE_ZLIB
22221 if( !p->bSafeModePersist ){
22222 sqlite3_zipfile_init(p->db, 0, 0);
22223 sqlite3_sqlar_init(p->db, 0, 0);
22224 }
22225 #endif
22226 #ifdef SQLITE_SHELL_EXTFUNCS
22227 /* Create a preprocessing mechanism for extensions to make
22228 * their own provisions for being built into the shell.
22229 * This is a short-span macro. See further below for usage.
22230 */
22231 #define SHELL_SUB_MACRO(base, variant) base ## _ ## variant
22232 #define SHELL_SUBMACRO(base, variant) SHELL_SUB_MACRO(base, variant)
22233 /* Let custom-included extensions get their ..._init() called.
22234 * The WHATEVER_INIT( db, pzErrorMsg, pApi ) macro should cause
22235 * the extension's sqlite3_*_init( db, pzErrorMsg, pApi )
22236 * initialization routine to be called.
22237 */
22238 {
22239 int irc = SHELL_SUBMACRO(SQLITE_SHELL_EXTFUNCS, INIT)(p->db);
22240 /* Let custom-included extensions expose their functionality.
22241 * The WHATEVER_EXPOSE( db, pzErrorMsg ) macro should cause
22242 * the SQL functions, virtual tables, collating sequences or
22243 * VFS's implemented by the extension to be registered.
22244 */
22245 if( irc==SQLITE_OK
22246 || irc==SQLITE_OK_LOAD_PERMANENTLY ){
22247 SHELL_SUBMACRO(SQLITE_SHELL_EXTFUNCS, EXPOSE)(p->db, 0);
22248 }
22249 #undef SHELL_SUB_MACRO
22250 #undef SHELL_SUBMACRO
22251 }
22252 #endif
22253
22254 sqlite3_create_function(p->db, "strtod", 1, SQLITE_UTF8, 0,
22255 shellStrtod, 0, 0);
22256 sqlite3_create_function(p->db, "dtostr", 1, SQLITE_UTF8, 0,
22257 shellDtostr, 0, 0);
22258 sqlite3_create_function(p->db, "dtostr", 2, SQLITE_UTF8, 0,
22259 shellDtostr, 0, 0);
22260 sqlite3_create_function(p->db, "shell_add_schema", 3, SQLITE_UTF8, 0,
22261 shellAddSchemaName, 0, 0);
22262 sqlite3_create_function(p->db, "shell_module_schema", 1, SQLITE_UTF8, 0,
22263 shellModuleSchema, 0, 0);
22264 sqlite3_create_function(p->db, "shell_putsnl", 1, SQLITE_UTF8, p,
22265 shellPutsFunc, 0, 0);
22266 sqlite3_create_function(p->db, "usleep",1,SQLITE_UTF8,0,
22267 shellUSleepFunc, 0, 0);
22268 #ifndef SQLITE_NOHAVE_SYSTEM
22269 sqlite3_create_function(p->db, "edit", 1, SQLITE_UTF8, 0,
22270 editFunc, 0, 0);
22271 sqlite3_create_function(p->db, "edit", 2, SQLITE_UTF8, 0,
22272 editFunc, 0, 0);
22273 #endif
22274
22275 if( p->openMode==SHELL_OPEN_ZIPFILE ){
22276 char *zSql = sqlite3_mprintf(
22277 "CREATE VIRTUAL TABLE zip USING zipfile(%Q);", zDbFilename);
22278 shell_check_oom(zSql);
22279 sqlite3_exec(p->db, zSql, 0, 0, 0);
22280 sqlite3_free(zSql);
22281 }
22282 #ifndef SQLITE_OMIT_DESERIALIZE
22283 else
22284 if( p->openMode==SHELL_OPEN_DESERIALIZE || p->openMode==SHELL_OPEN_HEXDB ){
22285 int rc;
22286 int nData = 0;
22287 unsigned char *aData;
22288 if( p->openMode==SHELL_OPEN_DESERIALIZE ){
22289 aData = (unsigned char*)readFile(zDbFilename, &nData);
22290 }else{
22291 aData = readHexDb(p, &nData);
22292 }
22293 if( aData==0 ){
22294 return;
22295 }
22296 rc = sqlite3_deserialize(p->db, "main", aData, nData, nData,
22297 SQLITE_DESERIALIZE_RESIZEABLE |
22298 SQLITE_DESERIALIZE_FREEONCLOSE);
22299 if( rc ){
22300 eputf("Error: sqlite3_deserialize() returns %d\n", rc);
22301 }
22302 if( p->szMax>0 ){
22303 sqlite3_file_control(p->db, "main", SQLITE_FCNTL_SIZE_LIMIT, &p->szMax);
22304 }
22305 }
22306 #endif
22307 }
22308 if( p->db!=0 ){
22309 if( p->bSafeModePersist ){
22310 sqlite3_set_authorizer(p->db, safeModeAuth, p);
22311 }
22312 sqlite3_db_config(
22313 p->db, SQLITE_DBCONFIG_STMT_SCANSTATUS, p->scanstatsOn, (int*)0
22314 );
22315 }
22316 }
22317
22318 /*
22319 ** Attempt to close the database connection. Report errors.
22320 */
close_db(sqlite3 * db)22321 static void close_db(sqlite3 *db){
22322 int rc = sqlite3_close(db);
22323 if( rc ){
22324 eputf("Error: sqlite3_close() returns %d: %s\n", rc, sqlite3_errmsg(db));
22325 }
22326 }
22327
22328 #if HAVE_READLINE || HAVE_EDITLINE
22329 /*
22330 ** Readline completion callbacks
22331 */
readline_completion_generator(const char * text,int state)22332 static char *readline_completion_generator(const char *text, int state){
22333 static sqlite3_stmt *pStmt = 0;
22334 char *zRet;
22335 if( state==0 ){
22336 char *zSql;
22337 sqlite3_finalize(pStmt);
22338 zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
22339 " FROM completion(%Q) ORDER BY 1", text);
22340 shell_check_oom(zSql);
22341 sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
22342 sqlite3_free(zSql);
22343 }
22344 if( sqlite3_step(pStmt)==SQLITE_ROW ){
22345 const char *z = (const char*)sqlite3_column_text(pStmt,0);
22346 zRet = z ? strdup(z) : 0;
22347 }else{
22348 sqlite3_finalize(pStmt);
22349 pStmt = 0;
22350 zRet = 0;
22351 }
22352 return zRet;
22353 }
readline_completion(const char * zText,int iStart,int iEnd)22354 static char **readline_completion(const char *zText, int iStart, int iEnd){
22355 (void)iStart;
22356 (void)iEnd;
22357 rl_attempted_completion_over = 1;
22358 return rl_completion_matches(zText, readline_completion_generator);
22359 }
22360
22361 #elif HAVE_LINENOISE
22362 /*
22363 ** Linenoise completion callback
22364 */
linenoise_completion(const char * zLine,linenoiseCompletions * lc)22365 static void linenoise_completion(const char *zLine, linenoiseCompletions *lc){
22366 i64 nLine = strlen(zLine);
22367 i64 i, iStart;
22368 sqlite3_stmt *pStmt = 0;
22369 char *zSql;
22370 char zBuf[1000];
22371
22372 if( nLine>(i64)sizeof(zBuf)-30 ) return;
22373 if( zLine[0]=='.' || zLine[0]=='#') return;
22374 for(i=nLine-1; i>=0 && (isalnum(zLine[i]) || zLine[i]=='_'); i--){}
22375 if( i==nLine-1 ) return;
22376 iStart = i+1;
22377 memcpy(zBuf, zLine, iStart);
22378 zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
22379 " FROM completion(%Q,%Q) ORDER BY 1",
22380 &zLine[iStart], zLine);
22381 shell_check_oom(zSql);
22382 sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
22383 sqlite3_free(zSql);
22384 sqlite3_exec(globalDb, "PRAGMA page_count", 0, 0, 0); /* Load the schema */
22385 while( sqlite3_step(pStmt)==SQLITE_ROW ){
22386 const char *zCompletion = (const char*)sqlite3_column_text(pStmt, 0);
22387 int nCompletion = sqlite3_column_bytes(pStmt, 0);
22388 if( iStart+nCompletion < (i64)sizeof(zBuf)-1 && zCompletion ){
22389 memcpy(zBuf+iStart, zCompletion, nCompletion+1);
22390 linenoiseAddCompletion(lc, zBuf);
22391 }
22392 }
22393 sqlite3_finalize(pStmt);
22394 }
22395 #endif
22396
22397 /*
22398 ** Do C-language style dequoting.
22399 **
22400 ** \a -> alarm
22401 ** \b -> backspace
22402 ** \t -> tab
22403 ** \n -> newline
22404 ** \v -> vertical tab
22405 ** \f -> form feed
22406 ** \r -> carriage return
22407 ** \s -> space
22408 ** \" -> "
22409 ** \' -> '
22410 ** \\ -> backslash
22411 ** \NNN -> ascii character NNN in octal
22412 ** \xHH -> ascii character HH in hexadecimal
22413 */
resolve_backslashes(char * z)22414 static void resolve_backslashes(char *z){
22415 int i, j;
22416 char c;
22417 while( *z && *z!='\\' ) z++;
22418 for(i=j=0; (c = z[i])!=0; i++, j++){
22419 if( c=='\\' && z[i+1]!=0 ){
22420 c = z[++i];
22421 if( c=='a' ){
22422 c = '\a';
22423 }else if( c=='b' ){
22424 c = '\b';
22425 }else if( c=='t' ){
22426 c = '\t';
22427 }else if( c=='n' ){
22428 c = '\n';
22429 }else if( c=='v' ){
22430 c = '\v';
22431 }else if( c=='f' ){
22432 c = '\f';
22433 }else if( c=='r' ){
22434 c = '\r';
22435 }else if( c=='"' ){
22436 c = '"';
22437 }else if( c=='\'' ){
22438 c = '\'';
22439 }else if( c=='\\' ){
22440 c = '\\';
22441 }else if( c=='x' ){
22442 int nhd = 0, hdv;
22443 u8 hv = 0;
22444 while( nhd<2 && (c=z[i+1+nhd])!=0 && (hdv=hexDigitValue(c))>=0 ){
22445 hv = (u8)((hv<<4)|hdv);
22446 ++nhd;
22447 }
22448 i += nhd;
22449 c = (u8)hv;
22450 }else if( c>='0' && c<='7' ){
22451 c -= '0';
22452 if( z[i+1]>='0' && z[i+1]<='7' ){
22453 i++;
22454 c = (c<<3) + z[i] - '0';
22455 if( z[i+1]>='0' && z[i+1]<='7' ){
22456 i++;
22457 c = (c<<3) + z[i] - '0';
22458 }
22459 }
22460 }
22461 }
22462 z[j] = c;
22463 }
22464 if( j<i ) z[j] = 0;
22465 }
22466
22467 /*
22468 ** Interpret zArg as either an integer or a boolean value. Return 1 or 0
22469 ** for TRUE and FALSE. Return the integer value if appropriate.
22470 */
booleanValue(const char * zArg)22471 static int booleanValue(const char *zArg){
22472 int i;
22473 if( zArg[0]=='0' && zArg[1]=='x' ){
22474 for(i=2; hexDigitValue(zArg[i])>=0; i++){}
22475 }else{
22476 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
22477 }
22478 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
22479 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
22480 return 1;
22481 }
22482 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
22483 return 0;
22484 }
22485 eputf("ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n", zArg);
22486 return 0;
22487 }
22488
22489 /*
22490 ** Set or clear a shell flag according to a boolean value.
22491 */
setOrClearFlag(ShellState * p,unsigned mFlag,const char * zArg)22492 static void setOrClearFlag(ShellState *p, unsigned mFlag, const char *zArg){
22493 if( booleanValue(zArg) ){
22494 ShellSetFlag(p, mFlag);
22495 }else{
22496 ShellClearFlag(p, mFlag);
22497 }
22498 }
22499
22500 /*
22501 ** Close an output file, assuming it is not stderr or stdout
22502 */
output_file_close(FILE * f)22503 static void output_file_close(FILE *f){
22504 if( f && f!=stdout && f!=stderr ) fclose(f);
22505 }
22506
22507 /*
22508 ** Try to open an output file. The names "stdout" and "stderr" are
22509 ** recognized and do the right thing. NULL is returned if the output
22510 ** filename is "off".
22511 */
output_file_open(const char * zFile,int bTextMode)22512 static FILE *output_file_open(const char *zFile, int bTextMode){
22513 FILE *f;
22514 if( cli_strcmp(zFile,"stdout")==0 ){
22515 f = stdout;
22516 }else if( cli_strcmp(zFile, "stderr")==0 ){
22517 f = stderr;
22518 }else if( cli_strcmp(zFile, "off")==0 ){
22519 f = 0;
22520 }else{
22521 f = fopen(zFile, bTextMode ? "w" : "wb");
22522 if( f==0 ){
22523 eputf("Error: cannot open \"%s\"\n", zFile);
22524 }
22525 }
22526 return f;
22527 }
22528
22529 #ifndef SQLITE_OMIT_TRACE
22530 /*
22531 ** A routine for handling output from sqlite3_trace().
22532 */
sql_trace_callback(unsigned mType,void * pArg,void * pP,void * pX)22533 static int sql_trace_callback(
22534 unsigned mType, /* The trace type */
22535 void *pArg, /* The ShellState pointer */
22536 void *pP, /* Usually a pointer to sqlite_stmt */
22537 void *pX /* Auxiliary output */
22538 ){
22539 ShellState *p = (ShellState*)pArg;
22540 sqlite3_stmt *pStmt;
22541 const char *zSql;
22542 i64 nSql;
22543 if( p->traceOut==0 ) return 0;
22544 if( mType==SQLITE_TRACE_CLOSE ){
22545 sputz(p->traceOut, "-- closing database connection\n");
22546 return 0;
22547 }
22548 if( mType!=SQLITE_TRACE_ROW && pX!=0 && ((const char*)pX)[0]=='-' ){
22549 zSql = (const char*)pX;
22550 }else{
22551 pStmt = (sqlite3_stmt*)pP;
22552 switch( p->eTraceType ){
22553 case SHELL_TRACE_EXPANDED: {
22554 zSql = sqlite3_expanded_sql(pStmt);
22555 break;
22556 }
22557 #ifdef SQLITE_ENABLE_NORMALIZE
22558 case SHELL_TRACE_NORMALIZED: {
22559 zSql = sqlite3_normalized_sql(pStmt);
22560 break;
22561 }
22562 #endif
22563 default: {
22564 zSql = sqlite3_sql(pStmt);
22565 break;
22566 }
22567 }
22568 }
22569 if( zSql==0 ) return 0;
22570 nSql = strlen(zSql);
22571 if( nSql>1000000000 ) nSql = 1000000000;
22572 while( nSql>0 && zSql[nSql-1]==';' ){ nSql--; }
22573 switch( mType ){
22574 case SQLITE_TRACE_ROW:
22575 case SQLITE_TRACE_STMT: {
22576 sputf(p->traceOut, "%.*s;\n", (int)nSql, zSql);
22577 break;
22578 }
22579 case SQLITE_TRACE_PROFILE: {
22580 sqlite3_int64 nNanosec = pX ? *(sqlite3_int64*)pX : 0;
22581 sputf(p->traceOut, "%.*s; -- %lld ns\n", (int)nSql, zSql, nNanosec);
22582 break;
22583 }
22584 }
22585 return 0;
22586 }
22587 #endif
22588
22589 /*
22590 ** A no-op routine that runs with the ".breakpoint" doc-command. This is
22591 ** a useful spot to set a debugger breakpoint.
22592 **
22593 ** This routine does not do anything practical. The code are there simply
22594 ** to prevent the compiler from optimizing this routine out.
22595 */
test_breakpoint(void)22596 static void test_breakpoint(void){
22597 static unsigned int nCall = 0;
22598 if( (nCall++)==0xffffffff ) printf("Many .breakpoints have run\n");
22599 }
22600
22601 /*
22602 ** An object used to read a CSV and other files for import.
22603 */
22604 typedef struct ImportCtx ImportCtx;
22605 struct ImportCtx {
22606 const char *zFile; /* Name of the input file */
22607 FILE *in; /* Read the CSV text from this input stream */
22608 int (SQLITE_CDECL *xCloser)(FILE*); /* Func to close in */
22609 char *z; /* Accumulated text for a field */
22610 int n; /* Number of bytes in z */
22611 int nAlloc; /* Space allocated for z[] */
22612 int nLine; /* Current line number */
22613 int nRow; /* Number of rows imported */
22614 int nErr; /* Number of errors encountered */
22615 int bNotFirst; /* True if one or more bytes already read */
22616 int cTerm; /* Character that terminated the most recent field */
22617 int cColSep; /* The column separator character. (Usually ",") */
22618 int cRowSep; /* The row separator character. (Usually "\n") */
22619 };
22620
22621 /* Clean up resourced used by an ImportCtx */
import_cleanup(ImportCtx * p)22622 static void import_cleanup(ImportCtx *p){
22623 if( p->in!=0 && p->xCloser!=0 ){
22624 p->xCloser(p->in);
22625 p->in = 0;
22626 }
22627 sqlite3_free(p->z);
22628 p->z = 0;
22629 }
22630
22631 /* Append a single byte to z[] */
import_append_char(ImportCtx * p,int c)22632 static void import_append_char(ImportCtx *p, int c){
22633 if( p->n+1>=p->nAlloc ){
22634 p->nAlloc += p->nAlloc + 100;
22635 p->z = sqlite3_realloc64(p->z, p->nAlloc);
22636 shell_check_oom(p->z);
22637 }
22638 p->z[p->n++] = (char)c;
22639 }
22640
22641 /* Read a single field of CSV text. Compatible with rfc4180 and extended
22642 ** with the option of having a separator other than ",".
22643 **
22644 ** + Input comes from p->in.
22645 ** + Store results in p->z of length p->n. Space to hold p->z comes
22646 ** from sqlite3_malloc64().
22647 ** + Use p->cSep as the column separator. The default is ",".
22648 ** + Use p->rSep as the row separator. The default is "\n".
22649 ** + Keep track of the line number in p->nLine.
22650 ** + Store the character that terminates the field in p->cTerm. Store
22651 ** EOF on end-of-file.
22652 ** + Report syntax errors on stderr
22653 */
csv_read_one_field(ImportCtx * p)22654 static char *SQLITE_CDECL csv_read_one_field(ImportCtx *p){
22655 int c;
22656 int cSep = (u8)p->cColSep;
22657 int rSep = (u8)p->cRowSep;
22658 p->n = 0;
22659 c = fgetc(p->in);
22660 if( c==EOF || seenInterrupt ){
22661 p->cTerm = EOF;
22662 return 0;
22663 }
22664 if( c=='"' ){
22665 int pc, ppc;
22666 int startLine = p->nLine;
22667 int cQuote = c;
22668 pc = ppc = 0;
22669 while( 1 ){
22670 c = fgetc(p->in);
22671 if( c==rSep ) p->nLine++;
22672 if( c==cQuote ){
22673 if( pc==cQuote ){
22674 pc = 0;
22675 continue;
22676 }
22677 }
22678 if( (c==cSep && pc==cQuote)
22679 || (c==rSep && pc==cQuote)
22680 || (c==rSep && pc=='\r' && ppc==cQuote)
22681 || (c==EOF && pc==cQuote)
22682 ){
22683 do{ p->n--; }while( p->z[p->n]!=cQuote );
22684 p->cTerm = c;
22685 break;
22686 }
22687 if( pc==cQuote && c!='\r' ){
22688 eputf("%s:%d: unescaped %c character\n", p->zFile, p->nLine, cQuote);
22689 }
22690 if( c==EOF ){
22691 eputf("%s:%d: unterminated %c-quoted field\n",
22692 p->zFile, startLine, cQuote);
22693 p->cTerm = c;
22694 break;
22695 }
22696 import_append_char(p, c);
22697 ppc = pc;
22698 pc = c;
22699 }
22700 }else{
22701 /* If this is the first field being parsed and it begins with the
22702 ** UTF-8 BOM (0xEF BB BF) then skip the BOM */
22703 if( (c&0xff)==0xef && p->bNotFirst==0 ){
22704 import_append_char(p, c);
22705 c = fgetc(p->in);
22706 if( (c&0xff)==0xbb ){
22707 import_append_char(p, c);
22708 c = fgetc(p->in);
22709 if( (c&0xff)==0xbf ){
22710 p->bNotFirst = 1;
22711 p->n = 0;
22712 return csv_read_one_field(p);
22713 }
22714 }
22715 }
22716 while( c!=EOF && c!=cSep && c!=rSep ){
22717 import_append_char(p, c);
22718 c = fgetc(p->in);
22719 }
22720 if( c==rSep ){
22721 p->nLine++;
22722 if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
22723 }
22724 p->cTerm = c;
22725 }
22726 if( p->z ) p->z[p->n] = 0;
22727 p->bNotFirst = 1;
22728 return p->z;
22729 }
22730
22731 /* Read a single field of ASCII delimited text.
22732 **
22733 ** + Input comes from p->in.
22734 ** + Store results in p->z of length p->n. Space to hold p->z comes
22735 ** from sqlite3_malloc64().
22736 ** + Use p->cSep as the column separator. The default is "\x1F".
22737 ** + Use p->rSep as the row separator. The default is "\x1E".
22738 ** + Keep track of the row number in p->nLine.
22739 ** + Store the character that terminates the field in p->cTerm. Store
22740 ** EOF on end-of-file.
22741 ** + Report syntax errors on stderr
22742 */
ascii_read_one_field(ImportCtx * p)22743 static char *SQLITE_CDECL ascii_read_one_field(ImportCtx *p){
22744 int c;
22745 int cSep = (u8)p->cColSep;
22746 int rSep = (u8)p->cRowSep;
22747 p->n = 0;
22748 c = fgetc(p->in);
22749 if( c==EOF || seenInterrupt ){
22750 p->cTerm = EOF;
22751 return 0;
22752 }
22753 while( c!=EOF && c!=cSep && c!=rSep ){
22754 import_append_char(p, c);
22755 c = fgetc(p->in);
22756 }
22757 if( c==rSep ){
22758 p->nLine++;
22759 }
22760 p->cTerm = c;
22761 if( p->z ) p->z[p->n] = 0;
22762 return p->z;
22763 }
22764
22765 /*
22766 ** Try to transfer data for table zTable. If an error is seen while
22767 ** moving forward, try to go backwards. The backwards movement won't
22768 ** work for WITHOUT ROWID tables.
22769 */
tryToCloneData(ShellState * p,sqlite3 * newDb,const char * zTable)22770 static void tryToCloneData(
22771 ShellState *p,
22772 sqlite3 *newDb,
22773 const char *zTable
22774 ){
22775 sqlite3_stmt *pQuery = 0;
22776 sqlite3_stmt *pInsert = 0;
22777 char *zQuery = 0;
22778 char *zInsert = 0;
22779 int rc;
22780 int i, j, n;
22781 int nTable = strlen30(zTable);
22782 int k = 0;
22783 int cnt = 0;
22784 const int spinRate = 10000;
22785
22786 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
22787 shell_check_oom(zQuery);
22788 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
22789 if( rc ){
22790 eputf("Error %d: %s on [%s]\n",
22791 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db), zQuery);
22792 goto end_data_xfer;
22793 }
22794 n = sqlite3_column_count(pQuery);
22795 zInsert = sqlite3_malloc64(200 + nTable + n*3);
22796 shell_check_oom(zInsert);
22797 sqlite3_snprintf(200+nTable,zInsert,
22798 "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
22799 i = strlen30(zInsert);
22800 for(j=1; j<n; j++){
22801 memcpy(zInsert+i, ",?", 2);
22802 i += 2;
22803 }
22804 memcpy(zInsert+i, ");", 3);
22805 rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
22806 if( rc ){
22807 eputf("Error %d: %s on [%s]\n",
22808 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb), zInsert);
22809 goto end_data_xfer;
22810 }
22811 for(k=0; k<2; k++){
22812 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
22813 for(i=0; i<n; i++){
22814 switch( sqlite3_column_type(pQuery, i) ){
22815 case SQLITE_NULL: {
22816 sqlite3_bind_null(pInsert, i+1);
22817 break;
22818 }
22819 case SQLITE_INTEGER: {
22820 sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
22821 break;
22822 }
22823 case SQLITE_FLOAT: {
22824 sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
22825 break;
22826 }
22827 case SQLITE_TEXT: {
22828 sqlite3_bind_text(pInsert, i+1,
22829 (const char*)sqlite3_column_text(pQuery,i),
22830 -1, SQLITE_STATIC);
22831 break;
22832 }
22833 case SQLITE_BLOB: {
22834 sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
22835 sqlite3_column_bytes(pQuery,i),
22836 SQLITE_STATIC);
22837 break;
22838 }
22839 }
22840 } /* End for */
22841 rc = sqlite3_step(pInsert);
22842 if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
22843 eputf("Error %d: %s\n",
22844 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb));
22845 }
22846 sqlite3_reset(pInsert);
22847 cnt++;
22848 if( (cnt%spinRate)==0 ){
22849 printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
22850 fflush(stdout);
22851 }
22852 } /* End while */
22853 if( rc==SQLITE_DONE ) break;
22854 sqlite3_finalize(pQuery);
22855 sqlite3_free(zQuery);
22856 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
22857 zTable);
22858 shell_check_oom(zQuery);
22859 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
22860 if( rc ){
22861 eputf("Warning: cannot step \"%s\" backwards", zTable);
22862 break;
22863 }
22864 } /* End for(k=0...) */
22865
22866 end_data_xfer:
22867 sqlite3_finalize(pQuery);
22868 sqlite3_finalize(pInsert);
22869 sqlite3_free(zQuery);
22870 sqlite3_free(zInsert);
22871 }
22872
22873
22874 /*
22875 ** Try to transfer all rows of the schema that match zWhere. For
22876 ** each row, invoke xForEach() on the object defined by that row.
22877 ** If an error is encountered while moving forward through the
22878 ** sqlite_schema table, try again moving backwards.
22879 */
tryToCloneSchema(ShellState * p,sqlite3 * newDb,const char * zWhere,void (* xForEach)(ShellState *,sqlite3 *,const char *))22880 static void tryToCloneSchema(
22881 ShellState *p,
22882 sqlite3 *newDb,
22883 const char *zWhere,
22884 void (*xForEach)(ShellState*,sqlite3*,const char*)
22885 ){
22886 sqlite3_stmt *pQuery = 0;
22887 char *zQuery = 0;
22888 int rc;
22889 const unsigned char *zName;
22890 const unsigned char *zSql;
22891 char *zErrMsg = 0;
22892
22893 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_schema"
22894 " WHERE %s ORDER BY rowid ASC", zWhere);
22895 shell_check_oom(zQuery);
22896 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
22897 if( rc ){
22898 eputf("Error: (%d) %s on [%s]\n", sqlite3_extended_errcode(p->db),
22899 sqlite3_errmsg(p->db), zQuery);
22900 goto end_schema_xfer;
22901 }
22902 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
22903 zName = sqlite3_column_text(pQuery, 0);
22904 zSql = sqlite3_column_text(pQuery, 1);
22905 if( zName==0 || zSql==0 ) continue;
22906 if( sqlite3_stricmp((char*)zName, "sqlite_sequence")!=0 ){
22907 sputf(stdout, "%s... ", zName); fflush(stdout);
22908 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
22909 if( zErrMsg ){
22910 eputf("Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
22911 sqlite3_free(zErrMsg);
22912 zErrMsg = 0;
22913 }
22914 }
22915 if( xForEach ){
22916 xForEach(p, newDb, (const char*)zName);
22917 }
22918 sputz(stdout, "done\n");
22919 }
22920 if( rc!=SQLITE_DONE ){
22921 sqlite3_finalize(pQuery);
22922 sqlite3_free(zQuery);
22923 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_schema"
22924 " WHERE %s ORDER BY rowid DESC", zWhere);
22925 shell_check_oom(zQuery);
22926 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
22927 if( rc ){
22928 eputf("Error: (%d) %s on [%s]\n",
22929 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db), zQuery);
22930 goto end_schema_xfer;
22931 }
22932 while( sqlite3_step(pQuery)==SQLITE_ROW ){
22933 zName = sqlite3_column_text(pQuery, 0);
22934 zSql = sqlite3_column_text(pQuery, 1);
22935 if( zName==0 || zSql==0 ) continue;
22936 if( sqlite3_stricmp((char*)zName, "sqlite_sequence")==0 ) continue;
22937 sputf(stdout, "%s... ", zName); fflush(stdout);
22938 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
22939 if( zErrMsg ){
22940 eputf("Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
22941 sqlite3_free(zErrMsg);
22942 zErrMsg = 0;
22943 }
22944 if( xForEach ){
22945 xForEach(p, newDb, (const char*)zName);
22946 }
22947 sputz(stdout, "done\n");
22948 }
22949 }
22950 end_schema_xfer:
22951 sqlite3_finalize(pQuery);
22952 sqlite3_free(zQuery);
22953 }
22954
22955 /*
22956 ** Open a new database file named "zNewDb". Try to recover as much information
22957 ** as possible out of the main database (which might be corrupt) and write it
22958 ** into zNewDb.
22959 */
tryToClone(ShellState * p,const char * zNewDb)22960 static void tryToClone(ShellState *p, const char *zNewDb){
22961 int rc;
22962 sqlite3 *newDb = 0;
22963 if( access(zNewDb,0)==0 ){
22964 eputf("File \"%s\" already exists.\n", zNewDb);
22965 return;
22966 }
22967 rc = sqlite3_open(zNewDb, &newDb);
22968 if( rc ){
22969 eputf("Cannot create output database: %s\n", sqlite3_errmsg(newDb));
22970 }else{
22971 sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0);
22972 sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
22973 tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
22974 tryToCloneSchema(p, newDb, "type!='table'", 0);
22975 sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
22976 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
22977 }
22978 close_db(newDb);
22979 }
22980
22981 #ifndef SQLITE_SHELL_FIDDLE
22982 /*
22983 ** Change the output stream (file or pipe or console) to something else.
22984 */
output_redir(ShellState * p,FILE * pfNew)22985 static void output_redir(ShellState *p, FILE *pfNew){
22986 if( p->out != stdout ) eputz("Output already redirected.\n");
22987 else{
22988 p->out = pfNew;
22989 setOutputStream(pfNew);
22990 }
22991 }
22992
22993 /*
22994 ** Change the output file back to stdout.
22995 **
22996 ** If the p->doXdgOpen flag is set, that means the output was being
22997 ** redirected to a temporary file named by p->zTempFile. In that case,
22998 ** launch start/open/xdg-open on that temporary file.
22999 */
output_reset(ShellState * p)23000 static void output_reset(ShellState *p){
23001 if( p->outfile[0]=='|' ){
23002 #ifndef SQLITE_OMIT_POPEN
23003 pclose(p->out);
23004 #endif
23005 }else{
23006 output_file_close(p->out);
23007 #ifndef SQLITE_NOHAVE_SYSTEM
23008 if( p->doXdgOpen ){
23009 const char *zXdgOpenCmd =
23010 #if defined(_WIN32)
23011 "start";
23012 #elif defined(__APPLE__)
23013 "open";
23014 #else
23015 "xdg-open";
23016 #endif
23017 char *zCmd;
23018 zCmd = sqlite3_mprintf("%s %s", zXdgOpenCmd, p->zTempFile);
23019 if( system(zCmd) ){
23020 eputf("Failed: [%s]\n", zCmd);
23021 }else{
23022 /* Give the start/open/xdg-open command some time to get
23023 ** going before we continue, and potential delete the
23024 ** p->zTempFile data file out from under it */
23025 sqlite3_sleep(2000);
23026 }
23027 sqlite3_free(zCmd);
23028 outputModePop(p);
23029 p->doXdgOpen = 0;
23030 }
23031 #endif /* !defined(SQLITE_NOHAVE_SYSTEM) */
23032 }
23033 p->outfile[0] = 0;
23034 p->out = stdout;
23035 setOutputStream(stdout);
23036 }
23037 #else
23038 # define output_redir(SS,pfO)
23039 # define output_reset(SS)
23040 #endif
23041
23042 /*
23043 ** Run an SQL command and return the single integer result.
23044 */
db_int(sqlite3 * db,const char * zSql)23045 static int db_int(sqlite3 *db, const char *zSql){
23046 sqlite3_stmt *pStmt;
23047 int res = 0;
23048 sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
23049 if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){
23050 res = sqlite3_column_int(pStmt,0);
23051 }
23052 sqlite3_finalize(pStmt);
23053 return res;
23054 }
23055
23056 #if SQLITE_SHELL_HAVE_RECOVER
23057 /*
23058 ** Convert a 2-byte or 4-byte big-endian integer into a native integer
23059 */
get2byteInt(unsigned char * a)23060 static unsigned int get2byteInt(unsigned char *a){
23061 return (a[0]<<8) + a[1];
23062 }
get4byteInt(unsigned char * a)23063 static unsigned int get4byteInt(unsigned char *a){
23064 return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3];
23065 }
23066
23067 /*
23068 ** Implementation of the ".dbinfo" command.
23069 **
23070 ** Return 1 on error, 2 to exit, and 0 otherwise.
23071 */
shell_dbinfo_command(ShellState * p,int nArg,char ** azArg)23072 static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){
23073 static const struct { const char *zName; int ofst; } aField[] = {
23074 { "file change counter:", 24 },
23075 { "database page count:", 28 },
23076 { "freelist page count:", 36 },
23077 { "schema cookie:", 40 },
23078 { "schema format:", 44 },
23079 { "default cache size:", 48 },
23080 { "autovacuum top root:", 52 },
23081 { "incremental vacuum:", 64 },
23082 { "text encoding:", 56 },
23083 { "user version:", 60 },
23084 { "application id:", 68 },
23085 { "software version:", 96 },
23086 };
23087 static const struct { const char *zName; const char *zSql; } aQuery[] = {
23088 { "number of tables:",
23089 "SELECT count(*) FROM %s WHERE type='table'" },
23090 { "number of indexes:",
23091 "SELECT count(*) FROM %s WHERE type='index'" },
23092 { "number of triggers:",
23093 "SELECT count(*) FROM %s WHERE type='trigger'" },
23094 { "number of views:",
23095 "SELECT count(*) FROM %s WHERE type='view'" },
23096 { "schema size:",
23097 "SELECT total(length(sql)) FROM %s" },
23098 };
23099 int i, rc;
23100 unsigned iDataVersion;
23101 char *zSchemaTab;
23102 char *zDb = nArg>=2 ? azArg[1] : "main";
23103 sqlite3_stmt *pStmt = 0;
23104 unsigned char aHdr[100];
23105 open_db(p, 0);
23106 if( p->db==0 ) return 1;
23107 rc = sqlite3_prepare_v2(p->db,
23108 "SELECT data FROM sqlite_dbpage(?1) WHERE pgno=1",
23109 -1, &pStmt, 0);
23110 if( rc ){
23111 eputf("error: %s\n", sqlite3_errmsg(p->db));
23112 sqlite3_finalize(pStmt);
23113 return 1;
23114 }
23115 sqlite3_bind_text(pStmt, 1, zDb, -1, SQLITE_STATIC);
23116 if( sqlite3_step(pStmt)==SQLITE_ROW
23117 && sqlite3_column_bytes(pStmt,0)>100
23118 ){
23119 const u8 *pb = sqlite3_column_blob(pStmt,0);
23120 shell_check_oom(pb);
23121 memcpy(aHdr, pb, 100);
23122 sqlite3_finalize(pStmt);
23123 }else{
23124 eputz("unable to read database header\n");
23125 sqlite3_finalize(pStmt);
23126 return 1;
23127 }
23128 i = get2byteInt(aHdr+16);
23129 if( i==1 ) i = 65536;
23130 oputf("%-20s %d\n", "database page size:", i);
23131 oputf("%-20s %d\n", "write format:", aHdr[18]);
23132 oputf("%-20s %d\n", "read format:", aHdr[19]);
23133 oputf("%-20s %d\n", "reserved bytes:", aHdr[20]);
23134 for(i=0; i<ArraySize(aField); i++){
23135 int ofst = aField[i].ofst;
23136 unsigned int val = get4byteInt(aHdr + ofst);
23137 oputf("%-20s %u", aField[i].zName, val);
23138 switch( ofst ){
23139 case 56: {
23140 if( val==1 ) oputz(" (utf8)");
23141 if( val==2 ) oputz(" (utf16le)");
23142 if( val==3 ) oputz(" (utf16be)");
23143 }
23144 }
23145 oputz("\n");
23146 }
23147 if( zDb==0 ){
23148 zSchemaTab = sqlite3_mprintf("main.sqlite_schema");
23149 }else if( cli_strcmp(zDb,"temp")==0 ){
23150 zSchemaTab = sqlite3_mprintf("%s", "sqlite_temp_schema");
23151 }else{
23152 zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_schema", zDb);
23153 }
23154 for(i=0; i<ArraySize(aQuery); i++){
23155 char *zSql = sqlite3_mprintf(aQuery[i].zSql, zSchemaTab);
23156 int val = db_int(p->db, zSql);
23157 sqlite3_free(zSql);
23158 oputf("%-20s %d\n", aQuery[i].zName, val);
23159 }
23160 sqlite3_free(zSchemaTab);
23161 sqlite3_file_control(p->db, zDb, SQLITE_FCNTL_DATA_VERSION, &iDataVersion);
23162 oputf("%-20s %u\n", "data version", iDataVersion);
23163 return 0;
23164 }
23165 #endif /* SQLITE_SHELL_HAVE_RECOVER */
23166
23167 /*
23168 ** Print the current sqlite3_errmsg() value to stderr and return 1.
23169 */
shellDatabaseError(sqlite3 * db)23170 static int shellDatabaseError(sqlite3 *db){
23171 const char *zErr = sqlite3_errmsg(db);
23172 eputf("Error: %s\n", zErr);
23173 return 1;
23174 }
23175
23176 /*
23177 ** Compare the pattern in zGlob[] against the text in z[]. Return TRUE
23178 ** if they match and FALSE (0) if they do not match.
23179 **
23180 ** Globbing rules:
23181 **
23182 ** '*' Matches any sequence of zero or more characters.
23183 **
23184 ** '?' Matches exactly one character.
23185 **
23186 ** [...] Matches one character from the enclosed list of
23187 ** characters.
23188 **
23189 ** [^...] Matches one character not in the enclosed list.
23190 **
23191 ** '#' Matches any sequence of one or more digits with an
23192 ** optional + or - sign in front
23193 **
23194 ** ' ' Any span of whitespace matches any other span of
23195 ** whitespace.
23196 **
23197 ** Extra whitespace at the end of z[] is ignored.
23198 */
testcase_glob(const char * zGlob,const char * z)23199 static int testcase_glob(const char *zGlob, const char *z){
23200 int c, c2;
23201 int invert;
23202 int seen;
23203
23204 while( (c = (*(zGlob++)))!=0 ){
23205 if( IsSpace(c) ){
23206 if( !IsSpace(*z) ) return 0;
23207 while( IsSpace(*zGlob) ) zGlob++;
23208 while( IsSpace(*z) ) z++;
23209 }else if( c=='*' ){
23210 while( (c=(*(zGlob++))) == '*' || c=='?' ){
23211 if( c=='?' && (*(z++))==0 ) return 0;
23212 }
23213 if( c==0 ){
23214 return 1;
23215 }else if( c=='[' ){
23216 while( *z && testcase_glob(zGlob-1,z)==0 ){
23217 z++;
23218 }
23219 return (*z)!=0;
23220 }
23221 while( (c2 = (*(z++)))!=0 ){
23222 while( c2!=c ){
23223 c2 = *(z++);
23224 if( c2==0 ) return 0;
23225 }
23226 if( testcase_glob(zGlob,z) ) return 1;
23227 }
23228 return 0;
23229 }else if( c=='?' ){
23230 if( (*(z++))==0 ) return 0;
23231 }else if( c=='[' ){
23232 int prior_c = 0;
23233 seen = 0;
23234 invert = 0;
23235 c = *(z++);
23236 if( c==0 ) return 0;
23237 c2 = *(zGlob++);
23238 if( c2=='^' ){
23239 invert = 1;
23240 c2 = *(zGlob++);
23241 }
23242 if( c2==']' ){
23243 if( c==']' ) seen = 1;
23244 c2 = *(zGlob++);
23245 }
23246 while( c2 && c2!=']' ){
23247 if( c2=='-' && zGlob[0]!=']' && zGlob[0]!=0 && prior_c>0 ){
23248 c2 = *(zGlob++);
23249 if( c>=prior_c && c<=c2 ) seen = 1;
23250 prior_c = 0;
23251 }else{
23252 if( c==c2 ){
23253 seen = 1;
23254 }
23255 prior_c = c2;
23256 }
23257 c2 = *(zGlob++);
23258 }
23259 if( c2==0 || (seen ^ invert)==0 ) return 0;
23260 }else if( c=='#' ){
23261 if( (z[0]=='-' || z[0]=='+') && IsDigit(z[1]) ) z++;
23262 if( !IsDigit(z[0]) ) return 0;
23263 z++;
23264 while( IsDigit(z[0]) ){ z++; }
23265 }else{
23266 if( c!=(*(z++)) ) return 0;
23267 }
23268 }
23269 while( IsSpace(*z) ){ z++; }
23270 return *z==0;
23271 }
23272
23273
23274 /*
23275 ** Compare the string as a command-line option with either one or two
23276 ** initial "-" characters.
23277 */
optionMatch(const char * zStr,const char * zOpt)23278 static int optionMatch(const char *zStr, const char *zOpt){
23279 if( zStr[0]!='-' ) return 0;
23280 zStr++;
23281 if( zStr[0]=='-' ) zStr++;
23282 return cli_strcmp(zStr, zOpt)==0;
23283 }
23284
23285 /*
23286 ** Delete a file.
23287 */
shellDeleteFile(const char * zFilename)23288 static int shellDeleteFile(const char *zFilename){
23289 int rc;
23290 #ifdef _WIN32
23291 wchar_t *z = sqlite3_win32_utf8_to_unicode(zFilename);
23292 rc = _wunlink(z);
23293 sqlite3_free(z);
23294 #else
23295 rc = unlink(zFilename);
23296 #endif
23297 return rc;
23298 }
23299
23300 /*
23301 ** Try to delete the temporary file (if there is one) and free the
23302 ** memory used to hold the name of the temp file.
23303 */
clearTempFile(ShellState * p)23304 static void clearTempFile(ShellState *p){
23305 if( p->zTempFile==0 ) return;
23306 if( p->doXdgOpen ) return;
23307 if( shellDeleteFile(p->zTempFile) ) return;
23308 sqlite3_free(p->zTempFile);
23309 p->zTempFile = 0;
23310 }
23311
23312 /*
23313 ** Create a new temp file name with the given suffix.
23314 */
newTempFile(ShellState * p,const char * zSuffix)23315 static void newTempFile(ShellState *p, const char *zSuffix){
23316 clearTempFile(p);
23317 sqlite3_free(p->zTempFile);
23318 p->zTempFile = 0;
23319 if( p->db ){
23320 sqlite3_file_control(p->db, 0, SQLITE_FCNTL_TEMPFILENAME, &p->zTempFile);
23321 }
23322 if( p->zTempFile==0 ){
23323 /* If p->db is an in-memory database then the TEMPFILENAME file-control
23324 ** will not work and we will need to fallback to guessing */
23325 char *zTemp;
23326 sqlite3_uint64 r;
23327 sqlite3_randomness(sizeof(r), &r);
23328 zTemp = getenv("TEMP");
23329 if( zTemp==0 ) zTemp = getenv("TMP");
23330 if( zTemp==0 ){
23331 #ifdef _WIN32
23332 zTemp = "\\tmp";
23333 #else
23334 zTemp = "/tmp";
23335 #endif
23336 }
23337 p->zTempFile = sqlite3_mprintf("%s/temp%llx.%s", zTemp, r, zSuffix);
23338 }else{
23339 p->zTempFile = sqlite3_mprintf("%z.%s", p->zTempFile, zSuffix);
23340 }
23341 shell_check_oom(p->zTempFile);
23342 }
23343
23344
23345 /*
23346 ** The implementation of SQL scalar function fkey_collate_clause(), used
23347 ** by the ".lint fkey-indexes" command. This scalar function is always
23348 ** called with four arguments - the parent table name, the parent column name,
23349 ** the child table name and the child column name.
23350 **
23351 ** fkey_collate_clause('parent-tab', 'parent-col', 'child-tab', 'child-col')
23352 **
23353 ** If either of the named tables or columns do not exist, this function
23354 ** returns an empty string. An empty string is also returned if both tables
23355 ** and columns exist but have the same default collation sequence. Or,
23356 ** if both exist but the default collation sequences are different, this
23357 ** function returns the string " COLLATE <parent-collation>", where
23358 ** <parent-collation> is the default collation sequence of the parent column.
23359 */
shellFkeyCollateClause(sqlite3_context * pCtx,int nVal,sqlite3_value ** apVal)23360 static void shellFkeyCollateClause(
23361 sqlite3_context *pCtx,
23362 int nVal,
23363 sqlite3_value **apVal
23364 ){
23365 sqlite3 *db = sqlite3_context_db_handle(pCtx);
23366 const char *zParent;
23367 const char *zParentCol;
23368 const char *zParentSeq;
23369 const char *zChild;
23370 const char *zChildCol;
23371 const char *zChildSeq = 0; /* Initialize to avoid false-positive warning */
23372 int rc;
23373
23374 assert( nVal==4 );
23375 zParent = (const char*)sqlite3_value_text(apVal[0]);
23376 zParentCol = (const char*)sqlite3_value_text(apVal[1]);
23377 zChild = (const char*)sqlite3_value_text(apVal[2]);
23378 zChildCol = (const char*)sqlite3_value_text(apVal[3]);
23379
23380 sqlite3_result_text(pCtx, "", -1, SQLITE_STATIC);
23381 rc = sqlite3_table_column_metadata(
23382 db, "main", zParent, zParentCol, 0, &zParentSeq, 0, 0, 0
23383 );
23384 if( rc==SQLITE_OK ){
23385 rc = sqlite3_table_column_metadata(
23386 db, "main", zChild, zChildCol, 0, &zChildSeq, 0, 0, 0
23387 );
23388 }
23389
23390 if( rc==SQLITE_OK && sqlite3_stricmp(zParentSeq, zChildSeq) ){
23391 char *z = sqlite3_mprintf(" COLLATE %s", zParentSeq);
23392 sqlite3_result_text(pCtx, z, -1, SQLITE_TRANSIENT);
23393 sqlite3_free(z);
23394 }
23395 }
23396
23397
23398 /*
23399 ** The implementation of dot-command ".lint fkey-indexes".
23400 */
lintFkeyIndexes(ShellState * pState,char ** azArg,int nArg)23401 static int lintFkeyIndexes(
23402 ShellState *pState, /* Current shell tool state */
23403 char **azArg, /* Array of arguments passed to dot command */
23404 int nArg /* Number of entries in azArg[] */
23405 ){
23406 sqlite3 *db = pState->db; /* Database handle to query "main" db of */
23407 int bVerbose = 0; /* If -verbose is present */
23408 int bGroupByParent = 0; /* If -groupbyparent is present */
23409 int i; /* To iterate through azArg[] */
23410 const char *zIndent = ""; /* How much to indent CREATE INDEX by */
23411 int rc; /* Return code */
23412 sqlite3_stmt *pSql = 0; /* Compiled version of SQL statement below */
23413
23414 /*
23415 ** This SELECT statement returns one row for each foreign key constraint
23416 ** in the schema of the main database. The column values are:
23417 **
23418 ** 0. The text of an SQL statement similar to:
23419 **
23420 ** "EXPLAIN QUERY PLAN SELECT 1 FROM child_table WHERE child_key=?"
23421 **
23422 ** This SELECT is similar to the one that the foreign keys implementation
23423 ** needs to run internally on child tables. If there is an index that can
23424 ** be used to optimize this query, then it can also be used by the FK
23425 ** implementation to optimize DELETE or UPDATE statements on the parent
23426 ** table.
23427 **
23428 ** 1. A GLOB pattern suitable for sqlite3_strglob(). If the plan output by
23429 ** the EXPLAIN QUERY PLAN command matches this pattern, then the schema
23430 ** contains an index that can be used to optimize the query.
23431 **
23432 ** 2. Human readable text that describes the child table and columns. e.g.
23433 **
23434 ** "child_table(child_key1, child_key2)"
23435 **
23436 ** 3. Human readable text that describes the parent table and columns. e.g.
23437 **
23438 ** "parent_table(parent_key1, parent_key2)"
23439 **
23440 ** 4. A full CREATE INDEX statement for an index that could be used to
23441 ** optimize DELETE or UPDATE statements on the parent table. e.g.
23442 **
23443 ** "CREATE INDEX child_table_child_key ON child_table(child_key)"
23444 **
23445 ** 5. The name of the parent table.
23446 **
23447 ** These six values are used by the C logic below to generate the report.
23448 */
23449 const char *zSql =
23450 "SELECT "
23451 " 'EXPLAIN QUERY PLAN SELECT 1 FROM ' || quote(s.name) || ' WHERE '"
23452 " || group_concat(quote(s.name) || '.' || quote(f.[from]) || '=?' "
23453 " || fkey_collate_clause("
23454 " f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]),' AND ')"
23455 ", "
23456 " 'SEARCH ' || s.name || ' USING COVERING INDEX*('"
23457 " || group_concat('*=?', ' AND ') || ')'"
23458 ", "
23459 " s.name || '(' || group_concat(f.[from], ', ') || ')'"
23460 ", "
23461 " f.[table] || '(' || group_concat(COALESCE(f.[to], p.[name])) || ')'"
23462 ", "
23463 " 'CREATE INDEX ' || quote(s.name ||'_'|| group_concat(f.[from], '_'))"
23464 " || ' ON ' || quote(s.name) || '('"
23465 " || group_concat(quote(f.[from]) ||"
23466 " fkey_collate_clause("
23467 " f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]), ', ')"
23468 " || ');'"
23469 ", "
23470 " f.[table] "
23471 "FROM sqlite_schema AS s, pragma_foreign_key_list(s.name) AS f "
23472 "LEFT JOIN pragma_table_info AS p ON (pk-1=seq AND p.arg=f.[table]) "
23473 "GROUP BY s.name, f.id "
23474 "ORDER BY (CASE WHEN ? THEN f.[table] ELSE s.name END)"
23475 ;
23476 const char *zGlobIPK = "SEARCH * USING INTEGER PRIMARY KEY (rowid=?)";
23477
23478 for(i=2; i<nArg; i++){
23479 int n = strlen30(azArg[i]);
23480 if( n>1 && sqlite3_strnicmp("-verbose", azArg[i], n)==0 ){
23481 bVerbose = 1;
23482 }
23483 else if( n>1 && sqlite3_strnicmp("-groupbyparent", azArg[i], n)==0 ){
23484 bGroupByParent = 1;
23485 zIndent = " ";
23486 }
23487 else{
23488 eputf("Usage: %s %s ?-verbose? ?-groupbyparent?\n", azArg[0], azArg[1]);
23489 return SQLITE_ERROR;
23490 }
23491 }
23492
23493 /* Register the fkey_collate_clause() SQL function */
23494 rc = sqlite3_create_function(db, "fkey_collate_clause", 4, SQLITE_UTF8,
23495 0, shellFkeyCollateClause, 0, 0
23496 );
23497
23498
23499 if( rc==SQLITE_OK ){
23500 rc = sqlite3_prepare_v2(db, zSql, -1, &pSql, 0);
23501 }
23502 if( rc==SQLITE_OK ){
23503 sqlite3_bind_int(pSql, 1, bGroupByParent);
23504 }
23505
23506 if( rc==SQLITE_OK ){
23507 int rc2;
23508 char *zPrev = 0;
23509 while( SQLITE_ROW==sqlite3_step(pSql) ){
23510 int res = -1;
23511 sqlite3_stmt *pExplain = 0;
23512 const char *zEQP = (const char*)sqlite3_column_text(pSql, 0);
23513 const char *zGlob = (const char*)sqlite3_column_text(pSql, 1);
23514 const char *zFrom = (const char*)sqlite3_column_text(pSql, 2);
23515 const char *zTarget = (const char*)sqlite3_column_text(pSql, 3);
23516 const char *zCI = (const char*)sqlite3_column_text(pSql, 4);
23517 const char *zParent = (const char*)sqlite3_column_text(pSql, 5);
23518
23519 if( zEQP==0 ) continue;
23520 if( zGlob==0 ) continue;
23521 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
23522 if( rc!=SQLITE_OK ) break;
23523 if( SQLITE_ROW==sqlite3_step(pExplain) ){
23524 const char *zPlan = (const char*)sqlite3_column_text(pExplain, 3);
23525 res = zPlan!=0 && ( 0==sqlite3_strglob(zGlob, zPlan)
23526 || 0==sqlite3_strglob(zGlobIPK, zPlan));
23527 }
23528 rc = sqlite3_finalize(pExplain);
23529 if( rc!=SQLITE_OK ) break;
23530
23531 if( res<0 ){
23532 eputz("Error: internal error");
23533 break;
23534 }else{
23535 if( bGroupByParent
23536 && (bVerbose || res==0)
23537 && (zPrev==0 || sqlite3_stricmp(zParent, zPrev))
23538 ){
23539 oputf("-- Parent table %s\n", zParent);
23540 sqlite3_free(zPrev);
23541 zPrev = sqlite3_mprintf("%s", zParent);
23542 }
23543
23544 if( res==0 ){
23545 oputf("%s%s --> %s\n", zIndent, zCI, zTarget);
23546 }else if( bVerbose ){
23547 oputf("%s/* no extra indexes required for %s -> %s */\n",
23548 zIndent, zFrom, zTarget
23549 );
23550 }
23551 }
23552 }
23553 sqlite3_free(zPrev);
23554
23555 if( rc!=SQLITE_OK ){
23556 eputf("%s\n", sqlite3_errmsg(db));
23557 }
23558
23559 rc2 = sqlite3_finalize(pSql);
23560 if( rc==SQLITE_OK && rc2!=SQLITE_OK ){
23561 rc = rc2;
23562 eputf("%s\n", sqlite3_errmsg(db));
23563 }
23564 }else{
23565 eputf("%s\n", sqlite3_errmsg(db));
23566 }
23567
23568 return rc;
23569 }
23570
23571 /*
23572 ** Implementation of ".lint" dot command.
23573 */
lintDotCommand(ShellState * pState,char ** azArg,int nArg)23574 static int lintDotCommand(
23575 ShellState *pState, /* Current shell tool state */
23576 char **azArg, /* Array of arguments passed to dot command */
23577 int nArg /* Number of entries in azArg[] */
23578 ){
23579 int n;
23580 n = (nArg>=2 ? strlen30(azArg[1]) : 0);
23581 if( n<1 || sqlite3_strnicmp(azArg[1], "fkey-indexes", n) ) goto usage;
23582 return lintFkeyIndexes(pState, azArg, nArg);
23583
23584 usage:
23585 eputf("Usage %s sub-command ?switches...?\n", azArg[0]);
23586 eputz("Where sub-commands are:\n");
23587 eputz(" fkey-indexes\n");
23588 return SQLITE_ERROR;
23589 }
23590
shellPrepare(sqlite3 * db,int * pRc,const char * zSql,sqlite3_stmt ** ppStmt)23591 static void shellPrepare(
23592 sqlite3 *db,
23593 int *pRc,
23594 const char *zSql,
23595 sqlite3_stmt **ppStmt
23596 ){
23597 *ppStmt = 0;
23598 if( *pRc==SQLITE_OK ){
23599 int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0);
23600 if( rc!=SQLITE_OK ){
23601 eputf("sql error: %s (%d)\n", sqlite3_errmsg(db), sqlite3_errcode(db));
23602 *pRc = rc;
23603 }
23604 }
23605 }
23606
23607 /*
23608 ** Create a prepared statement using printf-style arguments for the SQL.
23609 */
shellPreparePrintf(sqlite3 * db,int * pRc,sqlite3_stmt ** ppStmt,const char * zFmt,...)23610 static void shellPreparePrintf(
23611 sqlite3 *db,
23612 int *pRc,
23613 sqlite3_stmt **ppStmt,
23614 const char *zFmt,
23615 ...
23616 ){
23617 *ppStmt = 0;
23618 if( *pRc==SQLITE_OK ){
23619 va_list ap;
23620 char *z;
23621 va_start(ap, zFmt);
23622 z = sqlite3_vmprintf(zFmt, ap);
23623 va_end(ap);
23624 if( z==0 ){
23625 *pRc = SQLITE_NOMEM;
23626 }else{
23627 shellPrepare(db, pRc, z, ppStmt);
23628 sqlite3_free(z);
23629 }
23630 }
23631 }
23632
23633 /*
23634 ** Finalize the prepared statement created using shellPreparePrintf().
23635 */
shellFinalize(int * pRc,sqlite3_stmt * pStmt)23636 static void shellFinalize(
23637 int *pRc,
23638 sqlite3_stmt *pStmt
23639 ){
23640 if( pStmt ){
23641 sqlite3 *db = sqlite3_db_handle(pStmt);
23642 int rc = sqlite3_finalize(pStmt);
23643 if( *pRc==SQLITE_OK ){
23644 if( rc!=SQLITE_OK ){
23645 eputf("SQL error: %s\n", sqlite3_errmsg(db));
23646 }
23647 *pRc = rc;
23648 }
23649 }
23650 }
23651
23652 #if !defined SQLITE_OMIT_VIRTUALTABLE
23653 /* Reset the prepared statement created using shellPreparePrintf().
23654 **
23655 ** This routine is could be marked "static". But it is not always used,
23656 ** depending on compile-time options. By omitting the "static", we avoid
23657 ** nuisance compiler warnings about "defined but not used".
23658 */
shellReset(int * pRc,sqlite3_stmt * pStmt)23659 static void shellReset(
23660 int *pRc,
23661 sqlite3_stmt *pStmt
23662 ){
23663 int rc = sqlite3_reset(pStmt);
23664 if( *pRc==SQLITE_OK ){
23665 if( rc!=SQLITE_OK ){
23666 sqlite3 *db = sqlite3_db_handle(pStmt);
23667 eputf("SQL error: %s\n", sqlite3_errmsg(db));
23668 }
23669 *pRc = rc;
23670 }
23671 }
23672 #endif /* !defined SQLITE_OMIT_VIRTUALTABLE */
23673
23674 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
23675 /******************************************************************************
23676 ** The ".archive" or ".ar" command.
23677 */
23678 /*
23679 ** Structure representing a single ".ar" command.
23680 */
23681 typedef struct ArCommand ArCommand;
23682 struct ArCommand {
23683 u8 eCmd; /* An AR_CMD_* value */
23684 u8 bVerbose; /* True if --verbose */
23685 u8 bZip; /* True if the archive is a ZIP */
23686 u8 bDryRun; /* True if --dry-run */
23687 u8 bAppend; /* True if --append */
23688 u8 bGlob; /* True if --glob */
23689 u8 fromCmdLine; /* Run from -A instead of .archive */
23690 int nArg; /* Number of command arguments */
23691 char *zSrcTable; /* "sqlar", "zipfile($file)" or "zip" */
23692 const char *zFile; /* --file argument, or NULL */
23693 const char *zDir; /* --directory argument, or NULL */
23694 char **azArg; /* Array of command arguments */
23695 ShellState *p; /* Shell state */
23696 sqlite3 *db; /* Database containing the archive */
23697 };
23698
23699 /*
23700 ** Print a usage message for the .ar command to stderr and return SQLITE_ERROR.
23701 */
arUsage(FILE * f)23702 static int arUsage(FILE *f){
23703 showHelp(f,"archive");
23704 return SQLITE_ERROR;
23705 }
23706
23707 /*
23708 ** Print an error message for the .ar command to stderr and return
23709 ** SQLITE_ERROR.
23710 */
arErrorMsg(ArCommand * pAr,const char * zFmt,...)23711 static int arErrorMsg(ArCommand *pAr, const char *zFmt, ...){
23712 va_list ap;
23713 char *z;
23714 va_start(ap, zFmt);
23715 z = sqlite3_vmprintf(zFmt, ap);
23716 va_end(ap);
23717 eputf("Error: %s\n", z);
23718 if( pAr->fromCmdLine ){
23719 eputz("Use \"-A\" for more help\n");
23720 }else{
23721 eputz("Use \".archive --help\" for more help\n");
23722 }
23723 sqlite3_free(z);
23724 return SQLITE_ERROR;
23725 }
23726
23727 /*
23728 ** Values for ArCommand.eCmd.
23729 */
23730 #define AR_CMD_CREATE 1
23731 #define AR_CMD_UPDATE 2
23732 #define AR_CMD_INSERT 3
23733 #define AR_CMD_EXTRACT 4
23734 #define AR_CMD_LIST 5
23735 #define AR_CMD_HELP 6
23736 #define AR_CMD_REMOVE 7
23737
23738 /*
23739 ** Other (non-command) switches.
23740 */
23741 #define AR_SWITCH_VERBOSE 8
23742 #define AR_SWITCH_FILE 9
23743 #define AR_SWITCH_DIRECTORY 10
23744 #define AR_SWITCH_APPEND 11
23745 #define AR_SWITCH_DRYRUN 12
23746 #define AR_SWITCH_GLOB 13
23747
arProcessSwitch(ArCommand * pAr,int eSwitch,const char * zArg)23748 static int arProcessSwitch(ArCommand *pAr, int eSwitch, const char *zArg){
23749 switch( eSwitch ){
23750 case AR_CMD_CREATE:
23751 case AR_CMD_EXTRACT:
23752 case AR_CMD_LIST:
23753 case AR_CMD_REMOVE:
23754 case AR_CMD_UPDATE:
23755 case AR_CMD_INSERT:
23756 case AR_CMD_HELP:
23757 if( pAr->eCmd ){
23758 return arErrorMsg(pAr, "multiple command options");
23759 }
23760 pAr->eCmd = eSwitch;
23761 break;
23762
23763 case AR_SWITCH_DRYRUN:
23764 pAr->bDryRun = 1;
23765 break;
23766 case AR_SWITCH_GLOB:
23767 pAr->bGlob = 1;
23768 break;
23769 case AR_SWITCH_VERBOSE:
23770 pAr->bVerbose = 1;
23771 break;
23772 case AR_SWITCH_APPEND:
23773 pAr->bAppend = 1;
23774 deliberate_fall_through;
23775 case AR_SWITCH_FILE:
23776 pAr->zFile = zArg;
23777 break;
23778 case AR_SWITCH_DIRECTORY:
23779 pAr->zDir = zArg;
23780 break;
23781 }
23782
23783 return SQLITE_OK;
23784 }
23785
23786 /*
23787 ** Parse the command line for an ".ar" command. The results are written into
23788 ** structure (*pAr). SQLITE_OK is returned if the command line is parsed
23789 ** successfully, otherwise an error message is written to stderr and
23790 ** SQLITE_ERROR returned.
23791 */
arParseCommand(char ** azArg,int nArg,ArCommand * pAr)23792 static int arParseCommand(
23793 char **azArg, /* Array of arguments passed to dot command */
23794 int nArg, /* Number of entries in azArg[] */
23795 ArCommand *pAr /* Populate this object */
23796 ){
23797 struct ArSwitch {
23798 const char *zLong;
23799 char cShort;
23800 u8 eSwitch;
23801 u8 bArg;
23802 } aSwitch[] = {
23803 { "create", 'c', AR_CMD_CREATE, 0 },
23804 { "extract", 'x', AR_CMD_EXTRACT, 0 },
23805 { "insert", 'i', AR_CMD_INSERT, 0 },
23806 { "list", 't', AR_CMD_LIST, 0 },
23807 { "remove", 'r', AR_CMD_REMOVE, 0 },
23808 { "update", 'u', AR_CMD_UPDATE, 0 },
23809 { "help", 'h', AR_CMD_HELP, 0 },
23810 { "verbose", 'v', AR_SWITCH_VERBOSE, 0 },
23811 { "file", 'f', AR_SWITCH_FILE, 1 },
23812 { "append", 'a', AR_SWITCH_APPEND, 1 },
23813 { "directory", 'C', AR_SWITCH_DIRECTORY, 1 },
23814 { "dryrun", 'n', AR_SWITCH_DRYRUN, 0 },
23815 { "glob", 'g', AR_SWITCH_GLOB, 0 },
23816 };
23817 int nSwitch = sizeof(aSwitch) / sizeof(struct ArSwitch);
23818 struct ArSwitch *pEnd = &aSwitch[nSwitch];
23819
23820 if( nArg<=1 ){
23821 eputz("Wrong number of arguments. Usage:\n");
23822 return arUsage(stderr);
23823 }else{
23824 char *z = azArg[1];
23825 if( z[0]!='-' ){
23826 /* Traditional style [tar] invocation */
23827 int i;
23828 int iArg = 2;
23829 for(i=0; z[i]; i++){
23830 const char *zArg = 0;
23831 struct ArSwitch *pOpt;
23832 for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
23833 if( z[i]==pOpt->cShort ) break;
23834 }
23835 if( pOpt==pEnd ){
23836 return arErrorMsg(pAr, "unrecognized option: %c", z[i]);
23837 }
23838 if( pOpt->bArg ){
23839 if( iArg>=nArg ){
23840 return arErrorMsg(pAr, "option requires an argument: %c",z[i]);
23841 }
23842 zArg = azArg[iArg++];
23843 }
23844 if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR;
23845 }
23846 pAr->nArg = nArg-iArg;
23847 if( pAr->nArg>0 ){
23848 pAr->azArg = &azArg[iArg];
23849 }
23850 }else{
23851 /* Non-traditional invocation */
23852 int iArg;
23853 for(iArg=1; iArg<nArg; iArg++){
23854 int n;
23855 z = azArg[iArg];
23856 if( z[0]!='-' ){
23857 /* All remaining command line words are command arguments. */
23858 pAr->azArg = &azArg[iArg];
23859 pAr->nArg = nArg-iArg;
23860 break;
23861 }
23862 n = strlen30(z);
23863
23864 if( z[1]!='-' ){
23865 int i;
23866 /* One or more short options */
23867 for(i=1; i<n; i++){
23868 const char *zArg = 0;
23869 struct ArSwitch *pOpt;
23870 for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
23871 if( z[i]==pOpt->cShort ) break;
23872 }
23873 if( pOpt==pEnd ){
23874 return arErrorMsg(pAr, "unrecognized option: %c", z[i]);
23875 }
23876 if( pOpt->bArg ){
23877 if( i<(n-1) ){
23878 zArg = &z[i+1];
23879 i = n;
23880 }else{
23881 if( iArg>=(nArg-1) ){
23882 return arErrorMsg(pAr, "option requires an argument: %c",
23883 z[i]);
23884 }
23885 zArg = azArg[++iArg];
23886 }
23887 }
23888 if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR;
23889 }
23890 }else if( z[2]=='\0' ){
23891 /* A -- option, indicating that all remaining command line words
23892 ** are command arguments. */
23893 pAr->azArg = &azArg[iArg+1];
23894 pAr->nArg = nArg-iArg-1;
23895 break;
23896 }else{
23897 /* A long option */
23898 const char *zArg = 0; /* Argument for option, if any */
23899 struct ArSwitch *pMatch = 0; /* Matching option */
23900 struct ArSwitch *pOpt; /* Iterator */
23901 for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
23902 const char *zLong = pOpt->zLong;
23903 if( (n-2)<=strlen30(zLong) && 0==memcmp(&z[2], zLong, n-2) ){
23904 if( pMatch ){
23905 return arErrorMsg(pAr, "ambiguous option: %s",z);
23906 }else{
23907 pMatch = pOpt;
23908 }
23909 }
23910 }
23911
23912 if( pMatch==0 ){
23913 return arErrorMsg(pAr, "unrecognized option: %s", z);
23914 }
23915 if( pMatch->bArg ){
23916 if( iArg>=(nArg-1) ){
23917 return arErrorMsg(pAr, "option requires an argument: %s", z);
23918 }
23919 zArg = azArg[++iArg];
23920 }
23921 if( arProcessSwitch(pAr, pMatch->eSwitch, zArg) ) return SQLITE_ERROR;
23922 }
23923 }
23924 }
23925 }
23926 if( pAr->eCmd==0 ){
23927 eputz("Required argument missing. Usage:\n");
23928 return arUsage(stderr);
23929 }
23930 return SQLITE_OK;
23931 }
23932
23933 /*
23934 ** This function assumes that all arguments within the ArCommand.azArg[]
23935 ** array refer to archive members, as for the --extract, --list or --remove
23936 ** commands. It checks that each of them are "present". If any specified
23937 ** file is not present in the archive, an error is printed to stderr and an
23938 ** error code returned. Otherwise, if all specified arguments are present
23939 ** in the archive, SQLITE_OK is returned. Here, "present" means either an
23940 ** exact equality when pAr->bGlob is false or a "name GLOB pattern" match
23941 ** when pAr->bGlob is true.
23942 **
23943 ** This function strips any trailing '/' characters from each argument.
23944 ** This is consistent with the way the [tar] command seems to work on
23945 ** Linux.
23946 */
arCheckEntries(ArCommand * pAr)23947 static int arCheckEntries(ArCommand *pAr){
23948 int rc = SQLITE_OK;
23949 if( pAr->nArg ){
23950 int i, j;
23951 sqlite3_stmt *pTest = 0;
23952 const char *zSel = (pAr->bGlob)
23953 ? "SELECT name FROM %s WHERE glob($name,name)"
23954 : "SELECT name FROM %s WHERE name=$name";
23955
23956 shellPreparePrintf(pAr->db, &rc, &pTest, zSel, pAr->zSrcTable);
23957 j = sqlite3_bind_parameter_index(pTest, "$name");
23958 for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){
23959 char *z = pAr->azArg[i];
23960 int n = strlen30(z);
23961 int bOk = 0;
23962 while( n>0 && z[n-1]=='/' ) n--;
23963 z[n] = '\0';
23964 sqlite3_bind_text(pTest, j, z, -1, SQLITE_STATIC);
23965 if( SQLITE_ROW==sqlite3_step(pTest) ){
23966 bOk = 1;
23967 }
23968 shellReset(&rc, pTest);
23969 if( rc==SQLITE_OK && bOk==0 ){
23970 eputf("not found in archive: %s\n", z);
23971 rc = SQLITE_ERROR;
23972 }
23973 }
23974 shellFinalize(&rc, pTest);
23975 }
23976 return rc;
23977 }
23978
23979 /*
23980 ** Format a WHERE clause that can be used against the "sqlar" table to
23981 ** identify all archive members that match the command arguments held
23982 ** in (*pAr). Leave this WHERE clause in (*pzWhere) before returning.
23983 ** The caller is responsible for eventually calling sqlite3_free() on
23984 ** any non-NULL (*pzWhere) value. Here, "match" means strict equality
23985 ** when pAr->bGlob is false and GLOB match when pAr->bGlob is true.
23986 */
arWhereClause(int * pRc,ArCommand * pAr,char ** pzWhere)23987 static void arWhereClause(
23988 int *pRc,
23989 ArCommand *pAr,
23990 char **pzWhere /* OUT: New WHERE clause */
23991 ){
23992 char *zWhere = 0;
23993 const char *zSameOp = (pAr->bGlob)? "GLOB" : "=";
23994 if( *pRc==SQLITE_OK ){
23995 if( pAr->nArg==0 ){
23996 zWhere = sqlite3_mprintf("1");
23997 }else{
23998 int i;
23999 const char *zSep = "";
24000 for(i=0; i<pAr->nArg; i++){
24001 const char *z = pAr->azArg[i];
24002 zWhere = sqlite3_mprintf(
24003 "%z%s name %s '%q' OR substr(name,1,%d) %s '%q/'",
24004 zWhere, zSep, zSameOp, z, strlen30(z)+1, zSameOp, z
24005 );
24006 if( zWhere==0 ){
24007 *pRc = SQLITE_NOMEM;
24008 break;
24009 }
24010 zSep = " OR ";
24011 }
24012 }
24013 }
24014 *pzWhere = zWhere;
24015 }
24016
24017 /*
24018 ** Implementation of .ar "lisT" command.
24019 */
arListCommand(ArCommand * pAr)24020 static int arListCommand(ArCommand *pAr){
24021 const char *zSql = "SELECT %s FROM %s WHERE %s";
24022 const char *azCols[] = {
24023 "name",
24024 "lsmode(mode), sz, datetime(mtime, 'unixepoch'), name"
24025 };
24026
24027 char *zWhere = 0;
24028 sqlite3_stmt *pSql = 0;
24029 int rc;
24030
24031 rc = arCheckEntries(pAr);
24032 arWhereClause(&rc, pAr, &zWhere);
24033
24034 shellPreparePrintf(pAr->db, &rc, &pSql, zSql, azCols[pAr->bVerbose],
24035 pAr->zSrcTable, zWhere);
24036 if( pAr->bDryRun ){
24037 oputf("%s\n", sqlite3_sql(pSql));
24038 }else{
24039 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
24040 if( pAr->bVerbose ){
24041 oputf("%s % 10d %s %s\n",
24042 sqlite3_column_text(pSql, 0), sqlite3_column_int(pSql, 1),
24043 sqlite3_column_text(pSql, 2),sqlite3_column_text(pSql, 3));
24044 }else{
24045 oputf("%s\n", sqlite3_column_text(pSql, 0));
24046 }
24047 }
24048 }
24049 shellFinalize(&rc, pSql);
24050 sqlite3_free(zWhere);
24051 return rc;
24052 }
24053
24054 /*
24055 ** Implementation of .ar "Remove" command.
24056 */
arRemoveCommand(ArCommand * pAr)24057 static int arRemoveCommand(ArCommand *pAr){
24058 int rc = 0;
24059 char *zSql = 0;
24060 char *zWhere = 0;
24061
24062 if( pAr->nArg ){
24063 /* Verify that args actually exist within the archive before proceeding.
24064 ** And formulate a WHERE clause to match them. */
24065 rc = arCheckEntries(pAr);
24066 arWhereClause(&rc, pAr, &zWhere);
24067 }
24068 if( rc==SQLITE_OK ){
24069 zSql = sqlite3_mprintf("DELETE FROM %s WHERE %s;",
24070 pAr->zSrcTable, zWhere);
24071 if( pAr->bDryRun ){
24072 oputf("%s\n", zSql);
24073 }else{
24074 char *zErr = 0;
24075 rc = sqlite3_exec(pAr->db, "SAVEPOINT ar;", 0, 0, 0);
24076 if( rc==SQLITE_OK ){
24077 rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr);
24078 if( rc!=SQLITE_OK ){
24079 sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0);
24080 }else{
24081 rc = sqlite3_exec(pAr->db, "RELEASE ar;", 0, 0, 0);
24082 }
24083 }
24084 if( zErr ){
24085 sputf(stdout, "ERROR: %s\n", zErr); /* stdout? */
24086 sqlite3_free(zErr);
24087 }
24088 }
24089 }
24090 sqlite3_free(zWhere);
24091 sqlite3_free(zSql);
24092 return rc;
24093 }
24094
24095 /*
24096 ** Implementation of .ar "eXtract" command.
24097 */
arExtractCommand(ArCommand * pAr)24098 static int arExtractCommand(ArCommand *pAr){
24099 const char *zSql1 =
24100 "SELECT "
24101 " ($dir || name),"
24102 " writefile(($dir || name), %s, mode, mtime) "
24103 "FROM %s WHERE (%s) AND (data IS NULL OR $dirOnly = 0)"
24104 " AND name NOT GLOB '*..[/\\]*'";
24105
24106 const char *azExtraArg[] = {
24107 "sqlar_uncompress(data, sz)",
24108 "data"
24109 };
24110
24111 sqlite3_stmt *pSql = 0;
24112 int rc = SQLITE_OK;
24113 char *zDir = 0;
24114 char *zWhere = 0;
24115 int i, j;
24116
24117 /* If arguments are specified, check that they actually exist within
24118 ** the archive before proceeding. And formulate a WHERE clause to
24119 ** match them. */
24120 rc = arCheckEntries(pAr);
24121 arWhereClause(&rc, pAr, &zWhere);
24122
24123 if( rc==SQLITE_OK ){
24124 if( pAr->zDir ){
24125 zDir = sqlite3_mprintf("%s/", pAr->zDir);
24126 }else{
24127 zDir = sqlite3_mprintf("");
24128 }
24129 if( zDir==0 ) rc = SQLITE_NOMEM;
24130 }
24131
24132 shellPreparePrintf(pAr->db, &rc, &pSql, zSql1,
24133 azExtraArg[pAr->bZip], pAr->zSrcTable, zWhere
24134 );
24135
24136 if( rc==SQLITE_OK ){
24137 j = sqlite3_bind_parameter_index(pSql, "$dir");
24138 sqlite3_bind_text(pSql, j, zDir, -1, SQLITE_STATIC);
24139
24140 /* Run the SELECT statement twice. The first time, writefile() is called
24141 ** for all archive members that should be extracted. The second time,
24142 ** only for the directories. This is because the timestamps for
24143 ** extracted directories must be reset after they are populated (as
24144 ** populating them changes the timestamp). */
24145 for(i=0; i<2; i++){
24146 j = sqlite3_bind_parameter_index(pSql, "$dirOnly");
24147 sqlite3_bind_int(pSql, j, i);
24148 if( pAr->bDryRun ){
24149 oputf("%s\n", sqlite3_sql(pSql));
24150 }else{
24151 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
24152 if( i==0 && pAr->bVerbose ){
24153 oputf("%s\n", sqlite3_column_text(pSql, 0));
24154 }
24155 }
24156 }
24157 shellReset(&rc, pSql);
24158 }
24159 shellFinalize(&rc, pSql);
24160 }
24161
24162 sqlite3_free(zDir);
24163 sqlite3_free(zWhere);
24164 return rc;
24165 }
24166
24167 /*
24168 ** Run the SQL statement in zSql. Or if doing a --dryrun, merely print it out.
24169 */
arExecSql(ArCommand * pAr,const char * zSql)24170 static int arExecSql(ArCommand *pAr, const char *zSql){
24171 int rc;
24172 if( pAr->bDryRun ){
24173 oputf("%s\n", zSql);
24174 rc = SQLITE_OK;
24175 }else{
24176 char *zErr = 0;
24177 rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr);
24178 if( zErr ){
24179 sputf(stdout, "ERROR: %s\n", zErr);
24180 sqlite3_free(zErr);
24181 }
24182 }
24183 return rc;
24184 }
24185
24186
24187 /*
24188 ** Implementation of .ar "create", "insert", and "update" commands.
24189 **
24190 ** create -> Create a new SQL archive
24191 ** insert -> Insert or reinsert all files listed
24192 ** update -> Insert files that have changed or that were not
24193 ** previously in the archive
24194 **
24195 ** Create the "sqlar" table in the database if it does not already exist.
24196 ** Then add each file in the azFile[] array to the archive. Directories
24197 ** are added recursively. If argument bVerbose is non-zero, a message is
24198 ** printed on stdout for each file archived.
24199 **
24200 ** The create command is the same as update, except that it drops
24201 ** any existing "sqlar" table before beginning. The "insert" command
24202 ** always overwrites every file named on the command-line, where as
24203 ** "update" only overwrites if the size or mtime or mode has changed.
24204 */
arCreateOrUpdateCommand(ArCommand * pAr,int bUpdate,int bOnlyIfChanged)24205 static int arCreateOrUpdateCommand(
24206 ArCommand *pAr, /* Command arguments and options */
24207 int bUpdate, /* true for a --create. */
24208 int bOnlyIfChanged /* Only update if file has changed */
24209 ){
24210 const char *zCreate =
24211 "CREATE TABLE IF NOT EXISTS sqlar(\n"
24212 " name TEXT PRIMARY KEY, -- name of the file\n"
24213 " mode INT, -- access permissions\n"
24214 " mtime INT, -- last modification time\n"
24215 " sz INT, -- original file size\n"
24216 " data BLOB -- compressed content\n"
24217 ")";
24218 const char *zDrop = "DROP TABLE IF EXISTS sqlar";
24219 const char *zInsertFmt[2] = {
24220 "REPLACE INTO %s(name,mode,mtime,sz,data)\n"
24221 " SELECT\n"
24222 " %s,\n"
24223 " mode,\n"
24224 " mtime,\n"
24225 " CASE substr(lsmode(mode),1,1)\n"
24226 " WHEN '-' THEN length(data)\n"
24227 " WHEN 'd' THEN 0\n"
24228 " ELSE -1 END,\n"
24229 " sqlar_compress(data)\n"
24230 " FROM fsdir(%Q,%Q) AS disk\n"
24231 " WHERE lsmode(mode) NOT LIKE '?%%'%s;"
24232 ,
24233 "REPLACE INTO %s(name,mode,mtime,data)\n"
24234 " SELECT\n"
24235 " %s,\n"
24236 " mode,\n"
24237 " mtime,\n"
24238 " data\n"
24239 " FROM fsdir(%Q,%Q) AS disk\n"
24240 " WHERE lsmode(mode) NOT LIKE '?%%'%s;"
24241 };
24242 int i; /* For iterating through azFile[] */
24243 int rc; /* Return code */
24244 const char *zTab = 0; /* SQL table into which to insert */
24245 char *zSql;
24246 char zTemp[50];
24247 char *zExists = 0;
24248
24249 arExecSql(pAr, "PRAGMA page_size=512");
24250 rc = arExecSql(pAr, "SAVEPOINT ar;");
24251 if( rc!=SQLITE_OK ) return rc;
24252 zTemp[0] = 0;
24253 if( pAr->bZip ){
24254 /* Initialize the zipfile virtual table, if necessary */
24255 if( pAr->zFile ){
24256 sqlite3_uint64 r;
24257 sqlite3_randomness(sizeof(r),&r);
24258 sqlite3_snprintf(sizeof(zTemp),zTemp,"zip%016llx",r);
24259 zTab = zTemp;
24260 zSql = sqlite3_mprintf(
24261 "CREATE VIRTUAL TABLE temp.%s USING zipfile(%Q)",
24262 zTab, pAr->zFile
24263 );
24264 rc = arExecSql(pAr, zSql);
24265 sqlite3_free(zSql);
24266 }else{
24267 zTab = "zip";
24268 }
24269 }else{
24270 /* Initialize the table for an SQLAR */
24271 zTab = "sqlar";
24272 if( bUpdate==0 ){
24273 rc = arExecSql(pAr, zDrop);
24274 if( rc!=SQLITE_OK ) goto end_ar_transaction;
24275 }
24276 rc = arExecSql(pAr, zCreate);
24277 }
24278 if( bOnlyIfChanged ){
24279 zExists = sqlite3_mprintf(
24280 " AND NOT EXISTS("
24281 "SELECT 1 FROM %s AS mem"
24282 " WHERE mem.name=disk.name"
24283 " AND mem.mtime=disk.mtime"
24284 " AND mem.mode=disk.mode)", zTab);
24285 }else{
24286 zExists = sqlite3_mprintf("");
24287 }
24288 if( zExists==0 ) rc = SQLITE_NOMEM;
24289 for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){
24290 char *zSql2 = sqlite3_mprintf(zInsertFmt[pAr->bZip], zTab,
24291 pAr->bVerbose ? "shell_putsnl(name)" : "name",
24292 pAr->azArg[i], pAr->zDir, zExists);
24293 rc = arExecSql(pAr, zSql2);
24294 sqlite3_free(zSql2);
24295 }
24296 end_ar_transaction:
24297 if( rc!=SQLITE_OK ){
24298 sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0);
24299 }else{
24300 rc = arExecSql(pAr, "RELEASE ar;");
24301 if( pAr->bZip && pAr->zFile ){
24302 zSql = sqlite3_mprintf("DROP TABLE %s", zTemp);
24303 arExecSql(pAr, zSql);
24304 sqlite3_free(zSql);
24305 }
24306 }
24307 sqlite3_free(zExists);
24308 return rc;
24309 }
24310
24311 /*
24312 ** Implementation of ".ar" dot command.
24313 */
arDotCommand(ShellState * pState,int fromCmdLine,char ** azArg,int nArg)24314 static int arDotCommand(
24315 ShellState *pState, /* Current shell tool state */
24316 int fromCmdLine, /* True if -A command-line option, not .ar cmd */
24317 char **azArg, /* Array of arguments passed to dot command */
24318 int nArg /* Number of entries in azArg[] */
24319 ){
24320 ArCommand cmd;
24321 int rc;
24322 memset(&cmd, 0, sizeof(cmd));
24323 cmd.fromCmdLine = fromCmdLine;
24324 rc = arParseCommand(azArg, nArg, &cmd);
24325 if( rc==SQLITE_OK ){
24326 int eDbType = SHELL_OPEN_UNSPEC;
24327 cmd.p = pState;
24328 cmd.db = pState->db;
24329 if( cmd.zFile ){
24330 eDbType = deduceDatabaseType(cmd.zFile, 1);
24331 }else{
24332 eDbType = pState->openMode;
24333 }
24334 if( eDbType==SHELL_OPEN_ZIPFILE ){
24335 if( cmd.eCmd==AR_CMD_EXTRACT || cmd.eCmd==AR_CMD_LIST ){
24336 if( cmd.zFile==0 ){
24337 cmd.zSrcTable = sqlite3_mprintf("zip");
24338 }else{
24339 cmd.zSrcTable = sqlite3_mprintf("zipfile(%Q)", cmd.zFile);
24340 }
24341 }
24342 cmd.bZip = 1;
24343 }else if( cmd.zFile ){
24344 int flags;
24345 if( cmd.bAppend ) eDbType = SHELL_OPEN_APPENDVFS;
24346 if( cmd.eCmd==AR_CMD_CREATE || cmd.eCmd==AR_CMD_INSERT
24347 || cmd.eCmd==AR_CMD_REMOVE || cmd.eCmd==AR_CMD_UPDATE ){
24348 flags = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE;
24349 }else{
24350 flags = SQLITE_OPEN_READONLY;
24351 }
24352 cmd.db = 0;
24353 if( cmd.bDryRun ){
24354 oputf("-- open database '%s'%s\n", cmd.zFile,
24355 eDbType==SHELL_OPEN_APPENDVFS ? " using 'apndvfs'" : "");
24356 }
24357 rc = sqlite3_open_v2(cmd.zFile, &cmd.db, flags,
24358 eDbType==SHELL_OPEN_APPENDVFS ? "apndvfs" : 0);
24359 if( rc!=SQLITE_OK ){
24360 eputf("cannot open file: %s (%s)\n", cmd.zFile, sqlite3_errmsg(cmd.db));
24361 goto end_ar_command;
24362 }
24363 sqlite3_fileio_init(cmd.db, 0, 0);
24364 sqlite3_sqlar_init(cmd.db, 0, 0);
24365 sqlite3_create_function(cmd.db, "shell_putsnl", 1, SQLITE_UTF8, cmd.p,
24366 shellPutsFunc, 0, 0);
24367
24368 }
24369 if( cmd.zSrcTable==0 && cmd.bZip==0 && cmd.eCmd!=AR_CMD_HELP ){
24370 if( cmd.eCmd!=AR_CMD_CREATE
24371 && sqlite3_table_column_metadata(cmd.db,0,"sqlar","name",0,0,0,0,0)
24372 ){
24373 eputz("database does not contain an 'sqlar' table\n");
24374 rc = SQLITE_ERROR;
24375 goto end_ar_command;
24376 }
24377 cmd.zSrcTable = sqlite3_mprintf("sqlar");
24378 }
24379
24380 switch( cmd.eCmd ){
24381 case AR_CMD_CREATE:
24382 rc = arCreateOrUpdateCommand(&cmd, 0, 0);
24383 break;
24384
24385 case AR_CMD_EXTRACT:
24386 rc = arExtractCommand(&cmd);
24387 break;
24388
24389 case AR_CMD_LIST:
24390 rc = arListCommand(&cmd);
24391 break;
24392
24393 case AR_CMD_HELP:
24394 arUsage(pState->out);
24395 break;
24396
24397 case AR_CMD_INSERT:
24398 rc = arCreateOrUpdateCommand(&cmd, 1, 0);
24399 break;
24400
24401 case AR_CMD_REMOVE:
24402 rc = arRemoveCommand(&cmd);
24403 break;
24404
24405 default:
24406 assert( cmd.eCmd==AR_CMD_UPDATE );
24407 rc = arCreateOrUpdateCommand(&cmd, 1, 1);
24408 break;
24409 }
24410 }
24411 end_ar_command:
24412 if( cmd.db!=pState->db ){
24413 close_db(cmd.db);
24414 }
24415 sqlite3_free(cmd.zSrcTable);
24416
24417 return rc;
24418 }
24419 /* End of the ".archive" or ".ar" command logic
24420 *******************************************************************************/
24421 #endif /* !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) */
24422
24423 #if SQLITE_SHELL_HAVE_RECOVER
24424
24425 /*
24426 ** This function is used as a callback by the recover extension. Simply
24427 ** print the supplied SQL statement to stdout.
24428 */
recoverSqlCb(void * pCtx,const char * zSql)24429 static int recoverSqlCb(void *pCtx, const char *zSql){
24430 ShellState *pState = (ShellState*)pCtx;
24431 sputf(pState->out, "%s;\n", zSql);
24432 return SQLITE_OK;
24433 }
24434
24435 /*
24436 ** This function is called to recover data from the database. A script
24437 ** to construct a new database containing all recovered data is output
24438 ** on stream pState->out.
24439 */
recoverDatabaseCmd(ShellState * pState,int nArg,char ** azArg)24440 static int recoverDatabaseCmd(ShellState *pState, int nArg, char **azArg){
24441 int rc = SQLITE_OK;
24442 const char *zRecoveryDb = ""; /* Name of "recovery" database. Debug only */
24443 const char *zLAF = "lost_and_found";
24444 int bFreelist = 1; /* 0 if --ignore-freelist is specified */
24445 int bRowids = 1; /* 0 if --no-rowids */
24446 sqlite3_recover *p = 0;
24447 int i = 0;
24448
24449 for(i=1; i<nArg; i++){
24450 char *z = azArg[i];
24451 int n;
24452 if( z[0]=='-' && z[1]=='-' ) z++;
24453 n = strlen30(z);
24454 if( n<=17 && memcmp("-ignore-freelist", z, n)==0 ){
24455 bFreelist = 0;
24456 }else
24457 if( n<=12 && memcmp("-recovery-db", z, n)==0 && i<(nArg-1) ){
24458 /* This option determines the name of the ATTACH-ed database used
24459 ** internally by the recovery extension. The default is "" which
24460 ** means to use a temporary database that is automatically deleted
24461 ** when closed. This option is undocumented and might disappear at
24462 ** any moment. */
24463 i++;
24464 zRecoveryDb = azArg[i];
24465 }else
24466 if( n<=15 && memcmp("-lost-and-found", z, n)==0 && i<(nArg-1) ){
24467 i++;
24468 zLAF = azArg[i];
24469 }else
24470 if( n<=10 && memcmp("-no-rowids", z, n)==0 ){
24471 bRowids = 0;
24472 }
24473 else{
24474 eputf("unexpected option: %s\n", azArg[i]);
24475 showHelp(pState->out, azArg[0]);
24476 return 1;
24477 }
24478 }
24479
24480 p = sqlite3_recover_init_sql(
24481 pState->db, "main", recoverSqlCb, (void*)pState
24482 );
24483
24484 sqlite3_recover_config(p, 789, (void*)zRecoveryDb); /* Debug use only */
24485 sqlite3_recover_config(p, SQLITE_RECOVER_LOST_AND_FOUND, (void*)zLAF);
24486 sqlite3_recover_config(p, SQLITE_RECOVER_ROWIDS, (void*)&bRowids);
24487 sqlite3_recover_config(p, SQLITE_RECOVER_FREELIST_CORRUPT,(void*)&bFreelist);
24488
24489 sqlite3_recover_run(p);
24490 if( sqlite3_recover_errcode(p)!=SQLITE_OK ){
24491 const char *zErr = sqlite3_recover_errmsg(p);
24492 int errCode = sqlite3_recover_errcode(p);
24493 eputf("sql error: %s (%d)\n", zErr, errCode);
24494 }
24495 rc = sqlite3_recover_finish(p);
24496 return rc;
24497 }
24498 #endif /* SQLITE_SHELL_HAVE_RECOVER */
24499
24500
24501 /*
24502 * zAutoColumn(zCol, &db, ?) => Maybe init db, add column zCol to it.
24503 * zAutoColumn(0, &db, ?) => (db!=0) Form columns spec for CREATE TABLE,
24504 * close db and set it to 0, and return the columns spec, to later
24505 * be sqlite3_free()'ed by the caller.
24506 * The return is 0 when either:
24507 * (a) The db was not initialized and zCol==0 (There are no columns.)
24508 * (b) zCol!=0 (Column was added, db initialized as needed.)
24509 * The 3rd argument, pRenamed, references an out parameter. If the
24510 * pointer is non-zero, its referent will be set to a summary of renames
24511 * done if renaming was necessary, or set to 0 if none was done. The out
24512 * string (if any) must be sqlite3_free()'ed by the caller.
24513 */
24514 #ifdef SHELL_DEBUG
24515 #define rc_err_oom_die(rc) \
24516 if( rc==SQLITE_NOMEM ) shell_check_oom(0); \
24517 else if(!(rc==SQLITE_OK||rc==SQLITE_DONE)) \
24518 eputf("E:%d\n",rc), assert(0)
24519 #else
rc_err_oom_die(int rc)24520 static void rc_err_oom_die(int rc){
24521 if( rc==SQLITE_NOMEM ) shell_check_oom(0);
24522 assert(rc==SQLITE_OK||rc==SQLITE_DONE);
24523 }
24524 #endif
24525
24526 #ifdef SHELL_COLFIX_DB /* If this is set, the DB can be in a file. */
24527 static char zCOL_DB[] = SHELL_STRINGIFY(SHELL_COLFIX_DB);
24528 #else /* Otherwise, memory is faster/better for the transient DB. */
24529 static const char *zCOL_DB = ":memory:";
24530 #endif
24531
24532 /* Define character (as C string) to separate generated column ordinal
24533 * from protected part of incoming column names. This defaults to "_"
24534 * so that incoming column identifiers that did not need not be quoted
24535 * remain usable without being quoted. It must be one character.
24536 */
24537 #ifndef SHELL_AUTOCOLUMN_SEP
24538 # define AUTOCOLUMN_SEP "_"
24539 #else
24540 # define AUTOCOLUMN_SEP SHELL_STRINGIFY(SHELL_AUTOCOLUMN_SEP)
24541 #endif
24542
zAutoColumn(const char * zColNew,sqlite3 ** pDb,char ** pzRenamed)24543 static char *zAutoColumn(const char *zColNew, sqlite3 **pDb, char **pzRenamed){
24544 /* Queries and D{D,M}L used here */
24545 static const char * const zTabMake = "\
24546 CREATE TABLE ColNames(\
24547 cpos INTEGER PRIMARY KEY,\
24548 name TEXT, nlen INT, chop INT, reps INT, suff TEXT);\
24549 CREATE VIEW RepeatedNames AS \
24550 SELECT DISTINCT t.name FROM ColNames t \
24551 WHERE t.name COLLATE NOCASE IN (\
24552 SELECT o.name FROM ColNames o WHERE o.cpos<>t.cpos\
24553 );\
24554 ";
24555 static const char * const zTabFill = "\
24556 INSERT INTO ColNames(name,nlen,chop,reps,suff)\
24557 VALUES(iif(length(?1)>0,?1,'?'),max(length(?1),1),0,0,'')\
24558 ";
24559 static const char * const zHasDupes = "\
24560 SELECT count(DISTINCT (substring(name,1,nlen-chop)||suff) COLLATE NOCASE)\
24561 <count(name) FROM ColNames\
24562 ";
24563 #ifdef SHELL_COLUMN_RENAME_CLEAN
24564 static const char * const zDedoctor = "\
24565 UPDATE ColNames SET chop=iif(\
24566 (substring(name,nlen,1) BETWEEN '0' AND '9')\
24567 AND (rtrim(name,'0123456790') glob '*"AUTOCOLUMN_SEP"'),\
24568 nlen-length(rtrim(name, '"AUTOCOLUMN_SEP"0123456789')),\
24569 0\
24570 )\
24571 ";
24572 #endif
24573 static const char * const zSetReps = "\
24574 UPDATE ColNames AS t SET reps=\
24575 (SELECT count(*) FROM ColNames d \
24576 WHERE substring(t.name,1,t.nlen-t.chop)=substring(d.name,1,d.nlen-d.chop)\
24577 COLLATE NOCASE\
24578 )\
24579 ";
24580 #ifdef SQLITE_ENABLE_MATH_FUNCTIONS
24581 static const char * const zColDigits = "\
24582 SELECT CAST(ceil(log(count(*)+0.5)) AS INT) FROM ColNames \
24583 ";
24584 #else
24585 /* Counting on SQLITE_MAX_COLUMN < 100,000 here. (32767 is the hard limit.) */
24586 static const char * const zColDigits = "\
24587 SELECT CASE WHEN (nc < 10) THEN 1 WHEN (nc < 100) THEN 2 \
24588 WHEN (nc < 1000) THEN 3 WHEN (nc < 10000) THEN 4 \
24589 ELSE 5 FROM (SELECT count(*) AS nc FROM ColNames) \
24590 ";
24591 #endif
24592 static const char * const zRenameRank =
24593 #ifdef SHELL_COLUMN_RENAME_CLEAN
24594 "UPDATE ColNames AS t SET suff="
24595 "iif(reps>1, printf('%c%0*d', '"AUTOCOLUMN_SEP"', $1, cpos), '')"
24596 #else /* ...RENAME_MINIMAL_ONE_PASS */
24597 "WITH Lzn(nlz) AS (" /* Find minimum extraneous leading 0's for uniqueness */
24598 " SELECT 0 AS nlz"
24599 " UNION"
24600 " SELECT nlz+1 AS nlz FROM Lzn"
24601 " WHERE EXISTS("
24602 " SELECT 1"
24603 " FROM ColNames t, ColNames o"
24604 " WHERE"
24605 " iif(t.name IN (SELECT * FROM RepeatedNames),"
24606 " printf('%s"AUTOCOLUMN_SEP"%s',"
24607 " t.name, substring(printf('%.*c%0.*d',nlz+1,'0',$1,t.cpos),2)),"
24608 " t.name"
24609 " )"
24610 " ="
24611 " iif(o.name IN (SELECT * FROM RepeatedNames),"
24612 " printf('%s"AUTOCOLUMN_SEP"%s',"
24613 " o.name, substring(printf('%.*c%0.*d',nlz+1,'0',$1,o.cpos),2)),"
24614 " o.name"
24615 " )"
24616 " COLLATE NOCASE"
24617 " AND o.cpos<>t.cpos"
24618 " GROUP BY t.cpos"
24619 " )"
24620 ") UPDATE Colnames AS t SET"
24621 " chop = 0," /* No chopping, never touch incoming names. */
24622 " suff = iif(name IN (SELECT * FROM RepeatedNames),"
24623 " printf('"AUTOCOLUMN_SEP"%s', substring("
24624 " printf('%.*c%0.*d',(SELECT max(nlz) FROM Lzn)+1,'0',1,t.cpos),2)),"
24625 " ''"
24626 " )"
24627 #endif
24628 ;
24629 static const char * const zCollectVar = "\
24630 SELECT\
24631 '('||x'0a'\
24632 || group_concat(\
24633 cname||' TEXT',\
24634 ','||iif((cpos-1)%4>0, ' ', x'0a'||' '))\
24635 ||')' AS ColsSpec \
24636 FROM (\
24637 SELECT cpos, printf('\"%w\"',printf('%!.*s%s', nlen-chop,name,suff)) AS cname \
24638 FROM ColNames ORDER BY cpos\
24639 )";
24640 static const char * const zRenamesDone =
24641 "SELECT group_concat("
24642 " printf('\"%w\" to \"%w\"',name,printf('%!.*s%s', nlen-chop, name, suff)),"
24643 " ','||x'0a')"
24644 "FROM ColNames WHERE suff<>'' OR chop!=0"
24645 ;
24646 int rc;
24647 sqlite3_stmt *pStmt = 0;
24648 assert(pDb!=0);
24649 if( zColNew ){
24650 /* Add initial or additional column. Init db if necessary. */
24651 if( *pDb==0 ){
24652 if( SQLITE_OK!=sqlite3_open(zCOL_DB, pDb) ) return 0;
24653 #ifdef SHELL_COLFIX_DB
24654 if(*zCOL_DB!=':')
24655 sqlite3_exec(*pDb,"drop table if exists ColNames;"
24656 "drop view if exists RepeatedNames;",0,0,0);
24657 #endif
24658 #undef SHELL_COLFIX_DB
24659 rc = sqlite3_exec(*pDb, zTabMake, 0, 0, 0);
24660 rc_err_oom_die(rc);
24661 }
24662 assert(*pDb!=0);
24663 rc = sqlite3_prepare_v2(*pDb, zTabFill, -1, &pStmt, 0);
24664 rc_err_oom_die(rc);
24665 rc = sqlite3_bind_text(pStmt, 1, zColNew, -1, 0);
24666 rc_err_oom_die(rc);
24667 rc = sqlite3_step(pStmt);
24668 rc_err_oom_die(rc);
24669 sqlite3_finalize(pStmt);
24670 return 0;
24671 }else if( *pDb==0 ){
24672 return 0;
24673 }else{
24674 /* Formulate the columns spec, close the DB, zero *pDb. */
24675 char *zColsSpec = 0;
24676 int hasDupes = db_int(*pDb, zHasDupes);
24677 int nDigits = (hasDupes)? db_int(*pDb, zColDigits) : 0;
24678 if( hasDupes ){
24679 #ifdef SHELL_COLUMN_RENAME_CLEAN
24680 rc = sqlite3_exec(*pDb, zDedoctor, 0, 0, 0);
24681 rc_err_oom_die(rc);
24682 #endif
24683 rc = sqlite3_exec(*pDb, zSetReps, 0, 0, 0);
24684 rc_err_oom_die(rc);
24685 rc = sqlite3_prepare_v2(*pDb, zRenameRank, -1, &pStmt, 0);
24686 rc_err_oom_die(rc);
24687 sqlite3_bind_int(pStmt, 1, nDigits);
24688 rc = sqlite3_step(pStmt);
24689 sqlite3_finalize(pStmt);
24690 if( rc!=SQLITE_DONE ) rc_err_oom_die(SQLITE_NOMEM);
24691 }
24692 assert(db_int(*pDb, zHasDupes)==0); /* Consider: remove this */
24693 rc = sqlite3_prepare_v2(*pDb, zCollectVar, -1, &pStmt, 0);
24694 rc_err_oom_die(rc);
24695 rc = sqlite3_step(pStmt);
24696 if( rc==SQLITE_ROW ){
24697 zColsSpec = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
24698 }else{
24699 zColsSpec = 0;
24700 }
24701 if( pzRenamed!=0 ){
24702 if( !hasDupes ) *pzRenamed = 0;
24703 else{
24704 sqlite3_finalize(pStmt);
24705 if( SQLITE_OK==sqlite3_prepare_v2(*pDb, zRenamesDone, -1, &pStmt, 0)
24706 && SQLITE_ROW==sqlite3_step(pStmt) ){
24707 *pzRenamed = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
24708 }else
24709 *pzRenamed = 0;
24710 }
24711 }
24712 sqlite3_finalize(pStmt);
24713 sqlite3_close(*pDb);
24714 *pDb = 0;
24715 return zColsSpec;
24716 }
24717 }
24718
24719 /*
24720 ** Check if the sqlite_schema table contains one or more virtual tables. If
24721 ** parameter zLike is not NULL, then it is an SQL expression that the
24722 ** sqlite_schema row must also match. If one or more such rows are found,
24723 ** print the following warning to the output:
24724 **
24725 ** WARNING: Script requires that SQLITE_DBCONFIG_DEFENSIVE be disabled
24726 */
outputDumpWarning(ShellState * p,const char * zLike)24727 static int outputDumpWarning(ShellState *p, const char *zLike){
24728 int rc = SQLITE_OK;
24729 sqlite3_stmt *pStmt = 0;
24730 shellPreparePrintf(p->db, &rc, &pStmt,
24731 "SELECT 1 FROM sqlite_schema o WHERE "
24732 "sql LIKE 'CREATE VIRTUAL TABLE%%' AND %s", zLike ? zLike : "true"
24733 );
24734 if( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
24735 oputz("/* WARNING: "
24736 "Script requires that SQLITE_DBCONFIG_DEFENSIVE be disabled */\n"
24737 );
24738 }
24739 shellFinalize(&rc, pStmt);
24740 return rc;
24741 }
24742
24743 /*
24744 ** If an input line begins with "." then invoke this routine to
24745 ** process that line.
24746 **
24747 ** Return 1 on error, 2 to exit, and 0 otherwise.
24748 */
do_meta_command(char * zLine,ShellState * p)24749 static int do_meta_command(char *zLine, ShellState *p){
24750 int h = 1;
24751 int nArg = 0;
24752 int n, c;
24753 int rc = 0;
24754 char *azArg[52];
24755
24756 #ifndef SQLITE_OMIT_VIRTUALTABLE
24757 if( p->expert.pExpert ){
24758 expertFinish(p, 1, 0);
24759 }
24760 #endif
24761
24762 /* Parse the input line into tokens.
24763 */
24764 while( zLine[h] && nArg<ArraySize(azArg)-1 ){
24765 while( IsSpace(zLine[h]) ){ h++; }
24766 if( zLine[h]==0 ) break;
24767 if( zLine[h]=='\'' || zLine[h]=='"' ){
24768 int delim = zLine[h++];
24769 azArg[nArg++] = &zLine[h];
24770 while( zLine[h] && zLine[h]!=delim ){
24771 if( zLine[h]=='\\' && delim=='"' && zLine[h+1]!=0 ) h++;
24772 h++;
24773 }
24774 if( zLine[h]==delim ){
24775 zLine[h++] = 0;
24776 }
24777 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
24778 }else{
24779 azArg[nArg++] = &zLine[h];
24780 while( zLine[h] && !IsSpace(zLine[h]) ){ h++; }
24781 if( zLine[h] ) zLine[h++] = 0;
24782 }
24783 }
24784 azArg[nArg] = 0;
24785
24786 /* Process the input line.
24787 */
24788 if( nArg==0 ) return 0; /* no tokens, no error */
24789 n = strlen30(azArg[0]);
24790 c = azArg[0][0];
24791 clearTempFile(p);
24792
24793 #ifndef SQLITE_OMIT_AUTHORIZATION
24794 if( c=='a' && cli_strncmp(azArg[0], "auth", n)==0 ){
24795 if( nArg!=2 ){
24796 eputz("Usage: .auth ON|OFF\n");
24797 rc = 1;
24798 goto meta_command_exit;
24799 }
24800 open_db(p, 0);
24801 if( booleanValue(azArg[1]) ){
24802 sqlite3_set_authorizer(p->db, shellAuth, p);
24803 }else if( p->bSafeModePersist ){
24804 sqlite3_set_authorizer(p->db, safeModeAuth, p);
24805 }else{
24806 sqlite3_set_authorizer(p->db, 0, 0);
24807 }
24808 }else
24809 #endif
24810
24811 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) \
24812 && !defined(SQLITE_SHELL_FIDDLE)
24813 if( c=='a' && cli_strncmp(azArg[0], "archive", n)==0 ){
24814 open_db(p, 0);
24815 failIfSafeMode(p, "cannot run .archive in safe mode");
24816 rc = arDotCommand(p, 0, azArg, nArg);
24817 }else
24818 #endif
24819
24820 #ifndef SQLITE_SHELL_FIDDLE
24821 if( (c=='b' && n>=3 && cli_strncmp(azArg[0], "backup", n)==0)
24822 || (c=='s' && n>=3 && cli_strncmp(azArg[0], "save", n)==0)
24823 ){
24824 const char *zDestFile = 0;
24825 const char *zDb = 0;
24826 sqlite3 *pDest;
24827 sqlite3_backup *pBackup;
24828 int j;
24829 int bAsync = 0;
24830 const char *zVfs = 0;
24831 failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]);
24832 for(j=1; j<nArg; j++){
24833 const char *z = azArg[j];
24834 if( z[0]=='-' ){
24835 if( z[1]=='-' ) z++;
24836 if( cli_strcmp(z, "-append")==0 ){
24837 zVfs = "apndvfs";
24838 }else
24839 if( cli_strcmp(z, "-async")==0 ){
24840 bAsync = 1;
24841 }else
24842 {
24843 eputf("unknown option: %s\n", azArg[j]);
24844 return 1;
24845 }
24846 }else if( zDestFile==0 ){
24847 zDestFile = azArg[j];
24848 }else if( zDb==0 ){
24849 zDb = zDestFile;
24850 zDestFile = azArg[j];
24851 }else{
24852 eputz("Usage: .backup ?DB? ?OPTIONS? FILENAME\n");
24853 return 1;
24854 }
24855 }
24856 if( zDestFile==0 ){
24857 eputz("missing FILENAME argument on .backup\n");
24858 return 1;
24859 }
24860 if( zDb==0 ) zDb = "main";
24861 rc = sqlite3_open_v2(zDestFile, &pDest,
24862 SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE, zVfs);
24863 if( rc!=SQLITE_OK ){
24864 eputf("Error: cannot open \"%s\"\n", zDestFile);
24865 close_db(pDest);
24866 return 1;
24867 }
24868 if( bAsync ){
24869 sqlite3_exec(pDest, "PRAGMA synchronous=OFF; PRAGMA journal_mode=OFF;",
24870 0, 0, 0);
24871 }
24872 open_db(p, 0);
24873 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
24874 if( pBackup==0 ){
24875 eputf("Error: %s\n", sqlite3_errmsg(pDest));
24876 close_db(pDest);
24877 return 1;
24878 }
24879 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
24880 sqlite3_backup_finish(pBackup);
24881 if( rc==SQLITE_DONE ){
24882 rc = 0;
24883 }else{
24884 eputf("Error: %s\n", sqlite3_errmsg(pDest));
24885 rc = 1;
24886 }
24887 close_db(pDest);
24888 }else
24889 #endif /* !defined(SQLITE_SHELL_FIDDLE) */
24890
24891 if( c=='b' && n>=3 && cli_strncmp(azArg[0], "bail", n)==0 ){
24892 if( nArg==2 ){
24893 bail_on_error = booleanValue(azArg[1]);
24894 }else{
24895 eputz("Usage: .bail on|off\n");
24896 rc = 1;
24897 }
24898 }else
24899
24900 /* Undocumented. Legacy only. See "crnl" below */
24901 if( c=='b' && n>=3 && cli_strncmp(azArg[0], "binary", n)==0 ){
24902 if( nArg==2 ){
24903 if( booleanValue(azArg[1]) ){
24904 setBinaryMode(p->out, 1);
24905 }else{
24906 setTextMode(p->out, 1);
24907 }
24908 }else{
24909 eputz("The \".binary\" command is deprecated. Use \".crnl\" instead.\n"
24910 "Usage: .binary on|off\n");
24911 rc = 1;
24912 }
24913 }else
24914
24915 /* The undocumented ".breakpoint" command causes a call to the no-op
24916 ** routine named test_breakpoint().
24917 */
24918 if( c=='b' && n>=3 && cli_strncmp(azArg[0], "breakpoint", n)==0 ){
24919 test_breakpoint();
24920 }else
24921
24922 #ifndef SQLITE_SHELL_FIDDLE
24923 if( c=='c' && cli_strcmp(azArg[0],"cd")==0 ){
24924 failIfSafeMode(p, "cannot run .cd in safe mode");
24925 if( nArg==2 ){
24926 #if defined(_WIN32) || defined(WIN32)
24927 wchar_t *z = sqlite3_win32_utf8_to_unicode(azArg[1]);
24928 rc = !SetCurrentDirectoryW(z);
24929 sqlite3_free(z);
24930 #else
24931 rc = chdir(azArg[1]);
24932 #endif
24933 if( rc ){
24934 eputf("Cannot change to directory \"%s\"\n", azArg[1]);
24935 rc = 1;
24936 }
24937 }else{
24938 eputz("Usage: .cd DIRECTORY\n");
24939 rc = 1;
24940 }
24941 }else
24942 #endif /* !defined(SQLITE_SHELL_FIDDLE) */
24943
24944 if( c=='c' && n>=3 && cli_strncmp(azArg[0], "changes", n)==0 ){
24945 if( nArg==2 ){
24946 setOrClearFlag(p, SHFLG_CountChanges, azArg[1]);
24947 }else{
24948 eputz("Usage: .changes on|off\n");
24949 rc = 1;
24950 }
24951 }else
24952
24953 #ifndef SQLITE_SHELL_FIDDLE
24954 /* Cancel output redirection, if it is currently set (by .testcase)
24955 ** Then read the content of the testcase-out.txt file and compare against
24956 ** azArg[1]. If there are differences, report an error and exit.
24957 */
24958 if( c=='c' && n>=3 && cli_strncmp(azArg[0], "check", n)==0 ){
24959 char *zRes = 0;
24960 output_reset(p);
24961 if( nArg!=2 ){
24962 eputz("Usage: .check GLOB-PATTERN\n");
24963 rc = 2;
24964 }else if( (zRes = readFile("testcase-out.txt", 0))==0 ){
24965 rc = 2;
24966 }else if( testcase_glob(azArg[1],zRes)==0 ){
24967 eputf("testcase-%s FAILED\n Expected: [%s]\n Got: [%s]\n",
24968 p->zTestcase, azArg[1], zRes);
24969 rc = 1;
24970 }else{
24971 oputf("testcase-%s ok\n", p->zTestcase);
24972 p->nCheck++;
24973 }
24974 sqlite3_free(zRes);
24975 }else
24976 #endif /* !defined(SQLITE_SHELL_FIDDLE) */
24977
24978 #ifndef SQLITE_SHELL_FIDDLE
24979 if( c=='c' && cli_strncmp(azArg[0], "clone", n)==0 ){
24980 failIfSafeMode(p, "cannot run .clone in safe mode");
24981 if( nArg==2 ){
24982 tryToClone(p, azArg[1]);
24983 }else{
24984 eputz("Usage: .clone FILENAME\n");
24985 rc = 1;
24986 }
24987 }else
24988 #endif /* !defined(SQLITE_SHELL_FIDDLE) */
24989
24990 if( c=='c' && cli_strncmp(azArg[0], "connection", n)==0 ){
24991 if( nArg==1 ){
24992 /* List available connections */
24993 int i;
24994 for(i=0; i<ArraySize(p->aAuxDb); i++){
24995 const char *zFile = p->aAuxDb[i].zDbFilename;
24996 if( p->aAuxDb[i].db==0 && p->pAuxDb!=&p->aAuxDb[i] ){
24997 zFile = "(not open)";
24998 }else if( zFile==0 ){
24999 zFile = "(memory)";
25000 }else if( zFile[0]==0 ){
25001 zFile = "(temporary-file)";
25002 }
25003 if( p->pAuxDb == &p->aAuxDb[i] ){
25004 sputf(stdout, "ACTIVE %d: %s\n", i, zFile);
25005 }else if( p->aAuxDb[i].db!=0 ){
25006 sputf(stdout, " %d: %s\n", i, zFile);
25007 }
25008 }
25009 }else if( nArg==2 && IsDigit(azArg[1][0]) && azArg[1][1]==0 ){
25010 int i = azArg[1][0] - '0';
25011 if( p->pAuxDb != &p->aAuxDb[i] && i>=0 && i<ArraySize(p->aAuxDb) ){
25012 p->pAuxDb->db = p->db;
25013 p->pAuxDb = &p->aAuxDb[i];
25014 globalDb = p->db = p->pAuxDb->db;
25015 p->pAuxDb->db = 0;
25016 }
25017 }else if( nArg==3 && cli_strcmp(azArg[1], "close")==0
25018 && IsDigit(azArg[2][0]) && azArg[2][1]==0 ){
25019 int i = azArg[2][0] - '0';
25020 if( i<0 || i>=ArraySize(p->aAuxDb) ){
25021 /* No-op */
25022 }else if( p->pAuxDb == &p->aAuxDb[i] ){
25023 eputz("cannot close the active database connection\n");
25024 rc = 1;
25025 }else if( p->aAuxDb[i].db ){
25026 session_close_all(p, i);
25027 close_db(p->aAuxDb[i].db);
25028 p->aAuxDb[i].db = 0;
25029 }
25030 }else{
25031 eputz("Usage: .connection [close] [CONNECTION-NUMBER]\n");
25032 rc = 1;
25033 }
25034 }else
25035
25036 if( c=='c' && n==4 && cli_strncmp(azArg[0], "crnl", n)==0 ){
25037 if( nArg==2 ){
25038 if( booleanValue(azArg[1]) ){
25039 setTextMode(p->out, 1);
25040 }else{
25041 setBinaryMode(p->out, 1);
25042 }
25043 }else{
25044 #if !defined(_WIN32) && !defined(WIN32)
25045 eputz("The \".crnl\" is a no-op on non-Windows machines.\n");
25046 #endif
25047 eputz("Usage: .crnl on|off\n");
25048 rc = 1;
25049 }
25050 }else
25051
25052 if( c=='d' && n>1 && cli_strncmp(azArg[0], "databases", n)==0 ){
25053 char **azName = 0;
25054 int nName = 0;
25055 sqlite3_stmt *pStmt;
25056 int i;
25057 open_db(p, 0);
25058 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
25059 if( rc ){
25060 eputf("Error: %s\n", sqlite3_errmsg(p->db));
25061 rc = 1;
25062 }else{
25063 while( sqlite3_step(pStmt)==SQLITE_ROW ){
25064 const char *zSchema = (const char *)sqlite3_column_text(pStmt,1);
25065 const char *zFile = (const char*)sqlite3_column_text(pStmt,2);
25066 if( zSchema==0 || zFile==0 ) continue;
25067 azName = sqlite3_realloc(azName, (nName+1)*2*sizeof(char*));
25068 shell_check_oom(azName);
25069 azName[nName*2] = strdup(zSchema);
25070 azName[nName*2+1] = strdup(zFile);
25071 nName++;
25072 }
25073 }
25074 sqlite3_finalize(pStmt);
25075 for(i=0; i<nName; i++){
25076 int eTxn = sqlite3_txn_state(p->db, azName[i*2]);
25077 int bRdonly = sqlite3_db_readonly(p->db, azName[i*2]);
25078 const char *z = azName[i*2+1];
25079 oputf("%s: %s %s%s\n",
25080 azName[i*2], z && z[0] ? z : "\"\"", bRdonly ? "r/o" : "r/w",
25081 eTxn==SQLITE_TXN_NONE ? "" :
25082 eTxn==SQLITE_TXN_READ ? " read-txn" : " write-txn");
25083 free(azName[i*2]);
25084 free(azName[i*2+1]);
25085 }
25086 sqlite3_free(azName);
25087 }else
25088
25089 if( c=='d' && n>=3 && cli_strncmp(azArg[0], "dbconfig", n)==0 ){
25090 static const struct DbConfigChoices {
25091 const char *zName;
25092 int op;
25093 } aDbConfig[] = {
25094 { "defensive", SQLITE_DBCONFIG_DEFENSIVE },
25095 { "dqs_ddl", SQLITE_DBCONFIG_DQS_DDL },
25096 { "dqs_dml", SQLITE_DBCONFIG_DQS_DML },
25097 { "enable_fkey", SQLITE_DBCONFIG_ENABLE_FKEY },
25098 { "enable_qpsg", SQLITE_DBCONFIG_ENABLE_QPSG },
25099 { "enable_trigger", SQLITE_DBCONFIG_ENABLE_TRIGGER },
25100 { "enable_view", SQLITE_DBCONFIG_ENABLE_VIEW },
25101 { "fts3_tokenizer", SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER },
25102 { "legacy_alter_table", SQLITE_DBCONFIG_LEGACY_ALTER_TABLE },
25103 { "legacy_file_format", SQLITE_DBCONFIG_LEGACY_FILE_FORMAT },
25104 { "load_extension", SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION },
25105 { "no_ckpt_on_close", SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE },
25106 { "reset_database", SQLITE_DBCONFIG_RESET_DATABASE },
25107 { "reverse_scanorder", SQLITE_DBCONFIG_REVERSE_SCANORDER },
25108 { "stmt_scanstatus", SQLITE_DBCONFIG_STMT_SCANSTATUS },
25109 { "trigger_eqp", SQLITE_DBCONFIG_TRIGGER_EQP },
25110 { "trusted_schema", SQLITE_DBCONFIG_TRUSTED_SCHEMA },
25111 { "writable_schema", SQLITE_DBCONFIG_WRITABLE_SCHEMA },
25112 };
25113 int ii, v;
25114 open_db(p, 0);
25115 for(ii=0; ii<ArraySize(aDbConfig); ii++){
25116 if( nArg>1 && cli_strcmp(azArg[1], aDbConfig[ii].zName)!=0 ) continue;
25117 if( nArg>=3 ){
25118 sqlite3_db_config(p->db, aDbConfig[ii].op, booleanValue(azArg[2]), 0);
25119 }
25120 sqlite3_db_config(p->db, aDbConfig[ii].op, -1, &v);
25121 oputf("%19s %s\n", aDbConfig[ii].zName, v ? "on" : "off");
25122 if( nArg>1 ) break;
25123 }
25124 if( nArg>1 && ii==ArraySize(aDbConfig) ){
25125 eputf("Error: unknown dbconfig \"%s\"\n", azArg[1]);
25126 eputz("Enter \".dbconfig\" with no arguments for a list\n");
25127 }
25128 }else
25129
25130 #if SQLITE_SHELL_HAVE_RECOVER
25131 if( c=='d' && n>=3 && cli_strncmp(azArg[0], "dbinfo", n)==0 ){
25132 rc = shell_dbinfo_command(p, nArg, azArg);
25133 }else
25134
25135 if( c=='r' && cli_strncmp(azArg[0], "recover", n)==0 ){
25136 open_db(p, 0);
25137 rc = recoverDatabaseCmd(p, nArg, azArg);
25138 }else
25139 #endif /* SQLITE_SHELL_HAVE_RECOVER */
25140
25141 if( c=='d' && cli_strncmp(azArg[0], "dump", n)==0 ){
25142 char *zLike = 0;
25143 char *zSql;
25144 int i;
25145 int savedShowHeader = p->showHeader;
25146 int savedShellFlags = p->shellFlgs;
25147 ShellClearFlag(p,
25148 SHFLG_PreserveRowid|SHFLG_Newlines|SHFLG_Echo
25149 |SHFLG_DumpDataOnly|SHFLG_DumpNoSys);
25150 for(i=1; i<nArg; i++){
25151 if( azArg[i][0]=='-' ){
25152 const char *z = azArg[i]+1;
25153 if( z[0]=='-' ) z++;
25154 if( cli_strcmp(z,"preserve-rowids")==0 ){
25155 #ifdef SQLITE_OMIT_VIRTUALTABLE
25156 eputz("The --preserve-rowids option is not compatible"
25157 " with SQLITE_OMIT_VIRTUALTABLE\n");
25158 rc = 1;
25159 sqlite3_free(zLike);
25160 goto meta_command_exit;
25161 #else
25162 ShellSetFlag(p, SHFLG_PreserveRowid);
25163 #endif
25164 }else
25165 if( cli_strcmp(z,"newlines")==0 ){
25166 ShellSetFlag(p, SHFLG_Newlines);
25167 }else
25168 if( cli_strcmp(z,"data-only")==0 ){
25169 ShellSetFlag(p, SHFLG_DumpDataOnly);
25170 }else
25171 if( cli_strcmp(z,"nosys")==0 ){
25172 ShellSetFlag(p, SHFLG_DumpNoSys);
25173 }else
25174 {
25175 eputf("Unknown option \"%s\" on \".dump\"\n", azArg[i]);
25176 rc = 1;
25177 sqlite3_free(zLike);
25178 goto meta_command_exit;
25179 }
25180 }else{
25181 /* azArg[i] contains a LIKE pattern. This ".dump" request should
25182 ** only dump data for tables for which either the table name matches
25183 ** the LIKE pattern, or the table appears to be a shadow table of
25184 ** a virtual table for which the name matches the LIKE pattern.
25185 */
25186 char *zExpr = sqlite3_mprintf(
25187 "name LIKE %Q ESCAPE '\\' OR EXISTS ("
25188 " SELECT 1 FROM sqlite_schema WHERE "
25189 " name LIKE %Q ESCAPE '\\' AND"
25190 " sql LIKE 'CREATE VIRTUAL TABLE%%' AND"
25191 " substr(o.name, 1, length(name)+1) == (name||'_')"
25192 ")", azArg[i], azArg[i]
25193 );
25194
25195 if( zLike ){
25196 zLike = sqlite3_mprintf("%z OR %z", zLike, zExpr);
25197 }else{
25198 zLike = zExpr;
25199 }
25200 }
25201 }
25202
25203 open_db(p, 0);
25204
25205 outputDumpWarning(p, zLike);
25206 if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
25207 /* When playing back a "dump", the content might appear in an order
25208 ** which causes immediate foreign key constraints to be violated.
25209 ** So disable foreign-key constraint enforcement to prevent problems. */
25210 oputz("PRAGMA foreign_keys=OFF;\n");
25211 oputz("BEGIN TRANSACTION;\n");
25212 }
25213 p->writableSchema = 0;
25214 p->showHeader = 0;
25215 /* Set writable_schema=ON since doing so forces SQLite to initialize
25216 ** as much of the schema as it can even if the sqlite_schema table is
25217 ** corrupt. */
25218 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
25219 p->nErr = 0;
25220 if( zLike==0 ) zLike = sqlite3_mprintf("true");
25221 zSql = sqlite3_mprintf(
25222 "SELECT name, type, sql FROM sqlite_schema AS o "
25223 "WHERE (%s) AND type=='table'"
25224 " AND sql NOT NULL"
25225 " ORDER BY tbl_name='sqlite_sequence', rowid",
25226 zLike
25227 );
25228 run_schema_dump_query(p,zSql);
25229 sqlite3_free(zSql);
25230 if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
25231 zSql = sqlite3_mprintf(
25232 "SELECT sql FROM sqlite_schema AS o "
25233 "WHERE (%s) AND sql NOT NULL"
25234 " AND type IN ('index','trigger','view')",
25235 zLike
25236 );
25237 run_table_dump_query(p, zSql);
25238 sqlite3_free(zSql);
25239 }
25240 sqlite3_free(zLike);
25241 if( p->writableSchema ){
25242 oputz("PRAGMA writable_schema=OFF;\n");
25243 p->writableSchema = 0;
25244 }
25245 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
25246 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
25247 if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
25248 oputz(p->nErr?"ROLLBACK; -- due to errors\n":"COMMIT;\n");
25249 }
25250 p->showHeader = savedShowHeader;
25251 p->shellFlgs = savedShellFlags;
25252 }else
25253
25254 if( c=='e' && cli_strncmp(azArg[0], "echo", n)==0 ){
25255 if( nArg==2 ){
25256 setOrClearFlag(p, SHFLG_Echo, azArg[1]);
25257 }else{
25258 eputz("Usage: .echo on|off\n");
25259 rc = 1;
25260 }
25261 }else
25262
25263 if( c=='e' && cli_strncmp(azArg[0], "eqp", n)==0 ){
25264 if( nArg==2 ){
25265 p->autoEQPtest = 0;
25266 if( p->autoEQPtrace ){
25267 if( p->db ) sqlite3_exec(p->db, "PRAGMA vdbe_trace=OFF;", 0, 0, 0);
25268 p->autoEQPtrace = 0;
25269 }
25270 if( cli_strcmp(azArg[1],"full")==0 ){
25271 p->autoEQP = AUTOEQP_full;
25272 }else if( cli_strcmp(azArg[1],"trigger")==0 ){
25273 p->autoEQP = AUTOEQP_trigger;
25274 #ifdef SQLITE_DEBUG
25275 }else if( cli_strcmp(azArg[1],"test")==0 ){
25276 p->autoEQP = AUTOEQP_on;
25277 p->autoEQPtest = 1;
25278 }else if( cli_strcmp(azArg[1],"trace")==0 ){
25279 p->autoEQP = AUTOEQP_full;
25280 p->autoEQPtrace = 1;
25281 open_db(p, 0);
25282 sqlite3_exec(p->db, "SELECT name FROM sqlite_schema LIMIT 1", 0, 0, 0);
25283 sqlite3_exec(p->db, "PRAGMA vdbe_trace=ON;", 0, 0, 0);
25284 #endif
25285 }else{
25286 p->autoEQP = (u8)booleanValue(azArg[1]);
25287 }
25288 }else{
25289 eputz("Usage: .eqp off|on|trace|trigger|full\n");
25290 rc = 1;
25291 }
25292 }else
25293
25294 #ifndef SQLITE_SHELL_FIDDLE
25295 if( c=='e' && cli_strncmp(azArg[0], "exit", n)==0 ){
25296 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
25297 rc = 2;
25298 }else
25299 #endif
25300
25301 /* The ".explain" command is automatic now. It is largely pointless. It
25302 ** retained purely for backwards compatibility */
25303 if( c=='e' && cli_strncmp(azArg[0], "explain", n)==0 ){
25304 int val = 1;
25305 if( nArg>=2 ){
25306 if( cli_strcmp(azArg[1],"auto")==0 ){
25307 val = 99;
25308 }else{
25309 val = booleanValue(azArg[1]);
25310 }
25311 }
25312 if( val==1 && p->mode!=MODE_Explain ){
25313 p->normalMode = p->mode;
25314 p->mode = MODE_Explain;
25315 p->autoExplain = 0;
25316 }else if( val==0 ){
25317 if( p->mode==MODE_Explain ) p->mode = p->normalMode;
25318 p->autoExplain = 0;
25319 }else if( val==99 ){
25320 if( p->mode==MODE_Explain ) p->mode = p->normalMode;
25321 p->autoExplain = 1;
25322 }
25323 }else
25324
25325 #ifndef SQLITE_OMIT_VIRTUALTABLE
25326 if( c=='e' && cli_strncmp(azArg[0], "expert", n)==0 ){
25327 if( p->bSafeMode ){
25328 eputf("Cannot run experimental commands such as \"%s\" in safe mode\n",
25329 azArg[0]);
25330 rc = 1;
25331 }else{
25332 open_db(p, 0);
25333 expertDotCommand(p, azArg, nArg);
25334 }
25335 }else
25336 #endif
25337
25338 if( c=='f' && cli_strncmp(azArg[0], "filectrl", n)==0 ){
25339 static const struct {
25340 const char *zCtrlName; /* Name of a test-control option */
25341 int ctrlCode; /* Integer code for that option */
25342 const char *zUsage; /* Usage notes */
25343 } aCtrl[] = {
25344 { "chunk_size", SQLITE_FCNTL_CHUNK_SIZE, "SIZE" },
25345 { "data_version", SQLITE_FCNTL_DATA_VERSION, "" },
25346 { "has_moved", SQLITE_FCNTL_HAS_MOVED, "" },
25347 { "lock_timeout", SQLITE_FCNTL_LOCK_TIMEOUT, "MILLISEC" },
25348 { "persist_wal", SQLITE_FCNTL_PERSIST_WAL, "[BOOLEAN]" },
25349 /* { "pragma", SQLITE_FCNTL_PRAGMA, "NAME ARG" },*/
25350 { "psow", SQLITE_FCNTL_POWERSAFE_OVERWRITE, "[BOOLEAN]" },
25351 { "reserve_bytes", SQLITE_FCNTL_RESERVE_BYTES, "[N]" },
25352 { "size_limit", SQLITE_FCNTL_SIZE_LIMIT, "[LIMIT]" },
25353 { "tempfilename", SQLITE_FCNTL_TEMPFILENAME, "" },
25354 /* { "win32_av_retry", SQLITE_FCNTL_WIN32_AV_RETRY, "COUNT DELAY" },*/
25355 };
25356 int filectrl = -1;
25357 int iCtrl = -1;
25358 sqlite3_int64 iRes = 0; /* Integer result to display if rc2==1 */
25359 int isOk = 0; /* 0: usage 1: %lld 2: no-result */
25360 int n2, i;
25361 const char *zCmd = 0;
25362 const char *zSchema = 0;
25363
25364 open_db(p, 0);
25365 zCmd = nArg>=2 ? azArg[1] : "help";
25366
25367 if( zCmd[0]=='-'
25368 && (cli_strcmp(zCmd,"--schema")==0 || cli_strcmp(zCmd,"-schema")==0)
25369 && nArg>=4
25370 ){
25371 zSchema = azArg[2];
25372 for(i=3; i<nArg; i++) azArg[i-2] = azArg[i];
25373 nArg -= 2;
25374 zCmd = azArg[1];
25375 }
25376
25377 /* The argument can optionally begin with "-" or "--" */
25378 if( zCmd[0]=='-' && zCmd[1] ){
25379 zCmd++;
25380 if( zCmd[0]=='-' && zCmd[1] ) zCmd++;
25381 }
25382
25383 /* --help lists all file-controls */
25384 if( cli_strcmp(zCmd,"help")==0 ){
25385 oputz("Available file-controls:\n");
25386 for(i=0; i<ArraySize(aCtrl); i++){
25387 oputf(" .filectrl %s %s\n", aCtrl[i].zCtrlName, aCtrl[i].zUsage);
25388 }
25389 rc = 1;
25390 goto meta_command_exit;
25391 }
25392
25393 /* convert filectrl text option to value. allow any unique prefix
25394 ** of the option name, or a numerical value. */
25395 n2 = strlen30(zCmd);
25396 for(i=0; i<ArraySize(aCtrl); i++){
25397 if( cli_strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){
25398 if( filectrl<0 ){
25399 filectrl = aCtrl[i].ctrlCode;
25400 iCtrl = i;
25401 }else{
25402 eputf("Error: ambiguous file-control: \"%s\"\n"
25403 "Use \".filectrl --help\" for help\n", zCmd);
25404 rc = 1;
25405 goto meta_command_exit;
25406 }
25407 }
25408 }
25409 if( filectrl<0 ){
25410 eputf("Error: unknown file-control: %s\n"
25411 "Use \".filectrl --help\" for help\n", zCmd);
25412 }else{
25413 switch(filectrl){
25414 case SQLITE_FCNTL_SIZE_LIMIT: {
25415 if( nArg!=2 && nArg!=3 ) break;
25416 iRes = nArg==3 ? integerValue(azArg[2]) : -1;
25417 sqlite3_file_control(p->db, zSchema, SQLITE_FCNTL_SIZE_LIMIT, &iRes);
25418 isOk = 1;
25419 break;
25420 }
25421 case SQLITE_FCNTL_LOCK_TIMEOUT:
25422 case SQLITE_FCNTL_CHUNK_SIZE: {
25423 int x;
25424 if( nArg!=3 ) break;
25425 x = (int)integerValue(azArg[2]);
25426 sqlite3_file_control(p->db, zSchema, filectrl, &x);
25427 isOk = 2;
25428 break;
25429 }
25430 case SQLITE_FCNTL_PERSIST_WAL:
25431 case SQLITE_FCNTL_POWERSAFE_OVERWRITE: {
25432 int x;
25433 if( nArg!=2 && nArg!=3 ) break;
25434 x = nArg==3 ? booleanValue(azArg[2]) : -1;
25435 sqlite3_file_control(p->db, zSchema, filectrl, &x);
25436 iRes = x;
25437 isOk = 1;
25438 break;
25439 }
25440 case SQLITE_FCNTL_DATA_VERSION:
25441 case SQLITE_FCNTL_HAS_MOVED: {
25442 int x;
25443 if( nArg!=2 ) break;
25444 sqlite3_file_control(p->db, zSchema, filectrl, &x);
25445 iRes = x;
25446 isOk = 1;
25447 break;
25448 }
25449 case SQLITE_FCNTL_TEMPFILENAME: {
25450 char *z = 0;
25451 if( nArg!=2 ) break;
25452 sqlite3_file_control(p->db, zSchema, filectrl, &z);
25453 if( z ){
25454 oputf("%s\n", z);
25455 sqlite3_free(z);
25456 }
25457 isOk = 2;
25458 break;
25459 }
25460 case SQLITE_FCNTL_RESERVE_BYTES: {
25461 int x;
25462 if( nArg>=3 ){
25463 x = atoi(azArg[2]);
25464 sqlite3_file_control(p->db, zSchema, filectrl, &x);
25465 }
25466 x = -1;
25467 sqlite3_file_control(p->db, zSchema, filectrl, &x);
25468 oputf("%d\n", x);
25469 isOk = 2;
25470 break;
25471 }
25472 }
25473 }
25474 if( isOk==0 && iCtrl>=0 ){
25475 oputf("Usage: .filectrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage);
25476 rc = 1;
25477 }else if( isOk==1 ){
25478 char zBuf[100];
25479 sqlite3_snprintf(sizeof(zBuf), zBuf, "%lld", iRes);
25480 oputf("%s\n", zBuf);
25481 }
25482 }else
25483
25484 if( c=='f' && cli_strncmp(azArg[0], "fullschema", n)==0 ){
25485 ShellState data;
25486 int doStats = 0;
25487 memcpy(&data, p, sizeof(data));
25488 data.showHeader = 0;
25489 data.cMode = data.mode = MODE_Semi;
25490 if( nArg==2 && optionMatch(azArg[1], "indent") ){
25491 data.cMode = data.mode = MODE_Pretty;
25492 nArg = 1;
25493 }
25494 if( nArg!=1 ){
25495 eputz("Usage: .fullschema ?--indent?\n");
25496 rc = 1;
25497 goto meta_command_exit;
25498 }
25499 open_db(p, 0);
25500 rc = sqlite3_exec(p->db,
25501 "SELECT sql FROM"
25502 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
25503 " FROM sqlite_schema UNION ALL"
25504 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_schema) "
25505 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
25506 "ORDER BY x",
25507 callback, &data, 0
25508 );
25509 if( rc==SQLITE_OK ){
25510 sqlite3_stmt *pStmt;
25511 rc = sqlite3_prepare_v2(p->db,
25512 "SELECT rowid FROM sqlite_schema"
25513 " WHERE name GLOB 'sqlite_stat[134]'",
25514 -1, &pStmt, 0);
25515 if( rc==SQLITE_OK ){
25516 doStats = sqlite3_step(pStmt)==SQLITE_ROW;
25517 sqlite3_finalize(pStmt);
25518 }
25519 }
25520 if( doStats==0 ){
25521 oputz("/* No STAT tables available */\n");
25522 }else{
25523 oputz("ANALYZE sqlite_schema;\n");
25524 data.cMode = data.mode = MODE_Insert;
25525 data.zDestTable = "sqlite_stat1";
25526 shell_exec(&data, "SELECT * FROM sqlite_stat1", 0);
25527 data.zDestTable = "sqlite_stat4";
25528 shell_exec(&data, "SELECT * FROM sqlite_stat4", 0);
25529 oputz("ANALYZE sqlite_schema;\n");
25530 }
25531 }else
25532
25533 if( c=='h' && cli_strncmp(azArg[0], "headers", n)==0 ){
25534 if( nArg==2 ){
25535 p->showHeader = booleanValue(azArg[1]);
25536 p->shellFlgs |= SHFLG_HeaderSet;
25537 }else{
25538 eputz("Usage: .headers on|off\n");
25539 rc = 1;
25540 }
25541 }else
25542
25543 if( c=='h' && cli_strncmp(azArg[0], "help", n)==0 ){
25544 if( nArg>=2 ){
25545 n = showHelp(p->out, azArg[1]);
25546 if( n==0 ){
25547 oputf("Nothing matches '%s'\n", azArg[1]);
25548 }
25549 }else{
25550 showHelp(p->out, 0);
25551 }
25552 }else
25553
25554 #ifndef SQLITE_SHELL_FIDDLE
25555 if( c=='i' && cli_strncmp(azArg[0], "import", n)==0 ){
25556 char *zTable = 0; /* Insert data into this table */
25557 char *zSchema = 0; /* within this schema (may default to "main") */
25558 char *zFile = 0; /* Name of file to extra content from */
25559 sqlite3_stmt *pStmt = NULL; /* A statement */
25560 int nCol; /* Number of columns in the table */
25561 int nByte; /* Number of bytes in an SQL string */
25562 int i, j; /* Loop counters */
25563 int needCommit; /* True to COMMIT or ROLLBACK at end */
25564 int nSep; /* Number of bytes in p->colSeparator[] */
25565 char *zSql; /* An SQL statement */
25566 char *zFullTabName; /* Table name with schema if applicable */
25567 ImportCtx sCtx; /* Reader context */
25568 char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */
25569 int eVerbose = 0; /* Larger for more console output */
25570 int nSkip = 0; /* Initial lines to skip */
25571 int useOutputMode = 1; /* Use output mode to determine separators */
25572 char *zCreate = 0; /* CREATE TABLE statement text */
25573
25574 failIfSafeMode(p, "cannot run .import in safe mode");
25575 memset(&sCtx, 0, sizeof(sCtx));
25576 if( p->mode==MODE_Ascii ){
25577 xRead = ascii_read_one_field;
25578 }else{
25579 xRead = csv_read_one_field;
25580 }
25581 rc = 1;
25582 for(i=1; i<nArg; i++){
25583 char *z = azArg[i];
25584 if( z[0]=='-' && z[1]=='-' ) z++;
25585 if( z[0]!='-' ){
25586 if( zFile==0 ){
25587 zFile = z;
25588 }else if( zTable==0 ){
25589 zTable = z;
25590 }else{
25591 oputf("ERROR: extra argument: \"%s\". Usage:\n", z);
25592 showHelp(p->out, "import");
25593 goto meta_command_exit;
25594 }
25595 }else if( cli_strcmp(z,"-v")==0 ){
25596 eVerbose++;
25597 }else if( cli_strcmp(z,"-schema")==0 && i<nArg-1 ){
25598 zSchema = azArg[++i];
25599 }else if( cli_strcmp(z,"-skip")==0 && i<nArg-1 ){
25600 nSkip = integerValue(azArg[++i]);
25601 }else if( cli_strcmp(z,"-ascii")==0 ){
25602 sCtx.cColSep = SEP_Unit[0];
25603 sCtx.cRowSep = SEP_Record[0];
25604 xRead = ascii_read_one_field;
25605 useOutputMode = 0;
25606 }else if( cli_strcmp(z,"-csv")==0 ){
25607 sCtx.cColSep = ',';
25608 sCtx.cRowSep = '\n';
25609 xRead = csv_read_one_field;
25610 useOutputMode = 0;
25611 }else{
25612 oputf("ERROR: unknown option: \"%s\". Usage:\n", z);
25613 showHelp(p->out, "import");
25614 goto meta_command_exit;
25615 }
25616 }
25617 if( zTable==0 ){
25618 oputf("ERROR: missing %s argument. Usage:\n",
25619 zFile==0 ? "FILE" : "TABLE");
25620 showHelp(p->out, "import");
25621 goto meta_command_exit;
25622 }
25623 seenInterrupt = 0;
25624 open_db(p, 0);
25625 if( useOutputMode ){
25626 /* If neither the --csv or --ascii options are specified, then set
25627 ** the column and row separator characters from the output mode. */
25628 nSep = strlen30(p->colSeparator);
25629 if( nSep==0 ){
25630 eputz("Error: non-null column separator required for import\n");
25631 goto meta_command_exit;
25632 }
25633 if( nSep>1 ){
25634 eputz("Error: multi-character column separators not allowed"
25635 " for import\n");
25636 goto meta_command_exit;
25637 }
25638 nSep = strlen30(p->rowSeparator);
25639 if( nSep==0 ){
25640 eputz("Error: non-null row separator required for import\n");
25641 goto meta_command_exit;
25642 }
25643 if( nSep==2 && p->mode==MODE_Csv
25644 && cli_strcmp(p->rowSeparator,SEP_CrLf)==0
25645 ){
25646 /* When importing CSV (only), if the row separator is set to the
25647 ** default output row separator, change it to the default input
25648 ** row separator. This avoids having to maintain different input
25649 ** and output row separators. */
25650 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
25651 nSep = strlen30(p->rowSeparator);
25652 }
25653 if( nSep>1 ){
25654 eputz("Error: multi-character row separators not allowed"
25655 " for import\n");
25656 goto meta_command_exit;
25657 }
25658 sCtx.cColSep = (u8)p->colSeparator[0];
25659 sCtx.cRowSep = (u8)p->rowSeparator[0];
25660 }
25661 sCtx.zFile = zFile;
25662 sCtx.nLine = 1;
25663 if( sCtx.zFile[0]=='|' ){
25664 #ifdef SQLITE_OMIT_POPEN
25665 eputz("Error: pipes are not supported in this OS\n");
25666 goto meta_command_exit;
25667 #else
25668 sCtx.in = popen(sCtx.zFile+1, "r");
25669 sCtx.zFile = "<pipe>";
25670 sCtx.xCloser = pclose;
25671 #endif
25672 }else{
25673 sCtx.in = fopen(sCtx.zFile, "rb");
25674 sCtx.xCloser = fclose;
25675 }
25676 if( sCtx.in==0 ){
25677 eputf("Error: cannot open \"%s\"\n", zFile);
25678 goto meta_command_exit;
25679 }
25680 if( eVerbose>=2 || (eVerbose>=1 && useOutputMode) ){
25681 char zSep[2];
25682 zSep[1] = 0;
25683 zSep[0] = sCtx.cColSep;
25684 oputz("Column separator ");
25685 output_c_string(zSep);
25686 oputz(", row separator ");
25687 zSep[0] = sCtx.cRowSep;
25688 output_c_string(zSep);
25689 oputz("\n");
25690 }
25691 sCtx.z = sqlite3_malloc64(120);
25692 if( sCtx.z==0 ){
25693 import_cleanup(&sCtx);
25694 shell_out_of_memory();
25695 }
25696 /* Below, resources must be freed before exit. */
25697 while( (nSkip--)>0 ){
25698 while( xRead(&sCtx) && sCtx.cTerm==sCtx.cColSep ){}
25699 }
25700 if( zSchema!=0 ){
25701 zFullTabName = sqlite3_mprintf("\"%w\".\"%w\"", zSchema, zTable);
25702 }else{
25703 zFullTabName = sqlite3_mprintf("\"%w\"", zTable);
25704 }
25705 zSql = sqlite3_mprintf("SELECT * FROM %s", zFullTabName);
25706 if( zSql==0 || zFullTabName==0 ){
25707 import_cleanup(&sCtx);
25708 shell_out_of_memory();
25709 }
25710 nByte = strlen30(zSql);
25711 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
25712 import_append_char(&sCtx, 0); /* To ensure sCtx.z is allocated */
25713 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(p->db))==0 ){
25714 sqlite3 *dbCols = 0;
25715 char *zRenames = 0;
25716 char *zColDefs;
25717 zCreate = sqlite3_mprintf("CREATE TABLE %s", zFullTabName);
25718 while( xRead(&sCtx) ){
25719 zAutoColumn(sCtx.z, &dbCols, 0);
25720 if( sCtx.cTerm!=sCtx.cColSep ) break;
25721 }
25722 zColDefs = zAutoColumn(0, &dbCols, &zRenames);
25723 if( zRenames!=0 ){
25724 sputf((stdin_is_interactive && p->in==stdin)? p->out : stderr,
25725 "Columns renamed during .import %s due to duplicates:\n"
25726 "%s\n", sCtx.zFile, zRenames);
25727 sqlite3_free(zRenames);
25728 }
25729 assert(dbCols==0);
25730 if( zColDefs==0 ){
25731 eputf("%s: empty file\n", sCtx.zFile);
25732 import_fail:
25733 sqlite3_free(zCreate);
25734 sqlite3_free(zSql);
25735 sqlite3_free(zFullTabName);
25736 import_cleanup(&sCtx);
25737 rc = 1;
25738 goto meta_command_exit;
25739 }
25740 zCreate = sqlite3_mprintf("%z%z\n", zCreate, zColDefs);
25741 if( eVerbose>=1 ){
25742 oputf("%s\n", zCreate);
25743 }
25744 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
25745 if( rc ){
25746 eputf("%s failed:\n%s\n", zCreate, sqlite3_errmsg(p->db));
25747 goto import_fail;
25748 }
25749 sqlite3_free(zCreate);
25750 zCreate = 0;
25751 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
25752 }
25753 if( rc ){
25754 if (pStmt) sqlite3_finalize(pStmt);
25755 eputf("Error: %s\n", sqlite3_errmsg(p->db));
25756 goto import_fail;
25757 }
25758 sqlite3_free(zSql);
25759 nCol = sqlite3_column_count(pStmt);
25760 sqlite3_finalize(pStmt);
25761 pStmt = 0;
25762 if( nCol==0 ) return 0; /* no columns, no error */
25763 zSql = sqlite3_malloc64( nByte*2 + 20 + nCol*2 );
25764 if( zSql==0 ){
25765 import_cleanup(&sCtx);
25766 shell_out_of_memory();
25767 }
25768 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO %s VALUES(?", zFullTabName);
25769 j = strlen30(zSql);
25770 for(i=1; i<nCol; i++){
25771 zSql[j++] = ',';
25772 zSql[j++] = '?';
25773 }
25774 zSql[j++] = ')';
25775 zSql[j] = 0;
25776 if( eVerbose>=2 ){
25777 oputf("Insert using: %s\n", zSql);
25778 }
25779 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
25780 if( rc ){
25781 eputf("Error: %s\n", sqlite3_errmsg(p->db));
25782 if (pStmt) sqlite3_finalize(pStmt);
25783 goto import_fail;
25784 }
25785 sqlite3_free(zSql);
25786 sqlite3_free(zFullTabName);
25787 needCommit = sqlite3_get_autocommit(p->db);
25788 if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
25789 do{
25790 int startLine = sCtx.nLine;
25791 for(i=0; i<nCol; i++){
25792 char *z = xRead(&sCtx);
25793 /*
25794 ** Did we reach end-of-file before finding any columns?
25795 ** If so, stop instead of NULL filling the remaining columns.
25796 */
25797 if( z==0 && i==0 ) break;
25798 /*
25799 ** Did we reach end-of-file OR end-of-line before finding any
25800 ** columns in ASCII mode? If so, stop instead of NULL filling
25801 ** the remaining columns.
25802 */
25803 if( p->mode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break;
25804 /*
25805 ** For CSV mode, per RFC 4180, accept EOF in lieu of final
25806 ** record terminator but only for last field of multi-field row.
25807 ** (If there are too few fields, it's not valid CSV anyway.)
25808 */
25809 if( z==0 && (xRead==csv_read_one_field) && i==nCol-1 && i>0 ){
25810 z = "";
25811 }
25812 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
25813 if( i<nCol-1 && sCtx.cTerm!=sCtx.cColSep ){
25814 eputf("%s:%d: expected %d columns but found %d"
25815 " - filling the rest with NULL\n",
25816 sCtx.zFile, startLine, nCol, i+1);
25817 i += 2;
25818 while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; }
25819 }
25820 }
25821 if( sCtx.cTerm==sCtx.cColSep ){
25822 do{
25823 xRead(&sCtx);
25824 i++;
25825 }while( sCtx.cTerm==sCtx.cColSep );
25826 eputf("%s:%d: expected %d columns but found %d - extras ignored\n",
25827 sCtx.zFile, startLine, nCol, i);
25828 }
25829 if( i>=nCol ){
25830 sqlite3_step(pStmt);
25831 rc = sqlite3_reset(pStmt);
25832 if( rc!=SQLITE_OK ){
25833 eputf("%s:%d: INSERT failed: %s\n",
25834 sCtx.zFile, startLine, sqlite3_errmsg(p->db));
25835 sCtx.nErr++;
25836 }else{
25837 sCtx.nRow++;
25838 }
25839 }
25840 }while( sCtx.cTerm!=EOF );
25841
25842 import_cleanup(&sCtx);
25843 sqlite3_finalize(pStmt);
25844 if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0);
25845 if( eVerbose>0 ){
25846 oputf("Added %d rows with %d errors using %d lines of input\n",
25847 sCtx.nRow, sCtx.nErr, sCtx.nLine-1);
25848 }
25849 }else
25850 #endif /* !defined(SQLITE_SHELL_FIDDLE) */
25851
25852 #ifndef SQLITE_UNTESTABLE
25853 if( c=='i' && cli_strncmp(azArg[0], "imposter", n)==0 ){
25854 char *zSql;
25855 char *zCollist = 0;
25856 sqlite3_stmt *pStmt;
25857 int tnum = 0;
25858 int isWO = 0; /* True if making an imposter of a WITHOUT ROWID table */
25859 int lenPK = 0; /* Length of the PRIMARY KEY string for isWO tables */
25860 int i;
25861 if( !ShellHasFlag(p,SHFLG_TestingMode) ){
25862 eputf(".%s unavailable without --unsafe-testing\n",
25863 "imposter");
25864 rc = 1;
25865 goto meta_command_exit;
25866 }
25867 if( !(nArg==3 || (nArg==2 && sqlite3_stricmp(azArg[1],"off")==0)) ){
25868 eputz("Usage: .imposter INDEX IMPOSTER\n"
25869 " .imposter off\n");
25870 /* Also allowed, but not documented:
25871 **
25872 ** .imposter TABLE IMPOSTER
25873 **
25874 ** where TABLE is a WITHOUT ROWID table. In that case, the
25875 ** imposter is another WITHOUT ROWID table with the columns in
25876 ** storage order. */
25877 rc = 1;
25878 goto meta_command_exit;
25879 }
25880 open_db(p, 0);
25881 if( nArg==2 ){
25882 sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 1);
25883 goto meta_command_exit;
25884 }
25885 zSql = sqlite3_mprintf(
25886 "SELECT rootpage, 0 FROM sqlite_schema"
25887 " WHERE name='%q' AND type='index'"
25888 "UNION ALL "
25889 "SELECT rootpage, 1 FROM sqlite_schema"
25890 " WHERE name='%q' AND type='table'"
25891 " AND sql LIKE '%%without%%rowid%%'",
25892 azArg[1], azArg[1]
25893 );
25894 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
25895 sqlite3_free(zSql);
25896 if( sqlite3_step(pStmt)==SQLITE_ROW ){
25897 tnum = sqlite3_column_int(pStmt, 0);
25898 isWO = sqlite3_column_int(pStmt, 1);
25899 }
25900 sqlite3_finalize(pStmt);
25901 zSql = sqlite3_mprintf("PRAGMA index_xinfo='%q'", azArg[1]);
25902 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
25903 sqlite3_free(zSql);
25904 i = 0;
25905 while( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
25906 char zLabel[20];
25907 const char *zCol = (const char*)sqlite3_column_text(pStmt,2);
25908 i++;
25909 if( zCol==0 ){
25910 if( sqlite3_column_int(pStmt,1)==-1 ){
25911 zCol = "_ROWID_";
25912 }else{
25913 sqlite3_snprintf(sizeof(zLabel),zLabel,"expr%d",i);
25914 zCol = zLabel;
25915 }
25916 }
25917 if( isWO && lenPK==0 && sqlite3_column_int(pStmt,5)==0 && zCollist ){
25918 lenPK = (int)strlen(zCollist);
25919 }
25920 if( zCollist==0 ){
25921 zCollist = sqlite3_mprintf("\"%w\"", zCol);
25922 }else{
25923 zCollist = sqlite3_mprintf("%z,\"%w\"", zCollist, zCol);
25924 }
25925 }
25926 sqlite3_finalize(pStmt);
25927 if( i==0 || tnum==0 ){
25928 eputf("no such index: \"%s\"\n", azArg[1]);
25929 rc = 1;
25930 sqlite3_free(zCollist);
25931 goto meta_command_exit;
25932 }
25933 if( lenPK==0 ) lenPK = 100000;
25934 zSql = sqlite3_mprintf(
25935 "CREATE TABLE \"%w\"(%s,PRIMARY KEY(%.*s))WITHOUT ROWID",
25936 azArg[2], zCollist, lenPK, zCollist);
25937 sqlite3_free(zCollist);
25938 rc = sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 1, tnum);
25939 if( rc==SQLITE_OK ){
25940 rc = sqlite3_exec(p->db, zSql, 0, 0, 0);
25941 sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 0);
25942 if( rc ){
25943 eputf("Error in [%s]: %s\n", zSql, sqlite3_errmsg(p->db));
25944 }else{
25945 sputf(stdout, "%s;\n", zSql);
25946 sputf(stdout, "WARNING: writing to an imposter table will corrupt"
25947 " the \"%s\" %s!\n", azArg[1], isWO ? "table" : "index");
25948 }
25949 }else{
25950 eputf("SQLITE_TESTCTRL_IMPOSTER returns %d\n", rc);
25951 rc = 1;
25952 }
25953 sqlite3_free(zSql);
25954 }else
25955 #endif /* !defined(SQLITE_OMIT_TEST_CONTROL) */
25956
25957 #ifdef SQLITE_ENABLE_IOTRACE
25958 if( c=='i' && cli_strncmp(azArg[0], "iotrace", n)==0 ){
25959 SQLITE_API extern void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...);
25960 if( iotrace && iotrace!=stdout ) fclose(iotrace);
25961 iotrace = 0;
25962 if( nArg<2 ){
25963 sqlite3IoTrace = 0;
25964 }else if( cli_strcmp(azArg[1], "-")==0 ){
25965 sqlite3IoTrace = iotracePrintf;
25966 iotrace = stdout;
25967 }else{
25968 iotrace = fopen(azArg[1], "w");
25969 if( iotrace==0 ){
25970 eputf("Error: cannot open \"%s\"\n", azArg[1]);
25971 sqlite3IoTrace = 0;
25972 rc = 1;
25973 }else{
25974 sqlite3IoTrace = iotracePrintf;
25975 }
25976 }
25977 }else
25978 #endif
25979
25980 if( c=='l' && n>=5 && cli_strncmp(azArg[0], "limits", n)==0 ){
25981 static const struct {
25982 const char *zLimitName; /* Name of a limit */
25983 int limitCode; /* Integer code for that limit */
25984 } aLimit[] = {
25985 { "length", SQLITE_LIMIT_LENGTH },
25986 { "sql_length", SQLITE_LIMIT_SQL_LENGTH },
25987 { "column", SQLITE_LIMIT_COLUMN },
25988 { "expr_depth", SQLITE_LIMIT_EXPR_DEPTH },
25989 { "compound_select", SQLITE_LIMIT_COMPOUND_SELECT },
25990 { "vdbe_op", SQLITE_LIMIT_VDBE_OP },
25991 { "function_arg", SQLITE_LIMIT_FUNCTION_ARG },
25992 { "attached", SQLITE_LIMIT_ATTACHED },
25993 { "like_pattern_length", SQLITE_LIMIT_LIKE_PATTERN_LENGTH },
25994 { "variable_number", SQLITE_LIMIT_VARIABLE_NUMBER },
25995 { "trigger_depth", SQLITE_LIMIT_TRIGGER_DEPTH },
25996 { "worker_threads", SQLITE_LIMIT_WORKER_THREADS },
25997 };
25998 int i, n2;
25999 open_db(p, 0);
26000 if( nArg==1 ){
26001 for(i=0; i<ArraySize(aLimit); i++){
26002 sputf(stdout, "%20s %d\n", aLimit[i].zLimitName,
26003 sqlite3_limit(p->db, aLimit[i].limitCode, -1));
26004 }
26005 }else if( nArg>3 ){
26006 eputz("Usage: .limit NAME ?NEW-VALUE?\n");
26007 rc = 1;
26008 goto meta_command_exit;
26009 }else{
26010 int iLimit = -1;
26011 n2 = strlen30(azArg[1]);
26012 for(i=0; i<ArraySize(aLimit); i++){
26013 if( sqlite3_strnicmp(aLimit[i].zLimitName, azArg[1], n2)==0 ){
26014 if( iLimit<0 ){
26015 iLimit = i;
26016 }else{
26017 eputf("ambiguous limit: \"%s\"\n", azArg[1]);
26018 rc = 1;
26019 goto meta_command_exit;
26020 }
26021 }
26022 }
26023 if( iLimit<0 ){
26024 eputf("unknown limit: \"%s\"\n"
26025 "enter \".limits\" with no arguments for a list.\n",
26026 azArg[1]);
26027 rc = 1;
26028 goto meta_command_exit;
26029 }
26030 if( nArg==3 ){
26031 sqlite3_limit(p->db, aLimit[iLimit].limitCode,
26032 (int)integerValue(azArg[2]));
26033 }
26034 sputf(stdout, "%20s %d\n", aLimit[iLimit].zLimitName,
26035 sqlite3_limit(p->db, aLimit[iLimit].limitCode, -1));
26036 }
26037 }else
26038
26039 if( c=='l' && n>2 && cli_strncmp(azArg[0], "lint", n)==0 ){
26040 open_db(p, 0);
26041 lintDotCommand(p, azArg, nArg);
26042 }else
26043
26044 #if !defined(SQLITE_OMIT_LOAD_EXTENSION) && !defined(SQLITE_SHELL_FIDDLE)
26045 if( c=='l' && cli_strncmp(azArg[0], "load", n)==0 ){
26046 const char *zFile, *zProc;
26047 char *zErrMsg = 0;
26048 failIfSafeMode(p, "cannot run .load in safe mode");
26049 if( nArg<2 || azArg[1][0]==0 ){
26050 /* Must have a non-empty FILE. (Will not load self.) */
26051 eputz("Usage: .load FILE ?ENTRYPOINT?\n");
26052 rc = 1;
26053 goto meta_command_exit;
26054 }
26055 zFile = azArg[1];
26056 zProc = nArg>=3 ? azArg[2] : 0;
26057 open_db(p, 0);
26058 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
26059 if( rc!=SQLITE_OK ){
26060 eputf("Error: %s\n", zErrMsg);
26061 sqlite3_free(zErrMsg);
26062 rc = 1;
26063 }
26064 }else
26065 #endif
26066
26067 if( c=='l' && cli_strncmp(azArg[0], "log", n)==0 ){
26068 if( nArg!=2 ){
26069 eputz("Usage: .log FILENAME\n");
26070 rc = 1;
26071 }else{
26072 const char *zFile = azArg[1];
26073 if( p->bSafeMode
26074 && cli_strcmp(zFile,"on")!=0
26075 && cli_strcmp(zFile,"off")!=0
26076 ){
26077 sputz(stdout, "cannot set .log to anything other"
26078 " than \"on\" or \"off\"\n");
26079 zFile = "off";
26080 }
26081 output_file_close(p->pLog);
26082 if( cli_strcmp(zFile,"on")==0 ) zFile = "stdout";
26083 p->pLog = output_file_open(zFile, 0);
26084 }
26085 }else
26086
26087 if( c=='m' && cli_strncmp(azArg[0], "mode", n)==0 ){
26088 const char *zMode = 0;
26089 const char *zTabname = 0;
26090 int i, n2;
26091 ColModeOpts cmOpts = ColModeOpts_default;
26092 for(i=1; i<nArg; i++){
26093 const char *z = azArg[i];
26094 if( optionMatch(z,"wrap") && i+1<nArg ){
26095 cmOpts.iWrap = integerValue(azArg[++i]);
26096 }else if( optionMatch(z,"ww") ){
26097 cmOpts.bWordWrap = 1;
26098 }else if( optionMatch(z,"wordwrap") && i+1<nArg ){
26099 cmOpts.bWordWrap = (u8)booleanValue(azArg[++i]);
26100 }else if( optionMatch(z,"quote") ){
26101 cmOpts.bQuote = 1;
26102 }else if( optionMatch(z,"noquote") ){
26103 cmOpts.bQuote = 0;
26104 }else if( zMode==0 ){
26105 zMode = z;
26106 /* Apply defaults for qbox pseudo-mode. If that
26107 * overwrites already-set values, user was informed of this.
26108 */
26109 if( cli_strcmp(z, "qbox")==0 ){
26110 ColModeOpts cmo = ColModeOpts_default_qbox;
26111 zMode = "box";
26112 cmOpts = cmo;
26113 }
26114 }else if( zTabname==0 ){
26115 zTabname = z;
26116 }else if( z[0]=='-' ){
26117 eputf("unknown option: %s\n", z);
26118 eputz("options:\n"
26119 " --noquote\n"
26120 " --quote\n"
26121 " --wordwrap on/off\n"
26122 " --wrap N\n"
26123 " --ww\n");
26124 rc = 1;
26125 goto meta_command_exit;
26126 }else{
26127 eputf("extra argument: \"%s\"\n", z);
26128 rc = 1;
26129 goto meta_command_exit;
26130 }
26131 }
26132 if( zMode==0 ){
26133 if( p->mode==MODE_Column
26134 || (p->mode>=MODE_Markdown && p->mode<=MODE_Box)
26135 ){
26136 oputf("current output mode: %s --wrap %d --wordwrap %s --%squote\n",
26137 modeDescr[p->mode], p->cmOpts.iWrap,
26138 p->cmOpts.bWordWrap ? "on" : "off",
26139 p->cmOpts.bQuote ? "" : "no");
26140 }else{
26141 oputf("current output mode: %s\n", modeDescr[p->mode]);
26142 }
26143 zMode = modeDescr[p->mode];
26144 }
26145 n2 = strlen30(zMode);
26146 if( cli_strncmp(zMode,"lines",n2)==0 ){
26147 p->mode = MODE_Line;
26148 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
26149 }else if( cli_strncmp(zMode,"columns",n2)==0 ){
26150 p->mode = MODE_Column;
26151 if( (p->shellFlgs & SHFLG_HeaderSet)==0 ){
26152 p->showHeader = 1;
26153 }
26154 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
26155 p->cmOpts = cmOpts;
26156 }else if( cli_strncmp(zMode,"list",n2)==0 ){
26157 p->mode = MODE_List;
26158 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Column);
26159 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
26160 }else if( cli_strncmp(zMode,"html",n2)==0 ){
26161 p->mode = MODE_Html;
26162 }else if( cli_strncmp(zMode,"tcl",n2)==0 ){
26163 p->mode = MODE_Tcl;
26164 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Space);
26165 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
26166 }else if( cli_strncmp(zMode,"csv",n2)==0 ){
26167 p->mode = MODE_Csv;
26168 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
26169 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
26170 }else if( cli_strncmp(zMode,"tabs",n2)==0 ){
26171 p->mode = MODE_List;
26172 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Tab);
26173 }else if( cli_strncmp(zMode,"insert",n2)==0 ){
26174 p->mode = MODE_Insert;
26175 set_table_name(p, zTabname ? zTabname : "table");
26176 }else if( cli_strncmp(zMode,"quote",n2)==0 ){
26177 p->mode = MODE_Quote;
26178 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
26179 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
26180 }else if( cli_strncmp(zMode,"ascii",n2)==0 ){
26181 p->mode = MODE_Ascii;
26182 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit);
26183 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record);
26184 }else if( cli_strncmp(zMode,"markdown",n2)==0 ){
26185 p->mode = MODE_Markdown;
26186 p->cmOpts = cmOpts;
26187 }else if( cli_strncmp(zMode,"table",n2)==0 ){
26188 p->mode = MODE_Table;
26189 p->cmOpts = cmOpts;
26190 }else if( cli_strncmp(zMode,"box",n2)==0 ){
26191 p->mode = MODE_Box;
26192 p->cmOpts = cmOpts;
26193 }else if( cli_strncmp(zMode,"count",n2)==0 ){
26194 p->mode = MODE_Count;
26195 }else if( cli_strncmp(zMode,"off",n2)==0 ){
26196 p->mode = MODE_Off;
26197 }else if( cli_strncmp(zMode,"json",n2)==0 ){
26198 p->mode = MODE_Json;
26199 }else{
26200 eputz("Error: mode should be one of: "
26201 "ascii box column csv html insert json line list markdown "
26202 "qbox quote table tabs tcl\n");
26203 rc = 1;
26204 }
26205 p->cMode = p->mode;
26206 }else
26207
26208 #ifndef SQLITE_SHELL_FIDDLE
26209 if( c=='n' && cli_strcmp(azArg[0], "nonce")==0 ){
26210 if( nArg!=2 ){
26211 eputz("Usage: .nonce NONCE\n");
26212 rc = 1;
26213 }else if( p->zNonce==0 || cli_strcmp(azArg[1],p->zNonce)!=0 ){
26214 eputf("line %d: incorrect nonce: \"%s\"\n",
26215 p->lineno, azArg[1]);
26216 exit(1);
26217 }else{
26218 p->bSafeMode = 0;
26219 return 0; /* Return immediately to bypass the safe mode reset
26220 ** at the end of this procedure */
26221 }
26222 }else
26223 #endif /* !defined(SQLITE_SHELL_FIDDLE) */
26224
26225 if( c=='n' && cli_strncmp(azArg[0], "nullvalue", n)==0 ){
26226 if( nArg==2 ){
26227 sqlite3_snprintf(sizeof(p->nullValue), p->nullValue,
26228 "%.*s", (int)ArraySize(p->nullValue)-1, azArg[1]);
26229 }else{
26230 eputz("Usage: .nullvalue STRING\n");
26231 rc = 1;
26232 }
26233 }else
26234
26235 if( c=='o' && cli_strncmp(azArg[0], "open", n)==0 && n>=2 ){
26236 const char *zFN = 0; /* Pointer to constant filename */
26237 char *zNewFilename = 0; /* Name of the database file to open */
26238 int iName = 1; /* Index in azArg[] of the filename */
26239 int newFlag = 0; /* True to delete file before opening */
26240 int openMode = SHELL_OPEN_UNSPEC;
26241
26242 /* Check for command-line arguments */
26243 for(iName=1; iName<nArg; iName++){
26244 const char *z = azArg[iName];
26245 #ifndef SQLITE_SHELL_FIDDLE
26246 if( optionMatch(z,"new") ){
26247 newFlag = 1;
26248 #ifdef SQLITE_HAVE_ZLIB
26249 }else if( optionMatch(z, "zip") ){
26250 openMode = SHELL_OPEN_ZIPFILE;
26251 #endif
26252 }else if( optionMatch(z, "append") ){
26253 openMode = SHELL_OPEN_APPENDVFS;
26254 }else if( optionMatch(z, "readonly") ){
26255 openMode = SHELL_OPEN_READONLY;
26256 }else if( optionMatch(z, "nofollow") ){
26257 p->openFlags |= SQLITE_OPEN_NOFOLLOW;
26258 #ifndef SQLITE_OMIT_DESERIALIZE
26259 }else if( optionMatch(z, "deserialize") ){
26260 openMode = SHELL_OPEN_DESERIALIZE;
26261 }else if( optionMatch(z, "hexdb") ){
26262 openMode = SHELL_OPEN_HEXDB;
26263 }else if( optionMatch(z, "maxsize") && iName+1<nArg ){
26264 p->szMax = integerValue(azArg[++iName]);
26265 #endif /* SQLITE_OMIT_DESERIALIZE */
26266 }else
26267 #endif /* !SQLITE_SHELL_FIDDLE */
26268 if( z[0]=='-' ){
26269 eputf("unknown option: %s\n", z);
26270 rc = 1;
26271 goto meta_command_exit;
26272 }else if( zFN ){
26273 eputf("extra argument: \"%s\"\n", z);
26274 rc = 1;
26275 goto meta_command_exit;
26276 }else{
26277 zFN = z;
26278 }
26279 }
26280
26281 /* Close the existing database */
26282 session_close_all(p, -1);
26283 close_db(p->db);
26284 p->db = 0;
26285 p->pAuxDb->zDbFilename = 0;
26286 sqlite3_free(p->pAuxDb->zFreeOnClose);
26287 p->pAuxDb->zFreeOnClose = 0;
26288 p->openMode = openMode;
26289 p->openFlags = 0;
26290 p->szMax = 0;
26291
26292 /* If a filename is specified, try to open it first */
26293 if( zFN || p->openMode==SHELL_OPEN_HEXDB ){
26294 if( newFlag && zFN && !p->bSafeMode ) shellDeleteFile(zFN);
26295 #ifndef SQLITE_SHELL_FIDDLE
26296 if( p->bSafeMode
26297 && p->openMode!=SHELL_OPEN_HEXDB
26298 && zFN
26299 && cli_strcmp(zFN,":memory:")!=0
26300 ){
26301 failIfSafeMode(p, "cannot open disk-based database files in safe mode");
26302 }
26303 #else
26304 /* WASM mode has its own sandboxed pseudo-filesystem. */
26305 #endif
26306 if( zFN ){
26307 zNewFilename = sqlite3_mprintf("%s", zFN);
26308 shell_check_oom(zNewFilename);
26309 }else{
26310 zNewFilename = 0;
26311 }
26312 p->pAuxDb->zDbFilename = zNewFilename;
26313 open_db(p, OPEN_DB_KEEPALIVE);
26314 if( p->db==0 ){
26315 eputf("Error: cannot open '%s'\n", zNewFilename);
26316 sqlite3_free(zNewFilename);
26317 }else{
26318 p->pAuxDb->zFreeOnClose = zNewFilename;
26319 }
26320 }
26321 if( p->db==0 ){
26322 /* As a fall-back open a TEMP database */
26323 p->pAuxDb->zDbFilename = 0;
26324 open_db(p, 0);
26325 }
26326 }else
26327
26328 #ifndef SQLITE_SHELL_FIDDLE
26329 if( (c=='o'
26330 && (cli_strncmp(azArg[0], "output", n)==0
26331 || cli_strncmp(azArg[0], "once", n)==0))
26332 || (c=='e' && n==5 && cli_strcmp(azArg[0],"excel")==0)
26333 ){
26334 char *zFile = 0;
26335 int bTxtMode = 0;
26336 int i;
26337 int eMode = 0;
26338 int bOnce = 0; /* 0: .output, 1: .once, 2: .excel */
26339 static const char *zBomUtf8 = "\xef\xbb\xbf";
26340 const char *zBom = 0;
26341
26342 failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]);
26343 if( c=='e' ){
26344 eMode = 'x';
26345 bOnce = 2;
26346 }else if( cli_strncmp(azArg[0],"once",n)==0 ){
26347 bOnce = 1;
26348 }
26349 for(i=1; i<nArg; i++){
26350 char *z = azArg[i];
26351 if( z[0]=='-' ){
26352 if( z[1]=='-' ) z++;
26353 if( cli_strcmp(z,"-bom")==0 ){
26354 zBom = zBomUtf8;
26355 }else if( c!='e' && cli_strcmp(z,"-x")==0 ){
26356 eMode = 'x'; /* spreadsheet */
26357 }else if( c!='e' && cli_strcmp(z,"-e")==0 ){
26358 eMode = 'e'; /* text editor */
26359 }else{
26360 oputf("ERROR: unknown option: \"%s\". Usage:\n", azArg[i]);
26361 showHelp(p->out, azArg[0]);
26362 rc = 1;
26363 goto meta_command_exit;
26364 }
26365 }else if( zFile==0 && eMode!='e' && eMode!='x' ){
26366 zFile = sqlite3_mprintf("%s", z);
26367 if( zFile && zFile[0]=='|' ){
26368 while( i+1<nArg ) zFile = sqlite3_mprintf("%z %s", zFile, azArg[++i]);
26369 break;
26370 }
26371 }else{
26372 oputf("ERROR: extra parameter: \"%s\". Usage:\n", azArg[i]);
26373 showHelp(p->out, azArg[0]);
26374 rc = 1;
26375 sqlite3_free(zFile);
26376 goto meta_command_exit;
26377 }
26378 }
26379 if( zFile==0 ){
26380 zFile = sqlite3_mprintf("stdout");
26381 }
26382 if( bOnce ){
26383 p->outCount = 2;
26384 }else{
26385 p->outCount = 0;
26386 }
26387 output_reset(p);
26388 #ifndef SQLITE_NOHAVE_SYSTEM
26389 if( eMode=='e' || eMode=='x' ){
26390 p->doXdgOpen = 1;
26391 outputModePush(p);
26392 if( eMode=='x' ){
26393 /* spreadsheet mode. Output as CSV. */
26394 newTempFile(p, "csv");
26395 ShellClearFlag(p, SHFLG_Echo);
26396 p->mode = MODE_Csv;
26397 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
26398 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
26399 }else{
26400 /* text editor mode */
26401 newTempFile(p, "txt");
26402 bTxtMode = 1;
26403 }
26404 sqlite3_free(zFile);
26405 zFile = sqlite3_mprintf("%s", p->zTempFile);
26406 }
26407 #endif /* SQLITE_NOHAVE_SYSTEM */
26408 shell_check_oom(zFile);
26409 if( zFile[0]=='|' ){
26410 #ifdef SQLITE_OMIT_POPEN
26411 eputz("Error: pipes are not supported in this OS\n");
26412 rc = 1;
26413 output_redir(p, stdout);
26414 #else
26415 FILE *pfPipe = popen(zFile + 1, "w");
26416 if( pfPipe==0 ){
26417 eputf("Error: cannot open pipe \"%s\"\n", zFile + 1);
26418 rc = 1;
26419 }else{
26420 output_redir(p, pfPipe);
26421 if( zBom ) oputz(zBom);
26422 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
26423 }
26424 #endif
26425 }else{
26426 FILE *pfFile = output_file_open(zFile, bTxtMode);
26427 if( pfFile==0 ){
26428 if( cli_strcmp(zFile,"off")!=0 ){
26429 eputf("Error: cannot write to \"%s\"\n", zFile);
26430 }
26431 rc = 1;
26432 } else {
26433 output_redir(p, pfFile);
26434 if( zBom ) oputz(zBom);
26435 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
26436 }
26437 }
26438 sqlite3_free(zFile);
26439 }else
26440 #endif /* !defined(SQLITE_SHELL_FIDDLE) */
26441
26442 if( c=='p' && n>=3 && cli_strncmp(azArg[0], "parameter", n)==0 ){
26443 open_db(p,0);
26444 if( nArg<=1 ) goto parameter_syntax_error;
26445
26446 /* .parameter clear
26447 ** Clear all bind parameters by dropping the TEMP table that holds them.
26448 */
26449 if( nArg==2 && cli_strcmp(azArg[1],"clear")==0 ){
26450 sqlite3_exec(p->db, "DROP TABLE IF EXISTS temp.sqlite_parameters;",
26451 0, 0, 0);
26452 }else
26453
26454 /* .parameter list
26455 ** List all bind parameters.
26456 */
26457 if( nArg==2 && cli_strcmp(azArg[1],"list")==0 ){
26458 sqlite3_stmt *pStmt = 0;
26459 int rx;
26460 int len = 0;
26461 rx = sqlite3_prepare_v2(p->db,
26462 "SELECT max(length(key)) "
26463 "FROM temp.sqlite_parameters;", -1, &pStmt, 0);
26464 if( rx==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
26465 len = sqlite3_column_int(pStmt, 0);
26466 if( len>40 ) len = 40;
26467 }
26468 sqlite3_finalize(pStmt);
26469 pStmt = 0;
26470 if( len ){
26471 rx = sqlite3_prepare_v2(p->db,
26472 "SELECT key, quote(value) "
26473 "FROM temp.sqlite_parameters;", -1, &pStmt, 0);
26474 while( rx==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
26475 oputf("%-*s %s\n", len, sqlite3_column_text(pStmt,0),
26476 sqlite3_column_text(pStmt,1));
26477 }
26478 sqlite3_finalize(pStmt);
26479 }
26480 }else
26481
26482 /* .parameter init
26483 ** Make sure the TEMP table used to hold bind parameters exists.
26484 ** Create it if necessary.
26485 */
26486 if( nArg==2 && cli_strcmp(azArg[1],"init")==0 ){
26487 bind_table_init(p);
26488 }else
26489
26490 /* .parameter set NAME VALUE
26491 ** Set or reset a bind parameter. NAME should be the full parameter
26492 ** name exactly as it appears in the query. (ex: $abc, @def). The
26493 ** VALUE can be in either SQL literal notation, or if not it will be
26494 ** understood to be a text string.
26495 */
26496 if( nArg==4 && cli_strcmp(azArg[1],"set")==0 ){
26497 int rx;
26498 char *zSql;
26499 sqlite3_stmt *pStmt;
26500 const char *zKey = azArg[2];
26501 const char *zValue = azArg[3];
26502 bind_table_init(p);
26503 zSql = sqlite3_mprintf(
26504 "REPLACE INTO temp.sqlite_parameters(key,value)"
26505 "VALUES(%Q,%s);", zKey, zValue);
26506 shell_check_oom(zSql);
26507 pStmt = 0;
26508 rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
26509 sqlite3_free(zSql);
26510 if( rx!=SQLITE_OK ){
26511 sqlite3_finalize(pStmt);
26512 pStmt = 0;
26513 zSql = sqlite3_mprintf(
26514 "REPLACE INTO temp.sqlite_parameters(key,value)"
26515 "VALUES(%Q,%Q);", zKey, zValue);
26516 shell_check_oom(zSql);
26517 rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
26518 sqlite3_free(zSql);
26519 if( rx!=SQLITE_OK ){
26520 oputf("Error: %s\n", sqlite3_errmsg(p->db));
26521 sqlite3_finalize(pStmt);
26522 pStmt = 0;
26523 rc = 1;
26524 }
26525 }
26526 sqlite3_step(pStmt);
26527 sqlite3_finalize(pStmt);
26528 }else
26529
26530 /* .parameter unset NAME
26531 ** Remove the NAME binding from the parameter binding table, if it
26532 ** exists.
26533 */
26534 if( nArg==3 && cli_strcmp(azArg[1],"unset")==0 ){
26535 char *zSql = sqlite3_mprintf(
26536 "DELETE FROM temp.sqlite_parameters WHERE key=%Q", azArg[2]);
26537 shell_check_oom(zSql);
26538 sqlite3_exec(p->db, zSql, 0, 0, 0);
26539 sqlite3_free(zSql);
26540 }else
26541 /* If no command name matches, show a syntax error */
26542 parameter_syntax_error:
26543 showHelp(p->out, "parameter");
26544 }else
26545
26546 if( c=='p' && n>=3 && cli_strncmp(azArg[0], "print", n)==0 ){
26547 int i;
26548 for(i=1; i<nArg; i++){
26549 if( i>1 ) oputz(" ");
26550 oputz(azArg[i]);
26551 }
26552 oputz("\n");
26553 }else
26554
26555 #ifndef SQLITE_OMIT_PROGRESS_CALLBACK
26556 if( c=='p' && n>=3 && cli_strncmp(azArg[0], "progress", n)==0 ){
26557 int i;
26558 int nn = 0;
26559 p->flgProgress = 0;
26560 p->mxProgress = 0;
26561 p->nProgress = 0;
26562 for(i=1; i<nArg; i++){
26563 const char *z = azArg[i];
26564 if( z[0]=='-' ){
26565 z++;
26566 if( z[0]=='-' ) z++;
26567 if( cli_strcmp(z,"quiet")==0 || cli_strcmp(z,"q")==0 ){
26568 p->flgProgress |= SHELL_PROGRESS_QUIET;
26569 continue;
26570 }
26571 if( cli_strcmp(z,"reset")==0 ){
26572 p->flgProgress |= SHELL_PROGRESS_RESET;
26573 continue;
26574 }
26575 if( cli_strcmp(z,"once")==0 ){
26576 p->flgProgress |= SHELL_PROGRESS_ONCE;
26577 continue;
26578 }
26579 if( cli_strcmp(z,"limit")==0 ){
26580 if( i+1>=nArg ){
26581 eputz("Error: missing argument on --limit\n");
26582 rc = 1;
26583 goto meta_command_exit;
26584 }else{
26585 p->mxProgress = (int)integerValue(azArg[++i]);
26586 }
26587 continue;
26588 }
26589 eputf("Error: unknown option: \"%s\"\n", azArg[i]);
26590 rc = 1;
26591 goto meta_command_exit;
26592 }else{
26593 nn = (int)integerValue(z);
26594 }
26595 }
26596 open_db(p, 0);
26597 sqlite3_progress_handler(p->db, nn, progress_handler, p);
26598 }else
26599 #endif /* SQLITE_OMIT_PROGRESS_CALLBACK */
26600
26601 if( c=='p' && cli_strncmp(azArg[0], "prompt", n)==0 ){
26602 if( nArg >= 2) {
26603 shell_strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
26604 }
26605 if( nArg >= 3) {
26606 shell_strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
26607 }
26608 }else
26609
26610 #ifndef SQLITE_SHELL_FIDDLE
26611 if( c=='q' && cli_strncmp(azArg[0], "quit", n)==0 ){
26612 rc = 2;
26613 }else
26614 #endif
26615
26616 #ifndef SQLITE_SHELL_FIDDLE
26617 if( c=='r' && n>=3 && cli_strncmp(azArg[0], "read", n)==0 ){
26618 FILE *inSaved = p->in;
26619 int savedLineno = p->lineno;
26620 failIfSafeMode(p, "cannot run .read in safe mode");
26621 if( nArg!=2 ){
26622 eputz("Usage: .read FILE\n");
26623 rc = 1;
26624 goto meta_command_exit;
26625 }
26626 if( azArg[1][0]=='|' ){
26627 #ifdef SQLITE_OMIT_POPEN
26628 eputz("Error: pipes are not supported in this OS\n");
26629 rc = 1;
26630 p->out = stdout;
26631 #else
26632 p->in = popen(azArg[1]+1, "r");
26633 if( p->in==0 ){
26634 eputf("Error: cannot open \"%s\"\n", azArg[1]);
26635 rc = 1;
26636 }else{
26637 rc = process_input(p);
26638 pclose(p->in);
26639 }
26640 #endif
26641 }else if( (p->in = openChrSource(azArg[1]))==0 ){
26642 eputf("Error: cannot open \"%s\"\n", azArg[1]);
26643 rc = 1;
26644 }else{
26645 rc = process_input(p);
26646 fclose(p->in);
26647 }
26648 p->in = inSaved;
26649 p->lineno = savedLineno;
26650 }else
26651 #endif /* !defined(SQLITE_SHELL_FIDDLE) */
26652
26653 #ifndef SQLITE_SHELL_FIDDLE
26654 if( c=='r' && n>=3 && cli_strncmp(azArg[0], "restore", n)==0 ){
26655 const char *zSrcFile;
26656 const char *zDb;
26657 sqlite3 *pSrc;
26658 sqlite3_backup *pBackup;
26659 int nTimeout = 0;
26660
26661 failIfSafeMode(p, "cannot run .restore in safe mode");
26662 if( nArg==2 ){
26663 zSrcFile = azArg[1];
26664 zDb = "main";
26665 }else if( nArg==3 ){
26666 zSrcFile = azArg[2];
26667 zDb = azArg[1];
26668 }else{
26669 eputz("Usage: .restore ?DB? FILE\n");
26670 rc = 1;
26671 goto meta_command_exit;
26672 }
26673 rc = sqlite3_open(zSrcFile, &pSrc);
26674 if( rc!=SQLITE_OK ){
26675 eputf("Error: cannot open \"%s\"\n", zSrcFile);
26676 close_db(pSrc);
26677 return 1;
26678 }
26679 open_db(p, 0);
26680 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
26681 if( pBackup==0 ){
26682 eputf("Error: %s\n", sqlite3_errmsg(p->db));
26683 close_db(pSrc);
26684 return 1;
26685 }
26686 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
26687 || rc==SQLITE_BUSY ){
26688 if( rc==SQLITE_BUSY ){
26689 if( nTimeout++ >= 3 ) break;
26690 sqlite3_sleep(100);
26691 }
26692 }
26693 sqlite3_backup_finish(pBackup);
26694 if( rc==SQLITE_DONE ){
26695 rc = 0;
26696 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
26697 eputz("Error: source database is busy\n");
26698 rc = 1;
26699 }else{
26700 eputf("Error: %s\n", sqlite3_errmsg(p->db));
26701 rc = 1;
26702 }
26703 close_db(pSrc);
26704 }else
26705 #endif /* !defined(SQLITE_SHELL_FIDDLE) */
26706
26707 if( c=='s' && cli_strncmp(azArg[0], "scanstats", n)==0 ){
26708 if( nArg==2 ){
26709 if( cli_strcmp(azArg[1], "vm")==0 ){
26710 p->scanstatsOn = 3;
26711 }else
26712 if( cli_strcmp(azArg[1], "est")==0 ){
26713 p->scanstatsOn = 2;
26714 }else{
26715 p->scanstatsOn = (u8)booleanValue(azArg[1]);
26716 }
26717 open_db(p, 0);
26718 sqlite3_db_config(
26719 p->db, SQLITE_DBCONFIG_STMT_SCANSTATUS, p->scanstatsOn, (int*)0
26720 );
26721 #if !defined(SQLITE_ENABLE_STMT_SCANSTATUS)
26722 eputz("Warning: .scanstats not available in this build.\n");
26723 #elif !defined(SQLITE_ENABLE_BYTECODE_VTAB)
26724 if( p->scanstatsOn==3 ){
26725 eputz("Warning: \".scanstats vm\" not available in this build.\n");
26726 }
26727 #endif
26728 }else{
26729 eputz("Usage: .scanstats on|off|est\n");
26730 rc = 1;
26731 }
26732 }else
26733
26734 if( c=='s' && cli_strncmp(azArg[0], "schema", n)==0 ){
26735 ShellText sSelect;
26736 ShellState data;
26737 char *zErrMsg = 0;
26738 const char *zDiv = "(";
26739 const char *zName = 0;
26740 int iSchema = 0;
26741 int bDebug = 0;
26742 int bNoSystemTabs = 0;
26743 int ii;
26744
26745 open_db(p, 0);
26746 memcpy(&data, p, sizeof(data));
26747 data.showHeader = 0;
26748 data.cMode = data.mode = MODE_Semi;
26749 initText(&sSelect);
26750 for(ii=1; ii<nArg; ii++){
26751 if( optionMatch(azArg[ii],"indent") ){
26752 data.cMode = data.mode = MODE_Pretty;
26753 }else if( optionMatch(azArg[ii],"debug") ){
26754 bDebug = 1;
26755 }else if( optionMatch(azArg[ii],"nosys") ){
26756 bNoSystemTabs = 1;
26757 }else if( azArg[ii][0]=='-' ){
26758 eputf("Unknown option: \"%s\"\n", azArg[ii]);
26759 rc = 1;
26760 goto meta_command_exit;
26761 }else if( zName==0 ){
26762 zName = azArg[ii];
26763 }else{
26764 eputz("Usage: .schema ?--indent? ?--nosys? ?LIKE-PATTERN?\n");
26765 rc = 1;
26766 goto meta_command_exit;
26767 }
26768 }
26769 if( zName!=0 ){
26770 int isSchema = sqlite3_strlike(zName, "sqlite_master", '\\')==0
26771 || sqlite3_strlike(zName, "sqlite_schema", '\\')==0
26772 || sqlite3_strlike(zName,"sqlite_temp_master", '\\')==0
26773 || sqlite3_strlike(zName,"sqlite_temp_schema", '\\')==0;
26774 if( isSchema ){
26775 char *new_argv[2], *new_colv[2];
26776 new_argv[0] = sqlite3_mprintf(
26777 "CREATE TABLE %s (\n"
26778 " type text,\n"
26779 " name text,\n"
26780 " tbl_name text,\n"
26781 " rootpage integer,\n"
26782 " sql text\n"
26783 ")", zName);
26784 shell_check_oom(new_argv[0]);
26785 new_argv[1] = 0;
26786 new_colv[0] = "sql";
26787 new_colv[1] = 0;
26788 callback(&data, 1, new_argv, new_colv);
26789 sqlite3_free(new_argv[0]);
26790 }
26791 }
26792 if( zDiv ){
26793 sqlite3_stmt *pStmt = 0;
26794 rc = sqlite3_prepare_v2(p->db, "SELECT name FROM pragma_database_list",
26795 -1, &pStmt, 0);
26796 if( rc ){
26797 eputf("Error: %s\n", sqlite3_errmsg(p->db));
26798 sqlite3_finalize(pStmt);
26799 rc = 1;
26800 goto meta_command_exit;
26801 }
26802 appendText(&sSelect, "SELECT sql FROM", 0);
26803 iSchema = 0;
26804 while( sqlite3_step(pStmt)==SQLITE_ROW ){
26805 const char *zDb = (const char*)sqlite3_column_text(pStmt, 0);
26806 char zScNum[30];
26807 sqlite3_snprintf(sizeof(zScNum), zScNum, "%d", ++iSchema);
26808 appendText(&sSelect, zDiv, 0);
26809 zDiv = " UNION ALL ";
26810 appendText(&sSelect, "SELECT shell_add_schema(sql,", 0);
26811 if( sqlite3_stricmp(zDb, "main")!=0 ){
26812 appendText(&sSelect, zDb, '\'');
26813 }else{
26814 appendText(&sSelect, "NULL", 0);
26815 }
26816 appendText(&sSelect, ",name) AS sql, type, tbl_name, name, rowid,", 0);
26817 appendText(&sSelect, zScNum, 0);
26818 appendText(&sSelect, " AS snum, ", 0);
26819 appendText(&sSelect, zDb, '\'');
26820 appendText(&sSelect, " AS sname FROM ", 0);
26821 appendText(&sSelect, zDb, quoteChar(zDb));
26822 appendText(&sSelect, ".sqlite_schema", 0);
26823 }
26824 sqlite3_finalize(pStmt);
26825 #ifndef SQLITE_OMIT_INTROSPECTION_PRAGMAS
26826 if( zName ){
26827 appendText(&sSelect,
26828 " UNION ALL SELECT shell_module_schema(name),"
26829 " 'table', name, name, name, 9e+99, 'main' FROM pragma_module_list",
26830 0);
26831 }
26832 #endif
26833 appendText(&sSelect, ") WHERE ", 0);
26834 if( zName ){
26835 char *zQarg = sqlite3_mprintf("%Q", zName);
26836 int bGlob;
26837 shell_check_oom(zQarg);
26838 bGlob = strchr(zName, '*') != 0 || strchr(zName, '?') != 0 ||
26839 strchr(zName, '[') != 0;
26840 if( strchr(zName, '.') ){
26841 appendText(&sSelect, "lower(printf('%s.%s',sname,tbl_name))", 0);
26842 }else{
26843 appendText(&sSelect, "lower(tbl_name)", 0);
26844 }
26845 appendText(&sSelect, bGlob ? " GLOB " : " LIKE ", 0);
26846 appendText(&sSelect, zQarg, 0);
26847 if( !bGlob ){
26848 appendText(&sSelect, " ESCAPE '\\' ", 0);
26849 }
26850 appendText(&sSelect, " AND ", 0);
26851 sqlite3_free(zQarg);
26852 }
26853 if( bNoSystemTabs ){
26854 appendText(&sSelect, "name NOT LIKE 'sqlite_%%' AND ", 0);
26855 }
26856 appendText(&sSelect, "sql IS NOT NULL"
26857 " ORDER BY snum, rowid", 0);
26858 if( bDebug ){
26859 oputf("SQL: %s;\n", sSelect.z);
26860 }else{
26861 rc = sqlite3_exec(p->db, sSelect.z, callback, &data, &zErrMsg);
26862 }
26863 freeText(&sSelect);
26864 }
26865 if( zErrMsg ){
26866 eputf("Error: %s\n", zErrMsg);
26867 sqlite3_free(zErrMsg);
26868 rc = 1;
26869 }else if( rc != SQLITE_OK ){
26870 eputz("Error: querying schema information\n");
26871 rc = 1;
26872 }else{
26873 rc = 0;
26874 }
26875 }else
26876
26877 if( (c=='s' && n==11 && cli_strncmp(azArg[0], "selecttrace", n)==0)
26878 || (c=='t' && n==9 && cli_strncmp(azArg[0], "treetrace", n)==0)
26879 ){
26880 unsigned int x = nArg>=2? (unsigned int)integerValue(azArg[1]) : 0xffffffff;
26881 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &x);
26882 }else
26883
26884 #if defined(SQLITE_ENABLE_SESSION)
26885 if( c=='s' && cli_strncmp(azArg[0],"session",n)==0 && n>=3 ){
26886 struct AuxDb *pAuxDb = p->pAuxDb;
26887 OpenSession *pSession = &pAuxDb->aSession[0];
26888 char **azCmd = &azArg[1];
26889 int iSes = 0;
26890 int nCmd = nArg - 1;
26891 int i;
26892 if( nArg<=1 ) goto session_syntax_error;
26893 open_db(p, 0);
26894 if( nArg>=3 ){
26895 for(iSes=0; iSes<pAuxDb->nSession; iSes++){
26896 if( cli_strcmp(pAuxDb->aSession[iSes].zName, azArg[1])==0 ) break;
26897 }
26898 if( iSes<pAuxDb->nSession ){
26899 pSession = &pAuxDb->aSession[iSes];
26900 azCmd++;
26901 nCmd--;
26902 }else{
26903 pSession = &pAuxDb->aSession[0];
26904 iSes = 0;
26905 }
26906 }
26907
26908 /* .session attach TABLE
26909 ** Invoke the sqlite3session_attach() interface to attach a particular
26910 ** table so that it is never filtered.
26911 */
26912 if( cli_strcmp(azCmd[0],"attach")==0 ){
26913 if( nCmd!=2 ) goto session_syntax_error;
26914 if( pSession->p==0 ){
26915 session_not_open:
26916 eputz("ERROR: No sessions are open\n");
26917 }else{
26918 rc = sqlite3session_attach(pSession->p, azCmd[1]);
26919 if( rc ){
26920 eputf("ERROR: sqlite3session_attach() returns %d\n",rc);
26921 rc = 0;
26922 }
26923 }
26924 }else
26925
26926 /* .session changeset FILE
26927 ** .session patchset FILE
26928 ** Write a changeset or patchset into a file. The file is overwritten.
26929 */
26930 if( cli_strcmp(azCmd[0],"changeset")==0
26931 || cli_strcmp(azCmd[0],"patchset")==0
26932 ){
26933 FILE *out = 0;
26934 failIfSafeMode(p, "cannot run \".session %s\" in safe mode", azCmd[0]);
26935 if( nCmd!=2 ) goto session_syntax_error;
26936 if( pSession->p==0 ) goto session_not_open;
26937 out = fopen(azCmd[1], "wb");
26938 if( out==0 ){
26939 eputf("ERROR: cannot open \"%s\" for writing\n",
26940 azCmd[1]);
26941 }else{
26942 int szChng;
26943 void *pChng;
26944 if( azCmd[0][0]=='c' ){
26945 rc = sqlite3session_changeset(pSession->p, &szChng, &pChng);
26946 }else{
26947 rc = sqlite3session_patchset(pSession->p, &szChng, &pChng);
26948 }
26949 if( rc ){
26950 sputf(stdout, "Error: error code %d\n", rc);
26951 rc = 0;
26952 }
26953 if( pChng
26954 && fwrite(pChng, szChng, 1, out)!=1 ){
26955 eputf("ERROR: Failed to write entire %d-byte output\n", szChng);
26956 }
26957 sqlite3_free(pChng);
26958 fclose(out);
26959 }
26960 }else
26961
26962 /* .session close
26963 ** Close the identified session
26964 */
26965 if( cli_strcmp(azCmd[0], "close")==0 ){
26966 if( nCmd!=1 ) goto session_syntax_error;
26967 if( pAuxDb->nSession ){
26968 session_close(pSession);
26969 pAuxDb->aSession[iSes] = pAuxDb->aSession[--pAuxDb->nSession];
26970 }
26971 }else
26972
26973 /* .session enable ?BOOLEAN?
26974 ** Query or set the enable flag
26975 */
26976 if( cli_strcmp(azCmd[0], "enable")==0 ){
26977 int ii;
26978 if( nCmd>2 ) goto session_syntax_error;
26979 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
26980 if( pAuxDb->nSession ){
26981 ii = sqlite3session_enable(pSession->p, ii);
26982 oputf("session %s enable flag = %d\n", pSession->zName, ii);
26983 }
26984 }else
26985
26986 /* .session filter GLOB ....
26987 ** Set a list of GLOB patterns of table names to be excluded.
26988 */
26989 if( cli_strcmp(azCmd[0], "filter")==0 ){
26990 int ii, nByte;
26991 if( nCmd<2 ) goto session_syntax_error;
26992 if( pAuxDb->nSession ){
26993 for(ii=0; ii<pSession->nFilter; ii++){
26994 sqlite3_free(pSession->azFilter[ii]);
26995 }
26996 sqlite3_free(pSession->azFilter);
26997 nByte = sizeof(pSession->azFilter[0])*(nCmd-1);
26998 pSession->azFilter = sqlite3_malloc( nByte );
26999 shell_check_oom( pSession->azFilter );
27000 for(ii=1; ii<nCmd; ii++){
27001 char *x = pSession->azFilter[ii-1] = sqlite3_mprintf("%s", azCmd[ii]);
27002 shell_check_oom(x);
27003 }
27004 pSession->nFilter = ii-1;
27005 }
27006 }else
27007
27008 /* .session indirect ?BOOLEAN?
27009 ** Query or set the indirect flag
27010 */
27011 if( cli_strcmp(azCmd[0], "indirect")==0 ){
27012 int ii;
27013 if( nCmd>2 ) goto session_syntax_error;
27014 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
27015 if( pAuxDb->nSession ){
27016 ii = sqlite3session_indirect(pSession->p, ii);
27017 oputf("session %s indirect flag = %d\n", pSession->zName, ii);
27018 }
27019 }else
27020
27021 /* .session isempty
27022 ** Determine if the session is empty
27023 */
27024 if( cli_strcmp(azCmd[0], "isempty")==0 ){
27025 int ii;
27026 if( nCmd!=1 ) goto session_syntax_error;
27027 if( pAuxDb->nSession ){
27028 ii = sqlite3session_isempty(pSession->p);
27029 oputf("session %s isempty flag = %d\n", pSession->zName, ii);
27030 }
27031 }else
27032
27033 /* .session list
27034 ** List all currently open sessions
27035 */
27036 if( cli_strcmp(azCmd[0],"list")==0 ){
27037 for(i=0; i<pAuxDb->nSession; i++){
27038 oputf("%d %s\n", i, pAuxDb->aSession[i].zName);
27039 }
27040 }else
27041
27042 /* .session open DB NAME
27043 ** Open a new session called NAME on the attached database DB.
27044 ** DB is normally "main".
27045 */
27046 if( cli_strcmp(azCmd[0],"open")==0 ){
27047 char *zName;
27048 if( nCmd!=3 ) goto session_syntax_error;
27049 zName = azCmd[2];
27050 if( zName[0]==0 ) goto session_syntax_error;
27051 for(i=0; i<pAuxDb->nSession; i++){
27052 if( cli_strcmp(pAuxDb->aSession[i].zName,zName)==0 ){
27053 eputf("Session \"%s\" already exists\n", zName);
27054 goto meta_command_exit;
27055 }
27056 }
27057 if( pAuxDb->nSession>=ArraySize(pAuxDb->aSession) ){
27058 eputf("Maximum of %d sessions\n", ArraySize(pAuxDb->aSession));
27059 goto meta_command_exit;
27060 }
27061 pSession = &pAuxDb->aSession[pAuxDb->nSession];
27062 rc = sqlite3session_create(p->db, azCmd[1], &pSession->p);
27063 if( rc ){
27064 eputf("Cannot open session: error code=%d\n", rc);
27065 rc = 0;
27066 goto meta_command_exit;
27067 }
27068 pSession->nFilter = 0;
27069 sqlite3session_table_filter(pSession->p, session_filter, pSession);
27070 pAuxDb->nSession++;
27071 pSession->zName = sqlite3_mprintf("%s", zName);
27072 shell_check_oom(pSession->zName);
27073 }else
27074 /* If no command name matches, show a syntax error */
27075 session_syntax_error:
27076 showHelp(p->out, "session");
27077 }else
27078 #endif
27079
27080 #ifdef SQLITE_DEBUG
27081 /* Undocumented commands for internal testing. Subject to change
27082 ** without notice. */
27083 if( c=='s' && n>=10 && cli_strncmp(azArg[0], "selftest-", 9)==0 ){
27084 if( cli_strncmp(azArg[0]+9, "boolean", n-9)==0 ){
27085 int i, v;
27086 for(i=1; i<nArg; i++){
27087 v = booleanValue(azArg[i]);
27088 oputf("%s: %d 0x%x\n", azArg[i], v, v);
27089 }
27090 }
27091 if( cli_strncmp(azArg[0]+9, "integer", n-9)==0 ){
27092 int i; sqlite3_int64 v;
27093 for(i=1; i<nArg; i++){
27094 char zBuf[200];
27095 v = integerValue(azArg[i]);
27096 sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v);
27097 oputz(zBuf);
27098 }
27099 }
27100 }else
27101 #endif
27102
27103 if( c=='s' && n>=4 && cli_strncmp(azArg[0],"selftest",n)==0 ){
27104 int bIsInit = 0; /* True to initialize the SELFTEST table */
27105 int bVerbose = 0; /* Verbose output */
27106 int bSelftestExists; /* True if SELFTEST already exists */
27107 int i, k; /* Loop counters */
27108 int nTest = 0; /* Number of tests runs */
27109 int nErr = 0; /* Number of errors seen */
27110 ShellText str; /* Answer for a query */
27111 sqlite3_stmt *pStmt = 0; /* Query against the SELFTEST table */
27112
27113 open_db(p,0);
27114 for(i=1; i<nArg; i++){
27115 const char *z = azArg[i];
27116 if( z[0]=='-' && z[1]=='-' ) z++;
27117 if( cli_strcmp(z,"-init")==0 ){
27118 bIsInit = 1;
27119 }else
27120 if( cli_strcmp(z,"-v")==0 ){
27121 bVerbose++;
27122 }else
27123 {
27124 eputf("Unknown option \"%s\" on \"%s\"\n", azArg[i], azArg[0]);
27125 eputz("Should be one of: --init -v\n");
27126 rc = 1;
27127 goto meta_command_exit;
27128 }
27129 }
27130 if( sqlite3_table_column_metadata(p->db,"main","selftest",0,0,0,0,0,0)
27131 != SQLITE_OK ){
27132 bSelftestExists = 0;
27133 }else{
27134 bSelftestExists = 1;
27135 }
27136 if( bIsInit ){
27137 createSelftestTable(p);
27138 bSelftestExists = 1;
27139 }
27140 initText(&str);
27141 appendText(&str, "x", 0);
27142 for(k=bSelftestExists; k>=0; k--){
27143 if( k==1 ){
27144 rc = sqlite3_prepare_v2(p->db,
27145 "SELECT tno,op,cmd,ans FROM selftest ORDER BY tno",
27146 -1, &pStmt, 0);
27147 }else{
27148 rc = sqlite3_prepare_v2(p->db,
27149 "VALUES(0,'memo','Missing SELFTEST table - default checks only',''),"
27150 " (1,'run','PRAGMA integrity_check','ok')",
27151 -1, &pStmt, 0);
27152 }
27153 if( rc ){
27154 eputz("Error querying the selftest table\n");
27155 rc = 1;
27156 sqlite3_finalize(pStmt);
27157 goto meta_command_exit;
27158 }
27159 for(i=1; sqlite3_step(pStmt)==SQLITE_ROW; i++){
27160 int tno = sqlite3_column_int(pStmt, 0);
27161 const char *zOp = (const char*)sqlite3_column_text(pStmt, 1);
27162 const char *zSql = (const char*)sqlite3_column_text(pStmt, 2);
27163 const char *zAns = (const char*)sqlite3_column_text(pStmt, 3);
27164
27165 if( zOp==0 ) continue;
27166 if( zSql==0 ) continue;
27167 if( zAns==0 ) continue;
27168 k = 0;
27169 if( bVerbose>0 ){
27170 sputf(stdout, "%d: %s %s\n", tno, zOp, zSql);
27171 }
27172 if( cli_strcmp(zOp,"memo")==0 ){
27173 oputf("%s\n", zSql);
27174 }else
27175 if( cli_strcmp(zOp,"run")==0 ){
27176 char *zErrMsg = 0;
27177 str.n = 0;
27178 str.z[0] = 0;
27179 rc = sqlite3_exec(p->db, zSql, captureOutputCallback, &str, &zErrMsg);
27180 nTest++;
27181 if( bVerbose ){
27182 oputf("Result: %s\n", str.z);
27183 }
27184 if( rc || zErrMsg ){
27185 nErr++;
27186 rc = 1;
27187 oputf("%d: error-code-%d: %s\n", tno, rc, zErrMsg);
27188 sqlite3_free(zErrMsg);
27189 }else if( cli_strcmp(zAns,str.z)!=0 ){
27190 nErr++;
27191 rc = 1;
27192 oputf("%d: Expected: [%s]\n", tno, zAns);
27193 oputf("%d: Got: [%s]\n", tno, str.z);
27194 }
27195 }
27196 else{
27197 eputf("Unknown operation \"%s\" on selftest line %d\n", zOp, tno);
27198 rc = 1;
27199 break;
27200 }
27201 } /* End loop over rows of content from SELFTEST */
27202 sqlite3_finalize(pStmt);
27203 } /* End loop over k */
27204 freeText(&str);
27205 oputf("%d errors out of %d tests\n", nErr, nTest);
27206 }else
27207
27208 if( c=='s' && cli_strncmp(azArg[0], "separator", n)==0 ){
27209 if( nArg<2 || nArg>3 ){
27210 eputz("Usage: .separator COL ?ROW?\n");
27211 rc = 1;
27212 }
27213 if( nArg>=2 ){
27214 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator,
27215 "%.*s", (int)ArraySize(p->colSeparator)-1, azArg[1]);
27216 }
27217 if( nArg>=3 ){
27218 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator,
27219 "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]);
27220 }
27221 }else
27222
27223 if( c=='s' && n>=4 && cli_strncmp(azArg[0],"sha3sum",n)==0 ){
27224 const char *zLike = 0; /* Which table to checksum. 0 means everything */
27225 int i; /* Loop counter */
27226 int bSchema = 0; /* Also hash the schema */
27227 int bSeparate = 0; /* Hash each table separately */
27228 int iSize = 224; /* Hash algorithm to use */
27229 int bDebug = 0; /* Only show the query that would have run */
27230 sqlite3_stmt *pStmt; /* For querying tables names */
27231 char *zSql; /* SQL to be run */
27232 char *zSep; /* Separator */
27233 ShellText sSql; /* Complete SQL for the query to run the hash */
27234 ShellText sQuery; /* Set of queries used to read all content */
27235 open_db(p, 0);
27236 for(i=1; i<nArg; i++){
27237 const char *z = azArg[i];
27238 if( z[0]=='-' ){
27239 z++;
27240 if( z[0]=='-' ) z++;
27241 if( cli_strcmp(z,"schema")==0 ){
27242 bSchema = 1;
27243 }else
27244 if( cli_strcmp(z,"sha3-224")==0 || cli_strcmp(z,"sha3-256")==0
27245 || cli_strcmp(z,"sha3-384")==0 || cli_strcmp(z,"sha3-512")==0
27246 ){
27247 iSize = atoi(&z[5]);
27248 }else
27249 if( cli_strcmp(z,"debug")==0 ){
27250 bDebug = 1;
27251 }else
27252 {
27253 eputf("Unknown option \"%s\" on \"%s\"\n", azArg[i], azArg[0]);
27254 showHelp(p->out, azArg[0]);
27255 rc = 1;
27256 goto meta_command_exit;
27257 }
27258 }else if( zLike ){
27259 eputz("Usage: .sha3sum ?OPTIONS? ?LIKE-PATTERN?\n");
27260 rc = 1;
27261 goto meta_command_exit;
27262 }else{
27263 zLike = z;
27264 bSeparate = 1;
27265 if( sqlite3_strlike("sqlite\\_%", zLike, '\\')==0 ) bSchema = 1;
27266 }
27267 }
27268 if( bSchema ){
27269 zSql = "SELECT lower(name) as tname FROM sqlite_schema"
27270 " WHERE type='table' AND coalesce(rootpage,0)>1"
27271 " UNION ALL SELECT 'sqlite_schema'"
27272 " ORDER BY 1 collate nocase";
27273 }else{
27274 zSql = "SELECT lower(name) as tname FROM sqlite_schema"
27275 " WHERE type='table' AND coalesce(rootpage,0)>1"
27276 " AND name NOT LIKE 'sqlite_%'"
27277 " ORDER BY 1 collate nocase";
27278 }
27279 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
27280 initText(&sQuery);
27281 initText(&sSql);
27282 appendText(&sSql, "WITH [sha3sum$query](a,b) AS(",0);
27283 zSep = "VALUES(";
27284 while( SQLITE_ROW==sqlite3_step(pStmt) ){
27285 const char *zTab = (const char*)sqlite3_column_text(pStmt,0);
27286 if( zTab==0 ) continue;
27287 if( zLike && sqlite3_strlike(zLike, zTab, 0)!=0 ) continue;
27288 if( cli_strncmp(zTab, "sqlite_",7)!=0 ){
27289 appendText(&sQuery,"SELECT * FROM ", 0);
27290 appendText(&sQuery,zTab,'"');
27291 appendText(&sQuery," NOT INDEXED;", 0);
27292 }else if( cli_strcmp(zTab, "sqlite_schema")==0 ){
27293 appendText(&sQuery,"SELECT type,name,tbl_name,sql FROM sqlite_schema"
27294 " ORDER BY name;", 0);
27295 }else if( cli_strcmp(zTab, "sqlite_sequence")==0 ){
27296 appendText(&sQuery,"SELECT name,seq FROM sqlite_sequence"
27297 " ORDER BY name;", 0);
27298 }else if( cli_strcmp(zTab, "sqlite_stat1")==0 ){
27299 appendText(&sQuery,"SELECT tbl,idx,stat FROM sqlite_stat1"
27300 " ORDER BY tbl,idx;", 0);
27301 }else if( cli_strcmp(zTab, "sqlite_stat4")==0 ){
27302 appendText(&sQuery, "SELECT * FROM ", 0);
27303 appendText(&sQuery, zTab, 0);
27304 appendText(&sQuery, " ORDER BY tbl, idx, rowid;\n", 0);
27305 }
27306 appendText(&sSql, zSep, 0);
27307 appendText(&sSql, sQuery.z, '\'');
27308 sQuery.n = 0;
27309 appendText(&sSql, ",", 0);
27310 appendText(&sSql, zTab, '\'');
27311 zSep = "),(";
27312 }
27313 sqlite3_finalize(pStmt);
27314 if( bSeparate ){
27315 zSql = sqlite3_mprintf(
27316 "%s))"
27317 " SELECT lower(hex(sha3_query(a,%d))) AS hash, b AS label"
27318 " FROM [sha3sum$query]",
27319 sSql.z, iSize);
27320 }else{
27321 zSql = sqlite3_mprintf(
27322 "%s))"
27323 " SELECT lower(hex(sha3_query(group_concat(a,''),%d))) AS hash"
27324 " FROM [sha3sum$query]",
27325 sSql.z, iSize);
27326 }
27327 shell_check_oom(zSql);
27328 freeText(&sQuery);
27329 freeText(&sSql);
27330 if( bDebug ){
27331 oputf("%s\n", zSql);
27332 }else{
27333 shell_exec(p, zSql, 0);
27334 }
27335 #if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) && !defined(SQLITE_OMIT_VIRTUALTABLE)
27336 {
27337 int lrc;
27338 char *zRevText = /* Query for reversible to-blob-to-text check */
27339 "SELECT lower(name) as tname FROM sqlite_schema\n"
27340 "WHERE type='table' AND coalesce(rootpage,0)>1\n"
27341 "AND name NOT LIKE 'sqlite_%%'%s\n"
27342 "ORDER BY 1 collate nocase";
27343 zRevText = sqlite3_mprintf(zRevText, zLike? " AND name LIKE $tspec" : "");
27344 zRevText = sqlite3_mprintf(
27345 /* lower-case query is first run, producing upper-case query. */
27346 "with tabcols as materialized(\n"
27347 "select tname, cname\n"
27348 "from ("
27349 " select printf('\"%%w\"',ss.tname) as tname,"
27350 " printf('\"%%w\"',ti.name) as cname\n"
27351 " from (%z) ss\n inner join pragma_table_info(tname) ti))\n"
27352 "select 'SELECT total(bad_text_count) AS bad_text_count\n"
27353 "FROM ('||group_concat(query, ' UNION ALL ')||')' as btc_query\n"
27354 " from (select 'SELECT COUNT(*) AS bad_text_count\n"
27355 "FROM '||tname||' WHERE '\n"
27356 "||group_concat('CAST(CAST('||cname||' AS BLOB) AS TEXT)<>'||cname\n"
27357 "|| ' AND typeof('||cname||')=''text'' ',\n"
27358 "' OR ') as query, tname from tabcols group by tname)"
27359 , zRevText);
27360 shell_check_oom(zRevText);
27361 if( bDebug ) oputf("%s\n", zRevText);
27362 lrc = sqlite3_prepare_v2(p->db, zRevText, -1, &pStmt, 0);
27363 if( lrc!=SQLITE_OK ){
27364 /* assert(lrc==SQLITE_NOMEM); // might also be SQLITE_ERROR if the
27365 ** user does cruel and unnatural things like ".limit expr_depth 0". */
27366 rc = 1;
27367 }else{
27368 if( zLike ) sqlite3_bind_text(pStmt,1,zLike,-1,SQLITE_STATIC);
27369 lrc = SQLITE_ROW==sqlite3_step(pStmt);
27370 if( lrc ){
27371 const char *zGenQuery = (char*)sqlite3_column_text(pStmt,0);
27372 sqlite3_stmt *pCheckStmt;
27373 lrc = sqlite3_prepare_v2(p->db, zGenQuery, -1, &pCheckStmt, 0);
27374 if( bDebug ) oputf("%s\n", zGenQuery);
27375 if( lrc!=SQLITE_OK ){
27376 rc = 1;
27377 }else{
27378 if( SQLITE_ROW==sqlite3_step(pCheckStmt) ){
27379 double countIrreversible = sqlite3_column_double(pCheckStmt, 0);
27380 if( countIrreversible>0 ){
27381 int sz = (int)(countIrreversible + 0.5);
27382 eputf("Digest includes %d invalidly encoded text field%s.\n",
27383 sz, (sz>1)? "s": "");
27384 }
27385 }
27386 sqlite3_finalize(pCheckStmt);
27387 }
27388 sqlite3_finalize(pStmt);
27389 }
27390 }
27391 if( rc ) eputz(".sha3sum failed.\n");
27392 sqlite3_free(zRevText);
27393 }
27394 #endif /* !defined(*_OMIT_SCHEMA_PRAGMAS) && !defined(*_OMIT_VIRTUALTABLE) */
27395 sqlite3_free(zSql);
27396 }else
27397
27398 #if !defined(SQLITE_NOHAVE_SYSTEM) && !defined(SQLITE_SHELL_FIDDLE)
27399 if( c=='s'
27400 && (cli_strncmp(azArg[0], "shell", n)==0
27401 || cli_strncmp(azArg[0],"system",n)==0)
27402 ){
27403 char *zCmd;
27404 int i, x;
27405 failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]);
27406 if( nArg<2 ){
27407 eputz("Usage: .system COMMAND\n");
27408 rc = 1;
27409 goto meta_command_exit;
27410 }
27411 zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]);
27412 for(i=2; i<nArg && zCmd!=0; i++){
27413 zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"",
27414 zCmd, azArg[i]);
27415 }
27416 consoleRestore();
27417 x = zCmd!=0 ? system(zCmd) : 1;
27418 consoleRenewSetup();
27419 sqlite3_free(zCmd);
27420 if( x ) eputf("System command returns %d\n", x);
27421 }else
27422 #endif /* !defined(SQLITE_NOHAVE_SYSTEM) && !defined(SQLITE_SHELL_FIDDLE) */
27423
27424 if( c=='s' && cli_strncmp(azArg[0], "show", n)==0 ){
27425 static const char *azBool[] = { "off", "on", "trigger", "full"};
27426 const char *zOut;
27427 int i;
27428 if( nArg!=1 ){
27429 eputz("Usage: .show\n");
27430 rc = 1;
27431 goto meta_command_exit;
27432 }
27433 oputf("%12.12s: %s\n","echo",
27434 azBool[ShellHasFlag(p, SHFLG_Echo)]);
27435 oputf("%12.12s: %s\n","eqp", azBool[p->autoEQP&3]);
27436 oputf("%12.12s: %s\n","explain",
27437 p->mode==MODE_Explain ? "on" : p->autoExplain ? "auto" : "off");
27438 oputf("%12.12s: %s\n","headers", azBool[p->showHeader!=0]);
27439 if( p->mode==MODE_Column
27440 || (p->mode>=MODE_Markdown && p->mode<=MODE_Box)
27441 ){
27442 oputf("%12.12s: %s --wrap %d --wordwrap %s --%squote\n", "mode",
27443 modeDescr[p->mode], p->cmOpts.iWrap,
27444 p->cmOpts.bWordWrap ? "on" : "off",
27445 p->cmOpts.bQuote ? "" : "no");
27446 }else{
27447 oputf("%12.12s: %s\n","mode", modeDescr[p->mode]);
27448 }
27449 oputf("%12.12s: ", "nullvalue");
27450 output_c_string(p->nullValue);
27451 oputz("\n");
27452 oputf("%12.12s: %s\n","output",
27453 strlen30(p->outfile) ? p->outfile : "stdout");
27454 oputf("%12.12s: ", "colseparator");
27455 output_c_string(p->colSeparator);
27456 oputz("\n");
27457 oputf("%12.12s: ", "rowseparator");
27458 output_c_string(p->rowSeparator);
27459 oputz("\n");
27460 switch( p->statsOn ){
27461 case 0: zOut = "off"; break;
27462 default: zOut = "on"; break;
27463 case 2: zOut = "stmt"; break;
27464 case 3: zOut = "vmstep"; break;
27465 }
27466 oputf("%12.12s: %s\n","stats", zOut);
27467 oputf("%12.12s: ", "width");
27468 for (i=0;i<p->nWidth;i++) {
27469 oputf("%d ", p->colWidth[i]);
27470 }
27471 oputz("\n");
27472 oputf("%12.12s: %s\n", "filename",
27473 p->pAuxDb->zDbFilename ? p->pAuxDb->zDbFilename : "");
27474 }else
27475
27476 if( c=='s' && cli_strncmp(azArg[0], "stats", n)==0 ){
27477 if( nArg==2 ){
27478 if( cli_strcmp(azArg[1],"stmt")==0 ){
27479 p->statsOn = 2;
27480 }else if( cli_strcmp(azArg[1],"vmstep")==0 ){
27481 p->statsOn = 3;
27482 }else{
27483 p->statsOn = (u8)booleanValue(azArg[1]);
27484 }
27485 }else if( nArg==1 ){
27486 display_stats(p->db, p, 0);
27487 }else{
27488 eputz("Usage: .stats ?on|off|stmt|vmstep?\n");
27489 rc = 1;
27490 }
27491 }else
27492
27493 if( (c=='t' && n>1 && cli_strncmp(azArg[0], "tables", n)==0)
27494 || (c=='i' && (cli_strncmp(azArg[0], "indices", n)==0
27495 || cli_strncmp(azArg[0], "indexes", n)==0) )
27496 ){
27497 sqlite3_stmt *pStmt;
27498 char **azResult;
27499 int nRow, nAlloc;
27500 int ii;
27501 ShellText s;
27502 initText(&s);
27503 open_db(p, 0);
27504 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
27505 if( rc ){
27506 sqlite3_finalize(pStmt);
27507 return shellDatabaseError(p->db);
27508 }
27509
27510 if( nArg>2 && c=='i' ){
27511 /* It is an historical accident that the .indexes command shows an error
27512 ** when called with the wrong number of arguments whereas the .tables
27513 ** command does not. */
27514 eputz("Usage: .indexes ?LIKE-PATTERN?\n");
27515 rc = 1;
27516 sqlite3_finalize(pStmt);
27517 goto meta_command_exit;
27518 }
27519 for(ii=0; sqlite3_step(pStmt)==SQLITE_ROW; ii++){
27520 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
27521 if( zDbName==0 ) continue;
27522 if( s.z && s.z[0] ) appendText(&s, " UNION ALL ", 0);
27523 if( sqlite3_stricmp(zDbName, "main")==0 ){
27524 appendText(&s, "SELECT name FROM ", 0);
27525 }else{
27526 appendText(&s, "SELECT ", 0);
27527 appendText(&s, zDbName, '\'');
27528 appendText(&s, "||'.'||name FROM ", 0);
27529 }
27530 appendText(&s, zDbName, '"');
27531 appendText(&s, ".sqlite_schema ", 0);
27532 if( c=='t' ){
27533 appendText(&s," WHERE type IN ('table','view')"
27534 " AND name NOT LIKE 'sqlite_%'"
27535 " AND name LIKE ?1", 0);
27536 }else{
27537 appendText(&s," WHERE type='index'"
27538 " AND tbl_name LIKE ?1", 0);
27539 }
27540 }
27541 rc = sqlite3_finalize(pStmt);
27542 if( rc==SQLITE_OK ){
27543 appendText(&s, " ORDER BY 1", 0);
27544 rc = sqlite3_prepare_v2(p->db, s.z, -1, &pStmt, 0);
27545 }
27546 freeText(&s);
27547 if( rc ) return shellDatabaseError(p->db);
27548
27549 /* Run the SQL statement prepared by the above block. Store the results
27550 ** as an array of nul-terminated strings in azResult[]. */
27551 nRow = nAlloc = 0;
27552 azResult = 0;
27553 if( nArg>1 ){
27554 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
27555 }else{
27556 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
27557 }
27558 while( sqlite3_step(pStmt)==SQLITE_ROW ){
27559 if( nRow>=nAlloc ){
27560 char **azNew;
27561 int n2 = nAlloc*2 + 10;
27562 azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2);
27563 shell_check_oom(azNew);
27564 nAlloc = n2;
27565 azResult = azNew;
27566 }
27567 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
27568 shell_check_oom(azResult[nRow]);
27569 nRow++;
27570 }
27571 if( sqlite3_finalize(pStmt)!=SQLITE_OK ){
27572 rc = shellDatabaseError(p->db);
27573 }
27574
27575 /* Pretty-print the contents of array azResult[] to the output */
27576 if( rc==0 && nRow>0 ){
27577 int len, maxlen = 0;
27578 int i, j;
27579 int nPrintCol, nPrintRow;
27580 for(i=0; i<nRow; i++){
27581 len = strlen30(azResult[i]);
27582 if( len>maxlen ) maxlen = len;
27583 }
27584 nPrintCol = 80/(maxlen+2);
27585 if( nPrintCol<1 ) nPrintCol = 1;
27586 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
27587 for(i=0; i<nPrintRow; i++){
27588 for(j=i; j<nRow; j+=nPrintRow){
27589 char *zSp = j<nPrintRow ? "" : " ";
27590 oputf("%s%-*s", zSp, maxlen, azResult[j] ? azResult[j]:"");
27591 }
27592 oputz("\n");
27593 }
27594 }
27595
27596 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
27597 sqlite3_free(azResult);
27598 }else
27599
27600 #ifndef SQLITE_SHELL_FIDDLE
27601 /* Begin redirecting output to the file "testcase-out.txt" */
27602 if( c=='t' && cli_strcmp(azArg[0],"testcase")==0 ){
27603 output_reset(p);
27604 p->out = output_file_open("testcase-out.txt", 0);
27605 if( p->out==0 ){
27606 eputz("Error: cannot open 'testcase-out.txt'\n");
27607 }
27608 if( nArg>=2 ){
27609 sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "%s", azArg[1]);
27610 }else{
27611 sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "?");
27612 }
27613 }else
27614 #endif /* !defined(SQLITE_SHELL_FIDDLE) */
27615
27616 #ifndef SQLITE_UNTESTABLE
27617 if( c=='t' && n>=8 && cli_strncmp(azArg[0], "testctrl", n)==0 ){
27618 static const struct {
27619 const char *zCtrlName; /* Name of a test-control option */
27620 int ctrlCode; /* Integer code for that option */
27621 int unSafe; /* Not valid unless --unsafe-testing */
27622 const char *zUsage; /* Usage notes */
27623 } aCtrl[] = {
27624 {"always", SQLITE_TESTCTRL_ALWAYS, 1, "BOOLEAN" },
27625 {"assert", SQLITE_TESTCTRL_ASSERT, 1, "BOOLEAN" },
27626 /*{"benign_malloc_hooks",SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS,1, "" },*/
27627 /*{"bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST, 1, "" },*/
27628 {"byteorder", SQLITE_TESTCTRL_BYTEORDER, 0, "" },
27629 {"extra_schema_checks",SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS,0,"BOOLEAN" },
27630 /*{"fault_install", SQLITE_TESTCTRL_FAULT_INSTALL, 1,"" },*/
27631 {"fk_no_action", SQLITE_TESTCTRL_FK_NO_ACTION, 0, "BOOLEAN" },
27632 {"imposter", SQLITE_TESTCTRL_IMPOSTER,1,"SCHEMA ON/OFF ROOTPAGE"},
27633 {"internal_functions", SQLITE_TESTCTRL_INTERNAL_FUNCTIONS,0,"" },
27634 {"json_selfcheck", SQLITE_TESTCTRL_JSON_SELFCHECK ,0,"BOOLEAN" },
27635 {"localtime_fault", SQLITE_TESTCTRL_LOCALTIME_FAULT,0,"BOOLEAN" },
27636 {"never_corrupt", SQLITE_TESTCTRL_NEVER_CORRUPT,1, "BOOLEAN" },
27637 {"optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS,0,"DISABLE-MASK" },
27638 #ifdef YYCOVERAGE
27639 {"parser_coverage", SQLITE_TESTCTRL_PARSER_COVERAGE,0,"" },
27640 #endif
27641 {"pending_byte", SQLITE_TESTCTRL_PENDING_BYTE,0, "OFFSET " },
27642 {"prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE,0, "" },
27643 {"prng_save", SQLITE_TESTCTRL_PRNG_SAVE, 0, "" },
27644 {"prng_seed", SQLITE_TESTCTRL_PRNG_SEED, 0, "SEED ?db?" },
27645 {"seek_count", SQLITE_TESTCTRL_SEEK_COUNT, 0, "" },
27646 {"sorter_mmap", SQLITE_TESTCTRL_SORTER_MMAP, 0, "NMAX" },
27647 {"tune", SQLITE_TESTCTRL_TUNE, 1, "ID VALUE" },
27648 {"uselongdouble", SQLITE_TESTCTRL_USELONGDOUBLE,0,"?BOOLEAN|\"default\"?"},
27649 };
27650 int testctrl = -1;
27651 int iCtrl = -1;
27652 int rc2 = 0; /* 0: usage. 1: %d 2: %x 3: no-output */
27653 int isOk = 0;
27654 int i, n2;
27655 const char *zCmd = 0;
27656
27657 open_db(p, 0);
27658 zCmd = nArg>=2 ? azArg[1] : "help";
27659
27660 /* The argument can optionally begin with "-" or "--" */
27661 if( zCmd[0]=='-' && zCmd[1] ){
27662 zCmd++;
27663 if( zCmd[0]=='-' && zCmd[1] ) zCmd++;
27664 }
27665
27666 /* --help lists all test-controls */
27667 if( cli_strcmp(zCmd,"help")==0 ){
27668 oputz("Available test-controls:\n");
27669 for(i=0; i<ArraySize(aCtrl); i++){
27670 if( aCtrl[i].unSafe && !ShellHasFlag(p,SHFLG_TestingMode) ) continue;
27671 oputf(" .testctrl %s %s\n",
27672 aCtrl[i].zCtrlName, aCtrl[i].zUsage);
27673 }
27674 rc = 1;
27675 goto meta_command_exit;
27676 }
27677
27678 /* convert testctrl text option to value. allow any unique prefix
27679 ** of the option name, or a numerical value. */
27680 n2 = strlen30(zCmd);
27681 for(i=0; i<ArraySize(aCtrl); i++){
27682 if( aCtrl[i].unSafe && !ShellHasFlag(p,SHFLG_TestingMode) ) continue;
27683 if( cli_strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){
27684 if( testctrl<0 ){
27685 testctrl = aCtrl[i].ctrlCode;
27686 iCtrl = i;
27687 }else{
27688 eputf("Error: ambiguous test-control: \"%s\"\n"
27689 "Use \".testctrl --help\" for help\n", zCmd);
27690 rc = 1;
27691 goto meta_command_exit;
27692 }
27693 }
27694 }
27695 if( testctrl<0 ){
27696 eputf("Error: unknown test-control: %s\n"
27697 "Use \".testctrl --help\" for help\n", zCmd);
27698 }else{
27699 switch(testctrl){
27700
27701 /* sqlite3_test_control(int, db, int) */
27702 case SQLITE_TESTCTRL_OPTIMIZATIONS:
27703 case SQLITE_TESTCTRL_FK_NO_ACTION:
27704 if( nArg==3 ){
27705 unsigned int opt = (unsigned int)strtol(azArg[2], 0, 0);
27706 rc2 = sqlite3_test_control(testctrl, p->db, opt);
27707 isOk = 3;
27708 }
27709 break;
27710
27711 /* sqlite3_test_control(int) */
27712 case SQLITE_TESTCTRL_PRNG_SAVE:
27713 case SQLITE_TESTCTRL_PRNG_RESTORE:
27714 case SQLITE_TESTCTRL_BYTEORDER:
27715 if( nArg==2 ){
27716 rc2 = sqlite3_test_control(testctrl);
27717 isOk = testctrl==SQLITE_TESTCTRL_BYTEORDER ? 1 : 3;
27718 }
27719 break;
27720
27721 /* sqlite3_test_control(int, uint) */
27722 case SQLITE_TESTCTRL_PENDING_BYTE:
27723 if( nArg==3 ){
27724 unsigned int opt = (unsigned int)integerValue(azArg[2]);
27725 rc2 = sqlite3_test_control(testctrl, opt);
27726 isOk = 3;
27727 }
27728 break;
27729
27730 /* sqlite3_test_control(int, int, sqlite3*) */
27731 case SQLITE_TESTCTRL_PRNG_SEED:
27732 if( nArg==3 || nArg==4 ){
27733 int ii = (int)integerValue(azArg[2]);
27734 sqlite3 *db;
27735 if( ii==0 && cli_strcmp(azArg[2],"random")==0 ){
27736 sqlite3_randomness(sizeof(ii),&ii);
27737 sputf(stdout, "-- random seed: %d\n", ii);
27738 }
27739 if( nArg==3 ){
27740 db = 0;
27741 }else{
27742 db = p->db;
27743 /* Make sure the schema has been loaded */
27744 sqlite3_table_column_metadata(db, 0, "x", 0, 0, 0, 0, 0, 0);
27745 }
27746 rc2 = sqlite3_test_control(testctrl, ii, db);
27747 isOk = 3;
27748 }
27749 break;
27750
27751 /* sqlite3_test_control(int, int) */
27752 case SQLITE_TESTCTRL_ASSERT:
27753 case SQLITE_TESTCTRL_ALWAYS:
27754 if( nArg==3 ){
27755 int opt = booleanValue(azArg[2]);
27756 rc2 = sqlite3_test_control(testctrl, opt);
27757 isOk = 1;
27758 }
27759 break;
27760
27761 /* sqlite3_test_control(int, int) */
27762 case SQLITE_TESTCTRL_LOCALTIME_FAULT:
27763 case SQLITE_TESTCTRL_NEVER_CORRUPT:
27764 if( nArg==3 ){
27765 int opt = booleanValue(azArg[2]);
27766 rc2 = sqlite3_test_control(testctrl, opt);
27767 isOk = 3;
27768 }
27769 break;
27770
27771 /* sqlite3_test_control(int, int) */
27772 case SQLITE_TESTCTRL_USELONGDOUBLE: {
27773 int opt = -1;
27774 if( nArg==3 ){
27775 if( cli_strcmp(azArg[2],"default")==0 ){
27776 opt = 2;
27777 }else{
27778 opt = booleanValue(azArg[2]);
27779 }
27780 }
27781 rc2 = sqlite3_test_control(testctrl, opt);
27782 isOk = 1;
27783 break;
27784 }
27785
27786 /* sqlite3_test_control(sqlite3*) */
27787 case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS:
27788 rc2 = sqlite3_test_control(testctrl, p->db);
27789 isOk = 3;
27790 break;
27791
27792 case SQLITE_TESTCTRL_IMPOSTER:
27793 if( nArg==5 ){
27794 rc2 = sqlite3_test_control(testctrl, p->db,
27795 azArg[2],
27796 integerValue(azArg[3]),
27797 integerValue(azArg[4]));
27798 isOk = 3;
27799 }
27800 break;
27801
27802 case SQLITE_TESTCTRL_SEEK_COUNT: {
27803 u64 x = 0;
27804 rc2 = sqlite3_test_control(testctrl, p->db, &x);
27805 oputf("%llu\n", x);
27806 isOk = 3;
27807 break;
27808 }
27809
27810 #ifdef YYCOVERAGE
27811 case SQLITE_TESTCTRL_PARSER_COVERAGE: {
27812 if( nArg==2 ){
27813 sqlite3_test_control(testctrl, p->out);
27814 isOk = 3;
27815 }
27816 break;
27817 }
27818 #endif
27819 #ifdef SQLITE_DEBUG
27820 case SQLITE_TESTCTRL_TUNE: {
27821 if( nArg==4 ){
27822 int id = (int)integerValue(azArg[2]);
27823 int val = (int)integerValue(azArg[3]);
27824 sqlite3_test_control(testctrl, id, &val);
27825 isOk = 3;
27826 }else if( nArg==3 ){
27827 int id = (int)integerValue(azArg[2]);
27828 sqlite3_test_control(testctrl, -id, &rc2);
27829 isOk = 1;
27830 }else if( nArg==2 ){
27831 int id = 1;
27832 while(1){
27833 int val = 0;
27834 rc2 = sqlite3_test_control(testctrl, -id, &val);
27835 if( rc2!=SQLITE_OK ) break;
27836 if( id>1 ) oputz(" ");
27837 oputf("%d: %d", id, val);
27838 id++;
27839 }
27840 if( id>1 ) oputz("\n");
27841 isOk = 3;
27842 }
27843 break;
27844 }
27845 #endif
27846 case SQLITE_TESTCTRL_SORTER_MMAP:
27847 if( nArg==3 ){
27848 int opt = (unsigned int)integerValue(azArg[2]);
27849 rc2 = sqlite3_test_control(testctrl, p->db, opt);
27850 isOk = 3;
27851 }
27852 break;
27853 case SQLITE_TESTCTRL_JSON_SELFCHECK:
27854 if( nArg==2 ){
27855 rc2 = -1;
27856 isOk = 1;
27857 }else{
27858 rc2 = booleanValue(azArg[2]);
27859 isOk = 3;
27860 }
27861 sqlite3_test_control(testctrl, &rc2);
27862 break;
27863 }
27864 }
27865 if( isOk==0 && iCtrl>=0 ){
27866 oputf("Usage: .testctrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage);
27867 rc = 1;
27868 }else if( isOk==1 ){
27869 oputf("%d\n", rc2);
27870 }else if( isOk==2 ){
27871 oputf("0x%08x\n", rc2);
27872 }
27873 }else
27874 #endif /* !defined(SQLITE_UNTESTABLE) */
27875
27876 if( c=='t' && n>4 && cli_strncmp(azArg[0], "timeout", n)==0 ){
27877 open_db(p, 0);
27878 sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0);
27879 }else
27880
27881 if( c=='t' && n>=5 && cli_strncmp(azArg[0], "timer", n)==0 ){
27882 if( nArg==2 ){
27883 enableTimer = booleanValue(azArg[1]);
27884 if( enableTimer && !HAS_TIMER ){
27885 eputz("Error: timer not available on this system.\n");
27886 enableTimer = 0;
27887 }
27888 }else{
27889 eputz("Usage: .timer on|off\n");
27890 rc = 1;
27891 }
27892 }else
27893
27894 #ifndef SQLITE_OMIT_TRACE
27895 if( c=='t' && cli_strncmp(azArg[0], "trace", n)==0 ){
27896 int mType = 0;
27897 int jj;
27898 open_db(p, 0);
27899 for(jj=1; jj<nArg; jj++){
27900 const char *z = azArg[jj];
27901 if( z[0]=='-' ){
27902 if( optionMatch(z, "expanded") ){
27903 p->eTraceType = SHELL_TRACE_EXPANDED;
27904 }
27905 #ifdef SQLITE_ENABLE_NORMALIZE
27906 else if( optionMatch(z, "normalized") ){
27907 p->eTraceType = SHELL_TRACE_NORMALIZED;
27908 }
27909 #endif
27910 else if( optionMatch(z, "plain") ){
27911 p->eTraceType = SHELL_TRACE_PLAIN;
27912 }
27913 else if( optionMatch(z, "profile") ){
27914 mType |= SQLITE_TRACE_PROFILE;
27915 }
27916 else if( optionMatch(z, "row") ){
27917 mType |= SQLITE_TRACE_ROW;
27918 }
27919 else if( optionMatch(z, "stmt") ){
27920 mType |= SQLITE_TRACE_STMT;
27921 }
27922 else if( optionMatch(z, "close") ){
27923 mType |= SQLITE_TRACE_CLOSE;
27924 }
27925 else {
27926 eputf("Unknown option \"%s\" on \".trace\"\n", z);
27927 rc = 1;
27928 goto meta_command_exit;
27929 }
27930 }else{
27931 output_file_close(p->traceOut);
27932 p->traceOut = output_file_open(z, 0);
27933 }
27934 }
27935 if( p->traceOut==0 ){
27936 sqlite3_trace_v2(p->db, 0, 0, 0);
27937 }else{
27938 if( mType==0 ) mType = SQLITE_TRACE_STMT;
27939 sqlite3_trace_v2(p->db, mType, sql_trace_callback, p);
27940 }
27941 }else
27942 #endif /* !defined(SQLITE_OMIT_TRACE) */
27943
27944 #if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_VIRTUALTABLE)
27945 if( c=='u' && cli_strncmp(azArg[0], "unmodule", n)==0 ){
27946 int ii;
27947 int lenOpt;
27948 char *zOpt;
27949 if( nArg<2 ){
27950 eputz("Usage: .unmodule [--allexcept] NAME ...\n");
27951 rc = 1;
27952 goto meta_command_exit;
27953 }
27954 open_db(p, 0);
27955 zOpt = azArg[1];
27956 if( zOpt[0]=='-' && zOpt[1]=='-' && zOpt[2]!=0 ) zOpt++;
27957 lenOpt = (int)strlen(zOpt);
27958 if( lenOpt>=3 && cli_strncmp(zOpt, "-allexcept",lenOpt)==0 ){
27959 assert( azArg[nArg]==0 );
27960 sqlite3_drop_modules(p->db, nArg>2 ? (const char**)(azArg+2) : 0);
27961 }else{
27962 for(ii=1; ii<nArg; ii++){
27963 sqlite3_create_module(p->db, azArg[ii], 0, 0);
27964 }
27965 }
27966 }else
27967 #endif
27968
27969 #if SQLITE_USER_AUTHENTICATION
27970 if( c=='u' && cli_strncmp(azArg[0], "user", n)==0 ){
27971 if( nArg<2 ){
27972 eputz("Usage: .user SUBCOMMAND ...\n");
27973 rc = 1;
27974 goto meta_command_exit;
27975 }
27976 open_db(p, 0);
27977 if( cli_strcmp(azArg[1],"login")==0 ){
27978 if( nArg!=4 ){
27979 eputz("Usage: .user login USER PASSWORD\n");
27980 rc = 1;
27981 goto meta_command_exit;
27982 }
27983 rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3],
27984 strlen30(azArg[3]));
27985 if( rc ){
27986 eputf("Authentication failed for user %s\n", azArg[2]);
27987 rc = 1;
27988 }
27989 }else if( cli_strcmp(azArg[1],"add")==0 ){
27990 if( nArg!=5 ){
27991 eputz("Usage: .user add USER PASSWORD ISADMIN\n");
27992 rc = 1;
27993 goto meta_command_exit;
27994 }
27995 rc = sqlite3_user_add(p->db, azArg[2], azArg[3], strlen30(azArg[3]),
27996 booleanValue(azArg[4]));
27997 if( rc ){
27998 eputf("User-Add failed: %d\n", rc);
27999 rc = 1;
28000 }
28001 }else if( cli_strcmp(azArg[1],"edit")==0 ){
28002 if( nArg!=5 ){
28003 eputz("Usage: .user edit USER PASSWORD ISADMIN\n");
28004 rc = 1;
28005 goto meta_command_exit;
28006 }
28007 rc = sqlite3_user_change(p->db, azArg[2], azArg[3], strlen30(azArg[3]),
28008 booleanValue(azArg[4]));
28009 if( rc ){
28010 eputf("User-Edit failed: %d\n", rc);
28011 rc = 1;
28012 }
28013 }else if( cli_strcmp(azArg[1],"delete")==0 ){
28014 if( nArg!=3 ){
28015 eputz("Usage: .user delete USER\n");
28016 rc = 1;
28017 goto meta_command_exit;
28018 }
28019 rc = sqlite3_user_delete(p->db, azArg[2]);
28020 if( rc ){
28021 eputf("User-Delete failed: %d\n", rc);
28022 rc = 1;
28023 }
28024 }else{
28025 eputz("Usage: .user login|add|edit|delete ...\n");
28026 rc = 1;
28027 goto meta_command_exit;
28028 }
28029 }else
28030 #endif /* SQLITE_USER_AUTHENTICATION */
28031
28032 if( c=='v' && cli_strncmp(azArg[0], "version", n)==0 ){
28033 char *zPtrSz = sizeof(void*)==8 ? "64-bit" : "32-bit";
28034 oputf("SQLite %s %s\n" /*extra-version-info*/,
28035 sqlite3_libversion(), sqlite3_sourceid());
28036 #if SQLITE_HAVE_ZLIB
28037 oputf("zlib version %s\n", zlibVersion());
28038 #endif
28039 #define CTIMEOPT_VAL_(opt) #opt
28040 #define CTIMEOPT_VAL(opt) CTIMEOPT_VAL_(opt)
28041 #if defined(__clang__) && defined(__clang_major__)
28042 oputf("clang-" CTIMEOPT_VAL(__clang_major__) "."
28043 CTIMEOPT_VAL(__clang_minor__) "."
28044 CTIMEOPT_VAL(__clang_patchlevel__) " (%s)\n", zPtrSz);
28045 #elif defined(_MSC_VER)
28046 oputf("msvc-" CTIMEOPT_VAL(_MSC_VER) " (%s)\n", zPtrSz);
28047 #elif defined(__GNUC__) && defined(__VERSION__)
28048 oputf("gcc-" __VERSION__ " (%s)\n", zPtrSz);
28049 #endif
28050 }else
28051
28052 if( c=='v' && cli_strncmp(azArg[0], "vfsinfo", n)==0 ){
28053 const char *zDbName = nArg==2 ? azArg[1] : "main";
28054 sqlite3_vfs *pVfs = 0;
28055 if( p->db ){
28056 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFS_POINTER, &pVfs);
28057 if( pVfs ){
28058 oputf("vfs.zName = \"%s\"\n", pVfs->zName);
28059 oputf("vfs.iVersion = %d\n", pVfs->iVersion);
28060 oputf("vfs.szOsFile = %d\n", pVfs->szOsFile);
28061 oputf("vfs.mxPathname = %d\n", pVfs->mxPathname);
28062 }
28063 }
28064 }else
28065
28066 if( c=='v' && cli_strncmp(azArg[0], "vfslist", n)==0 ){
28067 sqlite3_vfs *pVfs;
28068 sqlite3_vfs *pCurrent = 0;
28069 if( p->db ){
28070 sqlite3_file_control(p->db, "main", SQLITE_FCNTL_VFS_POINTER, &pCurrent);
28071 }
28072 for(pVfs=sqlite3_vfs_find(0); pVfs; pVfs=pVfs->pNext){
28073 oputf("vfs.zName = \"%s\"%s\n", pVfs->zName,
28074 pVfs==pCurrent ? " <--- CURRENT" : "");
28075 oputf("vfs.iVersion = %d\n", pVfs->iVersion);
28076 oputf("vfs.szOsFile = %d\n", pVfs->szOsFile);
28077 oputf("vfs.mxPathname = %d\n", pVfs->mxPathname);
28078 if( pVfs->pNext ){
28079 oputz("-----------------------------------\n");
28080 }
28081 }
28082 }else
28083
28084 if( c=='v' && cli_strncmp(azArg[0], "vfsname", n)==0 ){
28085 const char *zDbName = nArg==2 ? azArg[1] : "main";
28086 char *zVfsName = 0;
28087 if( p->db ){
28088 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
28089 if( zVfsName ){
28090 oputf("%s\n", zVfsName);
28091 sqlite3_free(zVfsName);
28092 }
28093 }
28094 }else
28095
28096 if( c=='w' && cli_strncmp(azArg[0], "wheretrace", n)==0 ){
28097 unsigned int x = nArg>=2? (unsigned int)integerValue(azArg[1]) : 0xffffffff;
28098 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &x);
28099 }else
28100
28101 if( c=='w' && cli_strncmp(azArg[0], "width", n)==0 ){
28102 int j;
28103 assert( nArg<=ArraySize(azArg) );
28104 p->nWidth = nArg-1;
28105 p->colWidth = realloc(p->colWidth, (p->nWidth+1)*sizeof(int)*2);
28106 if( p->colWidth==0 && p->nWidth>0 ) shell_out_of_memory();
28107 if( p->nWidth ) p->actualWidth = &p->colWidth[p->nWidth];
28108 for(j=1; j<nArg; j++){
28109 p->colWidth[j-1] = (int)integerValue(azArg[j]);
28110 }
28111 }else
28112
28113 {
28114 eputf("Error: unknown command or invalid arguments: "
28115 " \"%s\". Enter \".help\" for help\n", azArg[0]);
28116 rc = 1;
28117 }
28118
28119 meta_command_exit:
28120 if( p->outCount ){
28121 p->outCount--;
28122 if( p->outCount==0 ) output_reset(p);
28123 }
28124 p->bSafeMode = p->bSafeModePersist;
28125 return rc;
28126 }
28127
28128 /* Line scan result and intermediate states (supporting scan resumption)
28129 */
28130 #ifndef CHAR_BIT
28131 # define CHAR_BIT 8
28132 #endif
28133 typedef enum {
28134 QSS_HasDark = 1<<CHAR_BIT, QSS_EndingSemi = 2<<CHAR_BIT,
28135 QSS_CharMask = (1<<CHAR_BIT)-1, QSS_ScanMask = 3<<CHAR_BIT,
28136 QSS_Start = 0
28137 } QuickScanState;
28138 #define QSS_SETV(qss, newst) ((newst) | ((qss) & QSS_ScanMask))
28139 #define QSS_INPLAIN(qss) (((qss)&QSS_CharMask)==QSS_Start)
28140 #define QSS_PLAINWHITE(qss) (((qss)&~QSS_EndingSemi)==QSS_Start)
28141 #define QSS_PLAINDARK(qss) (((qss)&~QSS_EndingSemi)==QSS_HasDark)
28142 #define QSS_SEMITERM(qss) (((qss)&~QSS_HasDark)==QSS_EndingSemi)
28143
28144 /*
28145 ** Scan line for classification to guide shell's handling.
28146 ** The scan is resumable for subsequent lines when prior
28147 ** return values are passed as the 2nd argument.
28148 */
quickscan(char * zLine,QuickScanState qss,SCAN_TRACKER_REFTYPE pst)28149 static QuickScanState quickscan(char *zLine, QuickScanState qss,
28150 SCAN_TRACKER_REFTYPE pst){
28151 char cin;
28152 char cWait = (char)qss; /* intentional narrowing loss */
28153 if( cWait==0 ){
28154 PlainScan:
28155 assert( cWait==0 );
28156 while( (cin = *zLine++)!=0 ){
28157 if( IsSpace(cin) )
28158 continue;
28159 switch (cin){
28160 case '-':
28161 if( *zLine!='-' )
28162 break;
28163 while((cin = *++zLine)!=0 )
28164 if( cin=='\n')
28165 goto PlainScan;
28166 return qss;
28167 case ';':
28168 qss |= QSS_EndingSemi;
28169 continue;
28170 case '/':
28171 if( *zLine=='*' ){
28172 ++zLine;
28173 cWait = '*';
28174 CONTINUE_PROMPT_AWAITS(pst, "/*");
28175 qss = QSS_SETV(qss, cWait);
28176 goto TermScan;
28177 }
28178 break;
28179 case '[':
28180 cin = ']';
28181 deliberate_fall_through;
28182 case '`': case '\'': case '"':
28183 cWait = cin;
28184 qss = QSS_HasDark | cWait;
28185 CONTINUE_PROMPT_AWAITC(pst, cin);
28186 goto TermScan;
28187 case '(':
28188 CONTINUE_PAREN_INCR(pst, 1);
28189 break;
28190 case ')':
28191 CONTINUE_PAREN_INCR(pst, -1);
28192 break;
28193 default:
28194 break;
28195 }
28196 qss = (qss & ~QSS_EndingSemi) | QSS_HasDark;
28197 }
28198 }else{
28199 TermScan:
28200 while( (cin = *zLine++)!=0 ){
28201 if( cin==cWait ){
28202 switch( cWait ){
28203 case '*':
28204 if( *zLine != '/' )
28205 continue;
28206 ++zLine;
28207 cWait = 0;
28208 CONTINUE_PROMPT_AWAITC(pst, 0);
28209 qss = QSS_SETV(qss, 0);
28210 goto PlainScan;
28211 case '`': case '\'': case '"':
28212 if(*zLine==cWait){
28213 /* Swallow doubled end-delimiter.*/
28214 ++zLine;
28215 continue;
28216 }
28217 deliberate_fall_through;
28218 case ']':
28219 cWait = 0;
28220 CONTINUE_PROMPT_AWAITC(pst, 0);
28221 qss = QSS_SETV(qss, 0);
28222 goto PlainScan;
28223 default: assert(0);
28224 }
28225 }
28226 }
28227 }
28228 return qss;
28229 }
28230
28231 /*
28232 ** Return TRUE if the line typed in is an SQL command terminator other
28233 ** than a semi-colon. The SQL Server style "go" command is understood
28234 ** as is the Oracle "/".
28235 */
line_is_command_terminator(char * zLine)28236 static int line_is_command_terminator(char *zLine){
28237 while( IsSpace(zLine[0]) ){ zLine++; };
28238 if( zLine[0]=='/' )
28239 zLine += 1; /* Oracle */
28240 else if ( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o' )
28241 zLine += 2; /* SQL Server */
28242 else
28243 return 0;
28244 return quickscan(zLine, QSS_Start, 0)==QSS_Start;
28245 }
28246
28247 /*
28248 ** The CLI needs a working sqlite3_complete() to work properly. So error
28249 ** out of the build if compiling with SQLITE_OMIT_COMPLETE.
28250 */
28251 #ifdef SQLITE_OMIT_COMPLETE
28252 # error the CLI application is imcompatable with SQLITE_OMIT_COMPLETE.
28253 #endif
28254
28255 /*
28256 ** Return true if zSql is a complete SQL statement. Return false if it
28257 ** ends in the middle of a string literal or C-style comment.
28258 */
line_is_complete(char * zSql,int nSql)28259 static int line_is_complete(char *zSql, int nSql){
28260 int rc;
28261 if( zSql==0 ) return 1;
28262 zSql[nSql] = ';';
28263 zSql[nSql+1] = 0;
28264 rc = sqlite3_complete(zSql);
28265 zSql[nSql] = 0;
28266 return rc;
28267 }
28268
28269 /*
28270 ** This function is called after processing each line of SQL in the
28271 ** runOneSqlLine() function. Its purpose is to detect scenarios where
28272 ** defensive mode should be automatically turned off. Specifically, when
28273 **
28274 ** 1. The first line of input is "PRAGMA foreign_keys=OFF;",
28275 ** 2. The second line of input is "BEGIN TRANSACTION;",
28276 ** 3. The database is empty, and
28277 ** 4. The shell is not running in --safe mode.
28278 **
28279 ** The implementation uses the ShellState.eRestoreState to maintain state:
28280 **
28281 ** 0: Have not seen any SQL.
28282 ** 1: Have seen "PRAGMA foreign_keys=OFF;".
28283 ** 2-6: Currently running .dump transaction. If the "2" bit is set,
28284 ** disable DEFENSIVE when done. If "4" is set, disable DQS_DDL.
28285 ** 7: Nothing left to do. This function becomes a no-op.
28286 */
doAutoDetectRestore(ShellState * p,const char * zSql)28287 static int doAutoDetectRestore(ShellState *p, const char *zSql){
28288 int rc = SQLITE_OK;
28289
28290 if( p->eRestoreState<7 ){
28291 switch( p->eRestoreState ){
28292 case 0: {
28293 const char *zExpect = "PRAGMA foreign_keys=OFF;";
28294 assert( strlen(zExpect)==24 );
28295 if( p->bSafeMode==0 && memcmp(zSql, zExpect, 25)==0 ){
28296 p->eRestoreState = 1;
28297 }else{
28298 p->eRestoreState = 7;
28299 }
28300 break;
28301 };
28302
28303 case 1: {
28304 int bIsDump = 0;
28305 const char *zExpect = "BEGIN TRANSACTION;";
28306 assert( strlen(zExpect)==18 );
28307 if( memcmp(zSql, zExpect, 19)==0 ){
28308 /* Now check if the database is empty. */
28309 const char *zQuery = "SELECT 1 FROM sqlite_schema LIMIT 1";
28310 sqlite3_stmt *pStmt = 0;
28311
28312 bIsDump = 1;
28313 shellPrepare(p->db, &rc, zQuery, &pStmt);
28314 if( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
28315 bIsDump = 0;
28316 }
28317 shellFinalize(&rc, pStmt);
28318 }
28319 if( bIsDump && rc==SQLITE_OK ){
28320 int bDefense = 0;
28321 int bDqsDdl = 0;
28322 sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, -1, &bDefense);
28323 sqlite3_db_config(p->db, SQLITE_DBCONFIG_DQS_DDL, -1, &bDqsDdl);
28324 sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, 0, 0);
28325 sqlite3_db_config(p->db, SQLITE_DBCONFIG_DQS_DDL, 1, 0);
28326 p->eRestoreState = (bDefense ? 2 : 0) + (bDqsDdl ? 4 : 0);
28327 }else{
28328 p->eRestoreState = 7;
28329 }
28330 break;
28331 }
28332
28333 default: {
28334 if( sqlite3_get_autocommit(p->db) ){
28335 if( (p->eRestoreState & 2) ){
28336 sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, 1, 0);
28337 }
28338 if( (p->eRestoreState & 4) ){
28339 sqlite3_db_config(p->db, SQLITE_DBCONFIG_DQS_DDL, 0, 0);
28340 }
28341 p->eRestoreState = 7;
28342 }
28343 break;
28344 }
28345 }
28346 }
28347
28348 return rc;
28349 }
28350
28351 /*
28352 ** Run a single line of SQL. Return the number of errors.
28353 */
runOneSqlLine(ShellState * p,char * zSql,FILE * in,int startline)28354 static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){
28355 int rc;
28356 char *zErrMsg = 0;
28357
28358 open_db(p, 0);
28359 if( ShellHasFlag(p,SHFLG_Backslash) ) resolve_backslashes(zSql);
28360 if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0;
28361 BEGIN_TIMER;
28362 rc = shell_exec(p, zSql, &zErrMsg);
28363 END_TIMER;
28364 if( rc || zErrMsg ){
28365 char zPrefix[100];
28366 const char *zErrorTail;
28367 const char *zErrorType;
28368 if( zErrMsg==0 ){
28369 zErrorType = "Error";
28370 zErrorTail = sqlite3_errmsg(p->db);
28371 }else if( cli_strncmp(zErrMsg, "in prepare, ",12)==0 ){
28372 zErrorType = "Parse error";
28373 zErrorTail = &zErrMsg[12];
28374 }else if( cli_strncmp(zErrMsg, "stepping, ", 10)==0 ){
28375 zErrorType = "Runtime error";
28376 zErrorTail = &zErrMsg[10];
28377 }else{
28378 zErrorType = "Error";
28379 zErrorTail = zErrMsg;
28380 }
28381 if( in!=0 || !stdin_is_interactive ){
28382 sqlite3_snprintf(sizeof(zPrefix), zPrefix,
28383 "%s near line %d:", zErrorType, startline);
28384 }else{
28385 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "%s:", zErrorType);
28386 }
28387 eputf("%s %s\n", zPrefix, zErrorTail);
28388 sqlite3_free(zErrMsg);
28389 zErrMsg = 0;
28390 return 1;
28391 }else if( ShellHasFlag(p, SHFLG_CountChanges) ){
28392 char zLineBuf[2000];
28393 sqlite3_snprintf(sizeof(zLineBuf), zLineBuf,
28394 "changes: %lld total_changes: %lld",
28395 sqlite3_changes64(p->db), sqlite3_total_changes64(p->db));
28396 oputf("%s\n", zLineBuf);
28397 }
28398
28399 if( doAutoDetectRestore(p, zSql) ) return 1;
28400 return 0;
28401 }
28402
echo_group_input(ShellState * p,const char * zDo)28403 static void echo_group_input(ShellState *p, const char *zDo){
28404 if( ShellHasFlag(p, SHFLG_Echo) ) oputf("%s\n", zDo);
28405 }
28406
28407 #ifdef SQLITE_SHELL_FIDDLE
28408 /*
28409 ** Alternate one_input_line() impl for wasm mode. This is not in the primary
28410 ** impl because we need the global shellState and cannot access it from that
28411 ** function without moving lots of code around (creating a larger/messier diff).
28412 */
one_input_line(FILE * in,char * zPrior,int isContinuation)28413 static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
28414 /* Parse the next line from shellState.wasm.zInput. */
28415 const char *zBegin = shellState.wasm.zPos;
28416 const char *z = zBegin;
28417 char *zLine = 0;
28418 i64 nZ = 0;
28419
28420 UNUSED_PARAMETER(in);
28421 UNUSED_PARAMETER(isContinuation);
28422 if(!z || !*z){
28423 return 0;
28424 }
28425 while(*z && isspace(*z)) ++z;
28426 zBegin = z;
28427 for(; *z && '\n'!=*z; ++nZ, ++z){}
28428 if(nZ>0 && '\r'==zBegin[nZ-1]){
28429 --nZ;
28430 }
28431 shellState.wasm.zPos = z;
28432 zLine = realloc(zPrior, nZ+1);
28433 shell_check_oom(zLine);
28434 memcpy(zLine, zBegin, nZ);
28435 zLine[nZ] = 0;
28436 return zLine;
28437 }
28438 #endif /* SQLITE_SHELL_FIDDLE */
28439
28440 /*
28441 ** Read input from *in and process it. If *in==0 then input
28442 ** is interactive - the user is typing it it. Otherwise, input
28443 ** is coming from a file or device. A prompt is issued and history
28444 ** is saved only if input is interactive. An interrupt signal will
28445 ** cause this routine to exit immediately, unless input is interactive.
28446 **
28447 ** Return the number of errors.
28448 */
process_input(ShellState * p)28449 static int process_input(ShellState *p){
28450 char *zLine = 0; /* A single input line */
28451 char *zSql = 0; /* Accumulated SQL text */
28452 i64 nLine; /* Length of current line */
28453 i64 nSql = 0; /* Bytes of zSql[] used */
28454 i64 nAlloc = 0; /* Allocated zSql[] space */
28455 int rc; /* Error code */
28456 int errCnt = 0; /* Number of errors seen */
28457 i64 startline = 0; /* Line number for start of current input */
28458 QuickScanState qss = QSS_Start; /* Accumulated line status (so far) */
28459
28460 if( p->inputNesting==MAX_INPUT_NESTING ){
28461 /* This will be more informative in a later version. */
28462 eputf("Input nesting limit (%d) reached at line %d."
28463 " Check recursion.\n", MAX_INPUT_NESTING, p->lineno);
28464 return 1;
28465 }
28466 ++p->inputNesting;
28467 p->lineno = 0;
28468 CONTINUE_PROMPT_RESET;
28469 while( errCnt==0 || !bail_on_error || (p->in==0 && stdin_is_interactive) ){
28470 fflush(p->out);
28471 zLine = one_input_line(p->in, zLine, nSql>0);
28472 if( zLine==0 ){
28473 /* End of input */
28474 if( p->in==0 && stdin_is_interactive ) oputz("\n");
28475 break;
28476 }
28477 if( seenInterrupt ){
28478 if( p->in!=0 ) break;
28479 seenInterrupt = 0;
28480 }
28481 p->lineno++;
28482 if( QSS_INPLAIN(qss)
28483 && line_is_command_terminator(zLine)
28484 && line_is_complete(zSql, nSql) ){
28485 memcpy(zLine,";",2);
28486 }
28487 qss = quickscan(zLine, qss, CONTINUE_PROMPT_PSTATE);
28488 if( QSS_PLAINWHITE(qss) && nSql==0 ){
28489 /* Just swallow single-line whitespace */
28490 echo_group_input(p, zLine);
28491 qss = QSS_Start;
28492 continue;
28493 }
28494 if( zLine && (zLine[0]=='.' || zLine[0]=='#') && nSql==0 ){
28495 CONTINUE_PROMPT_RESET;
28496 echo_group_input(p, zLine);
28497 if( zLine[0]=='.' ){
28498 rc = do_meta_command(zLine, p);
28499 if( rc==2 ){ /* exit requested */
28500 break;
28501 }else if( rc ){
28502 errCnt++;
28503 }
28504 }
28505 qss = QSS_Start;
28506 continue;
28507 }
28508 /* No single-line dispositions remain; accumulate line(s). */
28509 nLine = strlen(zLine);
28510 if( nSql+nLine+2>=nAlloc ){
28511 /* Grow buffer by half-again increments when big. */
28512 nAlloc = nSql+(nSql>>1)+nLine+100;
28513 zSql = realloc(zSql, nAlloc);
28514 shell_check_oom(zSql);
28515 }
28516 if( nSql==0 ){
28517 i64 i;
28518 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
28519 assert( nAlloc>0 && zSql!=0 );
28520 memcpy(zSql, zLine+i, nLine+1-i);
28521 startline = p->lineno;
28522 nSql = nLine-i;
28523 }else{
28524 zSql[nSql++] = '\n';
28525 memcpy(zSql+nSql, zLine, nLine+1);
28526 nSql += nLine;
28527 }
28528 if( nSql && QSS_SEMITERM(qss) && sqlite3_complete(zSql) ){
28529 echo_group_input(p, zSql);
28530 errCnt += runOneSqlLine(p, zSql, p->in, startline);
28531 CONTINUE_PROMPT_RESET;
28532 nSql = 0;
28533 if( p->outCount ){
28534 output_reset(p);
28535 p->outCount = 0;
28536 }else{
28537 clearTempFile(p);
28538 }
28539 p->bSafeMode = p->bSafeModePersist;
28540 qss = QSS_Start;
28541 }else if( nSql && QSS_PLAINWHITE(qss) ){
28542 echo_group_input(p, zSql);
28543 nSql = 0;
28544 qss = QSS_Start;
28545 }
28546 }
28547 if( nSql ){
28548 /* This may be incomplete. Let the SQL parser deal with that. */
28549 echo_group_input(p, zSql);
28550 errCnt += runOneSqlLine(p, zSql, p->in, startline);
28551 CONTINUE_PROMPT_RESET;
28552 }
28553 free(zSql);
28554 free(zLine);
28555 --p->inputNesting;
28556 return errCnt>0;
28557 }
28558
28559 /*
28560 ** Return a pathname which is the user's home directory. A
28561 ** 0 return indicates an error of some kind.
28562 */
find_home_dir(int clearFlag)28563 static char *find_home_dir(int clearFlag){
28564 static char *home_dir = NULL;
28565 if( clearFlag ){
28566 free(home_dir);
28567 home_dir = 0;
28568 return 0;
28569 }
28570 if( home_dir ) return home_dir;
28571
28572 #if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) \
28573 && !defined(__RTP__) && !defined(_WRS_KERNEL) && !defined(SQLITE_WASI)
28574 {
28575 struct passwd *pwent;
28576 uid_t uid = getuid();
28577 if( (pwent=getpwuid(uid)) != NULL) {
28578 home_dir = pwent->pw_dir;
28579 }
28580 }
28581 #endif
28582
28583 #if defined(_WIN32_WCE)
28584 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
28585 */
28586 home_dir = "/";
28587 #else
28588
28589 #if defined(_WIN32) || defined(WIN32)
28590 if (!home_dir) {
28591 home_dir = getenv("USERPROFILE");
28592 }
28593 #endif
28594
28595 if (!home_dir) {
28596 home_dir = getenv("HOME");
28597 }
28598
28599 #if defined(_WIN32) || defined(WIN32)
28600 if (!home_dir) {
28601 char *zDrive, *zPath;
28602 int n;
28603 zDrive = getenv("HOMEDRIVE");
28604 zPath = getenv("HOMEPATH");
28605 if( zDrive && zPath ){
28606 n = strlen30(zDrive) + strlen30(zPath) + 1;
28607 home_dir = malloc( n );
28608 if( home_dir==0 ) return 0;
28609 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
28610 return home_dir;
28611 }
28612 home_dir = "c:\\";
28613 }
28614 #endif
28615
28616 #endif /* !_WIN32_WCE */
28617
28618 if( home_dir ){
28619 i64 n = strlen(home_dir) + 1;
28620 char *z = malloc( n );
28621 if( z ) memcpy(z, home_dir, n);
28622 home_dir = z;
28623 }
28624
28625 return home_dir;
28626 }
28627
28628 /*
28629 ** On non-Windows platforms, look for $XDG_CONFIG_HOME.
28630 ** If ${XDG_CONFIG_HOME}/sqlite3/sqliterc is found, return
28631 ** the path to it, else return 0. The result is cached for
28632 ** subsequent calls.
28633 */
find_xdg_config(void)28634 static const char *find_xdg_config(void){
28635 #if defined(_WIN32) || defined(WIN32) || defined(_WIN32_WCE) \
28636 || defined(__RTP__) || defined(_WRS_KERNEL)
28637 return 0;
28638 #else
28639 static int alreadyTried = 0;
28640 static char *zConfig = 0;
28641 const char *zXdgHome;
28642
28643 if( alreadyTried!=0 ){
28644 return zConfig;
28645 }
28646 alreadyTried = 1;
28647 zXdgHome = getenv("XDG_CONFIG_HOME");
28648 if( zXdgHome==0 ){
28649 return 0;
28650 }
28651 zConfig = sqlite3_mprintf("%s/sqlite3/sqliterc", zXdgHome);
28652 shell_check_oom(zConfig);
28653 if( access(zConfig,0)!=0 ){
28654 sqlite3_free(zConfig);
28655 zConfig = 0;
28656 }
28657 return zConfig;
28658 #endif
28659 }
28660
28661 /*
28662 ** Read input from the file given by sqliterc_override. Or if that
28663 ** parameter is NULL, take input from the first of find_xdg_config()
28664 ** or ~/.sqliterc which is found.
28665 **
28666 ** Returns the number of errors.
28667 */
process_sqliterc(ShellState * p,const char * sqliterc_override)28668 static void process_sqliterc(
28669 ShellState *p, /* Configuration data */
28670 const char *sqliterc_override /* Name of config file. NULL to use default */
28671 ){
28672 char *home_dir = NULL;
28673 const char *sqliterc = sqliterc_override;
28674 char *zBuf = 0;
28675 FILE *inSaved = p->in;
28676 int savedLineno = p->lineno;
28677
28678 if( sqliterc == NULL ){
28679 sqliterc = find_xdg_config();
28680 }
28681 if( sqliterc == NULL ){
28682 home_dir = find_home_dir(0);
28683 if( home_dir==0 ){
28684 eputz("-- warning: cannot find home directory;"
28685 " cannot read ~/.sqliterc\n");
28686 return;
28687 }
28688 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
28689 shell_check_oom(zBuf);
28690 sqliterc = zBuf;
28691 }
28692 p->in = fopen(sqliterc,"rb");
28693 if( p->in ){
28694 if( stdin_is_interactive ){
28695 eputf("-- Loading resources from %s\n", sqliterc);
28696 }
28697 if( process_input(p) && bail_on_error ) exit(1);
28698 fclose(p->in);
28699 }else if( sqliterc_override!=0 ){
28700 eputf("cannot open: \"%s\"\n", sqliterc);
28701 if( bail_on_error ) exit(1);
28702 }
28703 p->in = inSaved;
28704 p->lineno = savedLineno;
28705 sqlite3_free(zBuf);
28706 }
28707
28708 /*
28709 ** Show available command line options
28710 */
28711 static const char zOptions[] =
28712 " -- treat no subsequent arguments as options\n"
28713 #if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE)
28714 " -A ARGS... run \".archive ARGS\" and exit\n"
28715 #endif
28716 " -append append the database to the end of the file\n"
28717 " -ascii set output mode to 'ascii'\n"
28718 " -bail stop after hitting an error\n"
28719 " -batch force batch I/O\n"
28720 " -box set output mode to 'box'\n"
28721 " -column set output mode to 'column'\n"
28722 " -cmd COMMAND run \"COMMAND\" before reading stdin\n"
28723 " -csv set output mode to 'csv'\n"
28724 #if !defined(SQLITE_OMIT_DESERIALIZE)
28725 " -deserialize open the database using sqlite3_deserialize()\n"
28726 #endif
28727 " -echo print inputs before execution\n"
28728 " -init FILENAME read/process named file\n"
28729 " -[no]header turn headers on or off\n"
28730 #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
28731 " -heap SIZE Size of heap for memsys3 or memsys5\n"
28732 #endif
28733 " -help show this message\n"
28734 " -html set output mode to HTML\n"
28735 " -interactive force interactive I/O\n"
28736 " -json set output mode to 'json'\n"
28737 " -line set output mode to 'line'\n"
28738 " -list set output mode to 'list'\n"
28739 " -lookaside SIZE N use N entries of SZ bytes for lookaside memory\n"
28740 " -markdown set output mode to 'markdown'\n"
28741 #if !defined(SQLITE_OMIT_DESERIALIZE)
28742 " -maxsize N maximum size for a --deserialize database\n"
28743 #endif
28744 " -memtrace trace all memory allocations and deallocations\n"
28745 " -mmap N default mmap size set to N\n"
28746 #ifdef SQLITE_ENABLE_MULTIPLEX
28747 " -multiplex enable the multiplexor VFS\n"
28748 #endif
28749 " -newline SEP set output row separator. Default: '\\n'\n"
28750 " -nofollow refuse to open symbolic links to database files\n"
28751 " -nonce STRING set the safe-mode escape nonce\n"
28752 " -nullvalue TEXT set text string for NULL values. Default ''\n"
28753 " -pagecache SIZE N use N slots of SZ bytes each for page cache memory\n"
28754 " -pcachetrace trace all page cache operations\n"
28755 " -quote set output mode to 'quote'\n"
28756 " -readonly open the database read-only\n"
28757 " -safe enable safe-mode\n"
28758 " -separator SEP set output column separator. Default: '|'\n"
28759 #ifdef SQLITE_ENABLE_SORTER_REFERENCES
28760 " -sorterref SIZE sorter references threshold size\n"
28761 #endif
28762 " -stats print memory stats before each finalize\n"
28763 " -table set output mode to 'table'\n"
28764 " -tabs set output mode to 'tabs'\n"
28765 " -unsafe-testing allow unsafe commands and modes for testing\n"
28766 " -version show SQLite version\n"
28767 " -vfs NAME use NAME as the default VFS\n"
28768 #ifdef SQLITE_ENABLE_VFSTRACE
28769 " -vfstrace enable tracing of all VFS calls\n"
28770 #endif
28771 #ifdef SQLITE_HAVE_ZLIB
28772 " -zip open the file as a ZIP Archive\n"
28773 #endif
28774 ;
usage(int showDetail)28775 static void usage(int showDetail){
28776 eputf("Usage: %s [OPTIONS] [FILENAME [SQL]]\n"
28777 "FILENAME is the name of an SQLite database. A new database is created\n"
28778 "if the file does not previously exist. Defaults to :memory:.\n", Argv0);
28779 if( showDetail ){
28780 eputf("OPTIONS include:\n%s", zOptions);
28781 }else{
28782 eputz("Use the -help option for additional information\n");
28783 }
28784 exit(1);
28785 }
28786
28787 /*
28788 ** Internal check: Verify that the SQLite is uninitialized. Print a
28789 ** error message if it is initialized.
28790 */
verify_uninitialized(void)28791 static void verify_uninitialized(void){
28792 if( sqlite3_config(-1)==SQLITE_MISUSE ){
28793 sputz(stdout, "WARNING: attempt to configure SQLite after"
28794 " initialization.\n");
28795 }
28796 }
28797
28798 /*
28799 ** Initialize the state information in data
28800 */
main_init(ShellState * data)28801 static void main_init(ShellState *data) {
28802 memset(data, 0, sizeof(*data));
28803 data->normalMode = data->cMode = data->mode = MODE_List;
28804 data->autoExplain = 1;
28805 data->pAuxDb = &data->aAuxDb[0];
28806 memcpy(data->colSeparator,SEP_Column, 2);
28807 memcpy(data->rowSeparator,SEP_Row, 2);
28808 data->showHeader = 0;
28809 data->shellFlgs = SHFLG_Lookaside;
28810 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
28811 #if !defined(SQLITE_SHELL_FIDDLE)
28812 verify_uninitialized();
28813 #endif
28814 sqlite3_config(SQLITE_CONFIG_URI, 1);
28815 sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
28816 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
28817 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> ");
28818 }
28819
28820 /*
28821 ** Output text to the console in a font that attracts extra attention.
28822 */
28823 #if defined(_WIN32) || defined(WIN32)
printBold(const char * zText)28824 static void printBold(const char *zText){
28825 #if !SQLITE_OS_WINRT
28826 HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
28827 CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
28828 GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
28829 SetConsoleTextAttribute(out,
28830 FOREGROUND_RED|FOREGROUND_INTENSITY
28831 );
28832 #endif
28833 sputz(stdout, zText);
28834 #if !SQLITE_OS_WINRT
28835 SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
28836 #endif
28837 }
28838 #else
printBold(const char * zText)28839 static void printBold(const char *zText){
28840 sputf(stdout, "\033[1m%s\033[0m", zText);
28841 }
28842 #endif
28843
28844 /*
28845 ** Get the argument to an --option. Throw an error and die if no argument
28846 ** is available.
28847 */
cmdline_option_value(int argc,char ** argv,int i)28848 static char *cmdline_option_value(int argc, char **argv, int i){
28849 if( i==argc ){
28850 eputf("%s: Error: missing argument to %s\n", argv[0], argv[argc-1]);
28851 exit(1);
28852 }
28853 return argv[i];
28854 }
28855
sayAbnormalExit(void)28856 static void sayAbnormalExit(void){
28857 if( seenInterrupt ) eputz("Program interrupted.\n");
28858 }
28859
28860 #ifndef SQLITE_SHELL_IS_UTF8
28861 # if (defined(_WIN32) || defined(WIN32)) \
28862 && (defined(_MSC_VER) || (defined(UNICODE) && defined(__GNUC__)))
28863 # define SQLITE_SHELL_IS_UTF8 (0)
28864 # else
28865 # define SQLITE_SHELL_IS_UTF8 (1)
28866 # endif
28867 #endif
28868
28869 #ifdef SQLITE_SHELL_FIDDLE
28870 # define main fiddle_main
28871 #endif
28872
28873 #if SQLITE_SHELL_IS_UTF8
main(int argc,char ** argv)28874 int SQLITE_CDECL main(int argc, char **argv){
28875 #else
28876 int SQLITE_CDECL wmain(int argc, wchar_t **wargv){
28877 char **argv;
28878 #endif
28879 #ifdef SQLITE_DEBUG
28880 sqlite3_int64 mem_main_enter = 0;
28881 #endif
28882 char *zErrMsg = 0;
28883 #ifdef SQLITE_SHELL_FIDDLE
28884 # define data shellState
28885 #else
28886 ShellState data;
28887 StreamsAreConsole consStreams = SAC_NoConsole;
28888 #endif
28889 const char *zInitFile = 0;
28890 int i;
28891 int rc = 0;
28892 int warnInmemoryDb = 0;
28893 int readStdin = 1;
28894 int nCmd = 0;
28895 int nOptsEnd = argc;
28896 char **azCmd = 0;
28897 const char *zVfs = 0; /* Value of -vfs command-line option */
28898 #if !SQLITE_SHELL_IS_UTF8
28899 char **argvToFree = 0;
28900 int argcToFree = 0;
28901 #endif
28902 setvbuf(stderr, 0, _IONBF, 0); /* Make sure stderr is unbuffered */
28903
28904 #ifdef SQLITE_SHELL_FIDDLE
28905 stdin_is_interactive = 0;
28906 stdout_is_console = 1;
28907 data.wasm.zDefaultDbName = "/fiddle.sqlite3";
28908 #else
28909 consStreams = consoleClassifySetup(stdin, stdout, stderr);
28910 stdin_is_interactive = (consStreams & SAC_InConsole)!=0;
28911 stdout_is_console = (consStreams & SAC_OutConsole)!=0;
28912 atexit(consoleRestore);
28913 #endif
28914 atexit(sayAbnormalExit);
28915 #ifdef SQLITE_DEBUG
28916 mem_main_enter = sqlite3_memory_used();
28917 #endif
28918 #if !defined(_WIN32_WCE)
28919 if( getenv("SQLITE_DEBUG_BREAK") ){
28920 if( isatty(0) && isatty(2) ){
28921 eputf("attach debugger to process %d and press any key to continue.\n",
28922 GETPID());
28923 fgetc(stdin);
28924 }else{
28925 #if defined(_WIN32) || defined(WIN32)
28926 #if SQLITE_OS_WINRT
28927 __debugbreak();
28928 #else
28929 DebugBreak();
28930 #endif
28931 #elif defined(SIGTRAP)
28932 raise(SIGTRAP);
28933 #endif
28934 }
28935 }
28936 #endif
28937 /* Register a valid signal handler early, before much else is done. */
28938 #ifdef SIGINT
28939 signal(SIGINT, interrupt_handler);
28940 #elif (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE)
28941 if( !SetConsoleCtrlHandler(ConsoleCtrlHandler, TRUE) ){
28942 eputz("No ^C handler.\n");
28943 }
28944 #endif
28945
28946 #if USE_SYSTEM_SQLITE+0!=1
28947 if( cli_strncmp(sqlite3_sourceid(),SQLITE_SOURCE_ID,60)!=0 ){
28948 eputf("SQLite header and source version mismatch\n%s\n%s\n",
28949 sqlite3_sourceid(), SQLITE_SOURCE_ID);
28950 exit(1);
28951 }
28952 #endif
28953 main_init(&data);
28954
28955 /* On Windows, we must translate command-line arguments into UTF-8.
28956 ** The SQLite memory allocator subsystem has to be enabled in order to
28957 ** do this. But we want to run an sqlite3_shutdown() afterwards so that
28958 ** subsequent sqlite3_config() calls will work. So copy all results into
28959 ** memory that does not come from the SQLite memory allocator.
28960 */
28961 #if !SQLITE_SHELL_IS_UTF8
28962 sqlite3_initialize();
28963 argvToFree = malloc(sizeof(argv[0])*argc*2);
28964 shell_check_oom(argvToFree);
28965 argcToFree = argc;
28966 argv = argvToFree + argc;
28967 for(i=0; i<argc; i++){
28968 char *z = sqlite3_win32_unicode_to_utf8(wargv[i]);
28969 i64 n;
28970 shell_check_oom(z);
28971 n = strlen(z);
28972 argv[i] = malloc( n+1 );
28973 shell_check_oom(argv[i]);
28974 memcpy(argv[i], z, n+1);
28975 argvToFree[i] = argv[i];
28976 sqlite3_free(z);
28977 }
28978 sqlite3_shutdown();
28979 #endif
28980
28981 assert( argc>=1 && argv && argv[0] );
28982 Argv0 = argv[0];
28983
28984 #ifdef SQLITE_SHELL_DBNAME_PROC
28985 {
28986 /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name
28987 ** of a C-function that will provide the name of the database file. Use
28988 ** this compile-time option to embed this shell program in larger
28989 ** applications. */
28990 extern void SQLITE_SHELL_DBNAME_PROC(const char**);
28991 SQLITE_SHELL_DBNAME_PROC(&data.pAuxDb->zDbFilename);
28992 warnInmemoryDb = 0;
28993 }
28994 #endif
28995
28996 /* Do an initial pass through the command-line argument to locate
28997 ** the name of the database file, the name of the initialization file,
28998 ** the size of the alternative malloc heap, options affecting commands
28999 ** or SQL run from the command line, and the first command to execute.
29000 */
29001 #ifndef SQLITE_SHELL_FIDDLE
29002 verify_uninitialized();
29003 #endif
29004 for(i=1; i<argc; i++){
29005 char *z;
29006 z = argv[i];
29007 if( z[0]!='-' || i>nOptsEnd ){
29008 if( data.aAuxDb->zDbFilename==0 ){
29009 data.aAuxDb->zDbFilename = z;
29010 }else{
29011 /* Excess arguments are interpreted as SQL (or dot-commands) and
29012 ** mean that nothing is read from stdin */
29013 readStdin = 0;
29014 nCmd++;
29015 azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd);
29016 shell_check_oom(azCmd);
29017 azCmd[nCmd-1] = z;
29018 }
29019 continue;
29020 }
29021 if( z[1]=='-' ) z++;
29022 if( cli_strcmp(z, "-")==0 ){
29023 nOptsEnd = i;
29024 continue;
29025 }else if( cli_strcmp(z,"-separator")==0
29026 || cli_strcmp(z,"-nullvalue")==0
29027 || cli_strcmp(z,"-newline")==0
29028 || cli_strcmp(z,"-cmd")==0
29029 ){
29030 (void)cmdline_option_value(argc, argv, ++i);
29031 }else if( cli_strcmp(z,"-init")==0 ){
29032 zInitFile = cmdline_option_value(argc, argv, ++i);
29033 }else if( cli_strcmp(z,"-interactive")==0 ){
29034 }else if( cli_strcmp(z,"-batch")==0 ){
29035 /* Need to check for batch mode here to so we can avoid printing
29036 ** informational messages (like from process_sqliterc) before
29037 ** we do the actual processing of arguments later in a second pass.
29038 */
29039 stdin_is_interactive = 0;
29040 }else if( cli_strcmp(z,"-utf8")==0 ){
29041 }else if( cli_strcmp(z,"-no-utf8")==0 ){
29042 }else if( cli_strcmp(z,"-heap")==0 ){
29043 #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
29044 const char *zSize;
29045 sqlite3_int64 szHeap;
29046
29047 zSize = cmdline_option_value(argc, argv, ++i);
29048 szHeap = integerValue(zSize);
29049 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
29050 verify_uninitialized();
29051 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
29052 #else
29053 (void)cmdline_option_value(argc, argv, ++i);
29054 #endif
29055 }else if( cli_strcmp(z,"-pagecache")==0 ){
29056 sqlite3_int64 n, sz;
29057 sz = integerValue(cmdline_option_value(argc,argv,++i));
29058 if( sz>70000 ) sz = 70000;
29059 if( sz<0 ) sz = 0;
29060 n = integerValue(cmdline_option_value(argc,argv,++i));
29061 if( sz>0 && n>0 && 0xffffffffffffLL/sz<n ){
29062 n = 0xffffffffffffLL/sz;
29063 }
29064 verify_uninitialized();
29065 sqlite3_config(SQLITE_CONFIG_PAGECACHE,
29066 (n>0 && sz>0) ? malloc(n*sz) : 0, sz, n);
29067 data.shellFlgs |= SHFLG_Pagecache;
29068 }else if( cli_strcmp(z,"-lookaside")==0 ){
29069 int n, sz;
29070 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
29071 if( sz<0 ) sz = 0;
29072 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
29073 if( n<0 ) n = 0;
29074 verify_uninitialized();
29075 sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n);
29076 if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside;
29077 }else if( cli_strcmp(z,"-threadsafe")==0 ){
29078 int n;
29079 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
29080 verify_uninitialized();
29081 switch( n ){
29082 case 0: sqlite3_config(SQLITE_CONFIG_SINGLETHREAD); break;
29083 case 2: sqlite3_config(SQLITE_CONFIG_MULTITHREAD); break;
29084 default: sqlite3_config(SQLITE_CONFIG_SERIALIZED); break;
29085 }
29086 #ifdef SQLITE_ENABLE_VFSTRACE
29087 }else if( cli_strcmp(z,"-vfstrace")==0 ){
29088 extern int vfstrace_register(
29089 const char *zTraceName,
29090 const char *zOldVfsName,
29091 int (*xOut)(const char*,void*),
29092 void *pOutArg,
29093 int makeDefault
29094 );
29095 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
29096 #endif
29097 #ifdef SQLITE_ENABLE_MULTIPLEX
29098 }else if( cli_strcmp(z,"-multiplex")==0 ){
29099 extern int sqlite3_multiplex_initialize(const char*,int);
29100 sqlite3_multiplex_initialize(0, 1);
29101 #endif
29102 }else if( cli_strcmp(z,"-mmap")==0 ){
29103 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
29104 verify_uninitialized();
29105 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
29106 #if defined(SQLITE_ENABLE_SORTER_REFERENCES)
29107 }else if( cli_strcmp(z,"-sorterref")==0 ){
29108 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
29109 verify_uninitialized();
29110 sqlite3_config(SQLITE_CONFIG_SORTERREF_SIZE, (int)sz);
29111 #endif
29112 }else if( cli_strcmp(z,"-vfs")==0 ){
29113 zVfs = cmdline_option_value(argc, argv, ++i);
29114 #ifdef SQLITE_HAVE_ZLIB
29115 }else if( cli_strcmp(z,"-zip")==0 ){
29116 data.openMode = SHELL_OPEN_ZIPFILE;
29117 #endif
29118 }else if( cli_strcmp(z,"-append")==0 ){
29119 data.openMode = SHELL_OPEN_APPENDVFS;
29120 #ifndef SQLITE_OMIT_DESERIALIZE
29121 }else if( cli_strcmp(z,"-deserialize")==0 ){
29122 data.openMode = SHELL_OPEN_DESERIALIZE;
29123 }else if( cli_strcmp(z,"-maxsize")==0 && i+1<argc ){
29124 data.szMax = integerValue(argv[++i]);
29125 #endif
29126 }else if( cli_strcmp(z,"-readonly")==0 ){
29127 data.openMode = SHELL_OPEN_READONLY;
29128 }else if( cli_strcmp(z,"-nofollow")==0 ){
29129 data.openFlags = SQLITE_OPEN_NOFOLLOW;
29130 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
29131 }else if( cli_strncmp(z, "-A",2)==0 ){
29132 /* All remaining command-line arguments are passed to the ".archive"
29133 ** command, so ignore them */
29134 break;
29135 #endif
29136 }else if( cli_strcmp(z, "-memtrace")==0 ){
29137 sqlite3MemTraceActivate(stderr);
29138 }else if( cli_strcmp(z, "-pcachetrace")==0 ){
29139 sqlite3PcacheTraceActivate(stderr);
29140 }else if( cli_strcmp(z,"-bail")==0 ){
29141 bail_on_error = 1;
29142 }else if( cli_strcmp(z,"-nonce")==0 ){
29143 free(data.zNonce);
29144 data.zNonce = strdup(cmdline_option_value(argc, argv, ++i));
29145 }else if( cli_strcmp(z,"-unsafe-testing")==0 ){
29146 ShellSetFlag(&data,SHFLG_TestingMode);
29147 }else if( cli_strcmp(z,"-safe")==0 ){
29148 /* no-op - catch this on the second pass */
29149 }
29150 }
29151 #ifndef SQLITE_SHELL_FIDDLE
29152 verify_uninitialized();
29153 #endif
29154
29155
29156 #ifdef SQLITE_SHELL_INIT_PROC
29157 {
29158 /* If the SQLITE_SHELL_INIT_PROC macro is defined, then it is the name
29159 ** of a C-function that will perform initialization actions on SQLite that
29160 ** occur just before or after sqlite3_initialize(). Use this compile-time
29161 ** option to embed this shell program in larger applications. */
29162 extern void SQLITE_SHELL_INIT_PROC(void);
29163 SQLITE_SHELL_INIT_PROC();
29164 }
29165 #else
29166 /* All the sqlite3_config() calls have now been made. So it is safe
29167 ** to call sqlite3_initialize() and process any command line -vfs option. */
29168 sqlite3_initialize();
29169 #endif
29170
29171 if( zVfs ){
29172 sqlite3_vfs *pVfs = sqlite3_vfs_find(zVfs);
29173 if( pVfs ){
29174 sqlite3_vfs_register(pVfs, 1);
29175 }else{
29176 eputf("no such VFS: \"%s\"\n", zVfs);
29177 exit(1);
29178 }
29179 }
29180
29181 if( data.pAuxDb->zDbFilename==0 ){
29182 #ifndef SQLITE_OMIT_MEMORYDB
29183 data.pAuxDb->zDbFilename = ":memory:";
29184 warnInmemoryDb = argc==1;
29185 #else
29186 eputf("%s: Error: no database filename specified\n", Argv0);
29187 return 1;
29188 #endif
29189 }
29190 data.out = stdout;
29191 #ifndef SQLITE_SHELL_FIDDLE
29192 sqlite3_appendvfs_init(0,0,0);
29193 #endif
29194
29195 /* Go ahead and open the database file if it already exists. If the
29196 ** file does not exist, delay opening it. This prevents empty database
29197 ** files from being created if a user mistypes the database name argument
29198 ** to the sqlite command-line tool.
29199 */
29200 if( access(data.pAuxDb->zDbFilename, 0)==0 ){
29201 open_db(&data, 0);
29202 }
29203
29204 /* Process the initialization file if there is one. If no -init option
29205 ** is given on the command line, look for a file named ~/.sqliterc and
29206 ** try to process it.
29207 */
29208 process_sqliterc(&data,zInitFile);
29209
29210 /* Make a second pass through the command-line argument and set
29211 ** options. This second pass is delayed until after the initialization
29212 ** file is processed so that the command-line arguments will override
29213 ** settings in the initialization file.
29214 */
29215 for(i=1; i<argc; i++){
29216 char *z = argv[i];
29217 if( z[0]!='-' || i>=nOptsEnd ) continue;
29218 if( z[1]=='-' ){ z++; }
29219 if( cli_strcmp(z,"-init")==0 ){
29220 i++;
29221 }else if( cli_strcmp(z,"-html")==0 ){
29222 data.mode = MODE_Html;
29223 }else if( cli_strcmp(z,"-list")==0 ){
29224 data.mode = MODE_List;
29225 }else if( cli_strcmp(z,"-quote")==0 ){
29226 data.mode = MODE_Quote;
29227 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Comma);
29228 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Row);
29229 }else if( cli_strcmp(z,"-line")==0 ){
29230 data.mode = MODE_Line;
29231 }else if( cli_strcmp(z,"-column")==0 ){
29232 data.mode = MODE_Column;
29233 }else if( cli_strcmp(z,"-json")==0 ){
29234 data.mode = MODE_Json;
29235 }else if( cli_strcmp(z,"-markdown")==0 ){
29236 data.mode = MODE_Markdown;
29237 }else if( cli_strcmp(z,"-table")==0 ){
29238 data.mode = MODE_Table;
29239 }else if( cli_strcmp(z,"-box")==0 ){
29240 data.mode = MODE_Box;
29241 }else if( cli_strcmp(z,"-csv")==0 ){
29242 data.mode = MODE_Csv;
29243 memcpy(data.colSeparator,",",2);
29244 #ifdef SQLITE_HAVE_ZLIB
29245 }else if( cli_strcmp(z,"-zip")==0 ){
29246 data.openMode = SHELL_OPEN_ZIPFILE;
29247 #endif
29248 }else if( cli_strcmp(z,"-append")==0 ){
29249 data.openMode = SHELL_OPEN_APPENDVFS;
29250 #ifndef SQLITE_OMIT_DESERIALIZE
29251 }else if( cli_strcmp(z,"-deserialize")==0 ){
29252 data.openMode = SHELL_OPEN_DESERIALIZE;
29253 }else if( cli_strcmp(z,"-maxsize")==0 && i+1<argc ){
29254 data.szMax = integerValue(argv[++i]);
29255 #endif
29256 }else if( cli_strcmp(z,"-readonly")==0 ){
29257 data.openMode = SHELL_OPEN_READONLY;
29258 }else if( cli_strcmp(z,"-nofollow")==0 ){
29259 data.openFlags |= SQLITE_OPEN_NOFOLLOW;
29260 }else if( cli_strcmp(z,"-ascii")==0 ){
29261 data.mode = MODE_Ascii;
29262 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,SEP_Unit);
29263 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,SEP_Record);
29264 }else if( cli_strcmp(z,"-tabs")==0 ){
29265 data.mode = MODE_List;
29266 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,SEP_Tab);
29267 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,SEP_Row);
29268 }else if( cli_strcmp(z,"-separator")==0 ){
29269 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
29270 "%s",cmdline_option_value(argc,argv,++i));
29271 }else if( cli_strcmp(z,"-newline")==0 ){
29272 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
29273 "%s",cmdline_option_value(argc,argv,++i));
29274 }else if( cli_strcmp(z,"-nullvalue")==0 ){
29275 sqlite3_snprintf(sizeof(data.nullValue), data.nullValue,
29276 "%s",cmdline_option_value(argc,argv,++i));
29277 }else if( cli_strcmp(z,"-header")==0 ){
29278 data.showHeader = 1;
29279 ShellSetFlag(&data, SHFLG_HeaderSet);
29280 }else if( cli_strcmp(z,"-noheader")==0 ){
29281 data.showHeader = 0;
29282 ShellSetFlag(&data, SHFLG_HeaderSet);
29283 }else if( cli_strcmp(z,"-echo")==0 ){
29284 ShellSetFlag(&data, SHFLG_Echo);
29285 }else if( cli_strcmp(z,"-eqp")==0 ){
29286 data.autoEQP = AUTOEQP_on;
29287 }else if( cli_strcmp(z,"-eqpfull")==0 ){
29288 data.autoEQP = AUTOEQP_full;
29289 }else if( cli_strcmp(z,"-stats")==0 ){
29290 data.statsOn = 1;
29291 }else if( cli_strcmp(z,"-scanstats")==0 ){
29292 data.scanstatsOn = 1;
29293 }else if( cli_strcmp(z,"-backslash")==0 ){
29294 /* Undocumented command-line option: -backslash
29295 ** Causes C-style backslash escapes to be evaluated in SQL statements
29296 ** prior to sending the SQL into SQLite. Useful for injecting
29297 ** crazy bytes in the middle of SQL statements for testing and debugging.
29298 */
29299 ShellSetFlag(&data, SHFLG_Backslash);
29300 }else if( cli_strcmp(z,"-bail")==0 ){
29301 /* No-op. The bail_on_error flag should already be set. */
29302 }else if( cli_strcmp(z,"-version")==0 ){
29303 sputf(stdout, "%s %s (%d-bit)\n",
29304 sqlite3_libversion(), sqlite3_sourceid(), 8*(int)sizeof(char*));
29305 return 0;
29306 }else if( cli_strcmp(z,"-interactive")==0 ){
29307 /* Need to check for interactive override here to so that it can
29308 ** affect console setup (for Windows only) and testing thereof.
29309 */
29310 stdin_is_interactive = 1;
29311 }else if( cli_strcmp(z,"-batch")==0 ){
29312 /* already handled */
29313 }else if( cli_strcmp(z,"-utf8")==0 ){
29314 /* already handled */
29315 }else if( cli_strcmp(z,"-no-utf8")==0 ){
29316 /* already handled */
29317 }else if( cli_strcmp(z,"-heap")==0 ){
29318 i++;
29319 }else if( cli_strcmp(z,"-pagecache")==0 ){
29320 i+=2;
29321 }else if( cli_strcmp(z,"-lookaside")==0 ){
29322 i+=2;
29323 }else if( cli_strcmp(z,"-threadsafe")==0 ){
29324 i+=2;
29325 }else if( cli_strcmp(z,"-nonce")==0 ){
29326 i += 2;
29327 }else if( cli_strcmp(z,"-mmap")==0 ){
29328 i++;
29329 }else if( cli_strcmp(z,"-memtrace")==0 ){
29330 i++;
29331 }else if( cli_strcmp(z,"-pcachetrace")==0 ){
29332 i++;
29333 #ifdef SQLITE_ENABLE_SORTER_REFERENCES
29334 }else if( cli_strcmp(z,"-sorterref")==0 ){
29335 i++;
29336 #endif
29337 }else if( cli_strcmp(z,"-vfs")==0 ){
29338 i++;
29339 #ifdef SQLITE_ENABLE_VFSTRACE
29340 }else if( cli_strcmp(z,"-vfstrace")==0 ){
29341 i++;
29342 #endif
29343 #ifdef SQLITE_ENABLE_MULTIPLEX
29344 }else if( cli_strcmp(z,"-multiplex")==0 ){
29345 i++;
29346 #endif
29347 }else if( cli_strcmp(z,"-help")==0 ){
29348 usage(1);
29349 }else if( cli_strcmp(z,"-cmd")==0 ){
29350 /* Run commands that follow -cmd first and separately from commands
29351 ** that simply appear on the command-line. This seems goofy. It would
29352 ** be better if all commands ran in the order that they appear. But
29353 ** we retain the goofy behavior for historical compatibility. */
29354 if( i==argc-1 ) break;
29355 z = cmdline_option_value(argc,argv,++i);
29356 if( z[0]=='.' ){
29357 rc = do_meta_command(z, &data);
29358 if( rc && bail_on_error ) return rc==2 ? 0 : rc;
29359 }else{
29360 open_db(&data, 0);
29361 rc = shell_exec(&data, z, &zErrMsg);
29362 if( zErrMsg!=0 ){
29363 eputf("Error: %s\n", zErrMsg);
29364 if( bail_on_error ) return rc!=0 ? rc : 1;
29365 }else if( rc!=0 ){
29366 eputf("Error: unable to process SQL \"%s\"\n", z);
29367 if( bail_on_error ) return rc;
29368 }
29369 }
29370 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
29371 }else if( cli_strncmp(z, "-A", 2)==0 ){
29372 if( nCmd>0 ){
29373 eputf("Error: cannot mix regular SQL or dot-commands"
29374 " with \"%s\"\n", z);
29375 return 1;
29376 }
29377 open_db(&data, OPEN_DB_ZIPFILE);
29378 if( z[2] ){
29379 argv[i] = &z[2];
29380 arDotCommand(&data, 1, argv+(i-1), argc-(i-1));
29381 }else{
29382 arDotCommand(&data, 1, argv+i, argc-i);
29383 }
29384 readStdin = 0;
29385 break;
29386 #endif
29387 }else if( cli_strcmp(z,"-safe")==0 ){
29388 data.bSafeMode = data.bSafeModePersist = 1;
29389 }else if( cli_strcmp(z,"-unsafe-testing")==0 ){
29390 /* Acted upon in first pass. */
29391 }else{
29392 eputf("%s: Error: unknown option: %s\n", Argv0, z);
29393 eputz("Use -help for a list of options.\n");
29394 return 1;
29395 }
29396 data.cMode = data.mode;
29397 }
29398
29399 if( !readStdin ){
29400 /* Run all arguments that do not begin with '-' as if they were separate
29401 ** command-line inputs, except for the argToSkip argument which contains
29402 ** the database filename.
29403 */
29404 for(i=0; i<nCmd; i++){
29405 if( azCmd[i][0]=='.' ){
29406 rc = do_meta_command(azCmd[i], &data);
29407 if( rc ){
29408 free(azCmd);
29409 return rc==2 ? 0 : rc;
29410 }
29411 }else{
29412 open_db(&data, 0);
29413 echo_group_input(&data, azCmd[i]);
29414 rc = shell_exec(&data, azCmd[i], &zErrMsg);
29415 if( zErrMsg || rc ){
29416 if( zErrMsg!=0 ){
29417 eputf("Error: %s\n", zErrMsg);
29418 }else{
29419 eputf("Error: unable to process SQL: %s\n", azCmd[i]);
29420 }
29421 sqlite3_free(zErrMsg);
29422 free(azCmd);
29423 return rc!=0 ? rc : 1;
29424 }
29425 }
29426 }
29427 }else{
29428 /* Run commands received from standard input
29429 */
29430 if( stdin_is_interactive ){
29431 char *zHome;
29432 char *zHistory;
29433 int nHistory;
29434 #if CIO_WIN_WC_XLATE
29435 # define SHELL_CIO_CHAR_SET (stdout_is_console? " (UTF-16 console I/O)" : "")
29436 #else
29437 # define SHELL_CIO_CHAR_SET ""
29438 #endif
29439 sputf(stdout, "SQLite version %s %.19s%s\n" /*extra-version-info*/
29440 "Enter \".help\" for usage hints.\n",
29441 sqlite3_libversion(), sqlite3_sourceid(), SHELL_CIO_CHAR_SET);
29442 if( warnInmemoryDb ){
29443 sputz(stdout, "Connected to a ");
29444 printBold("transient in-memory database");
29445 sputz(stdout, ".\nUse \".open FILENAME\" to reopen on a"
29446 " persistent database.\n");
29447 }
29448 zHistory = getenv("SQLITE_HISTORY");
29449 if( zHistory ){
29450 zHistory = strdup(zHistory);
29451 }else if( (zHome = find_home_dir(0))!=0 ){
29452 nHistory = strlen30(zHome) + 20;
29453 if( (zHistory = malloc(nHistory))!=0 ){
29454 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
29455 }
29456 }
29457 if( zHistory ){ shell_read_history(zHistory); }
29458 #if HAVE_READLINE || HAVE_EDITLINE
29459 rl_attempted_completion_function = readline_completion;
29460 #elif HAVE_LINENOISE
29461 linenoiseSetCompletionCallback(linenoise_completion);
29462 #endif
29463 data.in = 0;
29464 rc = process_input(&data);
29465 if( zHistory ){
29466 shell_stifle_history(2000);
29467 shell_write_history(zHistory);
29468 free(zHistory);
29469 }
29470 }else{
29471 data.in = stdin;
29472 rc = process_input(&data);
29473 }
29474 }
29475 #ifndef SQLITE_SHELL_FIDDLE
29476 /* In WASM mode we have to leave the db state in place so that
29477 ** client code can "push" SQL into it after this call returns. */
29478 free(azCmd);
29479 set_table_name(&data, 0);
29480 if( data.db ){
29481 session_close_all(&data, -1);
29482 close_db(data.db);
29483 }
29484 for(i=0; i<ArraySize(data.aAuxDb); i++){
29485 sqlite3_free(data.aAuxDb[i].zFreeOnClose);
29486 if( data.aAuxDb[i].db ){
29487 session_close_all(&data, i);
29488 close_db(data.aAuxDb[i].db);
29489 }
29490 }
29491 find_home_dir(1);
29492 output_reset(&data);
29493 data.doXdgOpen = 0;
29494 clearTempFile(&data);
29495 #if !SQLITE_SHELL_IS_UTF8
29496 for(i=0; i<argcToFree; i++) free(argvToFree[i]);
29497 free(argvToFree);
29498 #endif
29499 free(data.colWidth);
29500 free(data.zNonce);
29501 /* Clear the global data structure so that valgrind will detect memory
29502 ** leaks */
29503 memset(&data, 0, sizeof(data));
29504 #ifdef SQLITE_DEBUG
29505 if( sqlite3_memory_used()>mem_main_enter ){
29506 eputf("Memory leaked: %u bytes\n",
29507 (unsigned int)(sqlite3_memory_used()-mem_main_enter));
29508 }
29509 #endif
29510 #endif /* !SQLITE_SHELL_FIDDLE */
29511 return rc;
29512 }
29513
29514
29515 #ifdef SQLITE_SHELL_FIDDLE
29516 /* Only for emcc experimentation purposes. */
29517 int fiddle_experiment(int a,int b){
29518 return a + b;
29519 }
29520
29521 /*
29522 ** Returns a pointer to the current DB handle.
29523 */
29524 sqlite3 * fiddle_db_handle(){
29525 return globalDb;
29526 }
29527
29528 /*
29529 ** Returns a pointer to the given DB name's VFS. If zDbName is 0 then
29530 ** "main" is assumed. Returns 0 if no db with the given name is
29531 ** open.
29532 */
29533 sqlite3_vfs * fiddle_db_vfs(const char *zDbName){
29534 sqlite3_vfs * pVfs = 0;
29535 if(globalDb){
29536 sqlite3_file_control(globalDb, zDbName ? zDbName : "main",
29537 SQLITE_FCNTL_VFS_POINTER, &pVfs);
29538 }
29539 return pVfs;
29540 }
29541
29542 /* Only for emcc experimentation purposes. */
29543 sqlite3 * fiddle_db_arg(sqlite3 *arg){
29544 printf("fiddle_db_arg(%p)\n", (const void*)arg);
29545 return arg;
29546 }
29547
29548 /*
29549 ** Intended to be called via a SharedWorker() while a separate
29550 ** SharedWorker() (which manages the wasm module) is performing work
29551 ** which should be interrupted. Unfortunately, SharedWorker is not
29552 ** portable enough to make real use of.
29553 */
29554 void fiddle_interrupt(void){
29555 if( globalDb ) sqlite3_interrupt(globalDb);
29556 }
29557
29558 /*
29559 ** Returns the filename of the given db name, assuming "main" if
29560 ** zDbName is NULL. Returns NULL if globalDb is not opened.
29561 */
29562 const char * fiddle_db_filename(const char * zDbName){
29563 return globalDb
29564 ? sqlite3_db_filename(globalDb, zDbName ? zDbName : "main")
29565 : NULL;
29566 }
29567
29568 /*
29569 ** Completely wipes out the contents of the currently-opened database
29570 ** but leaves its storage intact for reuse.
29571 */
29572 void fiddle_reset_db(void){
29573 if( globalDb ){
29574 int rc = sqlite3_db_config(globalDb, SQLITE_DBCONFIG_RESET_DATABASE, 1, 0);
29575 if( 0==rc ) rc = sqlite3_exec(globalDb, "VACUUM", 0, 0, 0);
29576 sqlite3_db_config(globalDb, SQLITE_DBCONFIG_RESET_DATABASE, 0, 0);
29577 }
29578 }
29579
29580 /*
29581 ** Uses the current database's VFS xRead to stream the db file's
29582 ** contents out to the given callback. The callback gets a single
29583 ** chunk of size n (its 2nd argument) on each call and must return 0
29584 ** on success, non-0 on error. This function returns 0 on success,
29585 ** SQLITE_NOTFOUND if no db is open, or propagates any other non-0
29586 ** code from the callback. Note that this is not thread-friendly: it
29587 ** expects that it will be the only thread reading the db file and
29588 ** takes no measures to ensure that is the case.
29589 */
29590 int fiddle_export_db( int (*xCallback)(unsigned const char *zOut, int n) ){
29591 sqlite3_int64 nSize = 0;
29592 sqlite3_int64 nPos = 0;
29593 sqlite3_file * pFile = 0;
29594 unsigned char buf[1024 * 8];
29595 int nBuf = (int)sizeof(buf);
29596 int rc = shellState.db
29597 ? sqlite3_file_control(shellState.db, "main",
29598 SQLITE_FCNTL_FILE_POINTER, &pFile)
29599 : SQLITE_NOTFOUND;
29600 if( rc ) return rc;
29601 rc = pFile->pMethods->xFileSize(pFile, &nSize);
29602 if( rc ) return rc;
29603 if(nSize % nBuf){
29604 /* DB size is not an even multiple of the buffer size. Reduce
29605 ** buffer size so that we do not unduly inflate the db size when
29606 ** exporting. */
29607 if(0 == nSize % 4096) nBuf = 4096;
29608 else if(0 == nSize % 2048) nBuf = 2048;
29609 else if(0 == nSize % 1024) nBuf = 1024;
29610 else nBuf = 512;
29611 }
29612 for( ; 0==rc && nPos<nSize; nPos += nBuf ){
29613 rc = pFile->pMethods->xRead(pFile, buf, nBuf, nPos);
29614 if(SQLITE_IOERR_SHORT_READ == rc){
29615 rc = (nPos + nBuf) < nSize ? rc : 0/*assume EOF*/;
29616 }
29617 if( 0==rc ) rc = xCallback(buf, nBuf);
29618 }
29619 return rc;
29620 }
29621
29622 /*
29623 ** Trivial exportable function for emscripten. It processes zSql as if
29624 ** it were input to the sqlite3 shell and redirects all output to the
29625 ** wasm binding. fiddle_main() must have been called before this
29626 ** is called, or results are undefined.
29627 */
29628 void fiddle_exec(const char * zSql){
29629 if(zSql && *zSql){
29630 if('.'==*zSql) puts(zSql);
29631 shellState.wasm.zInput = zSql;
29632 shellState.wasm.zPos = zSql;
29633 process_input(&shellState);
29634 shellState.wasm.zInput = shellState.wasm.zPos = 0;
29635 }
29636 }
29637 #endif /* SQLITE_SHELL_FIDDLE */
29638